binutils/
[binutils.git] / opcodes / i386-dis.c
blob164b4575e1d6c1e36e6e95232e6b79fc97a516ba
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 Free Software Foundation, Inc.
5 This file is part of the GNU opcodes library.
7 This library is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
10 any later version.
12 It is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
15 License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
23 /* 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu)
24 July 1988
25 modified by John Hassey (hassey@dg-rtp.dg.com)
26 x86-64 support added by Jan Hubicka (jh@suse.cz)
27 VIA PadLock support by Michal Ludvig (mludvig@suse.cz). */
29 /* The main tables describing the instructions is essentially a copy
30 of the "Opcode Map" chapter (Appendix A) of the Intel 80386
31 Programmers Manual. Usually, there is a capital letter, followed
32 by a small letter. The capital letter tell the addressing mode,
33 and the small letter tells about the operand size. Refer to
34 the Intel manual for details. */
36 #include "sysdep.h"
37 #include "dis-asm.h"
38 #include "opintl.h"
39 #include "opcode/i386.h"
40 #include "libiberty.h"
42 #include <setjmp.h>
44 static int fetch_data (struct disassemble_info *, bfd_byte *);
45 static void ckprefix (void);
46 static const char *prefix_name (int, int);
47 static int print_insn (bfd_vma, disassemble_info *);
48 static void dofloat (int);
49 static void OP_ST (int, int);
50 static void OP_STi (int, int);
51 static int putop (const char *, int);
52 static void oappend (const char *);
53 static void append_seg (void);
54 static void OP_indirE (int, int);
55 static void print_operand_value (char *, int, bfd_vma);
56 static void OP_E_register (int, int);
57 static void OP_E_memory (int, int, int);
58 static void OP_E_extended (int, int, int);
59 static void print_displacement (char *, bfd_vma);
60 static void OP_E (int, int);
61 static void OP_G (int, int);
62 static bfd_vma get64 (void);
63 static bfd_signed_vma get32 (void);
64 static bfd_signed_vma get32s (void);
65 static int get16 (void);
66 static void set_op (bfd_vma, int);
67 static void OP_Skip_MODRM (int, int);
68 static void OP_REG (int, int);
69 static void OP_IMREG (int, int);
70 static void OP_I (int, int);
71 static void OP_I64 (int, int);
72 static void OP_sI (int, int);
73 static void OP_J (int, int);
74 static void OP_SEG (int, int);
75 static void OP_DIR (int, int);
76 static void OP_OFF (int, int);
77 static void OP_OFF64 (int, int);
78 static void ptr_reg (int, int);
79 static void OP_ESreg (int, int);
80 static void OP_DSreg (int, int);
81 static void OP_C (int, int);
82 static void OP_D (int, int);
83 static void OP_T (int, int);
84 static void OP_R (int, int);
85 static void OP_MMX (int, int);
86 static void OP_XMM (int, int);
87 static void OP_EM (int, int);
88 static void OP_EX (int, int);
89 static void OP_EMC (int,int);
90 static void OP_MXC (int,int);
91 static void OP_MS (int, int);
92 static void OP_XS (int, int);
93 static void OP_M (int, int);
94 static void OP_VEX (int, int);
95 static void OP_EX_Vex (int, int);
96 static void OP_EX_VexW (int, int);
97 static void OP_XMM_Vex (int, int);
98 static void OP_XMM_VexW (int, int);
99 static void OP_REG_VexI4 (int, int);
100 static void PCLMUL_Fixup (int, int);
101 static void VEXI4_Fixup (int, int);
102 static void VZERO_Fixup (int, int);
103 static void VCMP_Fixup (int, int);
104 static void VPERMIL2_Fixup (int, int);
105 static void OP_0f07 (int, int);
106 static void OP_Monitor (int, int);
107 static void OP_Mwait (int, int);
108 static void NOP_Fixup1 (int, int);
109 static void NOP_Fixup2 (int, int);
110 static void OP_3DNowSuffix (int, int);
111 static void CMP_Fixup (int, int);
112 static void BadOp (void);
113 static void REP_Fixup (int, int);
114 static void CMPXCHG8B_Fixup (int, int);
115 static void XMM_Fixup (int, int);
116 static void CRC32_Fixup (int, int);
117 static void print_drex_arg (unsigned int, int, int);
118 static void OP_DREX4 (int, int);
119 static void OP_DREX3 (int, int);
120 static void OP_DREX_ICMP (int, int);
121 static void OP_DREX_FCMP (int, int);
123 struct dis_private {
124 /* Points to first byte not fetched. */
125 bfd_byte *max_fetched;
126 bfd_byte the_buffer[MAX_MNEM_SIZE];
127 bfd_vma insn_start;
128 int orig_sizeflag;
129 jmp_buf bailout;
132 enum address_mode
134 mode_16bit,
135 mode_32bit,
136 mode_64bit
139 enum address_mode address_mode;
141 /* Flags for the prefixes for the current instruction. See below. */
142 static int prefixes;
144 /* REX prefix the current instruction. See below. */
145 static int rex;
146 /* Bits of REX we've already used. */
147 static int rex_used;
148 /* Original REX prefix. */
149 static int rex_original;
150 /* REX bits in original REX prefix ignored. It may not be the same
151 as rex_original since some bits may not be ignored. */
152 static int rex_ignored;
153 /* Mark parts used in the REX prefix. When we are testing for
154 empty prefix (for 8bit register REX extension), just mask it
155 out. Otherwise test for REX bit is excuse for existence of REX
156 only in case value is nonzero. */
157 #define USED_REX(value) \
159 if (value) \
161 if ((rex & value)) \
162 rex_used |= (value) | REX_OPCODE; \
164 else \
165 rex_used |= REX_OPCODE; \
168 /* Special 'registers' for DREX handling */
169 #define DREX_REG_UNKNOWN 1000 /* not initialized */
170 #define DREX_REG_MEMORY 1001 /* use MODRM/SIB/OFFSET memory */
172 /* The DREX byte has the following fields:
173 Bits 7-4 -- DREX.Dest, xmm destination register
174 Bit 3 -- DREX.OC0, operand config bit defines operand order
175 Bit 2 -- DREX.R, equivalent to REX_R bit, to extend ModRM register
176 Bit 1 -- DREX.X, equivalent to REX_X bit, to extend SIB index field
177 Bit 0 -- DREX.W, equivalent to REX_B bit, to extend ModRM r/m field,
178 SIB base field, or opcode reg field. */
179 #define DREX_XMM(drex) ((drex >> 4) & 0xf)
180 #define DREX_OC0(drex) ((drex >> 3) & 0x1)
182 /* Flags for prefixes which we somehow handled when printing the
183 current instruction. */
184 static int used_prefixes;
186 /* Flags stored in PREFIXES. */
187 #define PREFIX_REPZ 1
188 #define PREFIX_REPNZ 2
189 #define PREFIX_LOCK 4
190 #define PREFIX_CS 8
191 #define PREFIX_SS 0x10
192 #define PREFIX_DS 0x20
193 #define PREFIX_ES 0x40
194 #define PREFIX_FS 0x80
195 #define PREFIX_GS 0x100
196 #define PREFIX_DATA 0x200
197 #define PREFIX_ADDR 0x400
198 #define PREFIX_FWAIT 0x800
200 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
201 to ADDR (exclusive) are valid. Returns 1 for success, longjmps
202 on error. */
203 #define FETCH_DATA(info, addr) \
204 ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
205 ? 1 : fetch_data ((info), (addr)))
207 static int
208 fetch_data (struct disassemble_info *info, bfd_byte *addr)
210 int status;
211 struct dis_private *priv = (struct dis_private *) info->private_data;
212 bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
214 if (addr <= priv->the_buffer + MAX_MNEM_SIZE)
215 status = (*info->read_memory_func) (start,
216 priv->max_fetched,
217 addr - priv->max_fetched,
218 info);
219 else
220 status = -1;
221 if (status != 0)
223 /* If we did manage to read at least one byte, then
224 print_insn_i386 will do something sensible. Otherwise, print
225 an error. We do that here because this is where we know
226 STATUS. */
227 if (priv->max_fetched == priv->the_buffer)
228 (*info->memory_error_func) (status, start, info);
229 longjmp (priv->bailout, 1);
231 else
232 priv->max_fetched = addr;
233 return 1;
236 #define XX { NULL, 0 }
238 #define Eb { OP_E, b_mode }
239 #define Ev { OP_E, v_mode }
240 #define Ed { OP_E, d_mode }
241 #define Edq { OP_E, dq_mode }
242 #define Edqw { OP_E, dqw_mode }
243 #define Edqb { OP_E, dqb_mode }
244 #define Edqd { OP_E, dqd_mode }
245 #define Eq { OP_E, q_mode }
246 #define indirEv { OP_indirE, stack_v_mode }
247 #define indirEp { OP_indirE, f_mode }
248 #define stackEv { OP_E, stack_v_mode }
249 #define Em { OP_E, m_mode }
250 #define Ew { OP_E, w_mode }
251 #define M { OP_M, 0 } /* lea, lgdt, etc. */
252 #define Ma { OP_M, a_mode }
253 #define Mb { OP_M, b_mode }
254 #define Md { OP_M, d_mode }
255 #define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */
256 #define Mq { OP_M, q_mode }
257 #define Mx { OP_M, x_mode }
258 #define Mxmm { OP_M, xmm_mode }
259 #define Gb { OP_G, b_mode }
260 #define Gv { OP_G, v_mode }
261 #define Gd { OP_G, d_mode }
262 #define Gdq { OP_G, dq_mode }
263 #define Gm { OP_G, m_mode }
264 #define Gw { OP_G, w_mode }
265 #define Rd { OP_R, d_mode }
266 #define Rm { OP_R, m_mode }
267 #define Ib { OP_I, b_mode }
268 #define sIb { OP_sI, b_mode } /* sign extened byte */
269 #define Iv { OP_I, v_mode }
270 #define Iq { OP_I, q_mode }
271 #define Iv64 { OP_I64, v_mode }
272 #define Iw { OP_I, w_mode }
273 #define I1 { OP_I, const_1_mode }
274 #define Jb { OP_J, b_mode }
275 #define Jv { OP_J, v_mode }
276 #define Cm { OP_C, m_mode }
277 #define Dm { OP_D, m_mode }
278 #define Td { OP_T, d_mode }
279 #define Skip_MODRM { OP_Skip_MODRM, 0 }
281 #define RMeAX { OP_REG, eAX_reg }
282 #define RMeBX { OP_REG, eBX_reg }
283 #define RMeCX { OP_REG, eCX_reg }
284 #define RMeDX { OP_REG, eDX_reg }
285 #define RMeSP { OP_REG, eSP_reg }
286 #define RMeBP { OP_REG, eBP_reg }
287 #define RMeSI { OP_REG, eSI_reg }
288 #define RMeDI { OP_REG, eDI_reg }
289 #define RMrAX { OP_REG, rAX_reg }
290 #define RMrBX { OP_REG, rBX_reg }
291 #define RMrCX { OP_REG, rCX_reg }
292 #define RMrDX { OP_REG, rDX_reg }
293 #define RMrSP { OP_REG, rSP_reg }
294 #define RMrBP { OP_REG, rBP_reg }
295 #define RMrSI { OP_REG, rSI_reg }
296 #define RMrDI { OP_REG, rDI_reg }
297 #define RMAL { OP_REG, al_reg }
298 #define RMAL { OP_REG, al_reg }
299 #define RMCL { OP_REG, cl_reg }
300 #define RMDL { OP_REG, dl_reg }
301 #define RMBL { OP_REG, bl_reg }
302 #define RMAH { OP_REG, ah_reg }
303 #define RMCH { OP_REG, ch_reg }
304 #define RMDH { OP_REG, dh_reg }
305 #define RMBH { OP_REG, bh_reg }
306 #define RMAX { OP_REG, ax_reg }
307 #define RMDX { OP_REG, dx_reg }
309 #define eAX { OP_IMREG, eAX_reg }
310 #define eBX { OP_IMREG, eBX_reg }
311 #define eCX { OP_IMREG, eCX_reg }
312 #define eDX { OP_IMREG, eDX_reg }
313 #define eSP { OP_IMREG, eSP_reg }
314 #define eBP { OP_IMREG, eBP_reg }
315 #define eSI { OP_IMREG, eSI_reg }
316 #define eDI { OP_IMREG, eDI_reg }
317 #define AL { OP_IMREG, al_reg }
318 #define CL { OP_IMREG, cl_reg }
319 #define DL { OP_IMREG, dl_reg }
320 #define BL { OP_IMREG, bl_reg }
321 #define AH { OP_IMREG, ah_reg }
322 #define CH { OP_IMREG, ch_reg }
323 #define DH { OP_IMREG, dh_reg }
324 #define BH { OP_IMREG, bh_reg }
325 #define AX { OP_IMREG, ax_reg }
326 #define DX { OP_IMREG, dx_reg }
327 #define zAX { OP_IMREG, z_mode_ax_reg }
328 #define indirDX { OP_IMREG, indir_dx_reg }
330 #define Sw { OP_SEG, w_mode }
331 #define Sv { OP_SEG, v_mode }
332 #define Ap { OP_DIR, 0 }
333 #define Ob { OP_OFF64, b_mode }
334 #define Ov { OP_OFF64, v_mode }
335 #define Xb { OP_DSreg, eSI_reg }
336 #define Xv { OP_DSreg, eSI_reg }
337 #define Xz { OP_DSreg, eSI_reg }
338 #define Yb { OP_ESreg, eDI_reg }
339 #define Yv { OP_ESreg, eDI_reg }
340 #define DSBX { OP_DSreg, eBX_reg }
342 #define es { OP_REG, es_reg }
343 #define ss { OP_REG, ss_reg }
344 #define cs { OP_REG, cs_reg }
345 #define ds { OP_REG, ds_reg }
346 #define fs { OP_REG, fs_reg }
347 #define gs { OP_REG, gs_reg }
349 #define MX { OP_MMX, 0 }
350 #define XM { OP_XMM, 0 }
351 #define XMM { OP_XMM, xmm_mode }
352 #define EM { OP_EM, v_mode }
353 #define EMd { OP_EM, d_mode }
354 #define EMx { OP_EM, x_mode }
355 #define EXw { OP_EX, w_mode }
356 #define EXd { OP_EX, d_mode }
357 #define EXq { OP_EX, q_mode }
358 #define EXx { OP_EX, x_mode }
359 #define EXxmm { OP_EX, xmm_mode }
360 #define EXxmmq { OP_EX, xmmq_mode }
361 #define EXymmq { OP_EX, ymmq_mode }
362 #define MS { OP_MS, v_mode }
363 #define XS { OP_XS, v_mode }
364 #define EMCq { OP_EMC, q_mode }
365 #define MXC { OP_MXC, 0 }
366 #define OPSUF { OP_3DNowSuffix, 0 }
367 #define CMP { CMP_Fixup, 0 }
368 #define XMM0 { XMM_Fixup, 0 }
370 #define Vex { OP_VEX, vex_mode }
371 #define Vex128 { OP_VEX, vex128_mode }
372 #define Vex256 { OP_VEX, vex256_mode }
373 #define VexI4 { VEXI4_Fixup, 0}
374 #define EXdVex { OP_EX_Vex, d_mode }
375 #define EXqVex { OP_EX_Vex, q_mode }
376 #define EXVexW { OP_EX_VexW, x_mode }
377 #define EXdVexW { OP_EX_VexW, d_mode }
378 #define EXqVexW { OP_EX_VexW, q_mode }
379 #define XMVex { OP_XMM_Vex, 0 }
380 #define XMVexW { OP_XMM_VexW, 0 }
381 #define XMVexI4 { OP_REG_VexI4, x_mode }
382 #define PCLMUL { PCLMUL_Fixup, 0 }
383 #define VZERO { VZERO_Fixup, 0 }
384 #define VCMP { VCMP_Fixup, 0 }
385 #define VPERMIL2 { VPERMIL2_Fixup, 0 }
387 /* Used handle "rep" prefix for string instructions. */
388 #define Xbr { REP_Fixup, eSI_reg }
389 #define Xvr { REP_Fixup, eSI_reg }
390 #define Ybr { REP_Fixup, eDI_reg }
391 #define Yvr { REP_Fixup, eDI_reg }
392 #define Yzr { REP_Fixup, eDI_reg }
393 #define indirDXr { REP_Fixup, indir_dx_reg }
394 #define ALr { REP_Fixup, al_reg }
395 #define eAXr { REP_Fixup, eAX_reg }
397 #define cond_jump_flag { NULL, cond_jump_mode }
398 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
400 /* bits in sizeflag */
401 #define SUFFIX_ALWAYS 4
402 #define AFLAG 2
403 #define DFLAG 1
405 /* byte operand */
406 #define b_mode 1
407 /* operand size depends on prefixes */
408 #define v_mode (b_mode + 1)
409 /* word operand */
410 #define w_mode (v_mode + 1)
411 /* double word operand */
412 #define d_mode (w_mode + 1)
413 /* quad word operand */
414 #define q_mode (d_mode + 1)
415 /* ten-byte operand */
416 #define t_mode (q_mode + 1)
417 /* 16-byte XMM or 32-byte YMM operand */
418 #define x_mode (t_mode + 1)
419 /* 16-byte XMM operand */
420 #define xmm_mode (x_mode + 1)
421 /* 16-byte XMM or quad word operand */
422 #define xmmq_mode (xmm_mode + 1)
423 /* 32-byte YMM or quad word operand */
424 #define ymmq_mode (xmmq_mode + 1)
425 /* d_mode in 32bit, q_mode in 64bit mode. */
426 #define m_mode (ymmq_mode + 1)
427 /* pair of v_mode operands */
428 #define a_mode (m_mode + 1)
429 #define cond_jump_mode (a_mode + 1)
430 #define loop_jcxz_mode (cond_jump_mode + 1)
431 /* operand size depends on REX prefixes. */
432 #define dq_mode (loop_jcxz_mode + 1)
433 /* registers like dq_mode, memory like w_mode. */
434 #define dqw_mode (dq_mode + 1)
435 /* 4- or 6-byte pointer operand */
436 #define f_mode (dqw_mode + 1)
437 #define const_1_mode (f_mode + 1)
438 /* v_mode for stack-related opcodes. */
439 #define stack_v_mode (const_1_mode + 1)
440 /* non-quad operand size depends on prefixes */
441 #define z_mode (stack_v_mode + 1)
442 /* 16-byte operand */
443 #define o_mode (z_mode + 1)
444 /* registers like dq_mode, memory like b_mode. */
445 #define dqb_mode (o_mode + 1)
446 /* registers like dq_mode, memory like d_mode. */
447 #define dqd_mode (dqb_mode + 1)
448 /* normal vex mode */
449 #define vex_mode (dqd_mode + 1)
450 /* 128bit vex mode */
451 #define vex128_mode (vex_mode + 1)
452 /* 256bit vex mode */
453 #define vex256_mode (vex128_mode + 1)
455 #define es_reg (vex256_mode + 1)
456 #define cs_reg (es_reg + 1)
457 #define ss_reg (cs_reg + 1)
458 #define ds_reg (ss_reg + 1)
459 #define fs_reg (ds_reg + 1)
460 #define gs_reg (fs_reg + 1)
462 #define eAX_reg (gs_reg + 1)
463 #define eCX_reg (eAX_reg + 1)
464 #define eDX_reg (eCX_reg + 1)
465 #define eBX_reg (eDX_reg + 1)
466 #define eSP_reg (eBX_reg + 1)
467 #define eBP_reg (eSP_reg + 1)
468 #define eSI_reg (eBP_reg + 1)
469 #define eDI_reg (eSI_reg + 1)
471 #define al_reg (eDI_reg + 1)
472 #define cl_reg (al_reg + 1)
473 #define dl_reg (cl_reg + 1)
474 #define bl_reg (dl_reg + 1)
475 #define ah_reg (bl_reg + 1)
476 #define ch_reg (ah_reg + 1)
477 #define dh_reg (ch_reg + 1)
478 #define bh_reg (dh_reg + 1)
480 #define ax_reg (bh_reg + 1)
481 #define cx_reg (ax_reg + 1)
482 #define dx_reg (cx_reg + 1)
483 #define bx_reg (dx_reg + 1)
484 #define sp_reg (bx_reg + 1)
485 #define bp_reg (sp_reg + 1)
486 #define si_reg (bp_reg + 1)
487 #define di_reg (si_reg + 1)
489 #define rAX_reg (di_reg + 1)
490 #define rCX_reg (rAX_reg + 1)
491 #define rDX_reg (rCX_reg + 1)
492 #define rBX_reg (rDX_reg + 1)
493 #define rSP_reg (rBX_reg + 1)
494 #define rBP_reg (rSP_reg + 1)
495 #define rSI_reg (rBP_reg + 1)
496 #define rDI_reg (rSI_reg + 1)
498 #define z_mode_ax_reg (rDI_reg + 1)
499 #define indir_dx_reg (z_mode_ax_reg + 1)
501 #define MAX_BYTEMODE indir_dx_reg
503 /* Flags that are OR'ed into the bytemode field to pass extra
504 information. */
505 #define DREX_OC1 0x10000 /* OC1 bit set */
506 #define DREX_NO_OC0 0x20000 /* OC0 bit not used */
507 #define DREX_MASK 0x40000 /* mask to delete */
509 #if MAX_BYTEMODE >= DREX_OC1
510 #error MAX_BYTEMODE must be less than DREX_OC1
511 #endif
513 #define FLOATCODE 1
514 #define USE_REG_TABLE (FLOATCODE + 1)
515 #define USE_MOD_TABLE (USE_REG_TABLE + 1)
516 #define USE_RM_TABLE (USE_MOD_TABLE + 1)
517 #define USE_PREFIX_TABLE (USE_RM_TABLE + 1)
518 #define USE_X86_64_TABLE (USE_PREFIX_TABLE + 1)
519 #define USE_3BYTE_TABLE (USE_X86_64_TABLE + 1)
520 #define USE_VEX_C4_TABLE (USE_3BYTE_TABLE + 1)
521 #define USE_VEX_C5_TABLE (USE_VEX_C4_TABLE + 1)
522 #define USE_VEX_LEN_TABLE (USE_VEX_C5_TABLE + 1)
524 #define FLOAT NULL, { { NULL, FLOATCODE } }
526 #define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } }
527 #define REG_TABLE(I) DIS386 (USE_REG_TABLE, (I))
528 #define MOD_TABLE(I) DIS386 (USE_MOD_TABLE, (I))
529 #define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I))
530 #define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I))
531 #define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I))
532 #define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
533 #define VEX_C4_TABLE(I) DIS386 (USE_VEX_C4_TABLE, (I))
534 #define VEX_C5_TABLE(I) DIS386 (USE_VEX_C5_TABLE, (I))
535 #define VEX_LEN_TABLE(I) DIS386 (USE_VEX_LEN_TABLE, (I))
537 #define REG_80 0
538 #define REG_81 (REG_80 + 1)
539 #define REG_82 (REG_81 + 1)
540 #define REG_8F (REG_82 + 1)
541 #define REG_C0 (REG_8F + 1)
542 #define REG_C1 (REG_C0 + 1)
543 #define REG_C6 (REG_C1 + 1)
544 #define REG_C7 (REG_C6 + 1)
545 #define REG_D0 (REG_C7 + 1)
546 #define REG_D1 (REG_D0 + 1)
547 #define REG_D2 (REG_D1 + 1)
548 #define REG_D3 (REG_D2 + 1)
549 #define REG_F6 (REG_D3 + 1)
550 #define REG_F7 (REG_F6 + 1)
551 #define REG_FE (REG_F7 + 1)
552 #define REG_FF (REG_FE + 1)
553 #define REG_0F00 (REG_FF + 1)
554 #define REG_0F01 (REG_0F00 + 1)
555 #define REG_0F0D (REG_0F01 + 1)
556 #define REG_0F18 (REG_0F0D + 1)
557 #define REG_0F71 (REG_0F18 + 1)
558 #define REG_0F72 (REG_0F71 + 1)
559 #define REG_0F73 (REG_0F72 + 1)
560 #define REG_0FA6 (REG_0F73 + 1)
561 #define REG_0FA7 (REG_0FA6 + 1)
562 #define REG_0FAE (REG_0FA7 + 1)
563 #define REG_0FBA (REG_0FAE + 1)
564 #define REG_0FC7 (REG_0FBA + 1)
565 #define REG_VEX_71 (REG_0FC7 + 1)
566 #define REG_VEX_72 (REG_VEX_71 + 1)
567 #define REG_VEX_73 (REG_VEX_72 + 1)
568 #define REG_VEX_AE (REG_VEX_73 + 1)
570 #define MOD_8D 0
571 #define MOD_0F01_REG_0 (MOD_8D + 1)
572 #define MOD_0F01_REG_1 (MOD_0F01_REG_0 + 1)
573 #define MOD_0F01_REG_2 (MOD_0F01_REG_1 + 1)
574 #define MOD_0F01_REG_3 (MOD_0F01_REG_2 + 1)
575 #define MOD_0F01_REG_7 (MOD_0F01_REG_3 + 1)
576 #define MOD_0F12_PREFIX_0 (MOD_0F01_REG_7 + 1)
577 #define MOD_0F13 (MOD_0F12_PREFIX_0 + 1)
578 #define MOD_0F16_PREFIX_0 (MOD_0F13 + 1)
579 #define MOD_0F17 (MOD_0F16_PREFIX_0 + 1)
580 #define MOD_0F18_REG_0 (MOD_0F17 + 1)
581 #define MOD_0F18_REG_1 (MOD_0F18_REG_0 + 1)
582 #define MOD_0F18_REG_2 (MOD_0F18_REG_1 + 1)
583 #define MOD_0F18_REG_3 (MOD_0F18_REG_2 + 1)
584 #define MOD_0F20 (MOD_0F18_REG_3 + 1)
585 #define MOD_0F21 (MOD_0F20 + 1)
586 #define MOD_0F22 (MOD_0F21 + 1)
587 #define MOD_0F23 (MOD_0F22 + 1)
588 #define MOD_0F24 (MOD_0F23 + 1)
589 #define MOD_0F26 (MOD_0F24 + 1)
590 #define MOD_0F2B_PREFIX_0 (MOD_0F26 + 1)
591 #define MOD_0F2B_PREFIX_1 (MOD_0F2B_PREFIX_0 + 1)
592 #define MOD_0F2B_PREFIX_2 (MOD_0F2B_PREFIX_1 + 1)
593 #define MOD_0F2B_PREFIX_3 (MOD_0F2B_PREFIX_2 + 1)
594 #define MOD_0F51 (MOD_0F2B_PREFIX_3 + 1)
595 #define MOD_0F71_REG_2 (MOD_0F51 + 1)
596 #define MOD_0F71_REG_4 (MOD_0F71_REG_2 + 1)
597 #define MOD_0F71_REG_6 (MOD_0F71_REG_4 + 1)
598 #define MOD_0F72_REG_2 (MOD_0F71_REG_6 + 1)
599 #define MOD_0F72_REG_4 (MOD_0F72_REG_2 + 1)
600 #define MOD_0F72_REG_6 (MOD_0F72_REG_4 + 1)
601 #define MOD_0F73_REG_2 (MOD_0F72_REG_6 + 1)
602 #define MOD_0F73_REG_3 (MOD_0F73_REG_2 + 1)
603 #define MOD_0F73_REG_6 (MOD_0F73_REG_3 + 1)
604 #define MOD_0F73_REG_7 (MOD_0F73_REG_6 + 1)
605 #define MOD_0FAE_REG_0 (MOD_0F73_REG_7 + 1)
606 #define MOD_0FAE_REG_1 (MOD_0FAE_REG_0 + 1)
607 #define MOD_0FAE_REG_2 (MOD_0FAE_REG_1 + 1)
608 #define MOD_0FAE_REG_3 (MOD_0FAE_REG_2 + 1)
609 #define MOD_0FAE_REG_4 (MOD_0FAE_REG_3 + 1)
610 #define MOD_0FAE_REG_5 (MOD_0FAE_REG_4 + 1)
611 #define MOD_0FAE_REG_6 (MOD_0FAE_REG_5 + 1)
612 #define MOD_0FAE_REG_7 (MOD_0FAE_REG_6 + 1)
613 #define MOD_0FB2 (MOD_0FAE_REG_7 + 1)
614 #define MOD_0FB4 (MOD_0FB2 + 1)
615 #define MOD_0FB5 (MOD_0FB4 + 1)
616 #define MOD_0FC7_REG_6 (MOD_0FB5 + 1)
617 #define MOD_0FC7_REG_7 (MOD_0FC7_REG_6 + 1)
618 #define MOD_0FD7 (MOD_0FC7_REG_7 + 1)
619 #define MOD_0FE7_PREFIX_2 (MOD_0FD7 + 1)
620 #define MOD_0FF0_PREFIX_3 (MOD_0FE7_PREFIX_2 + 1)
621 #define MOD_0F382A_PREFIX_2 (MOD_0FF0_PREFIX_3 + 1)
622 #define MOD_62_32BIT (MOD_0F382A_PREFIX_2 + 1)
623 #define MOD_C4_32BIT (MOD_62_32BIT + 1)
624 #define MOD_C5_32BIT (MOD_C4_32BIT + 1)
625 #define MOD_VEX_12_PREFIX_0 (MOD_C5_32BIT + 1)
626 #define MOD_VEX_13 (MOD_VEX_12_PREFIX_0 + 1)
627 #define MOD_VEX_16_PREFIX_0 (MOD_VEX_13 + 1)
628 #define MOD_VEX_17 (MOD_VEX_16_PREFIX_0 + 1)
629 #define MOD_VEX_2B (MOD_VEX_17 + 1)
630 #define MOD_VEX_51 (MOD_VEX_2B + 1)
631 #define MOD_VEX_71_REG_2 (MOD_VEX_51 + 1)
632 #define MOD_VEX_71_REG_4 (MOD_VEX_71_REG_2 + 1)
633 #define MOD_VEX_71_REG_6 (MOD_VEX_71_REG_4 + 1)
634 #define MOD_VEX_72_REG_2 (MOD_VEX_71_REG_6 + 1)
635 #define MOD_VEX_72_REG_4 (MOD_VEX_72_REG_2 + 1)
636 #define MOD_VEX_72_REG_6 (MOD_VEX_72_REG_4 + 1)
637 #define MOD_VEX_73_REG_2 (MOD_VEX_72_REG_6 + 1)
638 #define MOD_VEX_73_REG_3 (MOD_VEX_73_REG_2 + 1)
639 #define MOD_VEX_73_REG_6 (MOD_VEX_73_REG_3 + 1)
640 #define MOD_VEX_73_REG_7 (MOD_VEX_73_REG_6 + 1)
641 #define MOD_VEX_AE_REG_2 (MOD_VEX_73_REG_7 + 1)
642 #define MOD_VEX_AE_REG_3 (MOD_VEX_AE_REG_2 + 1)
643 #define MOD_VEX_D7_PREFIX_2 (MOD_VEX_AE_REG_3 + 1)
644 #define MOD_VEX_E7_PREFIX_2 (MOD_VEX_D7_PREFIX_2 + 1)
645 #define MOD_VEX_F0_PREFIX_3 (MOD_VEX_E7_PREFIX_2 + 1)
646 #define MOD_VEX_3818_PREFIX_2 (MOD_VEX_F0_PREFIX_3 + 1)
647 #define MOD_VEX_3819_PREFIX_2 (MOD_VEX_3818_PREFIX_2 + 1)
648 #define MOD_VEX_381A_PREFIX_2 (MOD_VEX_3819_PREFIX_2 + 1)
649 #define MOD_VEX_382A_PREFIX_2 (MOD_VEX_381A_PREFIX_2 + 1)
650 #define MOD_VEX_382C_PREFIX_2 (MOD_VEX_382A_PREFIX_2 + 1)
651 #define MOD_VEX_382D_PREFIX_2 (MOD_VEX_382C_PREFIX_2 + 1)
652 #define MOD_VEX_382E_PREFIX_2 (MOD_VEX_382D_PREFIX_2 + 1)
653 #define MOD_VEX_382F_PREFIX_2 (MOD_VEX_382E_PREFIX_2 + 1)
655 #define RM_0F01_REG_0 0
656 #define RM_0F01_REG_1 (RM_0F01_REG_0 + 1)
657 #define RM_0F01_REG_2 (RM_0F01_REG_1 + 1)
658 #define RM_0F01_REG_3 (RM_0F01_REG_2 + 1)
659 #define RM_0F01_REG_7 (RM_0F01_REG_3 + 1)
660 #define RM_0FAE_REG_5 (RM_0F01_REG_7 + 1)
661 #define RM_0FAE_REG_6 (RM_0FAE_REG_5 + 1)
662 #define RM_0FAE_REG_7 (RM_0FAE_REG_6 + 1)
664 #define PREFIX_90 0
665 #define PREFIX_0F10 (PREFIX_90 + 1)
666 #define PREFIX_0F11 (PREFIX_0F10 + 1)
667 #define PREFIX_0F12 (PREFIX_0F11 + 1)
668 #define PREFIX_0F16 (PREFIX_0F12 + 1)
669 #define PREFIX_0F2A (PREFIX_0F16 + 1)
670 #define PREFIX_0F2B (PREFIX_0F2A + 1)
671 #define PREFIX_0F2C (PREFIX_0F2B + 1)
672 #define PREFIX_0F2D (PREFIX_0F2C + 1)
673 #define PREFIX_0F2E (PREFIX_0F2D + 1)
674 #define PREFIX_0F2F (PREFIX_0F2E + 1)
675 #define PREFIX_0F51 (PREFIX_0F2F + 1)
676 #define PREFIX_0F52 (PREFIX_0F51 + 1)
677 #define PREFIX_0F53 (PREFIX_0F52 + 1)
678 #define PREFIX_0F58 (PREFIX_0F53 + 1)
679 #define PREFIX_0F59 (PREFIX_0F58 + 1)
680 #define PREFIX_0F5A (PREFIX_0F59 + 1)
681 #define PREFIX_0F5B (PREFIX_0F5A + 1)
682 #define PREFIX_0F5C (PREFIX_0F5B + 1)
683 #define PREFIX_0F5D (PREFIX_0F5C + 1)
684 #define PREFIX_0F5E (PREFIX_0F5D + 1)
685 #define PREFIX_0F5F (PREFIX_0F5E + 1)
686 #define PREFIX_0F60 (PREFIX_0F5F + 1)
687 #define PREFIX_0F61 (PREFIX_0F60 + 1)
688 #define PREFIX_0F62 (PREFIX_0F61 + 1)
689 #define PREFIX_0F6C (PREFIX_0F62 + 1)
690 #define PREFIX_0F6D (PREFIX_0F6C + 1)
691 #define PREFIX_0F6F (PREFIX_0F6D + 1)
692 #define PREFIX_0F70 (PREFIX_0F6F + 1)
693 #define PREFIX_0F73_REG_3 (PREFIX_0F70 + 1)
694 #define PREFIX_0F73_REG_7 (PREFIX_0F73_REG_3 + 1)
695 #define PREFIX_0F78 (PREFIX_0F73_REG_7 + 1)
696 #define PREFIX_0F79 (PREFIX_0F78 + 1)
697 #define PREFIX_0F7C (PREFIX_0F79 + 1)
698 #define PREFIX_0F7D (PREFIX_0F7C + 1)
699 #define PREFIX_0F7E (PREFIX_0F7D + 1)
700 #define PREFIX_0F7F (PREFIX_0F7E + 1)
701 #define PREFIX_0FB8 (PREFIX_0F7F + 1)
702 #define PREFIX_0FBD (PREFIX_0FB8 + 1)
703 #define PREFIX_0FC2 (PREFIX_0FBD + 1)
704 #define PREFIX_0FC3 (PREFIX_0FC2 + 1)
705 #define PREFIX_0FC7_REG_6 (PREFIX_0FC3 + 1)
706 #define PREFIX_0FD0 (PREFIX_0FC7_REG_6 + 1)
707 #define PREFIX_0FD6 (PREFIX_0FD0 + 1)
708 #define PREFIX_0FE6 (PREFIX_0FD6 + 1)
709 #define PREFIX_0FE7 (PREFIX_0FE6 + 1)
710 #define PREFIX_0FF0 (PREFIX_0FE7 + 1)
711 #define PREFIX_0FF7 (PREFIX_0FF0 + 1)
712 #define PREFIX_0F3810 (PREFIX_0FF7 + 1)
713 #define PREFIX_0F3814 (PREFIX_0F3810 + 1)
714 #define PREFIX_0F3815 (PREFIX_0F3814 + 1)
715 #define PREFIX_0F3817 (PREFIX_0F3815 + 1)
716 #define PREFIX_0F3820 (PREFIX_0F3817 + 1)
717 #define PREFIX_0F3821 (PREFIX_0F3820 + 1)
718 #define PREFIX_0F3822 (PREFIX_0F3821 + 1)
719 #define PREFIX_0F3823 (PREFIX_0F3822 + 1)
720 #define PREFIX_0F3824 (PREFIX_0F3823 + 1)
721 #define PREFIX_0F3825 (PREFIX_0F3824 + 1)
722 #define PREFIX_0F3828 (PREFIX_0F3825 + 1)
723 #define PREFIX_0F3829 (PREFIX_0F3828 + 1)
724 #define PREFIX_0F382A (PREFIX_0F3829 + 1)
725 #define PREFIX_0F382B (PREFIX_0F382A + 1)
726 #define PREFIX_0F3830 (PREFIX_0F382B + 1)
727 #define PREFIX_0F3831 (PREFIX_0F3830 + 1)
728 #define PREFIX_0F3832 (PREFIX_0F3831 + 1)
729 #define PREFIX_0F3833 (PREFIX_0F3832 + 1)
730 #define PREFIX_0F3834 (PREFIX_0F3833 + 1)
731 #define PREFIX_0F3835 (PREFIX_0F3834 + 1)
732 #define PREFIX_0F3837 (PREFIX_0F3835 + 1)
733 #define PREFIX_0F3838 (PREFIX_0F3837 + 1)
734 #define PREFIX_0F3839 (PREFIX_0F3838 + 1)
735 #define PREFIX_0F383A (PREFIX_0F3839 + 1)
736 #define PREFIX_0F383B (PREFIX_0F383A + 1)
737 #define PREFIX_0F383C (PREFIX_0F383B + 1)
738 #define PREFIX_0F383D (PREFIX_0F383C + 1)
739 #define PREFIX_0F383E (PREFIX_0F383D + 1)
740 #define PREFIX_0F383F (PREFIX_0F383E + 1)
741 #define PREFIX_0F3840 (PREFIX_0F383F + 1)
742 #define PREFIX_0F3841 (PREFIX_0F3840 + 1)
743 #define PREFIX_0F38DB (PREFIX_0F3841 + 1)
744 #define PREFIX_0F38DC (PREFIX_0F38DB + 1)
745 #define PREFIX_0F38DD (PREFIX_0F38DC + 1)
746 #define PREFIX_0F38DE (PREFIX_0F38DD + 1)
747 #define PREFIX_0F38DF (PREFIX_0F38DE + 1)
748 #define PREFIX_0F38F0 (PREFIX_0F38DF + 1)
749 #define PREFIX_0F38F1 (PREFIX_0F38F0 + 1)
750 #define PREFIX_0F3A08 (PREFIX_0F38F1 + 1)
751 #define PREFIX_0F3A09 (PREFIX_0F3A08 + 1)
752 #define PREFIX_0F3A0A (PREFIX_0F3A09 + 1)
753 #define PREFIX_0F3A0B (PREFIX_0F3A0A + 1)
754 #define PREFIX_0F3A0C (PREFIX_0F3A0B + 1)
755 #define PREFIX_0F3A0D (PREFIX_0F3A0C + 1)
756 #define PREFIX_0F3A0E (PREFIX_0F3A0D + 1)
757 #define PREFIX_0F3A14 (PREFIX_0F3A0E + 1)
758 #define PREFIX_0F3A15 (PREFIX_0F3A14 + 1)
759 #define PREFIX_0F3A16 (PREFIX_0F3A15 + 1)
760 #define PREFIX_0F3A17 (PREFIX_0F3A16 + 1)
761 #define PREFIX_0F3A20 (PREFIX_0F3A17 + 1)
762 #define PREFIX_0F3A21 (PREFIX_0F3A20 + 1)
763 #define PREFIX_0F3A22 (PREFIX_0F3A21 + 1)
764 #define PREFIX_0F3A40 (PREFIX_0F3A22 + 1)
765 #define PREFIX_0F3A41 (PREFIX_0F3A40 + 1)
766 #define PREFIX_0F3A42 (PREFIX_0F3A41 + 1)
767 #define PREFIX_0F3A44 (PREFIX_0F3A42 + 1)
768 #define PREFIX_0F3A60 (PREFIX_0F3A44 + 1)
769 #define PREFIX_0F3A61 (PREFIX_0F3A60 + 1)
770 #define PREFIX_0F3A62 (PREFIX_0F3A61 + 1)
771 #define PREFIX_0F3A63 (PREFIX_0F3A62 + 1)
772 #define PREFIX_0F3ADF (PREFIX_0F3A63 + 1)
773 #define PREFIX_VEX_10 (PREFIX_0F3ADF + 1)
774 #define PREFIX_VEX_11 (PREFIX_VEX_10 + 1)
775 #define PREFIX_VEX_12 (PREFIX_VEX_11 + 1)
776 #define PREFIX_VEX_16 (PREFIX_VEX_12 + 1)
777 #define PREFIX_VEX_2A (PREFIX_VEX_16 + 1)
778 #define PREFIX_VEX_2C (PREFIX_VEX_2A + 1)
779 #define PREFIX_VEX_2D (PREFIX_VEX_2C + 1)
780 #define PREFIX_VEX_2E (PREFIX_VEX_2D + 1)
781 #define PREFIX_VEX_2F (PREFIX_VEX_2E + 1)
782 #define PREFIX_VEX_51 (PREFIX_VEX_2F + 1)
783 #define PREFIX_VEX_52 (PREFIX_VEX_51 + 1)
784 #define PREFIX_VEX_53 (PREFIX_VEX_52 + 1)
785 #define PREFIX_VEX_58 (PREFIX_VEX_53 + 1)
786 #define PREFIX_VEX_59 (PREFIX_VEX_58 + 1)
787 #define PREFIX_VEX_5A (PREFIX_VEX_59 + 1)
788 #define PREFIX_VEX_5B (PREFIX_VEX_5A + 1)
789 #define PREFIX_VEX_5C (PREFIX_VEX_5B + 1)
790 #define PREFIX_VEX_5D (PREFIX_VEX_5C + 1)
791 #define PREFIX_VEX_5E (PREFIX_VEX_5D + 1)
792 #define PREFIX_VEX_5F (PREFIX_VEX_5E + 1)
793 #define PREFIX_VEX_60 (PREFIX_VEX_5F + 1)
794 #define PREFIX_VEX_61 (PREFIX_VEX_60 + 1)
795 #define PREFIX_VEX_62 (PREFIX_VEX_61 + 1)
796 #define PREFIX_VEX_63 (PREFIX_VEX_62 + 1)
797 #define PREFIX_VEX_64 (PREFIX_VEX_63 + 1)
798 #define PREFIX_VEX_65 (PREFIX_VEX_64 + 1)
799 #define PREFIX_VEX_66 (PREFIX_VEX_65 + 1)
800 #define PREFIX_VEX_67 (PREFIX_VEX_66 + 1)
801 #define PREFIX_VEX_68 (PREFIX_VEX_67 + 1)
802 #define PREFIX_VEX_69 (PREFIX_VEX_68 + 1)
803 #define PREFIX_VEX_6A (PREFIX_VEX_69 + 1)
804 #define PREFIX_VEX_6B (PREFIX_VEX_6A + 1)
805 #define PREFIX_VEX_6C (PREFIX_VEX_6B + 1)
806 #define PREFIX_VEX_6D (PREFIX_VEX_6C + 1)
807 #define PREFIX_VEX_6E (PREFIX_VEX_6D + 1)
808 #define PREFIX_VEX_6F (PREFIX_VEX_6E + 1)
809 #define PREFIX_VEX_70 (PREFIX_VEX_6F + 1)
810 #define PREFIX_VEX_71_REG_2 (PREFIX_VEX_70 + 1)
811 #define PREFIX_VEX_71_REG_4 (PREFIX_VEX_71_REG_2 + 1)
812 #define PREFIX_VEX_71_REG_6 (PREFIX_VEX_71_REG_4 + 1)
813 #define PREFIX_VEX_72_REG_2 (PREFIX_VEX_71_REG_6 + 1)
814 #define PREFIX_VEX_72_REG_4 (PREFIX_VEX_72_REG_2 + 1)
815 #define PREFIX_VEX_72_REG_6 (PREFIX_VEX_72_REG_4 + 1)
816 #define PREFIX_VEX_73_REG_2 (PREFIX_VEX_72_REG_6 + 1)
817 #define PREFIX_VEX_73_REG_3 (PREFIX_VEX_73_REG_2 + 1)
818 #define PREFIX_VEX_73_REG_6 (PREFIX_VEX_73_REG_3 + 1)
819 #define PREFIX_VEX_73_REG_7 (PREFIX_VEX_73_REG_6 + 1)
820 #define PREFIX_VEX_74 (PREFIX_VEX_73_REG_7 + 1)
821 #define PREFIX_VEX_75 (PREFIX_VEX_74 + 1)
822 #define PREFIX_VEX_76 (PREFIX_VEX_75 + 1)
823 #define PREFIX_VEX_77 (PREFIX_VEX_76 + 1)
824 #define PREFIX_VEX_7C (PREFIX_VEX_77 + 1)
825 #define PREFIX_VEX_7D (PREFIX_VEX_7C + 1)
826 #define PREFIX_VEX_7E (PREFIX_VEX_7D + 1)
827 #define PREFIX_VEX_7F (PREFIX_VEX_7E + 1)
828 #define PREFIX_VEX_C2 (PREFIX_VEX_7F + 1)
829 #define PREFIX_VEX_C4 (PREFIX_VEX_C2 + 1)
830 #define PREFIX_VEX_C5 (PREFIX_VEX_C4 + 1)
831 #define PREFIX_VEX_D0 (PREFIX_VEX_C5 + 1)
832 #define PREFIX_VEX_D1 (PREFIX_VEX_D0 + 1)
833 #define PREFIX_VEX_D2 (PREFIX_VEX_D1 + 1)
834 #define PREFIX_VEX_D3 (PREFIX_VEX_D2 + 1)
835 #define PREFIX_VEX_D4 (PREFIX_VEX_D3 + 1)
836 #define PREFIX_VEX_D5 (PREFIX_VEX_D4 + 1)
837 #define PREFIX_VEX_D6 (PREFIX_VEX_D5 + 1)
838 #define PREFIX_VEX_D7 (PREFIX_VEX_D6 + 1)
839 #define PREFIX_VEX_D8 (PREFIX_VEX_D7 + 1)
840 #define PREFIX_VEX_D9 (PREFIX_VEX_D8 + 1)
841 #define PREFIX_VEX_DA (PREFIX_VEX_D9 + 1)
842 #define PREFIX_VEX_DB (PREFIX_VEX_DA + 1)
843 #define PREFIX_VEX_DC (PREFIX_VEX_DB + 1)
844 #define PREFIX_VEX_DD (PREFIX_VEX_DC + 1)
845 #define PREFIX_VEX_DE (PREFIX_VEX_DD + 1)
846 #define PREFIX_VEX_DF (PREFIX_VEX_DE + 1)
847 #define PREFIX_VEX_E0 (PREFIX_VEX_DF + 1)
848 #define PREFIX_VEX_E1 (PREFIX_VEX_E0 + 1)
849 #define PREFIX_VEX_E2 (PREFIX_VEX_E1 + 1)
850 #define PREFIX_VEX_E3 (PREFIX_VEX_E2 + 1)
851 #define PREFIX_VEX_E4 (PREFIX_VEX_E3 + 1)
852 #define PREFIX_VEX_E5 (PREFIX_VEX_E4 + 1)
853 #define PREFIX_VEX_E6 (PREFIX_VEX_E5 + 1)
854 #define PREFIX_VEX_E7 (PREFIX_VEX_E6 + 1)
855 #define PREFIX_VEX_E8 (PREFIX_VEX_E7 + 1)
856 #define PREFIX_VEX_E9 (PREFIX_VEX_E8 + 1)
857 #define PREFIX_VEX_EA (PREFIX_VEX_E9 + 1)
858 #define PREFIX_VEX_EB (PREFIX_VEX_EA + 1)
859 #define PREFIX_VEX_EC (PREFIX_VEX_EB + 1)
860 #define PREFIX_VEX_ED (PREFIX_VEX_EC + 1)
861 #define PREFIX_VEX_EE (PREFIX_VEX_ED + 1)
862 #define PREFIX_VEX_EF (PREFIX_VEX_EE + 1)
863 #define PREFIX_VEX_F0 (PREFIX_VEX_EF + 1)
864 #define PREFIX_VEX_F1 (PREFIX_VEX_F0 + 1)
865 #define PREFIX_VEX_F2 (PREFIX_VEX_F1 + 1)
866 #define PREFIX_VEX_F3 (PREFIX_VEX_F2 + 1)
867 #define PREFIX_VEX_F4 (PREFIX_VEX_F3 + 1)
868 #define PREFIX_VEX_F5 (PREFIX_VEX_F4 + 1)
869 #define PREFIX_VEX_F6 (PREFIX_VEX_F5 + 1)
870 #define PREFIX_VEX_F7 (PREFIX_VEX_F6 + 1)
871 #define PREFIX_VEX_F8 (PREFIX_VEX_F7 + 1)
872 #define PREFIX_VEX_F9 (PREFIX_VEX_F8 + 1)
873 #define PREFIX_VEX_FA (PREFIX_VEX_F9 + 1)
874 #define PREFIX_VEX_FB (PREFIX_VEX_FA + 1)
875 #define PREFIX_VEX_FC (PREFIX_VEX_FB + 1)
876 #define PREFIX_VEX_FD (PREFIX_VEX_FC + 1)
877 #define PREFIX_VEX_FE (PREFIX_VEX_FD + 1)
878 #define PREFIX_VEX_3800 (PREFIX_VEX_FE + 1)
879 #define PREFIX_VEX_3801 (PREFIX_VEX_3800 + 1)
880 #define PREFIX_VEX_3802 (PREFIX_VEX_3801 + 1)
881 #define PREFIX_VEX_3803 (PREFIX_VEX_3802 + 1)
882 #define PREFIX_VEX_3804 (PREFIX_VEX_3803 + 1)
883 #define PREFIX_VEX_3805 (PREFIX_VEX_3804 + 1)
884 #define PREFIX_VEX_3806 (PREFIX_VEX_3805 + 1)
885 #define PREFIX_VEX_3807 (PREFIX_VEX_3806 + 1)
886 #define PREFIX_VEX_3808 (PREFIX_VEX_3807 + 1)
887 #define PREFIX_VEX_3809 (PREFIX_VEX_3808 + 1)
888 #define PREFIX_VEX_380A (PREFIX_VEX_3809 + 1)
889 #define PREFIX_VEX_380B (PREFIX_VEX_380A + 1)
890 #define PREFIX_VEX_380C (PREFIX_VEX_380B + 1)
891 #define PREFIX_VEX_380D (PREFIX_VEX_380C + 1)
892 #define PREFIX_VEX_380E (PREFIX_VEX_380D + 1)
893 #define PREFIX_VEX_380F (PREFIX_VEX_380E + 1)
894 #define PREFIX_VEX_3817 (PREFIX_VEX_380F + 1)
895 #define PREFIX_VEX_3818 (PREFIX_VEX_3817 + 1)
896 #define PREFIX_VEX_3819 (PREFIX_VEX_3818 + 1)
897 #define PREFIX_VEX_381A (PREFIX_VEX_3819 + 1)
898 #define PREFIX_VEX_381C (PREFIX_VEX_381A + 1)
899 #define PREFIX_VEX_381D (PREFIX_VEX_381C + 1)
900 #define PREFIX_VEX_381E (PREFIX_VEX_381D + 1)
901 #define PREFIX_VEX_3820 (PREFIX_VEX_381E + 1)
902 #define PREFIX_VEX_3821 (PREFIX_VEX_3820 + 1)
903 #define PREFIX_VEX_3822 (PREFIX_VEX_3821 + 1)
904 #define PREFIX_VEX_3823 (PREFIX_VEX_3822 + 1)
905 #define PREFIX_VEX_3824 (PREFIX_VEX_3823 + 1)
906 #define PREFIX_VEX_3825 (PREFIX_VEX_3824 + 1)
907 #define PREFIX_VEX_3828 (PREFIX_VEX_3825 + 1)
908 #define PREFIX_VEX_3829 (PREFIX_VEX_3828 + 1)
909 #define PREFIX_VEX_382A (PREFIX_VEX_3829 + 1)
910 #define PREFIX_VEX_382B (PREFIX_VEX_382A + 1)
911 #define PREFIX_VEX_382C (PREFIX_VEX_382B + 1)
912 #define PREFIX_VEX_382D (PREFIX_VEX_382C + 1)
913 #define PREFIX_VEX_382E (PREFIX_VEX_382D + 1)
914 #define PREFIX_VEX_382F (PREFIX_VEX_382E + 1)
915 #define PREFIX_VEX_3830 (PREFIX_VEX_382F + 1)
916 #define PREFIX_VEX_3831 (PREFIX_VEX_3830 + 1)
917 #define PREFIX_VEX_3832 (PREFIX_VEX_3831 + 1)
918 #define PREFIX_VEX_3833 (PREFIX_VEX_3832 + 1)
919 #define PREFIX_VEX_3834 (PREFIX_VEX_3833 + 1)
920 #define PREFIX_VEX_3835 (PREFIX_VEX_3834 + 1)
921 #define PREFIX_VEX_3837 (PREFIX_VEX_3835 + 1)
922 #define PREFIX_VEX_3838 (PREFIX_VEX_3837 + 1)
923 #define PREFIX_VEX_3839 (PREFIX_VEX_3838 + 1)
924 #define PREFIX_VEX_383A (PREFIX_VEX_3839 + 1)
925 #define PREFIX_VEX_383B (PREFIX_VEX_383A + 1)
926 #define PREFIX_VEX_383C (PREFIX_VEX_383B + 1)
927 #define PREFIX_VEX_383D (PREFIX_VEX_383C + 1)
928 #define PREFIX_VEX_383E (PREFIX_VEX_383D + 1)
929 #define PREFIX_VEX_383F (PREFIX_VEX_383E + 1)
930 #define PREFIX_VEX_3840 (PREFIX_VEX_383F + 1)
931 #define PREFIX_VEX_3841 (PREFIX_VEX_3840 + 1)
932 #define PREFIX_VEX_3A04 (PREFIX_VEX_3841 + 1)
933 #define PREFIX_VEX_3A05 (PREFIX_VEX_3A04 + 1)
934 #define PREFIX_VEX_3A06 (PREFIX_VEX_3A05 + 1)
935 #define PREFIX_VEX_3A08 (PREFIX_VEX_3A06 + 1)
936 #define PREFIX_VEX_3A09 (PREFIX_VEX_3A08 + 1)
937 #define PREFIX_VEX_3A0A (PREFIX_VEX_3A09 + 1)
938 #define PREFIX_VEX_3A0B (PREFIX_VEX_3A0A + 1)
939 #define PREFIX_VEX_3A0C (PREFIX_VEX_3A0B + 1)
940 #define PREFIX_VEX_3A0D (PREFIX_VEX_3A0C + 1)
941 #define PREFIX_VEX_3A0E (PREFIX_VEX_3A0D + 1)
942 #define PREFIX_VEX_3A0F (PREFIX_VEX_3A0E + 1)
943 #define PREFIX_VEX_3A14 (PREFIX_VEX_3A0F + 1)
944 #define PREFIX_VEX_3A15 (PREFIX_VEX_3A14 + 1)
945 #define PREFIX_VEX_3A16 (PREFIX_VEX_3A15 + 1)
946 #define PREFIX_VEX_3A17 (PREFIX_VEX_3A16 + 1)
947 #define PREFIX_VEX_3A18 (PREFIX_VEX_3A17 + 1)
948 #define PREFIX_VEX_3A19 (PREFIX_VEX_3A18 + 1)
949 #define PREFIX_VEX_3A20 (PREFIX_VEX_3A19 + 1)
950 #define PREFIX_VEX_3A21 (PREFIX_VEX_3A20 + 1)
951 #define PREFIX_VEX_3A22 (PREFIX_VEX_3A21 + 1)
952 #define PREFIX_VEX_3A40 (PREFIX_VEX_3A22 + 1)
953 #define PREFIX_VEX_3A41 (PREFIX_VEX_3A40 + 1)
954 #define PREFIX_VEX_3A42 (PREFIX_VEX_3A41 + 1)
955 #define PREFIX_VEX_3A48 (PREFIX_VEX_3A42 + 1)
956 #define PREFIX_VEX_3A49 (PREFIX_VEX_3A48 + 1)
957 #define PREFIX_VEX_3A4A (PREFIX_VEX_3A49 + 1)
958 #define PREFIX_VEX_3A4B (PREFIX_VEX_3A4A + 1)
959 #define PREFIX_VEX_3A4C (PREFIX_VEX_3A4B + 1)
960 #define PREFIX_VEX_3A5C (PREFIX_VEX_3A4C + 1)
961 #define PREFIX_VEX_3A5D (PREFIX_VEX_3A5C + 1)
962 #define PREFIX_VEX_3A5E (PREFIX_VEX_3A5D + 1)
963 #define PREFIX_VEX_3A5F (PREFIX_VEX_3A5E + 1)
964 #define PREFIX_VEX_3A60 (PREFIX_VEX_3A5F + 1)
965 #define PREFIX_VEX_3A61 (PREFIX_VEX_3A60 + 1)
966 #define PREFIX_VEX_3A62 (PREFIX_VEX_3A61 + 1)
967 #define PREFIX_VEX_3A63 (PREFIX_VEX_3A62 + 1)
968 #define PREFIX_VEX_3A68 (PREFIX_VEX_3A63 + 1)
969 #define PREFIX_VEX_3A69 (PREFIX_VEX_3A68 + 1)
970 #define PREFIX_VEX_3A6A (PREFIX_VEX_3A69 + 1)
971 #define PREFIX_VEX_3A6B (PREFIX_VEX_3A6A + 1)
972 #define PREFIX_VEX_3A6C (PREFIX_VEX_3A6B + 1)
973 #define PREFIX_VEX_3A6D (PREFIX_VEX_3A6C + 1)
974 #define PREFIX_VEX_3A6E (PREFIX_VEX_3A6D + 1)
975 #define PREFIX_VEX_3A6F (PREFIX_VEX_3A6E + 1)
976 #define PREFIX_VEX_3A78 (PREFIX_VEX_3A6F + 1)
977 #define PREFIX_VEX_3A79 (PREFIX_VEX_3A78 + 1)
978 #define PREFIX_VEX_3A7A (PREFIX_VEX_3A79 + 1)
979 #define PREFIX_VEX_3A7B (PREFIX_VEX_3A7A + 1)
980 #define PREFIX_VEX_3A7C (PREFIX_VEX_3A7B + 1)
981 #define PREFIX_VEX_3A7D (PREFIX_VEX_3A7C + 1)
982 #define PREFIX_VEX_3A7E (PREFIX_VEX_3A7D + 1)
983 #define PREFIX_VEX_3A7F (PREFIX_VEX_3A7E + 1)
985 #define X86_64_06 0
986 #define X86_64_07 (X86_64_06 + 1)
987 #define X86_64_0D (X86_64_07 + 1)
988 #define X86_64_16 (X86_64_0D + 1)
989 #define X86_64_17 (X86_64_16 + 1)
990 #define X86_64_1E (X86_64_17 + 1)
991 #define X86_64_1F (X86_64_1E + 1)
992 #define X86_64_27 (X86_64_1F + 1)
993 #define X86_64_2F (X86_64_27 + 1)
994 #define X86_64_37 (X86_64_2F + 1)
995 #define X86_64_3F (X86_64_37 + 1)
996 #define X86_64_60 (X86_64_3F + 1)
997 #define X86_64_61 (X86_64_60 + 1)
998 #define X86_64_62 (X86_64_61 + 1)
999 #define X86_64_63 (X86_64_62 + 1)
1000 #define X86_64_6D (X86_64_63 + 1)
1001 #define X86_64_6F (X86_64_6D + 1)
1002 #define X86_64_9A (X86_64_6F + 1)
1003 #define X86_64_C4 (X86_64_9A + 1)
1004 #define X86_64_C5 (X86_64_C4 + 1)
1005 #define X86_64_CE (X86_64_C5 + 1)
1006 #define X86_64_D4 (X86_64_CE + 1)
1007 #define X86_64_D5 (X86_64_D4 + 1)
1008 #define X86_64_EA (X86_64_D5 + 1)
1009 #define X86_64_0F01_REG_0 (X86_64_EA + 1)
1010 #define X86_64_0F01_REG_1 (X86_64_0F01_REG_0 + 1)
1011 #define X86_64_0F01_REG_2 (X86_64_0F01_REG_1 + 1)
1012 #define X86_64_0F01_REG_3 (X86_64_0F01_REG_2 + 1)
1014 #define THREE_BYTE_0F24 0
1015 #define THREE_BYTE_0F25 (THREE_BYTE_0F24 + 1)
1016 #define THREE_BYTE_0F38 (THREE_BYTE_0F25 + 1)
1017 #define THREE_BYTE_0F3A (THREE_BYTE_0F38 + 1)
1018 #define THREE_BYTE_0F7A (THREE_BYTE_0F3A + 1)
1019 #define THREE_BYTE_0F7B (THREE_BYTE_0F7A + 1)
1021 #define VEX_0F 0
1022 #define VEX_0F38 (VEX_0F + 1)
1023 #define VEX_0F3A (VEX_0F38 + 1)
1025 #define VEX_LEN_10_P_1 0
1026 #define VEX_LEN_10_P_3 (VEX_LEN_10_P_1 + 1)
1027 #define VEX_LEN_11_P_1 (VEX_LEN_10_P_3 + 1)
1028 #define VEX_LEN_11_P_3 (VEX_LEN_11_P_1 + 1)
1029 #define VEX_LEN_12_P_0_M_0 (VEX_LEN_11_P_3 + 1)
1030 #define VEX_LEN_12_P_0_M_1 (VEX_LEN_12_P_0_M_0 + 1)
1031 #define VEX_LEN_12_P_2 (VEX_LEN_12_P_0_M_1 + 1)
1032 #define VEX_LEN_13_M_0 (VEX_LEN_12_P_2 + 1)
1033 #define VEX_LEN_16_P_0_M_0 (VEX_LEN_13_M_0 + 1)
1034 #define VEX_LEN_16_P_0_M_1 (VEX_LEN_16_P_0_M_0 + 1)
1035 #define VEX_LEN_16_P_2 (VEX_LEN_16_P_0_M_1 + 1)
1036 #define VEX_LEN_17_M_0 (VEX_LEN_16_P_2 + 1)
1037 #define VEX_LEN_2A_P_1 (VEX_LEN_17_M_0 + 1)
1038 #define VEX_LEN_2A_P_3 (VEX_LEN_2A_P_1 + 1)
1039 #define VEX_LEN_2B_M_0 (VEX_LEN_2A_P_3 + 1)
1040 #define VEX_LEN_2C_P_1 (VEX_LEN_2B_M_0 + 1)
1041 #define VEX_LEN_2C_P_3 (VEX_LEN_2C_P_1 + 1)
1042 #define VEX_LEN_2D_P_1 (VEX_LEN_2C_P_3 + 1)
1043 #define VEX_LEN_2D_P_3 (VEX_LEN_2D_P_1 + 1)
1044 #define VEX_LEN_2E_P_0 (VEX_LEN_2D_P_3 + 1)
1045 #define VEX_LEN_2E_P_2 (VEX_LEN_2E_P_0 + 1)
1046 #define VEX_LEN_2F_P_0 (VEX_LEN_2E_P_2 + 1)
1047 #define VEX_LEN_2F_P_2 (VEX_LEN_2F_P_0 + 1)
1048 #define VEX_LEN_51_P_1 (VEX_LEN_2F_P_2 + 1)
1049 #define VEX_LEN_51_P_3 (VEX_LEN_51_P_1 + 1)
1050 #define VEX_LEN_52_P_1 (VEX_LEN_51_P_3 + 1)
1051 #define VEX_LEN_53_P_1 (VEX_LEN_52_P_1 + 1)
1052 #define VEX_LEN_58_P_1 (VEX_LEN_53_P_1 + 1)
1053 #define VEX_LEN_58_P_3 (VEX_LEN_58_P_1 + 1)
1054 #define VEX_LEN_59_P_1 (VEX_LEN_58_P_3 + 1)
1055 #define VEX_LEN_59_P_3 (VEX_LEN_59_P_1 + 1)
1056 #define VEX_LEN_5A_P_1 (VEX_LEN_59_P_3 + 1)
1057 #define VEX_LEN_5A_P_3 (VEX_LEN_5A_P_1 + 1)
1058 #define VEX_LEN_5C_P_1 (VEX_LEN_5A_P_3 + 1)
1059 #define VEX_LEN_5C_P_3 (VEX_LEN_5C_P_1 + 1)
1060 #define VEX_LEN_5D_P_1 (VEX_LEN_5C_P_3 + 1)
1061 #define VEX_LEN_5D_P_3 (VEX_LEN_5D_P_1 + 1)
1062 #define VEX_LEN_5E_P_1 (VEX_LEN_5D_P_3 + 1)
1063 #define VEX_LEN_5E_P_3 (VEX_LEN_5E_P_1 + 1)
1064 #define VEX_LEN_5F_P_1 (VEX_LEN_5E_P_3 + 1)
1065 #define VEX_LEN_5F_P_3 (VEX_LEN_5F_P_1 + 1)
1066 #define VEX_LEN_60_P_2 (VEX_LEN_5F_P_3 + 1)
1067 #define VEX_LEN_61_P_2 (VEX_LEN_60_P_2 + 1)
1068 #define VEX_LEN_62_P_2 (VEX_LEN_61_P_2 + 1)
1069 #define VEX_LEN_63_P_2 (VEX_LEN_62_P_2 + 1)
1070 #define VEX_LEN_64_P_2 (VEX_LEN_63_P_2 + 1)
1071 #define VEX_LEN_65_P_2 (VEX_LEN_64_P_2 + 1)
1072 #define VEX_LEN_66_P_2 (VEX_LEN_65_P_2 + 1)
1073 #define VEX_LEN_67_P_2 (VEX_LEN_66_P_2 + 1)
1074 #define VEX_LEN_68_P_2 (VEX_LEN_67_P_2 + 1)
1075 #define VEX_LEN_69_P_2 (VEX_LEN_68_P_2 + 1)
1076 #define VEX_LEN_6A_P_2 (VEX_LEN_69_P_2 + 1)
1077 #define VEX_LEN_6B_P_2 (VEX_LEN_6A_P_2 + 1)
1078 #define VEX_LEN_6C_P_2 (VEX_LEN_6B_P_2 + 1)
1079 #define VEX_LEN_6D_P_2 (VEX_LEN_6C_P_2 + 1)
1080 #define VEX_LEN_6E_P_2 (VEX_LEN_6D_P_2 + 1)
1081 #define VEX_LEN_70_P_1 (VEX_LEN_6E_P_2 + 1)
1082 #define VEX_LEN_70_P_2 (VEX_LEN_70_P_1 + 1)
1083 #define VEX_LEN_70_P_3 (VEX_LEN_70_P_2 + 1)
1084 #define VEX_LEN_71_R_2_P_2 (VEX_LEN_70_P_3 + 1)
1085 #define VEX_LEN_71_R_4_P_2 (VEX_LEN_71_R_2_P_2 + 1)
1086 #define VEX_LEN_71_R_6_P_2 (VEX_LEN_71_R_4_P_2 + 1)
1087 #define VEX_LEN_72_R_2_P_2 (VEX_LEN_71_R_6_P_2 + 1)
1088 #define VEX_LEN_72_R_4_P_2 (VEX_LEN_72_R_2_P_2 + 1)
1089 #define VEX_LEN_72_R_6_P_2 (VEX_LEN_72_R_4_P_2 + 1)
1090 #define VEX_LEN_73_R_2_P_2 (VEX_LEN_72_R_6_P_2 + 1)
1091 #define VEX_LEN_73_R_3_P_2 (VEX_LEN_73_R_2_P_2 + 1)
1092 #define VEX_LEN_73_R_6_P_2 (VEX_LEN_73_R_3_P_2 + 1)
1093 #define VEX_LEN_73_R_7_P_2 (VEX_LEN_73_R_6_P_2 + 1)
1094 #define VEX_LEN_74_P_2 (VEX_LEN_73_R_7_P_2 + 1)
1095 #define VEX_LEN_75_P_2 (VEX_LEN_74_P_2 + 1)
1096 #define VEX_LEN_76_P_2 (VEX_LEN_75_P_2 + 1)
1097 #define VEX_LEN_7E_P_1 (VEX_LEN_76_P_2 + 1)
1098 #define VEX_LEN_7E_P_2 (VEX_LEN_7E_P_1 + 1)
1099 #define VEX_LEN_AE_R_2_M_0 (VEX_LEN_7E_P_2 + 1)
1100 #define VEX_LEN_AE_R_3_M_0 (VEX_LEN_AE_R_2_M_0 + 1)
1101 #define VEX_LEN_C2_P_1 (VEX_LEN_AE_R_3_M_0 + 1)
1102 #define VEX_LEN_C2_P_3 (VEX_LEN_C2_P_1 + 1)
1103 #define VEX_LEN_C4_P_2 (VEX_LEN_C2_P_3 + 1)
1104 #define VEX_LEN_C5_P_2 (VEX_LEN_C4_P_2 + 1)
1105 #define VEX_LEN_D1_P_2 (VEX_LEN_C5_P_2 + 1)
1106 #define VEX_LEN_D2_P_2 (VEX_LEN_D1_P_2 + 1)
1107 #define VEX_LEN_D3_P_2 (VEX_LEN_D2_P_2 + 1)
1108 #define VEX_LEN_D4_P_2 (VEX_LEN_D3_P_2 + 1)
1109 #define VEX_LEN_D5_P_2 (VEX_LEN_D4_P_2 + 1)
1110 #define VEX_LEN_D6_P_2 (VEX_LEN_D5_P_2 + 1)
1111 #define VEX_LEN_D7_P_2_M_1 (VEX_LEN_D6_P_2 + 1)
1112 #define VEX_LEN_D8_P_2 (VEX_LEN_D7_P_2_M_1 + 1)
1113 #define VEX_LEN_D9_P_2 (VEX_LEN_D8_P_2 + 1)
1114 #define VEX_LEN_DA_P_2 (VEX_LEN_D9_P_2 + 1)
1115 #define VEX_LEN_DB_P_2 (VEX_LEN_DA_P_2 + 1)
1116 #define VEX_LEN_DC_P_2 (VEX_LEN_DB_P_2 + 1)
1117 #define VEX_LEN_DD_P_2 (VEX_LEN_DC_P_2 + 1)
1118 #define VEX_LEN_DE_P_2 (VEX_LEN_DD_P_2 + 1)
1119 #define VEX_LEN_DF_P_2 (VEX_LEN_DE_P_2 + 1)
1120 #define VEX_LEN_E0_P_2 (VEX_LEN_DF_P_2 + 1)
1121 #define VEX_LEN_E1_P_2 (VEX_LEN_E0_P_2 + 1)
1122 #define VEX_LEN_E2_P_2 (VEX_LEN_E1_P_2 + 1)
1123 #define VEX_LEN_E3_P_2 (VEX_LEN_E2_P_2 + 1)
1124 #define VEX_LEN_E4_P_2 (VEX_LEN_E3_P_2 + 1)
1125 #define VEX_LEN_E5_P_2 (VEX_LEN_E4_P_2 + 1)
1126 #define VEX_LEN_E7_P_2_M_0 (VEX_LEN_E5_P_2 + 1)
1127 #define VEX_LEN_E8_P_2 (VEX_LEN_E7_P_2_M_0 + 1)
1128 #define VEX_LEN_E9_P_2 (VEX_LEN_E8_P_2 + 1)
1129 #define VEX_LEN_EA_P_2 (VEX_LEN_E9_P_2 + 1)
1130 #define VEX_LEN_EB_P_2 (VEX_LEN_EA_P_2 + 1)
1131 #define VEX_LEN_EC_P_2 (VEX_LEN_EB_P_2 + 1)
1132 #define VEX_LEN_ED_P_2 (VEX_LEN_EC_P_2 + 1)
1133 #define VEX_LEN_EE_P_2 (VEX_LEN_ED_P_2 + 1)
1134 #define VEX_LEN_EF_P_2 (VEX_LEN_EE_P_2 + 1)
1135 #define VEX_LEN_F1_P_2 (VEX_LEN_EF_P_2 + 1)
1136 #define VEX_LEN_F2_P_2 (VEX_LEN_F1_P_2 + 1)
1137 #define VEX_LEN_F3_P_2 (VEX_LEN_F2_P_2 + 1)
1138 #define VEX_LEN_F4_P_2 (VEX_LEN_F3_P_2 + 1)
1139 #define VEX_LEN_F5_P_2 (VEX_LEN_F4_P_2 + 1)
1140 #define VEX_LEN_F6_P_2 (VEX_LEN_F5_P_2 + 1)
1141 #define VEX_LEN_F7_P_2 (VEX_LEN_F6_P_2 + 1)
1142 #define VEX_LEN_F8_P_2 (VEX_LEN_F7_P_2 + 1)
1143 #define VEX_LEN_F9_P_2 (VEX_LEN_F8_P_2 + 1)
1144 #define VEX_LEN_FA_P_2 (VEX_LEN_F9_P_2 + 1)
1145 #define VEX_LEN_FB_P_2 (VEX_LEN_FA_P_2 + 1)
1146 #define VEX_LEN_FC_P_2 (VEX_LEN_FB_P_2 + 1)
1147 #define VEX_LEN_FD_P_2 (VEX_LEN_FC_P_2 + 1)
1148 #define VEX_LEN_FE_P_2 (VEX_LEN_FD_P_2 + 1)
1149 #define VEX_LEN_3800_P_2 (VEX_LEN_FE_P_2 + 1)
1150 #define VEX_LEN_3801_P_2 (VEX_LEN_3800_P_2 + 1)
1151 #define VEX_LEN_3802_P_2 (VEX_LEN_3801_P_2 + 1)
1152 #define VEX_LEN_3803_P_2 (VEX_LEN_3802_P_2 + 1)
1153 #define VEX_LEN_3804_P_2 (VEX_LEN_3803_P_2 + 1)
1154 #define VEX_LEN_3805_P_2 (VEX_LEN_3804_P_2 + 1)
1155 #define VEX_LEN_3806_P_2 (VEX_LEN_3805_P_2 + 1)
1156 #define VEX_LEN_3807_P_2 (VEX_LEN_3806_P_2 + 1)
1157 #define VEX_LEN_3808_P_2 (VEX_LEN_3807_P_2 + 1)
1158 #define VEX_LEN_3809_P_2 (VEX_LEN_3808_P_2 + 1)
1159 #define VEX_LEN_380A_P_2 (VEX_LEN_3809_P_2 + 1)
1160 #define VEX_LEN_380B_P_2 (VEX_LEN_380A_P_2 + 1)
1161 #define VEX_LEN_3819_P_2_M_0 (VEX_LEN_380B_P_2 + 1)
1162 #define VEX_LEN_381A_P_2_M_0 (VEX_LEN_3819_P_2_M_0 + 1)
1163 #define VEX_LEN_381C_P_2 (VEX_LEN_381A_P_2_M_0 + 1)
1164 #define VEX_LEN_381D_P_2 (VEX_LEN_381C_P_2 + 1)
1165 #define VEX_LEN_381E_P_2 (VEX_LEN_381D_P_2 + 1)
1166 #define VEX_LEN_3820_P_2 (VEX_LEN_381E_P_2 + 1)
1167 #define VEX_LEN_3821_P_2 (VEX_LEN_3820_P_2 + 1)
1168 #define VEX_LEN_3822_P_2 (VEX_LEN_3821_P_2 + 1)
1169 #define VEX_LEN_3823_P_2 (VEX_LEN_3822_P_2 + 1)
1170 #define VEX_LEN_3824_P_2 (VEX_LEN_3823_P_2 + 1)
1171 #define VEX_LEN_3825_P_2 (VEX_LEN_3824_P_2 + 1)
1172 #define VEX_LEN_3828_P_2 (VEX_LEN_3825_P_2 + 1)
1173 #define VEX_LEN_3829_P_2 (VEX_LEN_3828_P_2 + 1)
1174 #define VEX_LEN_382A_P_2_M_0 (VEX_LEN_3829_P_2 + 1)
1175 #define VEX_LEN_382B_P_2 (VEX_LEN_382A_P_2_M_0 + 1)
1176 #define VEX_LEN_3830_P_2 (VEX_LEN_382B_P_2 + 1)
1177 #define VEX_LEN_3831_P_2 (VEX_LEN_3830_P_2 + 1)
1178 #define VEX_LEN_3832_P_2 (VEX_LEN_3831_P_2 + 1)
1179 #define VEX_LEN_3833_P_2 (VEX_LEN_3832_P_2 + 1)
1180 #define VEX_LEN_3834_P_2 (VEX_LEN_3833_P_2 + 1)
1181 #define VEX_LEN_3835_P_2 (VEX_LEN_3834_P_2 + 1)
1182 #define VEX_LEN_3837_P_2 (VEX_LEN_3835_P_2 + 1)
1183 #define VEX_LEN_3838_P_2 (VEX_LEN_3837_P_2 + 1)
1184 #define VEX_LEN_3839_P_2 (VEX_LEN_3838_P_2 + 1)
1185 #define VEX_LEN_383A_P_2 (VEX_LEN_3839_P_2 + 1)
1186 #define VEX_LEN_383B_P_2 (VEX_LEN_383A_P_2 + 1)
1187 #define VEX_LEN_383C_P_2 (VEX_LEN_383B_P_2 + 1)
1188 #define VEX_LEN_383D_P_2 (VEX_LEN_383C_P_2 + 1)
1189 #define VEX_LEN_383E_P_2 (VEX_LEN_383D_P_2 + 1)
1190 #define VEX_LEN_383F_P_2 (VEX_LEN_383E_P_2 + 1)
1191 #define VEX_LEN_3840_P_2 (VEX_LEN_383F_P_2 + 1)
1192 #define VEX_LEN_3841_P_2 (VEX_LEN_3840_P_2 + 1)
1193 #define VEX_LEN_3A06_P_2 (VEX_LEN_3841_P_2 + 1)
1194 #define VEX_LEN_3A0A_P_2 (VEX_LEN_3A06_P_2 + 1)
1195 #define VEX_LEN_3A0B_P_2 (VEX_LEN_3A0A_P_2 + 1)
1196 #define VEX_LEN_3A0E_P_2 (VEX_LEN_3A0B_P_2 + 1)
1197 #define VEX_LEN_3A0F_P_2 (VEX_LEN_3A0E_P_2 + 1)
1198 #define VEX_LEN_3A14_P_2 (VEX_LEN_3A0F_P_2 + 1)
1199 #define VEX_LEN_3A15_P_2 (VEX_LEN_3A14_P_2 + 1)
1200 #define VEX_LEN_3A16_P_2 (VEX_LEN_3A15_P_2 + 1)
1201 #define VEX_LEN_3A17_P_2 (VEX_LEN_3A16_P_2 + 1)
1202 #define VEX_LEN_3A18_P_2 (VEX_LEN_3A17_P_2 + 1)
1203 #define VEX_LEN_3A19_P_2 (VEX_LEN_3A18_P_2 + 1)
1204 #define VEX_LEN_3A20_P_2 (VEX_LEN_3A19_P_2 + 1)
1205 #define VEX_LEN_3A21_P_2 (VEX_LEN_3A20_P_2 + 1)
1206 #define VEX_LEN_3A22_P_2 (VEX_LEN_3A21_P_2 + 1)
1207 #define VEX_LEN_3A41_P_2 (VEX_LEN_3A22_P_2 + 1)
1208 #define VEX_LEN_3A42_P_2 (VEX_LEN_3A41_P_2 + 1)
1209 #define VEX_LEN_3A4C_P_2 (VEX_LEN_3A42_P_2 + 1)
1210 #define VEX_LEN_3A60_P_2 (VEX_LEN_3A4C_P_2 + 1)
1211 #define VEX_LEN_3A61_P_2 (VEX_LEN_3A60_P_2 + 1)
1212 #define VEX_LEN_3A62_P_2 (VEX_LEN_3A61_P_2 + 1)
1213 #define VEX_LEN_3A63_P_2 (VEX_LEN_3A62_P_2 + 1)
1214 #define VEX_LEN_3A6A_P_2 (VEX_LEN_3A63_P_2 + 1)
1215 #define VEX_LEN_3A6B_P_2 (VEX_LEN_3A6A_P_2 + 1)
1216 #define VEX_LEN_3A6E_P_2 (VEX_LEN_3A6B_P_2 + 1)
1217 #define VEX_LEN_3A6F_P_2 (VEX_LEN_3A6E_P_2 + 1)
1218 #define VEX_LEN_3A7A_P_2 (VEX_LEN_3A6F_P_2 + 1)
1219 #define VEX_LEN_3A7B_P_2 (VEX_LEN_3A7A_P_2 + 1)
1220 #define VEX_LEN_3A7E_P_2 (VEX_LEN_3A7B_P_2 + 1)
1221 #define VEX_LEN_3A7F_P_2 (VEX_LEN_3A7E_P_2 + 1)
1223 typedef void (*op_rtn) (int bytemode, int sizeflag);
1225 struct dis386 {
1226 const char *name;
1227 struct
1229 op_rtn rtn;
1230 int bytemode;
1231 } op[MAX_OPERANDS];
1234 /* Upper case letters in the instruction names here are macros.
1235 'A' => print 'b' if no register operands or suffix_always is true
1236 'B' => print 'b' if suffix_always is true
1237 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
1238 size prefix
1239 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
1240 suffix_always is true
1241 'E' => print 'e' if 32-bit form of jcxz
1242 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
1243 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
1244 'H' => print ",pt" or ",pn" branch hint
1245 'I' => honor following macro letter even in Intel mode (implemented only
1246 for some of the macro letters)
1247 'J' => print 'l'
1248 'K' => print 'd' or 'q' if rex prefix is present.
1249 'L' => print 'l' if suffix_always is true
1250 'M' => print 'r' if intel_mnemonic is false.
1251 'N' => print 'n' if instruction has no wait "prefix"
1252 'O' => print 'd' or 'o' (or 'q' in Intel mode)
1253 'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
1254 or suffix_always is true. print 'q' if rex prefix is present.
1255 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
1256 is true
1257 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
1258 'S' => print 'w', 'l' or 'q' if suffix_always is true
1259 'T' => print 'q' in 64bit mode and behave as 'P' otherwise
1260 'U' => print 'q' in 64bit mode and behave as 'Q' otherwise
1261 'V' => print 'q' in 64bit mode and behave as 'S' otherwise
1262 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
1263 'X' => print 's', 'd' depending on data16 prefix (for XMM)
1264 'Y' => 'q' if instruction has an REX 64bit overwrite prefix and
1265 suffix_always is true.
1266 'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
1267 '!' => change condition from true to false or from false to true.
1268 '%' => add 1 upper case letter to the macro.
1270 2 upper case letter macros:
1271 "XY" => print 'x' or 'y' if no register operands or suffix_always
1272 is true.
1273 'LQ' => print 'l' ('d' in Intel mode) or 'q' for memory operand
1274 or suffix_always is true
1276 Many of the above letters print nothing in Intel mode. See "putop"
1277 for the details.
1279 Braces '{' and '}', and vertical bars '|', indicate alternative
1280 mnemonic strings for AT&T and Intel. */
1282 static const struct dis386 dis386[] = {
1283 /* 00 */
1284 { "addB", { Eb, Gb } },
1285 { "addS", { Ev, Gv } },
1286 { "addB", { Gb, Eb } },
1287 { "addS", { Gv, Ev } },
1288 { "addB", { AL, Ib } },
1289 { "addS", { eAX, Iv } },
1290 { X86_64_TABLE (X86_64_06) },
1291 { X86_64_TABLE (X86_64_07) },
1292 /* 08 */
1293 { "orB", { Eb, Gb } },
1294 { "orS", { Ev, Gv } },
1295 { "orB", { Gb, Eb } },
1296 { "orS", { Gv, Ev } },
1297 { "orB", { AL, Ib } },
1298 { "orS", { eAX, Iv } },
1299 { X86_64_TABLE (X86_64_0D) },
1300 { "(bad)", { XX } }, /* 0x0f extended opcode escape */
1301 /* 10 */
1302 { "adcB", { Eb, Gb } },
1303 { "adcS", { Ev, Gv } },
1304 { "adcB", { Gb, Eb } },
1305 { "adcS", { Gv, Ev } },
1306 { "adcB", { AL, Ib } },
1307 { "adcS", { eAX, Iv } },
1308 { X86_64_TABLE (X86_64_16) },
1309 { X86_64_TABLE (X86_64_17) },
1310 /* 18 */
1311 { "sbbB", { Eb, Gb } },
1312 { "sbbS", { Ev, Gv } },
1313 { "sbbB", { Gb, Eb } },
1314 { "sbbS", { Gv, Ev } },
1315 { "sbbB", { AL, Ib } },
1316 { "sbbS", { eAX, Iv } },
1317 { X86_64_TABLE (X86_64_1E) },
1318 { X86_64_TABLE (X86_64_1F) },
1319 /* 20 */
1320 { "andB", { Eb, Gb } },
1321 { "andS", { Ev, Gv } },
1322 { "andB", { Gb, Eb } },
1323 { "andS", { Gv, Ev } },
1324 { "andB", { AL, Ib } },
1325 { "andS", { eAX, Iv } },
1326 { "(bad)", { XX } }, /* SEG ES prefix */
1327 { X86_64_TABLE (X86_64_27) },
1328 /* 28 */
1329 { "subB", { Eb, Gb } },
1330 { "subS", { Ev, Gv } },
1331 { "subB", { Gb, Eb } },
1332 { "subS", { Gv, Ev } },
1333 { "subB", { AL, Ib } },
1334 { "subS", { eAX, Iv } },
1335 { "(bad)", { XX } }, /* SEG CS prefix */
1336 { X86_64_TABLE (X86_64_2F) },
1337 /* 30 */
1338 { "xorB", { Eb, Gb } },
1339 { "xorS", { Ev, Gv } },
1340 { "xorB", { Gb, Eb } },
1341 { "xorS", { Gv, Ev } },
1342 { "xorB", { AL, Ib } },
1343 { "xorS", { eAX, Iv } },
1344 { "(bad)", { XX } }, /* SEG SS prefix */
1345 { X86_64_TABLE (X86_64_37) },
1346 /* 38 */
1347 { "cmpB", { Eb, Gb } },
1348 { "cmpS", { Ev, Gv } },
1349 { "cmpB", { Gb, Eb } },
1350 { "cmpS", { Gv, Ev } },
1351 { "cmpB", { AL, Ib } },
1352 { "cmpS", { eAX, Iv } },
1353 { "(bad)", { XX } }, /* SEG DS prefix */
1354 { X86_64_TABLE (X86_64_3F) },
1355 /* 40 */
1356 { "inc{S|}", { RMeAX } },
1357 { "inc{S|}", { RMeCX } },
1358 { "inc{S|}", { RMeDX } },
1359 { "inc{S|}", { RMeBX } },
1360 { "inc{S|}", { RMeSP } },
1361 { "inc{S|}", { RMeBP } },
1362 { "inc{S|}", { RMeSI } },
1363 { "inc{S|}", { RMeDI } },
1364 /* 48 */
1365 { "dec{S|}", { RMeAX } },
1366 { "dec{S|}", { RMeCX } },
1367 { "dec{S|}", { RMeDX } },
1368 { "dec{S|}", { RMeBX } },
1369 { "dec{S|}", { RMeSP } },
1370 { "dec{S|}", { RMeBP } },
1371 { "dec{S|}", { RMeSI } },
1372 { "dec{S|}", { RMeDI } },
1373 /* 50 */
1374 { "pushV", { RMrAX } },
1375 { "pushV", { RMrCX } },
1376 { "pushV", { RMrDX } },
1377 { "pushV", { RMrBX } },
1378 { "pushV", { RMrSP } },
1379 { "pushV", { RMrBP } },
1380 { "pushV", { RMrSI } },
1381 { "pushV", { RMrDI } },
1382 /* 58 */
1383 { "popV", { RMrAX } },
1384 { "popV", { RMrCX } },
1385 { "popV", { RMrDX } },
1386 { "popV", { RMrBX } },
1387 { "popV", { RMrSP } },
1388 { "popV", { RMrBP } },
1389 { "popV", { RMrSI } },
1390 { "popV", { RMrDI } },
1391 /* 60 */
1392 { X86_64_TABLE (X86_64_60) },
1393 { X86_64_TABLE (X86_64_61) },
1394 { X86_64_TABLE (X86_64_62) },
1395 { X86_64_TABLE (X86_64_63) },
1396 { "(bad)", { XX } }, /* seg fs */
1397 { "(bad)", { XX } }, /* seg gs */
1398 { "(bad)", { XX } }, /* op size prefix */
1399 { "(bad)", { XX } }, /* adr size prefix */
1400 /* 68 */
1401 { "pushT", { Iq } },
1402 { "imulS", { Gv, Ev, Iv } },
1403 { "pushT", { sIb } },
1404 { "imulS", { Gv, Ev, sIb } },
1405 { "ins{b|}", { Ybr, indirDX } },
1406 { X86_64_TABLE (X86_64_6D) },
1407 { "outs{b|}", { indirDXr, Xb } },
1408 { X86_64_TABLE (X86_64_6F) },
1409 /* 70 */
1410 { "joH", { Jb, XX, cond_jump_flag } },
1411 { "jnoH", { Jb, XX, cond_jump_flag } },
1412 { "jbH", { Jb, XX, cond_jump_flag } },
1413 { "jaeH", { Jb, XX, cond_jump_flag } },
1414 { "jeH", { Jb, XX, cond_jump_flag } },
1415 { "jneH", { Jb, XX, cond_jump_flag } },
1416 { "jbeH", { Jb, XX, cond_jump_flag } },
1417 { "jaH", { Jb, XX, cond_jump_flag } },
1418 /* 78 */
1419 { "jsH", { Jb, XX, cond_jump_flag } },
1420 { "jnsH", { Jb, XX, cond_jump_flag } },
1421 { "jpH", { Jb, XX, cond_jump_flag } },
1422 { "jnpH", { Jb, XX, cond_jump_flag } },
1423 { "jlH", { Jb, XX, cond_jump_flag } },
1424 { "jgeH", { Jb, XX, cond_jump_flag } },
1425 { "jleH", { Jb, XX, cond_jump_flag } },
1426 { "jgH", { Jb, XX, cond_jump_flag } },
1427 /* 80 */
1428 { REG_TABLE (REG_80) },
1429 { REG_TABLE (REG_81) },
1430 { "(bad)", { XX } },
1431 { REG_TABLE (REG_82) },
1432 { "testB", { Eb, Gb } },
1433 { "testS", { Ev, Gv } },
1434 { "xchgB", { Eb, Gb } },
1435 { "xchgS", { Ev, Gv } },
1436 /* 88 */
1437 { "movB", { Eb, Gb } },
1438 { "movS", { Ev, Gv } },
1439 { "movB", { Gb, Eb } },
1440 { "movS", { Gv, Ev } },
1441 { "movD", { Sv, Sw } },
1442 { MOD_TABLE (MOD_8D) },
1443 { "movD", { Sw, Sv } },
1444 { REG_TABLE (REG_8F) },
1445 /* 90 */
1446 { PREFIX_TABLE (PREFIX_90) },
1447 { "xchgS", { RMeCX, eAX } },
1448 { "xchgS", { RMeDX, eAX } },
1449 { "xchgS", { RMeBX, eAX } },
1450 { "xchgS", { RMeSP, eAX } },
1451 { "xchgS", { RMeBP, eAX } },
1452 { "xchgS", { RMeSI, eAX } },
1453 { "xchgS", { RMeDI, eAX } },
1454 /* 98 */
1455 { "cW{t|}R", { XX } },
1456 { "cR{t|}O", { XX } },
1457 { X86_64_TABLE (X86_64_9A) },
1458 { "(bad)", { XX } }, /* fwait */
1459 { "pushfT", { XX } },
1460 { "popfT", { XX } },
1461 { "sahf", { XX } },
1462 { "lahf", { XX } },
1463 /* a0 */
1464 { "movB", { AL, Ob } },
1465 { "movS", { eAX, Ov } },
1466 { "movB", { Ob, AL } },
1467 { "movS", { Ov, eAX } },
1468 { "movs{b|}", { Ybr, Xb } },
1469 { "movs{R|}", { Yvr, Xv } },
1470 { "cmps{b|}", { Xb, Yb } },
1471 { "cmps{R|}", { Xv, Yv } },
1472 /* a8 */
1473 { "testB", { AL, Ib } },
1474 { "testS", { eAX, Iv } },
1475 { "stosB", { Ybr, AL } },
1476 { "stosS", { Yvr, eAX } },
1477 { "lodsB", { ALr, Xb } },
1478 { "lodsS", { eAXr, Xv } },
1479 { "scasB", { AL, Yb } },
1480 { "scasS", { eAX, Yv } },
1481 /* b0 */
1482 { "movB", { RMAL, Ib } },
1483 { "movB", { RMCL, Ib } },
1484 { "movB", { RMDL, Ib } },
1485 { "movB", { RMBL, Ib } },
1486 { "movB", { RMAH, Ib } },
1487 { "movB", { RMCH, Ib } },
1488 { "movB", { RMDH, Ib } },
1489 { "movB", { RMBH, Ib } },
1490 /* b8 */
1491 { "movS", { RMeAX, Iv64 } },
1492 { "movS", { RMeCX, Iv64 } },
1493 { "movS", { RMeDX, Iv64 } },
1494 { "movS", { RMeBX, Iv64 } },
1495 { "movS", { RMeSP, Iv64 } },
1496 { "movS", { RMeBP, Iv64 } },
1497 { "movS", { RMeSI, Iv64 } },
1498 { "movS", { RMeDI, Iv64 } },
1499 /* c0 */
1500 { REG_TABLE (REG_C0) },
1501 { REG_TABLE (REG_C1) },
1502 { "retT", { Iw } },
1503 { "retT", { XX } },
1504 { X86_64_TABLE (X86_64_C4) },
1505 { X86_64_TABLE (X86_64_C5) },
1506 { REG_TABLE (REG_C6) },
1507 { REG_TABLE (REG_C7) },
1508 /* c8 */
1509 { "enterT", { Iw, Ib } },
1510 { "leaveT", { XX } },
1511 { "lretP", { Iw } },
1512 { "lretP", { XX } },
1513 { "int3", { XX } },
1514 { "int", { Ib } },
1515 { X86_64_TABLE (X86_64_CE) },
1516 { "iretP", { XX } },
1517 /* d0 */
1518 { REG_TABLE (REG_D0) },
1519 { REG_TABLE (REG_D1) },
1520 { REG_TABLE (REG_D2) },
1521 { REG_TABLE (REG_D3) },
1522 { X86_64_TABLE (X86_64_D4) },
1523 { X86_64_TABLE (X86_64_D5) },
1524 { "(bad)", { XX } },
1525 { "xlat", { DSBX } },
1526 /* d8 */
1527 { FLOAT },
1528 { FLOAT },
1529 { FLOAT },
1530 { FLOAT },
1531 { FLOAT },
1532 { FLOAT },
1533 { FLOAT },
1534 { FLOAT },
1535 /* e0 */
1536 { "loopneFH", { Jb, XX, loop_jcxz_flag } },
1537 { "loopeFH", { Jb, XX, loop_jcxz_flag } },
1538 { "loopFH", { Jb, XX, loop_jcxz_flag } },
1539 { "jEcxzH", { Jb, XX, loop_jcxz_flag } },
1540 { "inB", { AL, Ib } },
1541 { "inG", { zAX, Ib } },
1542 { "outB", { Ib, AL } },
1543 { "outG", { Ib, zAX } },
1544 /* e8 */
1545 { "callT", { Jv } },
1546 { "jmpT", { Jv } },
1547 { X86_64_TABLE (X86_64_EA) },
1548 { "jmp", { Jb } },
1549 { "inB", { AL, indirDX } },
1550 { "inG", { zAX, indirDX } },
1551 { "outB", { indirDX, AL } },
1552 { "outG", { indirDX, zAX } },
1553 /* f0 */
1554 { "(bad)", { XX } }, /* lock prefix */
1555 { "icebp", { XX } },
1556 { "(bad)", { XX } }, /* repne */
1557 { "(bad)", { XX } }, /* repz */
1558 { "hlt", { XX } },
1559 { "cmc", { XX } },
1560 { REG_TABLE (REG_F6) },
1561 { REG_TABLE (REG_F7) },
1562 /* f8 */
1563 { "clc", { XX } },
1564 { "stc", { XX } },
1565 { "cli", { XX } },
1566 { "sti", { XX } },
1567 { "cld", { XX } },
1568 { "std", { XX } },
1569 { REG_TABLE (REG_FE) },
1570 { REG_TABLE (REG_FF) },
1573 static const struct dis386 dis386_twobyte[] = {
1574 /* 00 */
1575 { REG_TABLE (REG_0F00 ) },
1576 { REG_TABLE (REG_0F01 ) },
1577 { "larS", { Gv, Ew } },
1578 { "lslS", { Gv, Ew } },
1579 { "(bad)", { XX } },
1580 { "syscall", { XX } },
1581 { "clts", { XX } },
1582 { "sysretP", { XX } },
1583 /* 08 */
1584 { "invd", { XX } },
1585 { "wbinvd", { XX } },
1586 { "(bad)", { XX } },
1587 { "ud2a", { XX } },
1588 { "(bad)", { XX } },
1589 { REG_TABLE (REG_0F0D) },
1590 { "femms", { XX } },
1591 { "", { MX, EM, OPSUF } }, /* See OP_3DNowSuffix. */
1592 /* 10 */
1593 { PREFIX_TABLE (PREFIX_0F10) },
1594 { PREFIX_TABLE (PREFIX_0F11) },
1595 { PREFIX_TABLE (PREFIX_0F12) },
1596 { MOD_TABLE (MOD_0F13) },
1597 { "unpcklpX", { XM, EXx } },
1598 { "unpckhpX", { XM, EXx } },
1599 { PREFIX_TABLE (PREFIX_0F16) },
1600 { MOD_TABLE (MOD_0F17) },
1601 /* 18 */
1602 { REG_TABLE (REG_0F18) },
1603 { "nopQ", { Ev } },
1604 { "nopQ", { Ev } },
1605 { "nopQ", { Ev } },
1606 { "nopQ", { Ev } },
1607 { "nopQ", { Ev } },
1608 { "nopQ", { Ev } },
1609 { "nopQ", { Ev } },
1610 /* 20 */
1611 { MOD_TABLE (MOD_0F20) },
1612 { MOD_TABLE (MOD_0F21) },
1613 { MOD_TABLE (MOD_0F22) },
1614 { MOD_TABLE (MOD_0F23) },
1615 { MOD_TABLE (MOD_0F24) },
1616 { THREE_BYTE_TABLE (THREE_BYTE_0F25) },
1617 { MOD_TABLE (MOD_0F26) },
1618 { "(bad)", { XX } },
1619 /* 28 */
1620 { "movapX", { XM, EXx } },
1621 { "movapX", { EXx, XM } },
1622 { PREFIX_TABLE (PREFIX_0F2A) },
1623 { PREFIX_TABLE (PREFIX_0F2B) },
1624 { PREFIX_TABLE (PREFIX_0F2C) },
1625 { PREFIX_TABLE (PREFIX_0F2D) },
1626 { PREFIX_TABLE (PREFIX_0F2E) },
1627 { PREFIX_TABLE (PREFIX_0F2F) },
1628 /* 30 */
1629 { "wrmsr", { XX } },
1630 { "rdtsc", { XX } },
1631 { "rdmsr", { XX } },
1632 { "rdpmc", { XX } },
1633 { "sysenter", { XX } },
1634 { "sysexit", { XX } },
1635 { "(bad)", { XX } },
1636 { "getsec", { XX } },
1637 /* 38 */
1638 { THREE_BYTE_TABLE (THREE_BYTE_0F38) },
1639 { "(bad)", { XX } },
1640 { THREE_BYTE_TABLE (THREE_BYTE_0F3A) },
1641 { "(bad)", { XX } },
1642 { "(bad)", { XX } },
1643 { "(bad)", { XX } },
1644 { "(bad)", { XX } },
1645 { "(bad)", { XX } },
1646 /* 40 */
1647 { "cmovo", { Gv, Ev } },
1648 { "cmovno", { Gv, Ev } },
1649 { "cmovb", { Gv, Ev } },
1650 { "cmovae", { Gv, Ev } },
1651 { "cmove", { Gv, Ev } },
1652 { "cmovne", { Gv, Ev } },
1653 { "cmovbe", { Gv, Ev } },
1654 { "cmova", { Gv, Ev } },
1655 /* 48 */
1656 { "cmovs", { Gv, Ev } },
1657 { "cmovns", { Gv, Ev } },
1658 { "cmovp", { Gv, Ev } },
1659 { "cmovnp", { Gv, Ev } },
1660 { "cmovl", { Gv, Ev } },
1661 { "cmovge", { Gv, Ev } },
1662 { "cmovle", { Gv, Ev } },
1663 { "cmovg", { Gv, Ev } },
1664 /* 50 */
1665 { MOD_TABLE (MOD_0F51) },
1666 { PREFIX_TABLE (PREFIX_0F51) },
1667 { PREFIX_TABLE (PREFIX_0F52) },
1668 { PREFIX_TABLE (PREFIX_0F53) },
1669 { "andpX", { XM, EXx } },
1670 { "andnpX", { XM, EXx } },
1671 { "orpX", { XM, EXx } },
1672 { "xorpX", { XM, EXx } },
1673 /* 58 */
1674 { PREFIX_TABLE (PREFIX_0F58) },
1675 { PREFIX_TABLE (PREFIX_0F59) },
1676 { PREFIX_TABLE (PREFIX_0F5A) },
1677 { PREFIX_TABLE (PREFIX_0F5B) },
1678 { PREFIX_TABLE (PREFIX_0F5C) },
1679 { PREFIX_TABLE (PREFIX_0F5D) },
1680 { PREFIX_TABLE (PREFIX_0F5E) },
1681 { PREFIX_TABLE (PREFIX_0F5F) },
1682 /* 60 */
1683 { PREFIX_TABLE (PREFIX_0F60) },
1684 { PREFIX_TABLE (PREFIX_0F61) },
1685 { PREFIX_TABLE (PREFIX_0F62) },
1686 { "packsswb", { MX, EM } },
1687 { "pcmpgtb", { MX, EM } },
1688 { "pcmpgtw", { MX, EM } },
1689 { "pcmpgtd", { MX, EM } },
1690 { "packuswb", { MX, EM } },
1691 /* 68 */
1692 { "punpckhbw", { MX, EM } },
1693 { "punpckhwd", { MX, EM } },
1694 { "punpckhdq", { MX, EM } },
1695 { "packssdw", { MX, EM } },
1696 { PREFIX_TABLE (PREFIX_0F6C) },
1697 { PREFIX_TABLE (PREFIX_0F6D) },
1698 { "movK", { MX, Edq } },
1699 { PREFIX_TABLE (PREFIX_0F6F) },
1700 /* 70 */
1701 { PREFIX_TABLE (PREFIX_0F70) },
1702 { REG_TABLE (REG_0F71) },
1703 { REG_TABLE (REG_0F72) },
1704 { REG_TABLE (REG_0F73) },
1705 { "pcmpeqb", { MX, EM } },
1706 { "pcmpeqw", { MX, EM } },
1707 { "pcmpeqd", { MX, EM } },
1708 { "emms", { XX } },
1709 /* 78 */
1710 { PREFIX_TABLE (PREFIX_0F78) },
1711 { PREFIX_TABLE (PREFIX_0F79) },
1712 { THREE_BYTE_TABLE (THREE_BYTE_0F7A) },
1713 { THREE_BYTE_TABLE (THREE_BYTE_0F7B) },
1714 { PREFIX_TABLE (PREFIX_0F7C) },
1715 { PREFIX_TABLE (PREFIX_0F7D) },
1716 { PREFIX_TABLE (PREFIX_0F7E) },
1717 { PREFIX_TABLE (PREFIX_0F7F) },
1718 /* 80 */
1719 { "joH", { Jv, XX, cond_jump_flag } },
1720 { "jnoH", { Jv, XX, cond_jump_flag } },
1721 { "jbH", { Jv, XX, cond_jump_flag } },
1722 { "jaeH", { Jv, XX, cond_jump_flag } },
1723 { "jeH", { Jv, XX, cond_jump_flag } },
1724 { "jneH", { Jv, XX, cond_jump_flag } },
1725 { "jbeH", { Jv, XX, cond_jump_flag } },
1726 { "jaH", { Jv, XX, cond_jump_flag } },
1727 /* 88 */
1728 { "jsH", { Jv, XX, cond_jump_flag } },
1729 { "jnsH", { Jv, XX, cond_jump_flag } },
1730 { "jpH", { Jv, XX, cond_jump_flag } },
1731 { "jnpH", { Jv, XX, cond_jump_flag } },
1732 { "jlH", { Jv, XX, cond_jump_flag } },
1733 { "jgeH", { Jv, XX, cond_jump_flag } },
1734 { "jleH", { Jv, XX, cond_jump_flag } },
1735 { "jgH", { Jv, XX, cond_jump_flag } },
1736 /* 90 */
1737 { "seto", { Eb } },
1738 { "setno", { Eb } },
1739 { "setb", { Eb } },
1740 { "setae", { Eb } },
1741 { "sete", { Eb } },
1742 { "setne", { Eb } },
1743 { "setbe", { Eb } },
1744 { "seta", { Eb } },
1745 /* 98 */
1746 { "sets", { Eb } },
1747 { "setns", { Eb } },
1748 { "setp", { Eb } },
1749 { "setnp", { Eb } },
1750 { "setl", { Eb } },
1751 { "setge", { Eb } },
1752 { "setle", { Eb } },
1753 { "setg", { Eb } },
1754 /* a0 */
1755 { "pushT", { fs } },
1756 { "popT", { fs } },
1757 { "cpuid", { XX } },
1758 { "btS", { Ev, Gv } },
1759 { "shldS", { Ev, Gv, Ib } },
1760 { "shldS", { Ev, Gv, CL } },
1761 { REG_TABLE (REG_0FA6) },
1762 { REG_TABLE (REG_0FA7) },
1763 /* a8 */
1764 { "pushT", { gs } },
1765 { "popT", { gs } },
1766 { "rsm", { XX } },
1767 { "btsS", { Ev, Gv } },
1768 { "shrdS", { Ev, Gv, Ib } },
1769 { "shrdS", { Ev, Gv, CL } },
1770 { REG_TABLE (REG_0FAE) },
1771 { "imulS", { Gv, Ev } },
1772 /* b0 */
1773 { "cmpxchgB", { Eb, Gb } },
1774 { "cmpxchgS", { Ev, Gv } },
1775 { MOD_TABLE (MOD_0FB2) },
1776 { "btrS", { Ev, Gv } },
1777 { MOD_TABLE (MOD_0FB4) },
1778 { MOD_TABLE (MOD_0FB5) },
1779 { "movz{bR|x}", { Gv, Eb } },
1780 { "movz{wR|x}", { Gv, Ew } }, /* yes, there really is movzww ! */
1781 /* b8 */
1782 { PREFIX_TABLE (PREFIX_0FB8) },
1783 { "ud2b", { XX } },
1784 { REG_TABLE (REG_0FBA) },
1785 { "btcS", { Ev, Gv } },
1786 { "bsfS", { Gv, Ev } },
1787 { PREFIX_TABLE (PREFIX_0FBD) },
1788 { "movs{bR|x}", { Gv, Eb } },
1789 { "movs{wR|x}", { Gv, Ew } }, /* yes, there really is movsww ! */
1790 /* c0 */
1791 { "xaddB", { Eb, Gb } },
1792 { "xaddS", { Ev, Gv } },
1793 { PREFIX_TABLE (PREFIX_0FC2) },
1794 { PREFIX_TABLE (PREFIX_0FC3) },
1795 { "pinsrw", { MX, Edqw, Ib } },
1796 { "pextrw", { Gdq, MS, Ib } },
1797 { "shufpX", { XM, EXx, Ib } },
1798 { REG_TABLE (REG_0FC7) },
1799 /* c8 */
1800 { "bswap", { RMeAX } },
1801 { "bswap", { RMeCX } },
1802 { "bswap", { RMeDX } },
1803 { "bswap", { RMeBX } },
1804 { "bswap", { RMeSP } },
1805 { "bswap", { RMeBP } },
1806 { "bswap", { RMeSI } },
1807 { "bswap", { RMeDI } },
1808 /* d0 */
1809 { PREFIX_TABLE (PREFIX_0FD0) },
1810 { "psrlw", { MX, EM } },
1811 { "psrld", { MX, EM } },
1812 { "psrlq", { MX, EM } },
1813 { "paddq", { MX, EM } },
1814 { "pmullw", { MX, EM } },
1815 { PREFIX_TABLE (PREFIX_0FD6) },
1816 { MOD_TABLE (MOD_0FD7) },
1817 /* d8 */
1818 { "psubusb", { MX, EM } },
1819 { "psubusw", { MX, EM } },
1820 { "pminub", { MX, EM } },
1821 { "pand", { MX, EM } },
1822 { "paddusb", { MX, EM } },
1823 { "paddusw", { MX, EM } },
1824 { "pmaxub", { MX, EM } },
1825 { "pandn", { MX, EM } },
1826 /* e0 */
1827 { "pavgb", { MX, EM } },
1828 { "psraw", { MX, EM } },
1829 { "psrad", { MX, EM } },
1830 { "pavgw", { MX, EM } },
1831 { "pmulhuw", { MX, EM } },
1832 { "pmulhw", { MX, EM } },
1833 { PREFIX_TABLE (PREFIX_0FE6) },
1834 { PREFIX_TABLE (PREFIX_0FE7) },
1835 /* e8 */
1836 { "psubsb", { MX, EM } },
1837 { "psubsw", { MX, EM } },
1838 { "pminsw", { MX, EM } },
1839 { "por", { MX, EM } },
1840 { "paddsb", { MX, EM } },
1841 { "paddsw", { MX, EM } },
1842 { "pmaxsw", { MX, EM } },
1843 { "pxor", { MX, EM } },
1844 /* f0 */
1845 { PREFIX_TABLE (PREFIX_0FF0) },
1846 { "psllw", { MX, EM } },
1847 { "pslld", { MX, EM } },
1848 { "psllq", { MX, EM } },
1849 { "pmuludq", { MX, EM } },
1850 { "pmaddwd", { MX, EM } },
1851 { "psadbw", { MX, EM } },
1852 { PREFIX_TABLE (PREFIX_0FF7) },
1853 /* f8 */
1854 { "psubb", { MX, EM } },
1855 { "psubw", { MX, EM } },
1856 { "psubd", { MX, EM } },
1857 { "psubq", { MX, EM } },
1858 { "paddb", { MX, EM } },
1859 { "paddw", { MX, EM } },
1860 { "paddd", { MX, EM } },
1861 { "(bad)", { XX } },
1864 static const unsigned char onebyte_has_modrm[256] = {
1865 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1866 /* ------------------------------- */
1867 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
1868 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
1869 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
1870 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
1871 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
1872 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
1873 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
1874 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
1875 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
1876 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
1877 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
1878 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
1879 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
1880 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
1881 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
1882 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
1883 /* ------------------------------- */
1884 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1887 static const unsigned char twobyte_has_modrm[256] = {
1888 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1889 /* ------------------------------- */
1890 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
1891 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
1892 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
1893 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
1894 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
1895 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
1896 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
1897 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
1898 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
1899 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
1900 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
1901 /* b0 */ 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, /* bf */
1902 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
1903 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
1904 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
1905 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 /* ff */
1906 /* ------------------------------- */
1907 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1910 static char obuf[100];
1911 static char *obufp;
1912 static char scratchbuf[100];
1913 static unsigned char *start_codep;
1914 static unsigned char *insn_codep;
1915 static unsigned char *codep;
1916 static const char *lock_prefix;
1917 static const char *data_prefix;
1918 static const char *addr_prefix;
1919 static const char *repz_prefix;
1920 static const char *repnz_prefix;
1921 static disassemble_info *the_info;
1922 static struct
1924 int mod;
1925 int reg;
1926 int rm;
1928 modrm;
1929 static unsigned char need_modrm;
1930 static struct
1932 int register_specifier;
1933 int length;
1934 int prefix;
1935 int w;
1937 vex;
1938 static unsigned char need_vex;
1939 static unsigned char need_vex_reg;
1940 static unsigned char vex_i4_done;
1942 /* If we are accessing mod/rm/reg without need_modrm set, then the
1943 values are stale. Hitting this abort likely indicates that you
1944 need to update onebyte_has_modrm or twobyte_has_modrm. */
1945 #define MODRM_CHECK if (!need_modrm) abort ()
1947 static const char **names64;
1948 static const char **names32;
1949 static const char **names16;
1950 static const char **names8;
1951 static const char **names8rex;
1952 static const char **names_seg;
1953 static const char *index64;
1954 static const char *index32;
1955 static const char **index16;
1957 static const char *intel_names64[] = {
1958 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
1959 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
1961 static const char *intel_names32[] = {
1962 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
1963 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
1965 static const char *intel_names16[] = {
1966 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
1967 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
1969 static const char *intel_names8[] = {
1970 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
1972 static const char *intel_names8rex[] = {
1973 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
1974 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
1976 static const char *intel_names_seg[] = {
1977 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
1979 static const char *intel_index64 = "riz";
1980 static const char *intel_index32 = "eiz";
1981 static const char *intel_index16[] = {
1982 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
1985 static const char *att_names64[] = {
1986 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
1987 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
1989 static const char *att_names32[] = {
1990 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
1991 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
1993 static const char *att_names16[] = {
1994 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
1995 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
1997 static const char *att_names8[] = {
1998 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
2000 static const char *att_names8rex[] = {
2001 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
2002 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
2004 static const char *att_names_seg[] = {
2005 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
2007 static const char *att_index64 = "%riz";
2008 static const char *att_index32 = "%eiz";
2009 static const char *att_index16[] = {
2010 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
2013 static const struct dis386 reg_table[][8] = {
2014 /* REG_80 */
2016 { "addA", { Eb, Ib } },
2017 { "orA", { Eb, Ib } },
2018 { "adcA", { Eb, Ib } },
2019 { "sbbA", { Eb, Ib } },
2020 { "andA", { Eb, Ib } },
2021 { "subA", { Eb, Ib } },
2022 { "xorA", { Eb, Ib } },
2023 { "cmpA", { Eb, Ib } },
2025 /* REG_81 */
2027 { "addQ", { Ev, Iv } },
2028 { "orQ", { Ev, Iv } },
2029 { "adcQ", { Ev, Iv } },
2030 { "sbbQ", { Ev, Iv } },
2031 { "andQ", { Ev, Iv } },
2032 { "subQ", { Ev, Iv } },
2033 { "xorQ", { Ev, Iv } },
2034 { "cmpQ", { Ev, Iv } },
2036 /* REG_82 */
2038 { "addQ", { Ev, sIb } },
2039 { "orQ", { Ev, sIb } },
2040 { "adcQ", { Ev, sIb } },
2041 { "sbbQ", { Ev, sIb } },
2042 { "andQ", { Ev, sIb } },
2043 { "subQ", { Ev, sIb } },
2044 { "xorQ", { Ev, sIb } },
2045 { "cmpQ", { Ev, sIb } },
2047 /* REG_8F */
2049 { "popU", { stackEv } },
2050 { "(bad)", { XX } },
2051 { "(bad)", { XX } },
2052 { "(bad)", { XX } },
2053 { "(bad)", { XX } },
2054 { "(bad)", { XX } },
2055 { "(bad)", { XX } },
2056 { "(bad)", { XX } },
2058 /* REG_C0 */
2060 { "rolA", { Eb, Ib } },
2061 { "rorA", { Eb, Ib } },
2062 { "rclA", { Eb, Ib } },
2063 { "rcrA", { Eb, Ib } },
2064 { "shlA", { Eb, Ib } },
2065 { "shrA", { Eb, Ib } },
2066 { "(bad)", { XX } },
2067 { "sarA", { Eb, Ib } },
2069 /* REG_C1 */
2071 { "rolQ", { Ev, Ib } },
2072 { "rorQ", { Ev, Ib } },
2073 { "rclQ", { Ev, Ib } },
2074 { "rcrQ", { Ev, Ib } },
2075 { "shlQ", { Ev, Ib } },
2076 { "shrQ", { Ev, Ib } },
2077 { "(bad)", { XX } },
2078 { "sarQ", { Ev, Ib } },
2080 /* REG_C6 */
2082 { "movA", { Eb, Ib } },
2083 { "(bad)", { XX } },
2084 { "(bad)", { XX } },
2085 { "(bad)", { XX } },
2086 { "(bad)", { XX } },
2087 { "(bad)", { XX } },
2088 { "(bad)", { XX } },
2089 { "(bad)", { XX } },
2091 /* REG_C7 */
2093 { "movQ", { Ev, Iv } },
2094 { "(bad)", { XX } },
2095 { "(bad)", { XX } },
2096 { "(bad)", { XX } },
2097 { "(bad)", { XX } },
2098 { "(bad)", { XX } },
2099 { "(bad)", { XX } },
2100 { "(bad)", { XX } },
2102 /* REG_D0 */
2104 { "rolA", { Eb, I1 } },
2105 { "rorA", { Eb, I1 } },
2106 { "rclA", { Eb, I1 } },
2107 { "rcrA", { Eb, I1 } },
2108 { "shlA", { Eb, I1 } },
2109 { "shrA", { Eb, I1 } },
2110 { "(bad)", { XX } },
2111 { "sarA", { Eb, I1 } },
2113 /* REG_D1 */
2115 { "rolQ", { Ev, I1 } },
2116 { "rorQ", { Ev, I1 } },
2117 { "rclQ", { Ev, I1 } },
2118 { "rcrQ", { Ev, I1 } },
2119 { "shlQ", { Ev, I1 } },
2120 { "shrQ", { Ev, I1 } },
2121 { "(bad)", { XX } },
2122 { "sarQ", { Ev, I1 } },
2124 /* REG_D2 */
2126 { "rolA", { Eb, CL } },
2127 { "rorA", { Eb, CL } },
2128 { "rclA", { Eb, CL } },
2129 { "rcrA", { Eb, CL } },
2130 { "shlA", { Eb, CL } },
2131 { "shrA", { Eb, CL } },
2132 { "(bad)", { XX } },
2133 { "sarA", { Eb, CL } },
2135 /* REG_D3 */
2137 { "rolQ", { Ev, CL } },
2138 { "rorQ", { Ev, CL } },
2139 { "rclQ", { Ev, CL } },
2140 { "rcrQ", { Ev, CL } },
2141 { "shlQ", { Ev, CL } },
2142 { "shrQ", { Ev, CL } },
2143 { "(bad)", { XX } },
2144 { "sarQ", { Ev, CL } },
2146 /* REG_F6 */
2148 { "testA", { Eb, Ib } },
2149 { "(bad)", { XX } },
2150 { "notA", { Eb } },
2151 { "negA", { Eb } },
2152 { "mulA", { Eb } }, /* Don't print the implicit %al register, */
2153 { "imulA", { Eb } }, /* to distinguish these opcodes from other */
2154 { "divA", { Eb } }, /* mul/imul opcodes. Do the same for div */
2155 { "idivA", { Eb } }, /* and idiv for consistency. */
2157 /* REG_F7 */
2159 { "testQ", { Ev, Iv } },
2160 { "(bad)", { XX } },
2161 { "notQ", { Ev } },
2162 { "negQ", { Ev } },
2163 { "mulQ", { Ev } }, /* Don't print the implicit register. */
2164 { "imulQ", { Ev } },
2165 { "divQ", { Ev } },
2166 { "idivQ", { Ev } },
2168 /* REG_FE */
2170 { "incA", { Eb } },
2171 { "decA", { Eb } },
2172 { "(bad)", { XX } },
2173 { "(bad)", { XX } },
2174 { "(bad)", { XX } },
2175 { "(bad)", { XX } },
2176 { "(bad)", { XX } },
2177 { "(bad)", { XX } },
2179 /* REG_FF */
2181 { "incQ", { Ev } },
2182 { "decQ", { Ev } },
2183 { "callT", { indirEv } },
2184 { "JcallT", { indirEp } },
2185 { "jmpT", { indirEv } },
2186 { "JjmpT", { indirEp } },
2187 { "pushU", { stackEv } },
2188 { "(bad)", { XX } },
2190 /* REG_0F00 */
2192 { "sldtD", { Sv } },
2193 { "strD", { Sv } },
2194 { "lldt", { Ew } },
2195 { "ltr", { Ew } },
2196 { "verr", { Ew } },
2197 { "verw", { Ew } },
2198 { "(bad)", { XX } },
2199 { "(bad)", { XX } },
2201 /* REG_0F01 */
2203 { MOD_TABLE (MOD_0F01_REG_0) },
2204 { MOD_TABLE (MOD_0F01_REG_1) },
2205 { MOD_TABLE (MOD_0F01_REG_2) },
2206 { MOD_TABLE (MOD_0F01_REG_3) },
2207 { "smswD", { Sv } },
2208 { "(bad)", { XX } },
2209 { "lmsw", { Ew } },
2210 { MOD_TABLE (MOD_0F01_REG_7) },
2212 /* REG_0F0D */
2214 { "prefetch", { Eb } },
2215 { "prefetchw", { Eb } },
2216 { "(bad)", { XX } },
2217 { "(bad)", { XX } },
2218 { "(bad)", { XX } },
2219 { "(bad)", { XX } },
2220 { "(bad)", { XX } },
2221 { "(bad)", { XX } },
2223 /* REG_0F18 */
2225 { MOD_TABLE (MOD_0F18_REG_0) },
2226 { MOD_TABLE (MOD_0F18_REG_1) },
2227 { MOD_TABLE (MOD_0F18_REG_2) },
2228 { MOD_TABLE (MOD_0F18_REG_3) },
2229 { "(bad)", { XX } },
2230 { "(bad)", { XX } },
2231 { "(bad)", { XX } },
2232 { "(bad)", { XX } },
2234 /* REG_0F71 */
2236 { "(bad)", { XX } },
2237 { "(bad)", { XX } },
2238 { MOD_TABLE (MOD_0F71_REG_2) },
2239 { "(bad)", { XX } },
2240 { MOD_TABLE (MOD_0F71_REG_4) },
2241 { "(bad)", { XX } },
2242 { MOD_TABLE (MOD_0F71_REG_6) },
2243 { "(bad)", { XX } },
2245 /* REG_0F72 */
2247 { "(bad)", { XX } },
2248 { "(bad)", { XX } },
2249 { MOD_TABLE (MOD_0F72_REG_2) },
2250 { "(bad)", { XX } },
2251 { MOD_TABLE (MOD_0F72_REG_4) },
2252 { "(bad)", { XX } },
2253 { MOD_TABLE (MOD_0F72_REG_6) },
2254 { "(bad)", { XX } },
2256 /* REG_0F73 */
2258 { "(bad)", { XX } },
2259 { "(bad)", { XX } },
2260 { MOD_TABLE (MOD_0F73_REG_2) },
2261 { MOD_TABLE (MOD_0F73_REG_3) },
2262 { "(bad)", { XX } },
2263 { "(bad)", { XX } },
2264 { MOD_TABLE (MOD_0F73_REG_6) },
2265 { MOD_TABLE (MOD_0F73_REG_7) },
2267 /* REG_0FA6 */
2269 { "montmul", { { OP_0f07, 0 } } },
2270 { "xsha1", { { OP_0f07, 0 } } },
2271 { "xsha256", { { OP_0f07, 0 } } },
2272 { "(bad)", { { OP_0f07, 0 } } },
2273 { "(bad)", { { OP_0f07, 0 } } },
2274 { "(bad)", { { OP_0f07, 0 } } },
2275 { "(bad)", { { OP_0f07, 0 } } },
2276 { "(bad)", { { OP_0f07, 0 } } },
2278 /* REG_0FA7 */
2280 { "xstore-rng", { { OP_0f07, 0 } } },
2281 { "xcrypt-ecb", { { OP_0f07, 0 } } },
2282 { "xcrypt-cbc", { { OP_0f07, 0 } } },
2283 { "xcrypt-ctr", { { OP_0f07, 0 } } },
2284 { "xcrypt-cfb", { { OP_0f07, 0 } } },
2285 { "xcrypt-ofb", { { OP_0f07, 0 } } },
2286 { "(bad)", { { OP_0f07, 0 } } },
2287 { "(bad)", { { OP_0f07, 0 } } },
2289 /* REG_0FAE */
2291 { MOD_TABLE (MOD_0FAE_REG_0) },
2292 { MOD_TABLE (MOD_0FAE_REG_1) },
2293 { MOD_TABLE (MOD_0FAE_REG_2) },
2294 { MOD_TABLE (MOD_0FAE_REG_3) },
2295 { MOD_TABLE (MOD_0FAE_REG_4) },
2296 { MOD_TABLE (MOD_0FAE_REG_5) },
2297 { MOD_TABLE (MOD_0FAE_REG_6) },
2298 { MOD_TABLE (MOD_0FAE_REG_7) },
2300 /* REG_0FBA */
2302 { "(bad)", { XX } },
2303 { "(bad)", { XX } },
2304 { "(bad)", { XX } },
2305 { "(bad)", { XX } },
2306 { "btQ", { Ev, Ib } },
2307 { "btsQ", { Ev, Ib } },
2308 { "btrQ", { Ev, Ib } },
2309 { "btcQ", { Ev, Ib } },
2311 /* REG_0FC7 */
2313 { "(bad)", { XX } },
2314 { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } } },
2315 { "(bad)", { XX } },
2316 { "(bad)", { XX } },
2317 { "(bad)", { XX } },
2318 { "(bad)", { XX } },
2319 { MOD_TABLE (MOD_0FC7_REG_6) },
2320 { MOD_TABLE (MOD_0FC7_REG_7) },
2322 /* REG_VEX_71 */
2324 { "(bad)", { XX } },
2325 { "(bad)", { XX } },
2326 { MOD_TABLE (MOD_VEX_71_REG_2) },
2327 { "(bad)", { XX } },
2328 { MOD_TABLE (MOD_VEX_71_REG_4) },
2329 { "(bad)", { XX } },
2330 { MOD_TABLE (MOD_VEX_71_REG_6) },
2331 { "(bad)", { XX } },
2333 /* REG_VEX_72 */
2335 { "(bad)", { XX } },
2336 { "(bad)", { XX } },
2337 { MOD_TABLE (MOD_VEX_72_REG_2) },
2338 { "(bad)", { XX } },
2339 { MOD_TABLE (MOD_VEX_72_REG_4) },
2340 { "(bad)", { XX } },
2341 { MOD_TABLE (MOD_VEX_72_REG_6) },
2342 { "(bad)", { XX } },
2344 /* REG_VEX_73 */
2346 { "(bad)", { XX } },
2347 { "(bad)", { XX } },
2348 { MOD_TABLE (MOD_VEX_73_REG_2) },
2349 { MOD_TABLE (MOD_VEX_73_REG_3) },
2350 { "(bad)", { XX } },
2351 { "(bad)", { XX } },
2352 { MOD_TABLE (MOD_VEX_73_REG_6) },
2353 { MOD_TABLE (MOD_VEX_73_REG_7) },
2355 /* REG_VEX_AE */
2357 { "(bad)", { XX } },
2358 { "(bad)", { XX } },
2359 { MOD_TABLE (MOD_VEX_AE_REG_2) },
2360 { MOD_TABLE (MOD_VEX_AE_REG_3) },
2361 { "(bad)", { XX } },
2362 { "(bad)", { XX } },
2363 { "(bad)", { XX } },
2364 { "(bad)", { XX } },
2368 static const struct dis386 prefix_table[][4] = {
2369 /* PREFIX_90 */
2371 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
2372 { "pause", { XX } },
2373 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
2374 { "(bad)", { XX } },
2377 /* PREFIX_0F10 */
2379 { "movups", { XM, EXx } },
2380 { "movss", { XM, EXd } },
2381 { "movupd", { XM, EXx } },
2382 { "movsd", { XM, EXq } },
2385 /* PREFIX_0F11 */
2387 { "movups", { EXx, XM } },
2388 { "movss", { EXd, XM } },
2389 { "movupd", { EXx, XM } },
2390 { "movsd", { EXq, XM } },
2393 /* PREFIX_0F12 */
2395 { MOD_TABLE (MOD_0F12_PREFIX_0) },
2396 { "movsldup", { XM, EXx } },
2397 { "movlpd", { XM, EXq } },
2398 { "movddup", { XM, EXq } },
2401 /* PREFIX_0F16 */
2403 { MOD_TABLE (MOD_0F16_PREFIX_0) },
2404 { "movshdup", { XM, EXx } },
2405 { "movhpd", { XM, EXq } },
2406 { "(bad)", { XX } },
2409 /* PREFIX_0F2A */
2411 { "cvtpi2ps", { XM, EMCq } },
2412 { "cvtsi2ss%LQ", { XM, Ev } },
2413 { "cvtpi2pd", { XM, EMCq } },
2414 { "cvtsi2sd%LQ", { XM, Ev } },
2417 /* PREFIX_0F2B */
2419 { MOD_TABLE (MOD_0F2B_PREFIX_0) },
2420 { MOD_TABLE (MOD_0F2B_PREFIX_1) },
2421 { MOD_TABLE (MOD_0F2B_PREFIX_2) },
2422 { MOD_TABLE (MOD_0F2B_PREFIX_3) },
2425 /* PREFIX_0F2C */
2427 { "cvttps2pi", { MXC, EXq } },
2428 { "cvttss2siY", { Gv, EXd } },
2429 { "cvttpd2pi", { MXC, EXx } },
2430 { "cvttsd2siY", { Gv, EXq } },
2433 /* PREFIX_0F2D */
2435 { "cvtps2pi", { MXC, EXq } },
2436 { "cvtss2siY", { Gv, EXd } },
2437 { "cvtpd2pi", { MXC, EXx } },
2438 { "cvtsd2siY", { Gv, EXq } },
2441 /* PREFIX_0F2E */
2443 { "ucomiss",{ XM, EXd } },
2444 { "(bad)", { XX } },
2445 { "ucomisd",{ XM, EXq } },
2446 { "(bad)", { XX } },
2449 /* PREFIX_0F2F */
2451 { "comiss", { XM, EXd } },
2452 { "(bad)", { XX } },
2453 { "comisd", { XM, EXq } },
2454 { "(bad)", { XX } },
2457 /* PREFIX_0F51 */
2459 { "sqrtps", { XM, EXx } },
2460 { "sqrtss", { XM, EXd } },
2461 { "sqrtpd", { XM, EXx } },
2462 { "sqrtsd", { XM, EXq } },
2465 /* PREFIX_0F52 */
2467 { "rsqrtps",{ XM, EXx } },
2468 { "rsqrtss",{ XM, EXd } },
2469 { "(bad)", { XX } },
2470 { "(bad)", { XX } },
2473 /* PREFIX_0F53 */
2475 { "rcpps", { XM, EXx } },
2476 { "rcpss", { XM, EXd } },
2477 { "(bad)", { XX } },
2478 { "(bad)", { XX } },
2481 /* PREFIX_0F58 */
2483 { "addps", { XM, EXx } },
2484 { "addss", { XM, EXd } },
2485 { "addpd", { XM, EXx } },
2486 { "addsd", { XM, EXq } },
2489 /* PREFIX_0F59 */
2491 { "mulps", { XM, EXx } },
2492 { "mulss", { XM, EXd } },
2493 { "mulpd", { XM, EXx } },
2494 { "mulsd", { XM, EXq } },
2497 /* PREFIX_0F5A */
2499 { "cvtps2pd", { XM, EXq } },
2500 { "cvtss2sd", { XM, EXd } },
2501 { "cvtpd2ps", { XM, EXx } },
2502 { "cvtsd2ss", { XM, EXq } },
2505 /* PREFIX_0F5B */
2507 { "cvtdq2ps", { XM, EXx } },
2508 { "cvttps2dq", { XM, EXx } },
2509 { "cvtps2dq", { XM, EXx } },
2510 { "(bad)", { XX } },
2513 /* PREFIX_0F5C */
2515 { "subps", { XM, EXx } },
2516 { "subss", { XM, EXd } },
2517 { "subpd", { XM, EXx } },
2518 { "subsd", { XM, EXq } },
2521 /* PREFIX_0F5D */
2523 { "minps", { XM, EXx } },
2524 { "minss", { XM, EXd } },
2525 { "minpd", { XM, EXx } },
2526 { "minsd", { XM, EXq } },
2529 /* PREFIX_0F5E */
2531 { "divps", { XM, EXx } },
2532 { "divss", { XM, EXd } },
2533 { "divpd", { XM, EXx } },
2534 { "divsd", { XM, EXq } },
2537 /* PREFIX_0F5F */
2539 { "maxps", { XM, EXx } },
2540 { "maxss", { XM, EXd } },
2541 { "maxpd", { XM, EXx } },
2542 { "maxsd", { XM, EXq } },
2545 /* PREFIX_0F60 */
2547 { "punpcklbw",{ MX, EMd } },
2548 { "(bad)", { XX } },
2549 { "punpcklbw",{ MX, EMx } },
2550 { "(bad)", { XX } },
2553 /* PREFIX_0F61 */
2555 { "punpcklwd",{ MX, EMd } },
2556 { "(bad)", { XX } },
2557 { "punpcklwd",{ MX, EMx } },
2558 { "(bad)", { XX } },
2561 /* PREFIX_0F62 */
2563 { "punpckldq",{ MX, EMd } },
2564 { "(bad)", { XX } },
2565 { "punpckldq",{ MX, EMx } },
2566 { "(bad)", { XX } },
2569 /* PREFIX_0F6C */
2571 { "(bad)", { XX } },
2572 { "(bad)", { XX } },
2573 { "punpcklqdq", { XM, EXx } },
2574 { "(bad)", { XX } },
2577 /* PREFIX_0F6D */
2579 { "(bad)", { XX } },
2580 { "(bad)", { XX } },
2581 { "punpckhqdq", { XM, EXx } },
2582 { "(bad)", { XX } },
2585 /* PREFIX_0F6F */
2587 { "movq", { MX, EM } },
2588 { "movdqu", { XM, EXx } },
2589 { "movdqa", { XM, EXx } },
2590 { "(bad)", { XX } },
2593 /* PREFIX_0F70 */
2595 { "pshufw", { MX, EM, Ib } },
2596 { "pshufhw",{ XM, EXx, Ib } },
2597 { "pshufd", { XM, EXx, Ib } },
2598 { "pshuflw",{ XM, EXx, Ib } },
2601 /* PREFIX_0F73_REG_3 */
2603 { "(bad)", { XX } },
2604 { "(bad)", { XX } },
2605 { "psrldq", { XS, Ib } },
2606 { "(bad)", { XX } },
2609 /* PREFIX_0F73_REG_7 */
2611 { "(bad)", { XX } },
2612 { "(bad)", { XX } },
2613 { "pslldq", { XS, Ib } },
2614 { "(bad)", { XX } },
2617 /* PREFIX_0F78 */
2619 {"vmread", { Em, Gm } },
2620 {"(bad)", { XX } },
2621 {"extrq", { XS, Ib, Ib } },
2622 {"insertq", { XM, XS, Ib, Ib } },
2625 /* PREFIX_0F79 */
2627 {"vmwrite", { Gm, Em } },
2628 {"(bad)", { XX } },
2629 {"extrq", { XM, XS } },
2630 {"insertq", { XM, XS } },
2633 /* PREFIX_0F7C */
2635 { "(bad)", { XX } },
2636 { "(bad)", { XX } },
2637 { "haddpd", { XM, EXx } },
2638 { "haddps", { XM, EXx } },
2641 /* PREFIX_0F7D */
2643 { "(bad)", { XX } },
2644 { "(bad)", { XX } },
2645 { "hsubpd", { XM, EXx } },
2646 { "hsubps", { XM, EXx } },
2649 /* PREFIX_0F7E */
2651 { "movK", { Edq, MX } },
2652 { "movq", { XM, EXq } },
2653 { "movK", { Edq, XM } },
2654 { "(bad)", { XX } },
2657 /* PREFIX_0F7F */
2659 { "movq", { EM, MX } },
2660 { "movdqu", { EXx, XM } },
2661 { "movdqa", { EXx, XM } },
2662 { "(bad)", { XX } },
2665 /* PREFIX_0FB8 */
2667 { "(bad)", { XX } },
2668 { "popcntS", { Gv, Ev } },
2669 { "(bad)", { XX } },
2670 { "(bad)", { XX } },
2673 /* PREFIX_0FBD */
2675 { "bsrS", { Gv, Ev } },
2676 { "lzcntS", { Gv, Ev } },
2677 { "bsrS", { Gv, Ev } },
2678 { "(bad)", { XX } },
2681 /* PREFIX_0FC2 */
2683 { "cmpps", { XM, EXx, CMP } },
2684 { "cmpss", { XM, EXd, CMP } },
2685 { "cmppd", { XM, EXx, CMP } },
2686 { "cmpsd", { XM, EXq, CMP } },
2689 /* PREFIX_0FC3 */
2691 { "movntiS", { Ma, Gv } },
2692 { "(bad)", { XX } },
2693 { "(bad)", { XX } },
2694 { "(bad)", { XX } },
2697 /* PREFIX_0FC7_REG_6 */
2699 { "vmptrld",{ Mq } },
2700 { "vmxon", { Mq } },
2701 { "vmclear",{ Mq } },
2702 { "(bad)", { XX } },
2705 /* PREFIX_0FD0 */
2707 { "(bad)", { XX } },
2708 { "(bad)", { XX } },
2709 { "addsubpd", { XM, EXx } },
2710 { "addsubps", { XM, EXx } },
2713 /* PREFIX_0FD6 */
2715 { "(bad)", { XX } },
2716 { "movq2dq",{ XM, MS } },
2717 { "movq", { EXq, XM } },
2718 { "movdq2q",{ MX, XS } },
2721 /* PREFIX_0FE6 */
2723 { "(bad)", { XX } },
2724 { "cvtdq2pd", { XM, EXq } },
2725 { "cvttpd2dq", { XM, EXx } },
2726 { "cvtpd2dq", { XM, EXx } },
2729 /* PREFIX_0FE7 */
2731 { "movntq", { Mq, MX } },
2732 { "(bad)", { XX } },
2733 { MOD_TABLE (MOD_0FE7_PREFIX_2) },
2734 { "(bad)", { XX } },
2737 /* PREFIX_0FF0 */
2739 { "(bad)", { XX } },
2740 { "(bad)", { XX } },
2741 { "(bad)", { XX } },
2742 { MOD_TABLE (MOD_0FF0_PREFIX_3) },
2745 /* PREFIX_0FF7 */
2747 { "maskmovq", { MX, MS } },
2748 { "(bad)", { XX } },
2749 { "maskmovdqu", { XM, XS } },
2750 { "(bad)", { XX } },
2753 /* PREFIX_0F3810 */
2755 { "(bad)", { XX } },
2756 { "(bad)", { XX } },
2757 { "pblendvb", { XM, EXx, XMM0 } },
2758 { "(bad)", { XX } },
2761 /* PREFIX_0F3814 */
2763 { "(bad)", { XX } },
2764 { "(bad)", { XX } },
2765 { "blendvps", { XM, EXx, XMM0 } },
2766 { "(bad)", { XX } },
2769 /* PREFIX_0F3815 */
2771 { "(bad)", { XX } },
2772 { "(bad)", { XX } },
2773 { "blendvpd", { XM, EXx, XMM0 } },
2774 { "(bad)", { XX } },
2777 /* PREFIX_0F3817 */
2779 { "(bad)", { XX } },
2780 { "(bad)", { XX } },
2781 { "ptest", { XM, EXx } },
2782 { "(bad)", { XX } },
2785 /* PREFIX_0F3820 */
2787 { "(bad)", { XX } },
2788 { "(bad)", { XX } },
2789 { "pmovsxbw", { XM, EXq } },
2790 { "(bad)", { XX } },
2793 /* PREFIX_0F3821 */
2795 { "(bad)", { XX } },
2796 { "(bad)", { XX } },
2797 { "pmovsxbd", { XM, EXd } },
2798 { "(bad)", { XX } },
2801 /* PREFIX_0F3822 */
2803 { "(bad)", { XX } },
2804 { "(bad)", { XX } },
2805 { "pmovsxbq", { XM, EXw } },
2806 { "(bad)", { XX } },
2809 /* PREFIX_0F3823 */
2811 { "(bad)", { XX } },
2812 { "(bad)", { XX } },
2813 { "pmovsxwd", { XM, EXq } },
2814 { "(bad)", { XX } },
2817 /* PREFIX_0F3824 */
2819 { "(bad)", { XX } },
2820 { "(bad)", { XX } },
2821 { "pmovsxwq", { XM, EXd } },
2822 { "(bad)", { XX } },
2825 /* PREFIX_0F3825 */
2827 { "(bad)", { XX } },
2828 { "(bad)", { XX } },
2829 { "pmovsxdq", { XM, EXq } },
2830 { "(bad)", { XX } },
2833 /* PREFIX_0F3828 */
2835 { "(bad)", { XX } },
2836 { "(bad)", { XX } },
2837 { "pmuldq", { XM, EXx } },
2838 { "(bad)", { XX } },
2841 /* PREFIX_0F3829 */
2843 { "(bad)", { XX } },
2844 { "(bad)", { XX } },
2845 { "pcmpeqq", { XM, EXx } },
2846 { "(bad)", { XX } },
2849 /* PREFIX_0F382A */
2851 { "(bad)", { XX } },
2852 { "(bad)", { XX } },
2853 { MOD_TABLE (MOD_0F382A_PREFIX_2) },
2854 { "(bad)", { XX } },
2857 /* PREFIX_0F382B */
2859 { "(bad)", { XX } },
2860 { "(bad)", { XX } },
2861 { "packusdw", { XM, EXx } },
2862 { "(bad)", { XX } },
2865 /* PREFIX_0F3830 */
2867 { "(bad)", { XX } },
2868 { "(bad)", { XX } },
2869 { "pmovzxbw", { XM, EXq } },
2870 { "(bad)", { XX } },
2873 /* PREFIX_0F3831 */
2875 { "(bad)", { XX } },
2876 { "(bad)", { XX } },
2877 { "pmovzxbd", { XM, EXd } },
2878 { "(bad)", { XX } },
2881 /* PREFIX_0F3832 */
2883 { "(bad)", { XX } },
2884 { "(bad)", { XX } },
2885 { "pmovzxbq", { XM, EXw } },
2886 { "(bad)", { XX } },
2889 /* PREFIX_0F3833 */
2891 { "(bad)", { XX } },
2892 { "(bad)", { XX } },
2893 { "pmovzxwd", { XM, EXq } },
2894 { "(bad)", { XX } },
2897 /* PREFIX_0F3834 */
2899 { "(bad)", { XX } },
2900 { "(bad)", { XX } },
2901 { "pmovzxwq", { XM, EXd } },
2902 { "(bad)", { XX } },
2905 /* PREFIX_0F3835 */
2907 { "(bad)", { XX } },
2908 { "(bad)", { XX } },
2909 { "pmovzxdq", { XM, EXq } },
2910 { "(bad)", { XX } },
2913 /* PREFIX_0F3837 */
2915 { "(bad)", { XX } },
2916 { "(bad)", { XX } },
2917 { "pcmpgtq", { XM, EXx } },
2918 { "(bad)", { XX } },
2921 /* PREFIX_0F3838 */
2923 { "(bad)", { XX } },
2924 { "(bad)", { XX } },
2925 { "pminsb", { XM, EXx } },
2926 { "(bad)", { XX } },
2929 /* PREFIX_0F3839 */
2931 { "(bad)", { XX } },
2932 { "(bad)", { XX } },
2933 { "pminsd", { XM, EXx } },
2934 { "(bad)", { XX } },
2937 /* PREFIX_0F383A */
2939 { "(bad)", { XX } },
2940 { "(bad)", { XX } },
2941 { "pminuw", { XM, EXx } },
2942 { "(bad)", { XX } },
2945 /* PREFIX_0F383B */
2947 { "(bad)", { XX } },
2948 { "(bad)", { XX } },
2949 { "pminud", { XM, EXx } },
2950 { "(bad)", { XX } },
2953 /* PREFIX_0F383C */
2955 { "(bad)", { XX } },
2956 { "(bad)", { XX } },
2957 { "pmaxsb", { XM, EXx } },
2958 { "(bad)", { XX } },
2961 /* PREFIX_0F383D */
2963 { "(bad)", { XX } },
2964 { "(bad)", { XX } },
2965 { "pmaxsd", { XM, EXx } },
2966 { "(bad)", { XX } },
2969 /* PREFIX_0F383E */
2971 { "(bad)", { XX } },
2972 { "(bad)", { XX } },
2973 { "pmaxuw", { XM, EXx } },
2974 { "(bad)", { XX } },
2977 /* PREFIX_0F383F */
2979 { "(bad)", { XX } },
2980 { "(bad)", { XX } },
2981 { "pmaxud", { XM, EXx } },
2982 { "(bad)", { XX } },
2985 /* PREFIX_0F3840 */
2987 { "(bad)", { XX } },
2988 { "(bad)", { XX } },
2989 { "pmulld", { XM, EXx } },
2990 { "(bad)", { XX } },
2993 /* PREFIX_0F3841 */
2995 { "(bad)", { XX } },
2996 { "(bad)", { XX } },
2997 { "phminposuw", { XM, EXx } },
2998 { "(bad)", { XX } },
3001 /* PREFIX_0F38DB */
3003 { "(bad)", { XX } },
3004 { "(bad)", { XX } },
3005 { "aesimc", { XM, EXx } },
3006 { "(bad)", { XX } },
3009 /* PREFIX_0F38DC */
3011 { "(bad)", { XX } },
3012 { "(bad)", { XX } },
3013 { "aesenc", { XM, EXx } },
3014 { "(bad)", { XX } },
3017 /* PREFIX_0F38DD */
3019 { "(bad)", { XX } },
3020 { "(bad)", { XX } },
3021 { "aesenclast", { XM, EXx } },
3022 { "(bad)", { XX } },
3025 /* PREFIX_0F38DE */
3027 { "(bad)", { XX } },
3028 { "(bad)", { XX } },
3029 { "aesdec", { XM, EXx } },
3030 { "(bad)", { XX } },
3033 /* PREFIX_0F38DF */
3035 { "(bad)", { XX } },
3036 { "(bad)", { XX } },
3037 { "aesdeclast", { XM, EXx } },
3038 { "(bad)", { XX } },
3041 /* PREFIX_0F38F0 */
3043 { "(bad)", { XX } },
3044 { "(bad)", { XX } },
3045 { "(bad)", { XX } },
3046 { "crc32", { Gdq, { CRC32_Fixup, b_mode } } },
3049 /* PREFIX_0F38F1 */
3051 { "(bad)", { XX } },
3052 { "(bad)", { XX } },
3053 { "(bad)", { XX } },
3054 { "crc32", { Gdq, { CRC32_Fixup, v_mode } } },
3057 /* PREFIX_0F3A08 */
3059 { "(bad)", { XX } },
3060 { "(bad)", { XX } },
3061 { "roundps", { XM, EXx, Ib } },
3062 { "(bad)", { XX } },
3065 /* PREFIX_0F3A09 */
3067 { "(bad)", { XX } },
3068 { "(bad)", { XX } },
3069 { "roundpd", { XM, EXx, Ib } },
3070 { "(bad)", { XX } },
3073 /* PREFIX_0F3A0A */
3075 { "(bad)", { XX } },
3076 { "(bad)", { XX } },
3077 { "roundss", { XM, EXd, Ib } },
3078 { "(bad)", { XX } },
3081 /* PREFIX_0F3A0B */
3083 { "(bad)", { XX } },
3084 { "(bad)", { XX } },
3085 { "roundsd", { XM, EXq, Ib } },
3086 { "(bad)", { XX } },
3089 /* PREFIX_0F3A0C */
3091 { "(bad)", { XX } },
3092 { "(bad)", { XX } },
3093 { "blendps", { XM, EXx, Ib } },
3094 { "(bad)", { XX } },
3097 /* PREFIX_0F3A0D */
3099 { "(bad)", { XX } },
3100 { "(bad)", { XX } },
3101 { "blendpd", { XM, EXx, Ib } },
3102 { "(bad)", { XX } },
3105 /* PREFIX_0F3A0E */
3107 { "(bad)", { XX } },
3108 { "(bad)", { XX } },
3109 { "pblendw", { XM, EXx, Ib } },
3110 { "(bad)", { XX } },
3113 /* PREFIX_0F3A14 */
3115 { "(bad)", { XX } },
3116 { "(bad)", { XX } },
3117 { "pextrb", { Edqb, XM, Ib } },
3118 { "(bad)", { XX } },
3121 /* PREFIX_0F3A15 */
3123 { "(bad)", { XX } },
3124 { "(bad)", { XX } },
3125 { "pextrw", { Edqw, XM, Ib } },
3126 { "(bad)", { XX } },
3129 /* PREFIX_0F3A16 */
3131 { "(bad)", { XX } },
3132 { "(bad)", { XX } },
3133 { "pextrK", { Edq, XM, Ib } },
3134 { "(bad)", { XX } },
3137 /* PREFIX_0F3A17 */
3139 { "(bad)", { XX } },
3140 { "(bad)", { XX } },
3141 { "extractps", { Edqd, XM, Ib } },
3142 { "(bad)", { XX } },
3145 /* PREFIX_0F3A20 */
3147 { "(bad)", { XX } },
3148 { "(bad)", { XX } },
3149 { "pinsrb", { XM, Edqb, Ib } },
3150 { "(bad)", { XX } },
3153 /* PREFIX_0F3A21 */
3155 { "(bad)", { XX } },
3156 { "(bad)", { XX } },
3157 { "insertps", { XM, EXd, Ib } },
3158 { "(bad)", { XX } },
3161 /* PREFIX_0F3A22 */
3163 { "(bad)", { XX } },
3164 { "(bad)", { XX } },
3165 { "pinsrK", { XM, Edq, Ib } },
3166 { "(bad)", { XX } },
3169 /* PREFIX_0F3A40 */
3171 { "(bad)", { XX } },
3172 { "(bad)", { XX } },
3173 { "dpps", { XM, EXx, Ib } },
3174 { "(bad)", { XX } },
3177 /* PREFIX_0F3A41 */
3179 { "(bad)", { XX } },
3180 { "(bad)", { XX } },
3181 { "dppd", { XM, EXx, Ib } },
3182 { "(bad)", { XX } },
3185 /* PREFIX_0F3A42 */
3187 { "(bad)", { XX } },
3188 { "(bad)", { XX } },
3189 { "mpsadbw", { XM, EXx, Ib } },
3190 { "(bad)", { XX } },
3193 /* PREFIX_0F3A44 */
3195 { "(bad)", { XX } },
3196 { "(bad)", { XX } },
3197 { "pclmulqdq", { XM, EXx, PCLMUL } },
3198 { "(bad)", { XX } },
3201 /* PREFIX_0F3A60 */
3203 { "(bad)", { XX } },
3204 { "(bad)", { XX } },
3205 { "pcmpestrm", { XM, EXx, Ib } },
3206 { "(bad)", { XX } },
3209 /* PREFIX_0F3A61 */
3211 { "(bad)", { XX } },
3212 { "(bad)", { XX } },
3213 { "pcmpestri", { XM, EXx, Ib } },
3214 { "(bad)", { XX } },
3217 /* PREFIX_0F3A62 */
3219 { "(bad)", { XX } },
3220 { "(bad)", { XX } },
3221 { "pcmpistrm", { XM, EXx, Ib } },
3222 { "(bad)", { XX } },
3225 /* PREFIX_0F3A63 */
3227 { "(bad)", { XX } },
3228 { "(bad)", { XX } },
3229 { "pcmpistri", { XM, EXx, Ib } },
3230 { "(bad)", { XX } },
3233 /* PREFIX_0F3ADF */
3235 { "(bad)", { XX } },
3236 { "(bad)", { XX } },
3237 { "aeskeygenassist", { XM, EXx, Ib } },
3238 { "(bad)", { XX } },
3241 /* PREFIX_VEX_10 */
3243 { "vmovups", { XM, EXx } },
3244 { VEX_LEN_TABLE (VEX_LEN_10_P_1) },
3245 { "vmovupd", { XM, EXx } },
3246 { VEX_LEN_TABLE (VEX_LEN_10_P_3) },
3249 /* PREFIX_VEX_11 */
3251 { "vmovups", { EXx, XM } },
3252 { VEX_LEN_TABLE (VEX_LEN_11_P_1) },
3253 { "vmovupd", { EXx, XM } },
3254 { VEX_LEN_TABLE (VEX_LEN_11_P_3) },
3257 /* PREFIX_VEX_12 */
3259 { MOD_TABLE (MOD_VEX_12_PREFIX_0) },
3260 { "vmovsldup", { XM, EXx } },
3261 { VEX_LEN_TABLE (VEX_LEN_12_P_2) },
3262 { "vmovddup", { XM, EXymmq } },
3265 /* PREFIX_VEX_16 */
3267 { MOD_TABLE (MOD_VEX_16_PREFIX_0) },
3268 { "vmovshdup", { XM, EXx } },
3269 { VEX_LEN_TABLE (VEX_LEN_16_P_2) },
3270 { "(bad)", { XX } },
3273 /* PREFIX_VEX_2A */
3275 { "(bad)", { XX } },
3276 { VEX_LEN_TABLE (VEX_LEN_2A_P_1) },
3277 { "(bad)", { XX } },
3278 { VEX_LEN_TABLE (VEX_LEN_2A_P_3) },
3281 /* PREFIX_VEX_2C */
3283 { "(bad)", { XX } },
3284 { VEX_LEN_TABLE (VEX_LEN_2C_P_1) },
3285 { "(bad)", { XX } },
3286 { VEX_LEN_TABLE (VEX_LEN_2C_P_3) },
3289 /* PREFIX_VEX_2D */
3291 { "(bad)", { XX } },
3292 { VEX_LEN_TABLE (VEX_LEN_2D_P_1) },
3293 { "(bad)", { XX } },
3294 { VEX_LEN_TABLE (VEX_LEN_2D_P_3) },
3297 /* PREFIX_VEX_2E */
3299 { VEX_LEN_TABLE (VEX_LEN_2E_P_0) },
3300 { "(bad)", { XX } },
3301 { VEX_LEN_TABLE (VEX_LEN_2E_P_2) },
3302 { "(bad)", { XX } },
3305 /* PREFIX_VEX_2F */
3307 { VEX_LEN_TABLE (VEX_LEN_2F_P_0) },
3308 { "(bad)", { XX } },
3309 { VEX_LEN_TABLE (VEX_LEN_2F_P_2) },
3310 { "(bad)", { XX } },
3313 /* PREFIX_VEX_51 */
3315 { "vsqrtps", { XM, EXx } },
3316 { VEX_LEN_TABLE (VEX_LEN_51_P_1) },
3317 { "vsqrtpd", { XM, EXx } },
3318 { VEX_LEN_TABLE (VEX_LEN_51_P_3) },
3321 /* PREFIX_VEX_52 */
3323 { "vrsqrtps", { XM, EXx } },
3324 { VEX_LEN_TABLE (VEX_LEN_52_P_1) },
3325 { "(bad)", { XX } },
3326 { "(bad)", { XX } },
3329 /* PREFIX_VEX_53 */
3331 { "vrcpps", { XM, EXx } },
3332 { VEX_LEN_TABLE (VEX_LEN_53_P_1) },
3333 { "(bad)", { XX } },
3334 { "(bad)", { XX } },
3337 /* PREFIX_VEX_58 */
3339 { "vaddps", { XM, Vex, EXx } },
3340 { VEX_LEN_TABLE (VEX_LEN_58_P_1) },
3341 { "vaddpd", { XM, Vex, EXx } },
3342 { VEX_LEN_TABLE (VEX_LEN_58_P_3) },
3345 /* PREFIX_VEX_59 */
3347 { "vmulps", { XM, Vex, EXx } },
3348 { VEX_LEN_TABLE (VEX_LEN_59_P_1) },
3349 { "vmulpd", { XM, Vex, EXx } },
3350 { VEX_LEN_TABLE (VEX_LEN_59_P_3) },
3353 /* PREFIX_VEX_5A */
3355 { "vcvtps2pd", { XM, EXxmmq } },
3356 { VEX_LEN_TABLE (VEX_LEN_5A_P_1) },
3357 { "vcvtpd2ps%XY", { XMM, EXx } },
3358 { VEX_LEN_TABLE (VEX_LEN_5A_P_3) },
3361 /* PREFIX_VEX_5B */
3363 { "vcvtdq2ps", { XM, EXx } },
3364 { "vcvttps2dq", { XM, EXx } },
3365 { "vcvtps2dq", { XM, EXx } },
3366 { "(bad)", { XX } },
3369 /* PREFIX_VEX_5C */
3371 { "vsubps", { XM, Vex, EXx } },
3372 { VEX_LEN_TABLE (VEX_LEN_5C_P_1) },
3373 { "vsubpd", { XM, Vex, EXx } },
3374 { VEX_LEN_TABLE (VEX_LEN_5C_P_3) },
3377 /* PREFIX_VEX_5D */
3379 { "vminps", { XM, Vex, EXx } },
3380 { VEX_LEN_TABLE (VEX_LEN_5D_P_1) },
3381 { "vminpd", { XM, Vex, EXx } },
3382 { VEX_LEN_TABLE (VEX_LEN_5D_P_3) },
3385 /* PREFIX_VEX_5E */
3387 { "vdivps", { XM, Vex, EXx } },
3388 { VEX_LEN_TABLE (VEX_LEN_5E_P_1) },
3389 { "vdivpd", { XM, Vex, EXx } },
3390 { VEX_LEN_TABLE (VEX_LEN_5E_P_3) },
3393 /* PREFIX_VEX_5F */
3395 { "vmaxps", { XM, Vex, EXx } },
3396 { VEX_LEN_TABLE (VEX_LEN_5F_P_1) },
3397 { "vmaxpd", { XM, Vex, EXx } },
3398 { VEX_LEN_TABLE (VEX_LEN_5F_P_3) },
3401 /* PREFIX_VEX_60 */
3403 { "(bad)", { XX } },
3404 { "(bad)", { XX } },
3405 { VEX_LEN_TABLE (VEX_LEN_60_P_2) },
3406 { "(bad)", { XX } },
3409 /* PREFIX_VEX_61 */
3411 { "(bad)", { XX } },
3412 { "(bad)", { XX } },
3413 { VEX_LEN_TABLE (VEX_LEN_61_P_2) },
3414 { "(bad)", { XX } },
3417 /* PREFIX_VEX_62 */
3419 { "(bad)", { XX } },
3420 { "(bad)", { XX } },
3421 { VEX_LEN_TABLE (VEX_LEN_62_P_2) },
3422 { "(bad)", { XX } },
3425 /* PREFIX_VEX_63 */
3427 { "(bad)", { XX } },
3428 { "(bad)", { XX } },
3429 { VEX_LEN_TABLE (VEX_LEN_63_P_2) },
3430 { "(bad)", { XX } },
3433 /* PREFIX_VEX_64 */
3435 { "(bad)", { XX } },
3436 { "(bad)", { XX } },
3437 { VEX_LEN_TABLE (VEX_LEN_64_P_2) },
3438 { "(bad)", { XX } },
3441 /* PREFIX_VEX_65 */
3443 { "(bad)", { XX } },
3444 { "(bad)", { XX } },
3445 { VEX_LEN_TABLE (VEX_LEN_65_P_2) },
3446 { "(bad)", { XX } },
3449 /* PREFIX_VEX_66 */
3451 { "(bad)", { XX } },
3452 { "(bad)", { XX } },
3453 { VEX_LEN_TABLE (VEX_LEN_66_P_2) },
3454 { "(bad)", { XX } },
3457 /* PREFIX_VEX_67 */
3459 { "(bad)", { XX } },
3460 { "(bad)", { XX } },
3461 { VEX_LEN_TABLE (VEX_LEN_67_P_2) },
3462 { "(bad)", { XX } },
3465 /* PREFIX_VEX_68 */
3467 { "(bad)", { XX } },
3468 { "(bad)", { XX } },
3469 { VEX_LEN_TABLE (VEX_LEN_68_P_2) },
3470 { "(bad)", { XX } },
3473 /* PREFIX_VEX_69 */
3475 { "(bad)", { XX } },
3476 { "(bad)", { XX } },
3477 { VEX_LEN_TABLE (VEX_LEN_69_P_2) },
3478 { "(bad)", { XX } },
3481 /* PREFIX_VEX_6A */
3483 { "(bad)", { XX } },
3484 { "(bad)", { XX } },
3485 { VEX_LEN_TABLE (VEX_LEN_6A_P_2) },
3486 { "(bad)", { XX } },
3489 /* PREFIX_VEX_6B */
3491 { "(bad)", { XX } },
3492 { "(bad)", { XX } },
3493 { VEX_LEN_TABLE (VEX_LEN_6B_P_2) },
3494 { "(bad)", { XX } },
3497 /* PREFIX_VEX_6C */
3499 { "(bad)", { XX } },
3500 { "(bad)", { XX } },
3501 { VEX_LEN_TABLE (VEX_LEN_6C_P_2) },
3502 { "(bad)", { XX } },
3505 /* PREFIX_VEX_6D */
3507 { "(bad)", { XX } },
3508 { "(bad)", { XX } },
3509 { VEX_LEN_TABLE (VEX_LEN_6D_P_2) },
3510 { "(bad)", { XX } },
3513 /* PREFIX_VEX_6E */
3515 { "(bad)", { XX } },
3516 { "(bad)", { XX } },
3517 { VEX_LEN_TABLE (VEX_LEN_6E_P_2) },
3518 { "(bad)", { XX } },
3521 /* PREFIX_VEX_6F */
3523 { "(bad)", { XX } },
3524 { "vmovdqu", { XM, EXx } },
3525 { "vmovdqa", { XM, EXx } },
3526 { "(bad)", { XX } },
3529 /* PREFIX_VEX_70 */
3531 { "(bad)", { XX } },
3532 { VEX_LEN_TABLE (VEX_LEN_70_P_1) },
3533 { VEX_LEN_TABLE (VEX_LEN_70_P_2) },
3534 { VEX_LEN_TABLE (VEX_LEN_70_P_3) },
3537 /* PREFIX_VEX_71_REG_2 */
3539 { "(bad)", { XX } },
3540 { "(bad)", { XX } },
3541 { VEX_LEN_TABLE (VEX_LEN_71_R_2_P_2) },
3542 { "(bad)", { XX } },
3545 /* PREFIX_VEX_71_REG_4 */
3547 { "(bad)", { XX } },
3548 { "(bad)", { XX } },
3549 { VEX_LEN_TABLE (VEX_LEN_71_R_4_P_2) },
3550 { "(bad)", { XX } },
3553 /* PREFIX_VEX_71_REG_6 */
3555 { "(bad)", { XX } },
3556 { "(bad)", { XX } },
3557 { VEX_LEN_TABLE (VEX_LEN_71_R_6_P_2) },
3558 { "(bad)", { XX } },
3561 /* PREFIX_VEX_72_REG_2 */
3563 { "(bad)", { XX } },
3564 { "(bad)", { XX } },
3565 { VEX_LEN_TABLE (VEX_LEN_72_R_2_P_2) },
3566 { "(bad)", { XX } },
3569 /* PREFIX_VEX_72_REG_4 */
3571 { "(bad)", { XX } },
3572 { "(bad)", { XX } },
3573 { VEX_LEN_TABLE (VEX_LEN_72_R_4_P_2) },
3574 { "(bad)", { XX } },
3577 /* PREFIX_VEX_72_REG_6 */
3579 { "(bad)", { XX } },
3580 { "(bad)", { XX } },
3581 { VEX_LEN_TABLE (VEX_LEN_72_R_6_P_2) },
3582 { "(bad)", { XX } },
3585 /* PREFIX_VEX_73_REG_2 */
3587 { "(bad)", { XX } },
3588 { "(bad)", { XX } },
3589 { VEX_LEN_TABLE (VEX_LEN_73_R_2_P_2) },
3590 { "(bad)", { XX } },
3593 /* PREFIX_VEX_73_REG_3 */
3595 { "(bad)", { XX } },
3596 { "(bad)", { XX } },
3597 { VEX_LEN_TABLE (VEX_LEN_73_R_3_P_2) },
3598 { "(bad)", { XX } },
3601 /* PREFIX_VEX_73_REG_6 */
3603 { "(bad)", { XX } },
3604 { "(bad)", { XX } },
3605 { VEX_LEN_TABLE (VEX_LEN_73_R_6_P_2) },
3606 { "(bad)", { XX } },
3609 /* PREFIX_VEX_73_REG_7 */
3611 { "(bad)", { XX } },
3612 { "(bad)", { XX } },
3613 { VEX_LEN_TABLE (VEX_LEN_73_R_7_P_2) },
3614 { "(bad)", { XX } },
3617 /* PREFIX_VEX_74 */
3619 { "(bad)", { XX } },
3620 { "(bad)", { XX } },
3621 { VEX_LEN_TABLE (VEX_LEN_74_P_2) },
3622 { "(bad)", { XX } },
3625 /* PREFIX_VEX_75 */
3627 { "(bad)", { XX } },
3628 { "(bad)", { XX } },
3629 { VEX_LEN_TABLE (VEX_LEN_75_P_2) },
3630 { "(bad)", { XX } },
3633 /* PREFIX_VEX_76 */
3635 { "(bad)", { XX } },
3636 { "(bad)", { XX } },
3637 { VEX_LEN_TABLE (VEX_LEN_76_P_2) },
3638 { "(bad)", { XX } },
3641 /* PREFIX_VEX_77 */
3643 { "", { VZERO } },
3644 { "(bad)", { XX } },
3645 { "(bad)", { XX } },
3646 { "(bad)", { XX } },
3649 /* PREFIX_VEX_7C */
3651 { "(bad)", { XX } },
3652 { "(bad)", { XX } },
3653 { "vhaddpd", { XM, Vex, EXx } },
3654 { "vhaddps", { XM, Vex, EXx } },
3657 /* PREFIX_VEX_7D */
3659 { "(bad)", { XX } },
3660 { "(bad)", { XX } },
3661 { "vhsubpd", { XM, Vex, EXx } },
3662 { "vhsubps", { XM, Vex, EXx } },
3665 /* PREFIX_VEX_7E */
3667 { "(bad)", { XX } },
3668 { VEX_LEN_TABLE (VEX_LEN_7E_P_1) },
3669 { VEX_LEN_TABLE (VEX_LEN_7E_P_2) },
3670 { "(bad)", { XX } },
3673 /* PREFIX_VEX_7F */
3675 { "(bad)", { XX } },
3676 { "vmovdqu", { EXx, XM } },
3677 { "vmovdqa", { EXx, XM } },
3678 { "(bad)", { XX } },
3681 /* PREFIX_VEX_C2 */
3683 { "vcmpps", { XM, Vex, EXx, VCMP } },
3684 { VEX_LEN_TABLE (VEX_LEN_C2_P_1) },
3685 { "vcmppd", { XM, Vex, EXx, VCMP } },
3686 { VEX_LEN_TABLE (VEX_LEN_C2_P_3) },
3689 /* PREFIX_VEX_C4 */
3691 { "(bad)", { XX } },
3692 { "(bad)", { XX } },
3693 { VEX_LEN_TABLE (VEX_LEN_C4_P_2) },
3694 { "(bad)", { XX } },
3697 /* PREFIX_VEX_C5 */
3699 { "(bad)", { XX } },
3700 { "(bad)", { XX } },
3701 { VEX_LEN_TABLE (VEX_LEN_C5_P_2) },
3702 { "(bad)", { XX } },
3705 /* PREFIX_VEX_D0 */
3707 { "(bad)", { XX } },
3708 { "(bad)", { XX } },
3709 { "vaddsubpd", { XM, Vex, EXx } },
3710 { "vaddsubps", { XM, Vex, EXx } },
3713 /* PREFIX_VEX_D1 */
3715 { "(bad)", { XX } },
3716 { "(bad)", { XX } },
3717 { VEX_LEN_TABLE (VEX_LEN_D1_P_2) },
3718 { "(bad)", { XX } },
3721 /* PREFIX_VEX_D2 */
3723 { "(bad)", { XX } },
3724 { "(bad)", { XX } },
3725 { VEX_LEN_TABLE (VEX_LEN_D2_P_2) },
3726 { "(bad)", { XX } },
3729 /* PREFIX_VEX_D3 */
3731 { "(bad)", { XX } },
3732 { "(bad)", { XX } },
3733 { VEX_LEN_TABLE (VEX_LEN_D3_P_2) },
3734 { "(bad)", { XX } },
3737 /* PREFIX_VEX_D4 */
3739 { "(bad)", { XX } },
3740 { "(bad)", { XX } },
3741 { VEX_LEN_TABLE (VEX_LEN_D4_P_2) },
3742 { "(bad)", { XX } },
3745 /* PREFIX_VEX_D5 */
3747 { "(bad)", { XX } },
3748 { "(bad)", { XX } },
3749 { VEX_LEN_TABLE (VEX_LEN_D5_P_2) },
3750 { "(bad)", { XX } },
3753 /* PREFIX_VEX_D6 */
3755 { "(bad)", { XX } },
3756 { "(bad)", { XX } },
3757 { VEX_LEN_TABLE (VEX_LEN_D6_P_2) },
3758 { "(bad)", { XX } },
3761 /* PREFIX_VEX_D7 */
3763 { "(bad)", { XX } },
3764 { "(bad)", { XX } },
3765 { MOD_TABLE (MOD_VEX_D7_PREFIX_2) },
3766 { "(bad)", { XX } },
3769 /* PREFIX_VEX_D8 */
3771 { "(bad)", { XX } },
3772 { "(bad)", { XX } },
3773 { VEX_LEN_TABLE (VEX_LEN_D8_P_2) },
3774 { "(bad)", { XX } },
3777 /* PREFIX_VEX_D9 */
3779 { "(bad)", { XX } },
3780 { "(bad)", { XX } },
3781 { VEX_LEN_TABLE (VEX_LEN_D9_P_2) },
3782 { "(bad)", { XX } },
3785 /* PREFIX_VEX_DA */
3787 { "(bad)", { XX } },
3788 { "(bad)", { XX } },
3789 { VEX_LEN_TABLE (VEX_LEN_DA_P_2) },
3790 { "(bad)", { XX } },
3793 /* PREFIX_VEX_DB */
3795 { "(bad)", { XX } },
3796 { "(bad)", { XX } },
3797 { VEX_LEN_TABLE (VEX_LEN_DB_P_2) },
3798 { "(bad)", { XX } },
3801 /* PREFIX_VEX_DC */
3803 { "(bad)", { XX } },
3804 { "(bad)", { XX } },
3805 { VEX_LEN_TABLE (VEX_LEN_DC_P_2) },
3806 { "(bad)", { XX } },
3809 /* PREFIX_VEX_DD */
3811 { "(bad)", { XX } },
3812 { "(bad)", { XX } },
3813 { VEX_LEN_TABLE (VEX_LEN_DD_P_2) },
3814 { "(bad)", { XX } },
3817 /* PREFIX_VEX_DE */
3819 { "(bad)", { XX } },
3820 { "(bad)", { XX } },
3821 { VEX_LEN_TABLE (VEX_LEN_DE_P_2) },
3822 { "(bad)", { XX } },
3825 /* PREFIX_VEX_DF */
3827 { "(bad)", { XX } },
3828 { "(bad)", { XX } },
3829 { VEX_LEN_TABLE (VEX_LEN_DF_P_2) },
3830 { "(bad)", { XX } },
3833 /* PREFIX_VEX_E0 */
3835 { "(bad)", { XX } },
3836 { "(bad)", { XX } },
3837 { VEX_LEN_TABLE (VEX_LEN_E0_P_2) },
3838 { "(bad)", { XX } },
3841 /* PREFIX_VEX_E1 */
3843 { "(bad)", { XX } },
3844 { "(bad)", { XX } },
3845 { VEX_LEN_TABLE (VEX_LEN_E1_P_2) },
3846 { "(bad)", { XX } },
3849 /* PREFIX_VEX_E2 */
3851 { "(bad)", { XX } },
3852 { "(bad)", { XX } },
3853 { VEX_LEN_TABLE (VEX_LEN_E2_P_2) },
3854 { "(bad)", { XX } },
3857 /* PREFIX_VEX_E3 */
3859 { "(bad)", { XX } },
3860 { "(bad)", { XX } },
3861 { VEX_LEN_TABLE (VEX_LEN_E3_P_2) },
3862 { "(bad)", { XX } },
3865 /* PREFIX_VEX_E4 */
3867 { "(bad)", { XX } },
3868 { "(bad)", { XX } },
3869 { VEX_LEN_TABLE (VEX_LEN_E4_P_2) },
3870 { "(bad)", { XX } },
3873 /* PREFIX_VEX_E5 */
3875 { "(bad)", { XX } },
3876 { "(bad)", { XX } },
3877 { VEX_LEN_TABLE (VEX_LEN_E5_P_2) },
3878 { "(bad)", { XX } },
3881 /* PREFIX_VEX_E6 */
3883 { "(bad)", { XX } },
3884 { "vcvtdq2pd", { XM, EXxmmq } },
3885 { "vcvttpd2dq%XY", { XMM, EXx } },
3886 { "vcvtpd2dq%XY", { XMM, EXx } },
3889 /* PREFIX_VEX_E7 */
3891 { "(bad)", { XX } },
3892 { "(bad)", { XX } },
3893 { MOD_TABLE (MOD_VEX_E7_PREFIX_2) },
3894 { "(bad)", { XX } },
3897 /* PREFIX_VEX_E8 */
3899 { "(bad)", { XX } },
3900 { "(bad)", { XX } },
3901 { VEX_LEN_TABLE (VEX_LEN_E8_P_2) },
3902 { "(bad)", { XX } },
3905 /* PREFIX_VEX_E9 */
3907 { "(bad)", { XX } },
3908 { "(bad)", { XX } },
3909 { VEX_LEN_TABLE (VEX_LEN_E9_P_2) },
3910 { "(bad)", { XX } },
3913 /* PREFIX_VEX_EA */
3915 { "(bad)", { XX } },
3916 { "(bad)", { XX } },
3917 { VEX_LEN_TABLE (VEX_LEN_EA_P_2) },
3918 { "(bad)", { XX } },
3921 /* PREFIX_VEX_EB */
3923 { "(bad)", { XX } },
3924 { "(bad)", { XX } },
3925 { VEX_LEN_TABLE (VEX_LEN_EB_P_2) },
3926 { "(bad)", { XX } },
3929 /* PREFIX_VEX_EC */
3931 { "(bad)", { XX } },
3932 { "(bad)", { XX } },
3933 { VEX_LEN_TABLE (VEX_LEN_EC_P_2) },
3934 { "(bad)", { XX } },
3937 /* PREFIX_VEX_ED */
3939 { "(bad)", { XX } },
3940 { "(bad)", { XX } },
3941 { VEX_LEN_TABLE (VEX_LEN_ED_P_2) },
3942 { "(bad)", { XX } },
3945 /* PREFIX_VEX_EE */
3947 { "(bad)", { XX } },
3948 { "(bad)", { XX } },
3949 { VEX_LEN_TABLE (VEX_LEN_EE_P_2) },
3950 { "(bad)", { XX } },
3953 /* PREFIX_VEX_EF */
3955 { "(bad)", { XX } },
3956 { "(bad)", { XX } },
3957 { VEX_LEN_TABLE (VEX_LEN_EF_P_2) },
3958 { "(bad)", { XX } },
3961 /* PREFIX_VEX_F0 */
3963 { "(bad)", { XX } },
3964 { "(bad)", { XX } },
3965 { "(bad)", { XX } },
3966 { MOD_TABLE (MOD_VEX_F0_PREFIX_3) },
3969 /* PREFIX_VEX_F1 */
3971 { "(bad)", { XX } },
3972 { "(bad)", { XX } },
3973 { VEX_LEN_TABLE (VEX_LEN_F1_P_2) },
3974 { "(bad)", { XX } },
3977 /* PREFIX_VEX_F2 */
3979 { "(bad)", { XX } },
3980 { "(bad)", { XX } },
3981 { VEX_LEN_TABLE (VEX_LEN_F2_P_2) },
3982 { "(bad)", { XX } },
3985 /* PREFIX_VEX_F3 */
3987 { "(bad)", { XX } },
3988 { "(bad)", { XX } },
3989 { VEX_LEN_TABLE (VEX_LEN_F3_P_2) },
3990 { "(bad)", { XX } },
3993 /* PREFIX_VEX_F4 */
3995 { "(bad)", { XX } },
3996 { "(bad)", { XX } },
3997 { VEX_LEN_TABLE (VEX_LEN_F4_P_2) },
3998 { "(bad)", { XX } },
4001 /* PREFIX_VEX_F5 */
4003 { "(bad)", { XX } },
4004 { "(bad)", { XX } },
4005 { VEX_LEN_TABLE (VEX_LEN_F5_P_2) },
4006 { "(bad)", { XX } },
4009 /* PREFIX_VEX_F6 */
4011 { "(bad)", { XX } },
4012 { "(bad)", { XX } },
4013 { VEX_LEN_TABLE (VEX_LEN_F6_P_2) },
4014 { "(bad)", { XX } },
4017 /* PREFIX_VEX_F7 */
4019 { "(bad)", { XX } },
4020 { "(bad)", { XX } },
4021 { VEX_LEN_TABLE (VEX_LEN_F7_P_2) },
4022 { "(bad)", { XX } },
4025 /* PREFIX_VEX_F8 */
4027 { "(bad)", { XX } },
4028 { "(bad)", { XX } },
4029 { VEX_LEN_TABLE (VEX_LEN_F8_P_2) },
4030 { "(bad)", { XX } },
4033 /* PREFIX_VEX_F9 */
4035 { "(bad)", { XX } },
4036 { "(bad)", { XX } },
4037 { VEX_LEN_TABLE (VEX_LEN_F9_P_2) },
4038 { "(bad)", { XX } },
4041 /* PREFIX_VEX_FA */
4043 { "(bad)", { XX } },
4044 { "(bad)", { XX } },
4045 { VEX_LEN_TABLE (VEX_LEN_FA_P_2) },
4046 { "(bad)", { XX } },
4049 /* PREFIX_VEX_FB */
4051 { "(bad)", { XX } },
4052 { "(bad)", { XX } },
4053 { VEX_LEN_TABLE (VEX_LEN_FB_P_2) },
4054 { "(bad)", { XX } },
4057 /* PREFIX_VEX_FC */
4059 { "(bad)", { XX } },
4060 { "(bad)", { XX } },
4061 { VEX_LEN_TABLE (VEX_LEN_FC_P_2) },
4062 { "(bad)", { XX } },
4065 /* PREFIX_VEX_FD */
4067 { "(bad)", { XX } },
4068 { "(bad)", { XX } },
4069 { VEX_LEN_TABLE (VEX_LEN_FD_P_2) },
4070 { "(bad)", { XX } },
4073 /* PREFIX_VEX_FE */
4075 { "(bad)", { XX } },
4076 { "(bad)", { XX } },
4077 { VEX_LEN_TABLE (VEX_LEN_FE_P_2) },
4078 { "(bad)", { XX } },
4081 /* PREFIX_VEX_3800 */
4083 { "(bad)", { XX } },
4084 { "(bad)", { XX } },
4085 { VEX_LEN_TABLE (VEX_LEN_3800_P_2) },
4086 { "(bad)", { XX } },
4089 /* PREFIX_VEX_3801 */
4091 { "(bad)", { XX } },
4092 { "(bad)", { XX } },
4093 { VEX_LEN_TABLE (VEX_LEN_3801_P_2) },
4094 { "(bad)", { XX } },
4097 /* PREFIX_VEX_3802 */
4099 { "(bad)", { XX } },
4100 { "(bad)", { XX } },
4101 { VEX_LEN_TABLE (VEX_LEN_3802_P_2) },
4102 { "(bad)", { XX } },
4105 /* PREFIX_VEX_3803 */
4107 { "(bad)", { XX } },
4108 { "(bad)", { XX } },
4109 { VEX_LEN_TABLE (VEX_LEN_3803_P_2) },
4110 { "(bad)", { XX } },
4113 /* PREFIX_VEX_3804 */
4115 { "(bad)", { XX } },
4116 { "(bad)", { XX } },
4117 { VEX_LEN_TABLE (VEX_LEN_3804_P_2) },
4118 { "(bad)", { XX } },
4121 /* PREFIX_VEX_3805 */
4123 { "(bad)", { XX } },
4124 { "(bad)", { XX } },
4125 { VEX_LEN_TABLE (VEX_LEN_3805_P_2) },
4126 { "(bad)", { XX } },
4129 /* PREFIX_VEX_3806 */
4131 { "(bad)", { XX } },
4132 { "(bad)", { XX } },
4133 { VEX_LEN_TABLE (VEX_LEN_3806_P_2) },
4134 { "(bad)", { XX } },
4137 /* PREFIX_VEX_3807 */
4139 { "(bad)", { XX } },
4140 { "(bad)", { XX } },
4141 { VEX_LEN_TABLE (VEX_LEN_3807_P_2) },
4142 { "(bad)", { XX } },
4145 /* PREFIX_VEX_3808 */
4147 { "(bad)", { XX } },
4148 { "(bad)", { XX } },
4149 { VEX_LEN_TABLE (VEX_LEN_3808_P_2) },
4150 { "(bad)", { XX } },
4153 /* PREFIX_VEX_3809 */
4155 { "(bad)", { XX } },
4156 { "(bad)", { XX } },
4157 { VEX_LEN_TABLE (VEX_LEN_3809_P_2) },
4158 { "(bad)", { XX } },
4161 /* PREFIX_VEX_380A */
4163 { "(bad)", { XX } },
4164 { "(bad)", { XX } },
4165 { VEX_LEN_TABLE (VEX_LEN_380A_P_2) },
4166 { "(bad)", { XX } },
4169 /* PREFIX_VEX_380B */
4171 { "(bad)", { XX } },
4172 { "(bad)", { XX } },
4173 { VEX_LEN_TABLE (VEX_LEN_380B_P_2) },
4174 { "(bad)", { XX } },
4177 /* PREFIX_VEX_380C */
4179 { "(bad)", { XX } },
4180 { "(bad)", { XX } },
4181 { "vpermilps", { XM, Vex, EXx } },
4182 { "(bad)", { XX } },
4185 /* PREFIX_VEX_380D */
4187 { "(bad)", { XX } },
4188 { "(bad)", { XX } },
4189 { "vpermilpd", { XM, Vex, EXx } },
4190 { "(bad)", { XX } },
4193 /* PREFIX_VEX_380E */
4195 { "(bad)", { XX } },
4196 { "(bad)", { XX } },
4197 { "vtestps", { XM, EXx } },
4198 { "(bad)", { XX } },
4201 /* PREFIX_VEX_380F */
4203 { "(bad)", { XX } },
4204 { "(bad)", { XX } },
4205 { "vtestpd", { XM, EXx } },
4206 { "(bad)", { XX } },
4209 /* PREFIX_VEX_3817 */
4211 { "(bad)", { XX } },
4212 { "(bad)", { XX } },
4213 { "vptest", { XM, EXx } },
4214 { "(bad)", { XX } },
4217 /* PREFIX_VEX_3818 */
4219 { "(bad)", { XX } },
4220 { "(bad)", { XX } },
4221 { MOD_TABLE (MOD_VEX_3818_PREFIX_2) },
4222 { "(bad)", { XX } },
4225 /* PREFIX_VEX_3819 */
4227 { "(bad)", { XX } },
4228 { "(bad)", { XX } },
4229 { MOD_TABLE (MOD_VEX_3819_PREFIX_2) },
4230 { "(bad)", { XX } },
4233 /* PREFIX_VEX_381A */
4235 { "(bad)", { XX } },
4236 { "(bad)", { XX } },
4237 { MOD_TABLE (MOD_VEX_381A_PREFIX_2) },
4238 { "(bad)", { XX } },
4241 /* PREFIX_VEX_381C */
4243 { "(bad)", { XX } },
4244 { "(bad)", { XX } },
4245 { VEX_LEN_TABLE (VEX_LEN_381C_P_2) },
4246 { "(bad)", { XX } },
4249 /* PREFIX_VEX_381D */
4251 { "(bad)", { XX } },
4252 { "(bad)", { XX } },
4253 { VEX_LEN_TABLE (VEX_LEN_381D_P_2) },
4254 { "(bad)", { XX } },
4257 /* PREFIX_VEX_381E */
4259 { "(bad)", { XX } },
4260 { "(bad)", { XX } },
4261 { VEX_LEN_TABLE (VEX_LEN_381E_P_2) },
4262 { "(bad)", { XX } },
4265 /* PREFIX_VEX_3820 */
4267 { "(bad)", { XX } },
4268 { "(bad)", { XX } },
4269 { VEX_LEN_TABLE (VEX_LEN_3820_P_2) },
4270 { "(bad)", { XX } },
4273 /* PREFIX_VEX_3821 */
4275 { "(bad)", { XX } },
4276 { "(bad)", { XX } },
4277 { VEX_LEN_TABLE (VEX_LEN_3821_P_2) },
4278 { "(bad)", { XX } },
4281 /* PREFIX_VEX_3822 */
4283 { "(bad)", { XX } },
4284 { "(bad)", { XX } },
4285 { VEX_LEN_TABLE (VEX_LEN_3822_P_2) },
4286 { "(bad)", { XX } },
4289 /* PREFIX_VEX_3823 */
4291 { "(bad)", { XX } },
4292 { "(bad)", { XX } },
4293 { VEX_LEN_TABLE (VEX_LEN_3823_P_2) },
4294 { "(bad)", { XX } },
4297 /* PREFIX_VEX_3824 */
4299 { "(bad)", { XX } },
4300 { "(bad)", { XX } },
4301 { VEX_LEN_TABLE (VEX_LEN_3824_P_2) },
4302 { "(bad)", { XX } },
4305 /* PREFIX_VEX_3825 */
4307 { "(bad)", { XX } },
4308 { "(bad)", { XX } },
4309 { VEX_LEN_TABLE (VEX_LEN_3825_P_2) },
4310 { "(bad)", { XX } },
4313 /* PREFIX_VEX_3828 */
4315 { "(bad)", { XX } },
4316 { "(bad)", { XX } },
4317 { VEX_LEN_TABLE (VEX_LEN_3828_P_2) },
4318 { "(bad)", { XX } },
4321 /* PREFIX_VEX_3829 */
4323 { "(bad)", { XX } },
4324 { "(bad)", { XX } },
4325 { VEX_LEN_TABLE (VEX_LEN_3829_P_2) },
4326 { "(bad)", { XX } },
4329 /* PREFIX_VEX_382A */
4331 { "(bad)", { XX } },
4332 { "(bad)", { XX } },
4333 { MOD_TABLE (MOD_VEX_382A_PREFIX_2) },
4334 { "(bad)", { XX } },
4337 /* PREFIX_VEX_382B */
4339 { "(bad)", { XX } },
4340 { "(bad)", { XX } },
4341 { VEX_LEN_TABLE (VEX_LEN_382B_P_2) },
4342 { "(bad)", { XX } },
4345 /* PREFIX_VEX_382C */
4347 { "(bad)", { XX } },
4348 { "(bad)", { XX } },
4349 { MOD_TABLE (MOD_VEX_382C_PREFIX_2) },
4350 { "(bad)", { XX } },
4353 /* PREFIX_VEX_382D */
4355 { "(bad)", { XX } },
4356 { "(bad)", { XX } },
4357 { MOD_TABLE (MOD_VEX_382D_PREFIX_2) },
4358 { "(bad)", { XX } },
4361 /* PREFIX_VEX_382E */
4363 { "(bad)", { XX } },
4364 { "(bad)", { XX } },
4365 { MOD_TABLE (MOD_VEX_382E_PREFIX_2) },
4366 { "(bad)", { XX } },
4369 /* PREFIX_VEX_382F */
4371 { "(bad)", { XX } },
4372 { "(bad)", { XX } },
4373 { MOD_TABLE (MOD_VEX_382F_PREFIX_2) },
4374 { "(bad)", { XX } },
4377 /* PREFIX_VEX_3830 */
4379 { "(bad)", { XX } },
4380 { "(bad)", { XX } },
4381 { VEX_LEN_TABLE (VEX_LEN_3830_P_2) },
4382 { "(bad)", { XX } },
4385 /* PREFIX_VEX_3831 */
4387 { "(bad)", { XX } },
4388 { "(bad)", { XX } },
4389 { VEX_LEN_TABLE (VEX_LEN_3831_P_2) },
4390 { "(bad)", { XX } },
4393 /* PREFIX_VEX_3832 */
4395 { "(bad)", { XX } },
4396 { "(bad)", { XX } },
4397 { VEX_LEN_TABLE (VEX_LEN_3832_P_2) },
4398 { "(bad)", { XX } },
4401 /* PREFIX_VEX_3833 */
4403 { "(bad)", { XX } },
4404 { "(bad)", { XX } },
4405 { VEX_LEN_TABLE (VEX_LEN_3833_P_2) },
4406 { "(bad)", { XX } },
4409 /* PREFIX_VEX_3834 */
4411 { "(bad)", { XX } },
4412 { "(bad)", { XX } },
4413 { VEX_LEN_TABLE (VEX_LEN_3834_P_2) },
4414 { "(bad)", { XX } },
4417 /* PREFIX_VEX_3835 */
4419 { "(bad)", { XX } },
4420 { "(bad)", { XX } },
4421 { VEX_LEN_TABLE (VEX_LEN_3835_P_2) },
4422 { "(bad)", { XX } },
4425 /* PREFIX_VEX_3837 */
4427 { "(bad)", { XX } },
4428 { "(bad)", { XX } },
4429 { VEX_LEN_TABLE (VEX_LEN_3837_P_2) },
4430 { "(bad)", { XX } },
4433 /* PREFIX_VEX_3838 */
4435 { "(bad)", { XX } },
4436 { "(bad)", { XX } },
4437 { VEX_LEN_TABLE (VEX_LEN_3838_P_2) },
4438 { "(bad)", { XX } },
4441 /* PREFIX_VEX_3839 */
4443 { "(bad)", { XX } },
4444 { "(bad)", { XX } },
4445 { VEX_LEN_TABLE (VEX_LEN_3839_P_2) },
4446 { "(bad)", { XX } },
4449 /* PREFIX_VEX_383A */
4451 { "(bad)", { XX } },
4452 { "(bad)", { XX } },
4453 { VEX_LEN_TABLE (VEX_LEN_383A_P_2) },
4454 { "(bad)", { XX } },
4457 /* PREFIX_VEX_383B */
4459 { "(bad)", { XX } },
4460 { "(bad)", { XX } },
4461 { VEX_LEN_TABLE (VEX_LEN_383B_P_2) },
4462 { "(bad)", { XX } },
4465 /* PREFIX_VEX_383C */
4467 { "(bad)", { XX } },
4468 { "(bad)", { XX } },
4469 { VEX_LEN_TABLE (VEX_LEN_383C_P_2) },
4470 { "(bad)", { XX } },
4473 /* PREFIX_VEX_383D */
4475 { "(bad)", { XX } },
4476 { "(bad)", { XX } },
4477 { VEX_LEN_TABLE (VEX_LEN_383D_P_2) },
4478 { "(bad)", { XX } },
4481 /* PREFIX_VEX_383E */
4483 { "(bad)", { XX } },
4484 { "(bad)", { XX } },
4485 { VEX_LEN_TABLE (VEX_LEN_383E_P_2) },
4486 { "(bad)", { XX } },
4489 /* PREFIX_VEX_383F */
4491 { "(bad)", { XX } },
4492 { "(bad)", { XX } },
4493 { VEX_LEN_TABLE (VEX_LEN_383F_P_2) },
4494 { "(bad)", { XX } },
4497 /* PREFIX_VEX_3840 */
4499 { "(bad)", { XX } },
4500 { "(bad)", { XX } },
4501 { VEX_LEN_TABLE (VEX_LEN_3840_P_2) },
4502 { "(bad)", { XX } },
4505 /* PREFIX_VEX_3841 */
4507 { "(bad)", { XX } },
4508 { "(bad)", { XX } },
4509 { VEX_LEN_TABLE (VEX_LEN_3841_P_2) },
4510 { "(bad)", { XX } },
4513 /* PREFIX_VEX_3A04 */
4515 { "(bad)", { XX } },
4516 { "(bad)", { XX } },
4517 { "vpermilps", { XM, EXx, Ib } },
4518 { "(bad)", { XX } },
4521 /* PREFIX_VEX_3A05 */
4523 { "(bad)", { XX } },
4524 { "(bad)", { XX } },
4525 { "vpermilpd", { XM, EXx, Ib } },
4526 { "(bad)", { XX } },
4529 /* PREFIX_VEX_3A06 */
4531 { "(bad)", { XX } },
4532 { "(bad)", { XX } },
4533 { VEX_LEN_TABLE (VEX_LEN_3A06_P_2) },
4534 { "(bad)", { XX } },
4537 /* PREFIX_VEX_3A08 */
4539 { "(bad)", { XX } },
4540 { "(bad)", { XX } },
4541 { "vroundps", { XM, EXx, Ib } },
4542 { "(bad)", { XX } },
4545 /* PREFIX_VEX_3A09 */
4547 { "(bad)", { XX } },
4548 { "(bad)", { XX } },
4549 { "vroundpd", { XM, EXx, Ib } },
4550 { "(bad)", { XX } },
4553 /* PREFIX_VEX_3A0A */
4555 { "(bad)", { XX } },
4556 { "(bad)", { XX } },
4557 { VEX_LEN_TABLE (VEX_LEN_3A0A_P_2) },
4558 { "(bad)", { XX } },
4561 /* PREFIX_VEX_3A0B */
4563 { "(bad)", { XX } },
4564 { "(bad)", { XX } },
4565 { VEX_LEN_TABLE (VEX_LEN_3A0B_P_2) },
4566 { "(bad)", { XX } },
4569 /* PREFIX_VEX_3A0C */
4571 { "(bad)", { XX } },
4572 { "(bad)", { XX } },
4573 { "vblendps", { XM, Vex, EXx, Ib } },
4574 { "(bad)", { XX } },
4577 /* PREFIX_VEX_3A0D */
4579 { "(bad)", { XX } },
4580 { "(bad)", { XX } },
4581 { "vblendpd", { XM, Vex, EXx, Ib } },
4582 { "(bad)", { XX } },
4585 /* PREFIX_VEX_3A0E */
4587 { "(bad)", { XX } },
4588 { "(bad)", { XX } },
4589 { VEX_LEN_TABLE (VEX_LEN_3A0E_P_2) },
4590 { "(bad)", { XX } },
4593 /* PREFIX_VEX_3A0F */
4595 { "(bad)", { XX } },
4596 { "(bad)", { XX } },
4597 { VEX_LEN_TABLE (VEX_LEN_3A0F_P_2) },
4598 { "(bad)", { XX } },
4601 /* PREFIX_VEX_3A14 */
4603 { "(bad)", { XX } },
4604 { "(bad)", { XX } },
4605 { VEX_LEN_TABLE (VEX_LEN_3A14_P_2) },
4606 { "(bad)", { XX } },
4609 /* PREFIX_VEX_3A15 */
4611 { "(bad)", { XX } },
4612 { "(bad)", { XX } },
4613 { VEX_LEN_TABLE (VEX_LEN_3A15_P_2) },
4614 { "(bad)", { XX } },
4617 /* PREFIX_VEX_3A16 */
4619 { "(bad)", { XX } },
4620 { "(bad)", { XX } },
4621 { VEX_LEN_TABLE (VEX_LEN_3A16_P_2) },
4622 { "(bad)", { XX } },
4625 /* PREFIX_VEX_3A17 */
4627 { "(bad)", { XX } },
4628 { "(bad)", { XX } },
4629 { VEX_LEN_TABLE (VEX_LEN_3A17_P_2) },
4630 { "(bad)", { XX } },
4633 /* PREFIX_VEX_3A18 */
4635 { "(bad)", { XX } },
4636 { "(bad)", { XX } },
4637 { VEX_LEN_TABLE (VEX_LEN_3A18_P_2) },
4638 { "(bad)", { XX } },
4641 /* PREFIX_VEX_3A19 */
4643 { "(bad)", { XX } },
4644 { "(bad)", { XX } },
4645 { VEX_LEN_TABLE (VEX_LEN_3A19_P_2) },
4646 { "(bad)", { XX } },
4649 /* PREFIX_VEX_3A20 */
4651 { "(bad)", { XX } },
4652 { "(bad)", { XX } },
4653 { VEX_LEN_TABLE (VEX_LEN_3A20_P_2) },
4654 { "(bad)", { XX } },
4657 /* PREFIX_VEX_3A21 */
4659 { "(bad)", { XX } },
4660 { "(bad)", { XX } },
4661 { VEX_LEN_TABLE (VEX_LEN_3A21_P_2) },
4662 { "(bad)", { XX } },
4665 /* PREFIX_VEX_3A22 */
4667 { "(bad)", { XX } },
4668 { "(bad)", { XX } },
4669 { VEX_LEN_TABLE (VEX_LEN_3A22_P_2) },
4670 { "(bad)", { XX } },
4673 /* PREFIX_VEX_3A40 */
4675 { "(bad)", { XX } },
4676 { "(bad)", { XX } },
4677 { "vdpps", { XM, Vex, EXx, Ib } },
4678 { "(bad)", { XX } },
4681 /* PREFIX_VEX_3A41 */
4683 { "(bad)", { XX } },
4684 { "(bad)", { XX } },
4685 { VEX_LEN_TABLE (VEX_LEN_3A41_P_2) },
4686 { "(bad)", { XX } },
4689 /* PREFIX_VEX_3A42 */
4691 { "(bad)", { XX } },
4692 { "(bad)", { XX } },
4693 { VEX_LEN_TABLE (VEX_LEN_3A42_P_2) },
4694 { "(bad)", { XX } },
4697 /* PREFIX_VEX_3A48 */
4699 { "(bad)", { XX } },
4700 { "(bad)", { XX } },
4701 { "vpermil2ps", { XMVexW, Vex, EXVexW, EXVexW, VPERMIL2 } },
4702 { "(bad)", { XX } },
4705 /* PREFIX_VEX_3A49 */
4707 { "(bad)", { XX } },
4708 { "(bad)", { XX } },
4709 { "vpermil2pd", { XMVexW, Vex, EXVexW, EXVexW, VPERMIL2 } },
4710 { "(bad)", { XX } },
4713 /* PREFIX_VEX_3A4A */
4715 { "(bad)", { XX } },
4716 { "(bad)", { XX } },
4717 { "vblendvps", { XM, Vex, EXx, XMVexI4 } },
4718 { "(bad)", { XX } },
4721 /* PREFIX_VEX_3A4B */
4723 { "(bad)", { XX } },
4724 { "(bad)", { XX } },
4725 { "vblendvpd", { XM, Vex, EXx, XMVexI4 } },
4726 { "(bad)", { XX } },
4729 /* PREFIX_VEX_3A4C */
4731 { "(bad)", { XX } },
4732 { "(bad)", { XX } },
4733 { VEX_LEN_TABLE (VEX_LEN_3A4C_P_2) },
4734 { "(bad)", { XX } },
4737 /* PREFIX_VEX_3A5C */
4739 { "(bad)", { XX } },
4740 { "(bad)", { XX } },
4741 { "vfmaddsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
4742 { "(bad)", { XX } },
4745 /* PREFIX_VEX_3A5D */
4747 { "(bad)", { XX } },
4748 { "(bad)", { XX } },
4749 { "vfmaddsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
4750 { "(bad)", { XX } },
4753 /* PREFIX_VEX_3A5E */
4755 { "(bad)", { XX } },
4756 { "(bad)", { XX } },
4757 { "vfmsubaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
4758 { "(bad)", { XX } },
4761 /* PREFIX_VEX_3A5F */
4763 { "(bad)", { XX } },
4764 { "(bad)", { XX } },
4765 { "vfmsubaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
4766 { "(bad)", { XX } },
4769 /* PREFIX_VEX_3A60 */
4771 { "(bad)", { XX } },
4772 { "(bad)", { XX } },
4773 { VEX_LEN_TABLE (VEX_LEN_3A60_P_2) },
4774 { "(bad)", { XX } },
4777 /* PREFIX_VEX_3A61 */
4779 { "(bad)", { XX } },
4780 { "(bad)", { XX } },
4781 { VEX_LEN_TABLE (VEX_LEN_3A61_P_2) },
4782 { "(bad)", { XX } },
4785 /* PREFIX_VEX_3A62 */
4787 { "(bad)", { XX } },
4788 { "(bad)", { XX } },
4789 { VEX_LEN_TABLE (VEX_LEN_3A62_P_2) },
4790 { "(bad)", { XX } },
4793 /* PREFIX_VEX_3A63 */
4795 { "(bad)", { XX } },
4796 { "(bad)", { XX } },
4797 { VEX_LEN_TABLE (VEX_LEN_3A63_P_2) },
4798 { "(bad)", { XX } },
4801 /* PREFIX_VEX_3A68 */
4803 { "(bad)", { XX } },
4804 { "(bad)", { XX } },
4805 { "vfmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
4806 { "(bad)", { XX } },
4809 /* PREFIX_VEX_3A69 */
4811 { "(bad)", { XX } },
4812 { "(bad)", { XX } },
4813 { "vfmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
4814 { "(bad)", { XX } },
4817 /* PREFIX_VEX_3A6A */
4819 { "(bad)", { XX } },
4820 { "(bad)", { XX } },
4821 { VEX_LEN_TABLE (VEX_LEN_3A6A_P_2) },
4822 { "(bad)", { XX } },
4825 /* PREFIX_VEX_3A6B */
4827 { "(bad)", { XX } },
4828 { "(bad)", { XX } },
4829 { VEX_LEN_TABLE (VEX_LEN_3A6B_P_2) },
4830 { "(bad)", { XX } },
4833 /* PREFIX_VEX_3A6C */
4835 { "(bad)", { XX } },
4836 { "(bad)", { XX } },
4837 { "vfmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
4838 { "(bad)", { XX } },
4841 /* PREFIX_VEX_3A6D */
4843 { "(bad)", { XX } },
4844 { "(bad)", { XX } },
4845 { "vfmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
4846 { "(bad)", { XX } },
4849 /* PREFIX_VEX_3A6E */
4851 { "(bad)", { XX } },
4852 { "(bad)", { XX } },
4853 { VEX_LEN_TABLE (VEX_LEN_3A6E_P_2) },
4854 { "(bad)", { XX } },
4857 /* PREFIX_VEX_3A6F */
4859 { "(bad)", { XX } },
4860 { "(bad)", { XX } },
4861 { VEX_LEN_TABLE (VEX_LEN_3A6F_P_2) },
4862 { "(bad)", { XX } },
4865 /* PREFIX_VEX_3A78 */
4867 { "(bad)", { XX } },
4868 { "(bad)", { XX } },
4869 { "vfnmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
4870 { "(bad)", { XX } },
4873 /* PREFIX_VEX_3A79 */
4875 { "(bad)", { XX } },
4876 { "(bad)", { XX } },
4877 { "vfnmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
4878 { "(bad)", { XX } },
4881 /* PREFIX_VEX_3A7A */
4883 { "(bad)", { XX } },
4884 { "(bad)", { XX } },
4885 { VEX_LEN_TABLE (VEX_LEN_3A7A_P_2) },
4886 { "(bad)", { XX } },
4889 /* PREFIX_VEX_3A7B */
4891 { "(bad)", { XX } },
4892 { "(bad)", { XX } },
4893 { VEX_LEN_TABLE (VEX_LEN_3A7B_P_2) },
4894 { "(bad)", { XX } },
4897 /* PREFIX_VEX_3A7C */
4899 { "(bad)", { XX } },
4900 { "(bad)", { XX } },
4901 { "vfnmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
4902 { "(bad)", { XX } },
4905 /* PREFIX_VEX_3A7D */
4907 { "(bad)", { XX } },
4908 { "(bad)", { XX } },
4909 { "vfnmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
4910 { "(bad)", { XX } },
4913 /* PREFIX_VEX_3A7E */
4915 { "(bad)", { XX } },
4916 { "(bad)", { XX } },
4917 { VEX_LEN_TABLE (VEX_LEN_3A7E_P_2) },
4918 { "(bad)", { XX } },
4921 /* PREFIX_VEX_3A7F */
4923 { "(bad)", { XX } },
4924 { "(bad)", { XX } },
4925 { VEX_LEN_TABLE (VEX_LEN_3A7F_P_2) },
4926 { "(bad)", { XX } },
4930 static const struct dis386 x86_64_table[][2] = {
4931 /* X86_64_06 */
4933 { "push{T|}", { es } },
4934 { "(bad)", { XX } },
4937 /* X86_64_07 */
4939 { "pop{T|}", { es } },
4940 { "(bad)", { XX } },
4943 /* X86_64_0D */
4945 { "push{T|}", { cs } },
4946 { "(bad)", { XX } },
4949 /* X86_64_16 */
4951 { "push{T|}", { ss } },
4952 { "(bad)", { XX } },
4955 /* X86_64_17 */
4957 { "pop{T|}", { ss } },
4958 { "(bad)", { XX } },
4961 /* X86_64_1E */
4963 { "push{T|}", { ds } },
4964 { "(bad)", { XX } },
4967 /* X86_64_1F */
4969 { "pop{T|}", { ds } },
4970 { "(bad)", { XX } },
4973 /* X86_64_27 */
4975 { "daa", { XX } },
4976 { "(bad)", { XX } },
4979 /* X86_64_2F */
4981 { "das", { XX } },
4982 { "(bad)", { XX } },
4985 /* X86_64_37 */
4987 { "aaa", { XX } },
4988 { "(bad)", { XX } },
4991 /* X86_64_3F */
4993 { "aas", { XX } },
4994 { "(bad)", { XX } },
4997 /* X86_64_60 */
4999 { "pusha{P|}", { XX } },
5000 { "(bad)", { XX } },
5003 /* X86_64_61 */
5005 { "popa{P|}", { XX } },
5006 { "(bad)", { XX } },
5009 /* X86_64_62 */
5011 { MOD_TABLE (MOD_62_32BIT) },
5012 { "(bad)", { XX } },
5015 /* X86_64_63 */
5017 { "arpl", { Ew, Gw } },
5018 { "movs{lq|xd}", { Gv, Ed } },
5021 /* X86_64_6D */
5023 { "ins{R|}", { Yzr, indirDX } },
5024 { "ins{G|}", { Yzr, indirDX } },
5027 /* X86_64_6F */
5029 { "outs{R|}", { indirDXr, Xz } },
5030 { "outs{G|}", { indirDXr, Xz } },
5033 /* X86_64_9A */
5035 { "Jcall{T|}", { Ap } },
5036 { "(bad)", { XX } },
5039 /* X86_64_C4 */
5041 { MOD_TABLE (MOD_C4_32BIT) },
5042 { VEX_C4_TABLE (VEX_0F) },
5045 /* X86_64_C5 */
5047 { MOD_TABLE (MOD_C5_32BIT) },
5048 { VEX_C5_TABLE (VEX_0F) },
5051 /* X86_64_CE */
5053 { "into", { XX } },
5054 { "(bad)", { XX } },
5057 /* X86_64_D4 */
5059 { "aam", { sIb } },
5060 { "(bad)", { XX } },
5063 /* X86_64_D5 */
5065 { "aad", { sIb } },
5066 { "(bad)", { XX } },
5069 /* X86_64_EA */
5071 { "Jjmp{T|}", { Ap } },
5072 { "(bad)", { XX } },
5075 /* X86_64_0F01_REG_0 */
5077 { "sgdt{Q|IQ}", { M } },
5078 { "sgdt", { M } },
5081 /* X86_64_0F01_REG_1 */
5083 { "sidt{Q|IQ}", { M } },
5084 { "sidt", { M } },
5087 /* X86_64_0F01_REG_2 */
5089 { "lgdt{Q|Q}", { M } },
5090 { "lgdt", { M } },
5093 /* X86_64_0F01_REG_3 */
5095 { "lidt{Q|Q}", { M } },
5096 { "lidt", { M } },
5100 static const struct dis386 three_byte_table[][256] = {
5101 /* THREE_BYTE_0F24 */
5103 /* 00 */
5104 { "fmaddps", { { OP_DREX4, q_mode } } },
5105 { "fmaddpd", { { OP_DREX4, q_mode } } },
5106 { "fmaddss", { { OP_DREX4, w_mode } } },
5107 { "fmaddsd", { { OP_DREX4, d_mode } } },
5108 { "fmaddps", { { OP_DREX4, DREX_OC1 + q_mode } } },
5109 { "fmaddpd", { { OP_DREX4, DREX_OC1 + q_mode } } },
5110 { "fmaddss", { { OP_DREX4, DREX_OC1 + w_mode } } },
5111 { "fmaddsd", { { OP_DREX4, DREX_OC1 + d_mode } } },
5112 /* 08 */
5113 { "fmsubps", { { OP_DREX4, q_mode } } },
5114 { "fmsubpd", { { OP_DREX4, q_mode } } },
5115 { "fmsubss", { { OP_DREX4, w_mode } } },
5116 { "fmsubsd", { { OP_DREX4, d_mode } } },
5117 { "fmsubps", { { OP_DREX4, DREX_OC1 + q_mode } } },
5118 { "fmsubpd", { { OP_DREX4, DREX_OC1 + q_mode } } },
5119 { "fmsubss", { { OP_DREX4, DREX_OC1 + w_mode } } },
5120 { "fmsubsd", { { OP_DREX4, DREX_OC1 + d_mode } } },
5121 /* 10 */
5122 { "fnmaddps", { { OP_DREX4, q_mode } } },
5123 { "fnmaddpd", { { OP_DREX4, q_mode } } },
5124 { "fnmaddss", { { OP_DREX4, w_mode } } },
5125 { "fnmaddsd", { { OP_DREX4, d_mode } } },
5126 { "fnmaddps", { { OP_DREX4, DREX_OC1 + q_mode } } },
5127 { "fnmaddpd", { { OP_DREX4, DREX_OC1 + q_mode } } },
5128 { "fnmaddss", { { OP_DREX4, DREX_OC1 + w_mode } } },
5129 { "fnmaddsd", { { OP_DREX4, DREX_OC1 + d_mode } } },
5130 /* 18 */
5131 { "fnmsubps", { { OP_DREX4, q_mode } } },
5132 { "fnmsubpd", { { OP_DREX4, q_mode } } },
5133 { "fnmsubss", { { OP_DREX4, w_mode } } },
5134 { "fnmsubsd", { { OP_DREX4, d_mode } } },
5135 { "fnmsubps", { { OP_DREX4, DREX_OC1 + q_mode } } },
5136 { "fnmsubpd", { { OP_DREX4, DREX_OC1 + q_mode } } },
5137 { "fnmsubss", { { OP_DREX4, DREX_OC1 + w_mode } } },
5138 { "fnmsubsd", { { OP_DREX4, DREX_OC1 + d_mode } } },
5139 /* 20 */
5140 { "permps", { { OP_DREX4, q_mode } } },
5141 { "permpd", { { OP_DREX4, q_mode } } },
5142 { "pcmov", { { OP_DREX4, q_mode } } },
5143 { "pperm", { { OP_DREX4, q_mode } } },
5144 { "permps", { { OP_DREX4, DREX_OC1 + q_mode } } },
5145 { "permpd", { { OP_DREX4, DREX_OC1 + q_mode } } },
5146 { "pcmov", { { OP_DREX4, DREX_OC1 + w_mode } } },
5147 { "pperm", { { OP_DREX4, DREX_OC1 + d_mode } } },
5148 /* 28 */
5149 { "(bad)", { XX } },
5150 { "(bad)", { XX } },
5151 { "(bad)", { XX } },
5152 { "(bad)", { XX } },
5153 { "(bad)", { XX } },
5154 { "(bad)", { XX } },
5155 { "(bad)", { XX } },
5156 { "(bad)", { XX } },
5157 /* 30 */
5158 { "(bad)", { XX } },
5159 { "(bad)", { XX } },
5160 { "(bad)", { XX } },
5161 { "(bad)", { XX } },
5162 { "(bad)", { XX } },
5163 { "(bad)", { XX } },
5164 { "(bad)", { XX } },
5165 { "(bad)", { XX } },
5166 /* 38 */
5167 { "(bad)", { XX } },
5168 { "(bad)", { XX } },
5169 { "(bad)", { XX } },
5170 { "(bad)", { XX } },
5171 { "(bad)", { XX } },
5172 { "(bad)", { XX } },
5173 { "(bad)", { XX } },
5174 { "(bad)", { XX } },
5175 /* 40 */
5176 { "protb", { { OP_DREX3, q_mode } } },
5177 { "protw", { { OP_DREX3, q_mode } } },
5178 { "protd", { { OP_DREX3, q_mode } } },
5179 { "protq", { { OP_DREX3, q_mode } } },
5180 { "pshlb", { { OP_DREX3, q_mode } } },
5181 { "pshlw", { { OP_DREX3, q_mode } } },
5182 { "pshld", { { OP_DREX3, q_mode } } },
5183 { "pshlq", { { OP_DREX3, q_mode } } },
5184 /* 48 */
5185 { "pshab", { { OP_DREX3, q_mode } } },
5186 { "pshaw", { { OP_DREX3, q_mode } } },
5187 { "pshad", { { OP_DREX3, q_mode } } },
5188 { "pshaq", { { OP_DREX3, q_mode } } },
5189 { "(bad)", { XX } },
5190 { "(bad)", { XX } },
5191 { "(bad)", { XX } },
5192 { "(bad)", { XX } },
5193 /* 50 */
5194 { "(bad)", { XX } },
5195 { "(bad)", { XX } },
5196 { "(bad)", { XX } },
5197 { "(bad)", { XX } },
5198 { "(bad)", { XX } },
5199 { "(bad)", { XX } },
5200 { "(bad)", { XX } },
5201 { "(bad)", { XX } },
5202 /* 58 */
5203 { "(bad)", { XX } },
5204 { "(bad)", { XX } },
5205 { "(bad)", { XX } },
5206 { "(bad)", { XX } },
5207 { "(bad)", { XX } },
5208 { "(bad)", { XX } },
5209 { "(bad)", { XX } },
5210 { "(bad)", { XX } },
5211 /* 60 */
5212 { "(bad)", { XX } },
5213 { "(bad)", { XX } },
5214 { "(bad)", { XX } },
5215 { "(bad)", { XX } },
5216 { "(bad)", { XX } },
5217 { "(bad)", { XX } },
5218 { "(bad)", { XX } },
5219 { "(bad)", { XX } },
5220 /* 68 */
5221 { "(bad)", { XX } },
5222 { "(bad)", { XX } },
5223 { "(bad)", { XX } },
5224 { "(bad)", { XX } },
5225 { "(bad)", { XX } },
5226 { "(bad)", { XX } },
5227 { "(bad)", { XX } },
5228 { "(bad)", { XX } },
5229 /* 70 */
5230 { "(bad)", { XX } },
5231 { "(bad)", { XX } },
5232 { "(bad)", { XX } },
5233 { "(bad)", { XX } },
5234 { "(bad)", { XX } },
5235 { "(bad)", { XX } },
5236 { "(bad)", { XX } },
5237 { "(bad)", { XX } },
5238 /* 78 */
5239 { "(bad)", { XX } },
5240 { "(bad)", { XX } },
5241 { "(bad)", { XX } },
5242 { "(bad)", { XX } },
5243 { "(bad)", { XX } },
5244 { "(bad)", { XX } },
5245 { "(bad)", { XX } },
5246 { "(bad)", { XX } },
5247 /* 80 */
5248 { "(bad)", { XX } },
5249 { "(bad)", { XX } },
5250 { "(bad)", { XX } },
5251 { "(bad)", { XX } },
5252 { "(bad)", { XX } },
5253 { "pmacssww", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5254 { "pmacsswd", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5255 { "pmacssdql", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5256 /* 88 */
5257 { "(bad)", { XX } },
5258 { "(bad)", { XX } },
5259 { "(bad)", { XX } },
5260 { "(bad)", { XX } },
5261 { "(bad)", { XX } },
5262 { "(bad)", { XX } },
5263 { "pmacssdd", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5264 { "pmacssdqh", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5265 /* 90 */
5266 { "(bad)", { XX } },
5267 { "(bad)", { XX } },
5268 { "(bad)", { XX } },
5269 { "(bad)", { XX } },
5270 { "(bad)", { XX } },
5271 { "pmacsww", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5272 { "pmacswd", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5273 { "pmacsdql", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5274 /* 98 */
5275 { "(bad)", { XX } },
5276 { "(bad)", { XX } },
5277 { "(bad)", { XX } },
5278 { "(bad)", { XX } },
5279 { "(bad)", { XX } },
5280 { "(bad)", { XX } },
5281 { "pmacsdd", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5282 { "pmacsdqh", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5283 /* a0 */
5284 { "(bad)", { XX } },
5285 { "(bad)", { XX } },
5286 { "(bad)", { XX } },
5287 { "(bad)", { XX } },
5288 { "(bad)", { XX } },
5289 { "(bad)", { XX } },
5290 { "pmadcsswd", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5291 { "(bad)", { XX } },
5292 /* a8 */
5293 { "(bad)", { XX } },
5294 { "(bad)", { XX } },
5295 { "(bad)", { XX } },
5296 { "(bad)", { XX } },
5297 { "(bad)", { XX } },
5298 { "(bad)", { XX } },
5299 { "(bad)", { XX } },
5300 { "(bad)", { XX } },
5301 /* b0 */
5302 { "(bad)", { XX } },
5303 { "(bad)", { XX } },
5304 { "(bad)", { XX } },
5305 { "(bad)", { XX } },
5306 { "(bad)", { XX } },
5307 { "(bad)", { XX } },
5308 { "pmadcswd", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5309 { "(bad)", { XX } },
5310 /* b8 */
5311 { "(bad)", { XX } },
5312 { "(bad)", { XX } },
5313 { "(bad)", { XX } },
5314 { "(bad)", { XX } },
5315 { "(bad)", { XX } },
5316 { "(bad)", { XX } },
5317 { "(bad)", { XX } },
5318 { "(bad)", { XX } },
5319 /* c0 */
5320 { "(bad)", { XX } },
5321 { "(bad)", { XX } },
5322 { "(bad)", { XX } },
5323 { "(bad)", { XX } },
5324 { "(bad)", { XX } },
5325 { "(bad)", { XX } },
5326 { "(bad)", { XX } },
5327 { "(bad)", { XX } },
5328 /* c8 */
5329 { "(bad)", { XX } },
5330 { "(bad)", { XX } },
5331 { "(bad)", { XX } },
5332 { "(bad)", { XX } },
5333 { "(bad)", { XX } },
5334 { "(bad)", { XX } },
5335 { "(bad)", { XX } },
5336 { "(bad)", { XX } },
5337 /* d0 */
5338 { "(bad)", { XX } },
5339 { "(bad)", { XX } },
5340 { "(bad)", { XX } },
5341 { "(bad)", { XX } },
5342 { "(bad)", { XX } },
5343 { "(bad)", { XX } },
5344 { "(bad)", { XX } },
5345 { "(bad)", { XX } },
5346 /* d8 */
5347 { "(bad)", { XX } },
5348 { "(bad)", { XX } },
5349 { "(bad)", { XX } },
5350 { "(bad)", { XX } },
5351 { "(bad)", { XX } },
5352 { "(bad)", { XX } },
5353 { "(bad)", { XX } },
5354 { "(bad)", { XX } },
5355 /* e0 */
5356 { "(bad)", { XX } },
5357 { "(bad)", { XX } },
5358 { "(bad)", { XX } },
5359 { "(bad)", { XX } },
5360 { "(bad)", { XX } },
5361 { "(bad)", { XX } },
5362 { "(bad)", { XX } },
5363 { "(bad)", { XX } },
5364 /* e8 */
5365 { "(bad)", { XX } },
5366 { "(bad)", { XX } },
5367 { "(bad)", { XX } },
5368 { "(bad)", { XX } },
5369 { "(bad)", { XX } },
5370 { "(bad)", { XX } },
5371 { "(bad)", { XX } },
5372 { "(bad)", { XX } },
5373 /* f0 */
5374 { "(bad)", { XX } },
5375 { "(bad)", { XX } },
5376 { "(bad)", { XX } },
5377 { "(bad)", { XX } },
5378 { "(bad)", { XX } },
5379 { "(bad)", { XX } },
5380 { "(bad)", { XX } },
5381 { "(bad)", { XX } },
5382 /* f8 */
5383 { "(bad)", { XX } },
5384 { "(bad)", { XX } },
5385 { "(bad)", { XX } },
5386 { "(bad)", { XX } },
5387 { "(bad)", { XX } },
5388 { "(bad)", { XX } },
5389 { "(bad)", { XX } },
5390 { "(bad)", { XX } },
5392 /* THREE_BYTE_0F25 */
5394 /* 00 */
5395 { "(bad)", { XX } },
5396 { "(bad)", { XX } },
5397 { "(bad)", { XX } },
5398 { "(bad)", { XX } },
5399 { "(bad)", { XX } },
5400 { "(bad)", { XX } },
5401 { "(bad)", { XX } },
5402 { "(bad)", { XX } },
5403 /* 08 */
5404 { "(bad)", { XX } },
5405 { "(bad)", { XX } },
5406 { "(bad)", { XX } },
5407 { "(bad)", { XX } },
5408 { "(bad)", { XX } },
5409 { "(bad)", { XX } },
5410 { "(bad)", { XX } },
5411 { "(bad)", { XX } },
5412 /* 10 */
5413 { "(bad)", { XX } },
5414 { "(bad)", { XX } },
5415 { "(bad)", { XX } },
5416 { "(bad)", { XX } },
5417 { "(bad)", { XX } },
5418 { "(bad)", { XX } },
5419 { "(bad)", { XX } },
5420 { "(bad)", { XX } },
5421 /* 18 */
5422 { "(bad)", { XX } },
5423 { "(bad)", { XX } },
5424 { "(bad)", { XX } },
5425 { "(bad)", { XX } },
5426 { "(bad)", { XX } },
5427 { "(bad)", { XX } },
5428 { "(bad)", { XX } },
5429 { "(bad)", { XX } },
5430 /* 20 */
5431 { "(bad)", { XX } },
5432 { "(bad)", { XX } },
5433 { "(bad)", { XX } },
5434 { "(bad)", { XX } },
5435 { "(bad)", { XX } },
5436 { "(bad)", { XX } },
5437 { "(bad)", { XX } },
5438 { "(bad)", { XX } },
5439 /* 28 */
5440 { "(bad)", { XX } },
5441 { "(bad)", { XX } },
5442 { "(bad)", { XX } },
5443 { "(bad)", { XX } },
5444 { "comps", { { OP_DREX3, q_mode }, { OP_DREX_FCMP, b_mode } } },
5445 { "compd", { { OP_DREX3, q_mode }, { OP_DREX_FCMP, b_mode } } },
5446 { "comss", { { OP_DREX3, w_mode }, { OP_DREX_FCMP, b_mode } } },
5447 { "comsd", { { OP_DREX3, d_mode }, { OP_DREX_FCMP, b_mode } } },
5448 /* 30 */
5449 { "(bad)", { XX } },
5450 { "(bad)", { XX } },
5451 { "(bad)", { XX } },
5452 { "(bad)", { XX } },
5453 { "(bad)", { XX } },
5454 { "(bad)", { XX } },
5455 { "(bad)", { XX } },
5456 { "(bad)", { XX } },
5457 /* 38 */
5458 { "(bad)", { XX } },
5459 { "(bad)", { XX } },
5460 { "(bad)", { XX } },
5461 { "(bad)", { XX } },
5462 { "(bad)", { XX } },
5463 { "(bad)", { XX } },
5464 { "(bad)", { XX } },
5465 { "(bad)", { XX } },
5466 /* 40 */
5467 { "(bad)", { XX } },
5468 { "(bad)", { XX } },
5469 { "(bad)", { XX } },
5470 { "(bad)", { XX } },
5471 { "(bad)", { XX } },
5472 { "(bad)", { XX } },
5473 { "(bad)", { XX } },
5474 { "(bad)", { XX } },
5475 /* 48 */
5476 { "(bad)", { XX } },
5477 { "(bad)", { XX } },
5478 { "(bad)", { XX } },
5479 { "(bad)", { XX } },
5480 { "pcomb", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5481 { "pcomw", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5482 { "pcomd", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5483 { "pcomq", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5484 /* 50 */
5485 { "(bad)", { XX } },
5486 { "(bad)", { XX } },
5487 { "(bad)", { XX } },
5488 { "(bad)", { XX } },
5489 { "(bad)", { XX } },
5490 { "(bad)", { XX } },
5491 { "(bad)", { XX } },
5492 { "(bad)", { XX } },
5493 /* 58 */
5494 { "(bad)", { XX } },
5495 { "(bad)", { XX } },
5496 { "(bad)", { XX } },
5497 { "(bad)", { XX } },
5498 { "(bad)", { XX } },
5499 { "(bad)", { XX } },
5500 { "(bad)", { XX } },
5501 { "(bad)", { XX } },
5502 /* 60 */
5503 { "(bad)", { XX } },
5504 { "(bad)", { XX } },
5505 { "(bad)", { XX } },
5506 { "(bad)", { XX } },
5507 { "(bad)", { XX } },
5508 { "(bad)", { XX } },
5509 { "(bad)", { XX } },
5510 { "(bad)", { XX } },
5511 /* 68 */
5512 { "(bad)", { XX } },
5513 { "(bad)", { XX } },
5514 { "(bad)", { XX } },
5515 { "(bad)", { XX } },
5516 { "pcomub", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5517 { "pcomuw", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5518 { "pcomud", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5519 { "pcomuq", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5520 /* 70 */
5521 { "(bad)", { XX } },
5522 { "(bad)", { XX } },
5523 { "(bad)", { XX } },
5524 { "(bad)", { XX } },
5525 { "(bad)", { XX } },
5526 { "(bad)", { XX } },
5527 { "(bad)", { XX } },
5528 { "(bad)", { XX } },
5529 /* 78 */
5530 { "(bad)", { XX } },
5531 { "(bad)", { XX } },
5532 { "(bad)", { XX } },
5533 { "(bad)", { XX } },
5534 { "(bad)", { XX } },
5535 { "(bad)", { XX } },
5536 { "(bad)", { XX } },
5537 { "(bad)", { XX } },
5538 /* 80 */
5539 { "(bad)", { XX } },
5540 { "(bad)", { XX } },
5541 { "(bad)", { XX } },
5542 { "(bad)", { XX } },
5543 { "(bad)", { XX } },
5544 { "(bad)", { XX } },
5545 { "(bad)", { XX } },
5546 { "(bad)", { XX } },
5547 /* 88 */
5548 { "(bad)", { XX } },
5549 { "(bad)", { XX } },
5550 { "(bad)", { XX } },
5551 { "(bad)", { XX } },
5552 { "(bad)", { XX } },
5553 { "(bad)", { XX } },
5554 { "(bad)", { XX } },
5555 { "(bad)", { XX } },
5556 /* 90 */
5557 { "(bad)", { XX } },
5558 { "(bad)", { XX } },
5559 { "(bad)", { XX } },
5560 { "(bad)", { XX } },
5561 { "(bad)", { XX } },
5562 { "(bad)", { XX } },
5563 { "(bad)", { XX } },
5564 { "(bad)", { XX } },
5565 /* 98 */
5566 { "(bad)", { XX } },
5567 { "(bad)", { XX } },
5568 { "(bad)", { XX } },
5569 { "(bad)", { XX } },
5570 { "(bad)", { XX } },
5571 { "(bad)", { XX } },
5572 { "(bad)", { XX } },
5573 { "(bad)", { XX } },
5574 /* a0 */
5575 { "(bad)", { XX } },
5576 { "(bad)", { XX } },
5577 { "(bad)", { XX } },
5578 { "(bad)", { XX } },
5579 { "(bad)", { XX } },
5580 { "(bad)", { XX } },
5581 { "(bad)", { XX } },
5582 { "(bad)", { XX } },
5583 /* a8 */
5584 { "(bad)", { XX } },
5585 { "(bad)", { XX } },
5586 { "(bad)", { XX } },
5587 { "(bad)", { XX } },
5588 { "(bad)", { XX } },
5589 { "(bad)", { XX } },
5590 { "(bad)", { XX } },
5591 { "(bad)", { XX } },
5592 /* b0 */
5593 { "(bad)", { XX } },
5594 { "(bad)", { XX } },
5595 { "(bad)", { XX } },
5596 { "(bad)", { XX } },
5597 { "(bad)", { XX } },
5598 { "(bad)", { XX } },
5599 { "(bad)", { XX } },
5600 { "(bad)", { XX } },
5601 /* b8 */
5602 { "(bad)", { XX } },
5603 { "(bad)", { XX } },
5604 { "(bad)", { XX } },
5605 { "(bad)", { XX } },
5606 { "(bad)", { XX } },
5607 { "(bad)", { XX } },
5608 { "(bad)", { XX } },
5609 { "(bad)", { XX } },
5610 /* c0 */
5611 { "(bad)", { XX } },
5612 { "(bad)", { XX } },
5613 { "(bad)", { XX } },
5614 { "(bad)", { XX } },
5615 { "(bad)", { XX } },
5616 { "(bad)", { XX } },
5617 { "(bad)", { XX } },
5618 { "(bad)", { XX } },
5619 /* c8 */
5620 { "(bad)", { XX } },
5621 { "(bad)", { XX } },
5622 { "(bad)", { XX } },
5623 { "(bad)", { XX } },
5624 { "(bad)", { XX } },
5625 { "(bad)", { XX } },
5626 { "(bad)", { XX } },
5627 { "(bad)", { XX } },
5628 /* d0 */
5629 { "(bad)", { XX } },
5630 { "(bad)", { XX } },
5631 { "(bad)", { XX } },
5632 { "(bad)", { XX } },
5633 { "(bad)", { XX } },
5634 { "(bad)", { XX } },
5635 { "(bad)", { XX } },
5636 { "(bad)", { XX } },
5637 /* d8 */
5638 { "(bad)", { XX } },
5639 { "(bad)", { XX } },
5640 { "(bad)", { XX } },
5641 { "(bad)", { XX } },
5642 { "(bad)", { XX } },
5643 { "(bad)", { XX } },
5644 { "(bad)", { XX } },
5645 { "(bad)", { XX } },
5646 /* e0 */
5647 { "(bad)", { XX } },
5648 { "(bad)", { XX } },
5649 { "(bad)", { XX } },
5650 { "(bad)", { XX } },
5651 { "(bad)", { XX } },
5652 { "(bad)", { XX } },
5653 { "(bad)", { XX } },
5654 { "(bad)", { XX } },
5655 /* e8 */
5656 { "(bad)", { XX } },
5657 { "(bad)", { XX } },
5658 { "(bad)", { XX } },
5659 { "(bad)", { XX } },
5660 { "(bad)", { XX } },
5661 { "(bad)", { XX } },
5662 { "(bad)", { XX } },
5663 { "(bad)", { XX } },
5664 /* f0 */
5665 { "(bad)", { XX } },
5666 { "(bad)", { XX } },
5667 { "(bad)", { XX } },
5668 { "(bad)", { XX } },
5669 { "(bad)", { XX } },
5670 { "(bad)", { XX } },
5671 { "(bad)", { XX } },
5672 { "(bad)", { XX } },
5673 /* f8 */
5674 { "(bad)", { XX } },
5675 { "(bad)", { XX } },
5676 { "(bad)", { XX } },
5677 { "(bad)", { XX } },
5678 { "(bad)", { XX } },
5679 { "(bad)", { XX } },
5680 { "(bad)", { XX } },
5681 { "(bad)", { XX } },
5683 /* THREE_BYTE_0F38 */
5685 /* 00 */
5686 { "pshufb", { MX, EM } },
5687 { "phaddw", { MX, EM } },
5688 { "phaddd", { MX, EM } },
5689 { "phaddsw", { MX, EM } },
5690 { "pmaddubsw", { MX, EM } },
5691 { "phsubw", { MX, EM } },
5692 { "phsubd", { MX, EM } },
5693 { "phsubsw", { MX, EM } },
5694 /* 08 */
5695 { "psignb", { MX, EM } },
5696 { "psignw", { MX, EM } },
5697 { "psignd", { MX, EM } },
5698 { "pmulhrsw", { MX, EM } },
5699 { "(bad)", { XX } },
5700 { "(bad)", { XX } },
5701 { "(bad)", { XX } },
5702 { "(bad)", { XX } },
5703 /* 10 */
5704 { PREFIX_TABLE (PREFIX_0F3810) },
5705 { "(bad)", { XX } },
5706 { "(bad)", { XX } },
5707 { "(bad)", { XX } },
5708 { PREFIX_TABLE (PREFIX_0F3814) },
5709 { PREFIX_TABLE (PREFIX_0F3815) },
5710 { "(bad)", { XX } },
5711 { PREFIX_TABLE (PREFIX_0F3817) },
5712 /* 18 */
5713 { "(bad)", { XX } },
5714 { "(bad)", { XX } },
5715 { "(bad)", { XX } },
5716 { "(bad)", { XX } },
5717 { "pabsb", { MX, EM } },
5718 { "pabsw", { MX, EM } },
5719 { "pabsd", { MX, EM } },
5720 { "(bad)", { XX } },
5721 /* 20 */
5722 { PREFIX_TABLE (PREFIX_0F3820) },
5723 { PREFIX_TABLE (PREFIX_0F3821) },
5724 { PREFIX_TABLE (PREFIX_0F3822) },
5725 { PREFIX_TABLE (PREFIX_0F3823) },
5726 { PREFIX_TABLE (PREFIX_0F3824) },
5727 { PREFIX_TABLE (PREFIX_0F3825) },
5728 { "(bad)", { XX } },
5729 { "(bad)", { XX } },
5730 /* 28 */
5731 { PREFIX_TABLE (PREFIX_0F3828) },
5732 { PREFIX_TABLE (PREFIX_0F3829) },
5733 { PREFIX_TABLE (PREFIX_0F382A) },
5734 { PREFIX_TABLE (PREFIX_0F382B) },
5735 { "(bad)", { XX } },
5736 { "(bad)", { XX } },
5737 { "(bad)", { XX } },
5738 { "(bad)", { XX } },
5739 /* 30 */
5740 { PREFIX_TABLE (PREFIX_0F3830) },
5741 { PREFIX_TABLE (PREFIX_0F3831) },
5742 { PREFIX_TABLE (PREFIX_0F3832) },
5743 { PREFIX_TABLE (PREFIX_0F3833) },
5744 { PREFIX_TABLE (PREFIX_0F3834) },
5745 { PREFIX_TABLE (PREFIX_0F3835) },
5746 { "(bad)", { XX } },
5747 { PREFIX_TABLE (PREFIX_0F3837) },
5748 /* 38 */
5749 { PREFIX_TABLE (PREFIX_0F3838) },
5750 { PREFIX_TABLE (PREFIX_0F3839) },
5751 { PREFIX_TABLE (PREFIX_0F383A) },
5752 { PREFIX_TABLE (PREFIX_0F383B) },
5753 { PREFIX_TABLE (PREFIX_0F383C) },
5754 { PREFIX_TABLE (PREFIX_0F383D) },
5755 { PREFIX_TABLE (PREFIX_0F383E) },
5756 { PREFIX_TABLE (PREFIX_0F383F) },
5757 /* 40 */
5758 { PREFIX_TABLE (PREFIX_0F3840) },
5759 { PREFIX_TABLE (PREFIX_0F3841) },
5760 { "(bad)", { XX } },
5761 { "(bad)", { XX } },
5762 { "(bad)", { XX } },
5763 { "(bad)", { XX } },
5764 { "(bad)", { XX } },
5765 { "(bad)", { XX } },
5766 /* 48 */
5767 { "(bad)", { XX } },
5768 { "(bad)", { XX } },
5769 { "(bad)", { XX } },
5770 { "(bad)", { XX } },
5771 { "(bad)", { XX } },
5772 { "(bad)", { XX } },
5773 { "(bad)", { XX } },
5774 { "(bad)", { XX } },
5775 /* 50 */
5776 { "(bad)", { XX } },
5777 { "(bad)", { XX } },
5778 { "(bad)", { XX } },
5779 { "(bad)", { XX } },
5780 { "(bad)", { XX } },
5781 { "(bad)", { XX } },
5782 { "(bad)", { XX } },
5783 { "(bad)", { XX } },
5784 /* 58 */
5785 { "(bad)", { XX } },
5786 { "(bad)", { XX } },
5787 { "(bad)", { XX } },
5788 { "(bad)", { XX } },
5789 { "(bad)", { XX } },
5790 { "(bad)", { XX } },
5791 { "(bad)", { XX } },
5792 { "(bad)", { XX } },
5793 /* 60 */
5794 { "(bad)", { XX } },
5795 { "(bad)", { XX } },
5796 { "(bad)", { XX } },
5797 { "(bad)", { XX } },
5798 { "(bad)", { XX } },
5799 { "(bad)", { XX } },
5800 { "(bad)", { XX } },
5801 { "(bad)", { XX } },
5802 /* 68 */
5803 { "(bad)", { XX } },
5804 { "(bad)", { XX } },
5805 { "(bad)", { XX } },
5806 { "(bad)", { XX } },
5807 { "(bad)", { XX } },
5808 { "(bad)", { XX } },
5809 { "(bad)", { XX } },
5810 { "(bad)", { XX } },
5811 /* 70 */
5812 { "(bad)", { XX } },
5813 { "(bad)", { XX } },
5814 { "(bad)", { XX } },
5815 { "(bad)", { XX } },
5816 { "(bad)", { XX } },
5817 { "(bad)", { XX } },
5818 { "(bad)", { XX } },
5819 { "(bad)", { XX } },
5820 /* 78 */
5821 { "(bad)", { XX } },
5822 { "(bad)", { XX } },
5823 { "(bad)", { XX } },
5824 { "(bad)", { XX } },
5825 { "(bad)", { XX } },
5826 { "(bad)", { XX } },
5827 { "(bad)", { XX } },
5828 { "(bad)", { XX } },
5829 /* 80 */
5830 { "(bad)", { XX } },
5831 { "(bad)", { XX } },
5832 { "(bad)", { XX } },
5833 { "(bad)", { XX } },
5834 { "(bad)", { XX } },
5835 { "(bad)", { XX } },
5836 { "(bad)", { XX } },
5837 { "(bad)", { XX } },
5838 /* 88 */
5839 { "(bad)", { XX } },
5840 { "(bad)", { XX } },
5841 { "(bad)", { XX } },
5842 { "(bad)", { XX } },
5843 { "(bad)", { XX } },
5844 { "(bad)", { XX } },
5845 { "(bad)", { XX } },
5846 { "(bad)", { XX } },
5847 /* 90 */
5848 { "(bad)", { XX } },
5849 { "(bad)", { XX } },
5850 { "(bad)", { XX } },
5851 { "(bad)", { XX } },
5852 { "(bad)", { XX } },
5853 { "(bad)", { XX } },
5854 { "(bad)", { XX } },
5855 { "(bad)", { XX } },
5856 /* 98 */
5857 { "(bad)", { XX } },
5858 { "(bad)", { XX } },
5859 { "(bad)", { XX } },
5860 { "(bad)", { XX } },
5861 { "(bad)", { XX } },
5862 { "(bad)", { XX } },
5863 { "(bad)", { XX } },
5864 { "(bad)", { XX } },
5865 /* a0 */
5866 { "(bad)", { XX } },
5867 { "(bad)", { XX } },
5868 { "(bad)", { XX } },
5869 { "(bad)", { XX } },
5870 { "(bad)", { XX } },
5871 { "(bad)", { XX } },
5872 { "(bad)", { XX } },
5873 { "(bad)", { XX } },
5874 /* a8 */
5875 { "(bad)", { XX } },
5876 { "(bad)", { XX } },
5877 { "(bad)", { XX } },
5878 { "(bad)", { XX } },
5879 { "(bad)", { XX } },
5880 { "(bad)", { XX } },
5881 { "(bad)", { XX } },
5882 { "(bad)", { XX } },
5883 /* b0 */
5884 { "(bad)", { XX } },
5885 { "(bad)", { XX } },
5886 { "(bad)", { XX } },
5887 { "(bad)", { XX } },
5888 { "(bad)", { XX } },
5889 { "(bad)", { XX } },
5890 { "(bad)", { XX } },
5891 { "(bad)", { XX } },
5892 /* b8 */
5893 { "(bad)", { XX } },
5894 { "(bad)", { XX } },
5895 { "(bad)", { XX } },
5896 { "(bad)", { XX } },
5897 { "(bad)", { XX } },
5898 { "(bad)", { XX } },
5899 { "(bad)", { XX } },
5900 { "(bad)", { XX } },
5901 /* c0 */
5902 { "(bad)", { XX } },
5903 { "(bad)", { XX } },
5904 { "(bad)", { XX } },
5905 { "(bad)", { XX } },
5906 { "(bad)", { XX } },
5907 { "(bad)", { XX } },
5908 { "(bad)", { XX } },
5909 { "(bad)", { XX } },
5910 /* c8 */
5911 { "(bad)", { XX } },
5912 { "(bad)", { XX } },
5913 { "(bad)", { XX } },
5914 { "(bad)", { XX } },
5915 { "(bad)", { XX } },
5916 { "(bad)", { XX } },
5917 { "(bad)", { XX } },
5918 { "(bad)", { XX } },
5919 /* d0 */
5920 { "(bad)", { XX } },
5921 { "(bad)", { XX } },
5922 { "(bad)", { XX } },
5923 { "(bad)", { XX } },
5924 { "(bad)", { XX } },
5925 { "(bad)", { XX } },
5926 { "(bad)", { XX } },
5927 { "(bad)", { XX } },
5928 /* d8 */
5929 { "(bad)", { XX } },
5930 { "(bad)", { XX } },
5931 { "(bad)", { XX } },
5932 { PREFIX_TABLE (PREFIX_0F38DB) },
5933 { PREFIX_TABLE (PREFIX_0F38DC) },
5934 { PREFIX_TABLE (PREFIX_0F38DD) },
5935 { PREFIX_TABLE (PREFIX_0F38DE) },
5936 { PREFIX_TABLE (PREFIX_0F38DF) },
5937 /* e0 */
5938 { "(bad)", { XX } },
5939 { "(bad)", { XX } },
5940 { "(bad)", { XX } },
5941 { "(bad)", { XX } },
5942 { "(bad)", { XX } },
5943 { "(bad)", { XX } },
5944 { "(bad)", { XX } },
5945 { "(bad)", { XX } },
5946 /* e8 */
5947 { "(bad)", { XX } },
5948 { "(bad)", { XX } },
5949 { "(bad)", { XX } },
5950 { "(bad)", { XX } },
5951 { "(bad)", { XX } },
5952 { "(bad)", { XX } },
5953 { "(bad)", { XX } },
5954 { "(bad)", { XX } },
5955 /* f0 */
5956 { PREFIX_TABLE (PREFIX_0F38F0) },
5957 { PREFIX_TABLE (PREFIX_0F38F1) },
5958 { "(bad)", { XX } },
5959 { "(bad)", { XX } },
5960 { "(bad)", { XX } },
5961 { "(bad)", { XX } },
5962 { "(bad)", { XX } },
5963 { "(bad)", { XX } },
5964 /* f8 */
5965 { "(bad)", { XX } },
5966 { "(bad)", { XX } },
5967 { "(bad)", { XX } },
5968 { "(bad)", { XX } },
5969 { "(bad)", { XX } },
5970 { "(bad)", { XX } },
5971 { "(bad)", { XX } },
5972 { "(bad)", { XX } },
5974 /* THREE_BYTE_0F3A */
5976 /* 00 */
5977 { "(bad)", { XX } },
5978 { "(bad)", { XX } },
5979 { "(bad)", { XX } },
5980 { "(bad)", { XX } },
5981 { "(bad)", { XX } },
5982 { "(bad)", { XX } },
5983 { "(bad)", { XX } },
5984 { "(bad)", { XX } },
5985 /* 08 */
5986 { PREFIX_TABLE (PREFIX_0F3A08) },
5987 { PREFIX_TABLE (PREFIX_0F3A09) },
5988 { PREFIX_TABLE (PREFIX_0F3A0A) },
5989 { PREFIX_TABLE (PREFIX_0F3A0B) },
5990 { PREFIX_TABLE (PREFIX_0F3A0C) },
5991 { PREFIX_TABLE (PREFIX_0F3A0D) },
5992 { PREFIX_TABLE (PREFIX_0F3A0E) },
5993 { "palignr", { MX, EM, Ib } },
5994 /* 10 */
5995 { "(bad)", { XX } },
5996 { "(bad)", { XX } },
5997 { "(bad)", { XX } },
5998 { "(bad)", { XX } },
5999 { PREFIX_TABLE (PREFIX_0F3A14) },
6000 { PREFIX_TABLE (PREFIX_0F3A15) },
6001 { PREFIX_TABLE (PREFIX_0F3A16) },
6002 { PREFIX_TABLE (PREFIX_0F3A17) },
6003 /* 18 */
6004 { "(bad)", { XX } },
6005 { "(bad)", { XX } },
6006 { "(bad)", { XX } },
6007 { "(bad)", { XX } },
6008 { "(bad)", { XX } },
6009 { "(bad)", { XX } },
6010 { "(bad)", { XX } },
6011 { "(bad)", { XX } },
6012 /* 20 */
6013 { PREFIX_TABLE (PREFIX_0F3A20) },
6014 { PREFIX_TABLE (PREFIX_0F3A21) },
6015 { PREFIX_TABLE (PREFIX_0F3A22) },
6016 { "(bad)", { XX } },
6017 { "(bad)", { XX } },
6018 { "(bad)", { XX } },
6019 { "(bad)", { XX } },
6020 { "(bad)", { XX } },
6021 /* 28 */
6022 { "(bad)", { XX } },
6023 { "(bad)", { XX } },
6024 { "(bad)", { XX } },
6025 { "(bad)", { XX } },
6026 { "(bad)", { XX } },
6027 { "(bad)", { XX } },
6028 { "(bad)", { XX } },
6029 { "(bad)", { XX } },
6030 /* 30 */
6031 { "(bad)", { XX } },
6032 { "(bad)", { XX } },
6033 { "(bad)", { XX } },
6034 { "(bad)", { XX } },
6035 { "(bad)", { XX } },
6036 { "(bad)", { XX } },
6037 { "(bad)", { XX } },
6038 { "(bad)", { XX } },
6039 /* 38 */
6040 { "(bad)", { XX } },
6041 { "(bad)", { XX } },
6042 { "(bad)", { XX } },
6043 { "(bad)", { XX } },
6044 { "(bad)", { XX } },
6045 { "(bad)", { XX } },
6046 { "(bad)", { XX } },
6047 { "(bad)", { XX } },
6048 /* 40 */
6049 { PREFIX_TABLE (PREFIX_0F3A40) },
6050 { PREFIX_TABLE (PREFIX_0F3A41) },
6051 { PREFIX_TABLE (PREFIX_0F3A42) },
6052 { "(bad)", { XX } },
6053 { PREFIX_TABLE (PREFIX_0F3A44) },
6054 { "(bad)", { XX } },
6055 { "(bad)", { XX } },
6056 { "(bad)", { XX } },
6057 /* 48 */
6058 { "(bad)", { XX } },
6059 { "(bad)", { XX } },
6060 { "(bad)", { XX } },
6061 { "(bad)", { XX } },
6062 { "(bad)", { XX } },
6063 { "(bad)", { XX } },
6064 { "(bad)", { XX } },
6065 { "(bad)", { XX } },
6066 /* 50 */
6067 { "(bad)", { XX } },
6068 { "(bad)", { XX } },
6069 { "(bad)", { XX } },
6070 { "(bad)", { XX } },
6071 { "(bad)", { XX } },
6072 { "(bad)", { XX } },
6073 { "(bad)", { XX } },
6074 { "(bad)", { XX } },
6075 /* 58 */
6076 { "(bad)", { XX } },
6077 { "(bad)", { XX } },
6078 { "(bad)", { XX } },
6079 { "(bad)", { XX } },
6080 { "(bad)", { XX } },
6081 { "(bad)", { XX } },
6082 { "(bad)", { XX } },
6083 { "(bad)", { XX } },
6084 /* 60 */
6085 { PREFIX_TABLE (PREFIX_0F3A60) },
6086 { PREFIX_TABLE (PREFIX_0F3A61) },
6087 { PREFIX_TABLE (PREFIX_0F3A62) },
6088 { PREFIX_TABLE (PREFIX_0F3A63) },
6089 { "(bad)", { XX } },
6090 { "(bad)", { XX } },
6091 { "(bad)", { XX } },
6092 { "(bad)", { XX } },
6093 /* 68 */
6094 { "(bad)", { XX } },
6095 { "(bad)", { XX } },
6096 { "(bad)", { XX } },
6097 { "(bad)", { XX } },
6098 { "(bad)", { XX } },
6099 { "(bad)", { XX } },
6100 { "(bad)", { XX } },
6101 { "(bad)", { XX } },
6102 /* 70 */
6103 { "(bad)", { XX } },
6104 { "(bad)", { XX } },
6105 { "(bad)", { XX } },
6106 { "(bad)", { XX } },
6107 { "(bad)", { XX } },
6108 { "(bad)", { XX } },
6109 { "(bad)", { XX } },
6110 { "(bad)", { XX } },
6111 /* 78 */
6112 { "(bad)", { XX } },
6113 { "(bad)", { XX } },
6114 { "(bad)", { XX } },
6115 { "(bad)", { XX } },
6116 { "(bad)", { XX } },
6117 { "(bad)", { XX } },
6118 { "(bad)", { XX } },
6119 { "(bad)", { XX } },
6120 /* 80 */
6121 { "(bad)", { XX } },
6122 { "(bad)", { XX } },
6123 { "(bad)", { XX } },
6124 { "(bad)", { XX } },
6125 { "(bad)", { XX } },
6126 { "(bad)", { XX } },
6127 { "(bad)", { XX } },
6128 { "(bad)", { XX } },
6129 /* 88 */
6130 { "(bad)", { XX } },
6131 { "(bad)", { XX } },
6132 { "(bad)", { XX } },
6133 { "(bad)", { XX } },
6134 { "(bad)", { XX } },
6135 { "(bad)", { XX } },
6136 { "(bad)", { XX } },
6137 { "(bad)", { XX } },
6138 /* 90 */
6139 { "(bad)", { XX } },
6140 { "(bad)", { XX } },
6141 { "(bad)", { XX } },
6142 { "(bad)", { XX } },
6143 { "(bad)", { XX } },
6144 { "(bad)", { XX } },
6145 { "(bad)", { XX } },
6146 { "(bad)", { XX } },
6147 /* 98 */
6148 { "(bad)", { XX } },
6149 { "(bad)", { XX } },
6150 { "(bad)", { XX } },
6151 { "(bad)", { XX } },
6152 { "(bad)", { XX } },
6153 { "(bad)", { XX } },
6154 { "(bad)", { XX } },
6155 { "(bad)", { XX } },
6156 /* a0 */
6157 { "(bad)", { XX } },
6158 { "(bad)", { XX } },
6159 { "(bad)", { XX } },
6160 { "(bad)", { XX } },
6161 { "(bad)", { XX } },
6162 { "(bad)", { XX } },
6163 { "(bad)", { XX } },
6164 { "(bad)", { XX } },
6165 /* a8 */
6166 { "(bad)", { XX } },
6167 { "(bad)", { XX } },
6168 { "(bad)", { XX } },
6169 { "(bad)", { XX } },
6170 { "(bad)", { XX } },
6171 { "(bad)", { XX } },
6172 { "(bad)", { XX } },
6173 { "(bad)", { XX } },
6174 /* b0 */
6175 { "(bad)", { XX } },
6176 { "(bad)", { XX } },
6177 { "(bad)", { XX } },
6178 { "(bad)", { XX } },
6179 { "(bad)", { XX } },
6180 { "(bad)", { XX } },
6181 { "(bad)", { XX } },
6182 { "(bad)", { XX } },
6183 /* b8 */
6184 { "(bad)", { XX } },
6185 { "(bad)", { XX } },
6186 { "(bad)", { XX } },
6187 { "(bad)", { XX } },
6188 { "(bad)", { XX } },
6189 { "(bad)", { XX } },
6190 { "(bad)", { XX } },
6191 { "(bad)", { XX } },
6192 /* c0 */
6193 { "(bad)", { XX } },
6194 { "(bad)", { XX } },
6195 { "(bad)", { XX } },
6196 { "(bad)", { XX } },
6197 { "(bad)", { XX } },
6198 { "(bad)", { XX } },
6199 { "(bad)", { XX } },
6200 { "(bad)", { XX } },
6201 /* c8 */
6202 { "(bad)", { XX } },
6203 { "(bad)", { XX } },
6204 { "(bad)", { XX } },
6205 { "(bad)", { XX } },
6206 { "(bad)", { XX } },
6207 { "(bad)", { XX } },
6208 { "(bad)", { XX } },
6209 { "(bad)", { XX } },
6210 /* d0 */
6211 { "(bad)", { XX } },
6212 { "(bad)", { XX } },
6213 { "(bad)", { XX } },
6214 { "(bad)", { XX } },
6215 { "(bad)", { XX } },
6216 { "(bad)", { XX } },
6217 { "(bad)", { XX } },
6218 { "(bad)", { XX } },
6219 /* d8 */
6220 { "(bad)", { XX } },
6221 { "(bad)", { XX } },
6222 { "(bad)", { XX } },
6223 { "(bad)", { XX } },
6224 { "(bad)", { XX } },
6225 { "(bad)", { XX } },
6226 { "(bad)", { XX } },
6227 { PREFIX_TABLE (PREFIX_0F3ADF) },
6228 /* e0 */
6229 { "(bad)", { XX } },
6230 { "(bad)", { XX } },
6231 { "(bad)", { XX } },
6232 { "(bad)", { XX } },
6233 { "(bad)", { XX } },
6234 { "(bad)", { XX } },
6235 { "(bad)", { XX } },
6236 { "(bad)", { XX } },
6237 /* e8 */
6238 { "(bad)", { XX } },
6239 { "(bad)", { XX } },
6240 { "(bad)", { XX } },
6241 { "(bad)", { XX } },
6242 { "(bad)", { XX } },
6243 { "(bad)", { XX } },
6244 { "(bad)", { XX } },
6245 { "(bad)", { XX } },
6246 /* f0 */
6247 { "(bad)", { XX } },
6248 { "(bad)", { XX } },
6249 { "(bad)", { XX } },
6250 { "(bad)", { XX } },
6251 { "(bad)", { XX } },
6252 { "(bad)", { XX } },
6253 { "(bad)", { XX } },
6254 { "(bad)", { XX } },
6255 /* f8 */
6256 { "(bad)", { XX } },
6257 { "(bad)", { XX } },
6258 { "(bad)", { XX } },
6259 { "(bad)", { XX } },
6260 { "(bad)", { XX } },
6261 { "(bad)", { XX } },
6262 { "(bad)", { XX } },
6263 { "(bad)", { XX } },
6265 /* THREE_BYTE_0F7A */
6267 /* 00 */
6268 { "(bad)", { XX } },
6269 { "(bad)", { XX } },
6270 { "(bad)", { XX } },
6271 { "(bad)", { XX } },
6272 { "(bad)", { XX } },
6273 { "(bad)", { XX } },
6274 { "(bad)", { XX } },
6275 { "(bad)", { XX } },
6276 /* 08 */
6277 { "(bad)", { XX } },
6278 { "(bad)", { XX } },
6279 { "(bad)", { XX } },
6280 { "(bad)", { XX } },
6281 { "(bad)", { XX } },
6282 { "(bad)", { XX } },
6283 { "(bad)", { XX } },
6284 { "(bad)", { XX } },
6285 /* 10 */
6286 { "frczps", { XM, EXq } },
6287 { "frczpd", { XM, EXq } },
6288 { "frczss", { XM, EXq } },
6289 { "frczsd", { XM, EXq } },
6290 { "(bad)", { XX } },
6291 { "(bad)", { XX } },
6292 { "(bad)", { XX } },
6293 { "(bad)", { XX } },
6294 /* 18 */
6295 { "(bad)", { XX } },
6296 { "(bad)", { XX } },
6297 { "(bad)", { XX } },
6298 { "(bad)", { XX } },
6299 { "(bad)", { XX } },
6300 { "(bad)", { XX } },
6301 { "(bad)", { XX } },
6302 { "(bad)", { XX } },
6303 /* 20 */
6304 { "ptest", { XX } },
6305 { "(bad)", { XX } },
6306 { "(bad)", { XX } },
6307 { "(bad)", { XX } },
6308 { "(bad)", { XX } },
6309 { "(bad)", { XX } },
6310 { "(bad)", { XX } },
6311 { "(bad)", { XX } },
6312 /* 28 */
6313 { "(bad)", { XX } },
6314 { "(bad)", { XX } },
6315 { "(bad)", { XX } },
6316 { "(bad)", { XX } },
6317 { "(bad)", { XX } },
6318 { "(bad)", { XX } },
6319 { "(bad)", { XX } },
6320 { "(bad)", { XX } },
6321 /* 30 */
6322 { "cvtph2ps", { XM, EXd } },
6323 { "cvtps2ph", { EXd, XM } },
6324 { "(bad)", { XX } },
6325 { "(bad)", { XX } },
6326 { "(bad)", { XX } },
6327 { "(bad)", { XX } },
6328 { "(bad)", { XX } },
6329 { "(bad)", { XX } },
6330 /* 38 */
6331 { "(bad)", { XX } },
6332 { "(bad)", { XX } },
6333 { "(bad)", { XX } },
6334 { "(bad)", { XX } },
6335 { "(bad)", { XX } },
6336 { "(bad)", { XX } },
6337 { "(bad)", { XX } },
6338 { "(bad)", { XX } },
6339 /* 40 */
6340 { "(bad)", { XX } },
6341 { "phaddbw", { XM, EXq } },
6342 { "phaddbd", { XM, EXq } },
6343 { "phaddbq", { XM, EXq } },
6344 { "(bad)", { XX } },
6345 { "(bad)", { XX } },
6346 { "phaddwd", { XM, EXq } },
6347 { "phaddwq", { XM, EXq } },
6348 /* 48 */
6349 { "(bad)", { XX } },
6350 { "(bad)", { XX } },
6351 { "(bad)", { XX } },
6352 { "phadddq", { XM, EXq } },
6353 { "(bad)", { XX } },
6354 { "(bad)", { XX } },
6355 { "(bad)", { XX } },
6356 { "(bad)", { XX } },
6357 /* 50 */
6358 { "(bad)", { XX } },
6359 { "phaddubw", { XM, EXq } },
6360 { "phaddubd", { XM, EXq } },
6361 { "phaddubq", { XM, EXq } },
6362 { "(bad)", { XX } },
6363 { "(bad)", { XX } },
6364 { "phadduwd", { XM, EXq } },
6365 { "phadduwq", { XM, EXq } },
6366 /* 58 */
6367 { "(bad)", { XX } },
6368 { "(bad)", { XX } },
6369 { "(bad)", { XX } },
6370 { "phaddudq", { XM, EXq } },
6371 { "(bad)", { XX } },
6372 { "(bad)", { XX } },
6373 { "(bad)", { XX } },
6374 { "(bad)", { XX } },
6375 /* 60 */
6376 { "(bad)", { XX } },
6377 { "phsubbw", { XM, EXq } },
6378 { "phsubbd", { XM, EXq } },
6379 { "phsubbq", { XM, EXq } },
6380 { "(bad)", { XX } },
6381 { "(bad)", { XX } },
6382 { "(bad)", { XX } },
6383 { "(bad)", { XX } },
6384 /* 68 */
6385 { "(bad)", { XX } },
6386 { "(bad)", { XX } },
6387 { "(bad)", { XX } },
6388 { "(bad)", { XX } },
6389 { "(bad)", { XX } },
6390 { "(bad)", { XX } },
6391 { "(bad)", { XX } },
6392 { "(bad)", { XX } },
6393 /* 70 */
6394 { "(bad)", { XX } },
6395 { "(bad)", { XX } },
6396 { "(bad)", { XX } },
6397 { "(bad)", { XX } },
6398 { "(bad)", { XX } },
6399 { "(bad)", { XX } },
6400 { "(bad)", { XX } },
6401 { "(bad)", { XX } },
6402 /* 78 */
6403 { "(bad)", { XX } },
6404 { "(bad)", { XX } },
6405 { "(bad)", { XX } },
6406 { "(bad)", { XX } },
6407 { "(bad)", { XX } },
6408 { "(bad)", { XX } },
6409 { "(bad)", { XX } },
6410 { "(bad)", { XX } },
6411 /* 80 */
6412 { "(bad)", { XX } },
6413 { "(bad)", { XX } },
6414 { "(bad)", { XX } },
6415 { "(bad)", { XX } },
6416 { "(bad)", { XX } },
6417 { "(bad)", { XX } },
6418 { "(bad)", { XX } },
6419 { "(bad)", { XX } },
6420 /* 88 */
6421 { "(bad)", { XX } },
6422 { "(bad)", { XX } },
6423 { "(bad)", { XX } },
6424 { "(bad)", { XX } },
6425 { "(bad)", { XX } },
6426 { "(bad)", { XX } },
6427 { "(bad)", { XX } },
6428 { "(bad)", { XX } },
6429 /* 90 */
6430 { "(bad)", { XX } },
6431 { "(bad)", { XX } },
6432 { "(bad)", { XX } },
6433 { "(bad)", { XX } },
6434 { "(bad)", { XX } },
6435 { "(bad)", { XX } },
6436 { "(bad)", { XX } },
6437 { "(bad)", { XX } },
6438 /* 98 */
6439 { "(bad)", { XX } },
6440 { "(bad)", { XX } },
6441 { "(bad)", { XX } },
6442 { "(bad)", { XX } },
6443 { "(bad)", { XX } },
6444 { "(bad)", { XX } },
6445 { "(bad)", { XX } },
6446 { "(bad)", { XX } },
6447 /* a0 */
6448 { "(bad)", { XX } },
6449 { "(bad)", { XX } },
6450 { "(bad)", { XX } },
6451 { "(bad)", { XX } },
6452 { "(bad)", { XX } },
6453 { "(bad)", { XX } },
6454 { "(bad)", { XX } },
6455 { "(bad)", { XX } },
6456 /* a8 */
6457 { "(bad)", { XX } },
6458 { "(bad)", { XX } },
6459 { "(bad)", { XX } },
6460 { "(bad)", { XX } },
6461 { "(bad)", { XX } },
6462 { "(bad)", { XX } },
6463 { "(bad)", { XX } },
6464 { "(bad)", { XX } },
6465 /* b0 */
6466 { "(bad)", { XX } },
6467 { "(bad)", { XX } },
6468 { "(bad)", { XX } },
6469 { "(bad)", { XX } },
6470 { "(bad)", { XX } },
6471 { "(bad)", { XX } },
6472 { "(bad)", { XX } },
6473 { "(bad)", { XX } },
6474 /* b8 */
6475 { "(bad)", { XX } },
6476 { "(bad)", { XX } },
6477 { "(bad)", { XX } },
6478 { "(bad)", { XX } },
6479 { "(bad)", { XX } },
6480 { "(bad)", { XX } },
6481 { "(bad)", { XX } },
6482 { "(bad)", { XX } },
6483 /* c0 */
6484 { "(bad)", { XX } },
6485 { "(bad)", { XX } },
6486 { "(bad)", { XX } },
6487 { "(bad)", { XX } },
6488 { "(bad)", { XX } },
6489 { "(bad)", { XX } },
6490 { "(bad)", { XX } },
6491 { "(bad)", { XX } },
6492 /* c8 */
6493 { "(bad)", { XX } },
6494 { "(bad)", { XX } },
6495 { "(bad)", { XX } },
6496 { "(bad)", { XX } },
6497 { "(bad)", { XX } },
6498 { "(bad)", { XX } },
6499 { "(bad)", { XX } },
6500 { "(bad)", { XX } },
6501 /* d0 */
6502 { "(bad)", { XX } },
6503 { "(bad)", { XX } },
6504 { "(bad)", { XX } },
6505 { "(bad)", { XX } },
6506 { "(bad)", { XX } },
6507 { "(bad)", { XX } },
6508 { "(bad)", { XX } },
6509 { "(bad)", { XX } },
6510 /* d8 */
6511 { "(bad)", { XX } },
6512 { "(bad)", { XX } },
6513 { "(bad)", { XX } },
6514 { "(bad)", { XX } },
6515 { "(bad)", { XX } },
6516 { "(bad)", { XX } },
6517 { "(bad)", { XX } },
6518 { "(bad)", { XX } },
6519 /* e0 */
6520 { "(bad)", { XX } },
6521 { "(bad)", { XX } },
6522 { "(bad)", { XX } },
6523 { "(bad)", { XX } },
6524 { "(bad)", { XX } },
6525 { "(bad)", { XX } },
6526 { "(bad)", { XX } },
6527 { "(bad)", { XX } },
6528 /* e8 */
6529 { "(bad)", { XX } },
6530 { "(bad)", { XX } },
6531 { "(bad)", { XX } },
6532 { "(bad)", { XX } },
6533 { "(bad)", { XX } },
6534 { "(bad)", { XX } },
6535 { "(bad)", { XX } },
6536 { "(bad)", { XX } },
6537 /* f0 */
6538 { "(bad)", { XX } },
6539 { "(bad)", { XX } },
6540 { "(bad)", { XX } },
6541 { "(bad)", { XX } },
6542 { "(bad)", { XX } },
6543 { "(bad)", { XX } },
6544 { "(bad)", { XX } },
6545 { "(bad)", { XX } },
6546 /* f8 */
6547 { "(bad)", { XX } },
6548 { "(bad)", { XX } },
6549 { "(bad)", { XX } },
6550 { "(bad)", { XX } },
6551 { "(bad)", { XX } },
6552 { "(bad)", { XX } },
6553 { "(bad)", { XX } },
6554 { "(bad)", { XX } },
6556 /* THREE_BYTE_0F7B */
6558 /* 00 */
6559 { "(bad)", { XX } },
6560 { "(bad)", { XX } },
6561 { "(bad)", { XX } },
6562 { "(bad)", { XX } },
6563 { "(bad)", { XX } },
6564 { "(bad)", { XX } },
6565 { "(bad)", { XX } },
6566 { "(bad)", { XX } },
6567 /* 08 */
6568 { "(bad)", { XX } },
6569 { "(bad)", { XX } },
6570 { "(bad)", { XX } },
6571 { "(bad)", { XX } },
6572 { "(bad)", { XX } },
6573 { "(bad)", { XX } },
6574 { "(bad)", { XX } },
6575 { "(bad)", { XX } },
6576 /* 10 */
6577 { "(bad)", { XX } },
6578 { "(bad)", { XX } },
6579 { "(bad)", { XX } },
6580 { "(bad)", { XX } },
6581 { "(bad)", { XX } },
6582 { "(bad)", { XX } },
6583 { "(bad)", { XX } },
6584 { "(bad)", { XX } },
6585 /* 18 */
6586 { "(bad)", { XX } },
6587 { "(bad)", { XX } },
6588 { "(bad)", { XX } },
6589 { "(bad)", { XX } },
6590 { "(bad)", { XX } },
6591 { "(bad)", { XX } },
6592 { "(bad)", { XX } },
6593 { "(bad)", { XX } },
6594 /* 20 */
6595 { "(bad)", { XX } },
6596 { "(bad)", { XX } },
6597 { "(bad)", { XX } },
6598 { "(bad)", { XX } },
6599 { "(bad)", { XX } },
6600 { "(bad)", { XX } },
6601 { "(bad)", { XX } },
6602 { "(bad)", { XX } },
6603 /* 28 */
6604 { "(bad)", { XX } },
6605 { "(bad)", { XX } },
6606 { "(bad)", { XX } },
6607 { "(bad)", { XX } },
6608 { "(bad)", { XX } },
6609 { "(bad)", { XX } },
6610 { "(bad)", { XX } },
6611 { "(bad)", { XX } },
6612 /* 30 */
6613 { "(bad)", { XX } },
6614 { "(bad)", { XX } },
6615 { "(bad)", { XX } },
6616 { "(bad)", { XX } },
6617 { "(bad)", { XX } },
6618 { "(bad)", { XX } },
6619 { "(bad)", { XX } },
6620 { "(bad)", { XX } },
6621 /* 38 */
6622 { "(bad)", { XX } },
6623 { "(bad)", { XX } },
6624 { "(bad)", { XX } },
6625 { "(bad)", { XX } },
6626 { "(bad)", { XX } },
6627 { "(bad)", { XX } },
6628 { "(bad)", { XX } },
6629 { "(bad)", { XX } },
6630 /* 40 */
6631 { "protb", { XM, EXq, Ib } },
6632 { "protw", { XM, EXq, Ib } },
6633 { "protd", { XM, EXq, Ib } },
6634 { "protq", { XM, EXq, Ib } },
6635 { "pshlb", { XM, EXq, Ib } },
6636 { "pshlw", { XM, EXq, Ib } },
6637 { "pshld", { XM, EXq, Ib } },
6638 { "pshlq", { XM, EXq, Ib } },
6639 /* 48 */
6640 { "pshab", { XM, EXq, Ib } },
6641 { "pshaw", { XM, EXq, Ib } },
6642 { "pshad", { XM, EXq, Ib } },
6643 { "pshaq", { XM, EXq, Ib } },
6644 { "(bad)", { XX } },
6645 { "(bad)", { XX } },
6646 { "(bad)", { XX } },
6647 { "(bad)", { XX } },
6648 /* 50 */
6649 { "(bad)", { XX } },
6650 { "(bad)", { XX } },
6651 { "(bad)", { XX } },
6652 { "(bad)", { XX } },
6653 { "(bad)", { XX } },
6654 { "(bad)", { XX } },
6655 { "(bad)", { XX } },
6656 { "(bad)", { XX } },
6657 /* 58 */
6658 { "(bad)", { XX } },
6659 { "(bad)", { XX } },
6660 { "(bad)", { XX } },
6661 { "(bad)", { XX } },
6662 { "(bad)", { XX } },
6663 { "(bad)", { XX } },
6664 { "(bad)", { XX } },
6665 { "(bad)", { XX } },
6666 /* 60 */
6667 { "(bad)", { XX } },
6668 { "(bad)", { XX } },
6669 { "(bad)", { XX } },
6670 { "(bad)", { XX } },
6671 { "(bad)", { XX } },
6672 { "(bad)", { XX } },
6673 { "(bad)", { XX } },
6674 { "(bad)", { XX } },
6675 /* 68 */
6676 { "(bad)", { XX } },
6677 { "(bad)", { XX } },
6678 { "(bad)", { XX } },
6679 { "(bad)", { XX } },
6680 { "(bad)", { XX } },
6681 { "(bad)", { XX } },
6682 { "(bad)", { XX } },
6683 { "(bad)", { XX } },
6684 /* 70 */
6685 { "(bad)", { XX } },
6686 { "(bad)", { XX } },
6687 { "(bad)", { XX } },
6688 { "(bad)", { XX } },
6689 { "(bad)", { XX } },
6690 { "(bad)", { XX } },
6691 { "(bad)", { XX } },
6692 { "(bad)", { XX } },
6693 /* 78 */
6694 { "(bad)", { XX } },
6695 { "(bad)", { XX } },
6696 { "(bad)", { XX } },
6697 { "(bad)", { XX } },
6698 { "(bad)", { XX } },
6699 { "(bad)", { XX } },
6700 { "(bad)", { XX } },
6701 { "(bad)", { XX } },
6702 /* 80 */
6703 { "(bad)", { XX } },
6704 { "(bad)", { XX } },
6705 { "(bad)", { XX } },
6706 { "(bad)", { XX } },
6707 { "(bad)", { XX } },
6708 { "(bad)", { XX } },
6709 { "(bad)", { XX } },
6710 { "(bad)", { XX } },
6711 /* 88 */
6712 { "(bad)", { XX } },
6713 { "(bad)", { XX } },
6714 { "(bad)", { XX } },
6715 { "(bad)", { XX } },
6716 { "(bad)", { XX } },
6717 { "(bad)", { XX } },
6718 { "(bad)", { XX } },
6719 { "(bad)", { XX } },
6720 /* 90 */
6721 { "(bad)", { XX } },
6722 { "(bad)", { XX } },
6723 { "(bad)", { XX } },
6724 { "(bad)", { XX } },
6725 { "(bad)", { XX } },
6726 { "(bad)", { XX } },
6727 { "(bad)", { XX } },
6728 { "(bad)", { XX } },
6729 /* 98 */
6730 { "(bad)", { XX } },
6731 { "(bad)", { XX } },
6732 { "(bad)", { XX } },
6733 { "(bad)", { XX } },
6734 { "(bad)", { XX } },
6735 { "(bad)", { XX } },
6736 { "(bad)", { XX } },
6737 { "(bad)", { XX } },
6738 /* a0 */
6739 { "(bad)", { XX } },
6740 { "(bad)", { XX } },
6741 { "(bad)", { XX } },
6742 { "(bad)", { XX } },
6743 { "(bad)", { XX } },
6744 { "(bad)", { XX } },
6745 { "(bad)", { XX } },
6746 { "(bad)", { XX } },
6747 /* a8 */
6748 { "(bad)", { XX } },
6749 { "(bad)", { XX } },
6750 { "(bad)", { XX } },
6751 { "(bad)", { XX } },
6752 { "(bad)", { XX } },
6753 { "(bad)", { XX } },
6754 { "(bad)", { XX } },
6755 { "(bad)", { XX } },
6756 /* b0 */
6757 { "(bad)", { XX } },
6758 { "(bad)", { XX } },
6759 { "(bad)", { XX } },
6760 { "(bad)", { XX } },
6761 { "(bad)", { XX } },
6762 { "(bad)", { XX } },
6763 { "(bad)", { XX } },
6764 { "(bad)", { XX } },
6765 /* b8 */
6766 { "(bad)", { XX } },
6767 { "(bad)", { XX } },
6768 { "(bad)", { XX } },
6769 { "(bad)", { XX } },
6770 { "(bad)", { XX } },
6771 { "(bad)", { XX } },
6772 { "(bad)", { XX } },
6773 { "(bad)", { XX } },
6774 /* c0 */
6775 { "(bad)", { XX } },
6776 { "(bad)", { XX } },
6777 { "(bad)", { XX } },
6778 { "(bad)", { XX } },
6779 { "(bad)", { XX } },
6780 { "(bad)", { XX } },
6781 { "(bad)", { XX } },
6782 { "(bad)", { XX } },
6783 /* c8 */
6784 { "(bad)", { XX } },
6785 { "(bad)", { XX } },
6786 { "(bad)", { XX } },
6787 { "(bad)", { XX } },
6788 { "(bad)", { XX } },
6789 { "(bad)", { XX } },
6790 { "(bad)", { XX } },
6791 { "(bad)", { XX } },
6792 /* d0 */
6793 { "(bad)", { XX } },
6794 { "(bad)", { XX } },
6795 { "(bad)", { XX } },
6796 { "(bad)", { XX } },
6797 { "(bad)", { XX } },
6798 { "(bad)", { XX } },
6799 { "(bad)", { XX } },
6800 { "(bad)", { XX } },
6801 /* d8 */
6802 { "(bad)", { XX } },
6803 { "(bad)", { XX } },
6804 { "(bad)", { XX } },
6805 { "(bad)", { XX } },
6806 { "(bad)", { XX } },
6807 { "(bad)", { XX } },
6808 { "(bad)", { XX } },
6809 { "(bad)", { XX } },
6810 /* e0 */
6811 { "(bad)", { XX } },
6812 { "(bad)", { XX } },
6813 { "(bad)", { XX } },
6814 { "(bad)", { XX } },
6815 { "(bad)", { XX } },
6816 { "(bad)", { XX } },
6817 { "(bad)", { XX } },
6818 { "(bad)", { XX } },
6819 /* e8 */
6820 { "(bad)", { XX } },
6821 { "(bad)", { XX } },
6822 { "(bad)", { XX } },
6823 { "(bad)", { XX } },
6824 { "(bad)", { XX } },
6825 { "(bad)", { XX } },
6826 { "(bad)", { XX } },
6827 { "(bad)", { XX } },
6828 /* f0 */
6829 { "(bad)", { XX } },
6830 { "(bad)", { XX } },
6831 { "(bad)", { XX } },
6832 { "(bad)", { XX } },
6833 { "(bad)", { XX } },
6834 { "(bad)", { XX } },
6835 { "(bad)", { XX } },
6836 { "(bad)", { XX } },
6837 /* f8 */
6838 { "(bad)", { XX } },
6839 { "(bad)", { XX } },
6840 { "(bad)", { XX } },
6841 { "(bad)", { XX } },
6842 { "(bad)", { XX } },
6843 { "(bad)", { XX } },
6844 { "(bad)", { XX } },
6845 { "(bad)", { XX } },
6849 static const struct dis386 vex_table[][256] = {
6850 /* VEX_0F */
6852 /* 00 */
6853 { "(bad)", { XX } },
6854 { "(bad)", { XX } },
6855 { "(bad)", { XX } },
6856 { "(bad)", { XX } },
6857 { "(bad)", { XX } },
6858 { "(bad)", { XX } },
6859 { "(bad)", { XX } },
6860 { "(bad)", { XX } },
6861 /* 08 */
6862 { "(bad)", { XX } },
6863 { "(bad)", { XX } },
6864 { "(bad)", { XX } },
6865 { "(bad)", { XX } },
6866 { "(bad)", { XX } },
6867 { "(bad)", { XX } },
6868 { "(bad)", { XX } },
6869 { "(bad)", { XX } },
6870 /* 10 */
6871 { PREFIX_TABLE (PREFIX_VEX_10) },
6872 { PREFIX_TABLE (PREFIX_VEX_11) },
6873 { PREFIX_TABLE (PREFIX_VEX_12) },
6874 { MOD_TABLE (MOD_VEX_13) },
6875 { "vunpcklpX", { XM, Vex, EXx } },
6876 { "vunpckhpX", { XM, Vex, EXx } },
6877 { PREFIX_TABLE (PREFIX_VEX_16) },
6878 { MOD_TABLE (MOD_VEX_17) },
6879 /* 18 */
6880 { "(bad)", { XX } },
6881 { "(bad)", { XX } },
6882 { "(bad)", { XX } },
6883 { "(bad)", { XX } },
6884 { "(bad)", { XX } },
6885 { "(bad)", { XX } },
6886 { "(bad)", { XX } },
6887 { "(bad)", { XX } },
6888 /* 20 */
6889 { "(bad)", { XX } },
6890 { "(bad)", { XX } },
6891 { "(bad)", { XX } },
6892 { "(bad)", { XX } },
6893 { "(bad)", { XX } },
6894 { "(bad)", { XX } },
6895 { "(bad)", { XX } },
6896 { "(bad)", { XX } },
6897 /* 28 */
6898 { "vmovapX", { XM, EXx } },
6899 { "vmovapX", { EXx, XM } },
6900 { PREFIX_TABLE (PREFIX_VEX_2A) },
6901 { MOD_TABLE (MOD_VEX_2B) },
6902 { PREFIX_TABLE (PREFIX_VEX_2C) },
6903 { PREFIX_TABLE (PREFIX_VEX_2D) },
6904 { PREFIX_TABLE (PREFIX_VEX_2E) },
6905 { PREFIX_TABLE (PREFIX_VEX_2F) },
6906 /* 30 */
6907 { "(bad)", { XX } },
6908 { "(bad)", { XX } },
6909 { "(bad)", { XX } },
6910 { "(bad)", { XX } },
6911 { "(bad)", { XX } },
6912 { "(bad)", { XX } },
6913 { "(bad)", { XX } },
6914 { "(bad)", { XX } },
6915 /* 38 */
6916 { "(bad)", { XX } },
6917 { "(bad)", { XX } },
6918 { "(bad)", { XX } },
6919 { "(bad)", { XX } },
6920 { "(bad)", { XX } },
6921 { "(bad)", { XX } },
6922 { "(bad)", { XX } },
6923 { "(bad)", { XX } },
6924 /* 40 */
6925 { "(bad)", { XX } },
6926 { "(bad)", { XX } },
6927 { "(bad)", { XX } },
6928 { "(bad)", { XX } },
6929 { "(bad)", { XX } },
6930 { "(bad)", { XX } },
6931 { "(bad)", { XX } },
6932 { "(bad)", { XX } },
6933 /* 48 */
6934 { "(bad)", { XX } },
6935 { "(bad)", { XX } },
6936 { "(bad)", { XX } },
6937 { "(bad)", { XX } },
6938 { "(bad)", { XX } },
6939 { "(bad)", { XX } },
6940 { "(bad)", { XX } },
6941 { "(bad)", { XX } },
6942 /* 50 */
6943 { MOD_TABLE (MOD_VEX_51) },
6944 { PREFIX_TABLE (PREFIX_VEX_51) },
6945 { PREFIX_TABLE (PREFIX_VEX_52) },
6946 { PREFIX_TABLE (PREFIX_VEX_53) },
6947 { "vandpX", { XM, Vex, EXx } },
6948 { "vandnpX", { XM, Vex, EXx } },
6949 { "vorpX", { XM, Vex, EXx } },
6950 { "vxorpX", { XM, Vex, EXx } },
6951 /* 58 */
6952 { PREFIX_TABLE (PREFIX_VEX_58) },
6953 { PREFIX_TABLE (PREFIX_VEX_59) },
6954 { PREFIX_TABLE (PREFIX_VEX_5A) },
6955 { PREFIX_TABLE (PREFIX_VEX_5B) },
6956 { PREFIX_TABLE (PREFIX_VEX_5C) },
6957 { PREFIX_TABLE (PREFIX_VEX_5D) },
6958 { PREFIX_TABLE (PREFIX_VEX_5E) },
6959 { PREFIX_TABLE (PREFIX_VEX_5F) },
6960 /* 60 */
6961 { PREFIX_TABLE (PREFIX_VEX_60) },
6962 { PREFIX_TABLE (PREFIX_VEX_61) },
6963 { PREFIX_TABLE (PREFIX_VEX_62) },
6964 { PREFIX_TABLE (PREFIX_VEX_63) },
6965 { PREFIX_TABLE (PREFIX_VEX_64) },
6966 { PREFIX_TABLE (PREFIX_VEX_65) },
6967 { PREFIX_TABLE (PREFIX_VEX_66) },
6968 { PREFIX_TABLE (PREFIX_VEX_67) },
6969 /* 68 */
6970 { PREFIX_TABLE (PREFIX_VEX_68) },
6971 { PREFIX_TABLE (PREFIX_VEX_69) },
6972 { PREFIX_TABLE (PREFIX_VEX_6A) },
6973 { PREFIX_TABLE (PREFIX_VEX_6B) },
6974 { PREFIX_TABLE (PREFIX_VEX_6C) },
6975 { PREFIX_TABLE (PREFIX_VEX_6D) },
6976 { PREFIX_TABLE (PREFIX_VEX_6E) },
6977 { PREFIX_TABLE (PREFIX_VEX_6F) },
6978 /* 70 */
6979 { PREFIX_TABLE (PREFIX_VEX_70) },
6980 { REG_TABLE (REG_VEX_71) },
6981 { REG_TABLE (REG_VEX_72) },
6982 { REG_TABLE (REG_VEX_73) },
6983 { PREFIX_TABLE (PREFIX_VEX_74) },
6984 { PREFIX_TABLE (PREFIX_VEX_75) },
6985 { PREFIX_TABLE (PREFIX_VEX_76) },
6986 { PREFIX_TABLE (PREFIX_VEX_77) },
6987 /* 78 */
6988 { "(bad)", { XX } },
6989 { "(bad)", { XX } },
6990 { "(bad)", { XX } },
6991 { "(bad)", { XX } },
6992 { PREFIX_TABLE (PREFIX_VEX_7C) },
6993 { PREFIX_TABLE (PREFIX_VEX_7D) },
6994 { PREFIX_TABLE (PREFIX_VEX_7E) },
6995 { PREFIX_TABLE (PREFIX_VEX_7F) },
6996 /* 80 */
6997 { "(bad)", { XX } },
6998 { "(bad)", { XX } },
6999 { "(bad)", { XX } },
7000 { "(bad)", { XX } },
7001 { "(bad)", { XX } },
7002 { "(bad)", { XX } },
7003 { "(bad)", { XX } },
7004 { "(bad)", { XX } },
7005 /* 88 */
7006 { "(bad)", { XX } },
7007 { "(bad)", { XX } },
7008 { "(bad)", { XX } },
7009 { "(bad)", { XX } },
7010 { "(bad)", { XX } },
7011 { "(bad)", { XX } },
7012 { "(bad)", { XX } },
7013 { "(bad)", { XX } },
7014 /* 90 */
7015 { "(bad)", { XX } },
7016 { "(bad)", { XX } },
7017 { "(bad)", { XX } },
7018 { "(bad)", { XX } },
7019 { "(bad)", { XX } },
7020 { "(bad)", { XX } },
7021 { "(bad)", { XX } },
7022 { "(bad)", { XX } },
7023 /* 98 */
7024 { "(bad)", { XX } },
7025 { "(bad)", { XX } },
7026 { "(bad)", { XX } },
7027 { "(bad)", { XX } },
7028 { "(bad)", { XX } },
7029 { "(bad)", { XX } },
7030 { "(bad)", { XX } },
7031 { "(bad)", { XX } },
7032 /* a0 */
7033 { "(bad)", { XX } },
7034 { "(bad)", { XX } },
7035 { "(bad)", { XX } },
7036 { "(bad)", { XX } },
7037 { "(bad)", { XX } },
7038 { "(bad)", { XX } },
7039 { "(bad)", { XX } },
7040 { "(bad)", { XX } },
7041 /* a8 */
7042 { "(bad)", { XX } },
7043 { "(bad)", { XX } },
7044 { "(bad)", { XX } },
7045 { "(bad)", { XX } },
7046 { "(bad)", { XX } },
7047 { "(bad)", { XX } },
7048 { REG_TABLE (REG_VEX_AE) },
7049 { "(bad)", { XX } },
7050 /* b0 */
7051 { "(bad)", { XX } },
7052 { "(bad)", { XX } },
7053 { "(bad)", { XX } },
7054 { "(bad)", { XX } },
7055 { "(bad)", { XX } },
7056 { "(bad)", { XX } },
7057 { "(bad)", { XX } },
7058 { "(bad)", { XX } },
7059 /* b8 */
7060 { "(bad)", { XX } },
7061 { "(bad)", { XX } },
7062 { "(bad)", { XX } },
7063 { "(bad)", { XX } },
7064 { "(bad)", { XX } },
7065 { "(bad)", { XX } },
7066 { "(bad)", { XX } },
7067 { "(bad)", { XX } },
7068 /* c0 */
7069 { "(bad)", { XX } },
7070 { "(bad)", { XX } },
7071 { PREFIX_TABLE (PREFIX_VEX_C2) },
7072 { "(bad)", { XX } },
7073 { PREFIX_TABLE (PREFIX_VEX_C4) },
7074 { PREFIX_TABLE (PREFIX_VEX_C5) },
7075 { "vshufpX", { XM, Vex, EXx, Ib } },
7076 { "(bad)", { XX } },
7077 /* c8 */
7078 { "(bad)", { XX } },
7079 { "(bad)", { XX } },
7080 { "(bad)", { XX } },
7081 { "(bad)", { XX } },
7082 { "(bad)", { XX } },
7083 { "(bad)", { XX } },
7084 { "(bad)", { XX } },
7085 { "(bad)", { XX } },
7086 /* d0 */
7087 { PREFIX_TABLE (PREFIX_VEX_D0) },
7088 { PREFIX_TABLE (PREFIX_VEX_D1) },
7089 { PREFIX_TABLE (PREFIX_VEX_D2) },
7090 { PREFIX_TABLE (PREFIX_VEX_D3) },
7091 { PREFIX_TABLE (PREFIX_VEX_D4) },
7092 { PREFIX_TABLE (PREFIX_VEX_D5) },
7093 { PREFIX_TABLE (PREFIX_VEX_D6) },
7094 { PREFIX_TABLE (PREFIX_VEX_D7) },
7095 /* d8 */
7096 { PREFIX_TABLE (PREFIX_VEX_D8) },
7097 { PREFIX_TABLE (PREFIX_VEX_D9) },
7098 { PREFIX_TABLE (PREFIX_VEX_DA) },
7099 { PREFIX_TABLE (PREFIX_VEX_DB) },
7100 { PREFIX_TABLE (PREFIX_VEX_DC) },
7101 { PREFIX_TABLE (PREFIX_VEX_DD) },
7102 { PREFIX_TABLE (PREFIX_VEX_DE) },
7103 { PREFIX_TABLE (PREFIX_VEX_DF) },
7104 /* e0 */
7105 { PREFIX_TABLE (PREFIX_VEX_E0) },
7106 { PREFIX_TABLE (PREFIX_VEX_E1) },
7107 { PREFIX_TABLE (PREFIX_VEX_E2) },
7108 { PREFIX_TABLE (PREFIX_VEX_E3) },
7109 { PREFIX_TABLE (PREFIX_VEX_E4) },
7110 { PREFIX_TABLE (PREFIX_VEX_E5) },
7111 { PREFIX_TABLE (PREFIX_VEX_E6) },
7112 { PREFIX_TABLE (PREFIX_VEX_E7) },
7113 /* e8 */
7114 { PREFIX_TABLE (PREFIX_VEX_E8) },
7115 { PREFIX_TABLE (PREFIX_VEX_E9) },
7116 { PREFIX_TABLE (PREFIX_VEX_EA) },
7117 { PREFIX_TABLE (PREFIX_VEX_EB) },
7118 { PREFIX_TABLE (PREFIX_VEX_EC) },
7119 { PREFIX_TABLE (PREFIX_VEX_ED) },
7120 { PREFIX_TABLE (PREFIX_VEX_EE) },
7121 { PREFIX_TABLE (PREFIX_VEX_EF) },
7122 /* f0 */
7123 { PREFIX_TABLE (PREFIX_VEX_F0) },
7124 { PREFIX_TABLE (PREFIX_VEX_F1) },
7125 { PREFIX_TABLE (PREFIX_VEX_F2) },
7126 { PREFIX_TABLE (PREFIX_VEX_F3) },
7127 { PREFIX_TABLE (PREFIX_VEX_F4) },
7128 { PREFIX_TABLE (PREFIX_VEX_F5) },
7129 { PREFIX_TABLE (PREFIX_VEX_F6) },
7130 { PREFIX_TABLE (PREFIX_VEX_F7) },
7131 /* f8 */
7132 { PREFIX_TABLE (PREFIX_VEX_F8) },
7133 { PREFIX_TABLE (PREFIX_VEX_F9) },
7134 { PREFIX_TABLE (PREFIX_VEX_FA) },
7135 { PREFIX_TABLE (PREFIX_VEX_FB) },
7136 { PREFIX_TABLE (PREFIX_VEX_FC) },
7137 { PREFIX_TABLE (PREFIX_VEX_FD) },
7138 { PREFIX_TABLE (PREFIX_VEX_FE) },
7139 { "(bad)", { XX } },
7141 /* VEX_0F38 */
7143 /* 00 */
7144 { PREFIX_TABLE (PREFIX_VEX_3800) },
7145 { PREFIX_TABLE (PREFIX_VEX_3801) },
7146 { PREFIX_TABLE (PREFIX_VEX_3802) },
7147 { PREFIX_TABLE (PREFIX_VEX_3803) },
7148 { PREFIX_TABLE (PREFIX_VEX_3804) },
7149 { PREFIX_TABLE (PREFIX_VEX_3805) },
7150 { PREFIX_TABLE (PREFIX_VEX_3806) },
7151 { PREFIX_TABLE (PREFIX_VEX_3807) },
7152 /* 08 */
7153 { PREFIX_TABLE (PREFIX_VEX_3808) },
7154 { PREFIX_TABLE (PREFIX_VEX_3809) },
7155 { PREFIX_TABLE (PREFIX_VEX_380A) },
7156 { PREFIX_TABLE (PREFIX_VEX_380B) },
7157 { PREFIX_TABLE (PREFIX_VEX_380C) },
7158 { PREFIX_TABLE (PREFIX_VEX_380D) },
7159 { PREFIX_TABLE (PREFIX_VEX_380E) },
7160 { PREFIX_TABLE (PREFIX_VEX_380F) },
7161 /* 10 */
7162 { "(bad)", { XX } },
7163 { "(bad)", { XX } },
7164 { "(bad)", { XX } },
7165 { "(bad)", { XX } },
7166 { "(bad)", { XX } },
7167 { "(bad)", { XX } },
7168 { "(bad)", { XX } },
7169 { PREFIX_TABLE (PREFIX_VEX_3817) },
7170 /* 18 */
7171 { PREFIX_TABLE (PREFIX_VEX_3818) },
7172 { PREFIX_TABLE (PREFIX_VEX_3819) },
7173 { PREFIX_TABLE (PREFIX_VEX_381A) },
7174 { "(bad)", { XX } },
7175 { PREFIX_TABLE (PREFIX_VEX_381C) },
7176 { PREFIX_TABLE (PREFIX_VEX_381D) },
7177 { PREFIX_TABLE (PREFIX_VEX_381E) },
7178 { "(bad)", { XX } },
7179 /* 20 */
7180 { PREFIX_TABLE (PREFIX_VEX_3820) },
7181 { PREFIX_TABLE (PREFIX_VEX_3821) },
7182 { PREFIX_TABLE (PREFIX_VEX_3822) },
7183 { PREFIX_TABLE (PREFIX_VEX_3823) },
7184 { PREFIX_TABLE (PREFIX_VEX_3824) },
7185 { PREFIX_TABLE (PREFIX_VEX_3825) },
7186 { "(bad)", { XX } },
7187 { "(bad)", { XX } },
7188 /* 28 */
7189 { PREFIX_TABLE (PREFIX_VEX_3828) },
7190 { PREFIX_TABLE (PREFIX_VEX_3829) },
7191 { PREFIX_TABLE (PREFIX_VEX_382A) },
7192 { PREFIX_TABLE (PREFIX_VEX_382B) },
7193 { PREFIX_TABLE (PREFIX_VEX_382C) },
7194 { PREFIX_TABLE (PREFIX_VEX_382D) },
7195 { PREFIX_TABLE (PREFIX_VEX_382E) },
7196 { PREFIX_TABLE (PREFIX_VEX_382F) },
7197 /* 30 */
7198 { PREFIX_TABLE (PREFIX_VEX_3830) },
7199 { PREFIX_TABLE (PREFIX_VEX_3831) },
7200 { PREFIX_TABLE (PREFIX_VEX_3832) },
7201 { PREFIX_TABLE (PREFIX_VEX_3833) },
7202 { PREFIX_TABLE (PREFIX_VEX_3834) },
7203 { PREFIX_TABLE (PREFIX_VEX_3835) },
7204 { "(bad)", { XX } },
7205 { PREFIX_TABLE (PREFIX_VEX_3837) },
7206 /* 38 */
7207 { PREFIX_TABLE (PREFIX_VEX_3838) },
7208 { PREFIX_TABLE (PREFIX_VEX_3839) },
7209 { PREFIX_TABLE (PREFIX_VEX_383A) },
7210 { PREFIX_TABLE (PREFIX_VEX_383B) },
7211 { PREFIX_TABLE (PREFIX_VEX_383C) },
7212 { PREFIX_TABLE (PREFIX_VEX_383D) },
7213 { PREFIX_TABLE (PREFIX_VEX_383E) },
7214 { PREFIX_TABLE (PREFIX_VEX_383F) },
7215 /* 40 */
7216 { PREFIX_TABLE (PREFIX_VEX_3840) },
7217 { PREFIX_TABLE (PREFIX_VEX_3841) },
7218 { "(bad)", { XX } },
7219 { "(bad)", { XX } },
7220 { "(bad)", { XX } },
7221 { "(bad)", { XX } },
7222 { "(bad)", { XX } },
7223 { "(bad)", { XX } },
7224 /* 48 */
7225 { "(bad)", { XX } },
7226 { "(bad)", { XX } },
7227 { "(bad)", { XX } },
7228 { "(bad)", { XX } },
7229 { "(bad)", { XX } },
7230 { "(bad)", { XX } },
7231 { "(bad)", { XX } },
7232 { "(bad)", { XX } },
7233 /* 50 */
7234 { "(bad)", { XX } },
7235 { "(bad)", { XX } },
7236 { "(bad)", { XX } },
7237 { "(bad)", { XX } },
7238 { "(bad)", { XX } },
7239 { "(bad)", { XX } },
7240 { "(bad)", { XX } },
7241 { "(bad)", { XX } },
7242 /* 58 */
7243 { "(bad)", { XX } },
7244 { "(bad)", { XX } },
7245 { "(bad)", { XX } },
7246 { "(bad)", { XX } },
7247 { "(bad)", { XX } },
7248 { "(bad)", { XX } },
7249 { "(bad)", { XX } },
7250 { "(bad)", { XX } },
7251 /* 60 */
7252 { "(bad)", { XX } },
7253 { "(bad)", { XX } },
7254 { "(bad)", { XX } },
7255 { "(bad)", { XX } },
7256 { "(bad)", { XX } },
7257 { "(bad)", { XX } },
7258 { "(bad)", { XX } },
7259 { "(bad)", { XX } },
7260 /* 68 */
7261 { "(bad)", { XX } },
7262 { "(bad)", { XX } },
7263 { "(bad)", { XX } },
7264 { "(bad)", { XX } },
7265 { "(bad)", { XX } },
7266 { "(bad)", { XX } },
7267 { "(bad)", { XX } },
7268 { "(bad)", { XX } },
7269 /* 70 */
7270 { "(bad)", { XX } },
7271 { "(bad)", { XX } },
7272 { "(bad)", { XX } },
7273 { "(bad)", { XX } },
7274 { "(bad)", { XX } },
7275 { "(bad)", { XX } },
7276 { "(bad)", { XX } },
7277 { "(bad)", { XX } },
7278 /* 78 */
7279 { "(bad)", { XX } },
7280 { "(bad)", { XX } },
7281 { "(bad)", { XX } },
7282 { "(bad)", { XX } },
7283 { "(bad)", { XX } },
7284 { "(bad)", { XX } },
7285 { "(bad)", { XX } },
7286 { "(bad)", { XX } },
7287 /* 80 */
7288 { "(bad)", { XX } },
7289 { "(bad)", { XX } },
7290 { "(bad)", { XX } },
7291 { "(bad)", { XX } },
7292 { "(bad)", { XX } },
7293 { "(bad)", { XX } },
7294 { "(bad)", { XX } },
7295 { "(bad)", { XX } },
7296 /* 88 */
7297 { "(bad)", { XX } },
7298 { "(bad)", { XX } },
7299 { "(bad)", { XX } },
7300 { "(bad)", { XX } },
7301 { "(bad)", { XX } },
7302 { "(bad)", { XX } },
7303 { "(bad)", { XX } },
7304 { "(bad)", { XX } },
7305 /* 90 */
7306 { "(bad)", { XX } },
7307 { "(bad)", { XX } },
7308 { "(bad)", { XX } },
7309 { "(bad)", { XX } },
7310 { "(bad)", { XX } },
7311 { "(bad)", { XX } },
7312 { "(bad)", { XX } },
7313 { "(bad)", { XX } },
7314 /* 98 */
7315 { "(bad)", { XX } },
7316 { "(bad)", { XX } },
7317 { "(bad)", { XX } },
7318 { "(bad)", { XX } },
7319 { "(bad)", { XX } },
7320 { "(bad)", { XX } },
7321 { "(bad)", { XX } },
7322 { "(bad)", { XX } },
7323 /* a0 */
7324 { "(bad)", { XX } },
7325 { "(bad)", { XX } },
7326 { "(bad)", { XX } },
7327 { "(bad)", { XX } },
7328 { "(bad)", { XX } },
7329 { "(bad)", { XX } },
7330 { "(bad)", { XX } },
7331 { "(bad)", { XX } },
7332 /* a8 */
7333 { "(bad)", { XX } },
7334 { "(bad)", { XX } },
7335 { "(bad)", { XX } },
7336 { "(bad)", { XX } },
7337 { "(bad)", { XX } },
7338 { "(bad)", { XX } },
7339 { "(bad)", { XX } },
7340 { "(bad)", { XX } },
7341 /* b0 */
7342 { "(bad)", { XX } },
7343 { "(bad)", { XX } },
7344 { "(bad)", { XX } },
7345 { "(bad)", { XX } },
7346 { "(bad)", { XX } },
7347 { "(bad)", { XX } },
7348 { "(bad)", { XX } },
7349 { "(bad)", { XX } },
7350 /* b8 */
7351 { "(bad)", { XX } },
7352 { "(bad)", { XX } },
7353 { "(bad)", { XX } },
7354 { "(bad)", { XX } },
7355 { "(bad)", { XX } },
7356 { "(bad)", { XX } },
7357 { "(bad)", { XX } },
7358 { "(bad)", { XX } },
7359 /* c0 */
7360 { "(bad)", { XX } },
7361 { "(bad)", { XX } },
7362 { "(bad)", { XX } },
7363 { "(bad)", { XX } },
7364 { "(bad)", { XX } },
7365 { "(bad)", { XX } },
7366 { "(bad)", { XX } },
7367 { "(bad)", { XX } },
7368 /* c8 */
7369 { "(bad)", { XX } },
7370 { "(bad)", { XX } },
7371 { "(bad)", { XX } },
7372 { "(bad)", { XX } },
7373 { "(bad)", { XX } },
7374 { "(bad)", { XX } },
7375 { "(bad)", { XX } },
7376 { "(bad)", { XX } },
7377 /* d0 */
7378 { "(bad)", { XX } },
7379 { "(bad)", { XX } },
7380 { "(bad)", { XX } },
7381 { "(bad)", { XX } },
7382 { "(bad)", { XX } },
7383 { "(bad)", { XX } },
7384 { "(bad)", { XX } },
7385 { "(bad)", { XX } },
7386 /* d8 */
7387 { "(bad)", { XX } },
7388 { "(bad)", { XX } },
7389 { "(bad)", { XX } },
7390 { "(bad)", { XX } },
7391 { "(bad)", { XX } },
7392 { "(bad)", { XX } },
7393 { "(bad)", { XX } },
7394 { "(bad)", { XX } },
7395 /* e0 */
7396 { "(bad)", { XX } },
7397 { "(bad)", { XX } },
7398 { "(bad)", { XX } },
7399 { "(bad)", { XX } },
7400 { "(bad)", { XX } },
7401 { "(bad)", { XX } },
7402 { "(bad)", { XX } },
7403 { "(bad)", { XX } },
7404 /* e8 */
7405 { "(bad)", { XX } },
7406 { "(bad)", { XX } },
7407 { "(bad)", { XX } },
7408 { "(bad)", { XX } },
7409 { "(bad)", { XX } },
7410 { "(bad)", { XX } },
7411 { "(bad)", { XX } },
7412 { "(bad)", { XX } },
7413 /* f0 */
7414 { "(bad)", { XX } },
7415 { "(bad)", { XX } },
7416 { "(bad)", { XX } },
7417 { "(bad)", { XX } },
7418 { "(bad)", { XX } },
7419 { "(bad)", { XX } },
7420 { "(bad)", { XX } },
7421 { "(bad)", { XX } },
7422 /* f8 */
7423 { "(bad)", { XX } },
7424 { "(bad)", { XX } },
7425 { "(bad)", { XX } },
7426 { "(bad)", { XX } },
7427 { "(bad)", { XX } },
7428 { "(bad)", { XX } },
7429 { "(bad)", { XX } },
7430 { "(bad)", { XX } },
7432 /* VEX_0F3A */
7434 /* 00 */
7435 { "(bad)", { XX } },
7436 { "(bad)", { XX } },
7437 { "(bad)", { XX } },
7438 { "(bad)", { XX } },
7439 { PREFIX_TABLE (PREFIX_VEX_3A04) },
7440 { PREFIX_TABLE (PREFIX_VEX_3A05) },
7441 { PREFIX_TABLE (PREFIX_VEX_3A06) },
7442 { "(bad)", { XX } },
7443 /* 08 */
7444 { PREFIX_TABLE (PREFIX_VEX_3A08) },
7445 { PREFIX_TABLE (PREFIX_VEX_3A09) },
7446 { PREFIX_TABLE (PREFIX_VEX_3A0A) },
7447 { PREFIX_TABLE (PREFIX_VEX_3A0B) },
7448 { PREFIX_TABLE (PREFIX_VEX_3A0C) },
7449 { PREFIX_TABLE (PREFIX_VEX_3A0D) },
7450 { PREFIX_TABLE (PREFIX_VEX_3A0E) },
7451 { PREFIX_TABLE (PREFIX_VEX_3A0F) },
7452 /* 10 */
7453 { "(bad)", { XX } },
7454 { "(bad)", { XX } },
7455 { "(bad)", { XX } },
7456 { "(bad)", { XX } },
7457 { PREFIX_TABLE (PREFIX_VEX_3A14) },
7458 { PREFIX_TABLE (PREFIX_VEX_3A15) },
7459 { PREFIX_TABLE (PREFIX_VEX_3A16) },
7460 { PREFIX_TABLE (PREFIX_VEX_3A17) },
7461 /* 18 */
7462 { PREFIX_TABLE (PREFIX_VEX_3A18) },
7463 { PREFIX_TABLE (PREFIX_VEX_3A19) },
7464 { "(bad)", { XX } },
7465 { "(bad)", { XX } },
7466 { "(bad)", { XX } },
7467 { "(bad)", { XX } },
7468 { "(bad)", { XX } },
7469 { "(bad)", { XX } },
7470 /* 20 */
7471 { PREFIX_TABLE (PREFIX_VEX_3A20) },
7472 { PREFIX_TABLE (PREFIX_VEX_3A21) },
7473 { PREFIX_TABLE (PREFIX_VEX_3A22) },
7474 { "(bad)", { XX } },
7475 { "(bad)", { XX } },
7476 { "(bad)", { XX } },
7477 { "(bad)", { XX } },
7478 { "(bad)", { XX } },
7479 /* 28 */
7480 { "(bad)", { XX } },
7481 { "(bad)", { XX } },
7482 { "(bad)", { XX } },
7483 { "(bad)", { XX } },
7484 { "(bad)", { XX } },
7485 { "(bad)", { XX } },
7486 { "(bad)", { XX } },
7487 { "(bad)", { XX } },
7488 /* 30 */
7489 { "(bad)", { XX } },
7490 { "(bad)", { XX } },
7491 { "(bad)", { XX } },
7492 { "(bad)", { XX } },
7493 { "(bad)", { XX } },
7494 { "(bad)", { XX } },
7495 { "(bad)", { XX } },
7496 { "(bad)", { XX } },
7497 /* 38 */
7498 { "(bad)", { XX } },
7499 { "(bad)", { XX } },
7500 { "(bad)", { XX } },
7501 { "(bad)", { XX } },
7502 { "(bad)", { XX } },
7503 { "(bad)", { XX } },
7504 { "(bad)", { XX } },
7505 { "(bad)", { XX } },
7506 /* 40 */
7507 { PREFIX_TABLE (PREFIX_VEX_3A40) },
7508 { PREFIX_TABLE (PREFIX_VEX_3A41) },
7509 { PREFIX_TABLE (PREFIX_VEX_3A42) },
7510 { "(bad)", { XX } },
7511 { "(bad)", { XX } },
7512 { "(bad)", { XX } },
7513 { "(bad)", { XX } },
7514 { "(bad)", { XX } },
7515 /* 48 */
7516 { PREFIX_TABLE (PREFIX_VEX_3A48) },
7517 { PREFIX_TABLE (PREFIX_VEX_3A49) },
7518 { PREFIX_TABLE (PREFIX_VEX_3A4A) },
7519 { PREFIX_TABLE (PREFIX_VEX_3A4B) },
7520 { PREFIX_TABLE (PREFIX_VEX_3A4C) },
7521 { "(bad)", { XX } },
7522 { "(bad)", { XX } },
7523 { "(bad)", { XX } },
7524 /* 50 */
7525 { "(bad)", { XX } },
7526 { "(bad)", { XX } },
7527 { "(bad)", { XX } },
7528 { "(bad)", { XX } },
7529 { "(bad)", { XX } },
7530 { "(bad)", { XX } },
7531 { "(bad)", { XX } },
7532 { "(bad)", { XX } },
7533 /* 58 */
7534 { "(bad)", { XX } },
7535 { "(bad)", { XX } },
7536 { "(bad)", { XX } },
7537 { "(bad)", { XX } },
7538 { PREFIX_TABLE (PREFIX_VEX_3A5C) },
7539 { PREFIX_TABLE (PREFIX_VEX_3A5D) },
7540 { PREFIX_TABLE (PREFIX_VEX_3A5E) },
7541 { PREFIX_TABLE (PREFIX_VEX_3A5F) },
7542 /* 60 */
7543 { PREFIX_TABLE (PREFIX_VEX_3A60) },
7544 { PREFIX_TABLE (PREFIX_VEX_3A61) },
7545 { PREFIX_TABLE (PREFIX_VEX_3A62) },
7546 { PREFIX_TABLE (PREFIX_VEX_3A63) },
7547 { "(bad)", { XX } },
7548 { "(bad)", { XX } },
7549 { "(bad)", { XX } },
7550 { "(bad)", { XX } },
7551 /* 68 */
7552 { PREFIX_TABLE (PREFIX_VEX_3A68) },
7553 { PREFIX_TABLE (PREFIX_VEX_3A69) },
7554 { PREFIX_TABLE (PREFIX_VEX_3A6A) },
7555 { PREFIX_TABLE (PREFIX_VEX_3A6B) },
7556 { PREFIX_TABLE (PREFIX_VEX_3A6C) },
7557 { PREFIX_TABLE (PREFIX_VEX_3A6D) },
7558 { PREFIX_TABLE (PREFIX_VEX_3A6E) },
7559 { PREFIX_TABLE (PREFIX_VEX_3A6F) },
7560 /* 70 */
7561 { "(bad)", { XX } },
7562 { "(bad)", { XX } },
7563 { "(bad)", { XX } },
7564 { "(bad)", { XX } },
7565 { "(bad)", { XX } },
7566 { "(bad)", { XX } },
7567 { "(bad)", { XX } },
7568 { "(bad)", { XX } },
7569 /* 78 */
7570 { PREFIX_TABLE (PREFIX_VEX_3A78) },
7571 { PREFIX_TABLE (PREFIX_VEX_3A79) },
7572 { PREFIX_TABLE (PREFIX_VEX_3A7A) },
7573 { PREFIX_TABLE (PREFIX_VEX_3A7B) },
7574 { PREFIX_TABLE (PREFIX_VEX_3A7C) },
7575 { PREFIX_TABLE (PREFIX_VEX_3A7D) },
7576 { PREFIX_TABLE (PREFIX_VEX_3A7E) },
7577 { PREFIX_TABLE (PREFIX_VEX_3A7F) },
7578 /* 80 */
7579 { "(bad)", { XX } },
7580 { "(bad)", { XX } },
7581 { "(bad)", { XX } },
7582 { "(bad)", { XX } },
7583 { "(bad)", { XX } },
7584 { "(bad)", { XX } },
7585 { "(bad)", { XX } },
7586 { "(bad)", { XX } },
7587 /* 88 */
7588 { "(bad)", { XX } },
7589 { "(bad)", { XX } },
7590 { "(bad)", { XX } },
7591 { "(bad)", { XX } },
7592 { "(bad)", { XX } },
7593 { "(bad)", { XX } },
7594 { "(bad)", { XX } },
7595 { "(bad)", { XX } },
7596 /* 90 */
7597 { "(bad)", { XX } },
7598 { "(bad)", { XX } },
7599 { "(bad)", { XX } },
7600 { "(bad)", { XX } },
7601 { "(bad)", { XX } },
7602 { "(bad)", { XX } },
7603 { "(bad)", { XX } },
7604 { "(bad)", { XX } },
7605 /* 98 */
7606 { "(bad)", { XX } },
7607 { "(bad)", { XX } },
7608 { "(bad)", { XX } },
7609 { "(bad)", { XX } },
7610 { "(bad)", { XX } },
7611 { "(bad)", { XX } },
7612 { "(bad)", { XX } },
7613 { "(bad)", { XX } },
7614 /* a0 */
7615 { "(bad)", { XX } },
7616 { "(bad)", { XX } },
7617 { "(bad)", { XX } },
7618 { "(bad)", { XX } },
7619 { "(bad)", { XX } },
7620 { "(bad)", { XX } },
7621 { "(bad)", { XX } },
7622 { "(bad)", { XX } },
7623 /* a8 */
7624 { "(bad)", { XX } },
7625 { "(bad)", { XX } },
7626 { "(bad)", { XX } },
7627 { "(bad)", { XX } },
7628 { "(bad)", { XX } },
7629 { "(bad)", { XX } },
7630 { "(bad)", { XX } },
7631 { "(bad)", { XX } },
7632 /* b0 */
7633 { "(bad)", { XX } },
7634 { "(bad)", { XX } },
7635 { "(bad)", { XX } },
7636 { "(bad)", { XX } },
7637 { "(bad)", { XX } },
7638 { "(bad)", { XX } },
7639 { "(bad)", { XX } },
7640 { "(bad)", { XX } },
7641 /* b8 */
7642 { "(bad)", { XX } },
7643 { "(bad)", { XX } },
7644 { "(bad)", { XX } },
7645 { "(bad)", { XX } },
7646 { "(bad)", { XX } },
7647 { "(bad)", { XX } },
7648 { "(bad)", { XX } },
7649 { "(bad)", { XX } },
7650 /* c0 */
7651 { "(bad)", { XX } },
7652 { "(bad)", { XX } },
7653 { "(bad)", { XX } },
7654 { "(bad)", { XX } },
7655 { "(bad)", { XX } },
7656 { "(bad)", { XX } },
7657 { "(bad)", { XX } },
7658 { "(bad)", { XX } },
7659 /* c8 */
7660 { "(bad)", { XX } },
7661 { "(bad)", { XX } },
7662 { "(bad)", { XX } },
7663 { "(bad)", { XX } },
7664 { "(bad)", { XX } },
7665 { "(bad)", { XX } },
7666 { "(bad)", { XX } },
7667 { "(bad)", { XX } },
7668 /* d0 */
7669 { "(bad)", { XX } },
7670 { "(bad)", { XX } },
7671 { "(bad)", { XX } },
7672 { "(bad)", { XX } },
7673 { "(bad)", { XX } },
7674 { "(bad)", { XX } },
7675 { "(bad)", { XX } },
7676 { "(bad)", { XX } },
7677 /* d8 */
7678 { "(bad)", { XX } },
7679 { "(bad)", { XX } },
7680 { "(bad)", { XX } },
7681 { "(bad)", { XX } },
7682 { "(bad)", { XX } },
7683 { "(bad)", { XX } },
7684 { "(bad)", { XX } },
7685 { "(bad)", { XX } },
7686 /* e0 */
7687 { "(bad)", { XX } },
7688 { "(bad)", { XX } },
7689 { "(bad)", { XX } },
7690 { "(bad)", { XX } },
7691 { "(bad)", { XX } },
7692 { "(bad)", { XX } },
7693 { "(bad)", { XX } },
7694 { "(bad)", { XX } },
7695 /* e8 */
7696 { "(bad)", { XX } },
7697 { "(bad)", { XX } },
7698 { "(bad)", { XX } },
7699 { "(bad)", { XX } },
7700 { "(bad)", { XX } },
7701 { "(bad)", { XX } },
7702 { "(bad)", { XX } },
7703 { "(bad)", { XX } },
7704 /* f0 */
7705 { "(bad)", { XX } },
7706 { "(bad)", { XX } },
7707 { "(bad)", { XX } },
7708 { "(bad)", { XX } },
7709 { "(bad)", { XX } },
7710 { "(bad)", { XX } },
7711 { "(bad)", { XX } },
7712 { "(bad)", { XX } },
7713 /* f8 */
7714 { "(bad)", { XX } },
7715 { "(bad)", { XX } },
7716 { "(bad)", { XX } },
7717 { "(bad)", { XX } },
7718 { "(bad)", { XX } },
7719 { "(bad)", { XX } },
7720 { "(bad)", { XX } },
7721 { "(bad)", { XX } },
7725 static const struct dis386 vex_len_table[][2] = {
7726 /* VEX_LEN_10_P_1 */
7728 { "vmovss", { XMVex, Vex128, EXd } },
7729 { "(bad)", { XX } },
7732 /* VEX_LEN_10_P_3 */
7734 { "vmovsd", { XMVex, Vex128, EXq } },
7735 { "(bad)", { XX } },
7738 /* VEX_LEN_11_P_1 */
7740 { "vmovss", { EXdVex, Vex128, XM } },
7741 { "(bad)", { XX } },
7744 /* VEX_LEN_11_P_3 */
7746 { "vmovsd", { EXqVex, Vex128, XM } },
7747 { "(bad)", { XX } },
7750 /* VEX_LEN_12_P_0_M_0 */
7752 { "vmovlps", { XM, Vex128, EXq } },
7753 { "(bad)", { XX } },
7756 /* VEX_LEN_12_P_0_M_1 */
7758 { "vmovhlps", { XM, Vex128, EXq } },
7759 { "(bad)", { XX } },
7762 /* VEX_LEN_12_P_2 */
7764 { "vmovlpd", { XM, Vex128, EXq } },
7765 { "(bad)", { XX } },
7768 /* VEX_LEN_13_M_0 */
7770 { "vmovlpX", { EXq, XM } },
7771 { "(bad)", { XX } },
7774 /* VEX_LEN_16_P_0_M_0 */
7776 { "vmovhps", { XM, Vex128, EXq } },
7777 { "(bad)", { XX } },
7780 /* VEX_LEN_16_P_0_M_1 */
7782 { "vmovlhps", { XM, Vex128, EXq } },
7783 { "(bad)", { XX } },
7786 /* VEX_LEN_16_P_2 */
7788 { "vmovhpd", { XM, Vex128, EXq } },
7789 { "(bad)", { XX } },
7792 /* VEX_LEN_17_M_0 */
7794 { "vmovhpX", { EXq, XM } },
7795 { "(bad)", { XX } },
7798 /* VEX_LEN_2A_P_1 */
7800 { "vcvtsi2ss%LQ", { XM, Vex128, Ev } },
7801 { "(bad)", { XX } },
7804 /* VEX_LEN_2A_P_3 */
7806 { "vcvtsi2sd%LQ", { XM, Vex128, Ev } },
7807 { "(bad)", { XX } },
7810 /* VEX_LEN_2B_M_0 */
7812 { "vmovntpX", { Mx, XM } },
7813 { "(bad)", { XX } },
7816 /* VEX_LEN_2C_P_1 */
7818 { "vcvttss2siY", { Gv, EXd } },
7819 { "(bad)", { XX } },
7822 /* VEX_LEN_2C_P_3 */
7824 { "vcvttsd2siY", { Gv, EXq } },
7825 { "(bad)", { XX } },
7828 /* VEX_LEN_2D_P_1 */
7830 { "vcvtss2siY", { Gv, EXd } },
7831 { "(bad)", { XX } },
7834 /* VEX_LEN_2D_P_3 */
7836 { "vcvtsd2siY", { Gv, EXq } },
7837 { "(bad)", { XX } },
7840 /* VEX_LEN_2E_P_0 */
7842 { "vucomiss", { XM, EXd } },
7843 { "(bad)", { XX } },
7846 /* VEX_LEN_2E_P_2 */
7848 { "vucomisd", { XM, EXq } },
7849 { "(bad)", { XX } },
7852 /* VEX_LEN_2F_P_0 */
7854 { "vcomiss", { XM, EXd } },
7855 { "(bad)", { XX } },
7858 /* VEX_LEN_2F_P_2 */
7860 { "vcomisd", { XM, EXq } },
7861 { "(bad)", { XX } },
7864 /* VEX_LEN_51_P_1 */
7866 { "vsqrtss", { XM, Vex128, EXd } },
7867 { "(bad)", { XX } },
7870 /* VEX_LEN_51_P_3 */
7872 { "vsqrtsd", { XM, Vex128, EXq } },
7873 { "(bad)", { XX } },
7876 /* VEX_LEN_52_P_1 */
7878 { "vrsqrtss", { XM, Vex128, EXd } },
7879 { "(bad)", { XX } },
7882 /* VEX_LEN_53_P_1 */
7884 { "vrcpss", { XM, Vex128, EXd } },
7885 { "(bad)", { XX } },
7888 /* VEX_LEN_58_P_1 */
7890 { "vaddss", { XM, Vex128, EXd } },
7891 { "(bad)", { XX } },
7894 /* VEX_LEN_58_P_3 */
7896 { "vaddsd", { XM, Vex128, EXq } },
7897 { "(bad)", { XX } },
7900 /* VEX_LEN_59_P_1 */
7902 { "vmulss", { XM, Vex128, EXd } },
7903 { "(bad)", { XX } },
7906 /* VEX_LEN_59_P_3 */
7908 { "vmulsd", { XM, Vex128, EXq } },
7909 { "(bad)", { XX } },
7912 /* VEX_LEN_5A_P_1 */
7914 { "vcvtss2sd", { XM, Vex128, EXd } },
7915 { "(bad)", { XX } },
7918 /* VEX_LEN_5A_P_3 */
7920 { "vcvtsd2ss", { XM, Vex128, EXq } },
7921 { "(bad)", { XX } },
7924 /* VEX_LEN_5C_P_1 */
7926 { "vsubss", { XM, Vex128, EXd } },
7927 { "(bad)", { XX } },
7930 /* VEX_LEN_5C_P_3 */
7932 { "vsubsd", { XM, Vex128, EXq } },
7933 { "(bad)", { XX } },
7936 /* VEX_LEN_5D_P_1 */
7938 { "vminss", { XM, Vex128, EXd } },
7939 { "(bad)", { XX } },
7942 /* VEX_LEN_5D_P_3 */
7944 { "vminsd", { XM, Vex128, EXq } },
7945 { "(bad)", { XX } },
7948 /* VEX_LEN_5E_P_1 */
7950 { "vdivss", { XM, Vex128, EXd } },
7951 { "(bad)", { XX } },
7954 /* VEX_LEN_5E_P_3 */
7956 { "vdivsd", { XM, Vex128, EXq } },
7957 { "(bad)", { XX } },
7960 /* VEX_LEN_5F_P_1 */
7962 { "vmaxss", { XM, Vex128, EXd } },
7963 { "(bad)", { XX } },
7966 /* VEX_LEN_5F_P_3 */
7968 { "vmaxsd", { XM, Vex128, EXq } },
7969 { "(bad)", { XX } },
7972 /* VEX_LEN_60_P_2 */
7974 { "vpunpcklbw", { XM, Vex128, EXx } },
7975 { "(bad)", { XX } },
7978 /* VEX_LEN_61_P_2 */
7980 { "vpunpcklwd", { XM, Vex128, EXx } },
7981 { "(bad)", { XX } },
7984 /* VEX_LEN_62_P_2 */
7986 { "vpunpckldq", { XM, Vex128, EXx } },
7987 { "(bad)", { XX } },
7990 /* VEX_LEN_63_P_2 */
7992 { "vpacksswb", { XM, Vex128, EXx } },
7993 { "(bad)", { XX } },
7996 /* VEX_LEN_64_P_2 */
7998 { "vpcmpgtb", { XM, Vex128, EXx } },
7999 { "(bad)", { XX } },
8002 /* VEX_LEN_65_P_2 */
8004 { "vpcmpgtw", { XM, Vex128, EXx } },
8005 { "(bad)", { XX } },
8008 /* VEX_LEN_66_P_2 */
8010 { "vpcmpgtd", { XM, Vex128, EXx } },
8011 { "(bad)", { XX } },
8014 /* VEX_LEN_67_P_2 */
8016 { "vpackuswb", { XM, Vex128, EXx } },
8017 { "(bad)", { XX } },
8020 /* VEX_LEN_68_P_2 */
8022 { "vpunpckhbw", { XM, Vex128, EXx } },
8023 { "(bad)", { XX } },
8026 /* VEX_LEN_69_P_2 */
8028 { "vpunpckhwd", { XM, Vex128, EXx } },
8029 { "(bad)", { XX } },
8032 /* VEX_LEN_6A_P_2 */
8034 { "vpunpckhdq", { XM, Vex128, EXx } },
8035 { "(bad)", { XX } },
8038 /* VEX_LEN_6B_P_2 */
8040 { "vpackssdw", { XM, Vex128, EXx } },
8041 { "(bad)", { XX } },
8044 /* VEX_LEN_6C_P_2 */
8046 { "vpunpcklqdq", { XM, Vex128, EXx } },
8047 { "(bad)", { XX } },
8050 /* VEX_LEN_6D_P_2 */
8052 { "vpunpckhqdq", { XM, Vex128, EXx } },
8053 { "(bad)", { XX } },
8056 /* VEX_LEN_6E_P_2 */
8058 { "vmovK", { XM, Edq } },
8059 { "(bad)", { XX } },
8062 /* VEX_LEN_70_P_1 */
8064 { "vpshufhw", { XM, EXx, Ib } },
8065 { "(bad)", { XX } },
8068 /* VEX_LEN_70_P_2 */
8070 { "vpshufd", { XM, EXx, Ib } },
8071 { "(bad)", { XX } },
8074 /* VEX_LEN_70_P_3 */
8076 { "vpshuflw", { XM, EXx, Ib } },
8077 { "(bad)", { XX } },
8080 /* VEX_LEN_71_R_2_P_2 */
8082 { "vpsrlw", { Vex128, XS, Ib } },
8083 { "(bad)", { XX } },
8086 /* VEX_LEN_71_R_4_P_2 */
8088 { "vpsraw", { Vex128, XS, Ib } },
8089 { "(bad)", { XX } },
8092 /* VEX_LEN_71_R_6_P_2 */
8094 { "vpsllw", { Vex128, XS, Ib } },
8095 { "(bad)", { XX } },
8098 /* VEX_LEN_72_R_2_P_2 */
8100 { "vpsrld", { Vex128, XS, Ib } },
8101 { "(bad)", { XX } },
8104 /* VEX_LEN_72_R_4_P_2 */
8106 { "vpsrad", { Vex128, XS, Ib } },
8107 { "(bad)", { XX } },
8110 /* VEX_LEN_72_R_6_P_2 */
8112 { "vpslld", { Vex128, XS, Ib } },
8113 { "(bad)", { XX } },
8116 /* VEX_LEN_73_R_2_P_2 */
8118 { "vpsrlq", { Vex128, XS, Ib } },
8119 { "(bad)", { XX } },
8122 /* VEX_LEN_73_R_3_P_2 */
8124 { "vpsrldq", { Vex128, XS, Ib } },
8125 { "(bad)", { XX } },
8128 /* VEX_LEN_73_R_6_P_2 */
8130 { "vpsllq", { Vex128, XS, Ib } },
8131 { "(bad)", { XX } },
8134 /* VEX_LEN_73_R_7_P_2 */
8136 { "vpslldq", { Vex128, XS, Ib } },
8137 { "(bad)", { XX } },
8140 /* VEX_LEN_74_P_2 */
8142 { "vpcmpeqb", { XM, Vex128, EXx } },
8143 { "(bad)", { XX } },
8146 /* VEX_LEN_75_P_2 */
8148 { "vpcmpeqw", { XM, Vex128, EXx } },
8149 { "(bad)", { XX } },
8152 /* VEX_LEN_76_P_2 */
8154 { "vpcmpeqd", { XM, Vex128, EXx } },
8155 { "(bad)", { XX } },
8158 /* VEX_LEN_7E_P_1 */
8160 { "vmovq", { XM, EXq } },
8161 { "(bad)", { XX } },
8164 /* VEX_LEN_7E_P_2 */
8166 { "vmovK", { Edq, XM } },
8167 { "(bad)", { XX } },
8170 /* VEX_LEN_AE_R_2_M0 */
8172 { "vldmxcsr", { Md } },
8173 { "(bad)", { XX } },
8176 /* VEX_LEN_AE_R_3_M0 */
8178 { "vstmxcsr", { Md } },
8179 { "(bad)", { XX } },
8182 /* VEX_LEN_C2_P_1 */
8184 { "vcmpss", { XM, Vex128, EXd, VCMP } },
8185 { "(bad)", { XX } },
8188 /* VEX_LEN_C2_P_3 */
8190 { "vcmpsd", { XM, Vex128, EXq, VCMP } },
8191 { "(bad)", { XX } },
8194 /* VEX_LEN_C4_P_2 */
8196 { "vpinsrw", { XM, Vex128, Edqw, Ib } },
8197 { "(bad)", { XX } },
8200 /* VEX_LEN_C5_P_2 */
8202 { "vpextrw", { Gdq, XS, Ib } },
8203 { "(bad)", { XX } },
8206 /* VEX_LEN_D1_P_2 */
8208 { "vpsrlw", { XM, Vex128, EXx } },
8209 { "(bad)", { XX } },
8212 /* VEX_LEN_D2_P_2 */
8214 { "vpsrld", { XM, Vex128, EXx } },
8215 { "(bad)", { XX } },
8218 /* VEX_LEN_D3_P_2 */
8220 { "vpsrlq", { XM, Vex128, EXx } },
8221 { "(bad)", { XX } },
8224 /* VEX_LEN_D4_P_2 */
8226 { "vpaddq", { XM, Vex128, EXx } },
8227 { "(bad)", { XX } },
8230 /* VEX_LEN_D5_P_2 */
8232 { "vpmullw", { XM, Vex128, EXx } },
8233 { "(bad)", { XX } },
8236 /* VEX_LEN_D6_P_2 */
8238 { "vmovq", { EXq, XM } },
8239 { "(bad)", { XX } },
8242 /* VEX_LEN_D7_P_2_M_1 */
8244 { "vpmovmskb", { Gdq, XS } },
8245 { "(bad)", { XX } },
8248 /* VEX_LEN_D8_P_2 */
8250 { "vpsubusb", { XM, Vex128, EXx } },
8251 { "(bad)", { XX } },
8254 /* VEX_LEN_D9_P_2 */
8256 { "vpsubusw", { XM, Vex128, EXx } },
8257 { "(bad)", { XX } },
8260 /* VEX_LEN_DA_P_2 */
8262 { "vpminub", { XM, Vex128, EXx } },
8263 { "(bad)", { XX } },
8266 /* VEX_LEN_DB_P_2 */
8268 { "vpand", { XM, Vex128, EXx } },
8269 { "(bad)", { XX } },
8272 /* VEX_LEN_DC_P_2 */
8274 { "vpaddusb", { XM, Vex128, EXx } },
8275 { "(bad)", { XX } },
8278 /* VEX_LEN_DD_P_2 */
8280 { "vpaddusw", { XM, Vex128, EXx } },
8281 { "(bad)", { XX } },
8284 /* VEX_LEN_DE_P_2 */
8286 { "vpmaxub", { XM, Vex128, EXx } },
8287 { "(bad)", { XX } },
8290 /* VEX_LEN_DF_P_2 */
8292 { "vpandn", { XM, Vex128, EXx } },
8293 { "(bad)", { XX } },
8296 /* VEX_LEN_E0_P_2 */
8298 { "vpavgb", { XM, Vex128, EXx } },
8299 { "(bad)", { XX } },
8302 /* VEX_LEN_E1_P_2 */
8304 { "vpsraw", { XM, Vex128, EXx } },
8305 { "(bad)", { XX } },
8308 /* VEX_LEN_E2_P_2 */
8310 { "vpsrad", { XM, Vex128, EXx } },
8311 { "(bad)", { XX } },
8314 /* VEX_LEN_E3_P_2 */
8316 { "vpavgw", { XM, Vex128, EXx } },
8317 { "(bad)", { XX } },
8320 /* VEX_LEN_E4_P_2 */
8322 { "vpmulhuw", { XM, Vex128, EXx } },
8323 { "(bad)", { XX } },
8326 /* VEX_LEN_E5_P_2 */
8328 { "vpmulhw", { XM, Vex128, EXx } },
8329 { "(bad)", { XX } },
8332 /* VEX_LEN_E7_P_2_M_0 */
8334 { "vmovntdq", { Mx, XM } },
8335 { "(bad)", { XX } },
8338 /* VEX_LEN_E8_P_2 */
8340 { "vpsubsb", { XM, Vex128, EXx } },
8341 { "(bad)", { XX } },
8344 /* VEX_LEN_E9_P_2 */
8346 { "vpsubsw", { XM, Vex128, EXx } },
8347 { "(bad)", { XX } },
8350 /* VEX_LEN_EA_P_2 */
8352 { "vpminsw", { XM, Vex128, EXx } },
8353 { "(bad)", { XX } },
8356 /* VEX_LEN_EB_P_2 */
8358 { "vpor", { XM, Vex128, EXx } },
8359 { "(bad)", { XX } },
8362 /* VEX_LEN_EC_P_2 */
8364 { "vpaddsb", { XM, Vex128, EXx } },
8365 { "(bad)", { XX } },
8368 /* VEX_LEN_ED_P_2 */
8370 { "vpaddsw", { XM, Vex128, EXx } },
8371 { "(bad)", { XX } },
8374 /* VEX_LEN_EE_P_2 */
8376 { "vpmaxsw", { XM, Vex128, EXx } },
8377 { "(bad)", { XX } },
8380 /* VEX_LEN_EF_P_2 */
8382 { "vpxor", { XM, Vex128, EXx } },
8383 { "(bad)", { XX } },
8386 /* VEX_LEN_F1_P_2 */
8388 { "vpsllw", { XM, Vex128, EXx } },
8389 { "(bad)", { XX } },
8392 /* VEX_LEN_F2_P_2 */
8394 { "vpslld", { XM, Vex128, EXx } },
8395 { "(bad)", { XX } },
8398 /* VEX_LEN_F3_P_2 */
8400 { "vpsllq", { XM, Vex128, EXx } },
8401 { "(bad)", { XX } },
8404 /* VEX_LEN_F4_P_2 */
8406 { "vpmuludq", { XM, Vex128, EXx } },
8407 { "(bad)", { XX } },
8410 /* VEX_LEN_F5_P_2 */
8412 { "vpmaddwd", { XM, Vex128, EXx } },
8413 { "(bad)", { XX } },
8416 /* VEX_LEN_F6_P_2 */
8418 { "vpsadbw", { XM, Vex128, EXx } },
8419 { "(bad)", { XX } },
8422 /* VEX_LEN_F7_P_2 */
8424 { "vmaskmovdqu", { XM, XS } },
8425 { "(bad)", { XX } },
8428 /* VEX_LEN_F8_P_2 */
8430 { "vpsubb", { XM, Vex128, EXx } },
8431 { "(bad)", { XX } },
8434 /* VEX_LEN_F9_P_2 */
8436 { "vpsubw", { XM, Vex128, EXx } },
8437 { "(bad)", { XX } },
8440 /* VEX_LEN_FA_P_2 */
8442 { "vpsubd", { XM, Vex128, EXx } },
8443 { "(bad)", { XX } },
8446 /* VEX_LEN_FB_P_2 */
8448 { "vpsubq", { XM, Vex128, EXx } },
8449 { "(bad)", { XX } },
8452 /* VEX_LEN_FC_P_2 */
8454 { "vpaddb", { XM, Vex128, EXx } },
8455 { "(bad)", { XX } },
8458 /* VEX_LEN_FD_P_2 */
8460 { "vpaddw", { XM, Vex128, EXx } },
8461 { "(bad)", { XX } },
8464 /* VEX_LEN_FE_P_2 */
8466 { "vpaddd", { XM, Vex128, EXx } },
8467 { "(bad)", { XX } },
8470 /* VEX_LEN_3800_P_2 */
8472 { "vpshufb", { XM, Vex128, EXx } },
8473 { "(bad)", { XX } },
8476 /* VEX_LEN_3801_P_2 */
8478 { "vphaddw", { XM, Vex128, EXx } },
8479 { "(bad)", { XX } },
8482 /* VEX_LEN_3802_P_2 */
8484 { "vphaddd", { XM, Vex128, EXx } },
8485 { "(bad)", { XX } },
8488 /* VEX_LEN_3803_P_2 */
8490 { "vphaddsw", { XM, Vex128, EXx } },
8491 { "(bad)", { XX } },
8494 /* VEX_LEN_3804_P_2 */
8496 { "vpmaddubsw", { XM, Vex128, EXx } },
8497 { "(bad)", { XX } },
8500 /* VEX_LEN_3805_P_2 */
8502 { "vphsubw", { XM, Vex128, EXx } },
8503 { "(bad)", { XX } },
8506 /* VEX_LEN_3806_P_2 */
8508 { "vphsubd", { XM, Vex128, EXx } },
8509 { "(bad)", { XX } },
8512 /* VEX_LEN_3807_P_2 */
8514 { "vphsubsw", { XM, Vex128, EXx } },
8515 { "(bad)", { XX } },
8518 /* VEX_LEN_3808_P_2 */
8520 { "vpsignb", { XM, Vex128, EXx } },
8521 { "(bad)", { XX } },
8524 /* VEX_LEN_3809_P_2 */
8526 { "vpsignw", { XM, Vex128, EXx } },
8527 { "(bad)", { XX } },
8530 /* VEX_LEN_380A_P_2 */
8532 { "vpsignd", { XM, Vex128, EXx } },
8533 { "(bad)", { XX } },
8536 /* VEX_LEN_380B_P_2 */
8538 { "vpmulhrsw", { XM, Vex128, EXx } },
8539 { "(bad)", { XX } },
8542 /* VEX_LEN_3819_P_2_M_0 */
8544 { "(bad)", { XX } },
8545 { "vbroadcastsd", { XM, Mq } },
8548 /* VEX_LEN_381A_P_2_M_0 */
8550 { "(bad)", { XX } },
8551 { "vbroadcastf128", { XM, Mxmm } },
8554 /* VEX_LEN_381C_P_2 */
8556 { "vpabsb", { XM, EXx } },
8557 { "(bad)", { XX } },
8560 /* VEX_LEN_381D_P_2 */
8562 { "vpabsw", { XM, EXx } },
8563 { "(bad)", { XX } },
8566 /* VEX_LEN_381E_P_2 */
8568 { "vpabsd", { XM, EXx } },
8569 { "(bad)", { XX } },
8572 /* VEX_LEN_3820_P_2 */
8574 { "vpmovsxbw", { XM, EXq } },
8575 { "(bad)", { XX } },
8578 /* VEX_LEN_3821_P_2 */
8580 { "vpmovsxbd", { XM, EXd } },
8581 { "(bad)", { XX } },
8584 /* VEX_LEN_3822_P_2 */
8586 { "vpmovsxbq", { XM, EXw } },
8587 { "(bad)", { XX } },
8590 /* VEX_LEN_3823_P_2 */
8592 { "vpmovsxwd", { XM, EXq } },
8593 { "(bad)", { XX } },
8596 /* VEX_LEN_3824_P_2 */
8598 { "vpmovsxwq", { XM, EXd } },
8599 { "(bad)", { XX } },
8602 /* VEX_LEN_3825_P_2 */
8604 { "vpmovsxdq", { XM, EXq } },
8605 { "(bad)", { XX } },
8608 /* VEX_LEN_3828_P_2 */
8610 { "vpmuldq", { XM, Vex128, EXx } },
8611 { "(bad)", { XX } },
8614 /* VEX_LEN_3829_P_2 */
8616 { "vpcmpeqq", { XM, Vex128, EXx } },
8617 { "(bad)", { XX } },
8620 /* VEX_LEN_382A_P_2_M_0 */
8622 { "vmovntdqa", { XM, Mx } },
8623 { "(bad)", { XX } },
8626 /* VEX_LEN_382B_P_2 */
8628 { "vpackusdw", { XM, Vex128, EXx } },
8629 { "(bad)", { XX } },
8632 /* VEX_LEN_3830_P_2 */
8634 { "vpmovzxbw", { XM, EXq } },
8635 { "(bad)", { XX } },
8638 /* VEX_LEN_3831_P_2 */
8640 { "vpmovzxbd", { XM, EXd } },
8641 { "(bad)", { XX } },
8644 /* VEX_LEN_3832_P_2 */
8646 { "vpmovzxbq", { XM, EXw } },
8647 { "(bad)", { XX } },
8650 /* VEX_LEN_3833_P_2 */
8652 { "vpmovzxwd", { XM, EXq } },
8653 { "(bad)", { XX } },
8656 /* VEX_LEN_3834_P_2 */
8658 { "vpmovzxwq", { XM, EXd } },
8659 { "(bad)", { XX } },
8662 /* VEX_LEN_3835_P_2 */
8664 { "vpmovzxdq", { XM, EXq } },
8665 { "(bad)", { XX } },
8668 /* VEX_LEN_3837_P_2 */
8670 { "vpcmpgtq", { XM, Vex128, EXx } },
8671 { "(bad)", { XX } },
8674 /* VEX_LEN_3838_P_2 */
8676 { "vpminsb", { XM, Vex128, EXx } },
8677 { "(bad)", { XX } },
8680 /* VEX_LEN_3839_P_2 */
8682 { "vpminsd", { XM, Vex128, EXx } },
8683 { "(bad)", { XX } },
8686 /* VEX_LEN_383A_P_2 */
8688 { "vpminuw", { XM, Vex128, EXx } },
8689 { "(bad)", { XX } },
8692 /* VEX_LEN_383B_P_2 */
8694 { "vpminud", { XM, Vex128, EXx } },
8695 { "(bad)", { XX } },
8698 /* VEX_LEN_383C_P_2 */
8700 { "vpmaxsb", { XM, Vex128, EXx } },
8701 { "(bad)", { XX } },
8704 /* VEX_LEN_383D_P_2 */
8706 { "vpmaxsd", { XM, Vex128, EXx } },
8707 { "(bad)", { XX } },
8710 /* VEX_LEN_383E_P_2 */
8712 { "vpmaxuw", { XM, Vex128, EXx } },
8713 { "(bad)", { XX } },
8716 /* VEX_LEN_383F_P_2 */
8718 { "vpmaxud", { XM, Vex128, EXx } },
8719 { "(bad)", { XX } },
8722 /* VEX_LEN_3840_P_2 */
8724 { "vpmulld", { XM, Vex128, EXx } },
8725 { "(bad)", { XX } },
8728 /* VEX_LEN_3841_P_2 */
8730 { "vphminposuw", { XM, EXx } },
8731 { "(bad)", { XX } },
8734 /* VEX_LEN_3A06_P_2 */
8736 { "(bad)", { XX } },
8737 { "vperm2f128", { XM, Vex256, EXx, Ib } },
8740 /* VEX_LEN_3A0A_P_2 */
8742 { "vroundss", { XM, Vex128, EXd, Ib } },
8743 { "(bad)", { XX } },
8746 /* VEX_LEN_3A0B_P_2 */
8748 { "vroundsd", { XM, Vex128, EXq, Ib } },
8749 { "(bad)", { XX } },
8752 /* VEX_LEN_3A0E_P_2 */
8754 { "vpblendw", { XM, Vex128, EXx, Ib } },
8755 { "(bad)", { XX } },
8758 /* VEX_LEN_3A0F_P_2 */
8760 { "vpalignr", { XM, Vex128, EXx, Ib } },
8761 { "(bad)", { XX } },
8764 /* VEX_LEN_3A14_P_2 */
8766 { "vpextrb", { Edqb, XM, Ib } },
8767 { "(bad)", { XX } },
8770 /* VEX_LEN_3A15_P_2 */
8772 { "vpextrw", { Edqw, XM, Ib } },
8773 { "(bad)", { XX } },
8776 /* VEX_LEN_3A16_P_2 */
8778 { "vpextrK", { Edq, XM, Ib } },
8779 { "(bad)", { XX } },
8782 /* VEX_LEN_3A17_P_2 */
8784 { "vextractps", { Edqd, XM, Ib } },
8785 { "(bad)", { XX } },
8788 /* VEX_LEN_3A18_P_2 */
8790 { "(bad)", { XX } },
8791 { "vinsertf128", { XM, Vex256, EXxmm, Ib } },
8794 /* VEX_LEN_3A19_P_2 */
8796 { "(bad)", { XX } },
8797 { "vextractf128", { EXxmm, XM, Ib } },
8800 /* VEX_LEN_3A20_P_2 */
8802 { "vpinsrb", { XM, Vex128, Edqb, Ib } },
8803 { "(bad)", { XX } },
8806 /* VEX_LEN_3A21_P_2 */
8808 { "vinsertps", { XM, Vex128, EXd, Ib } },
8809 { "(bad)", { XX } },
8812 /* VEX_LEN_3A22_P_2 */
8814 { "vpinsrK", { XM, Vex128, Edq, Ib } },
8815 { "(bad)", { XX } },
8818 /* VEX_LEN_3A41_P_2 */
8820 { "vdppd", { XM, Vex128, EXx, Ib } },
8821 { "(bad)", { XX } },
8824 /* VEX_LEN_3A42_P_2 */
8826 { "vmpsadbw", { XM, Vex128, EXx, Ib } },
8827 { "(bad)", { XX } },
8830 /* VEX_LEN_3A4C_P_2 */
8832 { "vpblendvb", { XM, Vex128, EXx, XMVexI4 } },
8833 { "(bad)", { XX } },
8836 /* VEX_LEN_3A60_P_2 */
8838 { "vpcmpestrm", { XM, EXx, Ib } },
8839 { "(bad)", { XX } },
8842 /* VEX_LEN_3A61_P_2 */
8844 { "vpcmpestri", { XM, EXx, Ib } },
8845 { "(bad)", { XX } },
8848 /* VEX_LEN_3A62_P_2 */
8850 { "vpcmpistrm", { XM, EXx, Ib } },
8851 { "(bad)", { XX } },
8854 /* VEX_LEN_3A63_P_2 */
8856 { "vpcmpistri", { XM, EXx, Ib } },
8857 { "(bad)", { XX } },
8860 /* VEX_LEN_3A6A_P_2 */
8862 { "vfmaddss", { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
8863 { "(bad)", { XX } },
8866 /* VEX_LEN_3A6B_P_2 */
8868 { "vfmaddsd", { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
8869 { "(bad)", { XX } },
8872 /* VEX_LEN_3A6E_P_2 */
8874 { "vfmsubss", { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
8875 { "(bad)", { XX } },
8878 /* VEX_LEN_3A6F_P_2 */
8880 { "vfmsubsd", { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
8881 { "(bad)", { XX } },
8884 /* VEX_LEN_3A7A_P_2 */
8886 { "vfnmaddss", { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
8887 { "(bad)", { XX } },
8890 /* VEX_LEN_3A7B_P_2 */
8892 { "vfnmaddsd", { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
8893 { "(bad)", { XX } },
8896 /* VEX_LEN_3A7E_P_2 */
8898 { "vfnmsubss", { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
8899 { "(bad)", { XX } },
8902 /* VEX_LEN_3A7F_P_2 */
8904 { "vfnmsubsd", { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
8905 { "(bad)", { XX } },
8909 static const struct dis386 mod_table[][2] = {
8911 /* MOD_8D */
8912 { "leaS", { Gv, M } },
8913 { "(bad)", { XX } },
8916 /* MOD_0F01_REG_0 */
8917 { X86_64_TABLE (X86_64_0F01_REG_0) },
8918 { RM_TABLE (RM_0F01_REG_0) },
8921 /* MOD_0F01_REG_1 */
8922 { X86_64_TABLE (X86_64_0F01_REG_1) },
8923 { RM_TABLE (RM_0F01_REG_1) },
8926 /* MOD_0F01_REG_2 */
8927 { X86_64_TABLE (X86_64_0F01_REG_2) },
8928 { RM_TABLE (RM_0F01_REG_2) },
8931 /* MOD_0F01_REG_3 */
8932 { X86_64_TABLE (X86_64_0F01_REG_3) },
8933 { RM_TABLE (RM_0F01_REG_3) },
8936 /* MOD_0F01_REG_7 */
8937 { "invlpg", { Mb } },
8938 { RM_TABLE (RM_0F01_REG_7) },
8941 /* MOD_0F12_PREFIX_0 */
8942 { "movlps", { XM, EXq } },
8943 { "movhlps", { XM, EXq } },
8946 /* MOD_0F13 */
8947 { "movlpX", { EXq, XM } },
8948 { "(bad)", { XX } },
8951 /* MOD_0F16_PREFIX_0 */
8952 { "movhps", { XM, EXq } },
8953 { "movlhps", { XM, EXq } },
8956 /* MOD_0F17 */
8957 { "movhpX", { EXq, XM } },
8958 { "(bad)", { XX } },
8961 /* MOD_0F18_REG_0 */
8962 { "prefetchnta", { Mb } },
8963 { "(bad)", { XX } },
8966 /* MOD_0F18_REG_1 */
8967 { "prefetcht0", { Mb } },
8968 { "(bad)", { XX } },
8971 /* MOD_0F18_REG_2 */
8972 { "prefetcht1", { Mb } },
8973 { "(bad)", { XX } },
8976 /* MOD_0F18_REG_3 */
8977 { "prefetcht2", { Mb } },
8978 { "(bad)", { XX } },
8981 /* MOD_0F20 */
8982 { "(bad)", { XX } },
8983 { "movZ", { Rm, Cm } },
8986 /* MOD_0F21 */
8987 { "(bad)", { XX } },
8988 { "movZ", { Rm, Dm } },
8991 /* MOD_0F22 */
8992 { "(bad)", { XX } },
8993 { "movZ", { Cm, Rm } },
8996 /* MOD_0F23 */
8997 { "(bad)", { XX } },
8998 { "movZ", { Dm, Rm } },
9001 /* MOD_0F24 */
9002 { THREE_BYTE_TABLE (THREE_BYTE_0F24) },
9003 { "movL", { Rd, Td } },
9006 /* MOD_0F26 */
9007 { "(bad)", { XX } },
9008 { "movL", { Td, Rd } },
9011 /* MOD_0F2B_PREFIX_0 */
9012 {"movntps", { Mx, XM } },
9013 { "(bad)", { XX } },
9016 /* MOD_0F2B_PREFIX_1 */
9017 {"movntss", { Md, XM } },
9018 { "(bad)", { XX } },
9021 /* MOD_0F2B_PREFIX_2 */
9022 {"movntpd", { Mx, XM } },
9023 { "(bad)", { XX } },
9026 /* MOD_0F2B_PREFIX_3 */
9027 {"movntsd", { Mq, XM } },
9028 { "(bad)", { XX } },
9031 /* MOD_0F51 */
9032 { "(bad)", { XX } },
9033 { "movmskpX", { Gdq, XS } },
9036 /* MOD_0F71_REG_2 */
9037 { "(bad)", { XX } },
9038 { "psrlw", { MS, Ib } },
9041 /* MOD_0F71_REG_4 */
9042 { "(bad)", { XX } },
9043 { "psraw", { MS, Ib } },
9046 /* MOD_0F71_REG_6 */
9047 { "(bad)", { XX } },
9048 { "psllw", { MS, Ib } },
9051 /* MOD_0F72_REG_2 */
9052 { "(bad)", { XX } },
9053 { "psrld", { MS, Ib } },
9056 /* MOD_0F72_REG_4 */
9057 { "(bad)", { XX } },
9058 { "psrad", { MS, Ib } },
9061 /* MOD_0F72_REG_6 */
9062 { "(bad)", { XX } },
9063 { "pslld", { MS, Ib } },
9066 /* MOD_0F73_REG_2 */
9067 { "(bad)", { XX } },
9068 { "psrlq", { MS, Ib } },
9071 /* MOD_0F73_REG_3 */
9072 { "(bad)", { XX } },
9073 { PREFIX_TABLE (PREFIX_0F73_REG_3) },
9076 /* MOD_0F73_REG_6 */
9077 { "(bad)", { XX } },
9078 { "psllq", { MS, Ib } },
9081 /* MOD_0F73_REG_7 */
9082 { "(bad)", { XX } },
9083 { PREFIX_TABLE (PREFIX_0F73_REG_7) },
9086 /* MOD_0FAE_REG_0 */
9087 { "fxsave", { M } },
9088 { "(bad)", { XX } },
9091 /* MOD_0FAE_REG_1 */
9092 { "fxrstor", { M } },
9093 { "(bad)", { XX } },
9096 /* MOD_0FAE_REG_2 */
9097 { "ldmxcsr", { Md } },
9098 { "(bad)", { XX } },
9101 /* MOD_0FAE_REG_3 */
9102 { "stmxcsr", { Md } },
9103 { "(bad)", { XX } },
9106 /* MOD_0FAE_REG_4 */
9107 { "xsave", { M } },
9108 { "(bad)", { XX } },
9111 /* MOD_0FAE_REG_5 */
9112 { "xrstor", { M } },
9113 { RM_TABLE (RM_0FAE_REG_5) },
9116 /* MOD_0FAE_REG_6 */
9117 { "xsaveopt", { M } },
9118 { RM_TABLE (RM_0FAE_REG_6) },
9121 /* MOD_0FAE_REG_7 */
9122 { "clflush", { Mb } },
9123 { RM_TABLE (RM_0FAE_REG_7) },
9126 /* MOD_0FB2 */
9127 { "lssS", { Gv, Mp } },
9128 { "(bad)", { XX } },
9131 /* MOD_0FB4 */
9132 { "lfsS", { Gv, Mp } },
9133 { "(bad)", { XX } },
9136 /* MOD_0FB5 */
9137 { "lgsS", { Gv, Mp } },
9138 { "(bad)", { XX } },
9141 /* MOD_0FC7_REG_6 */
9142 { PREFIX_TABLE (PREFIX_0FC7_REG_6) },
9143 { "(bad)", { XX } },
9146 /* MOD_0FC7_REG_7 */
9147 { "vmptrst", { Mq } },
9148 { "(bad)", { XX } },
9151 /* MOD_0FD7 */
9152 { "(bad)", { XX } },
9153 { "pmovmskb", { Gdq, MS } },
9156 /* MOD_0FE7_PREFIX_2 */
9157 { "movntdq", { Mx, XM } },
9158 { "(bad)", { XX } },
9161 /* MOD_0FF0_PREFIX_3 */
9162 { "lddqu", { XM, M } },
9163 { "(bad)", { XX } },
9166 /* MOD_0F382A_PREFIX_2 */
9167 { "movntdqa", { XM, Mx } },
9168 { "(bad)", { XX } },
9171 /* MOD_62_32BIT */
9172 { "bound{S|}", { Gv, Ma } },
9173 { "(bad)", { XX } },
9176 /* MOD_C4_32BIT */
9177 { "lesS", { Gv, Mp } },
9178 { VEX_C4_TABLE (VEX_0F) },
9181 /* MOD_C5_32BIT */
9182 { "ldsS", { Gv, Mp } },
9183 { VEX_C5_TABLE (VEX_0F) },
9186 /* MOD_VEX_12_PREFIX_0 */
9187 { VEX_LEN_TABLE (VEX_LEN_12_P_0_M_0) },
9188 { VEX_LEN_TABLE (VEX_LEN_12_P_0_M_1) },
9191 /* MOD_VEX_13 */
9192 { VEX_LEN_TABLE (VEX_LEN_13_M_0) },
9193 { "(bad)", { XX } },
9196 /* MOD_VEX_16_PREFIX_0 */
9197 { VEX_LEN_TABLE (VEX_LEN_16_P_0_M_0) },
9198 { VEX_LEN_TABLE (VEX_LEN_16_P_0_M_1) },
9201 /* MOD_VEX_17 */
9202 { VEX_LEN_TABLE (VEX_LEN_17_M_0) },
9203 { "(bad)", { XX } },
9206 /* MOD_VEX_2B */
9207 { VEX_LEN_TABLE (VEX_LEN_2B_M_0) },
9208 { "(bad)", { XX } },
9211 /* MOD_VEX_51 */
9212 { "(bad)", { XX } },
9213 { "vmovmskpX", { Gdq, XS } },
9216 /* MOD_VEX_71_REG_2 */
9217 { "(bad)", { XX } },
9218 { PREFIX_TABLE (PREFIX_VEX_71_REG_2) },
9221 /* MOD_VEX_71_REG_4 */
9222 { "(bad)", { XX } },
9223 { PREFIX_TABLE (PREFIX_VEX_71_REG_4) },
9226 /* MOD_VEX_71_REG_6 */
9227 { "(bad)", { XX } },
9228 { PREFIX_TABLE (PREFIX_VEX_71_REG_6) },
9231 /* MOD_VEX_72_REG_2 */
9232 { "(bad)", { XX } },
9233 { PREFIX_TABLE (PREFIX_VEX_72_REG_2) },
9236 /* MOD_VEX_72_REG_4 */
9237 { "(bad)", { XX } },
9238 { PREFIX_TABLE (PREFIX_VEX_72_REG_4) },
9241 /* MOD_VEX_72_REG_6 */
9242 { "(bad)", { XX } },
9243 { PREFIX_TABLE (PREFIX_VEX_72_REG_6) },
9246 /* MOD_VEX_73_REG_2 */
9247 { "(bad)", { XX } },
9248 { PREFIX_TABLE (PREFIX_VEX_73_REG_2) },
9251 /* MOD_VEX_73_REG_3 */
9252 { "(bad)", { XX } },
9253 { PREFIX_TABLE (PREFIX_VEX_73_REG_3) },
9256 /* MOD_VEX_73_REG_6 */
9257 { "(bad)", { XX } },
9258 { PREFIX_TABLE (PREFIX_VEX_73_REG_6) },
9261 /* MOD_VEX_73_REG_7 */
9262 { "(bad)", { XX } },
9263 { PREFIX_TABLE (PREFIX_VEX_73_REG_7) },
9266 /* MOD_VEX_AE_REG_2 */
9267 { VEX_LEN_TABLE (VEX_LEN_AE_R_2_M_0) },
9268 { "(bad)", { XX } },
9271 /* MOD_VEX_AE_REG_3 */
9272 { VEX_LEN_TABLE (VEX_LEN_AE_R_3_M_0) },
9273 { "(bad)", { XX } },
9276 /* MOD_VEX_D7_PREFIX_2 */
9277 { "(bad)", { XX } },
9278 { VEX_LEN_TABLE (VEX_LEN_D7_P_2_M_1) },
9281 /* MOD_VEX_E7_PREFIX_2 */
9282 { VEX_LEN_TABLE (VEX_LEN_E7_P_2_M_0) },
9283 { "(bad)", { XX } },
9286 /* MOD_VEX_F0_PREFIX_3 */
9287 { "vlddqu", { XM, M } },
9288 { "(bad)", { XX } },
9291 /* MOD_VEX_3818_PREFIX_2 */
9292 { "vbroadcastss", { XM, Md } },
9293 { "(bad)", { XX } },
9296 /* MOD_VEX_3819_PREFIX_2 */
9297 { VEX_LEN_TABLE (VEX_LEN_3819_P_2_M_0) },
9298 { "(bad)", { XX } },
9301 /* MOD_VEX_381A_PREFIX_2 */
9302 { VEX_LEN_TABLE (VEX_LEN_381A_P_2_M_0) },
9303 { "(bad)", { XX } },
9306 /* MOD_VEX_382A_PREFIX_2 */
9307 { VEX_LEN_TABLE (VEX_LEN_382A_P_2_M_0) },
9308 { "(bad)", { XX } },
9311 /* MOD_VEX_382C_PREFIX_2 */
9312 { "vmaskmovps", { XM, Vex, Mx } },
9313 { "(bad)", { XX } },
9316 /* MOD_VEX_382D_PREFIX_2 */
9317 { "vmaskmovpd", { XM, Vex, Mx } },
9318 { "(bad)", { XX } },
9321 /* MOD_VEX_382E_PREFIX_2 */
9322 { "vmaskmovps", { Mx, Vex, XM } },
9323 { "(bad)", { XX } },
9326 /* MOD_VEX_382F_PREFIX_2 */
9327 { "vmaskmovpd", { Mx, Vex, XM } },
9328 { "(bad)", { XX } },
9332 static const struct dis386 rm_table[][8] = {
9334 /* RM_0F01_REG_0 */
9335 { "(bad)", { XX } },
9336 { "vmcall", { Skip_MODRM } },
9337 { "vmlaunch", { Skip_MODRM } },
9338 { "vmresume", { Skip_MODRM } },
9339 { "vmxoff", { Skip_MODRM } },
9340 { "(bad)", { XX } },
9341 { "(bad)", { XX } },
9342 { "(bad)", { XX } },
9345 /* RM_0F01_REG_1 */
9346 { "monitor", { { OP_Monitor, 0 } } },
9347 { "mwait", { { OP_Mwait, 0 } } },
9348 { "(bad)", { XX } },
9349 { "(bad)", { XX } },
9350 { "(bad)", { XX } },
9351 { "(bad)", { XX } },
9352 { "(bad)", { XX } },
9353 { "(bad)", { XX } },
9356 /* RM_0F01_REG_2 */
9357 { "xgetbv", { Skip_MODRM } },
9358 { "xsetbv", { Skip_MODRM } },
9359 { "(bad)", { XX } },
9360 { "(bad)", { XX } },
9361 { "(bad)", { XX } },
9362 { "(bad)", { XX } },
9363 { "(bad)", { XX } },
9364 { "(bad)", { XX } },
9367 /* RM_0F01_REG_3 */
9368 { "vmrun", { Skip_MODRM } },
9369 { "vmmcall", { Skip_MODRM } },
9370 { "vmload", { Skip_MODRM } },
9371 { "vmsave", { Skip_MODRM } },
9372 { "stgi", { Skip_MODRM } },
9373 { "clgi", { Skip_MODRM } },
9374 { "skinit", { Skip_MODRM } },
9375 { "invlpga", { Skip_MODRM } },
9378 /* RM_0F01_REG_7 */
9379 { "swapgs", { Skip_MODRM } },
9380 { "rdtscp", { Skip_MODRM } },
9381 { "(bad)", { XX } },
9382 { "(bad)", { XX } },
9383 { "(bad)", { XX } },
9384 { "(bad)", { XX } },
9385 { "(bad)", { XX } },
9386 { "(bad)", { XX } },
9389 /* RM_0FAE_REG_5 */
9390 { "lfence", { Skip_MODRM } },
9391 { "(bad)", { XX } },
9392 { "(bad)", { XX } },
9393 { "(bad)", { XX } },
9394 { "(bad)", { XX } },
9395 { "(bad)", { XX } },
9396 { "(bad)", { XX } },
9397 { "(bad)", { XX } },
9400 /* RM_0FAE_REG_6 */
9401 { "mfence", { Skip_MODRM } },
9402 { "(bad)", { XX } },
9403 { "(bad)", { XX } },
9404 { "(bad)", { XX } },
9405 { "(bad)", { XX } },
9406 { "(bad)", { XX } },
9407 { "(bad)", { XX } },
9408 { "(bad)", { XX } },
9411 /* RM_0FAE_REG_7 */
9412 { "sfence", { Skip_MODRM } },
9413 { "(bad)", { XX } },
9414 { "(bad)", { XX } },
9415 { "(bad)", { XX } },
9416 { "(bad)", { XX } },
9417 { "(bad)", { XX } },
9418 { "(bad)", { XX } },
9419 { "(bad)", { XX } },
9423 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
9425 static void
9426 ckprefix (void)
9428 int newrex;
9429 rex = 0;
9430 rex_original = 0;
9431 rex_ignored = 0;
9432 prefixes = 0;
9433 used_prefixes = 0;
9434 rex_used = 0;
9435 while (1)
9437 FETCH_DATA (the_info, codep + 1);
9438 newrex = 0;
9439 switch (*codep)
9441 /* REX prefixes family. */
9442 case 0x40:
9443 case 0x41:
9444 case 0x42:
9445 case 0x43:
9446 case 0x44:
9447 case 0x45:
9448 case 0x46:
9449 case 0x47:
9450 case 0x48:
9451 case 0x49:
9452 case 0x4a:
9453 case 0x4b:
9454 case 0x4c:
9455 case 0x4d:
9456 case 0x4e:
9457 case 0x4f:
9458 if (address_mode == mode_64bit)
9459 newrex = *codep;
9460 else
9461 return;
9462 break;
9463 case 0xf3:
9464 prefixes |= PREFIX_REPZ;
9465 break;
9466 case 0xf2:
9467 prefixes |= PREFIX_REPNZ;
9468 break;
9469 case 0xf0:
9470 prefixes |= PREFIX_LOCK;
9471 break;
9472 case 0x2e:
9473 prefixes |= PREFIX_CS;
9474 break;
9475 case 0x36:
9476 prefixes |= PREFIX_SS;
9477 break;
9478 case 0x3e:
9479 prefixes |= PREFIX_DS;
9480 break;
9481 case 0x26:
9482 prefixes |= PREFIX_ES;
9483 break;
9484 case 0x64:
9485 prefixes |= PREFIX_FS;
9486 break;
9487 case 0x65:
9488 prefixes |= PREFIX_GS;
9489 break;
9490 case 0x66:
9491 prefixes |= PREFIX_DATA;
9492 break;
9493 case 0x67:
9494 prefixes |= PREFIX_ADDR;
9495 break;
9496 case FWAIT_OPCODE:
9497 /* fwait is really an instruction. If there are prefixes
9498 before the fwait, they belong to the fwait, *not* to the
9499 following instruction. */
9500 if (prefixes || rex)
9502 prefixes |= PREFIX_FWAIT;
9503 codep++;
9504 return;
9506 prefixes = PREFIX_FWAIT;
9507 break;
9508 default:
9509 return;
9511 /* Rex is ignored when followed by another prefix. */
9512 if (rex)
9514 rex_used = rex;
9515 return;
9517 rex = newrex;
9518 rex_original = rex;
9519 codep++;
9523 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
9524 prefix byte. */
9526 static const char *
9527 prefix_name (int pref, int sizeflag)
9529 static const char *rexes [16] =
9531 "rex", /* 0x40 */
9532 "rex.B", /* 0x41 */
9533 "rex.X", /* 0x42 */
9534 "rex.XB", /* 0x43 */
9535 "rex.R", /* 0x44 */
9536 "rex.RB", /* 0x45 */
9537 "rex.RX", /* 0x46 */
9538 "rex.RXB", /* 0x47 */
9539 "rex.W", /* 0x48 */
9540 "rex.WB", /* 0x49 */
9541 "rex.WX", /* 0x4a */
9542 "rex.WXB", /* 0x4b */
9543 "rex.WR", /* 0x4c */
9544 "rex.WRB", /* 0x4d */
9545 "rex.WRX", /* 0x4e */
9546 "rex.WRXB", /* 0x4f */
9549 switch (pref)
9551 /* REX prefixes family. */
9552 case 0x40:
9553 case 0x41:
9554 case 0x42:
9555 case 0x43:
9556 case 0x44:
9557 case 0x45:
9558 case 0x46:
9559 case 0x47:
9560 case 0x48:
9561 case 0x49:
9562 case 0x4a:
9563 case 0x4b:
9564 case 0x4c:
9565 case 0x4d:
9566 case 0x4e:
9567 case 0x4f:
9568 return rexes [pref - 0x40];
9569 case 0xf3:
9570 return "repz";
9571 case 0xf2:
9572 return "repnz";
9573 case 0xf0:
9574 return "lock";
9575 case 0x2e:
9576 return "cs";
9577 case 0x36:
9578 return "ss";
9579 case 0x3e:
9580 return "ds";
9581 case 0x26:
9582 return "es";
9583 case 0x64:
9584 return "fs";
9585 case 0x65:
9586 return "gs";
9587 case 0x66:
9588 return (sizeflag & DFLAG) ? "data16" : "data32";
9589 case 0x67:
9590 if (address_mode == mode_64bit)
9591 return (sizeflag & AFLAG) ? "addr32" : "addr64";
9592 else
9593 return (sizeflag & AFLAG) ? "addr16" : "addr32";
9594 case FWAIT_OPCODE:
9595 return "fwait";
9596 default:
9597 return NULL;
9601 static char op_out[MAX_OPERANDS][100];
9602 static int op_ad, op_index[MAX_OPERANDS];
9603 static int two_source_ops;
9604 static bfd_vma op_address[MAX_OPERANDS];
9605 static bfd_vma op_riprel[MAX_OPERANDS];
9606 static bfd_vma start_pc;
9609 * On the 386's of 1988, the maximum length of an instruction is 15 bytes.
9610 * (see topic "Redundant prefixes" in the "Differences from 8086"
9611 * section of the "Virtual 8086 Mode" chapter.)
9612 * 'pc' should be the address of this instruction, it will
9613 * be used to print the target address if this is a relative jump or call
9614 * The function returns the length of this instruction in bytes.
9617 static char intel_syntax;
9618 static char intel_mnemonic = !SYSV386_COMPAT;
9619 static char open_char;
9620 static char close_char;
9621 static char separator_char;
9622 static char scale_char;
9624 /* Here for backwards compatibility. When gdb stops using
9625 print_insn_i386_att and print_insn_i386_intel these functions can
9626 disappear, and print_insn_i386 be merged into print_insn. */
9628 print_insn_i386_att (bfd_vma pc, disassemble_info *info)
9630 intel_syntax = 0;
9632 return print_insn (pc, info);
9636 print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
9638 intel_syntax = 1;
9640 return print_insn (pc, info);
9644 print_insn_i386 (bfd_vma pc, disassemble_info *info)
9646 intel_syntax = -1;
9648 return print_insn (pc, info);
9651 void
9652 print_i386_disassembler_options (FILE *stream)
9654 fprintf (stream, _("\n\
9655 The following i386/x86-64 specific disassembler options are supported for use\n\
9656 with the -M switch (multiple options should be separated by commas):\n"));
9658 fprintf (stream, _(" x86-64 Disassemble in 64bit mode\n"));
9659 fprintf (stream, _(" i386 Disassemble in 32bit mode\n"));
9660 fprintf (stream, _(" i8086 Disassemble in 16bit mode\n"));
9661 fprintf (stream, _(" att Display instruction in AT&T syntax\n"));
9662 fprintf (stream, _(" intel Display instruction in Intel syntax\n"));
9663 fprintf (stream, _(" att-mnemonic\n"
9664 " Display instruction in AT&T mnemonic\n"));
9665 fprintf (stream, _(" intel-mnemonic\n"
9666 " Display instruction in Intel mnemonic\n"));
9667 fprintf (stream, _(" addr64 Assume 64bit address size\n"));
9668 fprintf (stream, _(" addr32 Assume 32bit address size\n"));
9669 fprintf (stream, _(" addr16 Assume 16bit address size\n"));
9670 fprintf (stream, _(" data32 Assume 32bit data size\n"));
9671 fprintf (stream, _(" data16 Assume 16bit data size\n"));
9672 fprintf (stream, _(" suffix Always display instruction suffix in AT&T syntax\n"));
9675 /* Get a pointer to struct dis386 with a valid name. */
9677 static const struct dis386 *
9678 get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
9680 int index, vex_table_index;
9682 if (dp->name != NULL)
9683 return dp;
9685 switch (dp->op[0].bytemode)
9687 case USE_REG_TABLE:
9688 dp = &reg_table[dp->op[1].bytemode][modrm.reg];
9689 break;
9691 case USE_MOD_TABLE:
9692 index = modrm.mod == 0x3 ? 1 : 0;
9693 dp = &mod_table[dp->op[1].bytemode][index];
9694 break;
9696 case USE_RM_TABLE:
9697 dp = &rm_table[dp->op[1].bytemode][modrm.rm];
9698 break;
9700 case USE_PREFIX_TABLE:
9701 if (need_vex)
9703 /* The prefix in VEX is implicit. */
9704 switch (vex.prefix)
9706 case 0:
9707 index = 0;
9708 break;
9709 case REPE_PREFIX_OPCODE:
9710 index = 1;
9711 break;
9712 case DATA_PREFIX_OPCODE:
9713 index = 2;
9714 break;
9715 case REPNE_PREFIX_OPCODE:
9716 index = 3;
9717 break;
9718 default:
9719 abort ();
9720 break;
9723 else
9725 index = 0;
9726 used_prefixes |= (prefixes & PREFIX_REPZ);
9727 if (prefixes & PREFIX_REPZ)
9729 index = 1;
9730 repz_prefix = NULL;
9732 else
9734 /* We should check PREFIX_REPNZ and PREFIX_REPZ before
9735 PREFIX_DATA. */
9736 used_prefixes |= (prefixes & PREFIX_REPNZ);
9737 if (prefixes & PREFIX_REPNZ)
9739 index = 3;
9740 repnz_prefix = NULL;
9742 else
9744 used_prefixes |= (prefixes & PREFIX_DATA);
9745 if (prefixes & PREFIX_DATA)
9747 index = 2;
9748 data_prefix = NULL;
9753 dp = &prefix_table[dp->op[1].bytemode][index];
9754 break;
9756 case USE_X86_64_TABLE:
9757 index = address_mode == mode_64bit ? 1 : 0;
9758 dp = &x86_64_table[dp->op[1].bytemode][index];
9759 break;
9761 case USE_3BYTE_TABLE:
9762 FETCH_DATA (info, codep + 2);
9763 index = *codep++;
9764 dp = &three_byte_table[dp->op[1].bytemode][index];
9765 modrm.mod = (*codep >> 6) & 3;
9766 modrm.reg = (*codep >> 3) & 7;
9767 modrm.rm = *codep & 7;
9768 break;
9770 case USE_VEX_LEN_TABLE:
9771 if (!need_vex)
9772 abort ();
9774 switch (vex.length)
9776 case 128:
9777 index = 0;
9778 break;
9779 case 256:
9780 index = 1;
9781 break;
9782 default:
9783 abort ();
9784 break;
9787 dp = &vex_len_table[dp->op[1].bytemode][index];
9788 break;
9790 case USE_VEX_C4_TABLE:
9791 FETCH_DATA (info, codep + 3);
9792 /* All bits in the REX prefix are ignored. */
9793 rex_ignored = rex;
9794 rex = ~(*codep >> 5) & 0x7;
9795 switch ((*codep & 0x1f))
9797 default:
9798 BadOp ();
9799 case 0x1:
9800 vex_table_index = 0;
9801 break;
9802 case 0x2:
9803 vex_table_index = 1;
9804 break;
9805 case 0x3:
9806 vex_table_index = 2;
9807 break;
9809 codep++;
9810 vex.w = *codep & 0x80;
9811 if (vex.w && address_mode == mode_64bit)
9812 rex |= REX_W;
9814 vex.register_specifier = (~(*codep >> 3)) & 0xf;
9815 if (address_mode != mode_64bit
9816 && vex.register_specifier > 0x7)
9817 BadOp ();
9819 vex.length = (*codep & 0x4) ? 256 : 128;
9820 switch ((*codep & 0x3))
9822 case 0:
9823 vex.prefix = 0;
9824 break;
9825 case 1:
9826 vex.prefix = DATA_PREFIX_OPCODE;
9827 break;
9828 case 2:
9829 vex.prefix = REPE_PREFIX_OPCODE;
9830 break;
9831 case 3:
9832 vex.prefix = REPNE_PREFIX_OPCODE;
9833 break;
9835 need_vex = 1;
9836 need_vex_reg = 1;
9837 codep++;
9838 index = *codep++;
9839 dp = &vex_table[vex_table_index][index];
9840 /* There is no MODRM byte for VEX [82|77]. */
9841 if (index != 0x77 && index != 0x82)
9843 FETCH_DATA (info, codep + 1);
9844 modrm.mod = (*codep >> 6) & 3;
9845 modrm.reg = (*codep >> 3) & 7;
9846 modrm.rm = *codep & 7;
9848 break;
9850 case USE_VEX_C5_TABLE:
9851 FETCH_DATA (info, codep + 2);
9852 /* All bits in the REX prefix are ignored. */
9853 rex_ignored = rex;
9854 rex = (*codep & 0x80) ? 0 : REX_R;
9856 vex.register_specifier = (~(*codep >> 3)) & 0xf;
9857 if (address_mode != mode_64bit
9858 && vex.register_specifier > 0x7)
9859 BadOp ();
9861 vex.length = (*codep & 0x4) ? 256 : 128;
9862 switch ((*codep & 0x3))
9864 case 0:
9865 vex.prefix = 0;
9866 break;
9867 case 1:
9868 vex.prefix = DATA_PREFIX_OPCODE;
9869 break;
9870 case 2:
9871 vex.prefix = REPE_PREFIX_OPCODE;
9872 break;
9873 case 3:
9874 vex.prefix = REPNE_PREFIX_OPCODE;
9875 break;
9877 need_vex = 1;
9878 need_vex_reg = 1;
9879 codep++;
9880 index = *codep++;
9881 dp = &vex_table[dp->op[1].bytemode][index];
9882 /* There is no MODRM byte for VEX [82|77]. */
9883 if (index != 0x77 && index != 0x82)
9885 FETCH_DATA (info, codep + 1);
9886 modrm.mod = (*codep >> 6) & 3;
9887 modrm.reg = (*codep >> 3) & 7;
9888 modrm.rm = *codep & 7;
9890 break;
9892 default:
9893 oappend (INTERNAL_DISASSEMBLER_ERROR);
9894 return NULL;
9897 if (dp->name != NULL)
9898 return dp;
9899 else
9900 return get_valid_dis386 (dp, info);
9903 static int
9904 print_insn (bfd_vma pc, disassemble_info *info)
9906 const struct dis386 *dp;
9907 int i;
9908 char *op_txt[MAX_OPERANDS];
9909 int needcomma;
9910 int sizeflag;
9911 const char *p;
9912 struct dis_private priv;
9913 unsigned char op;
9914 char prefix_obuf[32];
9915 char *prefix_obufp;
9917 if (info->mach == bfd_mach_x86_64_intel_syntax
9918 || info->mach == bfd_mach_x86_64)
9919 address_mode = mode_64bit;
9920 else
9921 address_mode = mode_32bit;
9923 if (intel_syntax == (char) -1)
9924 intel_syntax = (info->mach == bfd_mach_i386_i386_intel_syntax
9925 || info->mach == bfd_mach_x86_64_intel_syntax);
9927 if (info->mach == bfd_mach_i386_i386
9928 || info->mach == bfd_mach_x86_64
9929 || info->mach == bfd_mach_i386_i386_intel_syntax
9930 || info->mach == bfd_mach_x86_64_intel_syntax)
9931 priv.orig_sizeflag = AFLAG | DFLAG;
9932 else if (info->mach == bfd_mach_i386_i8086)
9933 priv.orig_sizeflag = 0;
9934 else
9935 abort ();
9937 for (p = info->disassembler_options; p != NULL; )
9939 if (CONST_STRNEQ (p, "x86-64"))
9941 address_mode = mode_64bit;
9942 priv.orig_sizeflag = AFLAG | DFLAG;
9944 else if (CONST_STRNEQ (p, "i386"))
9946 address_mode = mode_32bit;
9947 priv.orig_sizeflag = AFLAG | DFLAG;
9949 else if (CONST_STRNEQ (p, "i8086"))
9951 address_mode = mode_16bit;
9952 priv.orig_sizeflag = 0;
9954 else if (CONST_STRNEQ (p, "intel"))
9956 intel_syntax = 1;
9957 if (CONST_STRNEQ (p + 5, "-mnemonic"))
9958 intel_mnemonic = 1;
9960 else if (CONST_STRNEQ (p, "att"))
9962 intel_syntax = 0;
9963 if (CONST_STRNEQ (p + 3, "-mnemonic"))
9964 intel_mnemonic = 0;
9966 else if (CONST_STRNEQ (p, "addr"))
9968 if (address_mode == mode_64bit)
9970 if (p[4] == '3' && p[5] == '2')
9971 priv.orig_sizeflag &= ~AFLAG;
9972 else if (p[4] == '6' && p[5] == '4')
9973 priv.orig_sizeflag |= AFLAG;
9975 else
9977 if (p[4] == '1' && p[5] == '6')
9978 priv.orig_sizeflag &= ~AFLAG;
9979 else if (p[4] == '3' && p[5] == '2')
9980 priv.orig_sizeflag |= AFLAG;
9983 else if (CONST_STRNEQ (p, "data"))
9985 if (p[4] == '1' && p[5] == '6')
9986 priv.orig_sizeflag &= ~DFLAG;
9987 else if (p[4] == '3' && p[5] == '2')
9988 priv.orig_sizeflag |= DFLAG;
9990 else if (CONST_STRNEQ (p, "suffix"))
9991 priv.orig_sizeflag |= SUFFIX_ALWAYS;
9993 p = strchr (p, ',');
9994 if (p != NULL)
9995 p++;
9998 if (intel_syntax)
10000 names64 = intel_names64;
10001 names32 = intel_names32;
10002 names16 = intel_names16;
10003 names8 = intel_names8;
10004 names8rex = intel_names8rex;
10005 names_seg = intel_names_seg;
10006 index64 = intel_index64;
10007 index32 = intel_index32;
10008 index16 = intel_index16;
10009 open_char = '[';
10010 close_char = ']';
10011 separator_char = '+';
10012 scale_char = '*';
10014 else
10016 names64 = att_names64;
10017 names32 = att_names32;
10018 names16 = att_names16;
10019 names8 = att_names8;
10020 names8rex = att_names8rex;
10021 names_seg = att_names_seg;
10022 index64 = att_index64;
10023 index32 = att_index32;
10024 index16 = att_index16;
10025 open_char = '(';
10026 close_char = ')';
10027 separator_char = ',';
10028 scale_char = ',';
10031 /* The output looks better if we put 7 bytes on a line, since that
10032 puts most long word instructions on a single line. */
10033 info->bytes_per_line = 7;
10035 info->private_data = &priv;
10036 priv.max_fetched = priv.the_buffer;
10037 priv.insn_start = pc;
10039 obuf[0] = 0;
10040 for (i = 0; i < MAX_OPERANDS; ++i)
10042 op_out[i][0] = 0;
10043 op_index[i] = -1;
10046 the_info = info;
10047 start_pc = pc;
10048 start_codep = priv.the_buffer;
10049 codep = priv.the_buffer;
10051 if (setjmp (priv.bailout) != 0)
10053 const char *name;
10055 /* Getting here means we tried for data but didn't get it. That
10056 means we have an incomplete instruction of some sort. Just
10057 print the first byte as a prefix or a .byte pseudo-op. */
10058 if (codep > priv.the_buffer)
10060 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
10061 if (name != NULL)
10062 (*info->fprintf_func) (info->stream, "%s", name);
10063 else
10065 /* Just print the first byte as a .byte instruction. */
10066 (*info->fprintf_func) (info->stream, ".byte 0x%x",
10067 (unsigned int) priv.the_buffer[0]);
10070 return 1;
10073 return -1;
10076 obufp = obuf;
10077 ckprefix ();
10079 insn_codep = codep;
10080 sizeflag = priv.orig_sizeflag;
10082 FETCH_DATA (info, codep + 1);
10083 two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
10085 if (((prefixes & PREFIX_FWAIT)
10086 && ((*codep < 0xd8) || (*codep > 0xdf)))
10087 || (rex && rex_used))
10089 const char *name;
10091 /* fwait not followed by floating point instruction, or rex followed
10092 by other prefixes. Print the first prefix. */
10093 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
10094 if (name == NULL)
10095 name = INTERNAL_DISASSEMBLER_ERROR;
10096 (*info->fprintf_func) (info->stream, "%s", name);
10097 return 1;
10100 op = 0;
10101 if (*codep == 0x0f)
10103 unsigned char threebyte;
10104 FETCH_DATA (info, codep + 2);
10105 threebyte = *++codep;
10106 dp = &dis386_twobyte[threebyte];
10107 need_modrm = twobyte_has_modrm[*codep];
10108 codep++;
10110 else
10112 dp = &dis386[*codep];
10113 need_modrm = onebyte_has_modrm[*codep];
10114 codep++;
10117 if ((prefixes & PREFIX_REPZ))
10119 repz_prefix = "repz ";
10120 used_prefixes |= PREFIX_REPZ;
10122 else
10123 repz_prefix = NULL;
10125 if ((prefixes & PREFIX_REPNZ))
10127 repnz_prefix = "repnz ";
10128 used_prefixes |= PREFIX_REPNZ;
10130 else
10131 repnz_prefix = NULL;
10133 if ((prefixes & PREFIX_LOCK))
10135 lock_prefix = "lock ";
10136 used_prefixes |= PREFIX_LOCK;
10138 else
10139 lock_prefix = NULL;
10141 addr_prefix = NULL;
10142 if (prefixes & PREFIX_ADDR)
10144 sizeflag ^= AFLAG;
10145 if (dp->op[2].bytemode != loop_jcxz_mode || intel_syntax)
10147 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
10148 addr_prefix = "addr32 ";
10149 else
10150 addr_prefix = "addr16 ";
10151 used_prefixes |= PREFIX_ADDR;
10155 data_prefix = NULL;
10156 if ((prefixes & PREFIX_DATA))
10158 sizeflag ^= DFLAG;
10159 if (dp->op[2].bytemode == cond_jump_mode
10160 && dp->op[0].bytemode == v_mode
10161 && !intel_syntax)
10163 if (sizeflag & DFLAG)
10164 data_prefix = "data32 ";
10165 else
10166 data_prefix = "data16 ";
10167 used_prefixes |= PREFIX_DATA;
10171 if (need_modrm)
10173 FETCH_DATA (info, codep + 1);
10174 modrm.mod = (*codep >> 6) & 3;
10175 modrm.reg = (*codep >> 3) & 7;
10176 modrm.rm = *codep & 7;
10179 if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
10181 dofloat (sizeflag);
10183 else
10185 need_vex = 0;
10186 need_vex_reg = 0;
10187 vex_i4_done = 0;
10188 dp = get_valid_dis386 (dp, info);
10189 if (dp != NULL && putop (dp->name, sizeflag) == 0)
10191 for (i = 0; i < MAX_OPERANDS; ++i)
10193 obufp = op_out[i];
10194 op_ad = MAX_OPERANDS - 1 - i;
10195 if (dp->op[i].rtn)
10196 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
10201 /* See if any prefixes were not used. If so, print the first one
10202 separately. If we don't do this, we'll wind up printing an
10203 instruction stream which does not precisely correspond to the
10204 bytes we are disassembling. */
10205 if ((prefixes & ~used_prefixes) != 0)
10207 const char *name;
10209 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
10210 if (name == NULL)
10211 name = INTERNAL_DISASSEMBLER_ERROR;
10212 (*info->fprintf_func) (info->stream, "%s", name);
10213 return 1;
10215 if ((rex_original & ~rex_used) || rex_ignored)
10217 const char *name;
10218 name = prefix_name (rex_original, priv.orig_sizeflag);
10219 if (name == NULL)
10220 name = INTERNAL_DISASSEMBLER_ERROR;
10221 (*info->fprintf_func) (info->stream, "%s ", name);
10224 prefix_obuf[0] = 0;
10225 prefix_obufp = prefix_obuf;
10226 if (lock_prefix)
10227 prefix_obufp = stpcpy (prefix_obufp, lock_prefix);
10228 if (repz_prefix)
10229 prefix_obufp = stpcpy (prefix_obufp, repz_prefix);
10230 if (repnz_prefix)
10231 prefix_obufp = stpcpy (prefix_obufp, repnz_prefix);
10232 if (addr_prefix)
10233 prefix_obufp = stpcpy (prefix_obufp, addr_prefix);
10234 if (data_prefix)
10235 prefix_obufp = stpcpy (prefix_obufp, data_prefix);
10237 if (prefix_obuf[0] != 0)
10238 (*info->fprintf_func) (info->stream, "%s", prefix_obuf);
10240 obufp = obuf + strlen (obuf);
10241 for (i = strlen (obuf) + strlen (prefix_obuf); i < 6; i++)
10242 oappend (" ");
10243 oappend (" ");
10244 (*info->fprintf_func) (info->stream, "%s", obuf);
10246 /* The enter and bound instructions are printed with operands in the same
10247 order as the intel book; everything else is printed in reverse order. */
10248 if (intel_syntax || two_source_ops)
10250 bfd_vma riprel;
10252 for (i = 0; i < MAX_OPERANDS; ++i)
10253 op_txt[i] = op_out[i];
10255 for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
10257 op_ad = op_index[i];
10258 op_index[i] = op_index[MAX_OPERANDS - 1 - i];
10259 op_index[MAX_OPERANDS - 1 - i] = op_ad;
10260 riprel = op_riprel[i];
10261 op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
10262 op_riprel[MAX_OPERANDS - 1 - i] = riprel;
10265 else
10267 for (i = 0; i < MAX_OPERANDS; ++i)
10268 op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
10271 needcomma = 0;
10272 for (i = 0; i < MAX_OPERANDS; ++i)
10273 if (*op_txt[i])
10275 if (needcomma)
10276 (*info->fprintf_func) (info->stream, ",");
10277 if (op_index[i] != -1 && !op_riprel[i])
10278 (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
10279 else
10280 (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
10281 needcomma = 1;
10284 for (i = 0; i < MAX_OPERANDS; i++)
10285 if (op_index[i] != -1 && op_riprel[i])
10287 (*info->fprintf_func) (info->stream, " # ");
10288 (*info->print_address_func) ((bfd_vma) (start_pc + codep - start_codep
10289 + op_address[op_index[i]]), info);
10290 break;
10292 return codep - priv.the_buffer;
10295 static const char *float_mem[] = {
10296 /* d8 */
10297 "fadd{s|}",
10298 "fmul{s|}",
10299 "fcom{s|}",
10300 "fcomp{s|}",
10301 "fsub{s|}",
10302 "fsubr{s|}",
10303 "fdiv{s|}",
10304 "fdivr{s|}",
10305 /* d9 */
10306 "fld{s|}",
10307 "(bad)",
10308 "fst{s|}",
10309 "fstp{s|}",
10310 "fldenvIC",
10311 "fldcw",
10312 "fNstenvIC",
10313 "fNstcw",
10314 /* da */
10315 "fiadd{l|}",
10316 "fimul{l|}",
10317 "ficom{l|}",
10318 "ficomp{l|}",
10319 "fisub{l|}",
10320 "fisubr{l|}",
10321 "fidiv{l|}",
10322 "fidivr{l|}",
10323 /* db */
10324 "fild{l|}",
10325 "fisttp{l|}",
10326 "fist{l|}",
10327 "fistp{l|}",
10328 "(bad)",
10329 "fld{t||t|}",
10330 "(bad)",
10331 "fstp{t||t|}",
10332 /* dc */
10333 "fadd{l|}",
10334 "fmul{l|}",
10335 "fcom{l|}",
10336 "fcomp{l|}",
10337 "fsub{l|}",
10338 "fsubr{l|}",
10339 "fdiv{l|}",
10340 "fdivr{l|}",
10341 /* dd */
10342 "fld{l|}",
10343 "fisttp{ll|}",
10344 "fst{l||}",
10345 "fstp{l|}",
10346 "frstorIC",
10347 "(bad)",
10348 "fNsaveIC",
10349 "fNstsw",
10350 /* de */
10351 "fiadd",
10352 "fimul",
10353 "ficom",
10354 "ficomp",
10355 "fisub",
10356 "fisubr",
10357 "fidiv",
10358 "fidivr",
10359 /* df */
10360 "fild",
10361 "fisttp",
10362 "fist",
10363 "fistp",
10364 "fbld",
10365 "fild{ll|}",
10366 "fbstp",
10367 "fistp{ll|}",
10370 static const unsigned char float_mem_mode[] = {
10371 /* d8 */
10372 d_mode,
10373 d_mode,
10374 d_mode,
10375 d_mode,
10376 d_mode,
10377 d_mode,
10378 d_mode,
10379 d_mode,
10380 /* d9 */
10381 d_mode,
10383 d_mode,
10384 d_mode,
10386 w_mode,
10388 w_mode,
10389 /* da */
10390 d_mode,
10391 d_mode,
10392 d_mode,
10393 d_mode,
10394 d_mode,
10395 d_mode,
10396 d_mode,
10397 d_mode,
10398 /* db */
10399 d_mode,
10400 d_mode,
10401 d_mode,
10402 d_mode,
10404 t_mode,
10406 t_mode,
10407 /* dc */
10408 q_mode,
10409 q_mode,
10410 q_mode,
10411 q_mode,
10412 q_mode,
10413 q_mode,
10414 q_mode,
10415 q_mode,
10416 /* dd */
10417 q_mode,
10418 q_mode,
10419 q_mode,
10420 q_mode,
10424 w_mode,
10425 /* de */
10426 w_mode,
10427 w_mode,
10428 w_mode,
10429 w_mode,
10430 w_mode,
10431 w_mode,
10432 w_mode,
10433 w_mode,
10434 /* df */
10435 w_mode,
10436 w_mode,
10437 w_mode,
10438 w_mode,
10439 t_mode,
10440 q_mode,
10441 t_mode,
10442 q_mode
10445 #define ST { OP_ST, 0 }
10446 #define STi { OP_STi, 0 }
10448 #define FGRPd9_2 NULL, { { NULL, 0 } }
10449 #define FGRPd9_4 NULL, { { NULL, 1 } }
10450 #define FGRPd9_5 NULL, { { NULL, 2 } }
10451 #define FGRPd9_6 NULL, { { NULL, 3 } }
10452 #define FGRPd9_7 NULL, { { NULL, 4 } }
10453 #define FGRPda_5 NULL, { { NULL, 5 } }
10454 #define FGRPdb_4 NULL, { { NULL, 6 } }
10455 #define FGRPde_3 NULL, { { NULL, 7 } }
10456 #define FGRPdf_4 NULL, { { NULL, 8 } }
10458 static const struct dis386 float_reg[][8] = {
10459 /* d8 */
10461 { "fadd", { ST, STi } },
10462 { "fmul", { ST, STi } },
10463 { "fcom", { STi } },
10464 { "fcomp", { STi } },
10465 { "fsub", { ST, STi } },
10466 { "fsubr", { ST, STi } },
10467 { "fdiv", { ST, STi } },
10468 { "fdivr", { ST, STi } },
10470 /* d9 */
10472 { "fld", { STi } },
10473 { "fxch", { STi } },
10474 { FGRPd9_2 },
10475 { "(bad)", { XX } },
10476 { FGRPd9_4 },
10477 { FGRPd9_5 },
10478 { FGRPd9_6 },
10479 { FGRPd9_7 },
10481 /* da */
10483 { "fcmovb", { ST, STi } },
10484 { "fcmove", { ST, STi } },
10485 { "fcmovbe",{ ST, STi } },
10486 { "fcmovu", { ST, STi } },
10487 { "(bad)", { XX } },
10488 { FGRPda_5 },
10489 { "(bad)", { XX } },
10490 { "(bad)", { XX } },
10492 /* db */
10494 { "fcmovnb",{ ST, STi } },
10495 { "fcmovne",{ ST, STi } },
10496 { "fcmovnbe",{ ST, STi } },
10497 { "fcmovnu",{ ST, STi } },
10498 { FGRPdb_4 },
10499 { "fucomi", { ST, STi } },
10500 { "fcomi", { ST, STi } },
10501 { "(bad)", { XX } },
10503 /* dc */
10505 { "fadd", { STi, ST } },
10506 { "fmul", { STi, ST } },
10507 { "(bad)", { XX } },
10508 { "(bad)", { XX } },
10509 { "fsub!M", { STi, ST } },
10510 { "fsubM", { STi, ST } },
10511 { "fdiv!M", { STi, ST } },
10512 { "fdivM", { STi, ST } },
10514 /* dd */
10516 { "ffree", { STi } },
10517 { "(bad)", { XX } },
10518 { "fst", { STi } },
10519 { "fstp", { STi } },
10520 { "fucom", { STi } },
10521 { "fucomp", { STi } },
10522 { "(bad)", { XX } },
10523 { "(bad)", { XX } },
10525 /* de */
10527 { "faddp", { STi, ST } },
10528 { "fmulp", { STi, ST } },
10529 { "(bad)", { XX } },
10530 { FGRPde_3 },
10531 { "fsub!Mp", { STi, ST } },
10532 { "fsubMp", { STi, ST } },
10533 { "fdiv!Mp", { STi, ST } },
10534 { "fdivMp", { STi, ST } },
10536 /* df */
10538 { "ffreep", { STi } },
10539 { "(bad)", { XX } },
10540 { "(bad)", { XX } },
10541 { "(bad)", { XX } },
10542 { FGRPdf_4 },
10543 { "fucomip", { ST, STi } },
10544 { "fcomip", { ST, STi } },
10545 { "(bad)", { XX } },
10549 static char *fgrps[][8] = {
10550 /* d9_2 0 */
10552 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10555 /* d9_4 1 */
10557 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
10560 /* d9_5 2 */
10562 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
10565 /* d9_6 3 */
10567 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
10570 /* d9_7 4 */
10572 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
10575 /* da_5 5 */
10577 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10580 /* db_4 6 */
10582 "feni(287 only)","fdisi(287 only)","fNclex","fNinit",
10583 "fNsetpm(287 only)","(bad)","(bad)","(bad)",
10586 /* de_3 7 */
10588 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10591 /* df_4 8 */
10593 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10597 static void
10598 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
10599 int sizeflag ATTRIBUTE_UNUSED)
10601 /* Skip mod/rm byte. */
10602 MODRM_CHECK;
10603 codep++;
10606 static void
10607 dofloat (int sizeflag)
10609 const struct dis386 *dp;
10610 unsigned char floatop;
10612 floatop = codep[-1];
10614 if (modrm.mod != 3)
10616 int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
10618 putop (float_mem[fp_indx], sizeflag);
10619 obufp = op_out[0];
10620 op_ad = 2;
10621 OP_E (float_mem_mode[fp_indx], sizeflag);
10622 return;
10624 /* Skip mod/rm byte. */
10625 MODRM_CHECK;
10626 codep++;
10628 dp = &float_reg[floatop - 0xd8][modrm.reg];
10629 if (dp->name == NULL)
10631 putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
10633 /* Instruction fnstsw is only one with strange arg. */
10634 if (floatop == 0xdf && codep[-1] == 0xe0)
10635 strcpy (op_out[0], names16[0]);
10637 else
10639 putop (dp->name, sizeflag);
10641 obufp = op_out[0];
10642 op_ad = 2;
10643 if (dp->op[0].rtn)
10644 (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
10646 obufp = op_out[1];
10647 op_ad = 1;
10648 if (dp->op[1].rtn)
10649 (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
10653 static void
10654 OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
10656 oappend ("%st" + intel_syntax);
10659 static void
10660 OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
10662 sprintf (scratchbuf, "%%st(%d)", modrm.rm);
10663 oappend (scratchbuf + intel_syntax);
10666 /* Capital letters in template are macros. */
10667 static int
10668 putop (const char *template, int sizeflag)
10670 const char *p;
10671 int alt = 0;
10672 int cond = 1;
10673 unsigned int l = 0, len = 1;
10674 char last[4];
10676 #define SAVE_LAST(c) \
10677 if (l < len && l < sizeof (last)) \
10678 last[l++] = c; \
10679 else \
10680 abort ();
10682 for (p = template; *p; p++)
10684 switch (*p)
10686 default:
10687 *obufp++ = *p;
10688 break;
10689 case '%':
10690 len++;
10691 break;
10692 case '!':
10693 cond = 0;
10694 break;
10695 case '{':
10696 alt = 0;
10697 if (intel_syntax)
10699 while (*++p != '|')
10700 if (*p == '}' || *p == '\0')
10701 abort ();
10703 /* Fall through. */
10704 case 'I':
10705 alt = 1;
10706 continue;
10707 case '|':
10708 while (*++p != '}')
10710 if (*p == '\0')
10711 abort ();
10713 break;
10714 case '}':
10715 break;
10716 case 'A':
10717 if (intel_syntax)
10718 break;
10719 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
10720 *obufp++ = 'b';
10721 break;
10722 case 'B':
10723 if (intel_syntax)
10724 break;
10725 if (sizeflag & SUFFIX_ALWAYS)
10726 *obufp++ = 'b';
10727 break;
10728 case 'C':
10729 if (intel_syntax && !alt)
10730 break;
10731 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
10733 if (sizeflag & DFLAG)
10734 *obufp++ = intel_syntax ? 'd' : 'l';
10735 else
10736 *obufp++ = intel_syntax ? 'w' : 's';
10737 used_prefixes |= (prefixes & PREFIX_DATA);
10739 break;
10740 case 'D':
10741 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
10742 break;
10743 USED_REX (REX_W);
10744 if (modrm.mod == 3)
10746 if (rex & REX_W)
10747 *obufp++ = 'q';
10748 else if (sizeflag & DFLAG)
10749 *obufp++ = intel_syntax ? 'd' : 'l';
10750 else
10751 *obufp++ = 'w';
10752 used_prefixes |= (prefixes & PREFIX_DATA);
10754 else
10755 *obufp++ = 'w';
10756 break;
10757 case 'E': /* For jcxz/jecxz */
10758 if (address_mode == mode_64bit)
10760 if (sizeflag & AFLAG)
10761 *obufp++ = 'r';
10762 else
10763 *obufp++ = 'e';
10765 else
10766 if (sizeflag & AFLAG)
10767 *obufp++ = 'e';
10768 used_prefixes |= (prefixes & PREFIX_ADDR);
10769 break;
10770 case 'F':
10771 if (intel_syntax)
10772 break;
10773 if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
10775 if (sizeflag & AFLAG)
10776 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
10777 else
10778 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
10779 used_prefixes |= (prefixes & PREFIX_ADDR);
10781 break;
10782 case 'G':
10783 if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
10784 break;
10785 if ((rex & REX_W) || (sizeflag & DFLAG))
10786 *obufp++ = 'l';
10787 else
10788 *obufp++ = 'w';
10789 if (!(rex & REX_W))
10790 used_prefixes |= (prefixes & PREFIX_DATA);
10791 break;
10792 case 'H':
10793 if (intel_syntax)
10794 break;
10795 if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
10796 || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
10798 used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
10799 *obufp++ = ',';
10800 *obufp++ = 'p';
10801 if (prefixes & PREFIX_DS)
10802 *obufp++ = 't';
10803 else
10804 *obufp++ = 'n';
10806 break;
10807 case 'J':
10808 if (intel_syntax)
10809 break;
10810 *obufp++ = 'l';
10811 break;
10812 case 'K':
10813 USED_REX (REX_W);
10814 if (rex & REX_W)
10815 *obufp++ = 'q';
10816 else
10817 *obufp++ = 'd';
10818 break;
10819 case 'Z':
10820 if (intel_syntax)
10821 break;
10822 if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
10824 *obufp++ = 'q';
10825 break;
10827 /* Fall through. */
10828 goto case_L;
10829 case 'L':
10830 if (l != 0 || len != 1)
10832 SAVE_LAST (*p);
10833 break;
10835 case_L:
10836 if (intel_syntax)
10837 break;
10838 if (sizeflag & SUFFIX_ALWAYS)
10839 *obufp++ = 'l';
10840 break;
10841 case 'M':
10842 if (intel_mnemonic != cond)
10843 *obufp++ = 'r';
10844 break;
10845 case 'N':
10846 if ((prefixes & PREFIX_FWAIT) == 0)
10847 *obufp++ = 'n';
10848 else
10849 used_prefixes |= PREFIX_FWAIT;
10850 break;
10851 case 'O':
10852 USED_REX (REX_W);
10853 if (rex & REX_W)
10854 *obufp++ = 'o';
10855 else if (intel_syntax && (sizeflag & DFLAG))
10856 *obufp++ = 'q';
10857 else
10858 *obufp++ = 'd';
10859 if (!(rex & REX_W))
10860 used_prefixes |= (prefixes & PREFIX_DATA);
10861 break;
10862 case 'T':
10863 if (intel_syntax)
10864 break;
10865 if (address_mode == mode_64bit && (sizeflag & DFLAG))
10867 *obufp++ = 'q';
10868 break;
10870 /* Fall through. */
10871 case 'P':
10872 if (intel_syntax)
10873 break;
10874 if ((prefixes & PREFIX_DATA)
10875 || (rex & REX_W)
10876 || (sizeflag & SUFFIX_ALWAYS))
10878 USED_REX (REX_W);
10879 if (rex & REX_W)
10880 *obufp++ = 'q';
10881 else
10883 if (sizeflag & DFLAG)
10884 *obufp++ = 'l';
10885 else
10886 *obufp++ = 'w';
10888 used_prefixes |= (prefixes & PREFIX_DATA);
10890 break;
10891 case 'U':
10892 if (intel_syntax)
10893 break;
10894 if (address_mode == mode_64bit && (sizeflag & DFLAG))
10896 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
10897 *obufp++ = 'q';
10898 break;
10900 /* Fall through. */
10901 goto case_Q;
10902 case 'Q':
10903 if (l == 0 && len == 1)
10905 case_Q:
10906 if (intel_syntax && !alt)
10907 break;
10908 USED_REX (REX_W);
10909 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
10911 if (rex & REX_W)
10912 *obufp++ = 'q';
10913 else
10915 if (sizeflag & DFLAG)
10916 *obufp++ = intel_syntax ? 'd' : 'l';
10917 else
10918 *obufp++ = 'w';
10920 used_prefixes |= (prefixes & PREFIX_DATA);
10923 else
10925 if (l != 1 || len != 2 || last[0] != 'L')
10927 SAVE_LAST (*p);
10928 break;
10930 if (intel_syntax
10931 || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
10932 break;
10933 if ((rex & REX_W))
10935 USED_REX (REX_W);
10936 *obufp++ = 'q';
10938 else
10939 *obufp++ = 'l';
10941 break;
10942 case 'R':
10943 USED_REX (REX_W);
10944 if (rex & REX_W)
10945 *obufp++ = 'q';
10946 else if (sizeflag & DFLAG)
10948 if (intel_syntax)
10949 *obufp++ = 'd';
10950 else
10951 *obufp++ = 'l';
10953 else
10954 *obufp++ = 'w';
10955 if (intel_syntax && !p[1]
10956 && ((rex & REX_W) || (sizeflag & DFLAG)))
10957 *obufp++ = 'e';
10958 if (!(rex & REX_W))
10959 used_prefixes |= (prefixes & PREFIX_DATA);
10960 break;
10961 case 'V':
10962 if (intel_syntax)
10963 break;
10964 if (address_mode == mode_64bit && (sizeflag & DFLAG))
10966 if (sizeflag & SUFFIX_ALWAYS)
10967 *obufp++ = 'q';
10968 break;
10970 /* Fall through. */
10971 case 'S':
10972 if (intel_syntax)
10973 break;
10974 if (sizeflag & SUFFIX_ALWAYS)
10976 if (rex & REX_W)
10977 *obufp++ = 'q';
10978 else
10980 if (sizeflag & DFLAG)
10981 *obufp++ = 'l';
10982 else
10983 *obufp++ = 'w';
10984 used_prefixes |= (prefixes & PREFIX_DATA);
10987 break;
10988 case 'X':
10989 if (l != 0 || len != 1)
10991 SAVE_LAST (*p);
10992 break;
10994 if (need_vex && vex.prefix)
10996 if (vex.prefix == DATA_PREFIX_OPCODE)
10997 *obufp++ = 'd';
10998 else
10999 *obufp++ = 's';
11001 else if (prefixes & PREFIX_DATA)
11002 *obufp++ = 'd';
11003 else
11004 *obufp++ = 's';
11005 used_prefixes |= (prefixes & PREFIX_DATA);
11006 break;
11007 case 'Y':
11008 if (l == 0 && len == 1)
11010 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
11011 break;
11012 if (rex & REX_W)
11014 USED_REX (REX_W);
11015 *obufp++ = 'q';
11017 break;
11019 else
11021 if (l != 1 || len != 2 || last[0] != 'X')
11023 SAVE_LAST (*p);
11024 break;
11026 if (!need_vex)
11027 abort ();
11028 if (intel_syntax
11029 || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
11030 break;
11031 switch (vex.length)
11033 case 128:
11034 *obufp++ = 'x';
11035 break;
11036 case 256:
11037 *obufp++ = 'y';
11038 break;
11039 default:
11040 abort ();
11043 break;
11044 /* implicit operand size 'l' for i386 or 'q' for x86-64 */
11045 case 'W':
11046 /* operand size flag for cwtl, cbtw */
11047 USED_REX (REX_W);
11048 if (rex & REX_W)
11050 if (intel_syntax)
11051 *obufp++ = 'd';
11052 else
11053 *obufp++ = 'l';
11055 else if (sizeflag & DFLAG)
11056 *obufp++ = 'w';
11057 else
11058 *obufp++ = 'b';
11059 if (!(rex & REX_W))
11060 used_prefixes |= (prefixes & PREFIX_DATA);
11061 break;
11063 alt = 0;
11065 *obufp = 0;
11066 return 0;
11069 static void
11070 oappend (const char *s)
11072 strcpy (obufp, s);
11073 obufp += strlen (s);
11076 static void
11077 append_seg (void)
11079 if (prefixes & PREFIX_CS)
11081 used_prefixes |= PREFIX_CS;
11082 oappend ("%cs:" + intel_syntax);
11084 if (prefixes & PREFIX_DS)
11086 used_prefixes |= PREFIX_DS;
11087 oappend ("%ds:" + intel_syntax);
11089 if (prefixes & PREFIX_SS)
11091 used_prefixes |= PREFIX_SS;
11092 oappend ("%ss:" + intel_syntax);
11094 if (prefixes & PREFIX_ES)
11096 used_prefixes |= PREFIX_ES;
11097 oappend ("%es:" + intel_syntax);
11099 if (prefixes & PREFIX_FS)
11101 used_prefixes |= PREFIX_FS;
11102 oappend ("%fs:" + intel_syntax);
11104 if (prefixes & PREFIX_GS)
11106 used_prefixes |= PREFIX_GS;
11107 oappend ("%gs:" + intel_syntax);
11111 static void
11112 OP_indirE (int bytemode, int sizeflag)
11114 if (!intel_syntax)
11115 oappend ("*");
11116 OP_E (bytemode, sizeflag);
11119 static void
11120 print_operand_value (char *buf, int hex, bfd_vma disp)
11122 if (address_mode == mode_64bit)
11124 if (hex)
11126 char tmp[30];
11127 int i;
11128 buf[0] = '0';
11129 buf[1] = 'x';
11130 sprintf_vma (tmp, disp);
11131 for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
11132 strcpy (buf + 2, tmp + i);
11134 else
11136 bfd_signed_vma v = disp;
11137 char tmp[30];
11138 int i;
11139 if (v < 0)
11141 *(buf++) = '-';
11142 v = -disp;
11143 /* Check for possible overflow on 0x8000000000000000. */
11144 if (v < 0)
11146 strcpy (buf, "9223372036854775808");
11147 return;
11150 if (!v)
11152 strcpy (buf, "0");
11153 return;
11156 i = 0;
11157 tmp[29] = 0;
11158 while (v)
11160 tmp[28 - i] = (v % 10) + '0';
11161 v /= 10;
11162 i++;
11164 strcpy (buf, tmp + 29 - i);
11167 else
11169 if (hex)
11170 sprintf (buf, "0x%x", (unsigned int) disp);
11171 else
11172 sprintf (buf, "%d", (int) disp);
11176 /* Put DISP in BUF as signed hex number. */
11178 static void
11179 print_displacement (char *buf, bfd_vma disp)
11181 bfd_signed_vma val = disp;
11182 char tmp[30];
11183 int i, j = 0;
11185 if (val < 0)
11187 buf[j++] = '-';
11188 val = -disp;
11190 /* Check for possible overflow. */
11191 if (val < 0)
11193 switch (address_mode)
11195 case mode_64bit:
11196 strcpy (buf + j, "0x8000000000000000");
11197 break;
11198 case mode_32bit:
11199 strcpy (buf + j, "0x80000000");
11200 break;
11201 case mode_16bit:
11202 strcpy (buf + j, "0x8000");
11203 break;
11205 return;
11209 buf[j++] = '0';
11210 buf[j++] = 'x';
11212 sprintf_vma (tmp, val);
11213 for (i = 0; tmp[i] == '0'; i++)
11214 continue;
11215 if (tmp[i] == '\0')
11216 i--;
11217 strcpy (buf + j, tmp + i);
11220 static void
11221 intel_operand_size (int bytemode, int sizeflag)
11223 switch (bytemode)
11225 case b_mode:
11226 case dqb_mode:
11227 oappend ("BYTE PTR ");
11228 break;
11229 case w_mode:
11230 case dqw_mode:
11231 oappend ("WORD PTR ");
11232 break;
11233 case stack_v_mode:
11234 if (address_mode == mode_64bit && (sizeflag & DFLAG))
11236 oappend ("QWORD PTR ");
11237 used_prefixes |= (prefixes & PREFIX_DATA);
11238 break;
11240 /* FALLTHRU */
11241 case v_mode:
11242 case dq_mode:
11243 USED_REX (REX_W);
11244 if (rex & REX_W)
11245 oappend ("QWORD PTR ");
11246 else if ((sizeflag & DFLAG) || bytemode == dq_mode)
11247 oappend ("DWORD PTR ");
11248 else
11249 oappend ("WORD PTR ");
11250 used_prefixes |= (prefixes & PREFIX_DATA);
11251 break;
11252 case z_mode:
11253 if ((rex & REX_W) || (sizeflag & DFLAG))
11254 *obufp++ = 'D';
11255 oappend ("WORD PTR ");
11256 if (!(rex & REX_W))
11257 used_prefixes |= (prefixes & PREFIX_DATA);
11258 break;
11259 case a_mode:
11260 if (sizeflag & DFLAG)
11261 oappend ("QWORD PTR ");
11262 else
11263 oappend ("DWORD PTR ");
11264 used_prefixes |= (prefixes & PREFIX_DATA);
11265 break;
11266 case d_mode:
11267 case dqd_mode:
11268 oappend ("DWORD PTR ");
11269 break;
11270 case q_mode:
11271 oappend ("QWORD PTR ");
11272 break;
11273 case m_mode:
11274 if (address_mode == mode_64bit)
11275 oappend ("QWORD PTR ");
11276 else
11277 oappend ("DWORD PTR ");
11278 break;
11279 case f_mode:
11280 if (sizeflag & DFLAG)
11281 oappend ("FWORD PTR ");
11282 else
11283 oappend ("DWORD PTR ");
11284 used_prefixes |= (prefixes & PREFIX_DATA);
11285 break;
11286 case t_mode:
11287 oappend ("TBYTE PTR ");
11288 break;
11289 case x_mode:
11290 if (need_vex)
11292 switch (vex.length)
11294 case 128:
11295 oappend ("XMMWORD PTR ");
11296 break;
11297 case 256:
11298 oappend ("YMMWORD PTR ");
11299 break;
11300 default:
11301 abort ();
11304 else
11305 oappend ("XMMWORD PTR ");
11306 break;
11307 case xmm_mode:
11308 oappend ("XMMWORD PTR ");
11309 break;
11310 case xmmq_mode:
11311 if (!need_vex)
11312 abort ();
11314 switch (vex.length)
11316 case 128:
11317 oappend ("QWORD PTR ");
11318 break;
11319 case 256:
11320 oappend ("XMMWORD PTR ");
11321 break;
11322 default:
11323 abort ();
11325 break;
11326 case ymmq_mode:
11327 if (!need_vex)
11328 abort ();
11330 switch (vex.length)
11332 case 128:
11333 oappend ("QWORD PTR ");
11334 break;
11335 case 256:
11336 oappend ("YMMWORD PTR ");
11337 break;
11338 default:
11339 abort ();
11341 break;
11342 case o_mode:
11343 oappend ("OWORD PTR ");
11344 break;
11345 default:
11346 break;
11350 static void
11351 OP_E_register (int bytemode, int sizeflag)
11353 int reg = modrm.rm;
11354 const char **names;
11356 USED_REX (REX_B);
11357 if ((rex & REX_B))
11358 reg += 8;
11360 switch (bytemode)
11362 case b_mode:
11363 USED_REX (0);
11364 if (rex)
11365 names = names8rex;
11366 else
11367 names = names8;
11368 break;
11369 case w_mode:
11370 names = names16;
11371 break;
11372 case d_mode:
11373 names = names32;
11374 break;
11375 case q_mode:
11376 names = names64;
11377 break;
11378 case m_mode:
11379 names = address_mode == mode_64bit ? names64 : names32;
11380 break;
11381 case stack_v_mode:
11382 if (address_mode == mode_64bit && (sizeflag & DFLAG))
11384 names = names64;
11385 used_prefixes |= (prefixes & PREFIX_DATA);
11386 break;
11388 bytemode = v_mode;
11389 /* FALLTHRU */
11390 case v_mode:
11391 case dq_mode:
11392 case dqb_mode:
11393 case dqd_mode:
11394 case dqw_mode:
11395 USED_REX (REX_W);
11396 if (rex & REX_W)
11397 names = names64;
11398 else if ((sizeflag & DFLAG) || bytemode != v_mode)
11399 names = names32;
11400 else
11401 names = names16;
11402 used_prefixes |= (prefixes & PREFIX_DATA);
11403 break;
11404 case 0:
11405 return;
11406 default:
11407 oappend (INTERNAL_DISASSEMBLER_ERROR);
11408 return;
11410 oappend (names[reg]);
11413 static void
11414 OP_E_memory (int bytemode, int sizeflag, int has_drex)
11416 bfd_vma disp = 0;
11417 int add = (rex & REX_B) ? 8 : 0;
11418 int riprel = 0;
11420 USED_REX (REX_B);
11421 if (intel_syntax)
11422 intel_operand_size (bytemode, sizeflag);
11423 append_seg ();
11425 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
11427 /* 32/64 bit address mode */
11428 int havedisp;
11429 int havesib;
11430 int havebase;
11431 int haveindex;
11432 int needindex;
11433 int base, rbase;
11434 int index = 0;
11435 int scale = 0;
11437 havesib = 0;
11438 havebase = 1;
11439 haveindex = 0;
11440 base = modrm.rm;
11442 if (base == 4)
11444 havesib = 1;
11445 FETCH_DATA (the_info, codep + 1);
11446 index = (*codep >> 3) & 7;
11447 scale = (*codep >> 6) & 3;
11448 base = *codep & 7;
11449 USED_REX (REX_X);
11450 if (rex & REX_X)
11451 index += 8;
11452 haveindex = index != 4;
11453 codep++;
11455 rbase = base + add;
11457 /* If we have a DREX byte, skip it now
11458 (it has already been handled) */
11459 if (has_drex)
11461 FETCH_DATA (the_info, codep + 1);
11462 codep++;
11465 switch (modrm.mod)
11467 case 0:
11468 if (base == 5)
11470 havebase = 0;
11471 if (address_mode == mode_64bit && !havesib)
11472 riprel = 1;
11473 disp = get32s ();
11475 break;
11476 case 1:
11477 FETCH_DATA (the_info, codep + 1);
11478 disp = *codep++;
11479 if ((disp & 0x80) != 0)
11480 disp -= 0x100;
11481 break;
11482 case 2:
11483 disp = get32s ();
11484 break;
11487 /* In 32bit mode, we need index register to tell [offset] from
11488 [eiz*1 + offset]. */
11489 needindex = (havesib
11490 && !havebase
11491 && !haveindex
11492 && address_mode == mode_32bit);
11493 havedisp = (havebase
11494 || needindex
11495 || (havesib && (haveindex || scale != 0)));
11497 if (!intel_syntax)
11498 if (modrm.mod != 0 || base == 5)
11500 if (havedisp || riprel)
11501 print_displacement (scratchbuf, disp);
11502 else
11503 print_operand_value (scratchbuf, 1, disp);
11504 oappend (scratchbuf);
11505 if (riprel)
11507 set_op (disp, 1);
11508 oappend (sizeflag & AFLAG ? "(%rip)" : "(%eip)");
11512 if (havebase || haveindex || riprel)
11513 used_prefixes |= PREFIX_ADDR;
11515 if (havedisp || (intel_syntax && riprel))
11517 *obufp++ = open_char;
11518 if (intel_syntax && riprel)
11520 set_op (disp, 1);
11521 oappend (sizeflag & AFLAG ? "rip" : "eip");
11523 *obufp = '\0';
11524 if (havebase)
11525 oappend (address_mode == mode_64bit && (sizeflag & AFLAG)
11526 ? names64[rbase] : names32[rbase]);
11527 if (havesib)
11529 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
11530 print index to tell base + index from base. */
11531 if (scale != 0
11532 || needindex
11533 || haveindex
11534 || (havebase && base != ESP_REG_NUM))
11536 if (!intel_syntax || havebase)
11538 *obufp++ = separator_char;
11539 *obufp = '\0';
11541 if (haveindex)
11542 oappend (address_mode == mode_64bit
11543 && (sizeflag & AFLAG)
11544 ? names64[index] : names32[index]);
11545 else
11546 oappend (address_mode == mode_64bit
11547 && (sizeflag & AFLAG)
11548 ? index64 : index32);
11550 *obufp++ = scale_char;
11551 *obufp = '\0';
11552 sprintf (scratchbuf, "%d", 1 << scale);
11553 oappend (scratchbuf);
11556 if (intel_syntax
11557 && (disp || modrm.mod != 0 || base == 5))
11559 if (!havedisp || (bfd_signed_vma) disp >= 0)
11561 *obufp++ = '+';
11562 *obufp = '\0';
11564 else if (modrm.mod != 1)
11566 *obufp++ = '-';
11567 *obufp = '\0';
11568 disp = - (bfd_signed_vma) disp;
11571 if (havedisp)
11572 print_displacement (scratchbuf, disp);
11573 else
11574 print_operand_value (scratchbuf, 1, disp);
11575 oappend (scratchbuf);
11578 *obufp++ = close_char;
11579 *obufp = '\0';
11581 else if (intel_syntax)
11583 if (modrm.mod != 0 || base == 5)
11585 if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
11586 | PREFIX_ES | PREFIX_FS | PREFIX_GS))
11588 else
11590 oappend (names_seg[ds_reg - es_reg]);
11591 oappend (":");
11593 print_operand_value (scratchbuf, 1, disp);
11594 oappend (scratchbuf);
11598 else
11599 { /* 16 bit address mode */
11600 switch (modrm.mod)
11602 case 0:
11603 if (modrm.rm == 6)
11605 disp = get16 ();
11606 if ((disp & 0x8000) != 0)
11607 disp -= 0x10000;
11609 break;
11610 case 1:
11611 FETCH_DATA (the_info, codep + 1);
11612 disp = *codep++;
11613 if ((disp & 0x80) != 0)
11614 disp -= 0x100;
11615 break;
11616 case 2:
11617 disp = get16 ();
11618 if ((disp & 0x8000) != 0)
11619 disp -= 0x10000;
11620 break;
11623 if (!intel_syntax)
11624 if (modrm.mod != 0 || modrm.rm == 6)
11626 print_displacement (scratchbuf, disp);
11627 oappend (scratchbuf);
11630 if (modrm.mod != 0 || modrm.rm != 6)
11632 *obufp++ = open_char;
11633 *obufp = '\0';
11634 oappend (index16[modrm.rm]);
11635 if (intel_syntax
11636 && (disp || modrm.mod != 0 || modrm.rm == 6))
11638 if ((bfd_signed_vma) disp >= 0)
11640 *obufp++ = '+';
11641 *obufp = '\0';
11643 else if (modrm.mod != 1)
11645 *obufp++ = '-';
11646 *obufp = '\0';
11647 disp = - (bfd_signed_vma) disp;
11650 print_displacement (scratchbuf, disp);
11651 oappend (scratchbuf);
11654 *obufp++ = close_char;
11655 *obufp = '\0';
11657 else if (intel_syntax)
11659 if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
11660 | PREFIX_ES | PREFIX_FS | PREFIX_GS))
11662 else
11664 oappend (names_seg[ds_reg - es_reg]);
11665 oappend (":");
11667 print_operand_value (scratchbuf, 1, disp & 0xffff);
11668 oappend (scratchbuf);
11673 static void
11674 OP_E_extended (int bytemode, int sizeflag, int has_drex)
11676 /* Skip mod/rm byte. */
11677 MODRM_CHECK;
11678 codep++;
11680 if (modrm.mod == 3)
11681 OP_E_register (bytemode, sizeflag);
11682 else
11683 OP_E_memory (bytemode, sizeflag, has_drex);
11686 static void
11687 OP_E (int bytemode, int sizeflag)
11689 OP_E_extended (bytemode, sizeflag, 0);
11693 static void
11694 OP_G (int bytemode, int sizeflag)
11696 int add = 0;
11697 USED_REX (REX_R);
11698 if (rex & REX_R)
11699 add += 8;
11700 switch (bytemode)
11702 case b_mode:
11703 USED_REX (0);
11704 if (rex)
11705 oappend (names8rex[modrm.reg + add]);
11706 else
11707 oappend (names8[modrm.reg + add]);
11708 break;
11709 case w_mode:
11710 oappend (names16[modrm.reg + add]);
11711 break;
11712 case d_mode:
11713 oappend (names32[modrm.reg + add]);
11714 break;
11715 case q_mode:
11716 oappend (names64[modrm.reg + add]);
11717 break;
11718 case v_mode:
11719 case dq_mode:
11720 case dqb_mode:
11721 case dqd_mode:
11722 case dqw_mode:
11723 USED_REX (REX_W);
11724 if (rex & REX_W)
11725 oappend (names64[modrm.reg + add]);
11726 else if ((sizeflag & DFLAG) || bytemode != v_mode)
11727 oappend (names32[modrm.reg + add]);
11728 else
11729 oappend (names16[modrm.reg + add]);
11730 used_prefixes |= (prefixes & PREFIX_DATA);
11731 break;
11732 case m_mode:
11733 if (address_mode == mode_64bit)
11734 oappend (names64[modrm.reg + add]);
11735 else
11736 oappend (names32[modrm.reg + add]);
11737 break;
11738 default:
11739 oappend (INTERNAL_DISASSEMBLER_ERROR);
11740 break;
11744 static bfd_vma
11745 get64 (void)
11747 bfd_vma x;
11748 #ifdef BFD64
11749 unsigned int a;
11750 unsigned int b;
11752 FETCH_DATA (the_info, codep + 8);
11753 a = *codep++ & 0xff;
11754 a |= (*codep++ & 0xff) << 8;
11755 a |= (*codep++ & 0xff) << 16;
11756 a |= (*codep++ & 0xff) << 24;
11757 b = *codep++ & 0xff;
11758 b |= (*codep++ & 0xff) << 8;
11759 b |= (*codep++ & 0xff) << 16;
11760 b |= (*codep++ & 0xff) << 24;
11761 x = a + ((bfd_vma) b << 32);
11762 #else
11763 abort ();
11764 x = 0;
11765 #endif
11766 return x;
11769 static bfd_signed_vma
11770 get32 (void)
11772 bfd_signed_vma x = 0;
11774 FETCH_DATA (the_info, codep + 4);
11775 x = *codep++ & (bfd_signed_vma) 0xff;
11776 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
11777 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
11778 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
11779 return x;
11782 static bfd_signed_vma
11783 get32s (void)
11785 bfd_signed_vma x = 0;
11787 FETCH_DATA (the_info, codep + 4);
11788 x = *codep++ & (bfd_signed_vma) 0xff;
11789 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
11790 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
11791 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
11793 x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
11795 return x;
11798 static int
11799 get16 (void)
11801 int x = 0;
11803 FETCH_DATA (the_info, codep + 2);
11804 x = *codep++ & 0xff;
11805 x |= (*codep++ & 0xff) << 8;
11806 return x;
11809 static void
11810 set_op (bfd_vma op, int riprel)
11812 op_index[op_ad] = op_ad;
11813 if (address_mode == mode_64bit)
11815 op_address[op_ad] = op;
11816 op_riprel[op_ad] = riprel;
11818 else
11820 /* Mask to get a 32-bit address. */
11821 op_address[op_ad] = op & 0xffffffff;
11822 op_riprel[op_ad] = riprel & 0xffffffff;
11826 static void
11827 OP_REG (int code, int sizeflag)
11829 const char *s;
11830 int add;
11831 USED_REX (REX_B);
11832 if (rex & REX_B)
11833 add = 8;
11834 else
11835 add = 0;
11837 switch (code)
11839 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
11840 case sp_reg: case bp_reg: case si_reg: case di_reg:
11841 s = names16[code - ax_reg + add];
11842 break;
11843 case es_reg: case ss_reg: case cs_reg:
11844 case ds_reg: case fs_reg: case gs_reg:
11845 s = names_seg[code - es_reg + add];
11846 break;
11847 case al_reg: case ah_reg: case cl_reg: case ch_reg:
11848 case dl_reg: case dh_reg: case bl_reg: case bh_reg:
11849 USED_REX (0);
11850 if (rex)
11851 s = names8rex[code - al_reg + add];
11852 else
11853 s = names8[code - al_reg];
11854 break;
11855 case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
11856 case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
11857 if (address_mode == mode_64bit && (sizeflag & DFLAG))
11859 s = names64[code - rAX_reg + add];
11860 break;
11862 code += eAX_reg - rAX_reg;
11863 /* Fall through. */
11864 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
11865 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
11866 USED_REX (REX_W);
11867 if (rex & REX_W)
11868 s = names64[code - eAX_reg + add];
11869 else if (sizeflag & DFLAG)
11870 s = names32[code - eAX_reg + add];
11871 else
11872 s = names16[code - eAX_reg + add];
11873 used_prefixes |= (prefixes & PREFIX_DATA);
11874 break;
11875 default:
11876 s = INTERNAL_DISASSEMBLER_ERROR;
11877 break;
11879 oappend (s);
11882 static void
11883 OP_IMREG (int code, int sizeflag)
11885 const char *s;
11887 switch (code)
11889 case indir_dx_reg:
11890 if (intel_syntax)
11891 s = "dx";
11892 else
11893 s = "(%dx)";
11894 break;
11895 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
11896 case sp_reg: case bp_reg: case si_reg: case di_reg:
11897 s = names16[code - ax_reg];
11898 break;
11899 case es_reg: case ss_reg: case cs_reg:
11900 case ds_reg: case fs_reg: case gs_reg:
11901 s = names_seg[code - es_reg];
11902 break;
11903 case al_reg: case ah_reg: case cl_reg: case ch_reg:
11904 case dl_reg: case dh_reg: case bl_reg: case bh_reg:
11905 USED_REX (0);
11906 if (rex)
11907 s = names8rex[code - al_reg];
11908 else
11909 s = names8[code - al_reg];
11910 break;
11911 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
11912 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
11913 USED_REX (REX_W);
11914 if (rex & REX_W)
11915 s = names64[code - eAX_reg];
11916 else if (sizeflag & DFLAG)
11917 s = names32[code - eAX_reg];
11918 else
11919 s = names16[code - eAX_reg];
11920 used_prefixes |= (prefixes & PREFIX_DATA);
11921 break;
11922 case z_mode_ax_reg:
11923 if ((rex & REX_W) || (sizeflag & DFLAG))
11924 s = *names32;
11925 else
11926 s = *names16;
11927 if (!(rex & REX_W))
11928 used_prefixes |= (prefixes & PREFIX_DATA);
11929 break;
11930 default:
11931 s = INTERNAL_DISASSEMBLER_ERROR;
11932 break;
11934 oappend (s);
11937 static void
11938 OP_I (int bytemode, int sizeflag)
11940 bfd_signed_vma op;
11941 bfd_signed_vma mask = -1;
11943 switch (bytemode)
11945 case b_mode:
11946 FETCH_DATA (the_info, codep + 1);
11947 op = *codep++;
11948 mask = 0xff;
11949 break;
11950 case q_mode:
11951 if (address_mode == mode_64bit)
11953 op = get32s ();
11954 break;
11956 /* Fall through. */
11957 case v_mode:
11958 USED_REX (REX_W);
11959 if (rex & REX_W)
11960 op = get32s ();
11961 else if (sizeflag & DFLAG)
11963 op = get32 ();
11964 mask = 0xffffffff;
11966 else
11968 op = get16 ();
11969 mask = 0xfffff;
11971 used_prefixes |= (prefixes & PREFIX_DATA);
11972 break;
11973 case w_mode:
11974 mask = 0xfffff;
11975 op = get16 ();
11976 break;
11977 case const_1_mode:
11978 if (intel_syntax)
11979 oappend ("1");
11980 return;
11981 default:
11982 oappend (INTERNAL_DISASSEMBLER_ERROR);
11983 return;
11986 op &= mask;
11987 scratchbuf[0] = '$';
11988 print_operand_value (scratchbuf + 1, 1, op);
11989 oappend (scratchbuf + intel_syntax);
11990 scratchbuf[0] = '\0';
11993 static void
11994 OP_I64 (int bytemode, int sizeflag)
11996 bfd_signed_vma op;
11997 bfd_signed_vma mask = -1;
11999 if (address_mode != mode_64bit)
12001 OP_I (bytemode, sizeflag);
12002 return;
12005 switch (bytemode)
12007 case b_mode:
12008 FETCH_DATA (the_info, codep + 1);
12009 op = *codep++;
12010 mask = 0xff;
12011 break;
12012 case v_mode:
12013 USED_REX (REX_W);
12014 if (rex & REX_W)
12015 op = get64 ();
12016 else if (sizeflag & DFLAG)
12018 op = get32 ();
12019 mask = 0xffffffff;
12021 else
12023 op = get16 ();
12024 mask = 0xfffff;
12026 used_prefixes |= (prefixes & PREFIX_DATA);
12027 break;
12028 case w_mode:
12029 mask = 0xfffff;
12030 op = get16 ();
12031 break;
12032 default:
12033 oappend (INTERNAL_DISASSEMBLER_ERROR);
12034 return;
12037 op &= mask;
12038 scratchbuf[0] = '$';
12039 print_operand_value (scratchbuf + 1, 1, op);
12040 oappend (scratchbuf + intel_syntax);
12041 scratchbuf[0] = '\0';
12044 static void
12045 OP_sI (int bytemode, int sizeflag)
12047 bfd_signed_vma op;
12048 bfd_signed_vma mask = -1;
12050 switch (bytemode)
12052 case b_mode:
12053 FETCH_DATA (the_info, codep + 1);
12054 op = *codep++;
12055 if ((op & 0x80) != 0)
12056 op -= 0x100;
12057 mask = 0xffffffff;
12058 break;
12059 case v_mode:
12060 USED_REX (REX_W);
12061 if (rex & REX_W)
12062 op = get32s ();
12063 else if (sizeflag & DFLAG)
12065 op = get32s ();
12066 mask = 0xffffffff;
12068 else
12070 mask = 0xffffffff;
12071 op = get16 ();
12072 if ((op & 0x8000) != 0)
12073 op -= 0x10000;
12075 used_prefixes |= (prefixes & PREFIX_DATA);
12076 break;
12077 case w_mode:
12078 op = get16 ();
12079 mask = 0xffffffff;
12080 if ((op & 0x8000) != 0)
12081 op -= 0x10000;
12082 break;
12083 default:
12084 oappend (INTERNAL_DISASSEMBLER_ERROR);
12085 return;
12088 scratchbuf[0] = '$';
12089 print_operand_value (scratchbuf + 1, 1, op);
12090 oappend (scratchbuf + intel_syntax);
12093 static void
12094 OP_J (int bytemode, int sizeflag)
12096 bfd_vma disp;
12097 bfd_vma mask = -1;
12098 bfd_vma segment = 0;
12100 switch (bytemode)
12102 case b_mode:
12103 FETCH_DATA (the_info, codep + 1);
12104 disp = *codep++;
12105 if ((disp & 0x80) != 0)
12106 disp -= 0x100;
12107 break;
12108 case v_mode:
12109 if ((sizeflag & DFLAG) || (rex & REX_W))
12110 disp = get32s ();
12111 else
12113 disp = get16 ();
12114 if ((disp & 0x8000) != 0)
12115 disp -= 0x10000;
12116 /* In 16bit mode, address is wrapped around at 64k within
12117 the same segment. Otherwise, a data16 prefix on a jump
12118 instruction means that the pc is masked to 16 bits after
12119 the displacement is added! */
12120 mask = 0xffff;
12121 if ((prefixes & PREFIX_DATA) == 0)
12122 segment = ((start_pc + codep - start_codep)
12123 & ~((bfd_vma) 0xffff));
12125 used_prefixes |= (prefixes & PREFIX_DATA);
12126 break;
12127 default:
12128 oappend (INTERNAL_DISASSEMBLER_ERROR);
12129 return;
12131 disp = ((start_pc + codep - start_codep + disp) & mask) | segment;
12132 set_op (disp, 0);
12133 print_operand_value (scratchbuf, 1, disp);
12134 oappend (scratchbuf);
12137 static void
12138 OP_SEG (int bytemode, int sizeflag)
12140 if (bytemode == w_mode)
12141 oappend (names_seg[modrm.reg]);
12142 else
12143 OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
12146 static void
12147 OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
12149 int seg, offset;
12151 if (sizeflag & DFLAG)
12153 offset = get32 ();
12154 seg = get16 ();
12156 else
12158 offset = get16 ();
12159 seg = get16 ();
12161 used_prefixes |= (prefixes & PREFIX_DATA);
12162 if (intel_syntax)
12163 sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
12164 else
12165 sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
12166 oappend (scratchbuf);
12169 static void
12170 OP_OFF (int bytemode, int sizeflag)
12172 bfd_vma off;
12174 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12175 intel_operand_size (bytemode, sizeflag);
12176 append_seg ();
12178 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
12179 off = get32 ();
12180 else
12181 off = get16 ();
12183 if (intel_syntax)
12185 if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
12186 | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
12188 oappend (names_seg[ds_reg - es_reg]);
12189 oappend (":");
12192 print_operand_value (scratchbuf, 1, off);
12193 oappend (scratchbuf);
12196 static void
12197 OP_OFF64 (int bytemode, int sizeflag)
12199 bfd_vma off;
12201 if (address_mode != mode_64bit
12202 || (prefixes & PREFIX_ADDR))
12204 OP_OFF (bytemode, sizeflag);
12205 return;
12208 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12209 intel_operand_size (bytemode, sizeflag);
12210 append_seg ();
12212 off = get64 ();
12214 if (intel_syntax)
12216 if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
12217 | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
12219 oappend (names_seg[ds_reg - es_reg]);
12220 oappend (":");
12223 print_operand_value (scratchbuf, 1, off);
12224 oappend (scratchbuf);
12227 static void
12228 ptr_reg (int code, int sizeflag)
12230 const char *s;
12232 *obufp++ = open_char;
12233 used_prefixes |= (prefixes & PREFIX_ADDR);
12234 if (address_mode == mode_64bit)
12236 if (!(sizeflag & AFLAG))
12237 s = names32[code - eAX_reg];
12238 else
12239 s = names64[code - eAX_reg];
12241 else if (sizeflag & AFLAG)
12242 s = names32[code - eAX_reg];
12243 else
12244 s = names16[code - eAX_reg];
12245 oappend (s);
12246 *obufp++ = close_char;
12247 *obufp = 0;
12250 static void
12251 OP_ESreg (int code, int sizeflag)
12253 if (intel_syntax)
12255 switch (codep[-1])
12257 case 0x6d: /* insw/insl */
12258 intel_operand_size (z_mode, sizeflag);
12259 break;
12260 case 0xa5: /* movsw/movsl/movsq */
12261 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12262 case 0xab: /* stosw/stosl */
12263 case 0xaf: /* scasw/scasl */
12264 intel_operand_size (v_mode, sizeflag);
12265 break;
12266 default:
12267 intel_operand_size (b_mode, sizeflag);
12270 oappend ("%es:" + intel_syntax);
12271 ptr_reg (code, sizeflag);
12274 static void
12275 OP_DSreg (int code, int sizeflag)
12277 if (intel_syntax)
12279 switch (codep[-1])
12281 case 0x6f: /* outsw/outsl */
12282 intel_operand_size (z_mode, sizeflag);
12283 break;
12284 case 0xa5: /* movsw/movsl/movsq */
12285 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12286 case 0xad: /* lodsw/lodsl/lodsq */
12287 intel_operand_size (v_mode, sizeflag);
12288 break;
12289 default:
12290 intel_operand_size (b_mode, sizeflag);
12293 if ((prefixes
12294 & (PREFIX_CS
12295 | PREFIX_DS
12296 | PREFIX_SS
12297 | PREFIX_ES
12298 | PREFIX_FS
12299 | PREFIX_GS)) == 0)
12300 prefixes |= PREFIX_DS;
12301 append_seg ();
12302 ptr_reg (code, sizeflag);
12305 static void
12306 OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12308 int add;
12309 if (rex & REX_R)
12311 USED_REX (REX_R);
12312 add = 8;
12314 else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
12316 lock_prefix = NULL;
12317 used_prefixes |= PREFIX_LOCK;
12318 add = 8;
12320 else
12321 add = 0;
12322 sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
12323 oappend (scratchbuf + intel_syntax);
12326 static void
12327 OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12329 int add;
12330 USED_REX (REX_R);
12331 if (rex & REX_R)
12332 add = 8;
12333 else
12334 add = 0;
12335 if (intel_syntax)
12336 sprintf (scratchbuf, "db%d", modrm.reg + add);
12337 else
12338 sprintf (scratchbuf, "%%db%d", modrm.reg + add);
12339 oappend (scratchbuf);
12342 static void
12343 OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12345 sprintf (scratchbuf, "%%tr%d", modrm.reg);
12346 oappend (scratchbuf + intel_syntax);
12349 static void
12350 OP_R (int bytemode, int sizeflag)
12352 if (modrm.mod == 3)
12353 OP_E (bytemode, sizeflag);
12354 else
12355 BadOp ();
12358 static void
12359 OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12361 used_prefixes |= (prefixes & PREFIX_DATA);
12362 if (prefixes & PREFIX_DATA)
12364 int add;
12365 USED_REX (REX_R);
12366 if (rex & REX_R)
12367 add = 8;
12368 else
12369 add = 0;
12370 sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
12372 else
12373 sprintf (scratchbuf, "%%mm%d", modrm.reg);
12374 oappend (scratchbuf + intel_syntax);
12377 static void
12378 OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
12380 int add;
12381 USED_REX (REX_R);
12382 if (rex & REX_R)
12383 add = 8;
12384 else
12385 add = 0;
12386 if (need_vex && bytemode != xmm_mode)
12388 switch (vex.length)
12390 case 128:
12391 sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
12392 break;
12393 case 256:
12394 sprintf (scratchbuf, "%%ymm%d", modrm.reg + add);
12395 break;
12396 default:
12397 abort ();
12400 else
12401 sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
12402 oappend (scratchbuf + intel_syntax);
12405 static void
12406 OP_EM (int bytemode, int sizeflag)
12408 if (modrm.mod != 3)
12410 if (intel_syntax && bytemode == v_mode)
12412 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
12413 used_prefixes |= (prefixes & PREFIX_DATA);
12415 OP_E (bytemode, sizeflag);
12416 return;
12419 /* Skip mod/rm byte. */
12420 MODRM_CHECK;
12421 codep++;
12422 used_prefixes |= (prefixes & PREFIX_DATA);
12423 if (prefixes & PREFIX_DATA)
12425 int add;
12427 USED_REX (REX_B);
12428 if (rex & REX_B)
12429 add = 8;
12430 else
12431 add = 0;
12432 sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
12434 else
12435 sprintf (scratchbuf, "%%mm%d", modrm.rm);
12436 oappend (scratchbuf + intel_syntax);
12439 /* cvt* are the only instructions in sse2 which have
12440 both SSE and MMX operands and also have 0x66 prefix
12441 in their opcode. 0x66 was originally used to differentiate
12442 between SSE and MMX instruction(operands). So we have to handle the
12443 cvt* separately using OP_EMC and OP_MXC */
12444 static void
12445 OP_EMC (int bytemode, int sizeflag)
12447 if (modrm.mod != 3)
12449 if (intel_syntax && bytemode == v_mode)
12451 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
12452 used_prefixes |= (prefixes & PREFIX_DATA);
12454 OP_E (bytemode, sizeflag);
12455 return;
12458 /* Skip mod/rm byte. */
12459 MODRM_CHECK;
12460 codep++;
12461 used_prefixes |= (prefixes & PREFIX_DATA);
12462 sprintf (scratchbuf, "%%mm%d", modrm.rm);
12463 oappend (scratchbuf + intel_syntax);
12466 static void
12467 OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12469 used_prefixes |= (prefixes & PREFIX_DATA);
12470 sprintf (scratchbuf, "%%mm%d", modrm.reg);
12471 oappend (scratchbuf + intel_syntax);
12474 static void
12475 OP_EX (int bytemode, int sizeflag)
12477 int add;
12478 if (modrm.mod != 3)
12480 OP_E (bytemode, sizeflag);
12481 return;
12483 USED_REX (REX_B);
12484 if (rex & REX_B)
12485 add = 8;
12486 else
12487 add = 0;
12489 /* Skip mod/rm byte. */
12490 MODRM_CHECK;
12491 codep++;
12492 if (need_vex
12493 && bytemode != xmm_mode
12494 && bytemode != xmmq_mode)
12496 switch (vex.length)
12498 case 128:
12499 sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
12500 break;
12501 case 256:
12502 sprintf (scratchbuf, "%%ymm%d", modrm.rm + add);
12503 break;
12504 default:
12505 abort ();
12508 else
12509 sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
12510 oappend (scratchbuf + intel_syntax);
12513 static void
12514 OP_MS (int bytemode, int sizeflag)
12516 if (modrm.mod == 3)
12517 OP_EM (bytemode, sizeflag);
12518 else
12519 BadOp ();
12522 static void
12523 OP_XS (int bytemode, int sizeflag)
12525 if (modrm.mod == 3)
12526 OP_EX (bytemode, sizeflag);
12527 else
12528 BadOp ();
12531 static void
12532 OP_M (int bytemode, int sizeflag)
12534 if (modrm.mod == 3)
12535 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
12536 BadOp ();
12537 else
12538 OP_E (bytemode, sizeflag);
12541 static void
12542 OP_0f07 (int bytemode, int sizeflag)
12544 if (modrm.mod != 3 || modrm.rm != 0)
12545 BadOp ();
12546 else
12547 OP_E (bytemode, sizeflag);
12550 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
12551 32bit mode and "xchg %rax,%rax" in 64bit mode. */
12553 static void
12554 NOP_Fixup1 (int bytemode, int sizeflag)
12556 if ((prefixes & PREFIX_DATA) != 0
12557 || (rex != 0
12558 && rex != 0x48
12559 && address_mode == mode_64bit))
12560 OP_REG (bytemode, sizeflag);
12561 else
12562 strcpy (obuf, "nop");
12565 static void
12566 NOP_Fixup2 (int bytemode, int sizeflag)
12568 if ((prefixes & PREFIX_DATA) != 0
12569 || (rex != 0
12570 && rex != 0x48
12571 && address_mode == mode_64bit))
12572 OP_IMREG (bytemode, sizeflag);
12575 static const char *const Suffix3DNow[] = {
12576 /* 00 */ NULL, NULL, NULL, NULL,
12577 /* 04 */ NULL, NULL, NULL, NULL,
12578 /* 08 */ NULL, NULL, NULL, NULL,
12579 /* 0C */ "pi2fw", "pi2fd", NULL, NULL,
12580 /* 10 */ NULL, NULL, NULL, NULL,
12581 /* 14 */ NULL, NULL, NULL, NULL,
12582 /* 18 */ NULL, NULL, NULL, NULL,
12583 /* 1C */ "pf2iw", "pf2id", NULL, NULL,
12584 /* 20 */ NULL, NULL, NULL, NULL,
12585 /* 24 */ NULL, NULL, NULL, NULL,
12586 /* 28 */ NULL, NULL, NULL, NULL,
12587 /* 2C */ NULL, NULL, NULL, NULL,
12588 /* 30 */ NULL, NULL, NULL, NULL,
12589 /* 34 */ NULL, NULL, NULL, NULL,
12590 /* 38 */ NULL, NULL, NULL, NULL,
12591 /* 3C */ NULL, NULL, NULL, NULL,
12592 /* 40 */ NULL, NULL, NULL, NULL,
12593 /* 44 */ NULL, NULL, NULL, NULL,
12594 /* 48 */ NULL, NULL, NULL, NULL,
12595 /* 4C */ NULL, NULL, NULL, NULL,
12596 /* 50 */ NULL, NULL, NULL, NULL,
12597 /* 54 */ NULL, NULL, NULL, NULL,
12598 /* 58 */ NULL, NULL, NULL, NULL,
12599 /* 5C */ NULL, NULL, NULL, NULL,
12600 /* 60 */ NULL, NULL, NULL, NULL,
12601 /* 64 */ NULL, NULL, NULL, NULL,
12602 /* 68 */ NULL, NULL, NULL, NULL,
12603 /* 6C */ NULL, NULL, NULL, NULL,
12604 /* 70 */ NULL, NULL, NULL, NULL,
12605 /* 74 */ NULL, NULL, NULL, NULL,
12606 /* 78 */ NULL, NULL, NULL, NULL,
12607 /* 7C */ NULL, NULL, NULL, NULL,
12608 /* 80 */ NULL, NULL, NULL, NULL,
12609 /* 84 */ NULL, NULL, NULL, NULL,
12610 /* 88 */ NULL, NULL, "pfnacc", NULL,
12611 /* 8C */ NULL, NULL, "pfpnacc", NULL,
12612 /* 90 */ "pfcmpge", NULL, NULL, NULL,
12613 /* 94 */ "pfmin", NULL, "pfrcp", "pfrsqrt",
12614 /* 98 */ NULL, NULL, "pfsub", NULL,
12615 /* 9C */ NULL, NULL, "pfadd", NULL,
12616 /* A0 */ "pfcmpgt", NULL, NULL, NULL,
12617 /* A4 */ "pfmax", NULL, "pfrcpit1", "pfrsqit1",
12618 /* A8 */ NULL, NULL, "pfsubr", NULL,
12619 /* AC */ NULL, NULL, "pfacc", NULL,
12620 /* B0 */ "pfcmpeq", NULL, NULL, NULL,
12621 /* B4 */ "pfmul", NULL, "pfrcpit2", "pmulhrw",
12622 /* B8 */ NULL, NULL, NULL, "pswapd",
12623 /* BC */ NULL, NULL, NULL, "pavgusb",
12624 /* C0 */ NULL, NULL, NULL, NULL,
12625 /* C4 */ NULL, NULL, NULL, NULL,
12626 /* C8 */ NULL, NULL, NULL, NULL,
12627 /* CC */ NULL, NULL, NULL, NULL,
12628 /* D0 */ NULL, NULL, NULL, NULL,
12629 /* D4 */ NULL, NULL, NULL, NULL,
12630 /* D8 */ NULL, NULL, NULL, NULL,
12631 /* DC */ NULL, NULL, NULL, NULL,
12632 /* E0 */ NULL, NULL, NULL, NULL,
12633 /* E4 */ NULL, NULL, NULL, NULL,
12634 /* E8 */ NULL, NULL, NULL, NULL,
12635 /* EC */ NULL, NULL, NULL, NULL,
12636 /* F0 */ NULL, NULL, NULL, NULL,
12637 /* F4 */ NULL, NULL, NULL, NULL,
12638 /* F8 */ NULL, NULL, NULL, NULL,
12639 /* FC */ NULL, NULL, NULL, NULL,
12642 static void
12643 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12645 const char *mnemonic;
12647 FETCH_DATA (the_info, codep + 1);
12648 /* AMD 3DNow! instructions are specified by an opcode suffix in the
12649 place where an 8-bit immediate would normally go. ie. the last
12650 byte of the instruction. */
12651 obufp = obuf + strlen (obuf);
12652 mnemonic = Suffix3DNow[*codep++ & 0xff];
12653 if (mnemonic)
12654 oappend (mnemonic);
12655 else
12657 /* Since a variable sized modrm/sib chunk is between the start
12658 of the opcode (0x0f0f) and the opcode suffix, we need to do
12659 all the modrm processing first, and don't know until now that
12660 we have a bad opcode. This necessitates some cleaning up. */
12661 op_out[0][0] = '\0';
12662 op_out[1][0] = '\0';
12663 BadOp ();
12667 static const char *simd_cmp_op[] = {
12668 "eq",
12669 "lt",
12670 "le",
12671 "unord",
12672 "neq",
12673 "nlt",
12674 "nle",
12675 "ord"
12678 static void
12679 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12681 unsigned int cmp_type;
12683 FETCH_DATA (the_info, codep + 1);
12684 cmp_type = *codep++ & 0xff;
12685 if (cmp_type < ARRAY_SIZE (simd_cmp_op))
12687 char suffix [3];
12688 char *p = obuf + strlen (obuf) - 2;
12689 suffix[0] = p[0];
12690 suffix[1] = p[1];
12691 suffix[2] = '\0';
12692 sprintf (p, "%s%s", simd_cmp_op[cmp_type], suffix);
12694 else
12696 /* We have a reserved extension byte. Output it directly. */
12697 scratchbuf[0] = '$';
12698 print_operand_value (scratchbuf + 1, 1, cmp_type);
12699 oappend (scratchbuf + intel_syntax);
12700 scratchbuf[0] = '\0';
12704 static void
12705 OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
12706 int sizeflag ATTRIBUTE_UNUSED)
12708 /* mwait %eax,%ecx */
12709 if (!intel_syntax)
12711 const char **names = (address_mode == mode_64bit
12712 ? names64 : names32);
12713 strcpy (op_out[0], names[0]);
12714 strcpy (op_out[1], names[1]);
12715 two_source_ops = 1;
12717 /* Skip mod/rm byte. */
12718 MODRM_CHECK;
12719 codep++;
12722 static void
12723 OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
12724 int sizeflag ATTRIBUTE_UNUSED)
12726 /* monitor %eax,%ecx,%edx" */
12727 if (!intel_syntax)
12729 const char **op1_names;
12730 const char **names = (address_mode == mode_64bit
12731 ? names64 : names32);
12733 if (!(prefixes & PREFIX_ADDR))
12734 op1_names = (address_mode == mode_16bit
12735 ? names16 : names);
12736 else
12738 /* Remove "addr16/addr32". */
12739 addr_prefix = NULL;
12740 op1_names = (address_mode != mode_32bit
12741 ? names32 : names16);
12742 used_prefixes |= PREFIX_ADDR;
12744 strcpy (op_out[0], op1_names[0]);
12745 strcpy (op_out[1], names[1]);
12746 strcpy (op_out[2], names[2]);
12747 two_source_ops = 1;
12749 /* Skip mod/rm byte. */
12750 MODRM_CHECK;
12751 codep++;
12754 static void
12755 BadOp (void)
12757 /* Throw away prefixes and 1st. opcode byte. */
12758 codep = insn_codep + 1;
12759 oappend ("(bad)");
12762 static void
12763 REP_Fixup (int bytemode, int sizeflag)
12765 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
12766 lods and stos. */
12767 if (prefixes & PREFIX_REPZ)
12768 repz_prefix = "rep ";
12770 switch (bytemode)
12772 case al_reg:
12773 case eAX_reg:
12774 case indir_dx_reg:
12775 OP_IMREG (bytemode, sizeflag);
12776 break;
12777 case eDI_reg:
12778 OP_ESreg (bytemode, sizeflag);
12779 break;
12780 case eSI_reg:
12781 OP_DSreg (bytemode, sizeflag);
12782 break;
12783 default:
12784 abort ();
12785 break;
12789 static void
12790 CMPXCHG8B_Fixup (int bytemode, int sizeflag)
12792 USED_REX (REX_W);
12793 if (rex & REX_W)
12795 /* Change cmpxchg8b to cmpxchg16b. */
12796 char *p = obuf + strlen (obuf) - 2;
12797 strcpy (p, "16b");
12798 bytemode = o_mode;
12800 OP_M (bytemode, sizeflag);
12803 static void
12804 XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
12806 if (need_vex)
12808 switch (vex.length)
12810 case 128:
12811 sprintf (scratchbuf, "%%xmm%d", reg);
12812 break;
12813 case 256:
12814 sprintf (scratchbuf, "%%ymm%d", reg);
12815 break;
12816 default:
12817 abort ();
12820 else
12821 sprintf (scratchbuf, "%%xmm%d", reg);
12822 oappend (scratchbuf + intel_syntax);
12825 static void
12826 CRC32_Fixup (int bytemode, int sizeflag)
12828 /* Add proper suffix to "crc32". */
12829 char *p = obuf + strlen (obuf);
12831 switch (bytemode)
12833 case b_mode:
12834 if (intel_syntax)
12835 break;
12837 *p++ = 'b';
12838 break;
12839 case v_mode:
12840 if (intel_syntax)
12841 break;
12843 USED_REX (REX_W);
12844 if (rex & REX_W)
12845 *p++ = 'q';
12846 else if (sizeflag & DFLAG)
12847 *p++ = 'l';
12848 else
12849 *p++ = 'w';
12850 used_prefixes |= (prefixes & PREFIX_DATA);
12851 break;
12852 default:
12853 oappend (INTERNAL_DISASSEMBLER_ERROR);
12854 break;
12856 *p = '\0';
12858 if (modrm.mod == 3)
12860 int add;
12862 /* Skip mod/rm byte. */
12863 MODRM_CHECK;
12864 codep++;
12866 USED_REX (REX_B);
12867 add = (rex & REX_B) ? 8 : 0;
12868 if (bytemode == b_mode)
12870 USED_REX (0);
12871 if (rex)
12872 oappend (names8rex[modrm.rm + add]);
12873 else
12874 oappend (names8[modrm.rm + add]);
12876 else
12878 USED_REX (REX_W);
12879 if (rex & REX_W)
12880 oappend (names64[modrm.rm + add]);
12881 else if ((prefixes & PREFIX_DATA))
12882 oappend (names16[modrm.rm + add]);
12883 else
12884 oappend (names32[modrm.rm + add]);
12887 else
12888 OP_E (bytemode, sizeflag);
12891 /* Print a DREX argument as either a register or memory operation. */
12892 static void
12893 print_drex_arg (unsigned int reg, int bytemode, int sizeflag)
12895 if (reg == DREX_REG_UNKNOWN)
12896 BadOp ();
12898 else if (reg != DREX_REG_MEMORY)
12900 sprintf (scratchbuf, "%%xmm%d", reg);
12901 oappend (scratchbuf + intel_syntax);
12904 else
12905 OP_E_extended (bytemode, sizeflag, 1);
12908 /* SSE5 instructions that have 4 arguments are encoded as:
12909 0f 24 <sub-opcode> <modrm> <optional-sib> <drex> <offset>.
12911 The <sub-opcode> byte has 1 bit (0x4) that is combined with 1 bit in
12912 the DREX field (0x8) to determine how the arguments are laid out.
12913 The destination register must be the same register as one of the
12914 inputs, and it is encoded in the DREX byte. No REX prefix is used
12915 for these instructions, since the DREX field contains the 3 extension
12916 bits provided by the REX prefix.
12918 The bytemode argument adds 2 extra bits for passing extra information:
12919 DREX_OC1 -- Set the OC1 bit to indicate dest == 1st arg
12920 DREX_NO_OC0 -- OC0 in DREX is invalid
12921 (but pretend it is set). */
12923 static void
12924 OP_DREX4 (int flag_bytemode, int sizeflag)
12926 unsigned int drex_byte;
12927 unsigned int regs[4];
12928 unsigned int modrm_regmem;
12929 unsigned int modrm_reg;
12930 unsigned int drex_reg;
12931 int bytemode;
12932 int rex_save = rex;
12933 int rex_used_save = rex_used;
12934 int has_sib = 0;
12935 int oc1 = (flag_bytemode & DREX_OC1) ? 2 : 0;
12936 int oc0;
12937 int i;
12939 bytemode = flag_bytemode & ~ DREX_MASK;
12941 for (i = 0; i < 4; i++)
12942 regs[i] = DREX_REG_UNKNOWN;
12944 /* Determine if we have a SIB byte in addition to MODRM before the
12945 DREX byte. */
12946 if (((sizeflag & AFLAG) || address_mode == mode_64bit)
12947 && (modrm.mod != 3)
12948 && (modrm.rm == 4))
12949 has_sib = 1;
12951 /* Get the DREX byte. */
12952 FETCH_DATA (the_info, codep + 2 + has_sib);
12953 drex_byte = codep[has_sib+1];
12954 drex_reg = DREX_XMM (drex_byte);
12955 modrm_reg = modrm.reg + ((drex_byte & REX_R) ? 8 : 0);
12957 /* Is OC0 legal? If not, hardwire oc0 == 1. */
12958 if (flag_bytemode & DREX_NO_OC0)
12960 oc0 = 1;
12961 if (DREX_OC0 (drex_byte))
12962 BadOp ();
12964 else
12965 oc0 = DREX_OC0 (drex_byte);
12967 if (modrm.mod == 3)
12969 /* regmem == register */
12970 modrm_regmem = modrm.rm + ((drex_byte & REX_B) ? 8 : 0);
12971 rex = rex_used = 0;
12972 /* skip modrm/drex since we don't call OP_E_extended */
12973 codep += 2;
12975 else
12977 /* regmem == memory, fill in appropriate REX bits */
12978 modrm_regmem = DREX_REG_MEMORY;
12979 rex = drex_byte & (REX_B | REX_X | REX_R);
12980 if (rex)
12981 rex |= REX_OPCODE;
12982 rex_used = rex;
12985 /* Based on the OC1/OC0 bits, lay out the arguments in the correct
12986 order. */
12987 switch (oc0 + oc1)
12989 default:
12990 BadOp ();
12991 return;
12993 case 0:
12994 regs[0] = modrm_regmem;
12995 regs[1] = modrm_reg;
12996 regs[2] = drex_reg;
12997 regs[3] = drex_reg;
12998 break;
13000 case 1:
13001 regs[0] = modrm_reg;
13002 regs[1] = modrm_regmem;
13003 regs[2] = drex_reg;
13004 regs[3] = drex_reg;
13005 break;
13007 case 2:
13008 regs[0] = drex_reg;
13009 regs[1] = modrm_regmem;
13010 regs[2] = modrm_reg;
13011 regs[3] = drex_reg;
13012 break;
13014 case 3:
13015 regs[0] = drex_reg;
13016 regs[1] = modrm_reg;
13017 regs[2] = modrm_regmem;
13018 regs[3] = drex_reg;
13019 break;
13022 /* Print out the arguments. */
13023 for (i = 0; i < 4; i++)
13025 int j = (intel_syntax) ? 3 - i : i;
13026 if (i > 0)
13028 *obufp++ = ',';
13029 *obufp = '\0';
13032 print_drex_arg (regs[j], bytemode, sizeflag);
13035 rex = rex_save;
13036 rex_used = rex_used_save;
13039 /* SSE5 instructions that have 3 arguments, and are encoded as:
13040 0f 24 <sub-opcode> <modrm> <optional-sib> <drex> <offset> (or)
13041 0f 25 <sub-opcode> <modrm> <optional-sib> <drex> <offset> <cmp-byte>
13043 The DREX field has 1 bit (0x8) to determine how the arguments are
13044 laid out. The destination register is encoded in the DREX byte.
13045 No REX prefix is used for these instructions, since the DREX field
13046 contains the 3 extension bits provided by the REX prefix. */
13048 static void
13049 OP_DREX3 (int flag_bytemode, int sizeflag)
13051 unsigned int drex_byte;
13052 unsigned int regs[3];
13053 unsigned int modrm_regmem;
13054 unsigned int modrm_reg;
13055 unsigned int drex_reg;
13056 int bytemode;
13057 int rex_save = rex;
13058 int rex_used_save = rex_used;
13059 int has_sib = 0;
13060 int oc0;
13061 int i;
13063 bytemode = flag_bytemode & ~ DREX_MASK;
13065 for (i = 0; i < 3; i++)
13066 regs[i] = DREX_REG_UNKNOWN;
13068 /* Determine if we have a SIB byte in addition to MODRM before the
13069 DREX byte. */
13070 if (((sizeflag & AFLAG) || address_mode == mode_64bit)
13071 && (modrm.mod != 3)
13072 && (modrm.rm == 4))
13073 has_sib = 1;
13075 /* Get the DREX byte. */
13076 FETCH_DATA (the_info, codep + 2 + has_sib);
13077 drex_byte = codep[has_sib+1];
13078 drex_reg = DREX_XMM (drex_byte);
13079 modrm_reg = modrm.reg + ((drex_byte & REX_R) ? 8 : 0);
13081 /* Is OC0 legal? If not, hardwire oc0 == 0 */
13082 oc0 = DREX_OC0 (drex_byte);
13083 if ((flag_bytemode & DREX_NO_OC0) && oc0)
13084 BadOp ();
13086 if (modrm.mod == 3)
13088 /* regmem == register */
13089 modrm_regmem = modrm.rm + ((drex_byte & REX_B) ? 8 : 0);
13090 rex = rex_used = 0;
13091 /* skip modrm/drex since we don't call OP_E_extended. */
13092 codep += 2;
13094 else
13096 /* regmem == memory, fill in appropriate REX bits. */
13097 modrm_regmem = DREX_REG_MEMORY;
13098 rex = drex_byte & (REX_B | REX_X | REX_R);
13099 if (rex)
13100 rex |= REX_OPCODE;
13101 rex_used = rex;
13104 /* Based on the OC1/OC0 bits, lay out the arguments in the correct
13105 order. */
13106 switch (oc0)
13108 default:
13109 BadOp ();
13110 return;
13112 case 0:
13113 regs[0] = modrm_regmem;
13114 regs[1] = modrm_reg;
13115 regs[2] = drex_reg;
13116 break;
13118 case 1:
13119 regs[0] = modrm_reg;
13120 regs[1] = modrm_regmem;
13121 regs[2] = drex_reg;
13122 break;
13125 /* Print out the arguments. */
13126 for (i = 0; i < 3; i++)
13128 int j = (intel_syntax) ? 2 - i : i;
13129 if (i > 0)
13131 *obufp++ = ',';
13132 *obufp = '\0';
13135 print_drex_arg (regs[j], bytemode, sizeflag);
13138 rex = rex_save;
13139 rex_used = rex_used_save;
13142 /* Emit a floating point comparison for comp<xx> instructions. */
13144 static void
13145 OP_DREX_FCMP (int bytemode ATTRIBUTE_UNUSED,
13146 int sizeflag ATTRIBUTE_UNUSED)
13148 unsigned char byte;
13150 static const char *const cmp_test[] = {
13151 "eq",
13152 "lt",
13153 "le",
13154 "unord",
13155 "ne",
13156 "nlt",
13157 "nle",
13158 "ord",
13159 "ueq",
13160 "ult",
13161 "ule",
13162 "false",
13163 "une",
13164 "unlt",
13165 "unle",
13166 "true"
13169 FETCH_DATA (the_info, codep + 1);
13170 byte = *codep & 0xff;
13172 if (byte >= ARRAY_SIZE (cmp_test)
13173 || obuf[0] != 'c'
13174 || obuf[1] != 'o'
13175 || obuf[2] != 'm')
13177 /* The instruction isn't one we know about, so just append the
13178 extension byte as a numeric value. */
13179 OP_I (b_mode, 0);
13182 else
13184 sprintf (scratchbuf, "com%s%s", cmp_test[byte], obuf+3);
13185 strcpy (obuf, scratchbuf);
13186 codep++;
13190 /* Emit an integer point comparison for pcom<xx> instructions,
13191 rewriting the instruction to have the test inside of it. */
13193 static void
13194 OP_DREX_ICMP (int bytemode ATTRIBUTE_UNUSED,
13195 int sizeflag ATTRIBUTE_UNUSED)
13197 unsigned char byte;
13199 static const char *const cmp_test[] = {
13200 "lt",
13201 "le",
13202 "gt",
13203 "ge",
13204 "eq",
13205 "ne",
13206 "false",
13207 "true"
13210 FETCH_DATA (the_info, codep + 1);
13211 byte = *codep & 0xff;
13213 if (byte >= ARRAY_SIZE (cmp_test)
13214 || obuf[0] != 'p'
13215 || obuf[1] != 'c'
13216 || obuf[2] != 'o'
13217 || obuf[3] != 'm')
13219 /* The instruction isn't one we know about, so just print the
13220 comparison test byte as a numeric value. */
13221 OP_I (b_mode, 0);
13224 else
13226 sprintf (scratchbuf, "pcom%s%s", cmp_test[byte], obuf+4);
13227 strcpy (obuf, scratchbuf);
13228 codep++;
13232 /* Display the destination register operand for instructions with
13233 VEX. */
13235 static void
13236 OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13238 if (!need_vex)
13239 abort ();
13241 if (!need_vex_reg)
13242 return;
13244 switch (vex.length)
13246 case 128:
13247 switch (bytemode)
13249 case vex_mode:
13250 case vex128_mode:
13251 break;
13252 default:
13253 abort ();
13254 return;
13257 sprintf (scratchbuf, "%%xmm%d", vex.register_specifier);
13258 break;
13259 case 256:
13260 switch (bytemode)
13262 case vex_mode:
13263 case vex256_mode:
13264 break;
13265 default:
13266 abort ();
13267 return;
13270 sprintf (scratchbuf, "%%ymm%d", vex.register_specifier);
13271 break;
13272 default:
13273 abort ();
13274 break;
13276 oappend (scratchbuf + intel_syntax);
13279 static void
13280 OP_EX_VexW (int bytemode, int sizeflag)
13282 int reg = -1;
13283 static unsigned char vex_i4;
13285 if (!vex_i4_done)
13287 int bytes_before_imm = 0;
13289 /* Skip mod/rm byte once. We will be called twice. */
13290 MODRM_CHECK;
13291 codep++;
13293 if (modrm.mod != 3)
13295 /* There are SIB/displacement bytes. */
13296 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
13298 /* 32/64 bit address mode */
13299 int base = modrm.rm;
13301 /* Check SIB byte. */
13302 if (base == 4)
13304 FETCH_DATA (the_info, codep + 1);
13305 base = *codep & 7;
13306 bytes_before_imm++;
13309 switch (modrm.mod)
13311 case 0:
13312 /* When modrm.rm == 5 or modrm.rm == 4 and base in
13313 SIB == 5, there is a 4 byte displacement. */
13314 if (base != 5)
13315 /* No displacement. */
13316 break;
13317 case 2:
13318 /* 4 byte displacement. */
13319 bytes_before_imm += 4;
13320 break;
13321 case 1:
13322 /* 1 byte displacement. */
13323 bytes_before_imm++;
13324 break;
13327 else
13328 { /* 16 bit address mode */
13329 switch (modrm.mod)
13331 case 0:
13332 /* When modrm.rm == 6, there is a 2 byte
13333 displacement. */
13334 if (modrm.rm != 6)
13335 /* No displacement. */
13336 break;
13337 case 2:
13338 /* 2 byte displacement. */
13339 bytes_before_imm += 2;
13340 break;
13341 case 1:
13342 /* 1 byte displacement. */
13343 bytes_before_imm++;
13344 break;
13349 FETCH_DATA (the_info, codep + bytes_before_imm + 1);
13350 vex_i4 = codep [bytes_before_imm];
13351 vex_i4_done = 1;
13352 if (vex.w)
13353 reg = vex_i4 >> 4;
13355 else
13357 if (!vex.w)
13358 reg = vex_i4 >> 4;
13361 if (reg == -1 && modrm.mod != 3)
13363 OP_E_memory (bytemode, sizeflag, 0);
13364 return;
13366 else
13368 if (reg == -1)
13370 reg = modrm.rm;
13371 USED_REX (REX_B);
13372 if (rex & REX_B)
13373 reg += 8;
13375 else if (reg > 7 && address_mode != mode_64bit)
13376 BadOp ();
13379 switch (vex.length)
13381 case 128:
13382 sprintf (scratchbuf, "%%xmm%d", reg);
13383 break;
13384 case 256:
13385 sprintf (scratchbuf, "%%ymm%d", reg);
13386 break;
13387 default:
13388 abort ();
13390 oappend (scratchbuf + intel_syntax);
13393 static void
13394 VEXI4_Fixup (int bytemode ATTRIBUTE_UNUSED,
13395 int sizeflag ATTRIBUTE_UNUSED)
13397 /* Skip the immediate byte and check for invalid bits. */
13398 FETCH_DATA (the_info, codep + 1);
13399 if (*codep++ & 0xf)
13400 BadOp ();
13403 static void
13404 OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13406 int reg;
13407 FETCH_DATA (the_info, codep + 1);
13408 reg = *codep++;
13410 if (bytemode != x_mode)
13411 abort ();
13413 if (reg & 0xf)
13414 BadOp ();
13416 reg >>= 4;
13417 switch (vex.length)
13419 case 128:
13420 sprintf (scratchbuf, "%%xmm%d", reg);
13421 break;
13422 case 256:
13423 sprintf (scratchbuf, "%%ymm%d", reg);
13424 break;
13425 default:
13426 abort ();
13428 oappend (scratchbuf + intel_syntax);
13431 static void
13432 OP_XMM_VexW (int bytemode, int sizeflag)
13434 /* Turn off the REX.W bit since it is used for swapping operands
13435 now. */
13436 rex &= ~REX_W;
13437 OP_XMM (bytemode, sizeflag);
13440 static void
13441 OP_EX_Vex (int bytemode, int sizeflag)
13443 if (modrm.mod != 3)
13445 if (vex.register_specifier != 0)
13446 BadOp ();
13447 need_vex_reg = 0;
13449 OP_EX (bytemode, sizeflag);
13452 static void
13453 OP_XMM_Vex (int bytemode, int sizeflag)
13455 if (modrm.mod != 3)
13457 if (vex.register_specifier != 0)
13458 BadOp ();
13459 need_vex_reg = 0;
13461 OP_XMM (bytemode, sizeflag);
13464 static void
13465 VZERO_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13467 switch (vex.length)
13469 case 128:
13470 strcpy (obuf, "vzeroupper");
13471 break;
13472 case 256:
13473 strcpy (obuf, "vzeroall");
13474 break;
13475 default:
13476 abort ();
13480 static const char *vex_cmp_op[] = {
13481 "eq",
13482 "lt",
13483 "le",
13484 "unord",
13485 "neq",
13486 "nlt",
13487 "nle",
13488 "ord",
13489 "eq_uq",
13490 "nge",
13491 "ngt",
13492 "false",
13493 "neq_oq",
13494 "ge",
13495 "gt",
13496 "true",
13497 "eq_os",
13498 "lt_oq",
13499 "le_oq",
13500 "unord_s",
13501 "neq_us",
13502 "nlt_uq",
13503 "nle_uq",
13504 "ord_s",
13505 "eq_us",
13506 "nge_uq",
13507 "ngt_uq",
13508 "false_os",
13509 "neq_os",
13510 "ge_oq",
13511 "gt_oq",
13512 "true_us"
13515 static void
13516 VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13518 unsigned int cmp_type;
13520 FETCH_DATA (the_info, codep + 1);
13521 cmp_type = *codep++ & 0xff;
13522 if (cmp_type < ARRAY_SIZE (vex_cmp_op))
13524 char suffix [3];
13525 char *p = obuf + strlen (obuf) - 2;
13526 suffix[0] = p[0];
13527 suffix[1] = p[1];
13528 suffix[2] = '\0';
13529 sprintf (p, "%s%s", vex_cmp_op[cmp_type], suffix);
13531 else
13533 /* We have a reserved extension byte. Output it directly. */
13534 scratchbuf[0] = '$';
13535 print_operand_value (scratchbuf + 1, 1, cmp_type);
13536 oappend (scratchbuf + intel_syntax);
13537 scratchbuf[0] = '\0';
13541 static const char *pclmul_op[] = {
13542 "lql",
13543 "hql",
13544 "lqh",
13545 "hqh"
13548 static void
13549 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
13550 int sizeflag ATTRIBUTE_UNUSED)
13552 unsigned int pclmul_type;
13554 FETCH_DATA (the_info, codep + 1);
13555 pclmul_type = *codep++ & 0xff;
13556 switch (pclmul_type)
13558 case 0x10:
13559 pclmul_type = 2;
13560 break;
13561 case 0x11:
13562 pclmul_type = 3;
13563 break;
13564 default:
13565 break;
13567 if (pclmul_type < ARRAY_SIZE (pclmul_op))
13569 char suffix [4];
13570 char *p = obuf + strlen (obuf) - 3;
13571 suffix[0] = p[0];
13572 suffix[1] = p[1];
13573 suffix[2] = p[2];
13574 suffix[3] = '\0';
13575 sprintf (p, "%s%s", pclmul_op[pclmul_type], suffix);
13577 else
13579 /* We have a reserved extension byte. Output it directly. */
13580 scratchbuf[0] = '$';
13581 print_operand_value (scratchbuf + 1, 1, pclmul_type);
13582 oappend (scratchbuf + intel_syntax);
13583 scratchbuf[0] = '\0';
13587 static const char *vpermil2_op[] = {
13588 "td",
13589 "td",
13590 "mo",
13591 "mz"
13594 static void
13595 VPERMIL2_Fixup (int bytemode ATTRIBUTE_UNUSED,
13596 int sizeflag ATTRIBUTE_UNUSED)
13598 unsigned int vpermil2_type;
13600 FETCH_DATA (the_info, codep + 1);
13601 vpermil2_type = *codep++ & 0xf;
13602 if (vpermil2_type < ARRAY_SIZE (vpermil2_op))
13604 char suffix [4];
13605 char *p = obuf + strlen (obuf) - 3;
13606 suffix[0] = p[0];
13607 suffix[1] = p[1];
13608 suffix[2] = p[2];
13609 suffix[3] = '\0';
13610 sprintf (p, "%s%s", vpermil2_op[vpermil2_type], suffix);
13612 else
13614 /* We have a reserved extension byte. Output it directly. */
13615 scratchbuf[0] = '$';
13616 print_operand_value (scratchbuf + 1, 1, vpermil2_type);
13617 oappend (scratchbuf + intel_syntax);
13618 scratchbuf[0] = '\0';