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)
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)
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. */
39 #include "opcode/i386.h"
40 #include "libiberty.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_extended (int, int, int);
57 static void print_displacement (char *, bfd_vma
);
58 static void OP_E (int, int);
59 static void OP_G (int, int);
60 static bfd_vma
get64 (void);
61 static bfd_signed_vma
get32 (void);
62 static bfd_signed_vma
get32s (void);
63 static int get16 (void);
64 static void set_op (bfd_vma
, int);
65 static void OP_Skip_MODRM (int, int);
66 static void OP_REG (int, int);
67 static void OP_IMREG (int, int);
68 static void OP_I (int, int);
69 static void OP_I64 (int, int);
70 static void OP_sI (int, int);
71 static void OP_J (int, int);
72 static void OP_SEG (int, int);
73 static void OP_DIR (int, int);
74 static void OP_OFF (int, int);
75 static void OP_OFF64 (int, int);
76 static void ptr_reg (int, int);
77 static void OP_ESreg (int, int);
78 static void OP_DSreg (int, int);
79 static void OP_C (int, int);
80 static void OP_D (int, int);
81 static void OP_T (int, int);
82 static void OP_R (int, int);
83 static void OP_MMX (int, int);
84 static void OP_XMM (int, int);
85 static void OP_EM (int, int);
86 static void OP_EX (int, int);
87 static void OP_EMC (int,int);
88 static void OP_MXC (int,int);
89 static void OP_MS (int, int);
90 static void OP_XS (int, int);
91 static void OP_M (int, int);
92 static void OP_0f07 (int, int);
93 static void OP_Monitor (int, int);
94 static void OP_Mwait (int, int);
95 static void NOP_Fixup1 (int, int);
96 static void NOP_Fixup2 (int, int);
97 static void OP_3DNowSuffix (int, int);
98 static void CMP_Fixup (int, int);
99 static void BadOp (void);
100 static void REP_Fixup (int, int);
101 static void CMPXCHG8B_Fixup (int, int);
102 static void XMM_Fixup (int, int);
103 static void CRC32_Fixup (int, int);
104 static void print_drex_arg (unsigned int, int, int);
105 static void OP_DREX4 (int, int);
106 static void OP_DREX3 (int, int);
107 static void OP_DREX_ICMP (int, int);
108 static void OP_DREX_FCMP (int, int);
111 /* Points to first byte not fetched. */
112 bfd_byte
*max_fetched
;
113 bfd_byte the_buffer
[MAX_MNEM_SIZE
];
126 enum address_mode address_mode
;
128 /* Flags for the prefixes for the current instruction. See below. */
131 /* REX prefix the current instruction. See below. */
133 /* Bits of REX we've already used. */
135 /* Mark parts used in the REX prefix. When we are testing for
136 empty prefix (for 8bit register REX extension), just mask it
137 out. Otherwise test for REX bit is excuse for existence of REX
138 only in case value is nonzero. */
139 #define USED_REX(value) \
144 rex_used |= (value) | REX_OPCODE; \
147 rex_used |= REX_OPCODE; \
150 /* Special 'registers' for DREX handling */
151 #define DREX_REG_UNKNOWN 1000 /* not initialized */
152 #define DREX_REG_MEMORY 1001 /* use MODRM/SIB/OFFSET memory */
154 /* The DREX byte has the following fields:
155 Bits 7-4 -- DREX.Dest, xmm destination register
156 Bit 3 -- DREX.OC0, operand config bit defines operand order
157 Bit 2 -- DREX.R, equivalent to REX_R bit, to extend ModRM register
158 Bit 1 -- DREX.X, equivalent to REX_X bit, to extend SIB index field
159 Bit 0 -- DREX.W, equivalent to REX_B bit, to extend ModRM r/m field,
160 SIB base field, or opcode reg field. */
161 #define DREX_XMM(drex) ((drex >> 4) & 0xf)
162 #define DREX_OC0(drex) ((drex >> 3) & 0x1)
164 /* Flags for prefixes which we somehow handled when printing the
165 current instruction. */
166 static int used_prefixes
;
168 /* Flags stored in PREFIXES. */
169 #define PREFIX_REPZ 1
170 #define PREFIX_REPNZ 2
171 #define PREFIX_LOCK 4
173 #define PREFIX_SS 0x10
174 #define PREFIX_DS 0x20
175 #define PREFIX_ES 0x40
176 #define PREFIX_FS 0x80
177 #define PREFIX_GS 0x100
178 #define PREFIX_DATA 0x200
179 #define PREFIX_ADDR 0x400
180 #define PREFIX_FWAIT 0x800
182 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
183 to ADDR (exclusive) are valid. Returns 1 for success, longjmps
185 #define FETCH_DATA(info, addr) \
186 ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
187 ? 1 : fetch_data ((info), (addr)))
190 fetch_data (struct disassemble_info
*info
, bfd_byte
*addr
)
193 struct dis_private
*priv
= (struct dis_private
*) info
->private_data
;
194 bfd_vma start
= priv
->insn_start
+ (priv
->max_fetched
- priv
->the_buffer
);
196 if (addr
<= priv
->the_buffer
+ MAX_MNEM_SIZE
)
197 status
= (*info
->read_memory_func
) (start
,
199 addr
- priv
->max_fetched
,
205 /* If we did manage to read at least one byte, then
206 print_insn_i386 will do something sensible. Otherwise, print
207 an error. We do that here because this is where we know
209 if (priv
->max_fetched
== priv
->the_buffer
)
210 (*info
->memory_error_func
) (status
, start
, info
);
211 longjmp (priv
->bailout
, 1);
214 priv
->max_fetched
= addr
;
218 #define XX { NULL, 0 }
220 #define Eb { OP_E, b_mode }
221 #define Ev { OP_E, v_mode }
222 #define Ed { OP_E, d_mode }
223 #define Edq { OP_E, dq_mode }
224 #define Edqw { OP_E, dqw_mode }
225 #define Edqb { OP_E, dqb_mode }
226 #define Edqd { OP_E, dqd_mode }
227 #define Eq { OP_E, q_mode }
228 #define indirEv { OP_indirE, stack_v_mode }
229 #define indirEp { OP_indirE, f_mode }
230 #define stackEv { OP_E, stack_v_mode }
231 #define Em { OP_E, m_mode }
232 #define Ew { OP_E, w_mode }
233 #define M { OP_M, 0 } /* lea, lgdt, etc. */
234 #define Ma { OP_M, v_mode }
235 #define Mb { OP_M, b_mode }
236 #define Md { OP_M, d_mode }
237 #define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */
238 #define Mq { OP_M, q_mode }
239 #define Mx { OP_M, x_mode }
240 #define Gb { OP_G, b_mode }
241 #define Gv { OP_G, v_mode }
242 #define Gd { OP_G, d_mode }
243 #define Gdq { OP_G, dq_mode }
244 #define Gm { OP_G, m_mode }
245 #define Gw { OP_G, w_mode }
246 #define Rd { OP_R, d_mode }
247 #define Rm { OP_R, m_mode }
248 #define Ib { OP_I, b_mode }
249 #define sIb { OP_sI, b_mode } /* sign extened byte */
250 #define Iv { OP_I, v_mode }
251 #define Iq { OP_I, q_mode }
252 #define Iv64 { OP_I64, v_mode }
253 #define Iw { OP_I, w_mode }
254 #define I1 { OP_I, const_1_mode }
255 #define Jb { OP_J, b_mode }
256 #define Jv { OP_J, v_mode }
257 #define Cm { OP_C, m_mode }
258 #define Dm { OP_D, m_mode }
259 #define Td { OP_T, d_mode }
260 #define Skip_MODRM { OP_Skip_MODRM, 0 }
262 #define RMeAX { OP_REG, eAX_reg }
263 #define RMeBX { OP_REG, eBX_reg }
264 #define RMeCX { OP_REG, eCX_reg }
265 #define RMeDX { OP_REG, eDX_reg }
266 #define RMeSP { OP_REG, eSP_reg }
267 #define RMeBP { OP_REG, eBP_reg }
268 #define RMeSI { OP_REG, eSI_reg }
269 #define RMeDI { OP_REG, eDI_reg }
270 #define RMrAX { OP_REG, rAX_reg }
271 #define RMrBX { OP_REG, rBX_reg }
272 #define RMrCX { OP_REG, rCX_reg }
273 #define RMrDX { OP_REG, rDX_reg }
274 #define RMrSP { OP_REG, rSP_reg }
275 #define RMrBP { OP_REG, rBP_reg }
276 #define RMrSI { OP_REG, rSI_reg }
277 #define RMrDI { OP_REG, rDI_reg }
278 #define RMAL { OP_REG, al_reg }
279 #define RMAL { OP_REG, al_reg }
280 #define RMCL { OP_REG, cl_reg }
281 #define RMDL { OP_REG, dl_reg }
282 #define RMBL { OP_REG, bl_reg }
283 #define RMAH { OP_REG, ah_reg }
284 #define RMCH { OP_REG, ch_reg }
285 #define RMDH { OP_REG, dh_reg }
286 #define RMBH { OP_REG, bh_reg }
287 #define RMAX { OP_REG, ax_reg }
288 #define RMDX { OP_REG, dx_reg }
290 #define eAX { OP_IMREG, eAX_reg }
291 #define eBX { OP_IMREG, eBX_reg }
292 #define eCX { OP_IMREG, eCX_reg }
293 #define eDX { OP_IMREG, eDX_reg }
294 #define eSP { OP_IMREG, eSP_reg }
295 #define eBP { OP_IMREG, eBP_reg }
296 #define eSI { OP_IMREG, eSI_reg }
297 #define eDI { OP_IMREG, eDI_reg }
298 #define AL { OP_IMREG, al_reg }
299 #define CL { OP_IMREG, cl_reg }
300 #define DL { OP_IMREG, dl_reg }
301 #define BL { OP_IMREG, bl_reg }
302 #define AH { OP_IMREG, ah_reg }
303 #define CH { OP_IMREG, ch_reg }
304 #define DH { OP_IMREG, dh_reg }
305 #define BH { OP_IMREG, bh_reg }
306 #define AX { OP_IMREG, ax_reg }
307 #define DX { OP_IMREG, dx_reg }
308 #define zAX { OP_IMREG, z_mode_ax_reg }
309 #define indirDX { OP_IMREG, indir_dx_reg }
311 #define Sw { OP_SEG, w_mode }
312 #define Sv { OP_SEG, v_mode }
313 #define Ap { OP_DIR, 0 }
314 #define Ob { OP_OFF64, b_mode }
315 #define Ov { OP_OFF64, v_mode }
316 #define Xb { OP_DSreg, eSI_reg }
317 #define Xv { OP_DSreg, eSI_reg }
318 #define Xz { OP_DSreg, eSI_reg }
319 #define Yb { OP_ESreg, eDI_reg }
320 #define Yv { OP_ESreg, eDI_reg }
321 #define DSBX { OP_DSreg, eBX_reg }
323 #define es { OP_REG, es_reg }
324 #define ss { OP_REG, ss_reg }
325 #define cs { OP_REG, cs_reg }
326 #define ds { OP_REG, ds_reg }
327 #define fs { OP_REG, fs_reg }
328 #define gs { OP_REG, gs_reg }
330 #define MX { OP_MMX, 0 }
331 #define XM { OP_XMM, 0 }
332 #define EM { OP_EM, v_mode }
333 #define EMd { OP_EM, d_mode }
334 #define EMx { OP_EM, x_mode }
335 #define EXw { OP_EX, w_mode }
336 #define EXd { OP_EX, d_mode }
337 #define EXq { OP_EX, q_mode }
338 #define EXx { OP_EX, x_mode }
339 #define MS { OP_MS, v_mode }
340 #define XS { OP_XS, v_mode }
341 #define EMCq { OP_EMC, q_mode }
342 #define MXC { OP_MXC, 0 }
343 #define OPSUF { OP_3DNowSuffix, 0 }
344 #define CMP { CMP_Fixup, 0 }
345 #define XMM0 { XMM_Fixup, 0 }
347 /* Used handle "rep" prefix for string instructions. */
348 #define Xbr { REP_Fixup, eSI_reg }
349 #define Xvr { REP_Fixup, eSI_reg }
350 #define Ybr { REP_Fixup, eDI_reg }
351 #define Yvr { REP_Fixup, eDI_reg }
352 #define Yzr { REP_Fixup, eDI_reg }
353 #define indirDXr { REP_Fixup, indir_dx_reg }
354 #define ALr { REP_Fixup, al_reg }
355 #define eAXr { REP_Fixup, eAX_reg }
357 #define cond_jump_flag { NULL, cond_jump_mode }
358 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
360 /* bits in sizeflag */
361 #define SUFFIX_ALWAYS 4
367 /* operand size depends on prefixes */
368 #define v_mode (b_mode + 1)
370 #define w_mode (v_mode + 1)
371 /* double word operand */
372 #define d_mode (w_mode + 1)
373 /* quad word operand */
374 #define q_mode (d_mode + 1)
375 /* ten-byte operand */
376 #define t_mode (q_mode + 1)
377 /* 16-byte XMM operand */
378 #define x_mode (t_mode + 1)
379 /* d_mode in 32bit, q_mode in 64bit mode. */
380 #define m_mode (x_mode + 1)
381 #define cond_jump_mode (m_mode + 1)
382 #define loop_jcxz_mode (cond_jump_mode + 1)
383 /* operand size depends on REX prefixes. */
384 #define dq_mode (loop_jcxz_mode + 1)
385 /* registers like dq_mode, memory like w_mode. */
386 #define dqw_mode (dq_mode + 1)
387 /* 4- or 6-byte pointer operand */
388 #define f_mode (dqw_mode + 1)
389 #define const_1_mode (f_mode + 1)
390 /* v_mode for stack-related opcodes. */
391 #define stack_v_mode (const_1_mode + 1)
392 /* non-quad operand size depends on prefixes */
393 #define z_mode (stack_v_mode + 1)
394 /* 16-byte operand */
395 #define o_mode (z_mode + 1)
396 /* registers like dq_mode, memory like b_mode. */
397 #define dqb_mode (o_mode + 1)
398 /* registers like dq_mode, memory like d_mode. */
399 #define dqd_mode (dqb_mode + 1)
401 #define es_reg (dqd_mode + 1)
402 #define cs_reg (es_reg + 1)
403 #define ss_reg (cs_reg + 1)
404 #define ds_reg (ss_reg + 1)
405 #define fs_reg (ds_reg + 1)
406 #define gs_reg (fs_reg + 1)
408 #define eAX_reg (gs_reg + 1)
409 #define eCX_reg (eAX_reg + 1)
410 #define eDX_reg (eCX_reg + 1)
411 #define eBX_reg (eDX_reg + 1)
412 #define eSP_reg (eBX_reg + 1)
413 #define eBP_reg (eSP_reg + 1)
414 #define eSI_reg (eBP_reg + 1)
415 #define eDI_reg (eSI_reg + 1)
417 #define al_reg (eDI_reg + 1)
418 #define cl_reg (al_reg + 1)
419 #define dl_reg (cl_reg + 1)
420 #define bl_reg (dl_reg + 1)
421 #define ah_reg (bl_reg + 1)
422 #define ch_reg (ah_reg + 1)
423 #define dh_reg (ch_reg + 1)
424 #define bh_reg (dh_reg + 1)
426 #define ax_reg (bh_reg + 1)
427 #define cx_reg (ax_reg + 1)
428 #define dx_reg (cx_reg + 1)
429 #define bx_reg (dx_reg + 1)
430 #define sp_reg (bx_reg + 1)
431 #define bp_reg (sp_reg + 1)
432 #define si_reg (bp_reg + 1)
433 #define di_reg (si_reg + 1)
435 #define rAX_reg (di_reg + 1)
436 #define rCX_reg (rAX_reg + 1)
437 #define rDX_reg (rCX_reg + 1)
438 #define rBX_reg (rDX_reg + 1)
439 #define rSP_reg (rBX_reg + 1)
440 #define rBP_reg (rSP_reg + 1)
441 #define rSI_reg (rBP_reg + 1)
442 #define rDI_reg (rSI_reg + 1)
444 #define z_mode_ax_reg (rDI_reg + 1)
445 #define indir_dx_reg (z_mode_ax_reg + 1)
447 #define MAX_BYTEMODE indir_dx_reg
449 /* Flags that are OR'ed into the bytemode field to pass extra
451 #define DREX_OC1 0x10000 /* OC1 bit set */
452 #define DREX_NO_OC0 0x20000 /* OC0 bit not used */
453 #define DREX_MASK 0x40000 /* mask to delete */
455 #if MAX_BYTEMODE >= DREX_OC1
456 #error MAX_BYTEMODE must be less than DREX_OC1
460 #define USE_REG_TABLE (FLOATCODE + 1)
461 #define USE_MOD_TABLE (USE_REG_TABLE + 1)
462 #define USE_RM_TABLE (USE_MOD_TABLE + 1)
463 #define USE_PREFIX_TABLE (USE_RM_TABLE + 1)
464 #define USE_X86_64_TABLE (USE_PREFIX_TABLE + 1)
465 #define USE_3BYTE_TABLE (USE_X86_64_TABLE + 1)
467 #define FLOAT NULL, { { NULL, FLOATCODE } }
469 #define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } }
470 #define REG_TABLE(I) DIS386 (USE_REG_TABLE, (I))
471 #define MOD_TABLE(I) DIS386 (USE_MOD_TABLE, (I))
472 #define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I))
473 #define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I))
474 #define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I))
475 #define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
478 #define REG_81 (REG_80 + 1)
479 #define REG_82 (REG_81 + 1)
480 #define REG_8F (REG_82 + 1)
481 #define REG_C0 (REG_8F + 1)
482 #define REG_C1 (REG_C0 + 1)
483 #define REG_C6 (REG_C1 + 1)
484 #define REG_C7 (REG_C6 + 1)
485 #define REG_D0 (REG_C7 + 1)
486 #define REG_D1 (REG_D0 + 1)
487 #define REG_D2 (REG_D1 + 1)
488 #define REG_D3 (REG_D2 + 1)
489 #define REG_F6 (REG_D3 + 1)
490 #define REG_F7 (REG_F6 + 1)
491 #define REG_FE (REG_F7 + 1)
492 #define REG_FF (REG_FE + 1)
493 #define REG_0F00 (REG_FF + 1)
494 #define REG_0F01 (REG_0F00 + 1)
495 #define REG_0F0D (REG_0F01 + 1)
496 #define REG_0F18 (REG_0F0D + 1)
497 #define REG_0F71 (REG_0F18 + 1)
498 #define REG_0F72 (REG_0F71 + 1)
499 #define REG_0F73 (REG_0F72 + 1)
500 #define REG_0FA6 (REG_0F73 + 1)
501 #define REG_0FA7 (REG_0FA6 + 1)
502 #define REG_0FAE (REG_0FA7 + 1)
503 #define REG_0FBA (REG_0FAE + 1)
504 #define REG_0FC7 (REG_0FBA + 1)
507 #define MOD_0F01_REG_0 (MOD_8D + 1)
508 #define MOD_0F01_REG_1 (MOD_0F01_REG_0 + 1)
509 #define MOD_0F01_REG_2 (MOD_0F01_REG_1 + 1)
510 #define MOD_0F01_REG_3 (MOD_0F01_REG_2 + 1)
511 #define MOD_0F01_REG_7 (MOD_0F01_REG_3 + 1)
512 #define MOD_0F12_PREFIX_0 (MOD_0F01_REG_7 + 1)
513 #define MOD_0F13 (MOD_0F12_PREFIX_0 + 1)
514 #define MOD_0F16_PREFIX_0 (MOD_0F13 + 1)
515 #define MOD_0F17 (MOD_0F16_PREFIX_0 + 1)
516 #define MOD_0F18_REG_0 (MOD_0F17 + 1)
517 #define MOD_0F18_REG_1 (MOD_0F18_REG_0 + 1)
518 #define MOD_0F18_REG_2 (MOD_0F18_REG_1 + 1)
519 #define MOD_0F18_REG_3 (MOD_0F18_REG_2 + 1)
520 #define MOD_0F20 (MOD_0F18_REG_3 + 1)
521 #define MOD_0F21 (MOD_0F20 + 1)
522 #define MOD_0F22 (MOD_0F21 + 1)
523 #define MOD_0F23 (MOD_0F22 + 1)
524 #define MOD_0F24 (MOD_0F23 + 1)
525 #define MOD_0F26 (MOD_0F24 + 1)
526 #define MOD_0F2B_PREFIX_0 (MOD_0F26 + 1)
527 #define MOD_0F2B_PREFIX_1 (MOD_0F2B_PREFIX_0 + 1)
528 #define MOD_0F2B_PREFIX_2 (MOD_0F2B_PREFIX_1 + 1)
529 #define MOD_0F2B_PREFIX_3 (MOD_0F2B_PREFIX_2 + 1)
530 #define MOD_0F51 (MOD_0F2B_PREFIX_3 + 1)
531 #define MOD_0F71_REG_2 (MOD_0F51 + 1)
532 #define MOD_0F71_REG_4 (MOD_0F71_REG_2 + 1)
533 #define MOD_0F71_REG_6 (MOD_0F71_REG_4 + 1)
534 #define MOD_0F72_REG_2 (MOD_0F71_REG_6 + 1)
535 #define MOD_0F72_REG_4 (MOD_0F72_REG_2 + 1)
536 #define MOD_0F72_REG_6 (MOD_0F72_REG_4 + 1)
537 #define MOD_0F73_REG_2 (MOD_0F72_REG_6 + 1)
538 #define MOD_0F73_REG_3 (MOD_0F73_REG_2 + 1)
539 #define MOD_0F73_REG_6 (MOD_0F73_REG_3 + 1)
540 #define MOD_0F73_REG_7 (MOD_0F73_REG_6 + 1)
541 #define MOD_0FAE_REG_0 (MOD_0F73_REG_7 + 1)
542 #define MOD_0FAE_REG_1 (MOD_0FAE_REG_0 + 1)
543 #define MOD_0FAE_REG_2 (MOD_0FAE_REG_1 + 1)
544 #define MOD_0FAE_REG_3 (MOD_0FAE_REG_2 + 1)
545 #define MOD_0FAE_REG_4 (MOD_0FAE_REG_3 + 1)
546 #define MOD_0FAE_REG_5 (MOD_0FAE_REG_4 + 1)
547 #define MOD_0FAE_REG_6 (MOD_0FAE_REG_5 + 1)
548 #define MOD_0FAE_REG_7 (MOD_0FAE_REG_6 + 1)
549 #define MOD_0FB2 (MOD_0FAE_REG_7 + 1)
550 #define MOD_0FB4 (MOD_0FB2 + 1)
551 #define MOD_0FB5 (MOD_0FB4 + 1)
552 #define MOD_0FC7_REG_6 (MOD_0FB5 + 1)
553 #define MOD_0FC7_REG_7 (MOD_0FC7_REG_6 + 1)
554 #define MOD_0FD7 (MOD_0FC7_REG_7 + 1)
555 #define MOD_0FE7_PREFIX_2 (MOD_0FD7 + 1)
556 #define MOD_0FF0_PREFIX_3 (MOD_0FE7_PREFIX_2 + 1)
557 #define MOD_0F382A_PREFIX_2 (MOD_0FF0_PREFIX_3 + 1)
558 #define MOD_62_32BIT (MOD_0F382A_PREFIX_2 + 1)
559 #define MOD_C4_32BIT (MOD_62_32BIT + 1)
560 #define MOD_C5_32BIT (MOD_C4_32BIT + 1)
562 #define RM_0F01_REG_0 0
563 #define RM_0F01_REG_1 (RM_0F01_REG_0 + 1)
564 #define RM_0F01_REG_2 (RM_0F01_REG_1 + 1)
565 #define RM_0F01_REG_3 (RM_0F01_REG_2 + 1)
566 #define RM_0F01_REG_7 (RM_0F01_REG_3 + 1)
567 #define RM_0FAE_REG_5 (RM_0F01_REG_7 + 1)
568 #define RM_0FAE_REG_6 (RM_0FAE_REG_5 + 1)
569 #define RM_0FAE_REG_7 (RM_0FAE_REG_6 + 1)
572 #define PREFIX_0F10 (PREFIX_90 + 1)
573 #define PREFIX_0F11 (PREFIX_0F10 + 1)
574 #define PREFIX_0F12 (PREFIX_0F11 + 1)
575 #define PREFIX_0F16 (PREFIX_0F12 + 1)
576 #define PREFIX_0F2A (PREFIX_0F16 + 1)
577 #define PREFIX_0F2B (PREFIX_0F2A + 1)
578 #define PREFIX_0F2C (PREFIX_0F2B + 1)
579 #define PREFIX_0F2D (PREFIX_0F2C + 1)
580 #define PREFIX_0F2E (PREFIX_0F2D + 1)
581 #define PREFIX_0F2F (PREFIX_0F2E + 1)
582 #define PREFIX_0F51 (PREFIX_0F2F + 1)
583 #define PREFIX_0F52 (PREFIX_0F51 + 1)
584 #define PREFIX_0F53 (PREFIX_0F52 + 1)
585 #define PREFIX_0F58 (PREFIX_0F53 + 1)
586 #define PREFIX_0F59 (PREFIX_0F58 + 1)
587 #define PREFIX_0F5A (PREFIX_0F59 + 1)
588 #define PREFIX_0F5B (PREFIX_0F5A + 1)
589 #define PREFIX_0F5C (PREFIX_0F5B + 1)
590 #define PREFIX_0F5D (PREFIX_0F5C + 1)
591 #define PREFIX_0F5E (PREFIX_0F5D + 1)
592 #define PREFIX_0F5F (PREFIX_0F5E + 1)
593 #define PREFIX_0F60 (PREFIX_0F5F + 1)
594 #define PREFIX_0F61 (PREFIX_0F60 + 1)
595 #define PREFIX_0F62 (PREFIX_0F61 + 1)
596 #define PREFIX_0F6C (PREFIX_0F62 + 1)
597 #define PREFIX_0F6D (PREFIX_0F6C + 1)
598 #define PREFIX_0F6F (PREFIX_0F6D + 1)
599 #define PREFIX_0F70 (PREFIX_0F6F + 1)
600 #define PREFIX_0F73_REG_3 (PREFIX_0F70 + 1)
601 #define PREFIX_0F73_REG_7 (PREFIX_0F73_REG_3 + 1)
602 #define PREFIX_0F78 (PREFIX_0F73_REG_7 + 1)
603 #define PREFIX_0F79 (PREFIX_0F78 + 1)
604 #define PREFIX_0F7C (PREFIX_0F79 + 1)
605 #define PREFIX_0F7D (PREFIX_0F7C + 1)
606 #define PREFIX_0F7E (PREFIX_0F7D + 1)
607 #define PREFIX_0F7F (PREFIX_0F7E + 1)
608 #define PREFIX_0FB8 (PREFIX_0F7F + 1)
609 #define PREFIX_0FBD (PREFIX_0FB8 + 1)
610 #define PREFIX_0FC2 (PREFIX_0FBD + 1)
611 #define PREFIX_0FC3 (PREFIX_0FC2 + 1)
612 #define PREFIX_0FC7_REG_6 (PREFIX_0FC3 + 1)
613 #define PREFIX_0FD0 (PREFIX_0FC7_REG_6 + 1)
614 #define PREFIX_0FD6 (PREFIX_0FD0 + 1)
615 #define PREFIX_0FE6 (PREFIX_0FD6 + 1)
616 #define PREFIX_0FE7 (PREFIX_0FE6 + 1)
617 #define PREFIX_0FF0 (PREFIX_0FE7 + 1)
618 #define PREFIX_0FF7 (PREFIX_0FF0 + 1)
619 #define PREFIX_0F3810 (PREFIX_0FF7 + 1)
620 #define PREFIX_0F3814 (PREFIX_0F3810 + 1)
621 #define PREFIX_0F3815 (PREFIX_0F3814 + 1)
622 #define PREFIX_0F3817 (PREFIX_0F3815 + 1)
623 #define PREFIX_0F3820 (PREFIX_0F3817 + 1)
624 #define PREFIX_0F3821 (PREFIX_0F3820 + 1)
625 #define PREFIX_0F3822 (PREFIX_0F3821 + 1)
626 #define PREFIX_0F3823 (PREFIX_0F3822 + 1)
627 #define PREFIX_0F3824 (PREFIX_0F3823 + 1)
628 #define PREFIX_0F3825 (PREFIX_0F3824 + 1)
629 #define PREFIX_0F3828 (PREFIX_0F3825 + 1)
630 #define PREFIX_0F3829 (PREFIX_0F3828 + 1)
631 #define PREFIX_0F382A (PREFIX_0F3829 + 1)
632 #define PREFIX_0F382B (PREFIX_0F382A + 1)
633 #define PREFIX_0F3830 (PREFIX_0F382B + 1)
634 #define PREFIX_0F3831 (PREFIX_0F3830 + 1)
635 #define PREFIX_0F3832 (PREFIX_0F3831 + 1)
636 #define PREFIX_0F3833 (PREFIX_0F3832 + 1)
637 #define PREFIX_0F3834 (PREFIX_0F3833 + 1)
638 #define PREFIX_0F3835 (PREFIX_0F3834 + 1)
639 #define PREFIX_0F3837 (PREFIX_0F3835 + 1)
640 #define PREFIX_0F3838 (PREFIX_0F3837 + 1)
641 #define PREFIX_0F3839 (PREFIX_0F3838 + 1)
642 #define PREFIX_0F383A (PREFIX_0F3839 + 1)
643 #define PREFIX_0F383B (PREFIX_0F383A + 1)
644 #define PREFIX_0F383C (PREFIX_0F383B + 1)
645 #define PREFIX_0F383D (PREFIX_0F383C + 1)
646 #define PREFIX_0F383E (PREFIX_0F383D + 1)
647 #define PREFIX_0F383F (PREFIX_0F383E + 1)
648 #define PREFIX_0F3840 (PREFIX_0F383F + 1)
649 #define PREFIX_0F3841 (PREFIX_0F3840 + 1)
650 #define PREFIX_0F38F0 (PREFIX_0F3841 + 1)
651 #define PREFIX_0F38F1 (PREFIX_0F38F0 + 1)
652 #define PREFIX_0F3A08 (PREFIX_0F38F1 + 1)
653 #define PREFIX_0F3A09 (PREFIX_0F3A08 + 1)
654 #define PREFIX_0F3A0A (PREFIX_0F3A09 + 1)
655 #define PREFIX_0F3A0B (PREFIX_0F3A0A + 1)
656 #define PREFIX_0F3A0C (PREFIX_0F3A0B + 1)
657 #define PREFIX_0F3A0D (PREFIX_0F3A0C + 1)
658 #define PREFIX_0F3A0E (PREFIX_0F3A0D + 1)
659 #define PREFIX_0F3A14 (PREFIX_0F3A0E + 1)
660 #define PREFIX_0F3A15 (PREFIX_0F3A14 + 1)
661 #define PREFIX_0F3A16 (PREFIX_0F3A15 + 1)
662 #define PREFIX_0F3A17 (PREFIX_0F3A16 + 1)
663 #define PREFIX_0F3A20 (PREFIX_0F3A17 + 1)
664 #define PREFIX_0F3A21 (PREFIX_0F3A20 + 1)
665 #define PREFIX_0F3A22 (PREFIX_0F3A21 + 1)
666 #define PREFIX_0F3A40 (PREFIX_0F3A22 + 1)
667 #define PREFIX_0F3A41 (PREFIX_0F3A40 + 1)
668 #define PREFIX_0F3A42 (PREFIX_0F3A41 + 1)
669 #define PREFIX_0F3A60 (PREFIX_0F3A42 + 1)
670 #define PREFIX_0F3A61 (PREFIX_0F3A60 + 1)
671 #define PREFIX_0F3A62 (PREFIX_0F3A61 + 1)
672 #define PREFIX_0F3A63 (PREFIX_0F3A62 + 1)
675 #define X86_64_07 (X86_64_06 + 1)
676 #define X86_64_0D (X86_64_07 + 1)
677 #define X86_64_16 (X86_64_0D + 1)
678 #define X86_64_17 (X86_64_16 + 1)
679 #define X86_64_1E (X86_64_17 + 1)
680 #define X86_64_1F (X86_64_1E + 1)
681 #define X86_64_27 (X86_64_1F + 1)
682 #define X86_64_2F (X86_64_27 + 1)
683 #define X86_64_37 (X86_64_2F + 1)
684 #define X86_64_3F (X86_64_37 + 1)
685 #define X86_64_60 (X86_64_3F + 1)
686 #define X86_64_61 (X86_64_60 + 1)
687 #define X86_64_62 (X86_64_61 + 1)
688 #define X86_64_63 (X86_64_62 + 1)
689 #define X86_64_6D (X86_64_63 + 1)
690 #define X86_64_6F (X86_64_6D + 1)
691 #define X86_64_9A (X86_64_6F + 1)
692 #define X86_64_C4 (X86_64_9A + 1)
693 #define X86_64_C5 (X86_64_C4 + 1)
694 #define X86_64_CE (X86_64_C5 + 1)
695 #define X86_64_D4 (X86_64_CE + 1)
696 #define X86_64_D5 (X86_64_D4 + 1)
697 #define X86_64_EA (X86_64_D5 + 1)
698 #define X86_64_0F01_REG_0 (X86_64_EA + 1)
699 #define X86_64_0F01_REG_1 (X86_64_0F01_REG_0 + 1)
700 #define X86_64_0F01_REG_2 (X86_64_0F01_REG_1 + 1)
701 #define X86_64_0F01_REG_3 (X86_64_0F01_REG_2 + 1)
703 #define THREE_BYTE_0F24 0
704 #define THREE_BYTE_0F25 (THREE_BYTE_0F24 + 1)
705 #define THREE_BYTE_0F38 (THREE_BYTE_0F25 + 1)
706 #define THREE_BYTE_0F3A (THREE_BYTE_0F38 + 1)
707 #define THREE_BYTE_0F7A (THREE_BYTE_0F3A + 1)
708 #define THREE_BYTE_0F7B (THREE_BYTE_0F7A + 1)
710 typedef void (*op_rtn
) (int bytemode
, int sizeflag
);
721 /* Upper case letters in the instruction names here are macros.
722 'A' => print 'b' if no register operands or suffix_always is true
723 'B' => print 'b' if suffix_always is true
724 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
726 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
727 suffix_always is true
728 'E' => print 'e' if 32-bit form of jcxz
729 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
730 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
731 'H' => print ",pt" or ",pn" branch hint
732 'I' => honor following macro letter even in Intel mode (implemented only
733 for some of the macro letters)
735 'K' => print 'd' or 'q' if rex prefix is present.
736 'L' => print 'l' if suffix_always is true
737 'M' => print 'r' if intel_mnemonic is false.
738 'N' => print 'n' if instruction has no wait "prefix"
739 'O' => print 'd' or 'o' (or 'q' in Intel mode)
740 'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
741 or suffix_always is true. print 'q' if rex prefix is present.
742 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
744 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
745 'S' => print 'w', 'l' or 'q' if suffix_always is true
746 'T' => print 'q' in 64bit mode and behave as 'P' otherwise
747 'U' => print 'q' in 64bit mode and behave as 'Q' otherwise
748 'V' => print 'q' in 64bit mode and behave as 'S' otherwise
749 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
750 'X' => print 's', 'd' depending on data16 prefix (for XMM)
751 'Y' => 'q' if instruction has an REX 64bit overwrite prefix and
752 suffix_always is true.
753 'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
754 '!' => change condition from true to false or from false to true.
755 '%' => add 1 upper case letter to the macro.
757 2 upper case letter macros:
758 'LQ' => print 'l' ('d' in Intel mode) or 'q' for memory operand
759 or suffix_always is true
761 Many of the above letters print nothing in Intel mode. See "putop"
764 Braces '{' and '}', and vertical bars '|', indicate alternative
765 mnemonic strings for AT&T and Intel. */
767 static const struct dis386 dis386
[] = {
769 { "addB", { Eb
, Gb
} },
770 { "addS", { Ev
, Gv
} },
771 { "addB", { Gb
, Eb
} },
772 { "addS", { Gv
, Ev
} },
773 { "addB", { AL
, Ib
} },
774 { "addS", { eAX
, Iv
} },
775 { X86_64_TABLE (X86_64_06
) },
776 { X86_64_TABLE (X86_64_07
) },
778 { "orB", { Eb
, Gb
} },
779 { "orS", { Ev
, Gv
} },
780 { "orB", { Gb
, Eb
} },
781 { "orS", { Gv
, Ev
} },
782 { "orB", { AL
, Ib
} },
783 { "orS", { eAX
, Iv
} },
784 { X86_64_TABLE (X86_64_0D
) },
785 { "(bad)", { XX
} }, /* 0x0f extended opcode escape */
787 { "adcB", { Eb
, Gb
} },
788 { "adcS", { Ev
, Gv
} },
789 { "adcB", { Gb
, Eb
} },
790 { "adcS", { Gv
, Ev
} },
791 { "adcB", { AL
, Ib
} },
792 { "adcS", { eAX
, Iv
} },
793 { X86_64_TABLE (X86_64_16
) },
794 { X86_64_TABLE (X86_64_17
) },
796 { "sbbB", { Eb
, Gb
} },
797 { "sbbS", { Ev
, Gv
} },
798 { "sbbB", { Gb
, Eb
} },
799 { "sbbS", { Gv
, Ev
} },
800 { "sbbB", { AL
, Ib
} },
801 { "sbbS", { eAX
, Iv
} },
802 { X86_64_TABLE (X86_64_1E
) },
803 { X86_64_TABLE (X86_64_1F
) },
805 { "andB", { Eb
, Gb
} },
806 { "andS", { Ev
, Gv
} },
807 { "andB", { Gb
, Eb
} },
808 { "andS", { Gv
, Ev
} },
809 { "andB", { AL
, Ib
} },
810 { "andS", { eAX
, Iv
} },
811 { "(bad)", { XX
} }, /* SEG ES prefix */
812 { X86_64_TABLE (X86_64_27
) },
814 { "subB", { Eb
, Gb
} },
815 { "subS", { Ev
, Gv
} },
816 { "subB", { Gb
, Eb
} },
817 { "subS", { Gv
, Ev
} },
818 { "subB", { AL
, Ib
} },
819 { "subS", { eAX
, Iv
} },
820 { "(bad)", { XX
} }, /* SEG CS prefix */
821 { X86_64_TABLE (X86_64_2F
) },
823 { "xorB", { Eb
, Gb
} },
824 { "xorS", { Ev
, Gv
} },
825 { "xorB", { Gb
, Eb
} },
826 { "xorS", { Gv
, Ev
} },
827 { "xorB", { AL
, Ib
} },
828 { "xorS", { eAX
, Iv
} },
829 { "(bad)", { XX
} }, /* SEG SS prefix */
830 { X86_64_TABLE (X86_64_37
) },
832 { "cmpB", { Eb
, Gb
} },
833 { "cmpS", { Ev
, Gv
} },
834 { "cmpB", { Gb
, Eb
} },
835 { "cmpS", { Gv
, Ev
} },
836 { "cmpB", { AL
, Ib
} },
837 { "cmpS", { eAX
, Iv
} },
838 { "(bad)", { XX
} }, /* SEG DS prefix */
839 { X86_64_TABLE (X86_64_3F
) },
841 { "inc{S|}", { RMeAX
} },
842 { "inc{S|}", { RMeCX
} },
843 { "inc{S|}", { RMeDX
} },
844 { "inc{S|}", { RMeBX
} },
845 { "inc{S|}", { RMeSP
} },
846 { "inc{S|}", { RMeBP
} },
847 { "inc{S|}", { RMeSI
} },
848 { "inc{S|}", { RMeDI
} },
850 { "dec{S|}", { RMeAX
} },
851 { "dec{S|}", { RMeCX
} },
852 { "dec{S|}", { RMeDX
} },
853 { "dec{S|}", { RMeBX
} },
854 { "dec{S|}", { RMeSP
} },
855 { "dec{S|}", { RMeBP
} },
856 { "dec{S|}", { RMeSI
} },
857 { "dec{S|}", { RMeDI
} },
859 { "pushV", { RMrAX
} },
860 { "pushV", { RMrCX
} },
861 { "pushV", { RMrDX
} },
862 { "pushV", { RMrBX
} },
863 { "pushV", { RMrSP
} },
864 { "pushV", { RMrBP
} },
865 { "pushV", { RMrSI
} },
866 { "pushV", { RMrDI
} },
868 { "popV", { RMrAX
} },
869 { "popV", { RMrCX
} },
870 { "popV", { RMrDX
} },
871 { "popV", { RMrBX
} },
872 { "popV", { RMrSP
} },
873 { "popV", { RMrBP
} },
874 { "popV", { RMrSI
} },
875 { "popV", { RMrDI
} },
877 { X86_64_TABLE (X86_64_60
) },
878 { X86_64_TABLE (X86_64_61
) },
879 { X86_64_TABLE (X86_64_62
) },
880 { X86_64_TABLE (X86_64_63
) },
881 { "(bad)", { XX
} }, /* seg fs */
882 { "(bad)", { XX
} }, /* seg gs */
883 { "(bad)", { XX
} }, /* op size prefix */
884 { "(bad)", { XX
} }, /* adr size prefix */
887 { "imulS", { Gv
, Ev
, Iv
} },
888 { "pushT", { sIb
} },
889 { "imulS", { Gv
, Ev
, sIb
} },
890 { "ins{b|}", { Ybr
, indirDX
} },
891 { X86_64_TABLE (X86_64_6D
) },
892 { "outs{b|}", { indirDXr
, Xb
} },
893 { X86_64_TABLE (X86_64_6F
) },
895 { "joH", { Jb
, XX
, cond_jump_flag
} },
896 { "jnoH", { Jb
, XX
, cond_jump_flag
} },
897 { "jbH", { Jb
, XX
, cond_jump_flag
} },
898 { "jaeH", { Jb
, XX
, cond_jump_flag
} },
899 { "jeH", { Jb
, XX
, cond_jump_flag
} },
900 { "jneH", { Jb
, XX
, cond_jump_flag
} },
901 { "jbeH", { Jb
, XX
, cond_jump_flag
} },
902 { "jaH", { Jb
, XX
, cond_jump_flag
} },
904 { "jsH", { Jb
, XX
, cond_jump_flag
} },
905 { "jnsH", { Jb
, XX
, cond_jump_flag
} },
906 { "jpH", { Jb
, XX
, cond_jump_flag
} },
907 { "jnpH", { Jb
, XX
, cond_jump_flag
} },
908 { "jlH", { Jb
, XX
, cond_jump_flag
} },
909 { "jgeH", { Jb
, XX
, cond_jump_flag
} },
910 { "jleH", { Jb
, XX
, cond_jump_flag
} },
911 { "jgH", { Jb
, XX
, cond_jump_flag
} },
913 { REG_TABLE (REG_80
) },
914 { REG_TABLE (REG_81
) },
916 { REG_TABLE (REG_82
) },
917 { "testB", { Eb
, Gb
} },
918 { "testS", { Ev
, Gv
} },
919 { "xchgB", { Eb
, Gb
} },
920 { "xchgS", { Ev
, Gv
} },
922 { "movB", { Eb
, Gb
} },
923 { "movS", { Ev
, Gv
} },
924 { "movB", { Gb
, Eb
} },
925 { "movS", { Gv
, Ev
} },
926 { "movD", { Sv
, Sw
} },
927 { MOD_TABLE (MOD_8D
) },
928 { "movD", { Sw
, Sv
} },
929 { REG_TABLE (REG_8F
) },
931 { PREFIX_TABLE (PREFIX_90
) },
932 { "xchgS", { RMeCX
, eAX
} },
933 { "xchgS", { RMeDX
, eAX
} },
934 { "xchgS", { RMeBX
, eAX
} },
935 { "xchgS", { RMeSP
, eAX
} },
936 { "xchgS", { RMeBP
, eAX
} },
937 { "xchgS", { RMeSI
, eAX
} },
938 { "xchgS", { RMeDI
, eAX
} },
940 { "cW{t|}R", { XX
} },
941 { "cR{t|}O", { XX
} },
942 { X86_64_TABLE (X86_64_9A
) },
943 { "(bad)", { XX
} }, /* fwait */
944 { "pushfT", { XX
} },
949 { "movB", { AL
, Ob
} },
950 { "movS", { eAX
, Ov
} },
951 { "movB", { Ob
, AL
} },
952 { "movS", { Ov
, eAX
} },
953 { "movs{b|}", { Ybr
, Xb
} },
954 { "movs{R|}", { Yvr
, Xv
} },
955 { "cmps{b|}", { Xb
, Yb
} },
956 { "cmps{R|}", { Xv
, Yv
} },
958 { "testB", { AL
, Ib
} },
959 { "testS", { eAX
, Iv
} },
960 { "stosB", { Ybr
, AL
} },
961 { "stosS", { Yvr
, eAX
} },
962 { "lodsB", { ALr
, Xb
} },
963 { "lodsS", { eAXr
, Xv
} },
964 { "scasB", { AL
, Yb
} },
965 { "scasS", { eAX
, Yv
} },
967 { "movB", { RMAL
, Ib
} },
968 { "movB", { RMCL
, Ib
} },
969 { "movB", { RMDL
, Ib
} },
970 { "movB", { RMBL
, Ib
} },
971 { "movB", { RMAH
, Ib
} },
972 { "movB", { RMCH
, Ib
} },
973 { "movB", { RMDH
, Ib
} },
974 { "movB", { RMBH
, Ib
} },
976 { "movS", { RMeAX
, Iv64
} },
977 { "movS", { RMeCX
, Iv64
} },
978 { "movS", { RMeDX
, Iv64
} },
979 { "movS", { RMeBX
, Iv64
} },
980 { "movS", { RMeSP
, Iv64
} },
981 { "movS", { RMeBP
, Iv64
} },
982 { "movS", { RMeSI
, Iv64
} },
983 { "movS", { RMeDI
, Iv64
} },
985 { REG_TABLE (REG_C0
) },
986 { REG_TABLE (REG_C1
) },
989 { X86_64_TABLE (X86_64_C4
) },
990 { X86_64_TABLE (X86_64_C5
) },
991 { REG_TABLE (REG_C6
) },
992 { REG_TABLE (REG_C7
) },
994 { "enterT", { Iw
, Ib
} },
995 { "leaveT", { XX
} },
1000 { X86_64_TABLE (X86_64_CE
) },
1001 { "iretP", { XX
} },
1003 { REG_TABLE (REG_D0
) },
1004 { REG_TABLE (REG_D1
) },
1005 { REG_TABLE (REG_D2
) },
1006 { REG_TABLE (REG_D3
) },
1007 { X86_64_TABLE (X86_64_D4
) },
1008 { X86_64_TABLE (X86_64_D5
) },
1009 { "(bad)", { XX
} },
1010 { "xlat", { DSBX
} },
1021 { "loopneFH", { Jb
, XX
, loop_jcxz_flag
} },
1022 { "loopeFH", { Jb
, XX
, loop_jcxz_flag
} },
1023 { "loopFH", { Jb
, XX
, loop_jcxz_flag
} },
1024 { "jEcxzH", { Jb
, XX
, loop_jcxz_flag
} },
1025 { "inB", { AL
, Ib
} },
1026 { "inG", { zAX
, Ib
} },
1027 { "outB", { Ib
, AL
} },
1028 { "outG", { Ib
, zAX
} },
1030 { "callT", { Jv
} },
1032 { X86_64_TABLE (X86_64_EA
) },
1034 { "inB", { AL
, indirDX
} },
1035 { "inG", { zAX
, indirDX
} },
1036 { "outB", { indirDX
, AL
} },
1037 { "outG", { indirDX
, zAX
} },
1039 { "(bad)", { XX
} }, /* lock prefix */
1040 { "icebp", { XX
} },
1041 { "(bad)", { XX
} }, /* repne */
1042 { "(bad)", { XX
} }, /* repz */
1045 { REG_TABLE (REG_F6
) },
1046 { REG_TABLE (REG_F7
) },
1054 { REG_TABLE (REG_FE
) },
1055 { REG_TABLE (REG_FF
) },
1058 static const struct dis386 dis386_twobyte
[] = {
1060 { REG_TABLE (REG_0F00
) },
1061 { REG_TABLE (REG_0F01
) },
1062 { "larS", { Gv
, Ew
} },
1063 { "lslS", { Gv
, Ew
} },
1064 { "(bad)", { XX
} },
1065 { "syscall", { XX
} },
1067 { "sysretP", { XX
} },
1070 { "wbinvd", { XX
} },
1071 { "(bad)", { XX
} },
1073 { "(bad)", { XX
} },
1074 { REG_TABLE (REG_0F0D
) },
1075 { "femms", { XX
} },
1076 { "", { MX
, EM
, OPSUF
} }, /* See OP_3DNowSuffix. */
1078 { PREFIX_TABLE (PREFIX_0F10
) },
1079 { PREFIX_TABLE (PREFIX_0F11
) },
1080 { PREFIX_TABLE (PREFIX_0F12
) },
1081 { MOD_TABLE (MOD_0F13
) },
1082 { "unpcklpX", { XM
, EXx
} },
1083 { "unpckhpX", { XM
, EXx
} },
1084 { PREFIX_TABLE (PREFIX_0F16
) },
1085 { MOD_TABLE (MOD_0F17
) },
1087 { REG_TABLE (REG_0F18
) },
1096 { MOD_TABLE (MOD_0F20
) },
1097 { MOD_TABLE (MOD_0F21
) },
1098 { MOD_TABLE (MOD_0F22
) },
1099 { MOD_TABLE (MOD_0F23
) },
1100 { MOD_TABLE (MOD_0F24
) },
1101 { THREE_BYTE_TABLE (THREE_BYTE_0F25
) },
1102 { MOD_TABLE (MOD_0F26
) },
1103 { "(bad)", { XX
} },
1105 { "movapX", { XM
, EXx
} },
1106 { "movapX", { EXx
, XM
} },
1107 { PREFIX_TABLE (PREFIX_0F2A
) },
1108 { PREFIX_TABLE (PREFIX_0F2B
) },
1109 { PREFIX_TABLE (PREFIX_0F2C
) },
1110 { PREFIX_TABLE (PREFIX_0F2D
) },
1111 { PREFIX_TABLE (PREFIX_0F2E
) },
1112 { PREFIX_TABLE (PREFIX_0F2F
) },
1114 { "wrmsr", { XX
} },
1115 { "rdtsc", { XX
} },
1116 { "rdmsr", { XX
} },
1117 { "rdpmc", { XX
} },
1118 { "sysenter", { XX
} },
1119 { "sysexit", { XX
} },
1120 { "(bad)", { XX
} },
1121 { "getsec", { XX
} },
1123 { THREE_BYTE_TABLE (THREE_BYTE_0F38
) },
1124 { "(bad)", { XX
} },
1125 { THREE_BYTE_TABLE (THREE_BYTE_0F3A
) },
1126 { "(bad)", { XX
} },
1127 { "(bad)", { XX
} },
1128 { "(bad)", { XX
} },
1129 { "(bad)", { XX
} },
1130 { "(bad)", { XX
} },
1132 { "cmovo", { Gv
, Ev
} },
1133 { "cmovno", { Gv
, Ev
} },
1134 { "cmovb", { Gv
, Ev
} },
1135 { "cmovae", { Gv
, Ev
} },
1136 { "cmove", { Gv
, Ev
} },
1137 { "cmovne", { Gv
, Ev
} },
1138 { "cmovbe", { Gv
, Ev
} },
1139 { "cmova", { Gv
, Ev
} },
1141 { "cmovs", { Gv
, Ev
} },
1142 { "cmovns", { Gv
, Ev
} },
1143 { "cmovp", { Gv
, Ev
} },
1144 { "cmovnp", { Gv
, Ev
} },
1145 { "cmovl", { Gv
, Ev
} },
1146 { "cmovge", { Gv
, Ev
} },
1147 { "cmovle", { Gv
, Ev
} },
1148 { "cmovg", { Gv
, Ev
} },
1150 { MOD_TABLE (MOD_0F51
) },
1151 { PREFIX_TABLE (PREFIX_0F51
) },
1152 { PREFIX_TABLE (PREFIX_0F52
) },
1153 { PREFIX_TABLE (PREFIX_0F53
) },
1154 { "andpX", { XM
, EXx
} },
1155 { "andnpX", { XM
, EXx
} },
1156 { "orpX", { XM
, EXx
} },
1157 { "xorpX", { XM
, EXx
} },
1159 { PREFIX_TABLE (PREFIX_0F58
) },
1160 { PREFIX_TABLE (PREFIX_0F59
) },
1161 { PREFIX_TABLE (PREFIX_0F5A
) },
1162 { PREFIX_TABLE (PREFIX_0F5B
) },
1163 { PREFIX_TABLE (PREFIX_0F5C
) },
1164 { PREFIX_TABLE (PREFIX_0F5D
) },
1165 { PREFIX_TABLE (PREFIX_0F5E
) },
1166 { PREFIX_TABLE (PREFIX_0F5F
) },
1168 { PREFIX_TABLE (PREFIX_0F60
) },
1169 { PREFIX_TABLE (PREFIX_0F61
) },
1170 { PREFIX_TABLE (PREFIX_0F62
) },
1171 { "packsswb", { MX
, EM
} },
1172 { "pcmpgtb", { MX
, EM
} },
1173 { "pcmpgtw", { MX
, EM
} },
1174 { "pcmpgtd", { MX
, EM
} },
1175 { "packuswb", { MX
, EM
} },
1177 { "punpckhbw", { MX
, EM
} },
1178 { "punpckhwd", { MX
, EM
} },
1179 { "punpckhdq", { MX
, EM
} },
1180 { "packssdw", { MX
, EM
} },
1181 { PREFIX_TABLE (PREFIX_0F6C
) },
1182 { PREFIX_TABLE (PREFIX_0F6D
) },
1183 { "movK", { MX
, Edq
} },
1184 { PREFIX_TABLE (PREFIX_0F6F
) },
1186 { PREFIX_TABLE (PREFIX_0F70
) },
1187 { REG_TABLE (REG_0F71
) },
1188 { REG_TABLE (REG_0F72
) },
1189 { REG_TABLE (REG_0F73
) },
1190 { "pcmpeqb", { MX
, EM
} },
1191 { "pcmpeqw", { MX
, EM
} },
1192 { "pcmpeqd", { MX
, EM
} },
1195 { PREFIX_TABLE (PREFIX_0F78
) },
1196 { PREFIX_TABLE (PREFIX_0F79
) },
1197 { THREE_BYTE_TABLE (THREE_BYTE_0F7A
) },
1198 { THREE_BYTE_TABLE (THREE_BYTE_0F7B
) },
1199 { PREFIX_TABLE (PREFIX_0F7C
) },
1200 { PREFIX_TABLE (PREFIX_0F7D
) },
1201 { PREFIX_TABLE (PREFIX_0F7E
) },
1202 { PREFIX_TABLE (PREFIX_0F7F
) },
1204 { "joH", { Jv
, XX
, cond_jump_flag
} },
1205 { "jnoH", { Jv
, XX
, cond_jump_flag
} },
1206 { "jbH", { Jv
, XX
, cond_jump_flag
} },
1207 { "jaeH", { Jv
, XX
, cond_jump_flag
} },
1208 { "jeH", { Jv
, XX
, cond_jump_flag
} },
1209 { "jneH", { Jv
, XX
, cond_jump_flag
} },
1210 { "jbeH", { Jv
, XX
, cond_jump_flag
} },
1211 { "jaH", { Jv
, XX
, cond_jump_flag
} },
1213 { "jsH", { Jv
, XX
, cond_jump_flag
} },
1214 { "jnsH", { Jv
, XX
, cond_jump_flag
} },
1215 { "jpH", { Jv
, XX
, cond_jump_flag
} },
1216 { "jnpH", { Jv
, XX
, cond_jump_flag
} },
1217 { "jlH", { Jv
, XX
, cond_jump_flag
} },
1218 { "jgeH", { Jv
, XX
, cond_jump_flag
} },
1219 { "jleH", { Jv
, XX
, cond_jump_flag
} },
1220 { "jgH", { Jv
, XX
, cond_jump_flag
} },
1223 { "setno", { Eb
} },
1225 { "setae", { Eb
} },
1227 { "setne", { Eb
} },
1228 { "setbe", { Eb
} },
1232 { "setns", { Eb
} },
1234 { "setnp", { Eb
} },
1236 { "setge", { Eb
} },
1237 { "setle", { Eb
} },
1240 { "pushT", { fs
} },
1242 { "cpuid", { XX
} },
1243 { "btS", { Ev
, Gv
} },
1244 { "shldS", { Ev
, Gv
, Ib
} },
1245 { "shldS", { Ev
, Gv
, CL
} },
1246 { REG_TABLE (REG_0FA6
) },
1247 { REG_TABLE (REG_0FA7
) },
1249 { "pushT", { gs
} },
1252 { "btsS", { Ev
, Gv
} },
1253 { "shrdS", { Ev
, Gv
, Ib
} },
1254 { "shrdS", { Ev
, Gv
, CL
} },
1255 { REG_TABLE (REG_0FAE
) },
1256 { "imulS", { Gv
, Ev
} },
1258 { "cmpxchgB", { Eb
, Gb
} },
1259 { "cmpxchgS", { Ev
, Gv
} },
1260 { MOD_TABLE (MOD_0FB2
) },
1261 { "btrS", { Ev
, Gv
} },
1262 { MOD_TABLE (MOD_0FB4
) },
1263 { MOD_TABLE (MOD_0FB5
) },
1264 { "movz{bR|x}", { Gv
, Eb
} },
1265 { "movz{wR|x}", { Gv
, Ew
} }, /* yes, there really is movzww ! */
1267 { PREFIX_TABLE (PREFIX_0FB8
) },
1269 { REG_TABLE (REG_0FBA
) },
1270 { "btcS", { Ev
, Gv
} },
1271 { "bsfS", { Gv
, Ev
} },
1272 { PREFIX_TABLE (PREFIX_0FBD
) },
1273 { "movs{bR|x}", { Gv
, Eb
} },
1274 { "movs{wR|x}", { Gv
, Ew
} }, /* yes, there really is movsww ! */
1276 { "xaddB", { Eb
, Gb
} },
1277 { "xaddS", { Ev
, Gv
} },
1278 { PREFIX_TABLE (PREFIX_0FC2
) },
1279 { PREFIX_TABLE (PREFIX_0FC3
) },
1280 { "pinsrw", { MX
, Edqw
, Ib
} },
1281 { "pextrw", { Gdq
, MS
, Ib
} },
1282 { "shufpX", { XM
, EXx
, Ib
} },
1283 { REG_TABLE (REG_0FC7
) },
1285 { "bswap", { RMeAX
} },
1286 { "bswap", { RMeCX
} },
1287 { "bswap", { RMeDX
} },
1288 { "bswap", { RMeBX
} },
1289 { "bswap", { RMeSP
} },
1290 { "bswap", { RMeBP
} },
1291 { "bswap", { RMeSI
} },
1292 { "bswap", { RMeDI
} },
1294 { PREFIX_TABLE (PREFIX_0FD0
) },
1295 { "psrlw", { MX
, EM
} },
1296 { "psrld", { MX
, EM
} },
1297 { "psrlq", { MX
, EM
} },
1298 { "paddq", { MX
, EM
} },
1299 { "pmullw", { MX
, EM
} },
1300 { PREFIX_TABLE (PREFIX_0FD6
) },
1301 { MOD_TABLE (MOD_0FD7
) },
1303 { "psubusb", { MX
, EM
} },
1304 { "psubusw", { MX
, EM
} },
1305 { "pminub", { MX
, EM
} },
1306 { "pand", { MX
, EM
} },
1307 { "paddusb", { MX
, EM
} },
1308 { "paddusw", { MX
, EM
} },
1309 { "pmaxub", { MX
, EM
} },
1310 { "pandn", { MX
, EM
} },
1312 { "pavgb", { MX
, EM
} },
1313 { "psraw", { MX
, EM
} },
1314 { "psrad", { MX
, EM
} },
1315 { "pavgw", { MX
, EM
} },
1316 { "pmulhuw", { MX
, EM
} },
1317 { "pmulhw", { MX
, EM
} },
1318 { PREFIX_TABLE (PREFIX_0FE6
) },
1319 { PREFIX_TABLE (PREFIX_0FE7
) },
1321 { "psubsb", { MX
, EM
} },
1322 { "psubsw", { MX
, EM
} },
1323 { "pminsw", { MX
, EM
} },
1324 { "por", { MX
, EM
} },
1325 { "paddsb", { MX
, EM
} },
1326 { "paddsw", { MX
, EM
} },
1327 { "pmaxsw", { MX
, EM
} },
1328 { "pxor", { MX
, EM
} },
1330 { PREFIX_TABLE (PREFIX_0FF0
) },
1331 { "psllw", { MX
, EM
} },
1332 { "pslld", { MX
, EM
} },
1333 { "psllq", { MX
, EM
} },
1334 { "pmuludq", { MX
, EM
} },
1335 { "pmaddwd", { MX
, EM
} },
1336 { "psadbw", { MX
, EM
} },
1337 { PREFIX_TABLE (PREFIX_0FF7
) },
1339 { "psubb", { MX
, EM
} },
1340 { "psubw", { MX
, EM
} },
1341 { "psubd", { MX
, EM
} },
1342 { "psubq", { MX
, EM
} },
1343 { "paddb", { MX
, EM
} },
1344 { "paddw", { MX
, EM
} },
1345 { "paddd", { MX
, EM
} },
1346 { "(bad)", { XX
} },
1349 static const unsigned char onebyte_has_modrm
[256] = {
1350 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1351 /* ------------------------------- */
1352 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
1353 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
1354 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
1355 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
1356 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
1357 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
1358 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
1359 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
1360 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
1361 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
1362 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
1363 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
1364 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
1365 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
1366 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
1367 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
1368 /* ------------------------------- */
1369 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1372 static const unsigned char twobyte_has_modrm
[256] = {
1373 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1374 /* ------------------------------- */
1375 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
1376 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
1377 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
1378 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
1379 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
1380 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
1381 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
1382 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
1383 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
1384 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
1385 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
1386 /* b0 */ 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, /* bf */
1387 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
1388 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
1389 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
1390 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 /* ff */
1391 /* ------------------------------- */
1392 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1395 static char obuf
[100];
1397 static char scratchbuf
[100];
1398 static unsigned char *start_codep
;
1399 static unsigned char *insn_codep
;
1400 static unsigned char *codep
;
1401 static const char *lock_prefix
;
1402 static const char *data_prefix
;
1403 static const char *addr_prefix
;
1404 static const char *repz_prefix
;
1405 static const char *repnz_prefix
;
1406 static disassemble_info
*the_info
;
1414 static unsigned char need_modrm
;
1416 /* If we are accessing mod/rm/reg without need_modrm set, then the
1417 values are stale. Hitting this abort likely indicates that you
1418 need to update onebyte_has_modrm or twobyte_has_modrm. */
1419 #define MODRM_CHECK if (!need_modrm) abort ()
1421 static const char **names64
;
1422 static const char **names32
;
1423 static const char **names16
;
1424 static const char **names8
;
1425 static const char **names8rex
;
1426 static const char **names_seg
;
1427 static const char *index64
;
1428 static const char *index32
;
1429 static const char **index16
;
1431 static const char *intel_names64
[] = {
1432 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
1433 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
1435 static const char *intel_names32
[] = {
1436 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
1437 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
1439 static const char *intel_names16
[] = {
1440 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
1441 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
1443 static const char *intel_names8
[] = {
1444 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
1446 static const char *intel_names8rex
[] = {
1447 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
1448 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
1450 static const char *intel_names_seg
[] = {
1451 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
1453 static const char *intel_index64
= "riz";
1454 static const char *intel_index32
= "eiz";
1455 static const char *intel_index16
[] = {
1456 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
1459 static const char *att_names64
[] = {
1460 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
1461 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
1463 static const char *att_names32
[] = {
1464 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
1465 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
1467 static const char *att_names16
[] = {
1468 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
1469 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
1471 static const char *att_names8
[] = {
1472 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
1474 static const char *att_names8rex
[] = {
1475 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
1476 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
1478 static const char *att_names_seg
[] = {
1479 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
1481 static const char *att_index64
= "%riz";
1482 static const char *att_index32
= "%eiz";
1483 static const char *att_index16
[] = {
1484 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
1487 static const struct dis386 reg_table
[][8] = {
1490 { "addA", { Eb
, Ib
} },
1491 { "orA", { Eb
, Ib
} },
1492 { "adcA", { Eb
, Ib
} },
1493 { "sbbA", { Eb
, Ib
} },
1494 { "andA", { Eb
, Ib
} },
1495 { "subA", { Eb
, Ib
} },
1496 { "xorA", { Eb
, Ib
} },
1497 { "cmpA", { Eb
, Ib
} },
1501 { "addQ", { Ev
, Iv
} },
1502 { "orQ", { Ev
, Iv
} },
1503 { "adcQ", { Ev
, Iv
} },
1504 { "sbbQ", { Ev
, Iv
} },
1505 { "andQ", { Ev
, Iv
} },
1506 { "subQ", { Ev
, Iv
} },
1507 { "xorQ", { Ev
, Iv
} },
1508 { "cmpQ", { Ev
, Iv
} },
1512 { "addQ", { Ev
, sIb
} },
1513 { "orQ", { Ev
, sIb
} },
1514 { "adcQ", { Ev
, sIb
} },
1515 { "sbbQ", { Ev
, sIb
} },
1516 { "andQ", { Ev
, sIb
} },
1517 { "subQ", { Ev
, sIb
} },
1518 { "xorQ", { Ev
, sIb
} },
1519 { "cmpQ", { Ev
, sIb
} },
1523 { "popU", { stackEv
} },
1524 { "(bad)", { XX
} },
1525 { "(bad)", { XX
} },
1526 { "(bad)", { XX
} },
1527 { "(bad)", { XX
} },
1528 { "(bad)", { XX
} },
1529 { "(bad)", { XX
} },
1530 { "(bad)", { XX
} },
1534 { "rolA", { Eb
, Ib
} },
1535 { "rorA", { Eb
, Ib
} },
1536 { "rclA", { Eb
, Ib
} },
1537 { "rcrA", { Eb
, Ib
} },
1538 { "shlA", { Eb
, Ib
} },
1539 { "shrA", { Eb
, Ib
} },
1540 { "(bad)", { XX
} },
1541 { "sarA", { Eb
, Ib
} },
1545 { "rolQ", { Ev
, Ib
} },
1546 { "rorQ", { Ev
, Ib
} },
1547 { "rclQ", { Ev
, Ib
} },
1548 { "rcrQ", { Ev
, Ib
} },
1549 { "shlQ", { Ev
, Ib
} },
1550 { "shrQ", { Ev
, Ib
} },
1551 { "(bad)", { XX
} },
1552 { "sarQ", { Ev
, Ib
} },
1556 { "movA", { Eb
, Ib
} },
1557 { "(bad)", { XX
} },
1558 { "(bad)", { XX
} },
1559 { "(bad)", { XX
} },
1560 { "(bad)", { XX
} },
1561 { "(bad)", { XX
} },
1562 { "(bad)", { XX
} },
1563 { "(bad)", { XX
} },
1567 { "movQ", { Ev
, Iv
} },
1568 { "(bad)", { XX
} },
1569 { "(bad)", { XX
} },
1570 { "(bad)", { XX
} },
1571 { "(bad)", { XX
} },
1572 { "(bad)", { XX
} },
1573 { "(bad)", { XX
} },
1574 { "(bad)", { XX
} },
1578 { "rolA", { Eb
, I1
} },
1579 { "rorA", { Eb
, I1
} },
1580 { "rclA", { Eb
, I1
} },
1581 { "rcrA", { Eb
, I1
} },
1582 { "shlA", { Eb
, I1
} },
1583 { "shrA", { Eb
, I1
} },
1584 { "(bad)", { XX
} },
1585 { "sarA", { Eb
, I1
} },
1589 { "rolQ", { Ev
, I1
} },
1590 { "rorQ", { Ev
, I1
} },
1591 { "rclQ", { Ev
, I1
} },
1592 { "rcrQ", { Ev
, I1
} },
1593 { "shlQ", { Ev
, I1
} },
1594 { "shrQ", { Ev
, I1
} },
1595 { "(bad)", { XX
} },
1596 { "sarQ", { Ev
, I1
} },
1600 { "rolA", { Eb
, CL
} },
1601 { "rorA", { Eb
, CL
} },
1602 { "rclA", { Eb
, CL
} },
1603 { "rcrA", { Eb
, CL
} },
1604 { "shlA", { Eb
, CL
} },
1605 { "shrA", { Eb
, CL
} },
1606 { "(bad)", { XX
} },
1607 { "sarA", { Eb
, CL
} },
1611 { "rolQ", { Ev
, CL
} },
1612 { "rorQ", { Ev
, CL
} },
1613 { "rclQ", { Ev
, CL
} },
1614 { "rcrQ", { Ev
, CL
} },
1615 { "shlQ", { Ev
, CL
} },
1616 { "shrQ", { Ev
, CL
} },
1617 { "(bad)", { XX
} },
1618 { "sarQ", { Ev
, CL
} },
1622 { "testA", { Eb
, Ib
} },
1623 { "(bad)", { XX
} },
1626 { "mulA", { Eb
} }, /* Don't print the implicit %al register, */
1627 { "imulA", { Eb
} }, /* to distinguish these opcodes from other */
1628 { "divA", { Eb
} }, /* mul/imul opcodes. Do the same for div */
1629 { "idivA", { Eb
} }, /* and idiv for consistency. */
1633 { "testQ", { Ev
, Iv
} },
1634 { "(bad)", { XX
} },
1637 { "mulQ", { Ev
} }, /* Don't print the implicit register. */
1638 { "imulQ", { Ev
} },
1640 { "idivQ", { Ev
} },
1646 { "(bad)", { XX
} },
1647 { "(bad)", { XX
} },
1648 { "(bad)", { XX
} },
1649 { "(bad)", { XX
} },
1650 { "(bad)", { XX
} },
1651 { "(bad)", { XX
} },
1657 { "callT", { indirEv
} },
1658 { "JcallT", { indirEp
} },
1659 { "jmpT", { indirEv
} },
1660 { "JjmpT", { indirEp
} },
1661 { "pushU", { stackEv
} },
1662 { "(bad)", { XX
} },
1666 { "sldtD", { Sv
} },
1672 { "(bad)", { XX
} },
1673 { "(bad)", { XX
} },
1677 { MOD_TABLE (MOD_0F01_REG_0
) },
1678 { MOD_TABLE (MOD_0F01_REG_1
) },
1679 { MOD_TABLE (MOD_0F01_REG_2
) },
1680 { MOD_TABLE (MOD_0F01_REG_3
) },
1681 { "smswD", { Sv
} },
1682 { "(bad)", { XX
} },
1684 { MOD_TABLE (MOD_0F01_REG_7
) },
1688 { "prefetch", { Eb
} },
1689 { "prefetchw", { Eb
} },
1690 { "(bad)", { XX
} },
1691 { "(bad)", { XX
} },
1692 { "(bad)", { XX
} },
1693 { "(bad)", { XX
} },
1694 { "(bad)", { XX
} },
1695 { "(bad)", { XX
} },
1699 { MOD_TABLE (MOD_0F18_REG_0
) },
1700 { MOD_TABLE (MOD_0F18_REG_1
) },
1701 { MOD_TABLE (MOD_0F18_REG_2
) },
1702 { MOD_TABLE (MOD_0F18_REG_3
) },
1703 { "(bad)", { XX
} },
1704 { "(bad)", { XX
} },
1705 { "(bad)", { XX
} },
1706 { "(bad)", { XX
} },
1710 { "(bad)", { XX
} },
1711 { "(bad)", { XX
} },
1712 { MOD_TABLE (MOD_0F71_REG_2
) },
1713 { "(bad)", { XX
} },
1714 { MOD_TABLE (MOD_0F71_REG_4
) },
1715 { "(bad)", { XX
} },
1716 { MOD_TABLE (MOD_0F71_REG_6
) },
1717 { "(bad)", { XX
} },
1721 { "(bad)", { XX
} },
1722 { "(bad)", { XX
} },
1723 { MOD_TABLE (MOD_0F72_REG_2
) },
1724 { "(bad)", { XX
} },
1725 { MOD_TABLE (MOD_0F72_REG_4
) },
1726 { "(bad)", { XX
} },
1727 { MOD_TABLE (MOD_0F72_REG_6
) },
1728 { "(bad)", { XX
} },
1732 { "(bad)", { XX
} },
1733 { "(bad)", { XX
} },
1734 { MOD_TABLE (MOD_0F73_REG_2
) },
1735 { MOD_TABLE (MOD_0F73_REG_3
) },
1736 { "(bad)", { XX
} },
1737 { "(bad)", { XX
} },
1738 { MOD_TABLE (MOD_0F73_REG_6
) },
1739 { MOD_TABLE (MOD_0F73_REG_7
) },
1743 { "montmul", { { OP_0f07
, 0 } } },
1744 { "xsha1", { { OP_0f07
, 0 } } },
1745 { "xsha256", { { OP_0f07
, 0 } } },
1746 { "(bad)", { { OP_0f07
, 0 } } },
1747 { "(bad)", { { OP_0f07
, 0 } } },
1748 { "(bad)", { { OP_0f07
, 0 } } },
1749 { "(bad)", { { OP_0f07
, 0 } } },
1750 { "(bad)", { { OP_0f07
, 0 } } },
1754 { "xstore-rng", { { OP_0f07
, 0 } } },
1755 { "xcrypt-ecb", { { OP_0f07
, 0 } } },
1756 { "xcrypt-cbc", { { OP_0f07
, 0 } } },
1757 { "xcrypt-ctr", { { OP_0f07
, 0 } } },
1758 { "xcrypt-cfb", { { OP_0f07
, 0 } } },
1759 { "xcrypt-ofb", { { OP_0f07
, 0 } } },
1760 { "(bad)", { { OP_0f07
, 0 } } },
1761 { "(bad)", { { OP_0f07
, 0 } } },
1765 { MOD_TABLE (MOD_0FAE_REG_0
) },
1766 { MOD_TABLE (MOD_0FAE_REG_1
) },
1767 { MOD_TABLE (MOD_0FAE_REG_2
) },
1768 { MOD_TABLE (MOD_0FAE_REG_3
) },
1769 { MOD_TABLE (MOD_0FAE_REG_4
) },
1770 { MOD_TABLE (MOD_0FAE_REG_5
) },
1771 { MOD_TABLE (MOD_0FAE_REG_6
) },
1772 { MOD_TABLE (MOD_0FAE_REG_7
) },
1776 { "(bad)", { XX
} },
1777 { "(bad)", { XX
} },
1778 { "(bad)", { XX
} },
1779 { "(bad)", { XX
} },
1780 { "btQ", { Ev
, Ib
} },
1781 { "btsQ", { Ev
, Ib
} },
1782 { "btrQ", { Ev
, Ib
} },
1783 { "btcQ", { Ev
, Ib
} },
1787 { "(bad)", { XX
} },
1788 { "cmpxchg8b", { { CMPXCHG8B_Fixup
, q_mode
} } },
1789 { "(bad)", { XX
} },
1790 { "(bad)", { XX
} },
1791 { "(bad)", { XX
} },
1792 { "(bad)", { XX
} },
1793 { MOD_TABLE (MOD_0FC7_REG_6
) },
1794 { MOD_TABLE (MOD_0FC7_REG_7
) },
1798 static const struct dis386 prefix_table
[][4] = {
1801 { "xchgS", { { NOP_Fixup1
, eAX_reg
}, { NOP_Fixup2
, eAX_reg
} } },
1802 { "pause", { XX
} },
1803 { "xchgS", { { NOP_Fixup1
, eAX_reg
}, { NOP_Fixup2
, eAX_reg
} } },
1804 { "(bad)", { XX
} },
1809 { "movups", { XM
, EXx
} },
1810 { "movss", { XM
, EXd
} },
1811 { "movupd", { XM
, EXx
} },
1812 { "movsd", { XM
, EXq
} },
1817 { "movups", { EXx
, XM
} },
1818 { "movss", { EXd
, XM
} },
1819 { "movupd", { EXx
, XM
} },
1820 { "movsd", { EXq
, XM
} },
1825 { MOD_TABLE (MOD_0F12_PREFIX_0
) },
1826 { "movsldup", { XM
, EXx
} },
1827 { "movlpd", { XM
, EXq
} },
1828 { "movddup", { XM
, EXq
} },
1833 { MOD_TABLE (MOD_0F16_PREFIX_0
) },
1834 { "movshdup", { XM
, EXx
} },
1835 { "movhpd", { XM
, EXq
} },
1836 { "(bad)", { XX
} },
1841 { "cvtpi2ps", { XM
, EMCq
} },
1842 { "cvtsi2ss%LQ", { XM
, Ev
} },
1843 { "cvtpi2pd", { XM
, EMCq
} },
1844 { "cvtsi2sd%LQ", { XM
, Ev
} },
1849 { MOD_TABLE (MOD_0F2B_PREFIX_0
) },
1850 { MOD_TABLE (MOD_0F2B_PREFIX_1
) },
1851 { MOD_TABLE (MOD_0F2B_PREFIX_2
) },
1852 { MOD_TABLE (MOD_0F2B_PREFIX_3
) },
1857 { "cvttps2pi", { MXC
, EXq
} },
1858 { "cvttss2siY", { Gv
, EXd
} },
1859 { "cvttpd2pi", { MXC
, EXx
} },
1860 { "cvttsd2siY", { Gv
, EXq
} },
1865 { "cvtps2pi", { MXC
, EXq
} },
1866 { "cvtss2siY", { Gv
, EXd
} },
1867 { "cvtpd2pi", { MXC
, EXx
} },
1868 { "cvtsd2siY", { Gv
, EXq
} },
1873 { "ucomiss",{ XM
, EXd
} },
1874 { "(bad)", { XX
} },
1875 { "ucomisd",{ XM
, EXq
} },
1876 { "(bad)", { XX
} },
1881 { "comiss", { XM
, EXd
} },
1882 { "(bad)", { XX
} },
1883 { "comisd", { XM
, EXq
} },
1884 { "(bad)", { XX
} },
1889 { "sqrtps", { XM
, EXx
} },
1890 { "sqrtss", { XM
, EXd
} },
1891 { "sqrtpd", { XM
, EXx
} },
1892 { "sqrtsd", { XM
, EXq
} },
1897 { "rsqrtps",{ XM
, EXx
} },
1898 { "rsqrtss",{ XM
, EXd
} },
1899 { "(bad)", { XX
} },
1900 { "(bad)", { XX
} },
1905 { "rcpps", { XM
, EXx
} },
1906 { "rcpss", { XM
, EXd
} },
1907 { "(bad)", { XX
} },
1908 { "(bad)", { XX
} },
1913 { "addps", { XM
, EXx
} },
1914 { "addss", { XM
, EXd
} },
1915 { "addpd", { XM
, EXx
} },
1916 { "addsd", { XM
, EXq
} },
1921 { "mulps", { XM
, EXx
} },
1922 { "mulss", { XM
, EXd
} },
1923 { "mulpd", { XM
, EXx
} },
1924 { "mulsd", { XM
, EXq
} },
1929 { "cvtps2pd", { XM
, EXq
} },
1930 { "cvtss2sd", { XM
, EXd
} },
1931 { "cvtpd2ps", { XM
, EXx
} },
1932 { "cvtsd2ss", { XM
, EXq
} },
1937 { "cvtdq2ps", { XM
, EXx
} },
1938 { "cvttps2dq", { XM
, EXx
} },
1939 { "cvtps2dq", { XM
, EXx
} },
1940 { "(bad)", { XX
} },
1945 { "subps", { XM
, EXx
} },
1946 { "subss", { XM
, EXd
} },
1947 { "subpd", { XM
, EXx
} },
1948 { "subsd", { XM
, EXq
} },
1953 { "minps", { XM
, EXx
} },
1954 { "minss", { XM
, EXd
} },
1955 { "minpd", { XM
, EXx
} },
1956 { "minsd", { XM
, EXq
} },
1961 { "divps", { XM
, EXx
} },
1962 { "divss", { XM
, EXd
} },
1963 { "divpd", { XM
, EXx
} },
1964 { "divsd", { XM
, EXq
} },
1969 { "maxps", { XM
, EXx
} },
1970 { "maxss", { XM
, EXd
} },
1971 { "maxpd", { XM
, EXx
} },
1972 { "maxsd", { XM
, EXq
} },
1977 { "punpcklbw",{ MX
, EMd
} },
1978 { "(bad)", { XX
} },
1979 { "punpcklbw",{ MX
, EMx
} },
1980 { "(bad)", { XX
} },
1985 { "punpcklwd",{ MX
, EMd
} },
1986 { "(bad)", { XX
} },
1987 { "punpcklwd",{ MX
, EMx
} },
1988 { "(bad)", { XX
} },
1993 { "punpckldq",{ MX
, EMd
} },
1994 { "(bad)", { XX
} },
1995 { "punpckldq",{ MX
, EMx
} },
1996 { "(bad)", { XX
} },
2001 { "(bad)", { XX
} },
2002 { "(bad)", { XX
} },
2003 { "punpcklqdq", { XM
, EXx
} },
2004 { "(bad)", { XX
} },
2009 { "(bad)", { XX
} },
2010 { "(bad)", { XX
} },
2011 { "punpckhqdq", { XM
, EXx
} },
2012 { "(bad)", { XX
} },
2017 { "movq", { MX
, EM
} },
2018 { "movdqu", { XM
, EXx
} },
2019 { "movdqa", { XM
, EXx
} },
2020 { "(bad)", { XX
} },
2025 { "pshufw", { MX
, EM
, Ib
} },
2026 { "pshufhw",{ XM
, EXx
, Ib
} },
2027 { "pshufd", { XM
, EXx
, Ib
} },
2028 { "pshuflw",{ XM
, EXx
, Ib
} },
2031 /* PREFIX_0F73_REG_3 */
2033 { "(bad)", { XX
} },
2034 { "(bad)", { XX
} },
2035 { "psrldq", { XS
, Ib
} },
2036 { "(bad)", { XX
} },
2039 /* PREFIX_0F73_REG_7 */
2041 { "(bad)", { XX
} },
2042 { "(bad)", { XX
} },
2043 { "pslldq", { XS
, Ib
} },
2044 { "(bad)", { XX
} },
2049 {"vmread", { Em
, Gm
} },
2051 {"extrq", { XS
, Ib
, Ib
} },
2052 {"insertq", { XM
, XS
, Ib
, Ib
} },
2057 {"vmwrite", { Gm
, Em
} },
2059 {"extrq", { XM
, XS
} },
2060 {"insertq", { XM
, XS
} },
2065 { "(bad)", { XX
} },
2066 { "(bad)", { XX
} },
2067 { "haddpd", { XM
, EXx
} },
2068 { "haddps", { XM
, EXx
} },
2073 { "(bad)", { XX
} },
2074 { "(bad)", { XX
} },
2075 { "hsubpd", { XM
, EXx
} },
2076 { "hsubps", { XM
, EXx
} },
2081 { "movK", { Edq
, MX
} },
2082 { "movq", { XM
, EXq
} },
2083 { "movK", { Edq
, XM
} },
2084 { "(bad)", { XX
} },
2089 { "movq", { EM
, MX
} },
2090 { "movdqu", { EXx
, XM
} },
2091 { "movdqa", { EXx
, XM
} },
2092 { "(bad)", { XX
} },
2097 { "(bad)", { XX
} },
2098 { "popcntS", { Gv
, Ev
} },
2099 { "(bad)", { XX
} },
2100 { "(bad)", { XX
} },
2105 { "bsrS", { Gv
, Ev
} },
2106 { "lzcntS", { Gv
, Ev
} },
2107 { "bsrS", { Gv
, Ev
} },
2108 { "(bad)", { XX
} },
2113 { "cmpps", { XM
, EXx
, CMP
} },
2114 { "cmpss", { XM
, EXd
, CMP
} },
2115 { "cmppd", { XM
, EXx
, CMP
} },
2116 { "cmpsd", { XM
, EXq
, CMP
} },
2121 { "movntiS", { Ma
, Gv
} },
2122 { "(bad)", { XX
} },
2123 { "(bad)", { XX
} },
2124 { "(bad)", { XX
} },
2127 /* PREFIX_0FC7_REG_6 */
2129 { "vmptrld",{ Mq
} },
2130 { "vmxon", { Mq
} },
2131 { "vmclear",{ Mq
} },
2132 { "(bad)", { XX
} },
2137 { "(bad)", { XX
} },
2138 { "(bad)", { XX
} },
2139 { "addsubpd", { XM
, EXx
} },
2140 { "addsubps", { XM
, EXx
} },
2145 { "(bad)", { XX
} },
2146 { "movq2dq",{ XM
, MS
} },
2147 { "movq", { EXq
, XM
} },
2148 { "movdq2q",{ MX
, XS
} },
2153 { "(bad)", { XX
} },
2154 { "cvtdq2pd", { XM
, EXq
} },
2155 { "cvttpd2dq", { XM
, EXx
} },
2156 { "cvtpd2dq", { XM
, EXx
} },
2161 { "movntq", { Mq
, MX
} },
2162 { "(bad)", { XX
} },
2163 { MOD_TABLE (MOD_0FE7_PREFIX_2
) },
2164 { "(bad)", { XX
} },
2169 { "(bad)", { XX
} },
2170 { "(bad)", { XX
} },
2171 { "(bad)", { XX
} },
2172 { MOD_TABLE (MOD_0FF0_PREFIX_3
) },
2177 { "maskmovq", { MX
, MS
} },
2178 { "(bad)", { XX
} },
2179 { "maskmovdqu", { XM
, XS
} },
2180 { "(bad)", { XX
} },
2185 { "(bad)", { XX
} },
2186 { "(bad)", { XX
} },
2187 { "pblendvb", { XM
, EXx
, XMM0
} },
2188 { "(bad)", { XX
} },
2193 { "(bad)", { XX
} },
2194 { "(bad)", { XX
} },
2195 { "blendvps", { XM
, EXx
, XMM0
} },
2196 { "(bad)", { XX
} },
2201 { "(bad)", { XX
} },
2202 { "(bad)", { XX
} },
2203 { "blendvpd", { XM
, EXx
, XMM0
} },
2204 { "(bad)", { XX
} },
2209 { "(bad)", { XX
} },
2210 { "(bad)", { XX
} },
2211 { "ptest", { XM
, EXx
} },
2212 { "(bad)", { XX
} },
2217 { "(bad)", { XX
} },
2218 { "(bad)", { XX
} },
2219 { "pmovsxbw", { XM
, EXq
} },
2220 { "(bad)", { XX
} },
2225 { "(bad)", { XX
} },
2226 { "(bad)", { XX
} },
2227 { "pmovsxbd", { XM
, EXd
} },
2228 { "(bad)", { XX
} },
2233 { "(bad)", { XX
} },
2234 { "(bad)", { XX
} },
2235 { "pmovsxbq", { XM
, EXw
} },
2236 { "(bad)", { XX
} },
2241 { "(bad)", { XX
} },
2242 { "(bad)", { XX
} },
2243 { "pmovsxwd", { XM
, EXq
} },
2244 { "(bad)", { XX
} },
2249 { "(bad)", { XX
} },
2250 { "(bad)", { XX
} },
2251 { "pmovsxwq", { XM
, EXd
} },
2252 { "(bad)", { XX
} },
2257 { "(bad)", { XX
} },
2258 { "(bad)", { XX
} },
2259 { "pmovsxdq", { XM
, EXq
} },
2260 { "(bad)", { XX
} },
2265 { "(bad)", { XX
} },
2266 { "(bad)", { XX
} },
2267 { "pmuldq", { XM
, EXx
} },
2268 { "(bad)", { XX
} },
2273 { "(bad)", { XX
} },
2274 { "(bad)", { XX
} },
2275 { "pcmpeqq", { XM
, EXx
} },
2276 { "(bad)", { XX
} },
2281 { "(bad)", { XX
} },
2282 { "(bad)", { XX
} },
2283 { MOD_TABLE (MOD_0F382A_PREFIX_2
) },
2284 { "(bad)", { XX
} },
2289 { "(bad)", { XX
} },
2290 { "(bad)", { XX
} },
2291 { "packusdw", { XM
, EXx
} },
2292 { "(bad)", { XX
} },
2297 { "(bad)", { XX
} },
2298 { "(bad)", { XX
} },
2299 { "pmovzxbw", { XM
, EXq
} },
2300 { "(bad)", { XX
} },
2305 { "(bad)", { XX
} },
2306 { "(bad)", { XX
} },
2307 { "pmovzxbd", { XM
, EXd
} },
2308 { "(bad)", { XX
} },
2313 { "(bad)", { XX
} },
2314 { "(bad)", { XX
} },
2315 { "pmovzxbq", { XM
, EXw
} },
2316 { "(bad)", { XX
} },
2321 { "(bad)", { XX
} },
2322 { "(bad)", { XX
} },
2323 { "pmovzxwd", { XM
, EXq
} },
2324 { "(bad)", { XX
} },
2329 { "(bad)", { XX
} },
2330 { "(bad)", { XX
} },
2331 { "pmovzxwq", { XM
, EXd
} },
2332 { "(bad)", { XX
} },
2337 { "(bad)", { XX
} },
2338 { "(bad)", { XX
} },
2339 { "pmovzxdq", { XM
, EXq
} },
2340 { "(bad)", { XX
} },
2345 { "(bad)", { XX
} },
2346 { "(bad)", { XX
} },
2347 { "pcmpgtq", { XM
, EXx
} },
2348 { "(bad)", { XX
} },
2353 { "(bad)", { XX
} },
2354 { "(bad)", { XX
} },
2355 { "pminsb", { XM
, EXx
} },
2356 { "(bad)", { XX
} },
2361 { "(bad)", { XX
} },
2362 { "(bad)", { XX
} },
2363 { "pminsd", { XM
, EXx
} },
2364 { "(bad)", { XX
} },
2369 { "(bad)", { XX
} },
2370 { "(bad)", { XX
} },
2371 { "pminuw", { XM
, EXx
} },
2372 { "(bad)", { XX
} },
2377 { "(bad)", { XX
} },
2378 { "(bad)", { XX
} },
2379 { "pminud", { XM
, EXx
} },
2380 { "(bad)", { XX
} },
2385 { "(bad)", { XX
} },
2386 { "(bad)", { XX
} },
2387 { "pmaxsb", { XM
, EXx
} },
2388 { "(bad)", { XX
} },
2393 { "(bad)", { XX
} },
2394 { "(bad)", { XX
} },
2395 { "pmaxsd", { XM
, EXx
} },
2396 { "(bad)", { XX
} },
2401 { "(bad)", { XX
} },
2402 { "(bad)", { XX
} },
2403 { "pmaxuw", { XM
, EXx
} },
2404 { "(bad)", { XX
} },
2409 { "(bad)", { XX
} },
2410 { "(bad)", { XX
} },
2411 { "pmaxud", { XM
, EXx
} },
2412 { "(bad)", { XX
} },
2417 { "(bad)", { XX
} },
2418 { "(bad)", { XX
} },
2419 { "pmulld", { XM
, EXx
} },
2420 { "(bad)", { XX
} },
2425 { "(bad)", { XX
} },
2426 { "(bad)", { XX
} },
2427 { "phminposuw", { XM
, EXx
} },
2428 { "(bad)", { XX
} },
2433 { "(bad)", { XX
} },
2434 { "(bad)", { XX
} },
2435 { "(bad)", { XX
} },
2436 { "crc32", { Gdq
, { CRC32_Fixup
, b_mode
} } },
2441 { "(bad)", { XX
} },
2442 { "(bad)", { XX
} },
2443 { "(bad)", { XX
} },
2444 { "crc32", { Gdq
, { CRC32_Fixup
, v_mode
} } },
2449 { "(bad)", { XX
} },
2450 { "(bad)", { XX
} },
2451 { "roundps", { XM
, EXx
, Ib
} },
2452 { "(bad)", { XX
} },
2457 { "(bad)", { XX
} },
2458 { "(bad)", { XX
} },
2459 { "roundpd", { XM
, EXx
, Ib
} },
2460 { "(bad)", { XX
} },
2465 { "(bad)", { XX
} },
2466 { "(bad)", { XX
} },
2467 { "roundss", { XM
, EXd
, Ib
} },
2468 { "(bad)", { XX
} },
2473 { "(bad)", { XX
} },
2474 { "(bad)", { XX
} },
2475 { "roundsd", { XM
, EXq
, Ib
} },
2476 { "(bad)", { XX
} },
2481 { "(bad)", { XX
} },
2482 { "(bad)", { XX
} },
2483 { "blendps", { XM
, EXx
, Ib
} },
2484 { "(bad)", { XX
} },
2489 { "(bad)", { XX
} },
2490 { "(bad)", { XX
} },
2491 { "blendpd", { XM
, EXx
, Ib
} },
2492 { "(bad)", { XX
} },
2497 { "(bad)", { XX
} },
2498 { "(bad)", { XX
} },
2499 { "pblendw", { XM
, EXx
, Ib
} },
2500 { "(bad)", { XX
} },
2505 { "(bad)", { XX
} },
2506 { "(bad)", { XX
} },
2507 { "pextrb", { Edqb
, XM
, Ib
} },
2508 { "(bad)", { XX
} },
2513 { "(bad)", { XX
} },
2514 { "(bad)", { XX
} },
2515 { "pextrw", { Edqw
, XM
, Ib
} },
2516 { "(bad)", { XX
} },
2521 { "(bad)", { XX
} },
2522 { "(bad)", { XX
} },
2523 { "pextrK", { Edq
, XM
, Ib
} },
2524 { "(bad)", { XX
} },
2529 { "(bad)", { XX
} },
2530 { "(bad)", { XX
} },
2531 { "extractps", { Edqd
, XM
, Ib
} },
2532 { "(bad)", { XX
} },
2537 { "(bad)", { XX
} },
2538 { "(bad)", { XX
} },
2539 { "pinsrb", { XM
, Edqb
, Ib
} },
2540 { "(bad)", { XX
} },
2545 { "(bad)", { XX
} },
2546 { "(bad)", { XX
} },
2547 { "insertps", { XM
, EXd
, Ib
} },
2548 { "(bad)", { XX
} },
2553 { "(bad)", { XX
} },
2554 { "(bad)", { XX
} },
2555 { "pinsrK", { XM
, Edq
, Ib
} },
2556 { "(bad)", { XX
} },
2561 { "(bad)", { XX
} },
2562 { "(bad)", { XX
} },
2563 { "dpps", { XM
, EXx
, Ib
} },
2564 { "(bad)", { XX
} },
2569 { "(bad)", { XX
} },
2570 { "(bad)", { XX
} },
2571 { "dppd", { XM
, EXx
, Ib
} },
2572 { "(bad)", { XX
} },
2577 { "(bad)", { XX
} },
2578 { "(bad)", { XX
} },
2579 { "mpsadbw", { XM
, EXx
, Ib
} },
2580 { "(bad)", { XX
} },
2585 { "(bad)", { XX
} },
2586 { "(bad)", { XX
} },
2587 { "pcmpestrm", { XM
, EXx
, Ib
} },
2588 { "(bad)", { XX
} },
2593 { "(bad)", { XX
} },
2594 { "(bad)", { XX
} },
2595 { "pcmpestri", { XM
, EXx
, Ib
} },
2596 { "(bad)", { XX
} },
2601 { "(bad)", { XX
} },
2602 { "(bad)", { XX
} },
2603 { "pcmpistrm", { XM
, EXx
, Ib
} },
2604 { "(bad)", { XX
} },
2609 { "(bad)", { XX
} },
2610 { "(bad)", { XX
} },
2611 { "pcmpistri", { XM
, EXx
, Ib
} },
2612 { "(bad)", { XX
} },
2616 static const struct dis386 x86_64_table
[][2] = {
2619 { "push{T|}", { es
} },
2620 { "(bad)", { XX
} },
2625 { "pop{T|}", { es
} },
2626 { "(bad)", { XX
} },
2631 { "push{T|}", { cs
} },
2632 { "(bad)", { XX
} },
2637 { "push{T|}", { ss
} },
2638 { "(bad)", { XX
} },
2643 { "pop{T|}", { ss
} },
2644 { "(bad)", { XX
} },
2649 { "push{T|}", { ds
} },
2650 { "(bad)", { XX
} },
2655 { "pop{T|}", { ds
} },
2656 { "(bad)", { XX
} },
2662 { "(bad)", { XX
} },
2668 { "(bad)", { XX
} },
2674 { "(bad)", { XX
} },
2680 { "(bad)", { XX
} },
2685 { "pusha{P|}", { XX
} },
2686 { "(bad)", { XX
} },
2691 { "popa{P|}", { XX
} },
2692 { "(bad)", { XX
} },
2697 { MOD_TABLE (MOD_62_32BIT
) },
2698 { "(bad)", { XX
} },
2703 { "arpl", { Ew
, Gw
} },
2704 { "movs{lq|xd}", { Gv
, Ed
} },
2709 { "ins{R|}", { Yzr
, indirDX
} },
2710 { "ins{G|}", { Yzr
, indirDX
} },
2715 { "outs{R|}", { indirDXr
, Xz
} },
2716 { "outs{G|}", { indirDXr
, Xz
} },
2721 { "Jcall{T|}", { Ap
} },
2722 { "(bad)", { XX
} },
2727 { MOD_TABLE (MOD_C4_32BIT
) },
2728 { "(bad)", { XX
} },
2733 { MOD_TABLE (MOD_C5_32BIT
) },
2734 { "(bad)", { XX
} },
2740 { "(bad)", { XX
} },
2746 { "(bad)", { XX
} },
2752 { "(bad)", { XX
} },
2757 { "Jjmp{T|}", { Ap
} },
2758 { "(bad)", { XX
} },
2761 /* X86_64_0F01_REG_0 */
2763 { "sgdt{Q|IQ}", { M
} },
2767 /* X86_64_0F01_REG_1 */
2769 { "sidt{Q|IQ}", { M
} },
2773 /* X86_64_0F01_REG_2 */
2775 { "lgdt{Q|Q}", { M
} },
2779 /* X86_64_0F01_REG_3 */
2781 { "lidt{Q|Q}", { M
} },
2786 static const struct dis386 three_byte_table
[][256] = {
2787 /* THREE_BYTE_0F24 */
2790 { "fmaddps", { { OP_DREX4
, q_mode
} } },
2791 { "fmaddpd", { { OP_DREX4
, q_mode
} } },
2792 { "fmaddss", { { OP_DREX4
, w_mode
} } },
2793 { "fmaddsd", { { OP_DREX4
, d_mode
} } },
2794 { "fmaddps", { { OP_DREX4
, DREX_OC1
+ q_mode
} } },
2795 { "fmaddpd", { { OP_DREX4
, DREX_OC1
+ q_mode
} } },
2796 { "fmaddss", { { OP_DREX4
, DREX_OC1
+ w_mode
} } },
2797 { "fmaddsd", { { OP_DREX4
, DREX_OC1
+ d_mode
} } },
2799 { "fmsubps", { { OP_DREX4
, q_mode
} } },
2800 { "fmsubpd", { { OP_DREX4
, q_mode
} } },
2801 { "fmsubss", { { OP_DREX4
, w_mode
} } },
2802 { "fmsubsd", { { OP_DREX4
, d_mode
} } },
2803 { "fmsubps", { { OP_DREX4
, DREX_OC1
+ q_mode
} } },
2804 { "fmsubpd", { { OP_DREX4
, DREX_OC1
+ q_mode
} } },
2805 { "fmsubss", { { OP_DREX4
, DREX_OC1
+ w_mode
} } },
2806 { "fmsubsd", { { OP_DREX4
, DREX_OC1
+ d_mode
} } },
2808 { "fnmaddps", { { OP_DREX4
, q_mode
} } },
2809 { "fnmaddpd", { { OP_DREX4
, q_mode
} } },
2810 { "fnmaddss", { { OP_DREX4
, w_mode
} } },
2811 { "fnmaddsd", { { OP_DREX4
, d_mode
} } },
2812 { "fnmaddps", { { OP_DREX4
, DREX_OC1
+ q_mode
} } },
2813 { "fnmaddpd", { { OP_DREX4
, DREX_OC1
+ q_mode
} } },
2814 { "fnmaddss", { { OP_DREX4
, DREX_OC1
+ w_mode
} } },
2815 { "fnmaddsd", { { OP_DREX4
, DREX_OC1
+ d_mode
} } },
2817 { "fnmsubps", { { OP_DREX4
, q_mode
} } },
2818 { "fnmsubpd", { { OP_DREX4
, q_mode
} } },
2819 { "fnmsubss", { { OP_DREX4
, w_mode
} } },
2820 { "fnmsubsd", { { OP_DREX4
, d_mode
} } },
2821 { "fnmsubps", { { OP_DREX4
, DREX_OC1
+ q_mode
} } },
2822 { "fnmsubpd", { { OP_DREX4
, DREX_OC1
+ q_mode
} } },
2823 { "fnmsubss", { { OP_DREX4
, DREX_OC1
+ w_mode
} } },
2824 { "fnmsubsd", { { OP_DREX4
, DREX_OC1
+ d_mode
} } },
2826 { "permps", { { OP_DREX4
, q_mode
} } },
2827 { "permpd", { { OP_DREX4
, q_mode
} } },
2828 { "pcmov", { { OP_DREX4
, q_mode
} } },
2829 { "pperm", { { OP_DREX4
, q_mode
} } },
2830 { "permps", { { OP_DREX4
, DREX_OC1
+ q_mode
} } },
2831 { "permpd", { { OP_DREX4
, DREX_OC1
+ q_mode
} } },
2832 { "pcmov", { { OP_DREX4
, DREX_OC1
+ w_mode
} } },
2833 { "pperm", { { OP_DREX4
, DREX_OC1
+ d_mode
} } },
2835 { "(bad)", { XX
} },
2836 { "(bad)", { XX
} },
2837 { "(bad)", { XX
} },
2838 { "(bad)", { XX
} },
2839 { "(bad)", { XX
} },
2840 { "(bad)", { XX
} },
2841 { "(bad)", { XX
} },
2842 { "(bad)", { XX
} },
2844 { "(bad)", { XX
} },
2845 { "(bad)", { XX
} },
2846 { "(bad)", { XX
} },
2847 { "(bad)", { XX
} },
2848 { "(bad)", { XX
} },
2849 { "(bad)", { XX
} },
2850 { "(bad)", { XX
} },
2851 { "(bad)", { XX
} },
2853 { "(bad)", { XX
} },
2854 { "(bad)", { XX
} },
2855 { "(bad)", { XX
} },
2856 { "(bad)", { XX
} },
2857 { "(bad)", { XX
} },
2858 { "(bad)", { XX
} },
2859 { "(bad)", { XX
} },
2860 { "(bad)", { XX
} },
2862 { "protb", { { OP_DREX3
, q_mode
} } },
2863 { "protw", { { OP_DREX3
, q_mode
} } },
2864 { "protd", { { OP_DREX3
, q_mode
} } },
2865 { "protq", { { OP_DREX3
, q_mode
} } },
2866 { "pshlb", { { OP_DREX3
, q_mode
} } },
2867 { "pshlw", { { OP_DREX3
, q_mode
} } },
2868 { "pshld", { { OP_DREX3
, q_mode
} } },
2869 { "pshlq", { { OP_DREX3
, q_mode
} } },
2871 { "pshab", { { OP_DREX3
, q_mode
} } },
2872 { "pshaw", { { OP_DREX3
, q_mode
} } },
2873 { "pshad", { { OP_DREX3
, q_mode
} } },
2874 { "pshaq", { { OP_DREX3
, q_mode
} } },
2875 { "(bad)", { XX
} },
2876 { "(bad)", { XX
} },
2877 { "(bad)", { XX
} },
2878 { "(bad)", { XX
} },
2880 { "(bad)", { XX
} },
2881 { "(bad)", { XX
} },
2882 { "(bad)", { XX
} },
2883 { "(bad)", { XX
} },
2884 { "(bad)", { XX
} },
2885 { "(bad)", { XX
} },
2886 { "(bad)", { XX
} },
2887 { "(bad)", { XX
} },
2889 { "(bad)", { XX
} },
2890 { "(bad)", { XX
} },
2891 { "(bad)", { XX
} },
2892 { "(bad)", { XX
} },
2893 { "(bad)", { XX
} },
2894 { "(bad)", { XX
} },
2895 { "(bad)", { XX
} },
2896 { "(bad)", { XX
} },
2898 { "(bad)", { XX
} },
2899 { "(bad)", { XX
} },
2900 { "(bad)", { XX
} },
2901 { "(bad)", { XX
} },
2902 { "(bad)", { XX
} },
2903 { "(bad)", { XX
} },
2904 { "(bad)", { XX
} },
2905 { "(bad)", { XX
} },
2907 { "(bad)", { XX
} },
2908 { "(bad)", { XX
} },
2909 { "(bad)", { XX
} },
2910 { "(bad)", { XX
} },
2911 { "(bad)", { XX
} },
2912 { "(bad)", { XX
} },
2913 { "(bad)", { XX
} },
2914 { "(bad)", { XX
} },
2916 { "(bad)", { XX
} },
2917 { "(bad)", { XX
} },
2918 { "(bad)", { XX
} },
2919 { "(bad)", { XX
} },
2920 { "(bad)", { XX
} },
2921 { "(bad)", { XX
} },
2922 { "(bad)", { XX
} },
2923 { "(bad)", { XX
} },
2925 { "(bad)", { XX
} },
2926 { "(bad)", { XX
} },
2927 { "(bad)", { XX
} },
2928 { "(bad)", { XX
} },
2929 { "(bad)", { XX
} },
2930 { "(bad)", { XX
} },
2931 { "(bad)", { XX
} },
2932 { "(bad)", { XX
} },
2934 { "(bad)", { XX
} },
2935 { "(bad)", { XX
} },
2936 { "(bad)", { XX
} },
2937 { "(bad)", { XX
} },
2938 { "(bad)", { XX
} },
2939 { "pmacssww", { { OP_DREX4
, DREX_OC1
+ DREX_NO_OC0
+ q_mode
} } },
2940 { "pmacsswd", { { OP_DREX4
, DREX_OC1
+ DREX_NO_OC0
+ q_mode
} } },
2941 { "pmacssdql", { { OP_DREX4
, DREX_OC1
+ DREX_NO_OC0
+ q_mode
} } },
2943 { "(bad)", { XX
} },
2944 { "(bad)", { XX
} },
2945 { "(bad)", { XX
} },
2946 { "(bad)", { XX
} },
2947 { "(bad)", { XX
} },
2948 { "(bad)", { XX
} },
2949 { "pmacssdd", { { OP_DREX4
, DREX_OC1
+ DREX_NO_OC0
+ q_mode
} } },
2950 { "pmacssdqh", { { OP_DREX4
, DREX_OC1
+ DREX_NO_OC0
+ q_mode
} } },
2952 { "(bad)", { XX
} },
2953 { "(bad)", { XX
} },
2954 { "(bad)", { XX
} },
2955 { "(bad)", { XX
} },
2956 { "(bad)", { XX
} },
2957 { "pmacsww", { { OP_DREX4
, DREX_OC1
+ DREX_NO_OC0
+ q_mode
} } },
2958 { "pmacswd", { { OP_DREX4
, DREX_OC1
+ DREX_NO_OC0
+ q_mode
} } },
2959 { "pmacsdql", { { OP_DREX4
, DREX_OC1
+ DREX_NO_OC0
+ q_mode
} } },
2961 { "(bad)", { XX
} },
2962 { "(bad)", { XX
} },
2963 { "(bad)", { XX
} },
2964 { "(bad)", { XX
} },
2965 { "(bad)", { XX
} },
2966 { "(bad)", { XX
} },
2967 { "pmacsdd", { { OP_DREX4
, DREX_OC1
+ DREX_NO_OC0
+ q_mode
} } },
2968 { "pmacsdqh", { { OP_DREX4
, DREX_OC1
+ DREX_NO_OC0
+ q_mode
} } },
2970 { "(bad)", { XX
} },
2971 { "(bad)", { XX
} },
2972 { "(bad)", { XX
} },
2973 { "(bad)", { XX
} },
2974 { "(bad)", { XX
} },
2975 { "(bad)", { XX
} },
2976 { "pmadcsswd", { { OP_DREX4
, DREX_OC1
+ DREX_NO_OC0
+ q_mode
} } },
2977 { "(bad)", { XX
} },
2979 { "(bad)", { XX
} },
2980 { "(bad)", { XX
} },
2981 { "(bad)", { XX
} },
2982 { "(bad)", { XX
} },
2983 { "(bad)", { XX
} },
2984 { "(bad)", { XX
} },
2985 { "(bad)", { XX
} },
2986 { "(bad)", { XX
} },
2988 { "(bad)", { XX
} },
2989 { "(bad)", { XX
} },
2990 { "(bad)", { XX
} },
2991 { "(bad)", { XX
} },
2992 { "(bad)", { XX
} },
2993 { "(bad)", { XX
} },
2994 { "pmadcswd", { { OP_DREX4
, DREX_OC1
+ DREX_NO_OC0
+ q_mode
} } },
2995 { "(bad)", { XX
} },
2997 { "(bad)", { XX
} },
2998 { "(bad)", { XX
} },
2999 { "(bad)", { XX
} },
3000 { "(bad)", { XX
} },
3001 { "(bad)", { XX
} },
3002 { "(bad)", { XX
} },
3003 { "(bad)", { XX
} },
3004 { "(bad)", { XX
} },
3006 { "(bad)", { XX
} },
3007 { "(bad)", { XX
} },
3008 { "(bad)", { XX
} },
3009 { "(bad)", { XX
} },
3010 { "(bad)", { XX
} },
3011 { "(bad)", { XX
} },
3012 { "(bad)", { XX
} },
3013 { "(bad)", { XX
} },
3015 { "(bad)", { XX
} },
3016 { "(bad)", { XX
} },
3017 { "(bad)", { XX
} },
3018 { "(bad)", { XX
} },
3019 { "(bad)", { XX
} },
3020 { "(bad)", { XX
} },
3021 { "(bad)", { XX
} },
3022 { "(bad)", { XX
} },
3024 { "(bad)", { XX
} },
3025 { "(bad)", { XX
} },
3026 { "(bad)", { XX
} },
3027 { "(bad)", { XX
} },
3028 { "(bad)", { XX
} },
3029 { "(bad)", { XX
} },
3030 { "(bad)", { XX
} },
3031 { "(bad)", { XX
} },
3033 { "(bad)", { XX
} },
3034 { "(bad)", { XX
} },
3035 { "(bad)", { XX
} },
3036 { "(bad)", { XX
} },
3037 { "(bad)", { XX
} },
3038 { "(bad)", { XX
} },
3039 { "(bad)", { XX
} },
3040 { "(bad)", { XX
} },
3042 { "(bad)", { XX
} },
3043 { "(bad)", { XX
} },
3044 { "(bad)", { XX
} },
3045 { "(bad)", { XX
} },
3046 { "(bad)", { XX
} },
3047 { "(bad)", { XX
} },
3048 { "(bad)", { XX
} },
3049 { "(bad)", { XX
} },
3051 { "(bad)", { XX
} },
3052 { "(bad)", { XX
} },
3053 { "(bad)", { XX
} },
3054 { "(bad)", { XX
} },
3055 { "(bad)", { XX
} },
3056 { "(bad)", { XX
} },
3057 { "(bad)", { XX
} },
3058 { "(bad)", { XX
} },
3060 { "(bad)", { XX
} },
3061 { "(bad)", { XX
} },
3062 { "(bad)", { XX
} },
3063 { "(bad)", { XX
} },
3064 { "(bad)", { XX
} },
3065 { "(bad)", { XX
} },
3066 { "(bad)", { XX
} },
3067 { "(bad)", { XX
} },
3069 { "(bad)", { XX
} },
3070 { "(bad)", { XX
} },
3071 { "(bad)", { XX
} },
3072 { "(bad)", { XX
} },
3073 { "(bad)", { XX
} },
3074 { "(bad)", { XX
} },
3075 { "(bad)", { XX
} },
3076 { "(bad)", { XX
} },
3078 /* THREE_BYTE_0F25 */
3081 { "(bad)", { XX
} },
3082 { "(bad)", { XX
} },
3083 { "(bad)", { XX
} },
3084 { "(bad)", { XX
} },
3085 { "(bad)", { XX
} },
3086 { "(bad)", { XX
} },
3087 { "(bad)", { XX
} },
3088 { "(bad)", { XX
} },
3090 { "(bad)", { XX
} },
3091 { "(bad)", { XX
} },
3092 { "(bad)", { XX
} },
3093 { "(bad)", { XX
} },
3094 { "(bad)", { XX
} },
3095 { "(bad)", { XX
} },
3096 { "(bad)", { XX
} },
3097 { "(bad)", { XX
} },
3099 { "(bad)", { XX
} },
3100 { "(bad)", { XX
} },
3101 { "(bad)", { XX
} },
3102 { "(bad)", { XX
} },
3103 { "(bad)", { XX
} },
3104 { "(bad)", { XX
} },
3105 { "(bad)", { XX
} },
3106 { "(bad)", { XX
} },
3108 { "(bad)", { XX
} },
3109 { "(bad)", { XX
} },
3110 { "(bad)", { XX
} },
3111 { "(bad)", { XX
} },
3112 { "(bad)", { XX
} },
3113 { "(bad)", { XX
} },
3114 { "(bad)", { XX
} },
3115 { "(bad)", { XX
} },
3117 { "(bad)", { XX
} },
3118 { "(bad)", { XX
} },
3119 { "(bad)", { XX
} },
3120 { "(bad)", { XX
} },
3121 { "(bad)", { XX
} },
3122 { "(bad)", { XX
} },
3123 { "(bad)", { XX
} },
3124 { "(bad)", { XX
} },
3126 { "(bad)", { XX
} },
3127 { "(bad)", { XX
} },
3128 { "(bad)", { XX
} },
3129 { "(bad)", { XX
} },
3130 { "comps", { { OP_DREX3
, q_mode
}, { OP_DREX_FCMP
, b_mode
} } },
3131 { "compd", { { OP_DREX3
, q_mode
}, { OP_DREX_FCMP
, b_mode
} } },
3132 { "comss", { { OP_DREX3
, w_mode
}, { OP_DREX_FCMP
, b_mode
} } },
3133 { "comsd", { { OP_DREX3
, d_mode
}, { OP_DREX_FCMP
, b_mode
} } },
3135 { "(bad)", { XX
} },
3136 { "(bad)", { XX
} },
3137 { "(bad)", { XX
} },
3138 { "(bad)", { XX
} },
3139 { "(bad)", { XX
} },
3140 { "(bad)", { XX
} },
3141 { "(bad)", { XX
} },
3142 { "(bad)", { XX
} },
3144 { "(bad)", { XX
} },
3145 { "(bad)", { XX
} },
3146 { "(bad)", { XX
} },
3147 { "(bad)", { XX
} },
3148 { "(bad)", { XX
} },
3149 { "(bad)", { XX
} },
3150 { "(bad)", { XX
} },
3151 { "(bad)", { XX
} },
3153 { "(bad)", { XX
} },
3154 { "(bad)", { XX
} },
3155 { "(bad)", { XX
} },
3156 { "(bad)", { XX
} },
3157 { "(bad)", { XX
} },
3158 { "(bad)", { XX
} },
3159 { "(bad)", { XX
} },
3160 { "(bad)", { XX
} },
3162 { "(bad)", { XX
} },
3163 { "(bad)", { XX
} },
3164 { "(bad)", { XX
} },
3165 { "(bad)", { XX
} },
3166 { "pcomb", { { OP_DREX3
, q_mode
}, { OP_DREX_ICMP
, b_mode
} } },
3167 { "pcomw", { { OP_DREX3
, q_mode
}, { OP_DREX_ICMP
, b_mode
} } },
3168 { "pcomd", { { OP_DREX3
, q_mode
}, { OP_DREX_ICMP
, b_mode
} } },
3169 { "pcomq", { { OP_DREX3
, q_mode
}, { OP_DREX_ICMP
, b_mode
} } },
3171 { "(bad)", { XX
} },
3172 { "(bad)", { XX
} },
3173 { "(bad)", { XX
} },
3174 { "(bad)", { XX
} },
3175 { "(bad)", { XX
} },
3176 { "(bad)", { XX
} },
3177 { "(bad)", { XX
} },
3178 { "(bad)", { XX
} },
3180 { "(bad)", { XX
} },
3181 { "(bad)", { XX
} },
3182 { "(bad)", { XX
} },
3183 { "(bad)", { XX
} },
3184 { "(bad)", { XX
} },
3185 { "(bad)", { XX
} },
3186 { "(bad)", { XX
} },
3187 { "(bad)", { XX
} },
3189 { "(bad)", { XX
} },
3190 { "(bad)", { XX
} },
3191 { "(bad)", { XX
} },
3192 { "(bad)", { XX
} },
3193 { "(bad)", { XX
} },
3194 { "(bad)", { XX
} },
3195 { "(bad)", { XX
} },
3196 { "(bad)", { XX
} },
3198 { "(bad)", { XX
} },
3199 { "(bad)", { XX
} },
3200 { "(bad)", { XX
} },
3201 { "(bad)", { XX
} },
3202 { "pcomub", { { OP_DREX3
, q_mode
}, { OP_DREX_ICMP
, b_mode
} } },
3203 { "pcomuw", { { OP_DREX3
, q_mode
}, { OP_DREX_ICMP
, b_mode
} } },
3204 { "pcomud", { { OP_DREX3
, q_mode
}, { OP_DREX_ICMP
, b_mode
} } },
3205 { "pcomuq", { { OP_DREX3
, q_mode
}, { OP_DREX_ICMP
, b_mode
} } },
3207 { "(bad)", { XX
} },
3208 { "(bad)", { XX
} },
3209 { "(bad)", { XX
} },
3210 { "(bad)", { XX
} },
3211 { "(bad)", { XX
} },
3212 { "(bad)", { XX
} },
3213 { "(bad)", { XX
} },
3214 { "(bad)", { XX
} },
3216 { "(bad)", { XX
} },
3217 { "(bad)", { XX
} },
3218 { "(bad)", { XX
} },
3219 { "(bad)", { XX
} },
3220 { "(bad)", { XX
} },
3221 { "(bad)", { XX
} },
3222 { "(bad)", { XX
} },
3223 { "(bad)", { XX
} },
3225 { "(bad)", { XX
} },
3226 { "(bad)", { XX
} },
3227 { "(bad)", { XX
} },
3228 { "(bad)", { XX
} },
3229 { "(bad)", { XX
} },
3230 { "(bad)", { XX
} },
3231 { "(bad)", { XX
} },
3232 { "(bad)", { XX
} },
3234 { "(bad)", { XX
} },
3235 { "(bad)", { XX
} },
3236 { "(bad)", { XX
} },
3237 { "(bad)", { XX
} },
3238 { "(bad)", { XX
} },
3239 { "(bad)", { XX
} },
3240 { "(bad)", { XX
} },
3241 { "(bad)", { XX
} },
3243 { "(bad)", { XX
} },
3244 { "(bad)", { XX
} },
3245 { "(bad)", { XX
} },
3246 { "(bad)", { XX
} },
3247 { "(bad)", { XX
} },
3248 { "(bad)", { XX
} },
3249 { "(bad)", { XX
} },
3250 { "(bad)", { XX
} },
3252 { "(bad)", { XX
} },
3253 { "(bad)", { XX
} },
3254 { "(bad)", { XX
} },
3255 { "(bad)", { XX
} },
3256 { "(bad)", { XX
} },
3257 { "(bad)", { XX
} },
3258 { "(bad)", { XX
} },
3259 { "(bad)", { XX
} },
3261 { "(bad)", { XX
} },
3262 { "(bad)", { XX
} },
3263 { "(bad)", { XX
} },
3264 { "(bad)", { XX
} },
3265 { "(bad)", { XX
} },
3266 { "(bad)", { XX
} },
3267 { "(bad)", { XX
} },
3268 { "(bad)", { XX
} },
3270 { "(bad)", { XX
} },
3271 { "(bad)", { XX
} },
3272 { "(bad)", { XX
} },
3273 { "(bad)", { XX
} },
3274 { "(bad)", { XX
} },
3275 { "(bad)", { XX
} },
3276 { "(bad)", { XX
} },
3277 { "(bad)", { XX
} },
3279 { "(bad)", { XX
} },
3280 { "(bad)", { XX
} },
3281 { "(bad)", { XX
} },
3282 { "(bad)", { XX
} },
3283 { "(bad)", { XX
} },
3284 { "(bad)", { XX
} },
3285 { "(bad)", { XX
} },
3286 { "(bad)", { XX
} },
3288 { "(bad)", { XX
} },
3289 { "(bad)", { XX
} },
3290 { "(bad)", { XX
} },
3291 { "(bad)", { XX
} },
3292 { "(bad)", { XX
} },
3293 { "(bad)", { XX
} },
3294 { "(bad)", { XX
} },
3295 { "(bad)", { XX
} },
3297 { "(bad)", { XX
} },
3298 { "(bad)", { XX
} },
3299 { "(bad)", { XX
} },
3300 { "(bad)", { XX
} },
3301 { "(bad)", { XX
} },
3302 { "(bad)", { XX
} },
3303 { "(bad)", { XX
} },
3304 { "(bad)", { XX
} },
3306 { "(bad)", { XX
} },
3307 { "(bad)", { XX
} },
3308 { "(bad)", { XX
} },
3309 { "(bad)", { XX
} },
3310 { "(bad)", { XX
} },
3311 { "(bad)", { XX
} },
3312 { "(bad)", { XX
} },
3313 { "(bad)", { XX
} },
3315 { "(bad)", { XX
} },
3316 { "(bad)", { XX
} },
3317 { "(bad)", { XX
} },
3318 { "(bad)", { XX
} },
3319 { "(bad)", { XX
} },
3320 { "(bad)", { XX
} },
3321 { "(bad)", { XX
} },
3322 { "(bad)", { XX
} },
3324 { "(bad)", { XX
} },
3325 { "(bad)", { XX
} },
3326 { "(bad)", { XX
} },
3327 { "(bad)", { XX
} },
3328 { "(bad)", { XX
} },
3329 { "(bad)", { XX
} },
3330 { "(bad)", { XX
} },
3331 { "(bad)", { XX
} },
3333 { "(bad)", { XX
} },
3334 { "(bad)", { XX
} },
3335 { "(bad)", { XX
} },
3336 { "(bad)", { XX
} },
3337 { "(bad)", { XX
} },
3338 { "(bad)", { XX
} },
3339 { "(bad)", { XX
} },
3340 { "(bad)", { XX
} },
3342 { "(bad)", { XX
} },
3343 { "(bad)", { XX
} },
3344 { "(bad)", { XX
} },
3345 { "(bad)", { XX
} },
3346 { "(bad)", { XX
} },
3347 { "(bad)", { XX
} },
3348 { "(bad)", { XX
} },
3349 { "(bad)", { XX
} },
3351 { "(bad)", { XX
} },
3352 { "(bad)", { XX
} },
3353 { "(bad)", { XX
} },
3354 { "(bad)", { XX
} },
3355 { "(bad)", { XX
} },
3356 { "(bad)", { XX
} },
3357 { "(bad)", { XX
} },
3358 { "(bad)", { XX
} },
3360 { "(bad)", { XX
} },
3361 { "(bad)", { XX
} },
3362 { "(bad)", { XX
} },
3363 { "(bad)", { XX
} },
3364 { "(bad)", { XX
} },
3365 { "(bad)", { XX
} },
3366 { "(bad)", { XX
} },
3367 { "(bad)", { XX
} },
3369 /* THREE_BYTE_0F38 */
3372 { "pshufb", { MX
, EM
} },
3373 { "phaddw", { MX
, EM
} },
3374 { "phaddd", { MX
, EM
} },
3375 { "phaddsw", { MX
, EM
} },
3376 { "pmaddubsw", { MX
, EM
} },
3377 { "phsubw", { MX
, EM
} },
3378 { "phsubd", { MX
, EM
} },
3379 { "phsubsw", { MX
, EM
} },
3381 { "psignb", { MX
, EM
} },
3382 { "psignw", { MX
, EM
} },
3383 { "psignd", { MX
, EM
} },
3384 { "pmulhrsw", { MX
, EM
} },
3385 { "(bad)", { XX
} },
3386 { "(bad)", { XX
} },
3387 { "(bad)", { XX
} },
3388 { "(bad)", { XX
} },
3390 { PREFIX_TABLE (PREFIX_0F3810
) },
3391 { "(bad)", { XX
} },
3392 { "(bad)", { XX
} },
3393 { "(bad)", { XX
} },
3394 { PREFIX_TABLE (PREFIX_0F3814
) },
3395 { PREFIX_TABLE (PREFIX_0F3815
) },
3396 { "(bad)", { XX
} },
3397 { PREFIX_TABLE (PREFIX_0F3817
) },
3399 { "(bad)", { XX
} },
3400 { "(bad)", { XX
} },
3401 { "(bad)", { XX
} },
3402 { "(bad)", { XX
} },
3403 { "pabsb", { MX
, EM
} },
3404 { "pabsw", { MX
, EM
} },
3405 { "pabsd", { MX
, EM
} },
3406 { "(bad)", { XX
} },
3408 { PREFIX_TABLE (PREFIX_0F3820
) },
3409 { PREFIX_TABLE (PREFIX_0F3821
) },
3410 { PREFIX_TABLE (PREFIX_0F3822
) },
3411 { PREFIX_TABLE (PREFIX_0F3823
) },
3412 { PREFIX_TABLE (PREFIX_0F3824
) },
3413 { PREFIX_TABLE (PREFIX_0F3825
) },
3414 { "(bad)", { XX
} },
3415 { "(bad)", { XX
} },
3417 { PREFIX_TABLE (PREFIX_0F3828
) },
3418 { PREFIX_TABLE (PREFIX_0F3829
) },
3419 { PREFIX_TABLE (PREFIX_0F382A
) },
3420 { PREFIX_TABLE (PREFIX_0F382B
) },
3421 { "(bad)", { XX
} },
3422 { "(bad)", { XX
} },
3423 { "(bad)", { XX
} },
3424 { "(bad)", { XX
} },
3426 { PREFIX_TABLE (PREFIX_0F3830
) },
3427 { PREFIX_TABLE (PREFIX_0F3831
) },
3428 { PREFIX_TABLE (PREFIX_0F3832
) },
3429 { PREFIX_TABLE (PREFIX_0F3833
) },
3430 { PREFIX_TABLE (PREFIX_0F3834
) },
3431 { PREFIX_TABLE (PREFIX_0F3835
) },
3432 { "(bad)", { XX
} },
3433 { PREFIX_TABLE (PREFIX_0F3837
) },
3435 { PREFIX_TABLE (PREFIX_0F3838
) },
3436 { PREFIX_TABLE (PREFIX_0F3839
) },
3437 { PREFIX_TABLE (PREFIX_0F383A
) },
3438 { PREFIX_TABLE (PREFIX_0F383B
) },
3439 { PREFIX_TABLE (PREFIX_0F383C
) },
3440 { PREFIX_TABLE (PREFIX_0F383D
) },
3441 { PREFIX_TABLE (PREFIX_0F383E
) },
3442 { PREFIX_TABLE (PREFIX_0F383F
) },
3444 { PREFIX_TABLE (PREFIX_0F3840
) },
3445 { PREFIX_TABLE (PREFIX_0F3841
) },
3446 { "(bad)", { XX
} },
3447 { "(bad)", { XX
} },
3448 { "(bad)", { XX
} },
3449 { "(bad)", { XX
} },
3450 { "(bad)", { XX
} },
3451 { "(bad)", { XX
} },
3453 { "(bad)", { XX
} },
3454 { "(bad)", { XX
} },
3455 { "(bad)", { XX
} },
3456 { "(bad)", { XX
} },
3457 { "(bad)", { XX
} },
3458 { "(bad)", { XX
} },
3459 { "(bad)", { XX
} },
3460 { "(bad)", { XX
} },
3462 { "(bad)", { XX
} },
3463 { "(bad)", { XX
} },
3464 { "(bad)", { XX
} },
3465 { "(bad)", { XX
} },
3466 { "(bad)", { XX
} },
3467 { "(bad)", { XX
} },
3468 { "(bad)", { XX
} },
3469 { "(bad)", { XX
} },
3471 { "(bad)", { XX
} },
3472 { "(bad)", { XX
} },
3473 { "(bad)", { XX
} },
3474 { "(bad)", { XX
} },
3475 { "(bad)", { XX
} },
3476 { "(bad)", { XX
} },
3477 { "(bad)", { XX
} },
3478 { "(bad)", { XX
} },
3480 { "(bad)", { XX
} },
3481 { "(bad)", { XX
} },
3482 { "(bad)", { XX
} },
3483 { "(bad)", { XX
} },
3484 { "(bad)", { XX
} },
3485 { "(bad)", { XX
} },
3486 { "(bad)", { XX
} },
3487 { "(bad)", { XX
} },
3489 { "(bad)", { XX
} },
3490 { "(bad)", { XX
} },
3491 { "(bad)", { XX
} },
3492 { "(bad)", { XX
} },
3493 { "(bad)", { XX
} },
3494 { "(bad)", { XX
} },
3495 { "(bad)", { XX
} },
3496 { "(bad)", { XX
} },
3498 { "(bad)", { XX
} },
3499 { "(bad)", { XX
} },
3500 { "(bad)", { XX
} },
3501 { "(bad)", { XX
} },
3502 { "(bad)", { XX
} },
3503 { "(bad)", { XX
} },
3504 { "(bad)", { XX
} },
3505 { "(bad)", { XX
} },
3507 { "(bad)", { XX
} },
3508 { "(bad)", { XX
} },
3509 { "(bad)", { XX
} },
3510 { "(bad)", { XX
} },
3511 { "(bad)", { XX
} },
3512 { "(bad)", { XX
} },
3513 { "(bad)", { XX
} },
3514 { "(bad)", { XX
} },
3516 { "(bad)", { XX
} },
3517 { "(bad)", { XX
} },
3518 { "(bad)", { XX
} },
3519 { "(bad)", { XX
} },
3520 { "(bad)", { XX
} },
3521 { "(bad)", { XX
} },
3522 { "(bad)", { XX
} },
3523 { "(bad)", { XX
} },
3525 { "(bad)", { XX
} },
3526 { "(bad)", { XX
} },
3527 { "(bad)", { XX
} },
3528 { "(bad)", { XX
} },
3529 { "(bad)", { XX
} },
3530 { "(bad)", { XX
} },
3531 { "(bad)", { XX
} },
3532 { "(bad)", { XX
} },
3534 { "(bad)", { XX
} },
3535 { "(bad)", { XX
} },
3536 { "(bad)", { XX
} },
3537 { "(bad)", { XX
} },
3538 { "(bad)", { XX
} },
3539 { "(bad)", { XX
} },
3540 { "(bad)", { XX
} },
3541 { "(bad)", { XX
} },
3543 { "(bad)", { XX
} },
3544 { "(bad)", { XX
} },
3545 { "(bad)", { XX
} },
3546 { "(bad)", { XX
} },
3547 { "(bad)", { XX
} },
3548 { "(bad)", { XX
} },
3549 { "(bad)", { XX
} },
3550 { "(bad)", { XX
} },
3552 { "(bad)", { XX
} },
3553 { "(bad)", { XX
} },
3554 { "(bad)", { XX
} },
3555 { "(bad)", { XX
} },
3556 { "(bad)", { XX
} },
3557 { "(bad)", { XX
} },
3558 { "(bad)", { XX
} },
3559 { "(bad)", { XX
} },
3561 { "(bad)", { XX
} },
3562 { "(bad)", { XX
} },
3563 { "(bad)", { XX
} },
3564 { "(bad)", { XX
} },
3565 { "(bad)", { XX
} },
3566 { "(bad)", { XX
} },
3567 { "(bad)", { XX
} },
3568 { "(bad)", { XX
} },
3570 { "(bad)", { XX
} },
3571 { "(bad)", { XX
} },
3572 { "(bad)", { XX
} },
3573 { "(bad)", { XX
} },
3574 { "(bad)", { XX
} },
3575 { "(bad)", { XX
} },
3576 { "(bad)", { XX
} },
3577 { "(bad)", { XX
} },
3579 { "(bad)", { XX
} },
3580 { "(bad)", { XX
} },
3581 { "(bad)", { XX
} },
3582 { "(bad)", { XX
} },
3583 { "(bad)", { XX
} },
3584 { "(bad)", { XX
} },
3585 { "(bad)", { XX
} },
3586 { "(bad)", { XX
} },
3588 { "(bad)", { XX
} },
3589 { "(bad)", { XX
} },
3590 { "(bad)", { XX
} },
3591 { "(bad)", { XX
} },
3592 { "(bad)", { XX
} },
3593 { "(bad)", { XX
} },
3594 { "(bad)", { XX
} },
3595 { "(bad)", { XX
} },
3597 { "(bad)", { XX
} },
3598 { "(bad)", { XX
} },
3599 { "(bad)", { XX
} },
3600 { "(bad)", { XX
} },
3601 { "(bad)", { XX
} },
3602 { "(bad)", { XX
} },
3603 { "(bad)", { XX
} },
3604 { "(bad)", { XX
} },
3606 { "(bad)", { XX
} },
3607 { "(bad)", { XX
} },
3608 { "(bad)", { XX
} },
3609 { "(bad)", { XX
} },
3610 { "(bad)", { XX
} },
3611 { "(bad)", { XX
} },
3612 { "(bad)", { XX
} },
3613 { "(bad)", { XX
} },
3615 { "(bad)", { XX
} },
3616 { "(bad)", { XX
} },
3617 { "(bad)", { XX
} },
3618 { "(bad)", { XX
} },
3619 { "(bad)", { XX
} },
3620 { "(bad)", { XX
} },
3621 { "(bad)", { XX
} },
3622 { "(bad)", { XX
} },
3624 { "(bad)", { XX
} },
3625 { "(bad)", { XX
} },
3626 { "(bad)", { XX
} },
3627 { "(bad)", { XX
} },
3628 { "(bad)", { XX
} },
3629 { "(bad)", { XX
} },
3630 { "(bad)", { XX
} },
3631 { "(bad)", { XX
} },
3633 { "(bad)", { XX
} },
3634 { "(bad)", { XX
} },
3635 { "(bad)", { XX
} },
3636 { "(bad)", { XX
} },
3637 { "(bad)", { XX
} },
3638 { "(bad)", { XX
} },
3639 { "(bad)", { XX
} },
3640 { "(bad)", { XX
} },
3642 { PREFIX_TABLE (PREFIX_0F38F0
) },
3643 { PREFIX_TABLE (PREFIX_0F38F1
) },
3644 { "(bad)", { XX
} },
3645 { "(bad)", { XX
} },
3646 { "(bad)", { XX
} },
3647 { "(bad)", { XX
} },
3648 { "(bad)", { XX
} },
3649 { "(bad)", { XX
} },
3651 { "(bad)", { XX
} },
3652 { "(bad)", { XX
} },
3653 { "(bad)", { XX
} },
3654 { "(bad)", { XX
} },
3655 { "(bad)", { XX
} },
3656 { "(bad)", { XX
} },
3657 { "(bad)", { XX
} },
3658 { "(bad)", { XX
} },
3660 /* THREE_BYTE_0F3A */
3663 { "(bad)", { XX
} },
3664 { "(bad)", { XX
} },
3665 { "(bad)", { XX
} },
3666 { "(bad)", { XX
} },
3667 { "(bad)", { XX
} },
3668 { "(bad)", { XX
} },
3669 { "(bad)", { XX
} },
3670 { "(bad)", { XX
} },
3672 { PREFIX_TABLE (PREFIX_0F3A08
) },
3673 { PREFIX_TABLE (PREFIX_0F3A09
) },
3674 { PREFIX_TABLE (PREFIX_0F3A0A
) },
3675 { PREFIX_TABLE (PREFIX_0F3A0B
) },
3676 { PREFIX_TABLE (PREFIX_0F3A0C
) },
3677 { PREFIX_TABLE (PREFIX_0F3A0D
) },
3678 { PREFIX_TABLE (PREFIX_0F3A0E
) },
3679 { "palignr", { MX
, EM
, Ib
} },
3681 { "(bad)", { XX
} },
3682 { "(bad)", { XX
} },
3683 { "(bad)", { XX
} },
3684 { "(bad)", { XX
} },
3685 { PREFIX_TABLE (PREFIX_0F3A14
) },
3686 { PREFIX_TABLE (PREFIX_0F3A15
) },
3687 { PREFIX_TABLE (PREFIX_0F3A16
) },
3688 { PREFIX_TABLE (PREFIX_0F3A17
) },
3690 { "(bad)", { XX
} },
3691 { "(bad)", { XX
} },
3692 { "(bad)", { XX
} },
3693 { "(bad)", { XX
} },
3694 { "(bad)", { XX
} },
3695 { "(bad)", { XX
} },
3696 { "(bad)", { XX
} },
3697 { "(bad)", { XX
} },
3699 { PREFIX_TABLE (PREFIX_0F3A20
) },
3700 { PREFIX_TABLE (PREFIX_0F3A21
) },
3701 { PREFIX_TABLE (PREFIX_0F3A22
) },
3702 { "(bad)", { XX
} },
3703 { "(bad)", { XX
} },
3704 { "(bad)", { XX
} },
3705 { "(bad)", { XX
} },
3706 { "(bad)", { XX
} },
3708 { "(bad)", { XX
} },
3709 { "(bad)", { XX
} },
3710 { "(bad)", { XX
} },
3711 { "(bad)", { XX
} },
3712 { "(bad)", { XX
} },
3713 { "(bad)", { XX
} },
3714 { "(bad)", { XX
} },
3715 { "(bad)", { XX
} },
3717 { "(bad)", { XX
} },
3718 { "(bad)", { XX
} },
3719 { "(bad)", { XX
} },
3720 { "(bad)", { XX
} },
3721 { "(bad)", { XX
} },
3722 { "(bad)", { XX
} },
3723 { "(bad)", { XX
} },
3724 { "(bad)", { XX
} },
3726 { "(bad)", { XX
} },
3727 { "(bad)", { XX
} },
3728 { "(bad)", { XX
} },
3729 { "(bad)", { XX
} },
3730 { "(bad)", { XX
} },
3731 { "(bad)", { XX
} },
3732 { "(bad)", { XX
} },
3733 { "(bad)", { XX
} },
3735 { PREFIX_TABLE (PREFIX_0F3A40
) },
3736 { PREFIX_TABLE (PREFIX_0F3A41
) },
3737 { PREFIX_TABLE (PREFIX_0F3A42
) },
3738 { "(bad)", { XX
} },
3739 { "(bad)", { XX
} },
3740 { "(bad)", { XX
} },
3741 { "(bad)", { XX
} },
3742 { "(bad)", { XX
} },
3744 { "(bad)", { XX
} },
3745 { "(bad)", { XX
} },
3746 { "(bad)", { XX
} },
3747 { "(bad)", { XX
} },
3748 { "(bad)", { XX
} },
3749 { "(bad)", { XX
} },
3750 { "(bad)", { XX
} },
3751 { "(bad)", { XX
} },
3753 { "(bad)", { XX
} },
3754 { "(bad)", { XX
} },
3755 { "(bad)", { XX
} },
3756 { "(bad)", { XX
} },
3757 { "(bad)", { XX
} },
3758 { "(bad)", { XX
} },
3759 { "(bad)", { XX
} },
3760 { "(bad)", { XX
} },
3762 { "(bad)", { XX
} },
3763 { "(bad)", { XX
} },
3764 { "(bad)", { XX
} },
3765 { "(bad)", { XX
} },
3766 { "(bad)", { XX
} },
3767 { "(bad)", { XX
} },
3768 { "(bad)", { XX
} },
3769 { "(bad)", { XX
} },
3771 { PREFIX_TABLE (PREFIX_0F3A60
) },
3772 { PREFIX_TABLE (PREFIX_0F3A61
) },
3773 { PREFIX_TABLE (PREFIX_0F3A62
) },
3774 { PREFIX_TABLE (PREFIX_0F3A63
) },
3775 { "(bad)", { XX
} },
3776 { "(bad)", { XX
} },
3777 { "(bad)", { XX
} },
3778 { "(bad)", { XX
} },
3780 { "(bad)", { XX
} },
3781 { "(bad)", { XX
} },
3782 { "(bad)", { XX
} },
3783 { "(bad)", { XX
} },
3784 { "(bad)", { XX
} },
3785 { "(bad)", { XX
} },
3786 { "(bad)", { XX
} },
3787 { "(bad)", { XX
} },
3789 { "(bad)", { XX
} },
3790 { "(bad)", { XX
} },
3791 { "(bad)", { XX
} },
3792 { "(bad)", { XX
} },
3793 { "(bad)", { XX
} },
3794 { "(bad)", { XX
} },
3795 { "(bad)", { XX
} },
3796 { "(bad)", { XX
} },
3798 { "(bad)", { XX
} },
3799 { "(bad)", { XX
} },
3800 { "(bad)", { XX
} },
3801 { "(bad)", { XX
} },
3802 { "(bad)", { XX
} },
3803 { "(bad)", { XX
} },
3804 { "(bad)", { XX
} },
3805 { "(bad)", { XX
} },
3807 { "(bad)", { XX
} },
3808 { "(bad)", { XX
} },
3809 { "(bad)", { XX
} },
3810 { "(bad)", { XX
} },
3811 { "(bad)", { XX
} },
3812 { "(bad)", { XX
} },
3813 { "(bad)", { XX
} },
3814 { "(bad)", { XX
} },
3816 { "(bad)", { XX
} },
3817 { "(bad)", { XX
} },
3818 { "(bad)", { XX
} },
3819 { "(bad)", { XX
} },
3820 { "(bad)", { XX
} },
3821 { "(bad)", { XX
} },
3822 { "(bad)", { XX
} },
3823 { "(bad)", { XX
} },
3825 { "(bad)", { XX
} },
3826 { "(bad)", { XX
} },
3827 { "(bad)", { XX
} },
3828 { "(bad)", { XX
} },
3829 { "(bad)", { XX
} },
3830 { "(bad)", { XX
} },
3831 { "(bad)", { XX
} },
3832 { "(bad)", { XX
} },
3834 { "(bad)", { XX
} },
3835 { "(bad)", { XX
} },
3836 { "(bad)", { XX
} },
3837 { "(bad)", { XX
} },
3838 { "(bad)", { XX
} },
3839 { "(bad)", { XX
} },
3840 { "(bad)", { XX
} },
3841 { "(bad)", { XX
} },
3843 { "(bad)", { XX
} },
3844 { "(bad)", { XX
} },
3845 { "(bad)", { XX
} },
3846 { "(bad)", { XX
} },
3847 { "(bad)", { XX
} },
3848 { "(bad)", { XX
} },
3849 { "(bad)", { XX
} },
3850 { "(bad)", { XX
} },
3852 { "(bad)", { XX
} },
3853 { "(bad)", { XX
} },
3854 { "(bad)", { XX
} },
3855 { "(bad)", { XX
} },
3856 { "(bad)", { XX
} },
3857 { "(bad)", { XX
} },
3858 { "(bad)", { XX
} },
3859 { "(bad)", { XX
} },
3861 { "(bad)", { XX
} },
3862 { "(bad)", { XX
} },
3863 { "(bad)", { XX
} },
3864 { "(bad)", { XX
} },
3865 { "(bad)", { XX
} },
3866 { "(bad)", { XX
} },
3867 { "(bad)", { XX
} },
3868 { "(bad)", { XX
} },
3870 { "(bad)", { XX
} },
3871 { "(bad)", { XX
} },
3872 { "(bad)", { XX
} },
3873 { "(bad)", { XX
} },
3874 { "(bad)", { XX
} },
3875 { "(bad)", { XX
} },
3876 { "(bad)", { XX
} },
3877 { "(bad)", { XX
} },
3879 { "(bad)", { XX
} },
3880 { "(bad)", { XX
} },
3881 { "(bad)", { XX
} },
3882 { "(bad)", { XX
} },
3883 { "(bad)", { XX
} },
3884 { "(bad)", { XX
} },
3885 { "(bad)", { XX
} },
3886 { "(bad)", { XX
} },
3888 { "(bad)", { XX
} },
3889 { "(bad)", { XX
} },
3890 { "(bad)", { XX
} },
3891 { "(bad)", { XX
} },
3892 { "(bad)", { XX
} },
3893 { "(bad)", { XX
} },
3894 { "(bad)", { XX
} },
3895 { "(bad)", { XX
} },
3897 { "(bad)", { XX
} },
3898 { "(bad)", { XX
} },
3899 { "(bad)", { XX
} },
3900 { "(bad)", { XX
} },
3901 { "(bad)", { XX
} },
3902 { "(bad)", { XX
} },
3903 { "(bad)", { XX
} },
3904 { "(bad)", { XX
} },
3906 { "(bad)", { XX
} },
3907 { "(bad)", { XX
} },
3908 { "(bad)", { XX
} },
3909 { "(bad)", { XX
} },
3910 { "(bad)", { XX
} },
3911 { "(bad)", { XX
} },
3912 { "(bad)", { XX
} },
3913 { "(bad)", { XX
} },
3915 { "(bad)", { XX
} },
3916 { "(bad)", { XX
} },
3917 { "(bad)", { XX
} },
3918 { "(bad)", { XX
} },
3919 { "(bad)", { XX
} },
3920 { "(bad)", { XX
} },
3921 { "(bad)", { XX
} },
3922 { "(bad)", { XX
} },
3924 { "(bad)", { XX
} },
3925 { "(bad)", { XX
} },
3926 { "(bad)", { XX
} },
3927 { "(bad)", { XX
} },
3928 { "(bad)", { XX
} },
3929 { "(bad)", { XX
} },
3930 { "(bad)", { XX
} },
3931 { "(bad)", { XX
} },
3933 { "(bad)", { XX
} },
3934 { "(bad)", { XX
} },
3935 { "(bad)", { XX
} },
3936 { "(bad)", { XX
} },
3937 { "(bad)", { XX
} },
3938 { "(bad)", { XX
} },
3939 { "(bad)", { XX
} },
3940 { "(bad)", { XX
} },
3942 { "(bad)", { XX
} },
3943 { "(bad)", { XX
} },
3944 { "(bad)", { XX
} },
3945 { "(bad)", { XX
} },
3946 { "(bad)", { XX
} },
3947 { "(bad)", { XX
} },
3948 { "(bad)", { XX
} },
3949 { "(bad)", { XX
} },
3951 /* THREE_BYTE_0F7A */
3954 { "(bad)", { XX
} },
3955 { "(bad)", { XX
} },
3956 { "(bad)", { XX
} },
3957 { "(bad)", { XX
} },
3958 { "(bad)", { XX
} },
3959 { "(bad)", { XX
} },
3960 { "(bad)", { XX
} },
3961 { "(bad)", { XX
} },
3963 { "(bad)", { XX
} },
3964 { "(bad)", { XX
} },
3965 { "(bad)", { XX
} },
3966 { "(bad)", { XX
} },
3967 { "(bad)", { XX
} },
3968 { "(bad)", { XX
} },
3969 { "(bad)", { XX
} },
3970 { "(bad)", { XX
} },
3972 { "frczps", { XM
, EXq
} },
3973 { "frczpd", { XM
, EXq
} },
3974 { "frczss", { XM
, EXq
} },
3975 { "frczsd", { XM
, EXq
} },
3976 { "(bad)", { XX
} },
3977 { "(bad)", { XX
} },
3978 { "(bad)", { XX
} },
3979 { "(bad)", { XX
} },
3981 { "(bad)", { XX
} },
3982 { "(bad)", { XX
} },
3983 { "(bad)", { XX
} },
3984 { "(bad)", { XX
} },
3985 { "(bad)", { XX
} },
3986 { "(bad)", { XX
} },
3987 { "(bad)", { XX
} },
3988 { "(bad)", { XX
} },
3990 { "ptest", { XX
} },
3991 { "(bad)", { XX
} },
3992 { "(bad)", { XX
} },
3993 { "(bad)", { XX
} },
3994 { "(bad)", { XX
} },
3995 { "(bad)", { XX
} },
3996 { "(bad)", { XX
} },
3997 { "(bad)", { XX
} },
3999 { "(bad)", { XX
} },
4000 { "(bad)", { XX
} },
4001 { "(bad)", { XX
} },
4002 { "(bad)", { XX
} },
4003 { "(bad)", { XX
} },
4004 { "(bad)", { XX
} },
4005 { "(bad)", { XX
} },
4006 { "(bad)", { XX
} },
4008 { "cvtph2ps", { XM
, EXd
} },
4009 { "cvtps2ph", { EXd
, XM
} },
4010 { "(bad)", { XX
} },
4011 { "(bad)", { XX
} },
4012 { "(bad)", { XX
} },
4013 { "(bad)", { XX
} },
4014 { "(bad)", { XX
} },
4015 { "(bad)", { XX
} },
4017 { "(bad)", { XX
} },
4018 { "(bad)", { XX
} },
4019 { "(bad)", { XX
} },
4020 { "(bad)", { XX
} },
4021 { "(bad)", { XX
} },
4022 { "(bad)", { XX
} },
4023 { "(bad)", { XX
} },
4024 { "(bad)", { XX
} },
4026 { "(bad)", { XX
} },
4027 { "phaddbw", { XM
, EXq
} },
4028 { "phaddbd", { XM
, EXq
} },
4029 { "phaddbq", { XM
, EXq
} },
4030 { "(bad)", { XX
} },
4031 { "(bad)", { XX
} },
4032 { "phaddwd", { XM
, EXq
} },
4033 { "phaddwq", { XM
, EXq
} },
4035 { "(bad)", { XX
} },
4036 { "(bad)", { XX
} },
4037 { "(bad)", { XX
} },
4038 { "phadddq", { XM
, EXq
} },
4039 { "(bad)", { XX
} },
4040 { "(bad)", { XX
} },
4041 { "(bad)", { XX
} },
4042 { "(bad)", { XX
} },
4044 { "(bad)", { XX
} },
4045 { "phaddubw", { XM
, EXq
} },
4046 { "phaddubd", { XM
, EXq
} },
4047 { "phaddubq", { XM
, EXq
} },
4048 { "(bad)", { XX
} },
4049 { "(bad)", { XX
} },
4050 { "phadduwd", { XM
, EXq
} },
4051 { "phadduwq", { XM
, EXq
} },
4053 { "(bad)", { XX
} },
4054 { "(bad)", { XX
} },
4055 { "(bad)", { XX
} },
4056 { "phaddudq", { XM
, EXq
} },
4057 { "(bad)", { XX
} },
4058 { "(bad)", { XX
} },
4059 { "(bad)", { XX
} },
4060 { "(bad)", { XX
} },
4062 { "(bad)", { XX
} },
4063 { "phsubbw", { XM
, EXq
} },
4064 { "phsubbd", { XM
, EXq
} },
4065 { "phsubbq", { XM
, EXq
} },
4066 { "(bad)", { XX
} },
4067 { "(bad)", { XX
} },
4068 { "(bad)", { XX
} },
4069 { "(bad)", { XX
} },
4071 { "(bad)", { XX
} },
4072 { "(bad)", { XX
} },
4073 { "(bad)", { XX
} },
4074 { "(bad)", { XX
} },
4075 { "(bad)", { XX
} },
4076 { "(bad)", { XX
} },
4077 { "(bad)", { XX
} },
4078 { "(bad)", { XX
} },
4080 { "(bad)", { XX
} },
4081 { "(bad)", { XX
} },
4082 { "(bad)", { XX
} },
4083 { "(bad)", { XX
} },
4084 { "(bad)", { XX
} },
4085 { "(bad)", { XX
} },
4086 { "(bad)", { XX
} },
4087 { "(bad)", { XX
} },
4089 { "(bad)", { XX
} },
4090 { "(bad)", { XX
} },
4091 { "(bad)", { XX
} },
4092 { "(bad)", { XX
} },
4093 { "(bad)", { XX
} },
4094 { "(bad)", { XX
} },
4095 { "(bad)", { XX
} },
4096 { "(bad)", { XX
} },
4098 { "(bad)", { XX
} },
4099 { "(bad)", { XX
} },
4100 { "(bad)", { XX
} },
4101 { "(bad)", { XX
} },
4102 { "(bad)", { XX
} },
4103 { "(bad)", { XX
} },
4104 { "(bad)", { XX
} },
4105 { "(bad)", { XX
} },
4107 { "(bad)", { XX
} },
4108 { "(bad)", { XX
} },
4109 { "(bad)", { XX
} },
4110 { "(bad)", { XX
} },
4111 { "(bad)", { XX
} },
4112 { "(bad)", { XX
} },
4113 { "(bad)", { XX
} },
4114 { "(bad)", { XX
} },
4116 { "(bad)", { XX
} },
4117 { "(bad)", { XX
} },
4118 { "(bad)", { XX
} },
4119 { "(bad)", { XX
} },
4120 { "(bad)", { XX
} },
4121 { "(bad)", { XX
} },
4122 { "(bad)", { XX
} },
4123 { "(bad)", { XX
} },
4125 { "(bad)", { XX
} },
4126 { "(bad)", { XX
} },
4127 { "(bad)", { XX
} },
4128 { "(bad)", { XX
} },
4129 { "(bad)", { XX
} },
4130 { "(bad)", { XX
} },
4131 { "(bad)", { XX
} },
4132 { "(bad)", { XX
} },
4134 { "(bad)", { XX
} },
4135 { "(bad)", { XX
} },
4136 { "(bad)", { XX
} },
4137 { "(bad)", { XX
} },
4138 { "(bad)", { XX
} },
4139 { "(bad)", { XX
} },
4140 { "(bad)", { XX
} },
4141 { "(bad)", { XX
} },
4143 { "(bad)", { XX
} },
4144 { "(bad)", { XX
} },
4145 { "(bad)", { XX
} },
4146 { "(bad)", { XX
} },
4147 { "(bad)", { XX
} },
4148 { "(bad)", { XX
} },
4149 { "(bad)", { XX
} },
4150 { "(bad)", { XX
} },
4152 { "(bad)", { XX
} },
4153 { "(bad)", { XX
} },
4154 { "(bad)", { XX
} },
4155 { "(bad)", { XX
} },
4156 { "(bad)", { XX
} },
4157 { "(bad)", { XX
} },
4158 { "(bad)", { XX
} },
4159 { "(bad)", { XX
} },
4161 { "(bad)", { XX
} },
4162 { "(bad)", { XX
} },
4163 { "(bad)", { XX
} },
4164 { "(bad)", { XX
} },
4165 { "(bad)", { XX
} },
4166 { "(bad)", { XX
} },
4167 { "(bad)", { XX
} },
4168 { "(bad)", { XX
} },
4170 { "(bad)", { XX
} },
4171 { "(bad)", { XX
} },
4172 { "(bad)", { XX
} },
4173 { "(bad)", { XX
} },
4174 { "(bad)", { XX
} },
4175 { "(bad)", { XX
} },
4176 { "(bad)", { XX
} },
4177 { "(bad)", { XX
} },
4179 { "(bad)", { XX
} },
4180 { "(bad)", { XX
} },
4181 { "(bad)", { XX
} },
4182 { "(bad)", { XX
} },
4183 { "(bad)", { XX
} },
4184 { "(bad)", { XX
} },
4185 { "(bad)", { XX
} },
4186 { "(bad)", { XX
} },
4188 { "(bad)", { XX
} },
4189 { "(bad)", { XX
} },
4190 { "(bad)", { XX
} },
4191 { "(bad)", { XX
} },
4192 { "(bad)", { XX
} },
4193 { "(bad)", { XX
} },
4194 { "(bad)", { XX
} },
4195 { "(bad)", { XX
} },
4197 { "(bad)", { XX
} },
4198 { "(bad)", { XX
} },
4199 { "(bad)", { XX
} },
4200 { "(bad)", { XX
} },
4201 { "(bad)", { XX
} },
4202 { "(bad)", { XX
} },
4203 { "(bad)", { XX
} },
4204 { "(bad)", { XX
} },
4206 { "(bad)", { XX
} },
4207 { "(bad)", { XX
} },
4208 { "(bad)", { XX
} },
4209 { "(bad)", { XX
} },
4210 { "(bad)", { XX
} },
4211 { "(bad)", { XX
} },
4212 { "(bad)", { XX
} },
4213 { "(bad)", { XX
} },
4215 { "(bad)", { XX
} },
4216 { "(bad)", { XX
} },
4217 { "(bad)", { XX
} },
4218 { "(bad)", { XX
} },
4219 { "(bad)", { XX
} },
4220 { "(bad)", { XX
} },
4221 { "(bad)", { XX
} },
4222 { "(bad)", { XX
} },
4224 { "(bad)", { XX
} },
4225 { "(bad)", { XX
} },
4226 { "(bad)", { XX
} },
4227 { "(bad)", { XX
} },
4228 { "(bad)", { XX
} },
4229 { "(bad)", { XX
} },
4230 { "(bad)", { XX
} },
4231 { "(bad)", { XX
} },
4233 { "(bad)", { XX
} },
4234 { "(bad)", { XX
} },
4235 { "(bad)", { XX
} },
4236 { "(bad)", { XX
} },
4237 { "(bad)", { XX
} },
4238 { "(bad)", { XX
} },
4239 { "(bad)", { XX
} },
4240 { "(bad)", { XX
} },
4242 /* THREE_BYTE_0F7B */
4245 { "(bad)", { XX
} },
4246 { "(bad)", { XX
} },
4247 { "(bad)", { XX
} },
4248 { "(bad)", { XX
} },
4249 { "(bad)", { XX
} },
4250 { "(bad)", { XX
} },
4251 { "(bad)", { XX
} },
4252 { "(bad)", { XX
} },
4254 { "(bad)", { XX
} },
4255 { "(bad)", { XX
} },
4256 { "(bad)", { XX
} },
4257 { "(bad)", { XX
} },
4258 { "(bad)", { XX
} },
4259 { "(bad)", { XX
} },
4260 { "(bad)", { XX
} },
4261 { "(bad)", { XX
} },
4263 { "(bad)", { XX
} },
4264 { "(bad)", { XX
} },
4265 { "(bad)", { XX
} },
4266 { "(bad)", { XX
} },
4267 { "(bad)", { XX
} },
4268 { "(bad)", { XX
} },
4269 { "(bad)", { XX
} },
4270 { "(bad)", { XX
} },
4272 { "(bad)", { XX
} },
4273 { "(bad)", { XX
} },
4274 { "(bad)", { XX
} },
4275 { "(bad)", { XX
} },
4276 { "(bad)", { XX
} },
4277 { "(bad)", { XX
} },
4278 { "(bad)", { XX
} },
4279 { "(bad)", { XX
} },
4281 { "(bad)", { XX
} },
4282 { "(bad)", { XX
} },
4283 { "(bad)", { XX
} },
4284 { "(bad)", { XX
} },
4285 { "(bad)", { XX
} },
4286 { "(bad)", { XX
} },
4287 { "(bad)", { XX
} },
4288 { "(bad)", { XX
} },
4290 { "(bad)", { XX
} },
4291 { "(bad)", { XX
} },
4292 { "(bad)", { XX
} },
4293 { "(bad)", { XX
} },
4294 { "(bad)", { XX
} },
4295 { "(bad)", { XX
} },
4296 { "(bad)", { XX
} },
4297 { "(bad)", { XX
} },
4299 { "(bad)", { XX
} },
4300 { "(bad)", { XX
} },
4301 { "(bad)", { XX
} },
4302 { "(bad)", { XX
} },
4303 { "(bad)", { XX
} },
4304 { "(bad)", { XX
} },
4305 { "(bad)", { XX
} },
4306 { "(bad)", { XX
} },
4308 { "(bad)", { XX
} },
4309 { "(bad)", { XX
} },
4310 { "(bad)", { XX
} },
4311 { "(bad)", { XX
} },
4312 { "(bad)", { XX
} },
4313 { "(bad)", { XX
} },
4314 { "(bad)", { XX
} },
4315 { "(bad)", { XX
} },
4317 { "protb", { XM
, EXq
, Ib
} },
4318 { "protw", { XM
, EXq
, Ib
} },
4319 { "protd", { XM
, EXq
, Ib
} },
4320 { "protq", { XM
, EXq
, Ib
} },
4321 { "pshlb", { XM
, EXq
, Ib
} },
4322 { "pshlw", { XM
, EXq
, Ib
} },
4323 { "pshld", { XM
, EXq
, Ib
} },
4324 { "pshlq", { XM
, EXq
, Ib
} },
4326 { "pshab", { XM
, EXq
, Ib
} },
4327 { "pshaw", { XM
, EXq
, Ib
} },
4328 { "pshad", { XM
, EXq
, Ib
} },
4329 { "pshaq", { XM
, EXq
, Ib
} },
4330 { "(bad)", { XX
} },
4331 { "(bad)", { XX
} },
4332 { "(bad)", { XX
} },
4333 { "(bad)", { XX
} },
4335 { "(bad)", { XX
} },
4336 { "(bad)", { XX
} },
4337 { "(bad)", { XX
} },
4338 { "(bad)", { XX
} },
4339 { "(bad)", { XX
} },
4340 { "(bad)", { XX
} },
4341 { "(bad)", { XX
} },
4342 { "(bad)", { XX
} },
4344 { "(bad)", { XX
} },
4345 { "(bad)", { XX
} },
4346 { "(bad)", { XX
} },
4347 { "(bad)", { XX
} },
4348 { "(bad)", { XX
} },
4349 { "(bad)", { XX
} },
4350 { "(bad)", { XX
} },
4351 { "(bad)", { XX
} },
4353 { "(bad)", { XX
} },
4354 { "(bad)", { XX
} },
4355 { "(bad)", { XX
} },
4356 { "(bad)", { XX
} },
4357 { "(bad)", { XX
} },
4358 { "(bad)", { XX
} },
4359 { "(bad)", { XX
} },
4360 { "(bad)", { XX
} },
4362 { "(bad)", { XX
} },
4363 { "(bad)", { XX
} },
4364 { "(bad)", { XX
} },
4365 { "(bad)", { XX
} },
4366 { "(bad)", { XX
} },
4367 { "(bad)", { XX
} },
4368 { "(bad)", { XX
} },
4369 { "(bad)", { XX
} },
4371 { "(bad)", { XX
} },
4372 { "(bad)", { XX
} },
4373 { "(bad)", { XX
} },
4374 { "(bad)", { XX
} },
4375 { "(bad)", { XX
} },
4376 { "(bad)", { XX
} },
4377 { "(bad)", { XX
} },
4378 { "(bad)", { XX
} },
4380 { "(bad)", { XX
} },
4381 { "(bad)", { XX
} },
4382 { "(bad)", { XX
} },
4383 { "(bad)", { XX
} },
4384 { "(bad)", { XX
} },
4385 { "(bad)", { XX
} },
4386 { "(bad)", { XX
} },
4387 { "(bad)", { XX
} },
4389 { "(bad)", { XX
} },
4390 { "(bad)", { XX
} },
4391 { "(bad)", { XX
} },
4392 { "(bad)", { XX
} },
4393 { "(bad)", { XX
} },
4394 { "(bad)", { XX
} },
4395 { "(bad)", { XX
} },
4396 { "(bad)", { XX
} },
4398 { "(bad)", { XX
} },
4399 { "(bad)", { XX
} },
4400 { "(bad)", { XX
} },
4401 { "(bad)", { XX
} },
4402 { "(bad)", { XX
} },
4403 { "(bad)", { XX
} },
4404 { "(bad)", { XX
} },
4405 { "(bad)", { XX
} },
4407 { "(bad)", { XX
} },
4408 { "(bad)", { XX
} },
4409 { "(bad)", { XX
} },
4410 { "(bad)", { XX
} },
4411 { "(bad)", { XX
} },
4412 { "(bad)", { XX
} },
4413 { "(bad)", { XX
} },
4414 { "(bad)", { XX
} },
4416 { "(bad)", { XX
} },
4417 { "(bad)", { XX
} },
4418 { "(bad)", { XX
} },
4419 { "(bad)", { XX
} },
4420 { "(bad)", { XX
} },
4421 { "(bad)", { XX
} },
4422 { "(bad)", { XX
} },
4423 { "(bad)", { XX
} },
4425 { "(bad)", { XX
} },
4426 { "(bad)", { XX
} },
4427 { "(bad)", { XX
} },
4428 { "(bad)", { XX
} },
4429 { "(bad)", { XX
} },
4430 { "(bad)", { XX
} },
4431 { "(bad)", { XX
} },
4432 { "(bad)", { XX
} },
4434 { "(bad)", { XX
} },
4435 { "(bad)", { XX
} },
4436 { "(bad)", { XX
} },
4437 { "(bad)", { XX
} },
4438 { "(bad)", { XX
} },
4439 { "(bad)", { XX
} },
4440 { "(bad)", { XX
} },
4441 { "(bad)", { XX
} },
4443 { "(bad)", { XX
} },
4444 { "(bad)", { XX
} },
4445 { "(bad)", { XX
} },
4446 { "(bad)", { XX
} },
4447 { "(bad)", { XX
} },
4448 { "(bad)", { XX
} },
4449 { "(bad)", { XX
} },
4450 { "(bad)", { XX
} },
4452 { "(bad)", { XX
} },
4453 { "(bad)", { XX
} },
4454 { "(bad)", { XX
} },
4455 { "(bad)", { XX
} },
4456 { "(bad)", { XX
} },
4457 { "(bad)", { XX
} },
4458 { "(bad)", { XX
} },
4459 { "(bad)", { XX
} },
4461 { "(bad)", { XX
} },
4462 { "(bad)", { XX
} },
4463 { "(bad)", { XX
} },
4464 { "(bad)", { XX
} },
4465 { "(bad)", { XX
} },
4466 { "(bad)", { XX
} },
4467 { "(bad)", { XX
} },
4468 { "(bad)", { XX
} },
4470 { "(bad)", { XX
} },
4471 { "(bad)", { XX
} },
4472 { "(bad)", { XX
} },
4473 { "(bad)", { XX
} },
4474 { "(bad)", { XX
} },
4475 { "(bad)", { XX
} },
4476 { "(bad)", { XX
} },
4477 { "(bad)", { XX
} },
4479 { "(bad)", { XX
} },
4480 { "(bad)", { XX
} },
4481 { "(bad)", { XX
} },
4482 { "(bad)", { XX
} },
4483 { "(bad)", { XX
} },
4484 { "(bad)", { XX
} },
4485 { "(bad)", { XX
} },
4486 { "(bad)", { XX
} },
4488 { "(bad)", { XX
} },
4489 { "(bad)", { XX
} },
4490 { "(bad)", { XX
} },
4491 { "(bad)", { XX
} },
4492 { "(bad)", { XX
} },
4493 { "(bad)", { XX
} },
4494 { "(bad)", { XX
} },
4495 { "(bad)", { XX
} },
4497 { "(bad)", { XX
} },
4498 { "(bad)", { XX
} },
4499 { "(bad)", { XX
} },
4500 { "(bad)", { XX
} },
4501 { "(bad)", { XX
} },
4502 { "(bad)", { XX
} },
4503 { "(bad)", { XX
} },
4504 { "(bad)", { XX
} },
4506 { "(bad)", { XX
} },
4507 { "(bad)", { XX
} },
4508 { "(bad)", { XX
} },
4509 { "(bad)", { XX
} },
4510 { "(bad)", { XX
} },
4511 { "(bad)", { XX
} },
4512 { "(bad)", { XX
} },
4513 { "(bad)", { XX
} },
4515 { "(bad)", { XX
} },
4516 { "(bad)", { XX
} },
4517 { "(bad)", { XX
} },
4518 { "(bad)", { XX
} },
4519 { "(bad)", { XX
} },
4520 { "(bad)", { XX
} },
4521 { "(bad)", { XX
} },
4522 { "(bad)", { XX
} },
4524 { "(bad)", { XX
} },
4525 { "(bad)", { XX
} },
4526 { "(bad)", { XX
} },
4527 { "(bad)", { XX
} },
4528 { "(bad)", { XX
} },
4529 { "(bad)", { XX
} },
4530 { "(bad)", { XX
} },
4531 { "(bad)", { XX
} },
4535 static const struct dis386 mod_table
[][2] = {
4538 { "leaS", { Gv
, M
} },
4539 { "(bad)", { XX
} },
4542 /* MOD_0F01_REG_0 */
4543 { X86_64_TABLE (X86_64_0F01_REG_0
) },
4544 { RM_TABLE (RM_0F01_REG_0
) },
4547 /* MOD_0F01_REG_1 */
4548 { X86_64_TABLE (X86_64_0F01_REG_1
) },
4549 { RM_TABLE (RM_0F01_REG_1
) },
4552 /* MOD_0F01_REG_2 */
4553 { X86_64_TABLE (X86_64_0F01_REG_2
) },
4554 { RM_TABLE (RM_0F01_REG_2
) },
4557 /* MOD_0F01_REG_3 */
4558 { X86_64_TABLE (X86_64_0F01_REG_3
) },
4559 { RM_TABLE (RM_0F01_REG_3
) },
4562 /* MOD_0F01_REG_7 */
4563 { "invlpg", { Mb
} },
4564 { RM_TABLE (RM_0F01_REG_7
) },
4567 /* MOD_0F12_PREFIX_0 */
4568 { "movlps", { XM
, EXq
} },
4569 { "movhlps", { XM
, EXq
} },
4573 { "movlpX", { EXq
, XM
} },
4574 { "(bad)", { XX
} },
4577 /* MOD_0F16_PREFIX_0 */
4578 { "movhps", { XM
, EXq
} },
4579 { "movlhps", { XM
, EXq
} },
4583 { "movhpX", { EXq
, XM
} },
4584 { "(bad)", { XX
} },
4587 /* MOD_0F18_REG_0 */
4588 { "prefetchnta", { Mb
} },
4589 { "(bad)", { XX
} },
4592 /* MOD_0F18_REG_1 */
4593 { "prefetcht0", { Mb
} },
4594 { "(bad)", { XX
} },
4597 /* MOD_0F18_REG_2 */
4598 { "prefetcht1", { Mb
} },
4599 { "(bad)", { XX
} },
4602 /* MOD_0F18_REG_3 */
4603 { "prefetcht2", { Mb
} },
4604 { "(bad)", { XX
} },
4608 { "(bad)", { XX
} },
4609 { "movZ", { Rm
, Cm
} },
4613 { "(bad)", { XX
} },
4614 { "movZ", { Rm
, Dm
} },
4618 { "(bad)", { XX
} },
4619 { "movZ", { Cm
, Rm
} },
4623 { "(bad)", { XX
} },
4624 { "movZ", { Dm
, Rm
} },
4628 { THREE_BYTE_TABLE (THREE_BYTE_0F24
) },
4629 { "movL", { Rd
, Td
} },
4633 { "(bad)", { XX
} },
4634 { "movL", { Td
, Rd
} },
4637 /* MOD_0F2B_PREFIX_0 */
4638 {"movntps", { Mx
, XM
} },
4639 { "(bad)", { XX
} },
4642 /* MOD_0F2B_PREFIX_1 */
4643 {"movntss", { Md
, XM
} },
4644 { "(bad)", { XX
} },
4647 /* MOD_0F2B_PREFIX_2 */
4648 {"movntpd", { Mx
, XM
} },
4649 { "(bad)", { XX
} },
4652 /* MOD_0F2B_PREFIX_3 */
4653 {"movntsd", { Mq
, XM
} },
4654 { "(bad)", { XX
} },
4658 { "(bad)", { XX
} },
4659 { "movmskpX", { Gdq
, XS
} },
4662 /* MOD_0F71_REG_2 */
4663 { "(bad)", { XX
} },
4664 { "psrlw", { MS
, Ib
} },
4667 /* MOD_0F71_REG_4 */
4668 { "(bad)", { XX
} },
4669 { "psraw", { MS
, Ib
} },
4672 /* MOD_0F71_REG_6 */
4673 { "(bad)", { XX
} },
4674 { "psllw", { MS
, Ib
} },
4677 /* MOD_0F72_REG_2 */
4678 { "(bad)", { XX
} },
4679 { "psrld", { MS
, Ib
} },
4682 /* MOD_0F72_REG_4 */
4683 { "(bad)", { XX
} },
4684 { "psrad", { MS
, Ib
} },
4687 /* MOD_0F72_REG_6 */
4688 { "(bad)", { XX
} },
4689 { "pslld", { MS
, Ib
} },
4692 /* MOD_0F73_REG_2 */
4693 { "(bad)", { XX
} },
4694 { "psrlq", { MS
, Ib
} },
4697 /* MOD_0F73_REG_3 */
4698 { "(bad)", { XX
} },
4699 { PREFIX_TABLE (PREFIX_0F73_REG_3
) },
4702 /* MOD_0F73_REG_6 */
4703 { "(bad)", { XX
} },
4704 { "psllq", { MS
, Ib
} },
4707 /* MOD_0F73_REG_7 */
4708 { "(bad)", { XX
} },
4709 { PREFIX_TABLE (PREFIX_0F73_REG_7
) },
4712 /* MOD_0FAE_REG_0 */
4713 { "fxsave", { M
} },
4714 { "(bad)", { XX
} },
4717 /* MOD_0FAE_REG_1 */
4718 { "fxrstor", { M
} },
4719 { "(bad)", { XX
} },
4722 /* MOD_0FAE_REG_2 */
4723 { "ldmxcsr", { Md
} },
4724 { "(bad)", { XX
} },
4727 /* MOD_0FAE_REG_3 */
4728 { "stmxcsr", { Md
} },
4729 { "(bad)", { XX
} },
4732 /* MOD_0FAE_REG_4 */
4734 { "(bad)", { XX
} },
4737 /* MOD_0FAE_REG_5 */
4738 { "xrstor", { M
} },
4739 { RM_TABLE (RM_0FAE_REG_5
) },
4742 /* MOD_0FAE_REG_6 */
4743 { "(bad)", { XX
} },
4744 { RM_TABLE (RM_0FAE_REG_6
) },
4747 /* MOD_0FAE_REG_7 */
4748 { "clflush", { Mb
} },
4749 { RM_TABLE (RM_0FAE_REG_7
) },
4753 { "lssS", { Gv
, Mp
} },
4754 { "(bad)", { XX
} },
4758 { "lfsS", { Gv
, Mp
} },
4759 { "(bad)", { XX
} },
4763 { "lgsS", { Gv
, Mp
} },
4764 { "(bad)", { XX
} },
4767 /* MOD_0FC7_REG_6 */
4768 { PREFIX_TABLE (PREFIX_0FC7_REG_6
) },
4769 { "(bad)", { XX
} },
4772 /* MOD_0FC7_REG_7 */
4773 { "vmptrst", { Mq
} },
4774 { "(bad)", { XX
} },
4778 { "(bad)", { XX
} },
4779 { "pmovmskb", { Gdq
, MS
} },
4782 /* MOD_0FE7_PREFIX_2 */
4783 { "movntdq", { Mx
, XM
} },
4784 { "(bad)", { XX
} },
4787 /* MOD_0FF0_PREFIX_3 */
4788 { "lddqu", { XM
, M
} },
4789 { "(bad)", { XX
} },
4792 /* MOD_0F382A_PREFIX_2 */
4793 { "movntdqa", { XM
, Mx
} },
4794 { "(bad)", { XX
} },
4798 { "bound{S|}", { Gv
, Ma
} },
4799 { "(bad)", { XX
} },
4803 { "lesS", { Gv
, Mp
} },
4804 { "(bad)", { XX
} },
4808 { "ldsS", { Gv
, Mp
} },
4809 { "(bad)", { XX
} },
4813 static const struct dis386 rm_table
[][8] = {
4816 { "(bad)", { XX
} },
4817 { "vmcall", { Skip_MODRM
} },
4818 { "vmlaunch", { Skip_MODRM
} },
4819 { "vmresume", { Skip_MODRM
} },
4820 { "vmxoff", { Skip_MODRM
} },
4821 { "(bad)", { XX
} },
4822 { "(bad)", { XX
} },
4823 { "(bad)", { XX
} },
4827 { "monitor", { { OP_Monitor
, 0 } } },
4828 { "mwait", { { OP_Mwait
, 0 } } },
4829 { "(bad)", { XX
} },
4830 { "(bad)", { XX
} },
4831 { "(bad)", { XX
} },
4832 { "(bad)", { XX
} },
4833 { "(bad)", { XX
} },
4834 { "(bad)", { XX
} },
4838 { "xgetbv", { Skip_MODRM
} },
4839 { "xsetbv", { Skip_MODRM
} },
4840 { "(bad)", { XX
} },
4841 { "(bad)", { XX
} },
4842 { "(bad)", { XX
} },
4843 { "(bad)", { XX
} },
4844 { "(bad)", { XX
} },
4845 { "(bad)", { XX
} },
4849 { "vmrun", { Skip_MODRM
} },
4850 { "vmmcall", { Skip_MODRM
} },
4851 { "vmload", { Skip_MODRM
} },
4852 { "vmsave", { Skip_MODRM
} },
4853 { "stgi", { Skip_MODRM
} },
4854 { "clgi", { Skip_MODRM
} },
4855 { "skinit", { Skip_MODRM
} },
4856 { "invlpga", { Skip_MODRM
} },
4860 { "swapgs", { Skip_MODRM
} },
4861 { "rdtscp", { Skip_MODRM
} },
4862 { "(bad)", { XX
} },
4863 { "(bad)", { XX
} },
4864 { "(bad)", { XX
} },
4865 { "(bad)", { XX
} },
4866 { "(bad)", { XX
} },
4867 { "(bad)", { XX
} },
4871 { "lfence", { Skip_MODRM
} },
4872 { "(bad)", { XX
} },
4873 { "(bad)", { XX
} },
4874 { "(bad)", { XX
} },
4875 { "(bad)", { XX
} },
4876 { "(bad)", { XX
} },
4877 { "(bad)", { XX
} },
4878 { "(bad)", { XX
} },
4882 { "mfence", { Skip_MODRM
} },
4883 { "(bad)", { XX
} },
4884 { "(bad)", { XX
} },
4885 { "(bad)", { XX
} },
4886 { "(bad)", { XX
} },
4887 { "(bad)", { XX
} },
4888 { "(bad)", { XX
} },
4889 { "(bad)", { XX
} },
4893 { "sfence", { Skip_MODRM
} },
4894 { "(bad)", { XX
} },
4895 { "(bad)", { XX
} },
4896 { "(bad)", { XX
} },
4897 { "(bad)", { XX
} },
4898 { "(bad)", { XX
} },
4899 { "(bad)", { XX
} },
4900 { "(bad)", { XX
} },
4904 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
4916 FETCH_DATA (the_info
, codep
+ 1);
4920 /* REX prefixes family. */
4937 if (address_mode
== mode_64bit
)
4943 prefixes
|= PREFIX_REPZ
;
4946 prefixes
|= PREFIX_REPNZ
;
4949 prefixes
|= PREFIX_LOCK
;
4952 prefixes
|= PREFIX_CS
;
4955 prefixes
|= PREFIX_SS
;
4958 prefixes
|= PREFIX_DS
;
4961 prefixes
|= PREFIX_ES
;
4964 prefixes
|= PREFIX_FS
;
4967 prefixes
|= PREFIX_GS
;
4970 prefixes
|= PREFIX_DATA
;
4973 prefixes
|= PREFIX_ADDR
;
4976 /* fwait is really an instruction. If there are prefixes
4977 before the fwait, they belong to the fwait, *not* to the
4978 following instruction. */
4979 if (prefixes
|| rex
)
4981 prefixes
|= PREFIX_FWAIT
;
4985 prefixes
= PREFIX_FWAIT
;
4990 /* Rex is ignored when followed by another prefix. */
5001 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
5005 prefix_name (int pref
, int sizeflag
)
5007 static const char *rexes
[16] =
5012 "rex.XB", /* 0x43 */
5014 "rex.RB", /* 0x45 */
5015 "rex.RX", /* 0x46 */
5016 "rex.RXB", /* 0x47 */
5018 "rex.WB", /* 0x49 */
5019 "rex.WX", /* 0x4a */
5020 "rex.WXB", /* 0x4b */
5021 "rex.WR", /* 0x4c */
5022 "rex.WRB", /* 0x4d */
5023 "rex.WRX", /* 0x4e */
5024 "rex.WRXB", /* 0x4f */
5029 /* REX prefixes family. */
5046 return rexes
[pref
- 0x40];
5066 return (sizeflag
& DFLAG
) ? "data16" : "data32";
5068 if (address_mode
== mode_64bit
)
5069 return (sizeflag
& AFLAG
) ? "addr32" : "addr64";
5071 return (sizeflag
& AFLAG
) ? "addr16" : "addr32";
5079 static char op_out
[MAX_OPERANDS
][100];
5080 static int op_ad
, op_index
[MAX_OPERANDS
];
5081 static int two_source_ops
;
5082 static bfd_vma op_address
[MAX_OPERANDS
];
5083 static bfd_vma op_riprel
[MAX_OPERANDS
];
5084 static bfd_vma start_pc
;
5087 * On the 386's of 1988, the maximum length of an instruction is 15 bytes.
5088 * (see topic "Redundant prefixes" in the "Differences from 8086"
5089 * section of the "Virtual 8086 Mode" chapter.)
5090 * 'pc' should be the address of this instruction, it will
5091 * be used to print the target address if this is a relative jump or call
5092 * The function returns the length of this instruction in bytes.
5095 static char intel_syntax
;
5096 static char intel_mnemonic
= !SYSV386_COMPAT
;
5097 static char open_char
;
5098 static char close_char
;
5099 static char separator_char
;
5100 static char scale_char
;
5102 /* Here for backwards compatibility. When gdb stops using
5103 print_insn_i386_att and print_insn_i386_intel these functions can
5104 disappear, and print_insn_i386 be merged into print_insn. */
5106 print_insn_i386_att (bfd_vma pc
, disassemble_info
*info
)
5110 return print_insn (pc
, info
);
5114 print_insn_i386_intel (bfd_vma pc
, disassemble_info
*info
)
5118 return print_insn (pc
, info
);
5122 print_insn_i386 (bfd_vma pc
, disassemble_info
*info
)
5126 return print_insn (pc
, info
);
5130 print_i386_disassembler_options (FILE *stream
)
5132 fprintf (stream
, _("\n\
5133 The following i386/x86-64 specific disassembler options are supported for use\n\
5134 with the -M switch (multiple options should be separated by commas):\n"));
5136 fprintf (stream
, _(" x86-64 Disassemble in 64bit mode\n"));
5137 fprintf (stream
, _(" i386 Disassemble in 32bit mode\n"));
5138 fprintf (stream
, _(" i8086 Disassemble in 16bit mode\n"));
5139 fprintf (stream
, _(" att Display instruction in AT&T syntax\n"));
5140 fprintf (stream
, _(" intel Display instruction in Intel syntax\n"));
5141 fprintf (stream
, _(" att-mnemonic\n"
5142 " Display instruction in AT&T mnemonic\n"));
5143 fprintf (stream
, _(" intel-mnemonic\n"
5144 " Display instruction in Intel mnemonic\n"));
5145 fprintf (stream
, _(" addr64 Assume 64bit address size\n"));
5146 fprintf (stream
, _(" addr32 Assume 32bit address size\n"));
5147 fprintf (stream
, _(" addr16 Assume 16bit address size\n"));
5148 fprintf (stream
, _(" data32 Assume 32bit data size\n"));
5149 fprintf (stream
, _(" data16 Assume 16bit data size\n"));
5150 fprintf (stream
, _(" suffix Always display instruction suffix in AT&T syntax\n"));
5153 /* Get a pointer to struct dis386 with a valid name. */
5155 static const struct dis386
*
5156 get_valid_dis386 (const struct dis386
*dp
, disassemble_info
*info
)
5160 if (dp
->name
!= NULL
)
5163 switch (dp
->op
[0].bytemode
)
5166 dp
= ®_table
[dp
->op
[1].bytemode
][modrm
.reg
];
5170 index
= modrm
.mod
== 0x3 ? 1 : 0;
5171 dp
= &mod_table
[dp
->op
[1].bytemode
][index
];
5175 dp
= &rm_table
[dp
->op
[1].bytemode
][modrm
.rm
];
5178 case USE_PREFIX_TABLE
:
5180 used_prefixes
|= (prefixes
& PREFIX_REPZ
);
5181 if (prefixes
& PREFIX_REPZ
)
5188 /* We should check PREFIX_REPNZ and PREFIX_REPZ before
5190 used_prefixes
|= (prefixes
& PREFIX_REPNZ
);
5191 if (prefixes
& PREFIX_REPNZ
)
5194 repnz_prefix
= NULL
;
5198 used_prefixes
|= (prefixes
& PREFIX_DATA
);
5199 if (prefixes
& PREFIX_DATA
)
5206 dp
= &prefix_table
[dp
->op
[1].bytemode
][index
];
5209 case USE_X86_64_TABLE
:
5210 index
= address_mode
== mode_64bit
? 1 : 0;
5211 dp
= &x86_64_table
[dp
->op
[1].bytemode
][index
];
5214 case USE_3BYTE_TABLE
:
5215 FETCH_DATA (info
, codep
+ 2);
5217 dp
= &three_byte_table
[dp
->op
[1].bytemode
][index
];
5218 modrm
.mod
= (*codep
>> 6) & 3;
5219 modrm
.reg
= (*codep
>> 3) & 7;
5220 modrm
.rm
= *codep
& 7;
5224 oappend (INTERNAL_DISASSEMBLER_ERROR
);
5228 if (dp
->name
!= NULL
)
5231 return get_valid_dis386 (dp
, info
);
5235 print_insn (bfd_vma pc
, disassemble_info
*info
)
5237 const struct dis386
*dp
;
5239 char *op_txt
[MAX_OPERANDS
];
5243 struct dis_private priv
;
5245 char prefix_obuf
[32];
5248 if (info
->mach
== bfd_mach_x86_64_intel_syntax
5249 || info
->mach
== bfd_mach_x86_64
)
5250 address_mode
= mode_64bit
;
5252 address_mode
= mode_32bit
;
5254 if (intel_syntax
== (char) -1)
5255 intel_syntax
= (info
->mach
== bfd_mach_i386_i386_intel_syntax
5256 || info
->mach
== bfd_mach_x86_64_intel_syntax
);
5258 if (info
->mach
== bfd_mach_i386_i386
5259 || info
->mach
== bfd_mach_x86_64
5260 || info
->mach
== bfd_mach_i386_i386_intel_syntax
5261 || info
->mach
== bfd_mach_x86_64_intel_syntax
)
5262 priv
.orig_sizeflag
= AFLAG
| DFLAG
;
5263 else if (info
->mach
== bfd_mach_i386_i8086
)
5264 priv
.orig_sizeflag
= 0;
5268 for (p
= info
->disassembler_options
; p
!= NULL
; )
5270 if (CONST_STRNEQ (p
, "x86-64"))
5272 address_mode
= mode_64bit
;
5273 priv
.orig_sizeflag
= AFLAG
| DFLAG
;
5275 else if (CONST_STRNEQ (p
, "i386"))
5277 address_mode
= mode_32bit
;
5278 priv
.orig_sizeflag
= AFLAG
| DFLAG
;
5280 else if (CONST_STRNEQ (p
, "i8086"))
5282 address_mode
= mode_16bit
;
5283 priv
.orig_sizeflag
= 0;
5285 else if (CONST_STRNEQ (p
, "intel"))
5288 if (CONST_STRNEQ (p
+ 5, "-mnemonic"))
5291 else if (CONST_STRNEQ (p
, "att"))
5294 if (CONST_STRNEQ (p
+ 3, "-mnemonic"))
5297 else if (CONST_STRNEQ (p
, "addr"))
5299 if (address_mode
== mode_64bit
)
5301 if (p
[4] == '3' && p
[5] == '2')
5302 priv
.orig_sizeflag
&= ~AFLAG
;
5303 else if (p
[4] == '6' && p
[5] == '4')
5304 priv
.orig_sizeflag
|= AFLAG
;
5308 if (p
[4] == '1' && p
[5] == '6')
5309 priv
.orig_sizeflag
&= ~AFLAG
;
5310 else if (p
[4] == '3' && p
[5] == '2')
5311 priv
.orig_sizeflag
|= AFLAG
;
5314 else if (CONST_STRNEQ (p
, "data"))
5316 if (p
[4] == '1' && p
[5] == '6')
5317 priv
.orig_sizeflag
&= ~DFLAG
;
5318 else if (p
[4] == '3' && p
[5] == '2')
5319 priv
.orig_sizeflag
|= DFLAG
;
5321 else if (CONST_STRNEQ (p
, "suffix"))
5322 priv
.orig_sizeflag
|= SUFFIX_ALWAYS
;
5324 p
= strchr (p
, ',');
5331 names64
= intel_names64
;
5332 names32
= intel_names32
;
5333 names16
= intel_names16
;
5334 names8
= intel_names8
;
5335 names8rex
= intel_names8rex
;
5336 names_seg
= intel_names_seg
;
5337 index64
= intel_index64
;
5338 index32
= intel_index32
;
5339 index16
= intel_index16
;
5342 separator_char
= '+';
5347 names64
= att_names64
;
5348 names32
= att_names32
;
5349 names16
= att_names16
;
5350 names8
= att_names8
;
5351 names8rex
= att_names8rex
;
5352 names_seg
= att_names_seg
;
5353 index64
= att_index64
;
5354 index32
= att_index32
;
5355 index16
= att_index16
;
5358 separator_char
= ',';
5362 /* The output looks better if we put 7 bytes on a line, since that
5363 puts most long word instructions on a single line. */
5364 info
->bytes_per_line
= 7;
5366 info
->private_data
= &priv
;
5367 priv
.max_fetched
= priv
.the_buffer
;
5368 priv
.insn_start
= pc
;
5371 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
5379 start_codep
= priv
.the_buffer
;
5380 codep
= priv
.the_buffer
;
5382 if (setjmp (priv
.bailout
) != 0)
5386 /* Getting here means we tried for data but didn't get it. That
5387 means we have an incomplete instruction of some sort. Just
5388 print the first byte as a prefix or a .byte pseudo-op. */
5389 if (codep
> priv
.the_buffer
)
5391 name
= prefix_name (priv
.the_buffer
[0], priv
.orig_sizeflag
);
5393 (*info
->fprintf_func
) (info
->stream
, "%s", name
);
5396 /* Just print the first byte as a .byte instruction. */
5397 (*info
->fprintf_func
) (info
->stream
, ".byte 0x%x",
5398 (unsigned int) priv
.the_buffer
[0]);
5411 sizeflag
= priv
.orig_sizeflag
;
5413 FETCH_DATA (info
, codep
+ 1);
5414 two_source_ops
= (*codep
== 0x62) || (*codep
== 0xc8);
5416 if (((prefixes
& PREFIX_FWAIT
)
5417 && ((*codep
< 0xd8) || (*codep
> 0xdf)))
5418 || (rex
&& rex_used
))
5422 /* fwait not followed by floating point instruction, or rex followed
5423 by other prefixes. Print the first prefix. */
5424 name
= prefix_name (priv
.the_buffer
[0], priv
.orig_sizeflag
);
5426 name
= INTERNAL_DISASSEMBLER_ERROR
;
5427 (*info
->fprintf_func
) (info
->stream
, "%s", name
);
5434 unsigned char threebyte
;
5435 FETCH_DATA (info
, codep
+ 2);
5436 threebyte
= *++codep
;
5437 dp
= &dis386_twobyte
[threebyte
];
5438 need_modrm
= twobyte_has_modrm
[*codep
];
5443 dp
= &dis386
[*codep
];
5444 need_modrm
= onebyte_has_modrm
[*codep
];
5448 if ((prefixes
& PREFIX_REPZ
))
5450 repz_prefix
= "repz ";
5451 used_prefixes
|= PREFIX_REPZ
;
5456 if ((prefixes
& PREFIX_REPNZ
))
5458 repnz_prefix
= "repnz ";
5459 used_prefixes
|= PREFIX_REPNZ
;
5462 repnz_prefix
= NULL
;
5464 if ((prefixes
& PREFIX_LOCK
))
5466 lock_prefix
= "lock ";
5467 used_prefixes
|= PREFIX_LOCK
;
5473 if (prefixes
& PREFIX_ADDR
)
5476 if (dp
->op
[2].bytemode
!= loop_jcxz_mode
|| intel_syntax
)
5478 if ((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
5479 addr_prefix
= "addr32 ";
5481 addr_prefix
= "addr16 ";
5482 used_prefixes
|= PREFIX_ADDR
;
5487 if ((prefixes
& PREFIX_DATA
))
5490 if (dp
->op
[2].bytemode
== cond_jump_mode
5491 && dp
->op
[0].bytemode
== v_mode
5494 if (sizeflag
& DFLAG
)
5495 data_prefix
= "data32 ";
5497 data_prefix
= "data16 ";
5498 used_prefixes
|= PREFIX_DATA
;
5504 FETCH_DATA (info
, codep
+ 1);
5505 modrm
.mod
= (*codep
>> 6) & 3;
5506 modrm
.reg
= (*codep
>> 3) & 7;
5507 modrm
.rm
= *codep
& 7;
5510 if (dp
->name
== NULL
&& dp
->op
[0].bytemode
== FLOATCODE
)
5516 dp
= get_valid_dis386 (dp
, info
);
5517 if (dp
!= NULL
&& putop (dp
->name
, sizeflag
) == 0)
5519 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
5522 op_ad
= MAX_OPERANDS
- 1 - i
;
5524 (*dp
->op
[i
].rtn
) (dp
->op
[i
].bytemode
, sizeflag
);
5529 /* See if any prefixes were not used. If so, print the first one
5530 separately. If we don't do this, we'll wind up printing an
5531 instruction stream which does not precisely correspond to the
5532 bytes we are disassembling. */
5533 if ((prefixes
& ~used_prefixes
) != 0)
5537 name
= prefix_name (priv
.the_buffer
[0], priv
.orig_sizeflag
);
5539 name
= INTERNAL_DISASSEMBLER_ERROR
;
5540 (*info
->fprintf_func
) (info
->stream
, "%s", name
);
5543 if (rex
& ~rex_used
)
5546 name
= prefix_name (rex
| 0x40, priv
.orig_sizeflag
);
5548 name
= INTERNAL_DISASSEMBLER_ERROR
;
5549 (*info
->fprintf_func
) (info
->stream
, "%s ", name
);
5553 prefix_obufp
= prefix_obuf
;
5555 prefix_obufp
= stpcpy (prefix_obufp
, lock_prefix
);
5557 prefix_obufp
= stpcpy (prefix_obufp
, repz_prefix
);
5559 prefix_obufp
= stpcpy (prefix_obufp
, repnz_prefix
);
5561 prefix_obufp
= stpcpy (prefix_obufp
, addr_prefix
);
5563 prefix_obufp
= stpcpy (prefix_obufp
, data_prefix
);
5565 if (prefix_obuf
[0] != 0)
5566 (*info
->fprintf_func
) (info
->stream
, "%s", prefix_obuf
);
5568 obufp
= obuf
+ strlen (obuf
);
5569 for (i
= strlen (obuf
) + strlen (prefix_obuf
); i
< 6; i
++)
5572 (*info
->fprintf_func
) (info
->stream
, "%s", obuf
);
5574 /* The enter and bound instructions are printed with operands in the same
5575 order as the intel book; everything else is printed in reverse order. */
5576 if (intel_syntax
|| two_source_ops
)
5580 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
5581 op_txt
[i
] = op_out
[i
];
5583 for (i
= 0; i
< (MAX_OPERANDS
>> 1); ++i
)
5585 op_ad
= op_index
[i
];
5586 op_index
[i
] = op_index
[MAX_OPERANDS
- 1 - i
];
5587 op_index
[MAX_OPERANDS
- 1 - i
] = op_ad
;
5588 riprel
= op_riprel
[i
];
5589 op_riprel
[i
] = op_riprel
[MAX_OPERANDS
- 1 - i
];
5590 op_riprel
[MAX_OPERANDS
- 1 - i
] = riprel
;
5595 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
5596 op_txt
[MAX_OPERANDS
- 1 - i
] = op_out
[i
];
5600 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
5604 (*info
->fprintf_func
) (info
->stream
, ",");
5605 if (op_index
[i
] != -1 && !op_riprel
[i
])
5606 (*info
->print_address_func
) ((bfd_vma
) op_address
[op_index
[i
]], info
);
5608 (*info
->fprintf_func
) (info
->stream
, "%s", op_txt
[i
]);
5612 for (i
= 0; i
< MAX_OPERANDS
; i
++)
5613 if (op_index
[i
] != -1 && op_riprel
[i
])
5615 (*info
->fprintf_func
) (info
->stream
, " # ");
5616 (*info
->print_address_func
) ((bfd_vma
) (start_pc
+ codep
- start_codep
5617 + op_address
[op_index
[i
]]), info
);
5620 return codep
- priv
.the_buffer
;
5623 static const char *float_mem
[] = {
5698 static const unsigned char float_mem_mode
[] = {
5773 #define ST { OP_ST, 0 }
5774 #define STi { OP_STi, 0 }
5776 #define FGRPd9_2 NULL, { { NULL, 0 } }
5777 #define FGRPd9_4 NULL, { { NULL, 1 } }
5778 #define FGRPd9_5 NULL, { { NULL, 2 } }
5779 #define FGRPd9_6 NULL, { { NULL, 3 } }
5780 #define FGRPd9_7 NULL, { { NULL, 4 } }
5781 #define FGRPda_5 NULL, { { NULL, 5 } }
5782 #define FGRPdb_4 NULL, { { NULL, 6 } }
5783 #define FGRPde_3 NULL, { { NULL, 7 } }
5784 #define FGRPdf_4 NULL, { { NULL, 8 } }
5786 static const struct dis386 float_reg
[][8] = {
5789 { "fadd", { ST
, STi
} },
5790 { "fmul", { ST
, STi
} },
5791 { "fcom", { STi
} },
5792 { "fcomp", { STi
} },
5793 { "fsub", { ST
, STi
} },
5794 { "fsubr", { ST
, STi
} },
5795 { "fdiv", { ST
, STi
} },
5796 { "fdivr", { ST
, STi
} },
5801 { "fxch", { STi
} },
5803 { "(bad)", { XX
} },
5811 { "fcmovb", { ST
, STi
} },
5812 { "fcmove", { ST
, STi
} },
5813 { "fcmovbe",{ ST
, STi
} },
5814 { "fcmovu", { ST
, STi
} },
5815 { "(bad)", { XX
} },
5817 { "(bad)", { XX
} },
5818 { "(bad)", { XX
} },
5822 { "fcmovnb",{ ST
, STi
} },
5823 { "fcmovne",{ ST
, STi
} },
5824 { "fcmovnbe",{ ST
, STi
} },
5825 { "fcmovnu",{ ST
, STi
} },
5827 { "fucomi", { ST
, STi
} },
5828 { "fcomi", { ST
, STi
} },
5829 { "(bad)", { XX
} },
5833 { "fadd", { STi
, ST
} },
5834 { "fmul", { STi
, ST
} },
5835 { "(bad)", { XX
} },
5836 { "(bad)", { XX
} },
5837 { "fsub!M", { STi
, ST
} },
5838 { "fsubM", { STi
, ST
} },
5839 { "fdiv!M", { STi
, ST
} },
5840 { "fdivM", { STi
, ST
} },
5844 { "ffree", { STi
} },
5845 { "(bad)", { XX
} },
5847 { "fstp", { STi
} },
5848 { "fucom", { STi
} },
5849 { "fucomp", { STi
} },
5850 { "(bad)", { XX
} },
5851 { "(bad)", { XX
} },
5855 { "faddp", { STi
, ST
} },
5856 { "fmulp", { STi
, ST
} },
5857 { "(bad)", { XX
} },
5859 { "fsub!Mp", { STi
, ST
} },
5860 { "fsubMp", { STi
, ST
} },
5861 { "fdiv!Mp", { STi
, ST
} },
5862 { "fdivMp", { STi
, ST
} },
5866 { "ffreep", { STi
} },
5867 { "(bad)", { XX
} },
5868 { "(bad)", { XX
} },
5869 { "(bad)", { XX
} },
5871 { "fucomip", { ST
, STi
} },
5872 { "fcomip", { ST
, STi
} },
5873 { "(bad)", { XX
} },
5877 static char *fgrps
[][8] = {
5880 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
5885 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
5890 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
5895 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
5900 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
5905 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
5910 "feni(287 only)","fdisi(287 only)","fNclex","fNinit",
5911 "fNsetpm(287 only)","(bad)","(bad)","(bad)",
5916 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
5921 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
5926 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED
,
5927 int sizeflag ATTRIBUTE_UNUSED
)
5929 /* Skip mod/rm byte. */
5935 dofloat (int sizeflag
)
5937 const struct dis386
*dp
;
5938 unsigned char floatop
;
5940 floatop
= codep
[-1];
5944 int fp_indx
= (floatop
- 0xd8) * 8 + modrm
.reg
;
5946 putop (float_mem
[fp_indx
], sizeflag
);
5949 OP_E (float_mem_mode
[fp_indx
], sizeflag
);
5952 /* Skip mod/rm byte. */
5956 dp
= &float_reg
[floatop
- 0xd8][modrm
.reg
];
5957 if (dp
->name
== NULL
)
5959 putop (fgrps
[dp
->op
[0].bytemode
][modrm
.rm
], sizeflag
);
5961 /* Instruction fnstsw is only one with strange arg. */
5962 if (floatop
== 0xdf && codep
[-1] == 0xe0)
5963 strcpy (op_out
[0], names16
[0]);
5967 putop (dp
->name
, sizeflag
);
5972 (*dp
->op
[0].rtn
) (dp
->op
[0].bytemode
, sizeflag
);
5977 (*dp
->op
[1].rtn
) (dp
->op
[1].bytemode
, sizeflag
);
5982 OP_ST (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
5984 oappend ("%st" + intel_syntax
);
5988 OP_STi (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
5990 sprintf (scratchbuf
, "%%st(%d)", modrm
.rm
);
5991 oappend (scratchbuf
+ intel_syntax
);
5994 /* Capital letters in template are macros. */
5996 putop (const char *template, int sizeflag
)
6001 unsigned int l
= 0, len
= 1;
6004 #define SAVE_LAST(c) \
6005 if (l < len && l < sizeof (last)) \
6010 for (p
= template; *p
; p
++)
6028 if (*p
== '}' || *p
== '\0')
6047 if (modrm
.mod
!= 3 || (sizeflag
& SUFFIX_ALWAYS
))
6053 if (sizeflag
& SUFFIX_ALWAYS
)
6057 if (intel_syntax
&& !alt
)
6059 if ((prefixes
& PREFIX_DATA
) || (sizeflag
& SUFFIX_ALWAYS
))
6061 if (sizeflag
& DFLAG
)
6062 *obufp
++ = intel_syntax
? 'd' : 'l';
6064 *obufp
++ = intel_syntax
? 'w' : 's';
6065 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6069 if (intel_syntax
|| !(sizeflag
& SUFFIX_ALWAYS
))
6076 else if (sizeflag
& DFLAG
)
6077 *obufp
++ = intel_syntax
? 'd' : 'l';
6080 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6085 case 'E': /* For jcxz/jecxz */
6086 if (address_mode
== mode_64bit
)
6088 if (sizeflag
& AFLAG
)
6094 if (sizeflag
& AFLAG
)
6096 used_prefixes
|= (prefixes
& PREFIX_ADDR
);
6101 if ((prefixes
& PREFIX_ADDR
) || (sizeflag
& SUFFIX_ALWAYS
))
6103 if (sizeflag
& AFLAG
)
6104 *obufp
++ = address_mode
== mode_64bit
? 'q' : 'l';
6106 *obufp
++ = address_mode
== mode_64bit
? 'l' : 'w';
6107 used_prefixes
|= (prefixes
& PREFIX_ADDR
);
6111 if (intel_syntax
|| (obufp
[-1] != 's' && !(sizeflag
& SUFFIX_ALWAYS
)))
6113 if ((rex
& REX_W
) || (sizeflag
& DFLAG
))
6118 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6123 if ((prefixes
& (PREFIX_CS
| PREFIX_DS
)) == PREFIX_CS
6124 || (prefixes
& (PREFIX_CS
| PREFIX_DS
)) == PREFIX_DS
)
6126 used_prefixes
|= prefixes
& (PREFIX_CS
| PREFIX_DS
);
6129 if (prefixes
& PREFIX_DS
)
6150 if (address_mode
== mode_64bit
&& (sizeflag
& SUFFIX_ALWAYS
))
6158 if (l
!= 0 || len
!= 1)
6166 if (sizeflag
& SUFFIX_ALWAYS
)
6170 if (intel_mnemonic
!= cond
)
6174 if ((prefixes
& PREFIX_FWAIT
) == 0)
6177 used_prefixes
|= PREFIX_FWAIT
;
6183 else if (intel_syntax
&& (sizeflag
& DFLAG
))
6188 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6193 if (address_mode
== mode_64bit
&& (sizeflag
& DFLAG
))
6202 if ((prefixes
& PREFIX_DATA
)
6204 || (sizeflag
& SUFFIX_ALWAYS
))
6211 if (sizeflag
& DFLAG
)
6216 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6222 if (address_mode
== mode_64bit
&& (sizeflag
& DFLAG
))
6224 if (modrm
.mod
!= 3 || (sizeflag
& SUFFIX_ALWAYS
))
6231 if (l
== 0 && len
== 1)
6234 if (intel_syntax
&& !alt
)
6237 if (modrm
.mod
!= 3 || (sizeflag
& SUFFIX_ALWAYS
))
6243 if (sizeflag
& DFLAG
)
6244 *obufp
++ = intel_syntax
? 'd' : 'l';
6248 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6253 if (l
!= 1 || len
!= 2 || last
[0] != 'L')
6259 || (modrm
.mod
== 3 && !(sizeflag
& SUFFIX_ALWAYS
)))
6274 else if (sizeflag
& DFLAG
)
6283 if (intel_syntax
&& !p
[1]
6284 && ((rex
& REX_W
) || (sizeflag
& DFLAG
)))
6287 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6292 if (address_mode
== mode_64bit
&& (sizeflag
& DFLAG
))
6294 if (sizeflag
& SUFFIX_ALWAYS
)
6302 if (sizeflag
& SUFFIX_ALWAYS
)
6308 if (sizeflag
& DFLAG
)
6312 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6317 if (prefixes
& PREFIX_DATA
)
6321 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6324 if (intel_syntax
|| !(sizeflag
& SUFFIX_ALWAYS
))
6332 /* implicit operand size 'l' for i386 or 'q' for x86-64 */
6334 /* operand size flag for cwtl, cbtw */
6343 else if (sizeflag
& DFLAG
)
6348 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6358 oappend (const char *s
)
6361 obufp
+= strlen (s
);
6367 if (prefixes
& PREFIX_CS
)
6369 used_prefixes
|= PREFIX_CS
;
6370 oappend ("%cs:" + intel_syntax
);
6372 if (prefixes
& PREFIX_DS
)
6374 used_prefixes
|= PREFIX_DS
;
6375 oappend ("%ds:" + intel_syntax
);
6377 if (prefixes
& PREFIX_SS
)
6379 used_prefixes
|= PREFIX_SS
;
6380 oappend ("%ss:" + intel_syntax
);
6382 if (prefixes
& PREFIX_ES
)
6384 used_prefixes
|= PREFIX_ES
;
6385 oappend ("%es:" + intel_syntax
);
6387 if (prefixes
& PREFIX_FS
)
6389 used_prefixes
|= PREFIX_FS
;
6390 oappend ("%fs:" + intel_syntax
);
6392 if (prefixes
& PREFIX_GS
)
6394 used_prefixes
|= PREFIX_GS
;
6395 oappend ("%gs:" + intel_syntax
);
6400 OP_indirE (int bytemode
, int sizeflag
)
6404 OP_E (bytemode
, sizeflag
);
6408 print_operand_value (char *buf
, int hex
, bfd_vma disp
)
6410 if (address_mode
== mode_64bit
)
6418 sprintf_vma (tmp
, disp
);
6419 for (i
= 0; tmp
[i
] == '0' && tmp
[i
+ 1]; i
++);
6420 strcpy (buf
+ 2, tmp
+ i
);
6424 bfd_signed_vma v
= disp
;
6431 /* Check for possible overflow on 0x8000000000000000. */
6434 strcpy (buf
, "9223372036854775808");
6448 tmp
[28 - i
] = (v
% 10) + '0';
6452 strcpy (buf
, tmp
+ 29 - i
);
6458 sprintf (buf
, "0x%x", (unsigned int) disp
);
6460 sprintf (buf
, "%d", (int) disp
);
6464 /* Put DISP in BUF as signed hex number. */
6467 print_displacement (char *buf
, bfd_vma disp
)
6469 bfd_signed_vma val
= disp
;
6478 /* Check for possible overflow. */
6481 switch (address_mode
)
6484 strcpy (buf
+ j
, "0x8000000000000000");
6487 strcpy (buf
+ j
, "0x80000000");
6490 strcpy (buf
+ j
, "0x8000");
6500 sprintf_vma (tmp
, val
);
6501 for (i
= 0; tmp
[i
] == '0'; i
++)
6505 strcpy (buf
+ j
, tmp
+ i
);
6509 intel_operand_size (int bytemode
, int sizeflag
)
6515 oappend ("BYTE PTR ");
6519 oappend ("WORD PTR ");
6522 if (address_mode
== mode_64bit
&& (sizeflag
& DFLAG
))
6524 oappend ("QWORD PTR ");
6525 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6533 oappend ("QWORD PTR ");
6534 else if ((sizeflag
& DFLAG
) || bytemode
== dq_mode
)
6535 oappend ("DWORD PTR ");
6537 oappend ("WORD PTR ");
6538 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6541 if ((rex
& REX_W
) || (sizeflag
& DFLAG
))
6543 oappend ("WORD PTR ");
6545 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6549 oappend ("DWORD PTR ");
6552 oappend ("QWORD PTR ");
6555 if (address_mode
== mode_64bit
)
6556 oappend ("QWORD PTR ");
6558 oappend ("DWORD PTR ");
6561 if (sizeflag
& DFLAG
)
6562 oappend ("FWORD PTR ");
6564 oappend ("DWORD PTR ");
6565 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6568 oappend ("TBYTE PTR ");
6571 oappend ("XMMWORD PTR ");
6574 oappend ("OWORD PTR ");
6582 OP_E_extended (int bytemode
, int sizeflag
, int has_drex
)
6591 /* Skip mod/rm byte. */
6602 oappend (names8rex
[modrm
.rm
+ add
]);
6604 oappend (names8
[modrm
.rm
+ add
]);
6607 oappend (names16
[modrm
.rm
+ add
]);
6610 oappend (names32
[modrm
.rm
+ add
]);
6613 oappend (names64
[modrm
.rm
+ add
]);
6616 if (address_mode
== mode_64bit
)
6617 oappend (names64
[modrm
.rm
+ add
]);
6619 oappend (names32
[modrm
.rm
+ add
]);
6622 if (address_mode
== mode_64bit
&& (sizeflag
& DFLAG
))
6624 oappend (names64
[modrm
.rm
+ add
]);
6625 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6637 oappend (names64
[modrm
.rm
+ add
]);
6638 else if ((sizeflag
& DFLAG
) || bytemode
!= v_mode
)
6639 oappend (names32
[modrm
.rm
+ add
]);
6641 oappend (names16
[modrm
.rm
+ add
]);
6642 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6647 oappend (INTERNAL_DISASSEMBLER_ERROR
);
6655 intel_operand_size (bytemode
, sizeflag
);
6658 if ((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
6660 /* 32/64 bit address mode */
6678 FETCH_DATA (the_info
, codep
+ 1);
6679 index
= (*codep
>> 3) & 7;
6680 scale
= (*codep
>> 6) & 3;
6685 haveindex
= index
!= 4;
6690 /* If we have a DREX byte, skip it now
6691 (it has already been handled) */
6694 FETCH_DATA (the_info
, codep
+ 1);
6704 if (address_mode
== mode_64bit
&& !havesib
)
6710 FETCH_DATA (the_info
, codep
+ 1);
6712 if ((disp
& 0x80) != 0)
6720 /* In 32bit mode, we need index register to tell [offset] from
6721 [eiz*1 + offset]. */
6722 needindex
= (havesib
6725 && address_mode
== mode_32bit
);
6726 havedisp
= (havebase
6728 || (havesib
&& (haveindex
|| scale
!= 0)));
6731 if (modrm
.mod
!= 0 || base
== 5)
6733 if (havedisp
|| riprel
)
6734 print_displacement (scratchbuf
, disp
);
6736 print_operand_value (scratchbuf
, 1, disp
);
6737 oappend (scratchbuf
);
6741 oappend (sizeflag
& AFLAG
? "(%rip)" : "(%eip)");
6745 if (havebase
|| haveindex
|| riprel
)
6746 used_prefixes
|= PREFIX_ADDR
;
6748 if (havedisp
|| (intel_syntax
&& riprel
))
6750 *obufp
++ = open_char
;
6751 if (intel_syntax
&& riprel
)
6754 oappend (sizeflag
& AFLAG
? "rip" : "eip");
6758 oappend (address_mode
== mode_64bit
&& (sizeflag
& AFLAG
)
6759 ? names64
[rbase
] : names32
[rbase
]);
6762 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
6763 print index to tell base + index from base. */
6767 || (havebase
&& base
!= ESP_REG_NUM
))
6769 if (!intel_syntax
|| havebase
)
6771 *obufp
++ = separator_char
;
6775 oappend (address_mode
== mode_64bit
6776 && (sizeflag
& AFLAG
)
6777 ? names64
[index
] : names32
[index
]);
6779 oappend (address_mode
== mode_64bit
6780 && (sizeflag
& AFLAG
)
6781 ? index64
: index32
);
6783 *obufp
++ = scale_char
;
6785 sprintf (scratchbuf
, "%d", 1 << scale
);
6786 oappend (scratchbuf
);
6790 && (disp
|| modrm
.mod
!= 0 || base
== 5))
6792 if (!havedisp
|| (bfd_signed_vma
) disp
>= 0)
6797 else if (modrm
.mod
!= 1)
6801 disp
= - (bfd_signed_vma
) disp
;
6805 print_displacement (scratchbuf
, disp
);
6807 print_operand_value (scratchbuf
, 1, disp
);
6808 oappend (scratchbuf
);
6811 *obufp
++ = close_char
;
6814 else if (intel_syntax
)
6816 if (modrm
.mod
!= 0 || base
== 5)
6818 if (prefixes
& (PREFIX_CS
| PREFIX_SS
| PREFIX_DS
6819 | PREFIX_ES
| PREFIX_FS
| PREFIX_GS
))
6823 oappend (names_seg
[ds_reg
- es_reg
]);
6826 print_operand_value (scratchbuf
, 1, disp
);
6827 oappend (scratchbuf
);
6832 { /* 16 bit address mode */
6839 if ((disp
& 0x8000) != 0)
6844 FETCH_DATA (the_info
, codep
+ 1);
6846 if ((disp
& 0x80) != 0)
6851 if ((disp
& 0x8000) != 0)
6857 if (modrm
.mod
!= 0 || modrm
.rm
== 6)
6859 print_displacement (scratchbuf
, disp
);
6860 oappend (scratchbuf
);
6863 if (modrm
.mod
!= 0 || modrm
.rm
!= 6)
6865 *obufp
++ = open_char
;
6867 oappend (index16
[modrm
.rm
]);
6869 && (disp
|| modrm
.mod
!= 0 || modrm
.rm
== 6))
6871 if ((bfd_signed_vma
) disp
>= 0)
6876 else if (modrm
.mod
!= 1)
6880 disp
= - (bfd_signed_vma
) disp
;
6883 print_displacement (scratchbuf
, disp
);
6884 oappend (scratchbuf
);
6887 *obufp
++ = close_char
;
6890 else if (intel_syntax
)
6892 if (prefixes
& (PREFIX_CS
| PREFIX_SS
| PREFIX_DS
6893 | PREFIX_ES
| PREFIX_FS
| PREFIX_GS
))
6897 oappend (names_seg
[ds_reg
- es_reg
]);
6900 print_operand_value (scratchbuf
, 1, disp
& 0xffff);
6901 oappend (scratchbuf
);
6907 OP_E (int bytemode
, int sizeflag
)
6909 OP_E_extended (bytemode
, sizeflag
, 0);
6914 OP_G (int bytemode
, int sizeflag
)
6925 oappend (names8rex
[modrm
.reg
+ add
]);
6927 oappend (names8
[modrm
.reg
+ add
]);
6930 oappend (names16
[modrm
.reg
+ add
]);
6933 oappend (names32
[modrm
.reg
+ add
]);
6936 oappend (names64
[modrm
.reg
+ add
]);
6945 oappend (names64
[modrm
.reg
+ add
]);
6946 else if ((sizeflag
& DFLAG
) || bytemode
!= v_mode
)
6947 oappend (names32
[modrm
.reg
+ add
]);
6949 oappend (names16
[modrm
.reg
+ add
]);
6950 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6953 if (address_mode
== mode_64bit
)
6954 oappend (names64
[modrm
.reg
+ add
]);
6956 oappend (names32
[modrm
.reg
+ add
]);
6959 oappend (INTERNAL_DISASSEMBLER_ERROR
);
6972 FETCH_DATA (the_info
, codep
+ 8);
6973 a
= *codep
++ & 0xff;
6974 a
|= (*codep
++ & 0xff) << 8;
6975 a
|= (*codep
++ & 0xff) << 16;
6976 a
|= (*codep
++ & 0xff) << 24;
6977 b
= *codep
++ & 0xff;
6978 b
|= (*codep
++ & 0xff) << 8;
6979 b
|= (*codep
++ & 0xff) << 16;
6980 b
|= (*codep
++ & 0xff) << 24;
6981 x
= a
+ ((bfd_vma
) b
<< 32);
6989 static bfd_signed_vma
6992 bfd_signed_vma x
= 0;
6994 FETCH_DATA (the_info
, codep
+ 4);
6995 x
= *codep
++ & (bfd_signed_vma
) 0xff;
6996 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 8;
6997 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 16;
6998 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 24;
7002 static bfd_signed_vma
7005 bfd_signed_vma x
= 0;
7007 FETCH_DATA (the_info
, codep
+ 4);
7008 x
= *codep
++ & (bfd_signed_vma
) 0xff;
7009 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 8;
7010 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 16;
7011 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 24;
7013 x
= (x
^ ((bfd_signed_vma
) 1 << 31)) - ((bfd_signed_vma
) 1 << 31);
7023 FETCH_DATA (the_info
, codep
+ 2);
7024 x
= *codep
++ & 0xff;
7025 x
|= (*codep
++ & 0xff) << 8;
7030 set_op (bfd_vma op
, int riprel
)
7032 op_index
[op_ad
] = op_ad
;
7033 if (address_mode
== mode_64bit
)
7035 op_address
[op_ad
] = op
;
7036 op_riprel
[op_ad
] = riprel
;
7040 /* Mask to get a 32-bit address. */
7041 op_address
[op_ad
] = op
& 0xffffffff;
7042 op_riprel
[op_ad
] = riprel
& 0xffffffff;
7047 OP_REG (int code
, int sizeflag
)
7059 case ax_reg
: case cx_reg
: case dx_reg
: case bx_reg
:
7060 case sp_reg
: case bp_reg
: case si_reg
: case di_reg
:
7061 s
= names16
[code
- ax_reg
+ add
];
7063 case es_reg
: case ss_reg
: case cs_reg
:
7064 case ds_reg
: case fs_reg
: case gs_reg
:
7065 s
= names_seg
[code
- es_reg
+ add
];
7067 case al_reg
: case ah_reg
: case cl_reg
: case ch_reg
:
7068 case dl_reg
: case dh_reg
: case bl_reg
: case bh_reg
:
7071 s
= names8rex
[code
- al_reg
+ add
];
7073 s
= names8
[code
- al_reg
];
7075 case rAX_reg
: case rCX_reg
: case rDX_reg
: case rBX_reg
:
7076 case rSP_reg
: case rBP_reg
: case rSI_reg
: case rDI_reg
:
7077 if (address_mode
== mode_64bit
&& (sizeflag
& DFLAG
))
7079 s
= names64
[code
- rAX_reg
+ add
];
7082 code
+= eAX_reg
- rAX_reg
;
7084 case eAX_reg
: case eCX_reg
: case eDX_reg
: case eBX_reg
:
7085 case eSP_reg
: case eBP_reg
: case eSI_reg
: case eDI_reg
:
7088 s
= names64
[code
- eAX_reg
+ add
];
7089 else if (sizeflag
& DFLAG
)
7090 s
= names32
[code
- eAX_reg
+ add
];
7092 s
= names16
[code
- eAX_reg
+ add
];
7093 used_prefixes
|= (prefixes
& PREFIX_DATA
);
7096 s
= INTERNAL_DISASSEMBLER_ERROR
;
7103 OP_IMREG (int code
, int sizeflag
)
7115 case ax_reg
: case cx_reg
: case dx_reg
: case bx_reg
:
7116 case sp_reg
: case bp_reg
: case si_reg
: case di_reg
:
7117 s
= names16
[code
- ax_reg
];
7119 case es_reg
: case ss_reg
: case cs_reg
:
7120 case ds_reg
: case fs_reg
: case gs_reg
:
7121 s
= names_seg
[code
- es_reg
];
7123 case al_reg
: case ah_reg
: case cl_reg
: case ch_reg
:
7124 case dl_reg
: case dh_reg
: case bl_reg
: case bh_reg
:
7127 s
= names8rex
[code
- al_reg
];
7129 s
= names8
[code
- al_reg
];
7131 case eAX_reg
: case eCX_reg
: case eDX_reg
: case eBX_reg
:
7132 case eSP_reg
: case eBP_reg
: case eSI_reg
: case eDI_reg
:
7135 s
= names64
[code
- eAX_reg
];
7136 else if (sizeflag
& DFLAG
)
7137 s
= names32
[code
- eAX_reg
];
7139 s
= names16
[code
- eAX_reg
];
7140 used_prefixes
|= (prefixes
& PREFIX_DATA
);
7143 if ((rex
& REX_W
) || (sizeflag
& DFLAG
))
7148 used_prefixes
|= (prefixes
& PREFIX_DATA
);
7151 s
= INTERNAL_DISASSEMBLER_ERROR
;
7158 OP_I (int bytemode
, int sizeflag
)
7161 bfd_signed_vma mask
= -1;
7166 FETCH_DATA (the_info
, codep
+ 1);
7171 if (address_mode
== mode_64bit
)
7181 else if (sizeflag
& DFLAG
)
7191 used_prefixes
|= (prefixes
& PREFIX_DATA
);
7202 oappend (INTERNAL_DISASSEMBLER_ERROR
);
7207 scratchbuf
[0] = '$';
7208 print_operand_value (scratchbuf
+ 1, 1, op
);
7209 oappend (scratchbuf
+ intel_syntax
);
7210 scratchbuf
[0] = '\0';
7214 OP_I64 (int bytemode
, int sizeflag
)
7217 bfd_signed_vma mask
= -1;
7219 if (address_mode
!= mode_64bit
)
7221 OP_I (bytemode
, sizeflag
);
7228 FETCH_DATA (the_info
, codep
+ 1);
7236 else if (sizeflag
& DFLAG
)
7246 used_prefixes
|= (prefixes
& PREFIX_DATA
);
7253 oappend (INTERNAL_DISASSEMBLER_ERROR
);
7258 scratchbuf
[0] = '$';
7259 print_operand_value (scratchbuf
+ 1, 1, op
);
7260 oappend (scratchbuf
+ intel_syntax
);
7261 scratchbuf
[0] = '\0';
7265 OP_sI (int bytemode
, int sizeflag
)
7268 bfd_signed_vma mask
= -1;
7273 FETCH_DATA (the_info
, codep
+ 1);
7275 if ((op
& 0x80) != 0)
7283 else if (sizeflag
& DFLAG
)
7292 if ((op
& 0x8000) != 0)
7295 used_prefixes
|= (prefixes
& PREFIX_DATA
);
7300 if ((op
& 0x8000) != 0)
7304 oappend (INTERNAL_DISASSEMBLER_ERROR
);
7308 scratchbuf
[0] = '$';
7309 print_operand_value (scratchbuf
+ 1, 1, op
);
7310 oappend (scratchbuf
+ intel_syntax
);
7314 OP_J (int bytemode
, int sizeflag
)
7318 bfd_vma segment
= 0;
7323 FETCH_DATA (the_info
, codep
+ 1);
7325 if ((disp
& 0x80) != 0)
7329 if ((sizeflag
& DFLAG
) || (rex
& REX_W
))
7334 if ((disp
& 0x8000) != 0)
7336 /* In 16bit mode, address is wrapped around at 64k within
7337 the same segment. Otherwise, a data16 prefix on a jump
7338 instruction means that the pc is masked to 16 bits after
7339 the displacement is added! */
7341 if ((prefixes
& PREFIX_DATA
) == 0)
7342 segment
= ((start_pc
+ codep
- start_codep
)
7343 & ~((bfd_vma
) 0xffff));
7345 used_prefixes
|= (prefixes
& PREFIX_DATA
);
7348 oappend (INTERNAL_DISASSEMBLER_ERROR
);
7351 disp
= ((start_pc
+ codep
- start_codep
+ disp
) & mask
) | segment
;
7353 print_operand_value (scratchbuf
, 1, disp
);
7354 oappend (scratchbuf
);
7358 OP_SEG (int bytemode
, int sizeflag
)
7360 if (bytemode
== w_mode
)
7361 oappend (names_seg
[modrm
.reg
]);
7363 OP_E (modrm
.mod
== 3 ? bytemode
: w_mode
, sizeflag
);
7367 OP_DIR (int dummy ATTRIBUTE_UNUSED
, int sizeflag
)
7371 if (sizeflag
& DFLAG
)
7381 used_prefixes
|= (prefixes
& PREFIX_DATA
);
7383 sprintf (scratchbuf
, "0x%x:0x%x", seg
, offset
);
7385 sprintf (scratchbuf
, "$0x%x,$0x%x", seg
, offset
);
7386 oappend (scratchbuf
);
7390 OP_OFF (int bytemode
, int sizeflag
)
7394 if (intel_syntax
&& (sizeflag
& SUFFIX_ALWAYS
))
7395 intel_operand_size (bytemode
, sizeflag
);
7398 if ((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
7405 if (!(prefixes
& (PREFIX_CS
| PREFIX_SS
| PREFIX_DS
7406 | PREFIX_ES
| PREFIX_FS
| PREFIX_GS
)))
7408 oappend (names_seg
[ds_reg
- es_reg
]);
7412 print_operand_value (scratchbuf
, 1, off
);
7413 oappend (scratchbuf
);
7417 OP_OFF64 (int bytemode
, int sizeflag
)
7421 if (address_mode
!= mode_64bit
7422 || (prefixes
& PREFIX_ADDR
))
7424 OP_OFF (bytemode
, sizeflag
);
7428 if (intel_syntax
&& (sizeflag
& SUFFIX_ALWAYS
))
7429 intel_operand_size (bytemode
, sizeflag
);
7436 if (!(prefixes
& (PREFIX_CS
| PREFIX_SS
| PREFIX_DS
7437 | PREFIX_ES
| PREFIX_FS
| PREFIX_GS
)))
7439 oappend (names_seg
[ds_reg
- es_reg
]);
7443 print_operand_value (scratchbuf
, 1, off
);
7444 oappend (scratchbuf
);
7448 ptr_reg (int code
, int sizeflag
)
7452 *obufp
++ = open_char
;
7453 used_prefixes
|= (prefixes
& PREFIX_ADDR
);
7454 if (address_mode
== mode_64bit
)
7456 if (!(sizeflag
& AFLAG
))
7457 s
= names32
[code
- eAX_reg
];
7459 s
= names64
[code
- eAX_reg
];
7461 else if (sizeflag
& AFLAG
)
7462 s
= names32
[code
- eAX_reg
];
7464 s
= names16
[code
- eAX_reg
];
7466 *obufp
++ = close_char
;
7471 OP_ESreg (int code
, int sizeflag
)
7477 case 0x6d: /* insw/insl */
7478 intel_operand_size (z_mode
, sizeflag
);
7480 case 0xa5: /* movsw/movsl/movsq */
7481 case 0xa7: /* cmpsw/cmpsl/cmpsq */
7482 case 0xab: /* stosw/stosl */
7483 case 0xaf: /* scasw/scasl */
7484 intel_operand_size (v_mode
, sizeflag
);
7487 intel_operand_size (b_mode
, sizeflag
);
7490 oappend ("%es:" + intel_syntax
);
7491 ptr_reg (code
, sizeflag
);
7495 OP_DSreg (int code
, int sizeflag
)
7501 case 0x6f: /* outsw/outsl */
7502 intel_operand_size (z_mode
, sizeflag
);
7504 case 0xa5: /* movsw/movsl/movsq */
7505 case 0xa7: /* cmpsw/cmpsl/cmpsq */
7506 case 0xad: /* lodsw/lodsl/lodsq */
7507 intel_operand_size (v_mode
, sizeflag
);
7510 intel_operand_size (b_mode
, sizeflag
);
7520 prefixes
|= PREFIX_DS
;
7522 ptr_reg (code
, sizeflag
);
7526 OP_C (int dummy ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
7534 else if (address_mode
!= mode_64bit
&& (prefixes
& PREFIX_LOCK
))
7537 used_prefixes
|= PREFIX_LOCK
;
7542 sprintf (scratchbuf
, "%%cr%d", modrm
.reg
+ add
);
7543 oappend (scratchbuf
+ intel_syntax
);
7547 OP_D (int dummy ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
7556 sprintf (scratchbuf
, "db%d", modrm
.reg
+ add
);
7558 sprintf (scratchbuf
, "%%db%d", modrm
.reg
+ add
);
7559 oappend (scratchbuf
);
7563 OP_T (int dummy ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
7565 sprintf (scratchbuf
, "%%tr%d", modrm
.reg
);
7566 oappend (scratchbuf
+ intel_syntax
);
7570 OP_R (int bytemode
, int sizeflag
)
7573 OP_E (bytemode
, sizeflag
);
7579 OP_MMX (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
7581 used_prefixes
|= (prefixes
& PREFIX_DATA
);
7582 if (prefixes
& PREFIX_DATA
)
7590 sprintf (scratchbuf
, "%%xmm%d", modrm
.reg
+ add
);
7593 sprintf (scratchbuf
, "%%mm%d", modrm
.reg
);
7594 oappend (scratchbuf
+ intel_syntax
);
7598 OP_XMM (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
7606 sprintf (scratchbuf
, "%%xmm%d", modrm
.reg
+ add
);
7607 oappend (scratchbuf
+ intel_syntax
);
7611 OP_EM (int bytemode
, int sizeflag
)
7615 if (intel_syntax
&& bytemode
== v_mode
)
7617 bytemode
= (prefixes
& PREFIX_DATA
) ? x_mode
: q_mode
;
7618 used_prefixes
|= (prefixes
& PREFIX_DATA
);
7620 OP_E (bytemode
, sizeflag
);
7624 /* Skip mod/rm byte. */
7627 used_prefixes
|= (prefixes
& PREFIX_DATA
);
7628 if (prefixes
& PREFIX_DATA
)
7637 sprintf (scratchbuf
, "%%xmm%d", modrm
.rm
+ add
);
7640 sprintf (scratchbuf
, "%%mm%d", modrm
.rm
);
7641 oappend (scratchbuf
+ intel_syntax
);
7644 /* cvt* are the only instructions in sse2 which have
7645 both SSE and MMX operands and also have 0x66 prefix
7646 in their opcode. 0x66 was originally used to differentiate
7647 between SSE and MMX instruction(operands). So we have to handle the
7648 cvt* separately using OP_EMC and OP_MXC */
7650 OP_EMC (int bytemode
, int sizeflag
)
7654 if (intel_syntax
&& bytemode
== v_mode
)
7656 bytemode
= (prefixes
& PREFIX_DATA
) ? x_mode
: q_mode
;
7657 used_prefixes
|= (prefixes
& PREFIX_DATA
);
7659 OP_E (bytemode
, sizeflag
);
7663 /* Skip mod/rm byte. */
7666 used_prefixes
|= (prefixes
& PREFIX_DATA
);
7667 sprintf (scratchbuf
, "%%mm%d", modrm
.rm
);
7668 oappend (scratchbuf
+ intel_syntax
);
7672 OP_MXC (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
7674 used_prefixes
|= (prefixes
& PREFIX_DATA
);
7675 sprintf (scratchbuf
, "%%mm%d", modrm
.reg
);
7676 oappend (scratchbuf
+ intel_syntax
);
7680 OP_EX (int bytemode
, int sizeflag
)
7685 OP_E (bytemode
, sizeflag
);
7694 /* Skip mod/rm byte. */
7697 sprintf (scratchbuf
, "%%xmm%d", modrm
.rm
+ add
);
7698 oappend (scratchbuf
+ intel_syntax
);
7702 OP_MS (int bytemode
, int sizeflag
)
7705 OP_EM (bytemode
, sizeflag
);
7711 OP_XS (int bytemode
, int sizeflag
)
7714 OP_EX (bytemode
, sizeflag
);
7720 OP_M (int bytemode
, int sizeflag
)
7723 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
7726 OP_E (bytemode
, sizeflag
);
7730 OP_0f07 (int bytemode
, int sizeflag
)
7732 if (modrm
.mod
!= 3 || modrm
.rm
!= 0)
7735 OP_E (bytemode
, sizeflag
);
7738 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
7739 32bit mode and "xchg %rax,%rax" in 64bit mode. */
7742 NOP_Fixup1 (int bytemode
, int sizeflag
)
7744 if ((prefixes
& PREFIX_DATA
) != 0
7747 && address_mode
== mode_64bit
))
7748 OP_REG (bytemode
, sizeflag
);
7750 strcpy (obuf
, "nop");
7754 NOP_Fixup2 (int bytemode
, int sizeflag
)
7756 if ((prefixes
& PREFIX_DATA
) != 0
7759 && address_mode
== mode_64bit
))
7760 OP_IMREG (bytemode
, sizeflag
);
7763 static const char *const Suffix3DNow
[] = {
7764 /* 00 */ NULL
, NULL
, NULL
, NULL
,
7765 /* 04 */ NULL
, NULL
, NULL
, NULL
,
7766 /* 08 */ NULL
, NULL
, NULL
, NULL
,
7767 /* 0C */ "pi2fw", "pi2fd", NULL
, NULL
,
7768 /* 10 */ NULL
, NULL
, NULL
, NULL
,
7769 /* 14 */ NULL
, NULL
, NULL
, NULL
,
7770 /* 18 */ NULL
, NULL
, NULL
, NULL
,
7771 /* 1C */ "pf2iw", "pf2id", NULL
, NULL
,
7772 /* 20 */ NULL
, NULL
, NULL
, NULL
,
7773 /* 24 */ NULL
, NULL
, NULL
, NULL
,
7774 /* 28 */ NULL
, NULL
, NULL
, NULL
,
7775 /* 2C */ NULL
, NULL
, NULL
, NULL
,
7776 /* 30 */ NULL
, NULL
, NULL
, NULL
,
7777 /* 34 */ NULL
, NULL
, NULL
, NULL
,
7778 /* 38 */ NULL
, NULL
, NULL
, NULL
,
7779 /* 3C */ NULL
, NULL
, NULL
, NULL
,
7780 /* 40 */ NULL
, NULL
, NULL
, NULL
,
7781 /* 44 */ NULL
, NULL
, NULL
, NULL
,
7782 /* 48 */ NULL
, NULL
, NULL
, NULL
,
7783 /* 4C */ NULL
, NULL
, NULL
, NULL
,
7784 /* 50 */ NULL
, NULL
, NULL
, NULL
,
7785 /* 54 */ NULL
, NULL
, NULL
, NULL
,
7786 /* 58 */ NULL
, NULL
, NULL
, NULL
,
7787 /* 5C */ NULL
, NULL
, NULL
, NULL
,
7788 /* 60 */ NULL
, NULL
, NULL
, NULL
,
7789 /* 64 */ NULL
, NULL
, NULL
, NULL
,
7790 /* 68 */ NULL
, NULL
, NULL
, NULL
,
7791 /* 6C */ NULL
, NULL
, NULL
, NULL
,
7792 /* 70 */ NULL
, NULL
, NULL
, NULL
,
7793 /* 74 */ NULL
, NULL
, NULL
, NULL
,
7794 /* 78 */ NULL
, NULL
, NULL
, NULL
,
7795 /* 7C */ NULL
, NULL
, NULL
, NULL
,
7796 /* 80 */ NULL
, NULL
, NULL
, NULL
,
7797 /* 84 */ NULL
, NULL
, NULL
, NULL
,
7798 /* 88 */ NULL
, NULL
, "pfnacc", NULL
,
7799 /* 8C */ NULL
, NULL
, "pfpnacc", NULL
,
7800 /* 90 */ "pfcmpge", NULL
, NULL
, NULL
,
7801 /* 94 */ "pfmin", NULL
, "pfrcp", "pfrsqrt",
7802 /* 98 */ NULL
, NULL
, "pfsub", NULL
,
7803 /* 9C */ NULL
, NULL
, "pfadd", NULL
,
7804 /* A0 */ "pfcmpgt", NULL
, NULL
, NULL
,
7805 /* A4 */ "pfmax", NULL
, "pfrcpit1", "pfrsqit1",
7806 /* A8 */ NULL
, NULL
, "pfsubr", NULL
,
7807 /* AC */ NULL
, NULL
, "pfacc", NULL
,
7808 /* B0 */ "pfcmpeq", NULL
, NULL
, NULL
,
7809 /* B4 */ "pfmul", NULL
, "pfrcpit2", "pmulhrw",
7810 /* B8 */ NULL
, NULL
, NULL
, "pswapd",
7811 /* BC */ NULL
, NULL
, NULL
, "pavgusb",
7812 /* C0 */ NULL
, NULL
, NULL
, NULL
,
7813 /* C4 */ NULL
, NULL
, NULL
, NULL
,
7814 /* C8 */ NULL
, NULL
, NULL
, NULL
,
7815 /* CC */ NULL
, NULL
, NULL
, NULL
,
7816 /* D0 */ NULL
, NULL
, NULL
, NULL
,
7817 /* D4 */ NULL
, NULL
, NULL
, NULL
,
7818 /* D8 */ NULL
, NULL
, NULL
, NULL
,
7819 /* DC */ NULL
, NULL
, NULL
, NULL
,
7820 /* E0 */ NULL
, NULL
, NULL
, NULL
,
7821 /* E4 */ NULL
, NULL
, NULL
, NULL
,
7822 /* E8 */ NULL
, NULL
, NULL
, NULL
,
7823 /* EC */ NULL
, NULL
, NULL
, NULL
,
7824 /* F0 */ NULL
, NULL
, NULL
, NULL
,
7825 /* F4 */ NULL
, NULL
, NULL
, NULL
,
7826 /* F8 */ NULL
, NULL
, NULL
, NULL
,
7827 /* FC */ NULL
, NULL
, NULL
, NULL
,
7831 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
7833 const char *mnemonic
;
7835 FETCH_DATA (the_info
, codep
+ 1);
7836 /* AMD 3DNow! instructions are specified by an opcode suffix in the
7837 place where an 8-bit immediate would normally go. ie. the last
7838 byte of the instruction. */
7839 obufp
= obuf
+ strlen (obuf
);
7840 mnemonic
= Suffix3DNow
[*codep
++ & 0xff];
7845 /* Since a variable sized modrm/sib chunk is between the start
7846 of the opcode (0x0f0f) and the opcode suffix, we need to do
7847 all the modrm processing first, and don't know until now that
7848 we have a bad opcode. This necessitates some cleaning up. */
7849 op_out
[0][0] = '\0';
7850 op_out
[1][0] = '\0';
7855 static const char *simd_cmp_op
[] = {
7867 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
7869 unsigned int cmp_type
;
7871 FETCH_DATA (the_info
, codep
+ 1);
7872 cmp_type
= *codep
++ & 0xff;
7876 char *p
= obuf
+ strlen (obuf
) - 2;
7880 sprintf (p
, "%s%s", simd_cmp_op
[cmp_type
], suffix
);
7884 /* We have a reserved extension byte. Output it directly. */
7885 scratchbuf
[0] = '$';
7886 print_operand_value (scratchbuf
+ 1, 1, cmp_type
);
7887 oappend (scratchbuf
+ intel_syntax
);
7888 scratchbuf
[0] = '\0';
7893 OP_Mwait (int bytemode ATTRIBUTE_UNUSED
,
7894 int sizeflag ATTRIBUTE_UNUSED
)
7896 /* mwait %eax,%ecx */
7899 const char **names
= (address_mode
== mode_64bit
7900 ? names64
: names32
);
7901 strcpy (op_out
[0], names
[0]);
7902 strcpy (op_out
[1], names
[1]);
7905 /* Skip mod/rm byte. */
7911 OP_Monitor (int bytemode ATTRIBUTE_UNUSED
,
7912 int sizeflag ATTRIBUTE_UNUSED
)
7914 /* monitor %eax,%ecx,%edx" */
7917 const char **op1_names
;
7918 const char **names
= (address_mode
== mode_64bit
7919 ? names64
: names32
);
7921 if (!(prefixes
& PREFIX_ADDR
))
7922 op1_names
= (address_mode
== mode_16bit
7926 /* Remove "addr16/addr32". */
7928 op1_names
= (address_mode
!= mode_32bit
7929 ? names32
: names16
);
7930 used_prefixes
|= PREFIX_ADDR
;
7932 strcpy (op_out
[0], op1_names
[0]);
7933 strcpy (op_out
[1], names
[1]);
7934 strcpy (op_out
[2], names
[2]);
7937 /* Skip mod/rm byte. */
7945 /* Throw away prefixes and 1st. opcode byte. */
7946 codep
= insn_codep
+ 1;
7951 REP_Fixup (int bytemode
, int sizeflag
)
7953 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
7955 if (prefixes
& PREFIX_REPZ
)
7956 repz_prefix
= "rep ";
7963 OP_IMREG (bytemode
, sizeflag
);
7966 OP_ESreg (bytemode
, sizeflag
);
7969 OP_DSreg (bytemode
, sizeflag
);
7978 CMPXCHG8B_Fixup (int bytemode
, int sizeflag
)
7983 /* Change cmpxchg8b to cmpxchg16b. */
7984 char *p
= obuf
+ strlen (obuf
) - 2;
7988 OP_M (bytemode
, sizeflag
);
7992 XMM_Fixup (int reg
, int sizeflag ATTRIBUTE_UNUSED
)
7994 sprintf (scratchbuf
, "%%xmm%d", reg
);
7995 oappend (scratchbuf
+ intel_syntax
);
7999 CRC32_Fixup (int bytemode
, int sizeflag
)
8001 /* Add proper suffix to "crc32". */
8002 char *p
= obuf
+ strlen (obuf
);
8019 else if (sizeflag
& DFLAG
)
8023 used_prefixes
|= (prefixes
& PREFIX_DATA
);
8026 oappend (INTERNAL_DISASSEMBLER_ERROR
);
8035 /* Skip mod/rm byte. */
8040 add
= (rex
& REX_B
) ? 8 : 0;
8041 if (bytemode
== b_mode
)
8045 oappend (names8rex
[modrm
.rm
+ add
]);
8047 oappend (names8
[modrm
.rm
+ add
]);
8053 oappend (names64
[modrm
.rm
+ add
]);
8054 else if ((prefixes
& PREFIX_DATA
))
8055 oappend (names16
[modrm
.rm
+ add
]);
8057 oappend (names32
[modrm
.rm
+ add
]);
8061 OP_E (bytemode
, sizeflag
);
8064 /* Print a DREX argument as either a register or memory operation. */
8066 print_drex_arg (unsigned int reg
, int bytemode
, int sizeflag
)
8068 if (reg
== DREX_REG_UNKNOWN
)
8071 else if (reg
!= DREX_REG_MEMORY
)
8073 sprintf (scratchbuf
, "%%xmm%d", reg
);
8074 oappend (scratchbuf
+ intel_syntax
);
8078 OP_E_extended (bytemode
, sizeflag
, 1);
8081 /* SSE5 instructions that have 4 arguments are encoded as:
8082 0f 24 <sub-opcode> <modrm> <optional-sib> <drex> <offset>.
8084 The <sub-opcode> byte has 1 bit (0x4) that is combined with 1 bit in
8085 the DREX field (0x8) to determine how the arguments are laid out.
8086 The destination register must be the same register as one of the
8087 inputs, and it is encoded in the DREX byte. No REX prefix is used
8088 for these instructions, since the DREX field contains the 3 extension
8089 bits provided by the REX prefix.
8091 The bytemode argument adds 2 extra bits for passing extra information:
8092 DREX_OC1 -- Set the OC1 bit to indicate dest == 1st arg
8093 DREX_NO_OC0 -- OC0 in DREX is invalid
8094 (but pretend it is set). */
8097 OP_DREX4 (int flag_bytemode
, int sizeflag
)
8099 unsigned int drex_byte
;
8100 unsigned int regs
[4];
8101 unsigned int modrm_regmem
;
8102 unsigned int modrm_reg
;
8103 unsigned int drex_reg
;
8106 int rex_used_save
= rex_used
;
8108 int oc1
= (flag_bytemode
& DREX_OC1
) ? 2 : 0;
8112 bytemode
= flag_bytemode
& ~ DREX_MASK
;
8114 for (i
= 0; i
< 4; i
++)
8115 regs
[i
] = DREX_REG_UNKNOWN
;
8117 /* Determine if we have a SIB byte in addition to MODRM before the
8119 if (((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
8124 /* Get the DREX byte. */
8125 FETCH_DATA (the_info
, codep
+ 2 + has_sib
);
8126 drex_byte
= codep
[has_sib
+1];
8127 drex_reg
= DREX_XMM (drex_byte
);
8128 modrm_reg
= modrm
.reg
+ ((drex_byte
& REX_R
) ? 8 : 0);
8130 /* Is OC0 legal? If not, hardwire oc0 == 1. */
8131 if (flag_bytemode
& DREX_NO_OC0
)
8134 if (DREX_OC0 (drex_byte
))
8138 oc0
= DREX_OC0 (drex_byte
);
8142 /* regmem == register */
8143 modrm_regmem
= modrm
.rm
+ ((drex_byte
& REX_B
) ? 8 : 0);
8145 /* skip modrm/drex since we don't call OP_E_extended */
8150 /* regmem == memory, fill in appropriate REX bits */
8151 modrm_regmem
= DREX_REG_MEMORY
;
8152 rex
= drex_byte
& (REX_B
| REX_X
| REX_R
);
8158 /* Based on the OC1/OC0 bits, lay out the arguments in the correct
8167 regs
[0] = modrm_regmem
;
8168 regs
[1] = modrm_reg
;
8174 regs
[0] = modrm_reg
;
8175 regs
[1] = modrm_regmem
;
8182 regs
[1] = modrm_regmem
;
8183 regs
[2] = modrm_reg
;
8189 regs
[1] = modrm_reg
;
8190 regs
[2] = modrm_regmem
;
8195 /* Print out the arguments. */
8196 for (i
= 0; i
< 4; i
++)
8198 int j
= (intel_syntax
) ? 3 - i
: i
;
8205 print_drex_arg (regs
[j
], bytemode
, sizeflag
);
8209 rex_used
= rex_used_save
;
8212 /* SSE5 instructions that have 3 arguments, and are encoded as:
8213 0f 24 <sub-opcode> <modrm> <optional-sib> <drex> <offset> (or)
8214 0f 25 <sub-opcode> <modrm> <optional-sib> <drex> <offset> <cmp-byte>
8216 The DREX field has 1 bit (0x8) to determine how the arguments are
8217 laid out. The destination register is encoded in the DREX byte.
8218 No REX prefix is used for these instructions, since the DREX field
8219 contains the 3 extension bits provided by the REX prefix. */
8222 OP_DREX3 (int flag_bytemode
, int sizeflag
)
8224 unsigned int drex_byte
;
8225 unsigned int regs
[3];
8226 unsigned int modrm_regmem
;
8227 unsigned int modrm_reg
;
8228 unsigned int drex_reg
;
8231 int rex_used_save
= rex_used
;
8236 bytemode
= flag_bytemode
& ~ DREX_MASK
;
8238 for (i
= 0; i
< 3; i
++)
8239 regs
[i
] = DREX_REG_UNKNOWN
;
8241 /* Determine if we have a SIB byte in addition to MODRM before the
8243 if (((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
8248 /* Get the DREX byte. */
8249 FETCH_DATA (the_info
, codep
+ 2 + has_sib
);
8250 drex_byte
= codep
[has_sib
+1];
8251 drex_reg
= DREX_XMM (drex_byte
);
8252 modrm_reg
= modrm
.reg
+ ((drex_byte
& REX_R
) ? 8 : 0);
8254 /* Is OC0 legal? If not, hardwire oc0 == 0 */
8255 oc0
= DREX_OC0 (drex_byte
);
8256 if ((flag_bytemode
& DREX_NO_OC0
) && oc0
)
8261 /* regmem == register */
8262 modrm_regmem
= modrm
.rm
+ ((drex_byte
& REX_B
) ? 8 : 0);
8264 /* skip modrm/drex since we don't call OP_E_extended. */
8269 /* regmem == memory, fill in appropriate REX bits. */
8270 modrm_regmem
= DREX_REG_MEMORY
;
8271 rex
= drex_byte
& (REX_B
| REX_X
| REX_R
);
8277 /* Based on the OC1/OC0 bits, lay out the arguments in the correct
8286 regs
[0] = modrm_regmem
;
8287 regs
[1] = modrm_reg
;
8292 regs
[0] = modrm_reg
;
8293 regs
[1] = modrm_regmem
;
8298 /* Print out the arguments. */
8299 for (i
= 0; i
< 3; i
++)
8301 int j
= (intel_syntax
) ? 2 - i
: i
;
8308 print_drex_arg (regs
[j
], bytemode
, sizeflag
);
8312 rex_used
= rex_used_save
;
8315 /* Emit a floating point comparison for comp<xx> instructions. */
8318 OP_DREX_FCMP (int bytemode ATTRIBUTE_UNUSED
,
8319 int sizeflag ATTRIBUTE_UNUSED
)
8323 static const char *const cmp_test
[] = {
8342 FETCH_DATA (the_info
, codep
+ 1);
8343 byte
= *codep
& 0xff;
8345 if (byte
>= ARRAY_SIZE (cmp_test
)
8350 /* The instruction isn't one we know about, so just append the
8351 extension byte as a numeric value. */
8357 sprintf (scratchbuf
, "com%s%s", cmp_test
[byte
], obuf
+3);
8358 strcpy (obuf
, scratchbuf
);
8363 /* Emit an integer point comparison for pcom<xx> instructions,
8364 rewriting the instruction to have the test inside of it. */
8367 OP_DREX_ICMP (int bytemode ATTRIBUTE_UNUSED
,
8368 int sizeflag ATTRIBUTE_UNUSED
)
8372 static const char *const cmp_test
[] = {
8383 FETCH_DATA (the_info
, codep
+ 1);
8384 byte
= *codep
& 0xff;
8386 if (byte
>= ARRAY_SIZE (cmp_test
)
8392 /* The instruction isn't one we know about, so just print the
8393 comparison test byte as a numeric value. */
8399 sprintf (scratchbuf
, "pcom%s%s", cmp_test
[byte
], obuf
+4);
8400 strcpy (obuf
, scratchbuf
);