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 Gb { OP_G, b_mode }
240 #define Gv { OP_G, v_mode }
241 #define Gd { OP_G, d_mode }
242 #define Gdq { OP_G, dq_mode }
243 #define Gm { OP_G, m_mode }
244 #define Gw { OP_G, w_mode }
245 #define Rd { OP_R, d_mode }
246 #define Rm { OP_R, m_mode }
247 #define Ib { OP_I, b_mode }
248 #define sIb { OP_sI, b_mode } /* sign extened byte */
249 #define Iv { OP_I, v_mode }
250 #define Iq { OP_I, q_mode }
251 #define Iv64 { OP_I64, v_mode }
252 #define Iw { OP_I, w_mode }
253 #define I1 { OP_I, const_1_mode }
254 #define Jb { OP_J, b_mode }
255 #define Jv { OP_J, v_mode }
256 #define Cm { OP_C, m_mode }
257 #define Dm { OP_D, m_mode }
258 #define Td { OP_T, d_mode }
259 #define Skip_MODRM { OP_Skip_MODRM, 0 }
261 #define RMeAX { OP_REG, eAX_reg }
262 #define RMeBX { OP_REG, eBX_reg }
263 #define RMeCX { OP_REG, eCX_reg }
264 #define RMeDX { OP_REG, eDX_reg }
265 #define RMeSP { OP_REG, eSP_reg }
266 #define RMeBP { OP_REG, eBP_reg }
267 #define RMeSI { OP_REG, eSI_reg }
268 #define RMeDI { OP_REG, eDI_reg }
269 #define RMrAX { OP_REG, rAX_reg }
270 #define RMrBX { OP_REG, rBX_reg }
271 #define RMrCX { OP_REG, rCX_reg }
272 #define RMrDX { OP_REG, rDX_reg }
273 #define RMrSP { OP_REG, rSP_reg }
274 #define RMrBP { OP_REG, rBP_reg }
275 #define RMrSI { OP_REG, rSI_reg }
276 #define RMrDI { OP_REG, rDI_reg }
277 #define RMAL { OP_REG, al_reg }
278 #define RMAL { OP_REG, al_reg }
279 #define RMCL { OP_REG, cl_reg }
280 #define RMDL { OP_REG, dl_reg }
281 #define RMBL { OP_REG, bl_reg }
282 #define RMAH { OP_REG, ah_reg }
283 #define RMCH { OP_REG, ch_reg }
284 #define RMDH { OP_REG, dh_reg }
285 #define RMBH { OP_REG, bh_reg }
286 #define RMAX { OP_REG, ax_reg }
287 #define RMDX { OP_REG, dx_reg }
289 #define eAX { OP_IMREG, eAX_reg }
290 #define eBX { OP_IMREG, eBX_reg }
291 #define eCX { OP_IMREG, eCX_reg }
292 #define eDX { OP_IMREG, eDX_reg }
293 #define eSP { OP_IMREG, eSP_reg }
294 #define eBP { OP_IMREG, eBP_reg }
295 #define eSI { OP_IMREG, eSI_reg }
296 #define eDI { OP_IMREG, eDI_reg }
297 #define AL { OP_IMREG, al_reg }
298 #define CL { OP_IMREG, cl_reg }
299 #define DL { OP_IMREG, dl_reg }
300 #define BL { OP_IMREG, bl_reg }
301 #define AH { OP_IMREG, ah_reg }
302 #define CH { OP_IMREG, ch_reg }
303 #define DH { OP_IMREG, dh_reg }
304 #define BH { OP_IMREG, bh_reg }
305 #define AX { OP_IMREG, ax_reg }
306 #define DX { OP_IMREG, dx_reg }
307 #define zAX { OP_IMREG, z_mode_ax_reg }
308 #define indirDX { OP_IMREG, indir_dx_reg }
310 #define Sw { OP_SEG, w_mode }
311 #define Sv { OP_SEG, v_mode }
312 #define Ap { OP_DIR, 0 }
313 #define Ob { OP_OFF64, b_mode }
314 #define Ov { OP_OFF64, v_mode }
315 #define Xb { OP_DSreg, eSI_reg }
316 #define Xv { OP_DSreg, eSI_reg }
317 #define Xz { OP_DSreg, eSI_reg }
318 #define Yb { OP_ESreg, eDI_reg }
319 #define Yv { OP_ESreg, eDI_reg }
320 #define DSBX { OP_DSreg, eBX_reg }
322 #define es { OP_REG, es_reg }
323 #define ss { OP_REG, ss_reg }
324 #define cs { OP_REG, cs_reg }
325 #define ds { OP_REG, ds_reg }
326 #define fs { OP_REG, fs_reg }
327 #define gs { OP_REG, gs_reg }
329 #define MX { OP_MMX, 0 }
330 #define XM { OP_XMM, 0 }
331 #define EM { OP_EM, v_mode }
332 #define EMd { OP_EM, d_mode }
333 #define EMx { OP_EM, x_mode }
334 #define EXw { OP_EX, w_mode }
335 #define EXd { OP_EX, d_mode }
336 #define EXq { OP_EX, q_mode }
337 #define EXx { OP_EX, x_mode }
338 #define MS { OP_MS, v_mode }
339 #define XS { OP_XS, v_mode }
340 #define EMCq { OP_EMC, q_mode }
341 #define MXC { OP_MXC, 0 }
342 #define OPSUF { OP_3DNowSuffix, 0 }
343 #define CMP { CMP_Fixup, 0 }
344 #define XMM0 { XMM_Fixup, 0 }
346 /* Used handle "rep" prefix for string instructions. */
347 #define Xbr { REP_Fixup, eSI_reg }
348 #define Xvr { REP_Fixup, eSI_reg }
349 #define Ybr { REP_Fixup, eDI_reg }
350 #define Yvr { REP_Fixup, eDI_reg }
351 #define Yzr { REP_Fixup, eDI_reg }
352 #define indirDXr { REP_Fixup, indir_dx_reg }
353 #define ALr { REP_Fixup, al_reg }
354 #define eAXr { REP_Fixup, eAX_reg }
356 #define cond_jump_flag { NULL, cond_jump_mode }
357 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
359 /* bits in sizeflag */
360 #define SUFFIX_ALWAYS 4
366 /* operand size depends on prefixes */
367 #define v_mode (b_mode + 1)
369 #define w_mode (v_mode + 1)
370 /* double word operand */
371 #define d_mode (w_mode + 1)
372 /* quad word operand */
373 #define q_mode (d_mode + 1)
374 /* ten-byte operand */
375 #define t_mode (q_mode + 1)
376 /* 16-byte XMM operand */
377 #define x_mode (t_mode + 1)
378 /* d_mode in 32bit, q_mode in 64bit mode. */
379 #define m_mode (x_mode + 1)
380 #define cond_jump_mode (m_mode + 1)
381 #define loop_jcxz_mode (cond_jump_mode + 1)
382 /* operand size depends on REX prefixes. */
383 #define dq_mode (loop_jcxz_mode + 1)
384 /* registers like dq_mode, memory like w_mode. */
385 #define dqw_mode (dq_mode + 1)
386 /* 4- or 6-byte pointer operand */
387 #define f_mode (dqw_mode + 1)
388 #define const_1_mode (f_mode + 1)
389 /* v_mode for stack-related opcodes. */
390 #define stack_v_mode (const_1_mode + 1)
391 /* non-quad operand size depends on prefixes */
392 #define z_mode (stack_v_mode + 1)
393 /* 16-byte operand */
394 #define o_mode (z_mode + 1)
395 /* registers like dq_mode, memory like b_mode. */
396 #define dqb_mode (o_mode + 1)
397 /* registers like dq_mode, memory like d_mode. */
398 #define dqd_mode (dqb_mode + 1)
400 #define es_reg (dqd_mode + 1)
401 #define cs_reg (es_reg + 1)
402 #define ss_reg (cs_reg + 1)
403 #define ds_reg (ss_reg + 1)
404 #define fs_reg (ds_reg + 1)
405 #define gs_reg (fs_reg + 1)
407 #define eAX_reg (gs_reg + 1)
408 #define eCX_reg (eAX_reg + 1)
409 #define eDX_reg (eCX_reg + 1)
410 #define eBX_reg (eDX_reg + 1)
411 #define eSP_reg (eBX_reg + 1)
412 #define eBP_reg (eSP_reg + 1)
413 #define eSI_reg (eBP_reg + 1)
414 #define eDI_reg (eSI_reg + 1)
416 #define al_reg (eDI_reg + 1)
417 #define cl_reg (al_reg + 1)
418 #define dl_reg (cl_reg + 1)
419 #define bl_reg (dl_reg + 1)
420 #define ah_reg (bl_reg + 1)
421 #define ch_reg (ah_reg + 1)
422 #define dh_reg (ch_reg + 1)
423 #define bh_reg (dh_reg + 1)
425 #define ax_reg (bh_reg + 1)
426 #define cx_reg (ax_reg + 1)
427 #define dx_reg (cx_reg + 1)
428 #define bx_reg (dx_reg + 1)
429 #define sp_reg (bx_reg + 1)
430 #define bp_reg (sp_reg + 1)
431 #define si_reg (bp_reg + 1)
432 #define di_reg (si_reg + 1)
434 #define rAX_reg (di_reg + 1)
435 #define rCX_reg (rAX_reg + 1)
436 #define rDX_reg (rCX_reg + 1)
437 #define rBX_reg (rDX_reg + 1)
438 #define rSP_reg (rBX_reg + 1)
439 #define rBP_reg (rSP_reg + 1)
440 #define rSI_reg (rBP_reg + 1)
441 #define rDI_reg (rSI_reg + 1)
443 #define z_mode_ax_reg (rDI_reg + 1)
444 #define indir_dx_reg (z_mode_ax_reg + 1)
446 #define MAX_BYTEMODE indir_dx_reg
448 /* Flags that are OR'ed into the bytemode field to pass extra
450 #define DREX_OC1 0x10000 /* OC1 bit set */
451 #define DREX_NO_OC0 0x20000 /* OC0 bit not used */
452 #define DREX_MASK 0x40000 /* mask to delete */
454 #if MAX_BYTEMODE >= DREX_OC1
455 #error MAX_BYTEMODE must be less than DREX_OC1
459 #define USE_REG_TABLE (FLOATCODE + 1)
460 #define USE_MOD_TABLE (USE_REG_TABLE + 1)
461 #define USE_RM_TABLE (USE_MOD_TABLE + 1)
462 #define USE_PREFIX_TABLE (USE_RM_TABLE + 1)
463 #define USE_X86_64_TABLE (USE_PREFIX_TABLE + 1)
464 #define USE_3BYTE_TABLE (USE_X86_64_TABLE + 1)
466 #define FLOAT NULL, { { NULL, FLOATCODE } }
468 #define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } }
469 #define REG_TABLE(I) DIS386 (USE_REG_TABLE, (I))
470 #define MOD_TABLE(I) DIS386 (USE_MOD_TABLE, (I))
471 #define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I))
472 #define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I))
473 #define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I))
474 #define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
477 #define REG_81 (REG_80 + 1)
478 #define REG_82 (REG_81 + 1)
479 #define REG_8F (REG_82 + 1)
480 #define REG_C0 (REG_8F + 1)
481 #define REG_C1 (REG_C0 + 1)
482 #define REG_C6 (REG_C1 + 1)
483 #define REG_C7 (REG_C6 + 1)
484 #define REG_D0 (REG_C7 + 1)
485 #define REG_D1 (REG_D0 + 1)
486 #define REG_D2 (REG_D1 + 1)
487 #define REG_D3 (REG_D2 + 1)
488 #define REG_F6 (REG_D3 + 1)
489 #define REG_F7 (REG_F6 + 1)
490 #define REG_FE (REG_F7 + 1)
491 #define REG_FF (REG_FE + 1)
492 #define REG_0F00 (REG_FF + 1)
493 #define REG_0F01 (REG_0F00 + 1)
494 #define REG_0F0D (REG_0F01 + 1)
495 #define REG_0F18 (REG_0F0D + 1)
496 #define REG_0F71 (REG_0F18 + 1)
497 #define REG_0F72 (REG_0F71 + 1)
498 #define REG_0F73 (REG_0F72 + 1)
499 #define REG_0FA6 (REG_0F73 + 1)
500 #define REG_0FA7 (REG_0FA6 + 1)
501 #define REG_0FAE (REG_0FA7 + 1)
502 #define REG_0FBA (REG_0FAE + 1)
503 #define REG_0FC7 (REG_0FBA + 1)
506 #define MOD_0F01_REG_0 (MOD_8D + 1)
507 #define MOD_0F01_REG_1 (MOD_0F01_REG_0 + 1)
508 #define MOD_0F01_REG_2 (MOD_0F01_REG_1 + 1)
509 #define MOD_0F01_REG_3 (MOD_0F01_REG_2 + 1)
510 #define MOD_0F01_REG_7 (MOD_0F01_REG_3 + 1)
511 #define MOD_0F12_PREFIX_0 (MOD_0F01_REG_7 + 1)
512 #define MOD_0F13 (MOD_0F12_PREFIX_0 + 1)
513 #define MOD_0F16_PREFIX_0 (MOD_0F13 + 1)
514 #define MOD_0F17 (MOD_0F16_PREFIX_0 + 1)
515 #define MOD_0F18_REG_0 (MOD_0F17 + 1)
516 #define MOD_0F18_REG_1 (MOD_0F18_REG_0 + 1)
517 #define MOD_0F18_REG_2 (MOD_0F18_REG_1 + 1)
518 #define MOD_0F18_REG_3 (MOD_0F18_REG_2 + 1)
519 #define MOD_0F20 (MOD_0F18_REG_3 + 1)
520 #define MOD_0F21 (MOD_0F20 + 1)
521 #define MOD_0F22 (MOD_0F21 + 1)
522 #define MOD_0F23 (MOD_0F22 + 1)
523 #define MOD_0F24 (MOD_0F23 + 1)
524 #define MOD_0F26 (MOD_0F24 + 1)
525 #define MOD_0F2B_PREFIX_0 (MOD_0F26 + 1)
526 #define MOD_0F2B_PREFIX_1 (MOD_0F2B_PREFIX_0 + 1)
527 #define MOD_0F2B_PREFIX_2 (MOD_0F2B_PREFIX_1 + 1)
528 #define MOD_0F2B_PREFIX_3 (MOD_0F2B_PREFIX_2 + 1)
529 #define MOD_0F51 (MOD_0F2B_PREFIX_3 + 1)
530 #define MOD_0F71_REG_2 (MOD_0F51 + 1)
531 #define MOD_0F71_REG_4 (MOD_0F71_REG_2 + 1)
532 #define MOD_0F71_REG_6 (MOD_0F71_REG_4 + 1)
533 #define MOD_0F72_REG_2 (MOD_0F71_REG_6 + 1)
534 #define MOD_0F72_REG_4 (MOD_0F72_REG_2 + 1)
535 #define MOD_0F72_REG_6 (MOD_0F72_REG_4 + 1)
536 #define MOD_0F73_REG_2 (MOD_0F72_REG_6 + 1)
537 #define MOD_0F73_REG_3 (MOD_0F73_REG_2 + 1)
538 #define MOD_0F73_REG_6 (MOD_0F73_REG_3 + 1)
539 #define MOD_0F73_REG_7 (MOD_0F73_REG_6 + 1)
540 #define MOD_0FAE_REG_0 (MOD_0F73_REG_7 + 1)
541 #define MOD_0FAE_REG_1 (MOD_0FAE_REG_0 + 1)
542 #define MOD_0FAE_REG_2 (MOD_0FAE_REG_1 + 1)
543 #define MOD_0FAE_REG_3 (MOD_0FAE_REG_2 + 1)
544 #define MOD_0FAE_REG_5 (MOD_0FAE_REG_3 + 1)
545 #define MOD_0FAE_REG_6 (MOD_0FAE_REG_5 + 1)
546 #define MOD_0FAE_REG_7 (MOD_0FAE_REG_6 + 1)
547 #define MOD_0FB2 (MOD_0FAE_REG_7 + 1)
548 #define MOD_0FB4 (MOD_0FB2 + 1)
549 #define MOD_0FB5 (MOD_0FB4 + 1)
550 #define MOD_0FC7_REG_6 (MOD_0FB5 + 1)
551 #define MOD_0FC7_REG_7 (MOD_0FC7_REG_6 + 1)
552 #define MOD_0FD7 (MOD_0FC7_REG_7 + 1)
553 #define MOD_0FE7_PREFIX_2 (MOD_0FD7 + 1)
554 #define MOD_0FF0_PREFIX_3 (MOD_0FE7_PREFIX_2 + 1)
555 #define MOD_0F382A_PREFIX_2 (MOD_0FF0_PREFIX_3 + 1)
556 #define MOD_62_32BIT (MOD_0F382A_PREFIX_2 + 1)
557 #define MOD_C4_32BIT (MOD_62_32BIT + 1)
558 #define MOD_C5_32BIT (MOD_C4_32BIT + 1)
560 #define RM_0F01_REG_0 0
561 #define RM_0F01_REG_1 (RM_0F01_REG_0 + 1)
562 #define RM_0F01_REG_3 (RM_0F01_REG_1 + 1)
563 #define RM_0F01_REG_7 (RM_0F01_REG_3 + 1)
564 #define RM_0FAE_REG_5 (RM_0F01_REG_7 + 1)
565 #define RM_0FAE_REG_6 (RM_0FAE_REG_5 + 1)
566 #define RM_0FAE_REG_7 (RM_0FAE_REG_6 + 1)
569 #define PREFIX_0F10 (PREFIX_90 + 1)
570 #define PREFIX_0F11 (PREFIX_0F10 + 1)
571 #define PREFIX_0F12 (PREFIX_0F11 + 1)
572 #define PREFIX_0F16 (PREFIX_0F12 + 1)
573 #define PREFIX_0F2A (PREFIX_0F16 + 1)
574 #define PREFIX_0F2B (PREFIX_0F2A + 1)
575 #define PREFIX_0F2C (PREFIX_0F2B + 1)
576 #define PREFIX_0F2D (PREFIX_0F2C + 1)
577 #define PREFIX_0F2E (PREFIX_0F2D + 1)
578 #define PREFIX_0F2F (PREFIX_0F2E + 1)
579 #define PREFIX_0F51 (PREFIX_0F2F + 1)
580 #define PREFIX_0F52 (PREFIX_0F51 + 1)
581 #define PREFIX_0F53 (PREFIX_0F52 + 1)
582 #define PREFIX_0F58 (PREFIX_0F53 + 1)
583 #define PREFIX_0F59 (PREFIX_0F58 + 1)
584 #define PREFIX_0F5A (PREFIX_0F59 + 1)
585 #define PREFIX_0F5B (PREFIX_0F5A + 1)
586 #define PREFIX_0F5C (PREFIX_0F5B + 1)
587 #define PREFIX_0F5D (PREFIX_0F5C + 1)
588 #define PREFIX_0F5E (PREFIX_0F5D + 1)
589 #define PREFIX_0F5F (PREFIX_0F5E + 1)
590 #define PREFIX_0F60 (PREFIX_0F5F + 1)
591 #define PREFIX_0F61 (PREFIX_0F60 + 1)
592 #define PREFIX_0F62 (PREFIX_0F61 + 1)
593 #define PREFIX_0F6C (PREFIX_0F62 + 1)
594 #define PREFIX_0F6D (PREFIX_0F6C + 1)
595 #define PREFIX_0F6F (PREFIX_0F6D + 1)
596 #define PREFIX_0F70 (PREFIX_0F6F + 1)
597 #define PREFIX_0F73_REG_3 (PREFIX_0F70 + 1)
598 #define PREFIX_0F73_REG_7 (PREFIX_0F73_REG_3 + 1)
599 #define PREFIX_0F78 (PREFIX_0F73_REG_7 + 1)
600 #define PREFIX_0F79 (PREFIX_0F78 + 1)
601 #define PREFIX_0F7C (PREFIX_0F79 + 1)
602 #define PREFIX_0F7D (PREFIX_0F7C + 1)
603 #define PREFIX_0F7E (PREFIX_0F7D + 1)
604 #define PREFIX_0F7F (PREFIX_0F7E + 1)
605 #define PREFIX_0FB8 (PREFIX_0F7F + 1)
606 #define PREFIX_0FBD (PREFIX_0FB8 + 1)
607 #define PREFIX_0FC2 (PREFIX_0FBD + 1)
608 #define PREFIX_0FC7_REG_6 (PREFIX_0FC2 + 1)
609 #define PREFIX_0FD0 (PREFIX_0FC7_REG_6 + 1)
610 #define PREFIX_0FD6 (PREFIX_0FD0 + 1)
611 #define PREFIX_0FE6 (PREFIX_0FD6 + 1)
612 #define PREFIX_0FE7 (PREFIX_0FE6 + 1)
613 #define PREFIX_0FF0 (PREFIX_0FE7 + 1)
614 #define PREFIX_0FF7 (PREFIX_0FF0 + 1)
615 #define PREFIX_0F3810 (PREFIX_0FF7 + 1)
616 #define PREFIX_0F3814 (PREFIX_0F3810 + 1)
617 #define PREFIX_0F3815 (PREFIX_0F3814 + 1)
618 #define PREFIX_0F3817 (PREFIX_0F3815 + 1)
619 #define PREFIX_0F3820 (PREFIX_0F3817 + 1)
620 #define PREFIX_0F3821 (PREFIX_0F3820 + 1)
621 #define PREFIX_0F3822 (PREFIX_0F3821 + 1)
622 #define PREFIX_0F3823 (PREFIX_0F3822 + 1)
623 #define PREFIX_0F3824 (PREFIX_0F3823 + 1)
624 #define PREFIX_0F3825 (PREFIX_0F3824 + 1)
625 #define PREFIX_0F3828 (PREFIX_0F3825 + 1)
626 #define PREFIX_0F3829 (PREFIX_0F3828 + 1)
627 #define PREFIX_0F382A (PREFIX_0F3829 + 1)
628 #define PREFIX_0F382B (PREFIX_0F382A + 1)
629 #define PREFIX_0F3830 (PREFIX_0F382B + 1)
630 #define PREFIX_0F3831 (PREFIX_0F3830 + 1)
631 #define PREFIX_0F3832 (PREFIX_0F3831 + 1)
632 #define PREFIX_0F3833 (PREFIX_0F3832 + 1)
633 #define PREFIX_0F3834 (PREFIX_0F3833 + 1)
634 #define PREFIX_0F3835 (PREFIX_0F3834 + 1)
635 #define PREFIX_0F3837 (PREFIX_0F3835 + 1)
636 #define PREFIX_0F3838 (PREFIX_0F3837 + 1)
637 #define PREFIX_0F3839 (PREFIX_0F3838 + 1)
638 #define PREFIX_0F383A (PREFIX_0F3839 + 1)
639 #define PREFIX_0F383B (PREFIX_0F383A + 1)
640 #define PREFIX_0F383C (PREFIX_0F383B + 1)
641 #define PREFIX_0F383D (PREFIX_0F383C + 1)
642 #define PREFIX_0F383E (PREFIX_0F383D + 1)
643 #define PREFIX_0F383F (PREFIX_0F383E + 1)
644 #define PREFIX_0F3840 (PREFIX_0F383F + 1)
645 #define PREFIX_0F3841 (PREFIX_0F3840 + 1)
646 #define PREFIX_0F38F0 (PREFIX_0F3841 + 1)
647 #define PREFIX_0F38F1 (PREFIX_0F38F0 + 1)
648 #define PREFIX_0F3A08 (PREFIX_0F38F1 + 1)
649 #define PREFIX_0F3A09 (PREFIX_0F3A08 + 1)
650 #define PREFIX_0F3A0A (PREFIX_0F3A09 + 1)
651 #define PREFIX_0F3A0B (PREFIX_0F3A0A + 1)
652 #define PREFIX_0F3A0C (PREFIX_0F3A0B + 1)
653 #define PREFIX_0F3A0D (PREFIX_0F3A0C + 1)
654 #define PREFIX_0F3A0E (PREFIX_0F3A0D + 1)
655 #define PREFIX_0F3A14 (PREFIX_0F3A0E + 1)
656 #define PREFIX_0F3A15 (PREFIX_0F3A14 + 1)
657 #define PREFIX_0F3A16 (PREFIX_0F3A15 + 1)
658 #define PREFIX_0F3A17 (PREFIX_0F3A16 + 1)
659 #define PREFIX_0F3A20 (PREFIX_0F3A17 + 1)
660 #define PREFIX_0F3A21 (PREFIX_0F3A20 + 1)
661 #define PREFIX_0F3A22 (PREFIX_0F3A21 + 1)
662 #define PREFIX_0F3A40 (PREFIX_0F3A22 + 1)
663 #define PREFIX_0F3A41 (PREFIX_0F3A40 + 1)
664 #define PREFIX_0F3A42 (PREFIX_0F3A41 + 1)
665 #define PREFIX_0F3A60 (PREFIX_0F3A42 + 1)
666 #define PREFIX_0F3A61 (PREFIX_0F3A60 + 1)
667 #define PREFIX_0F3A62 (PREFIX_0F3A61 + 1)
668 #define PREFIX_0F3A63 (PREFIX_0F3A62 + 1)
671 #define X86_64_07 (X86_64_06 + 1)
672 #define X86_64_0D (X86_64_07 + 1)
673 #define X86_64_16 (X86_64_0D + 1)
674 #define X86_64_17 (X86_64_16 + 1)
675 #define X86_64_1E (X86_64_17 + 1)
676 #define X86_64_1F (X86_64_1E + 1)
677 #define X86_64_27 (X86_64_1F + 1)
678 #define X86_64_2F (X86_64_27 + 1)
679 #define X86_64_37 (X86_64_2F + 1)
680 #define X86_64_3F (X86_64_37 + 1)
681 #define X86_64_60 (X86_64_3F + 1)
682 #define X86_64_61 (X86_64_60 + 1)
683 #define X86_64_62 (X86_64_61 + 1)
684 #define X86_64_63 (X86_64_62 + 1)
685 #define X86_64_6D (X86_64_63 + 1)
686 #define X86_64_6F (X86_64_6D + 1)
687 #define X86_64_9A (X86_64_6F + 1)
688 #define X86_64_C4 (X86_64_9A + 1)
689 #define X86_64_C5 (X86_64_C4 + 1)
690 #define X86_64_CE (X86_64_C5 + 1)
691 #define X86_64_D4 (X86_64_CE + 1)
692 #define X86_64_D5 (X86_64_D4 + 1)
693 #define X86_64_EA (X86_64_D5 + 1)
694 #define X86_64_0F01_REG_0 (X86_64_EA + 1)
695 #define X86_64_0F01_REG_1 (X86_64_0F01_REG_0 + 1)
696 #define X86_64_0F01_REG_2 (X86_64_0F01_REG_1 + 1)
697 #define X86_64_0F01_REG_3 (X86_64_0F01_REG_2 + 1)
699 #define THREE_BYTE_0F24 0
700 #define THREE_BYTE_0F25 (THREE_BYTE_0F24 + 1)
701 #define THREE_BYTE_0F38 (THREE_BYTE_0F25 + 1)
702 #define THREE_BYTE_0F3A (THREE_BYTE_0F38 + 1)
703 #define THREE_BYTE_0F7A (THREE_BYTE_0F3A + 1)
704 #define THREE_BYTE_0F7B (THREE_BYTE_0F7A + 1)
706 typedef void (*op_rtn
) (int bytemode
, int sizeflag
);
717 /* Upper case letters in the instruction names here are macros.
718 'A' => print 'b' if no register operands or suffix_always is true
719 'B' => print 'b' if suffix_always is true
720 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
722 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
723 suffix_always is true
724 'E' => print 'e' if 32-bit form of jcxz
725 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
726 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
727 'H' => print ",pt" or ",pn" branch hint
728 'I' => honor following macro letter even in Intel mode (implemented only
729 for some of the macro letters)
731 'K' => print 'd' or 'q' if rex prefix is present.
732 'L' => print 'l' if suffix_always is true
733 'M' => print 'r' if intel_mnemonic is false.
734 'N' => print 'n' if instruction has no wait "prefix"
735 'O' => print 'd' or 'o' (or 'q' in Intel mode)
736 'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
737 or suffix_always is true. print 'q' if rex prefix is present.
738 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
740 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
741 'S' => print 'w', 'l' or 'q' if suffix_always is true
742 'T' => print 'q' in 64bit mode and behave as 'P' otherwise
743 'U' => print 'q' in 64bit mode and behave as 'Q' otherwise
744 'V' => print 'q' in 64bit mode and behave as 'S' otherwise
745 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
746 'X' => print 's', 'd' depending on data16 prefix (for XMM)
747 'Y' => 'q' if instruction has an REX 64bit overwrite prefix and
748 suffix_always is true.
749 'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
750 '!' => change condition from true to false or from false to true.
751 '%' => add 1 upper case letter to the macro.
753 2 upper case letter macros:
754 'LQ' => print 'l' ('d' in Intel mode) or 'q' for memory operand
755 or suffix_always is true
757 Many of the above letters print nothing in Intel mode. See "putop"
760 Braces '{' and '}', and vertical bars '|', indicate alternative
761 mnemonic strings for AT&T and Intel. */
763 static const struct dis386 dis386
[] = {
765 { "addB", { Eb
, Gb
} },
766 { "addS", { Ev
, Gv
} },
767 { "addB", { Gb
, Eb
} },
768 { "addS", { Gv
, Ev
} },
769 { "addB", { AL
, Ib
} },
770 { "addS", { eAX
, Iv
} },
771 { X86_64_TABLE (X86_64_06
) },
772 { X86_64_TABLE (X86_64_07
) },
774 { "orB", { Eb
, Gb
} },
775 { "orS", { Ev
, Gv
} },
776 { "orB", { Gb
, Eb
} },
777 { "orS", { Gv
, Ev
} },
778 { "orB", { AL
, Ib
} },
779 { "orS", { eAX
, Iv
} },
780 { X86_64_TABLE (X86_64_0D
) },
781 { "(bad)", { XX
} }, /* 0x0f extended opcode escape */
783 { "adcB", { Eb
, Gb
} },
784 { "adcS", { Ev
, Gv
} },
785 { "adcB", { Gb
, Eb
} },
786 { "adcS", { Gv
, Ev
} },
787 { "adcB", { AL
, Ib
} },
788 { "adcS", { eAX
, Iv
} },
789 { X86_64_TABLE (X86_64_16
) },
790 { X86_64_TABLE (X86_64_17
) },
792 { "sbbB", { Eb
, Gb
} },
793 { "sbbS", { Ev
, Gv
} },
794 { "sbbB", { Gb
, Eb
} },
795 { "sbbS", { Gv
, Ev
} },
796 { "sbbB", { AL
, Ib
} },
797 { "sbbS", { eAX
, Iv
} },
798 { X86_64_TABLE (X86_64_1E
) },
799 { X86_64_TABLE (X86_64_1F
) },
801 { "andB", { Eb
, Gb
} },
802 { "andS", { Ev
, Gv
} },
803 { "andB", { Gb
, Eb
} },
804 { "andS", { Gv
, Ev
} },
805 { "andB", { AL
, Ib
} },
806 { "andS", { eAX
, Iv
} },
807 { "(bad)", { XX
} }, /* SEG ES prefix */
808 { X86_64_TABLE (X86_64_27
) },
810 { "subB", { Eb
, Gb
} },
811 { "subS", { Ev
, Gv
} },
812 { "subB", { Gb
, Eb
} },
813 { "subS", { Gv
, Ev
} },
814 { "subB", { AL
, Ib
} },
815 { "subS", { eAX
, Iv
} },
816 { "(bad)", { XX
} }, /* SEG CS prefix */
817 { X86_64_TABLE (X86_64_2F
) },
819 { "xorB", { Eb
, Gb
} },
820 { "xorS", { Ev
, Gv
} },
821 { "xorB", { Gb
, Eb
} },
822 { "xorS", { Gv
, Ev
} },
823 { "xorB", { AL
, Ib
} },
824 { "xorS", { eAX
, Iv
} },
825 { "(bad)", { XX
} }, /* SEG SS prefix */
826 { X86_64_TABLE (X86_64_37
) },
828 { "cmpB", { Eb
, Gb
} },
829 { "cmpS", { Ev
, Gv
} },
830 { "cmpB", { Gb
, Eb
} },
831 { "cmpS", { Gv
, Ev
} },
832 { "cmpB", { AL
, Ib
} },
833 { "cmpS", { eAX
, Iv
} },
834 { "(bad)", { XX
} }, /* SEG DS prefix */
835 { X86_64_TABLE (X86_64_3F
) },
837 { "inc{S|}", { RMeAX
} },
838 { "inc{S|}", { RMeCX
} },
839 { "inc{S|}", { RMeDX
} },
840 { "inc{S|}", { RMeBX
} },
841 { "inc{S|}", { RMeSP
} },
842 { "inc{S|}", { RMeBP
} },
843 { "inc{S|}", { RMeSI
} },
844 { "inc{S|}", { RMeDI
} },
846 { "dec{S|}", { RMeAX
} },
847 { "dec{S|}", { RMeCX
} },
848 { "dec{S|}", { RMeDX
} },
849 { "dec{S|}", { RMeBX
} },
850 { "dec{S|}", { RMeSP
} },
851 { "dec{S|}", { RMeBP
} },
852 { "dec{S|}", { RMeSI
} },
853 { "dec{S|}", { RMeDI
} },
855 { "pushV", { RMrAX
} },
856 { "pushV", { RMrCX
} },
857 { "pushV", { RMrDX
} },
858 { "pushV", { RMrBX
} },
859 { "pushV", { RMrSP
} },
860 { "pushV", { RMrBP
} },
861 { "pushV", { RMrSI
} },
862 { "pushV", { RMrDI
} },
864 { "popV", { RMrAX
} },
865 { "popV", { RMrCX
} },
866 { "popV", { RMrDX
} },
867 { "popV", { RMrBX
} },
868 { "popV", { RMrSP
} },
869 { "popV", { RMrBP
} },
870 { "popV", { RMrSI
} },
871 { "popV", { RMrDI
} },
873 { X86_64_TABLE (X86_64_60
) },
874 { X86_64_TABLE (X86_64_61
) },
875 { X86_64_TABLE (X86_64_62
) },
876 { X86_64_TABLE (X86_64_63
) },
877 { "(bad)", { XX
} }, /* seg fs */
878 { "(bad)", { XX
} }, /* seg gs */
879 { "(bad)", { XX
} }, /* op size prefix */
880 { "(bad)", { XX
} }, /* adr size prefix */
883 { "imulS", { Gv
, Ev
, Iv
} },
884 { "pushT", { sIb
} },
885 { "imulS", { Gv
, Ev
, sIb
} },
886 { "ins{b|}", { Ybr
, indirDX
} },
887 { X86_64_TABLE (X86_64_6D
) },
888 { "outs{b|}", { indirDXr
, Xb
} },
889 { X86_64_TABLE (X86_64_6F
) },
891 { "joH", { Jb
, XX
, cond_jump_flag
} },
892 { "jnoH", { Jb
, XX
, cond_jump_flag
} },
893 { "jbH", { Jb
, XX
, cond_jump_flag
} },
894 { "jaeH", { Jb
, XX
, cond_jump_flag
} },
895 { "jeH", { Jb
, XX
, cond_jump_flag
} },
896 { "jneH", { Jb
, XX
, cond_jump_flag
} },
897 { "jbeH", { Jb
, XX
, cond_jump_flag
} },
898 { "jaH", { Jb
, XX
, cond_jump_flag
} },
900 { "jsH", { Jb
, XX
, cond_jump_flag
} },
901 { "jnsH", { Jb
, XX
, cond_jump_flag
} },
902 { "jpH", { Jb
, XX
, cond_jump_flag
} },
903 { "jnpH", { Jb
, XX
, cond_jump_flag
} },
904 { "jlH", { Jb
, XX
, cond_jump_flag
} },
905 { "jgeH", { Jb
, XX
, cond_jump_flag
} },
906 { "jleH", { Jb
, XX
, cond_jump_flag
} },
907 { "jgH", { Jb
, XX
, cond_jump_flag
} },
909 { REG_TABLE (REG_80
) },
910 { REG_TABLE (REG_81
) },
912 { REG_TABLE (REG_82
) },
913 { "testB", { Eb
, Gb
} },
914 { "testS", { Ev
, Gv
} },
915 { "xchgB", { Eb
, Gb
} },
916 { "xchgS", { Ev
, Gv
} },
918 { "movB", { Eb
, Gb
} },
919 { "movS", { Ev
, Gv
} },
920 { "movB", { Gb
, Eb
} },
921 { "movS", { Gv
, Ev
} },
922 { "movD", { Sv
, Sw
} },
923 { MOD_TABLE (MOD_8D
) },
924 { "movD", { Sw
, Sv
} },
925 { REG_TABLE (REG_8F
) },
927 { PREFIX_TABLE (PREFIX_90
) },
928 { "xchgS", { RMeCX
, eAX
} },
929 { "xchgS", { RMeDX
, eAX
} },
930 { "xchgS", { RMeBX
, eAX
} },
931 { "xchgS", { RMeSP
, eAX
} },
932 { "xchgS", { RMeBP
, eAX
} },
933 { "xchgS", { RMeSI
, eAX
} },
934 { "xchgS", { RMeDI
, eAX
} },
936 { "cW{t|}R", { XX
} },
937 { "cR{t|}O", { XX
} },
938 { X86_64_TABLE (X86_64_9A
) },
939 { "(bad)", { XX
} }, /* fwait */
940 { "pushfT", { XX
} },
945 { "movB", { AL
, Ob
} },
946 { "movS", { eAX
, Ov
} },
947 { "movB", { Ob
, AL
} },
948 { "movS", { Ov
, eAX
} },
949 { "movs{b|}", { Ybr
, Xb
} },
950 { "movs{R|}", { Yvr
, Xv
} },
951 { "cmps{b|}", { Xb
, Yb
} },
952 { "cmps{R|}", { Xv
, Yv
} },
954 { "testB", { AL
, Ib
} },
955 { "testS", { eAX
, Iv
} },
956 { "stosB", { Ybr
, AL
} },
957 { "stosS", { Yvr
, eAX
} },
958 { "lodsB", { ALr
, Xb
} },
959 { "lodsS", { eAXr
, Xv
} },
960 { "scasB", { AL
, Yb
} },
961 { "scasS", { eAX
, Yv
} },
963 { "movB", { RMAL
, Ib
} },
964 { "movB", { RMCL
, Ib
} },
965 { "movB", { RMDL
, Ib
} },
966 { "movB", { RMBL
, Ib
} },
967 { "movB", { RMAH
, Ib
} },
968 { "movB", { RMCH
, Ib
} },
969 { "movB", { RMDH
, Ib
} },
970 { "movB", { RMBH
, Ib
} },
972 { "movS", { RMeAX
, Iv64
} },
973 { "movS", { RMeCX
, Iv64
} },
974 { "movS", { RMeDX
, Iv64
} },
975 { "movS", { RMeBX
, Iv64
} },
976 { "movS", { RMeSP
, Iv64
} },
977 { "movS", { RMeBP
, Iv64
} },
978 { "movS", { RMeSI
, Iv64
} },
979 { "movS", { RMeDI
, Iv64
} },
981 { REG_TABLE (REG_C0
) },
982 { REG_TABLE (REG_C1
) },
985 { X86_64_TABLE (X86_64_C4
) },
986 { X86_64_TABLE (X86_64_C5
) },
987 { REG_TABLE (REG_C6
) },
988 { REG_TABLE (REG_C7
) },
990 { "enterT", { Iw
, Ib
} },
991 { "leaveT", { XX
} },
996 { X86_64_TABLE (X86_64_CE
) },
999 { REG_TABLE (REG_D0
) },
1000 { REG_TABLE (REG_D1
) },
1001 { REG_TABLE (REG_D2
) },
1002 { REG_TABLE (REG_D3
) },
1003 { X86_64_TABLE (X86_64_D4
) },
1004 { X86_64_TABLE (X86_64_D5
) },
1005 { "(bad)", { XX
} },
1006 { "xlat", { DSBX
} },
1017 { "loopneFH", { Jb
, XX
, loop_jcxz_flag
} },
1018 { "loopeFH", { Jb
, XX
, loop_jcxz_flag
} },
1019 { "loopFH", { Jb
, XX
, loop_jcxz_flag
} },
1020 { "jEcxzH", { Jb
, XX
, loop_jcxz_flag
} },
1021 { "inB", { AL
, Ib
} },
1022 { "inG", { zAX
, Ib
} },
1023 { "outB", { Ib
, AL
} },
1024 { "outG", { Ib
, zAX
} },
1026 { "callT", { Jv
} },
1028 { X86_64_TABLE (X86_64_EA
) },
1030 { "inB", { AL
, indirDX
} },
1031 { "inG", { zAX
, indirDX
} },
1032 { "outB", { indirDX
, AL
} },
1033 { "outG", { indirDX
, zAX
} },
1035 { "(bad)", { XX
} }, /* lock prefix */
1036 { "icebp", { XX
} },
1037 { "(bad)", { XX
} }, /* repne */
1038 { "(bad)", { XX
} }, /* repz */
1041 { REG_TABLE (REG_F6
) },
1042 { REG_TABLE (REG_F7
) },
1050 { REG_TABLE (REG_FE
) },
1051 { REG_TABLE (REG_FF
) },
1054 static const struct dis386 dis386_twobyte
[] = {
1056 { REG_TABLE (REG_0F00
) },
1057 { REG_TABLE (REG_0F01
) },
1058 { "larS", { Gv
, Ew
} },
1059 { "lslS", { Gv
, Ew
} },
1060 { "(bad)", { XX
} },
1061 { "syscall", { XX
} },
1063 { "sysretP", { XX
} },
1066 { "wbinvd", { XX
} },
1067 { "(bad)", { XX
} },
1069 { "(bad)", { XX
} },
1070 { REG_TABLE (REG_0F0D
) },
1071 { "femms", { XX
} },
1072 { "", { MX
, EM
, OPSUF
} }, /* See OP_3DNowSuffix. */
1074 { PREFIX_TABLE (PREFIX_0F10
) },
1075 { PREFIX_TABLE (PREFIX_0F11
) },
1076 { PREFIX_TABLE (PREFIX_0F12
) },
1077 { MOD_TABLE (MOD_0F13
) },
1078 { "unpcklpX", { XM
, EXx
} },
1079 { "unpckhpX", { XM
, EXx
} },
1080 { PREFIX_TABLE (PREFIX_0F16
) },
1081 { MOD_TABLE (MOD_0F17
) },
1083 { REG_TABLE (REG_0F18
) },
1092 { MOD_TABLE (MOD_0F20
) },
1093 { MOD_TABLE (MOD_0F21
) },
1094 { MOD_TABLE (MOD_0F22
) },
1095 { MOD_TABLE (MOD_0F23
) },
1096 { MOD_TABLE (MOD_0F24
) },
1097 { THREE_BYTE_TABLE (THREE_BYTE_0F25
) },
1098 { MOD_TABLE (MOD_0F26
) },
1099 { "(bad)", { XX
} },
1101 { "movapX", { XM
, EXx
} },
1102 { "movapX", { EXx
, XM
} },
1103 { PREFIX_TABLE (PREFIX_0F2A
) },
1104 { PREFIX_TABLE (PREFIX_0F2B
) },
1105 { PREFIX_TABLE (PREFIX_0F2C
) },
1106 { PREFIX_TABLE (PREFIX_0F2D
) },
1107 { PREFIX_TABLE (PREFIX_0F2E
) },
1108 { PREFIX_TABLE (PREFIX_0F2F
) },
1110 { "wrmsr", { XX
} },
1111 { "rdtsc", { XX
} },
1112 { "rdmsr", { XX
} },
1113 { "rdpmc", { XX
} },
1114 { "sysenter", { XX
} },
1115 { "sysexit", { XX
} },
1116 { "(bad)", { XX
} },
1117 { "getsec", { XX
} },
1119 { THREE_BYTE_TABLE (THREE_BYTE_0F38
) },
1120 { "(bad)", { XX
} },
1121 { THREE_BYTE_TABLE (THREE_BYTE_0F3A
) },
1122 { "(bad)", { XX
} },
1123 { "(bad)", { XX
} },
1124 { "(bad)", { XX
} },
1125 { "(bad)", { XX
} },
1126 { "(bad)", { XX
} },
1128 { "cmovo", { Gv
, Ev
} },
1129 { "cmovno", { Gv
, Ev
} },
1130 { "cmovb", { Gv
, Ev
} },
1131 { "cmovae", { Gv
, Ev
} },
1132 { "cmove", { Gv
, Ev
} },
1133 { "cmovne", { Gv
, Ev
} },
1134 { "cmovbe", { Gv
, Ev
} },
1135 { "cmova", { Gv
, Ev
} },
1137 { "cmovs", { Gv
, Ev
} },
1138 { "cmovns", { Gv
, Ev
} },
1139 { "cmovp", { Gv
, Ev
} },
1140 { "cmovnp", { Gv
, Ev
} },
1141 { "cmovl", { Gv
, Ev
} },
1142 { "cmovge", { Gv
, Ev
} },
1143 { "cmovle", { Gv
, Ev
} },
1144 { "cmovg", { Gv
, Ev
} },
1146 { MOD_TABLE (MOD_0F51
) },
1147 { PREFIX_TABLE (PREFIX_0F51
) },
1148 { PREFIX_TABLE (PREFIX_0F52
) },
1149 { PREFIX_TABLE (PREFIX_0F53
) },
1150 { "andpX", { XM
, EXx
} },
1151 { "andnpX", { XM
, EXx
} },
1152 { "orpX", { XM
, EXx
} },
1153 { "xorpX", { XM
, EXx
} },
1155 { PREFIX_TABLE (PREFIX_0F58
) },
1156 { PREFIX_TABLE (PREFIX_0F59
) },
1157 { PREFIX_TABLE (PREFIX_0F5A
) },
1158 { PREFIX_TABLE (PREFIX_0F5B
) },
1159 { PREFIX_TABLE (PREFIX_0F5C
) },
1160 { PREFIX_TABLE (PREFIX_0F5D
) },
1161 { PREFIX_TABLE (PREFIX_0F5E
) },
1162 { PREFIX_TABLE (PREFIX_0F5F
) },
1164 { PREFIX_TABLE (PREFIX_0F60
) },
1165 { PREFIX_TABLE (PREFIX_0F61
) },
1166 { PREFIX_TABLE (PREFIX_0F62
) },
1167 { "packsswb", { MX
, EM
} },
1168 { "pcmpgtb", { MX
, EM
} },
1169 { "pcmpgtw", { MX
, EM
} },
1170 { "pcmpgtd", { MX
, EM
} },
1171 { "packuswb", { MX
, EM
} },
1173 { "punpckhbw", { MX
, EM
} },
1174 { "punpckhwd", { MX
, EM
} },
1175 { "punpckhdq", { MX
, EM
} },
1176 { "packssdw", { MX
, EM
} },
1177 { PREFIX_TABLE (PREFIX_0F6C
) },
1178 { PREFIX_TABLE (PREFIX_0F6D
) },
1179 { "movK", { MX
, Edq
} },
1180 { PREFIX_TABLE (PREFIX_0F6F
) },
1182 { PREFIX_TABLE (PREFIX_0F70
) },
1183 { REG_TABLE (REG_0F71
) },
1184 { REG_TABLE (REG_0F72
) },
1185 { REG_TABLE (REG_0F73
) },
1186 { "pcmpeqb", { MX
, EM
} },
1187 { "pcmpeqw", { MX
, EM
} },
1188 { "pcmpeqd", { MX
, EM
} },
1191 { PREFIX_TABLE (PREFIX_0F78
) },
1192 { PREFIX_TABLE (PREFIX_0F79
) },
1193 { THREE_BYTE_TABLE (THREE_BYTE_0F7A
) },
1194 { THREE_BYTE_TABLE (THREE_BYTE_0F7B
) },
1195 { PREFIX_TABLE (PREFIX_0F7C
) },
1196 { PREFIX_TABLE (PREFIX_0F7D
) },
1197 { PREFIX_TABLE (PREFIX_0F7E
) },
1198 { PREFIX_TABLE (PREFIX_0F7F
) },
1200 { "joH", { Jv
, XX
, cond_jump_flag
} },
1201 { "jnoH", { Jv
, XX
, cond_jump_flag
} },
1202 { "jbH", { Jv
, XX
, cond_jump_flag
} },
1203 { "jaeH", { Jv
, XX
, cond_jump_flag
} },
1204 { "jeH", { Jv
, XX
, cond_jump_flag
} },
1205 { "jneH", { Jv
, XX
, cond_jump_flag
} },
1206 { "jbeH", { Jv
, XX
, cond_jump_flag
} },
1207 { "jaH", { Jv
, XX
, cond_jump_flag
} },
1209 { "jsH", { Jv
, XX
, cond_jump_flag
} },
1210 { "jnsH", { Jv
, XX
, cond_jump_flag
} },
1211 { "jpH", { Jv
, XX
, cond_jump_flag
} },
1212 { "jnpH", { Jv
, XX
, cond_jump_flag
} },
1213 { "jlH", { Jv
, XX
, cond_jump_flag
} },
1214 { "jgeH", { Jv
, XX
, cond_jump_flag
} },
1215 { "jleH", { Jv
, XX
, cond_jump_flag
} },
1216 { "jgH", { Jv
, XX
, cond_jump_flag
} },
1219 { "setno", { Eb
} },
1221 { "setae", { Eb
} },
1223 { "setne", { Eb
} },
1224 { "setbe", { Eb
} },
1228 { "setns", { Eb
} },
1230 { "setnp", { Eb
} },
1232 { "setge", { Eb
} },
1233 { "setle", { Eb
} },
1236 { "pushT", { fs
} },
1238 { "cpuid", { XX
} },
1239 { "btS", { Ev
, Gv
} },
1240 { "shldS", { Ev
, Gv
, Ib
} },
1241 { "shldS", { Ev
, Gv
, CL
} },
1242 { REG_TABLE (REG_0FA6
) },
1243 { REG_TABLE (REG_0FA7
) },
1245 { "pushT", { gs
} },
1248 { "btsS", { Ev
, Gv
} },
1249 { "shrdS", { Ev
, Gv
, Ib
} },
1250 { "shrdS", { Ev
, Gv
, CL
} },
1251 { REG_TABLE (REG_0FAE
) },
1252 { "imulS", { Gv
, Ev
} },
1254 { "cmpxchgB", { Eb
, Gb
} },
1255 { "cmpxchgS", { Ev
, Gv
} },
1256 { MOD_TABLE (MOD_0FB2
) },
1257 { "btrS", { Ev
, Gv
} },
1258 { MOD_TABLE (MOD_0FB4
) },
1259 { MOD_TABLE (MOD_0FB5
) },
1260 { "movz{bR|x}", { Gv
, Eb
} },
1261 { "movz{wR|x}", { Gv
, Ew
} }, /* yes, there really is movzww ! */
1263 { PREFIX_TABLE (PREFIX_0FB8
) },
1265 { REG_TABLE (REG_0FBA
) },
1266 { "btcS", { Ev
, Gv
} },
1267 { "bsfS", { Gv
, Ev
} },
1268 { PREFIX_TABLE (PREFIX_0FBD
) },
1269 { "movs{bR|x}", { Gv
, Eb
} },
1270 { "movs{wR|x}", { Gv
, Ew
} }, /* yes, there really is movsww ! */
1272 { "xaddB", { Eb
, Gb
} },
1273 { "xaddS", { Ev
, Gv
} },
1274 { PREFIX_TABLE (PREFIX_0FC2
) },
1275 { "movntiS", { Ev
, Gv
} },
1276 { "pinsrw", { MX
, Edqw
, Ib
} },
1277 { "pextrw", { Gdq
, MS
, Ib
} },
1278 { "shufpX", { XM
, EXx
, Ib
} },
1279 { REG_TABLE (REG_0FC7
) },
1281 { "bswap", { RMeAX
} },
1282 { "bswap", { RMeCX
} },
1283 { "bswap", { RMeDX
} },
1284 { "bswap", { RMeBX
} },
1285 { "bswap", { RMeSP
} },
1286 { "bswap", { RMeBP
} },
1287 { "bswap", { RMeSI
} },
1288 { "bswap", { RMeDI
} },
1290 { PREFIX_TABLE (PREFIX_0FD0
) },
1291 { "psrlw", { MX
, EM
} },
1292 { "psrld", { MX
, EM
} },
1293 { "psrlq", { MX
, EM
} },
1294 { "paddq", { MX
, EM
} },
1295 { "pmullw", { MX
, EM
} },
1296 { PREFIX_TABLE (PREFIX_0FD6
) },
1297 { MOD_TABLE (MOD_0FD7
) },
1299 { "psubusb", { MX
, EM
} },
1300 { "psubusw", { MX
, EM
} },
1301 { "pminub", { MX
, EM
} },
1302 { "pand", { MX
, EM
} },
1303 { "paddusb", { MX
, EM
} },
1304 { "paddusw", { MX
, EM
} },
1305 { "pmaxub", { MX
, EM
} },
1306 { "pandn", { MX
, EM
} },
1308 { "pavgb", { MX
, EM
} },
1309 { "psraw", { MX
, EM
} },
1310 { "psrad", { MX
, EM
} },
1311 { "pavgw", { MX
, EM
} },
1312 { "pmulhuw", { MX
, EM
} },
1313 { "pmulhw", { MX
, EM
} },
1314 { PREFIX_TABLE (PREFIX_0FE6
) },
1315 { PREFIX_TABLE (PREFIX_0FE7
) },
1317 { "psubsb", { MX
, EM
} },
1318 { "psubsw", { MX
, EM
} },
1319 { "pminsw", { MX
, EM
} },
1320 { "por", { MX
, EM
} },
1321 { "paddsb", { MX
, EM
} },
1322 { "paddsw", { MX
, EM
} },
1323 { "pmaxsw", { MX
, EM
} },
1324 { "pxor", { MX
, EM
} },
1326 { PREFIX_TABLE (PREFIX_0FF0
) },
1327 { "psllw", { MX
, EM
} },
1328 { "pslld", { MX
, EM
} },
1329 { "psllq", { MX
, EM
} },
1330 { "pmuludq", { MX
, EM
} },
1331 { "pmaddwd", { MX
, EM
} },
1332 { "psadbw", { MX
, EM
} },
1333 { PREFIX_TABLE (PREFIX_0FF7
) },
1335 { "psubb", { MX
, EM
} },
1336 { "psubw", { MX
, EM
} },
1337 { "psubd", { MX
, EM
} },
1338 { "psubq", { MX
, EM
} },
1339 { "paddb", { MX
, EM
} },
1340 { "paddw", { MX
, EM
} },
1341 { "paddd", { MX
, EM
} },
1342 { "(bad)", { XX
} },
1345 static const unsigned char onebyte_has_modrm
[256] = {
1346 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1347 /* ------------------------------- */
1348 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
1349 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
1350 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
1351 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
1352 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
1353 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
1354 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
1355 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
1356 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
1357 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
1358 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
1359 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
1360 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
1361 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
1362 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
1363 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
1364 /* ------------------------------- */
1365 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1368 static const unsigned char twobyte_has_modrm
[256] = {
1369 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1370 /* ------------------------------- */
1371 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
1372 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
1373 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
1374 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
1375 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
1376 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
1377 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
1378 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
1379 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
1380 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
1381 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
1382 /* b0 */ 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, /* bf */
1383 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
1384 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
1385 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
1386 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 /* ff */
1387 /* ------------------------------- */
1388 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1391 static char obuf
[100];
1393 static char scratchbuf
[100];
1394 static unsigned char *start_codep
;
1395 static unsigned char *insn_codep
;
1396 static unsigned char *codep
;
1397 static const char *lock_prefix
;
1398 static const char *data_prefix
;
1399 static const char *addr_prefix
;
1400 static const char *repz_prefix
;
1401 static const char *repnz_prefix
;
1402 static disassemble_info
*the_info
;
1410 static unsigned char need_modrm
;
1412 /* If we are accessing mod/rm/reg without need_modrm set, then the
1413 values are stale. Hitting this abort likely indicates that you
1414 need to update onebyte_has_modrm or twobyte_has_modrm. */
1415 #define MODRM_CHECK if (!need_modrm) abort ()
1417 static const char **names64
;
1418 static const char **names32
;
1419 static const char **names16
;
1420 static const char **names8
;
1421 static const char **names8rex
;
1422 static const char **names_seg
;
1423 static const char *index64
;
1424 static const char *index32
;
1425 static const char **index16
;
1427 static const char *intel_names64
[] = {
1428 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
1429 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
1431 static const char *intel_names32
[] = {
1432 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
1433 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
1435 static const char *intel_names16
[] = {
1436 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
1437 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
1439 static const char *intel_names8
[] = {
1440 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
1442 static const char *intel_names8rex
[] = {
1443 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
1444 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
1446 static const char *intel_names_seg
[] = {
1447 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
1449 static const char *intel_index64
= "riz";
1450 static const char *intel_index32
= "eiz";
1451 static const char *intel_index16
[] = {
1452 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
1455 static const char *att_names64
[] = {
1456 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
1457 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
1459 static const char *att_names32
[] = {
1460 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
1461 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
1463 static const char *att_names16
[] = {
1464 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
1465 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
1467 static const char *att_names8
[] = {
1468 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
1470 static const char *att_names8rex
[] = {
1471 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
1472 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
1474 static const char *att_names_seg
[] = {
1475 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
1477 static const char *att_index64
= "%riz";
1478 static const char *att_index32
= "%eiz";
1479 static const char *att_index16
[] = {
1480 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
1483 static const struct dis386 reg_table
[][8] = {
1486 { "addA", { Eb
, Ib
} },
1487 { "orA", { Eb
, Ib
} },
1488 { "adcA", { Eb
, Ib
} },
1489 { "sbbA", { Eb
, Ib
} },
1490 { "andA", { Eb
, Ib
} },
1491 { "subA", { Eb
, Ib
} },
1492 { "xorA", { Eb
, Ib
} },
1493 { "cmpA", { Eb
, Ib
} },
1497 { "addQ", { Ev
, Iv
} },
1498 { "orQ", { Ev
, Iv
} },
1499 { "adcQ", { Ev
, Iv
} },
1500 { "sbbQ", { Ev
, Iv
} },
1501 { "andQ", { Ev
, Iv
} },
1502 { "subQ", { Ev
, Iv
} },
1503 { "xorQ", { Ev
, Iv
} },
1504 { "cmpQ", { Ev
, Iv
} },
1508 { "addQ", { Ev
, sIb
} },
1509 { "orQ", { Ev
, sIb
} },
1510 { "adcQ", { Ev
, sIb
} },
1511 { "sbbQ", { Ev
, sIb
} },
1512 { "andQ", { Ev
, sIb
} },
1513 { "subQ", { Ev
, sIb
} },
1514 { "xorQ", { Ev
, sIb
} },
1515 { "cmpQ", { Ev
, sIb
} },
1519 { "popU", { stackEv
} },
1520 { "(bad)", { XX
} },
1521 { "(bad)", { XX
} },
1522 { "(bad)", { XX
} },
1523 { "(bad)", { XX
} },
1524 { "(bad)", { XX
} },
1525 { "(bad)", { XX
} },
1526 { "(bad)", { XX
} },
1530 { "rolA", { Eb
, Ib
} },
1531 { "rorA", { Eb
, Ib
} },
1532 { "rclA", { Eb
, Ib
} },
1533 { "rcrA", { Eb
, Ib
} },
1534 { "shlA", { Eb
, Ib
} },
1535 { "shrA", { Eb
, Ib
} },
1536 { "(bad)", { XX
} },
1537 { "sarA", { Eb
, Ib
} },
1541 { "rolQ", { Ev
, Ib
} },
1542 { "rorQ", { Ev
, Ib
} },
1543 { "rclQ", { Ev
, Ib
} },
1544 { "rcrQ", { Ev
, Ib
} },
1545 { "shlQ", { Ev
, Ib
} },
1546 { "shrQ", { Ev
, Ib
} },
1547 { "(bad)", { XX
} },
1548 { "sarQ", { Ev
, Ib
} },
1552 { "movA", { Eb
, Ib
} },
1553 { "(bad)", { XX
} },
1554 { "(bad)", { XX
} },
1555 { "(bad)", { XX
} },
1556 { "(bad)", { XX
} },
1557 { "(bad)", { XX
} },
1558 { "(bad)", { XX
} },
1559 { "(bad)", { XX
} },
1563 { "movQ", { Ev
, Iv
} },
1564 { "(bad)", { XX
} },
1565 { "(bad)", { XX
} },
1566 { "(bad)", { XX
} },
1567 { "(bad)", { XX
} },
1568 { "(bad)", { XX
} },
1569 { "(bad)", { XX
} },
1570 { "(bad)", { XX
} },
1574 { "rolA", { Eb
, I1
} },
1575 { "rorA", { Eb
, I1
} },
1576 { "rclA", { Eb
, I1
} },
1577 { "rcrA", { Eb
, I1
} },
1578 { "shlA", { Eb
, I1
} },
1579 { "shrA", { Eb
, I1
} },
1580 { "(bad)", { XX
} },
1581 { "sarA", { Eb
, I1
} },
1585 { "rolQ", { Ev
, I1
} },
1586 { "rorQ", { Ev
, I1
} },
1587 { "rclQ", { Ev
, I1
} },
1588 { "rcrQ", { Ev
, I1
} },
1589 { "shlQ", { Ev
, I1
} },
1590 { "shrQ", { Ev
, I1
} },
1591 { "(bad)", { XX
} },
1592 { "sarQ", { Ev
, I1
} },
1596 { "rolA", { Eb
, CL
} },
1597 { "rorA", { Eb
, CL
} },
1598 { "rclA", { Eb
, CL
} },
1599 { "rcrA", { Eb
, CL
} },
1600 { "shlA", { Eb
, CL
} },
1601 { "shrA", { Eb
, CL
} },
1602 { "(bad)", { XX
} },
1603 { "sarA", { Eb
, CL
} },
1607 { "rolQ", { Ev
, CL
} },
1608 { "rorQ", { Ev
, CL
} },
1609 { "rclQ", { Ev
, CL
} },
1610 { "rcrQ", { Ev
, CL
} },
1611 { "shlQ", { Ev
, CL
} },
1612 { "shrQ", { Ev
, CL
} },
1613 { "(bad)", { XX
} },
1614 { "sarQ", { Ev
, CL
} },
1618 { "testA", { Eb
, Ib
} },
1619 { "(bad)", { XX
} },
1622 { "mulA", { Eb
} }, /* Don't print the implicit %al register, */
1623 { "imulA", { Eb
} }, /* to distinguish these opcodes from other */
1624 { "divA", { Eb
} }, /* mul/imul opcodes. Do the same for div */
1625 { "idivA", { Eb
} }, /* and idiv for consistency. */
1629 { "testQ", { Ev
, Iv
} },
1630 { "(bad)", { XX
} },
1633 { "mulQ", { Ev
} }, /* Don't print the implicit register. */
1634 { "imulQ", { Ev
} },
1636 { "idivQ", { Ev
} },
1642 { "(bad)", { XX
} },
1643 { "(bad)", { XX
} },
1644 { "(bad)", { XX
} },
1645 { "(bad)", { XX
} },
1646 { "(bad)", { XX
} },
1647 { "(bad)", { XX
} },
1653 { "callT", { indirEv
} },
1654 { "JcallT", { indirEp
} },
1655 { "jmpT", { indirEv
} },
1656 { "JjmpT", { indirEp
} },
1657 { "pushU", { stackEv
} },
1658 { "(bad)", { XX
} },
1662 { "sldtD", { Sv
} },
1668 { "(bad)", { XX
} },
1669 { "(bad)", { XX
} },
1673 { MOD_TABLE (MOD_0F01_REG_0
) },
1674 { MOD_TABLE (MOD_0F01_REG_1
) },
1675 { MOD_TABLE (MOD_0F01_REG_2
) },
1676 { MOD_TABLE (MOD_0F01_REG_3
) },
1677 { "smswD", { Sv
} },
1678 { "(bad)", { XX
} },
1680 { MOD_TABLE (MOD_0F01_REG_7
) },
1684 { "prefetch", { Eb
} },
1685 { "prefetchw", { Eb
} },
1686 { "(bad)", { XX
} },
1687 { "(bad)", { XX
} },
1688 { "(bad)", { XX
} },
1689 { "(bad)", { XX
} },
1690 { "(bad)", { XX
} },
1691 { "(bad)", { XX
} },
1695 { MOD_TABLE (MOD_0F18_REG_0
) },
1696 { MOD_TABLE (MOD_0F18_REG_1
) },
1697 { MOD_TABLE (MOD_0F18_REG_2
) },
1698 { MOD_TABLE (MOD_0F18_REG_3
) },
1699 { "(bad)", { XX
} },
1700 { "(bad)", { XX
} },
1701 { "(bad)", { XX
} },
1702 { "(bad)", { XX
} },
1706 { "(bad)", { XX
} },
1707 { "(bad)", { XX
} },
1708 { MOD_TABLE (MOD_0F71_REG_2
) },
1709 { "(bad)", { XX
} },
1710 { MOD_TABLE (MOD_0F71_REG_4
) },
1711 { "(bad)", { XX
} },
1712 { MOD_TABLE (MOD_0F71_REG_6
) },
1713 { "(bad)", { XX
} },
1717 { "(bad)", { XX
} },
1718 { "(bad)", { XX
} },
1719 { MOD_TABLE (MOD_0F72_REG_2
) },
1720 { "(bad)", { XX
} },
1721 { MOD_TABLE (MOD_0F72_REG_4
) },
1722 { "(bad)", { XX
} },
1723 { MOD_TABLE (MOD_0F72_REG_6
) },
1724 { "(bad)", { XX
} },
1728 { "(bad)", { XX
} },
1729 { "(bad)", { XX
} },
1730 { MOD_TABLE (MOD_0F73_REG_2
) },
1731 { MOD_TABLE (MOD_0F73_REG_3
) },
1732 { "(bad)", { XX
} },
1733 { "(bad)", { XX
} },
1734 { MOD_TABLE (MOD_0F73_REG_6
) },
1735 { MOD_TABLE (MOD_0F73_REG_7
) },
1739 { "montmul", { { OP_0f07
, 0 } } },
1740 { "xsha1", { { OP_0f07
, 0 } } },
1741 { "xsha256", { { OP_0f07
, 0 } } },
1742 { "(bad)", { { OP_0f07
, 0 } } },
1743 { "(bad)", { { OP_0f07
, 0 } } },
1744 { "(bad)", { { OP_0f07
, 0 } } },
1745 { "(bad)", { { OP_0f07
, 0 } } },
1746 { "(bad)", { { OP_0f07
, 0 } } },
1750 { "xstore-rng", { { OP_0f07
, 0 } } },
1751 { "xcrypt-ecb", { { OP_0f07
, 0 } } },
1752 { "xcrypt-cbc", { { OP_0f07
, 0 } } },
1753 { "xcrypt-ctr", { { OP_0f07
, 0 } } },
1754 { "xcrypt-cfb", { { OP_0f07
, 0 } } },
1755 { "xcrypt-ofb", { { OP_0f07
, 0 } } },
1756 { "(bad)", { { OP_0f07
, 0 } } },
1757 { "(bad)", { { OP_0f07
, 0 } } },
1761 { MOD_TABLE (MOD_0FAE_REG_0
) },
1762 { MOD_TABLE (MOD_0FAE_REG_1
) },
1763 { MOD_TABLE (MOD_0FAE_REG_2
) },
1764 { MOD_TABLE (MOD_0FAE_REG_3
) },
1765 { "(bad)", { XX
} },
1766 { MOD_TABLE (MOD_0FAE_REG_5
) },
1767 { MOD_TABLE (MOD_0FAE_REG_6
) },
1768 { MOD_TABLE (MOD_0FAE_REG_7
) },
1772 { "(bad)", { XX
} },
1773 { "(bad)", { XX
} },
1774 { "(bad)", { XX
} },
1775 { "(bad)", { XX
} },
1776 { "btQ", { Ev
, Ib
} },
1777 { "btsQ", { Ev
, Ib
} },
1778 { "btrQ", { Ev
, Ib
} },
1779 { "btcQ", { Ev
, Ib
} },
1783 { "(bad)", { XX
} },
1784 { "cmpxchg8b", { { CMPXCHG8B_Fixup
, q_mode
} } },
1785 { "(bad)", { XX
} },
1786 { "(bad)", { XX
} },
1787 { "(bad)", { XX
} },
1788 { "(bad)", { XX
} },
1789 { MOD_TABLE (MOD_0FC7_REG_6
) },
1790 { MOD_TABLE (MOD_0FC7_REG_7
) },
1794 static const struct dis386 prefix_table
[][4] = {
1797 { "xchgS", { { NOP_Fixup1
, eAX_reg
}, { NOP_Fixup2
, eAX_reg
} } },
1798 { "pause", { XX
} },
1799 { "xchgS", { { NOP_Fixup1
, eAX_reg
}, { NOP_Fixup2
, eAX_reg
} } },
1800 { "(bad)", { XX
} },
1805 { "movups", { XM
, EXx
} },
1806 { "movss", { XM
, EXd
} },
1807 { "movupd", { XM
, EXx
} },
1808 { "movsd", { XM
, EXq
} },
1813 { "movups", { EXx
, XM
} },
1814 { "movss", { EXd
, XM
} },
1815 { "movupd", { EXx
, XM
} },
1816 { "movsd", { EXq
, XM
} },
1821 { MOD_TABLE (MOD_0F12_PREFIX_0
) },
1822 { "movsldup", { XM
, EXx
} },
1823 { "movlpd", { XM
, EXq
} },
1824 { "movddup", { XM
, EXq
} },
1829 { MOD_TABLE (MOD_0F16_PREFIX_0
) },
1830 { "movshdup", { XM
, EXx
} },
1831 { "movhpd", { XM
, EXq
} },
1832 { "(bad)", { XX
} },
1837 { "cvtpi2ps", { XM
, EMCq
} },
1838 { "cvtsi2ss%LQ", { XM
, Ev
} },
1839 { "cvtpi2pd", { XM
, EMCq
} },
1840 { "cvtsi2sd%LQ", { XM
, Ev
} },
1845 { MOD_TABLE (MOD_0F2B_PREFIX_0
) },
1846 { MOD_TABLE (MOD_0F2B_PREFIX_1
) },
1847 { MOD_TABLE (MOD_0F2B_PREFIX_2
) },
1848 { MOD_TABLE (MOD_0F2B_PREFIX_3
) },
1853 { "cvttps2pi", { MXC
, EXq
} },
1854 { "cvttss2siY", { Gv
, EXd
} },
1855 { "cvttpd2pi", { MXC
, EXx
} },
1856 { "cvttsd2siY", { Gv
, EXq
} },
1861 { "cvtps2pi", { MXC
, EXq
} },
1862 { "cvtss2siY", { Gv
, EXd
} },
1863 { "cvtpd2pi", { MXC
, EXx
} },
1864 { "cvtsd2siY", { Gv
, EXq
} },
1869 { "ucomiss",{ XM
, EXd
} },
1870 { "(bad)", { XX
} },
1871 { "ucomisd",{ XM
, EXq
} },
1872 { "(bad)", { XX
} },
1877 { "comiss", { XM
, EXd
} },
1878 { "(bad)", { XX
} },
1879 { "comisd", { XM
, EXq
} },
1880 { "(bad)", { XX
} },
1885 { "sqrtps", { XM
, EXx
} },
1886 { "sqrtss", { XM
, EXd
} },
1887 { "sqrtpd", { XM
, EXx
} },
1888 { "sqrtsd", { XM
, EXq
} },
1893 { "rsqrtps",{ XM
, EXx
} },
1894 { "rsqrtss",{ XM
, EXd
} },
1895 { "(bad)", { XX
} },
1896 { "(bad)", { XX
} },
1901 { "rcpps", { XM
, EXx
} },
1902 { "rcpss", { XM
, EXd
} },
1903 { "(bad)", { XX
} },
1904 { "(bad)", { XX
} },
1909 { "addps", { XM
, EXx
} },
1910 { "addss", { XM
, EXd
} },
1911 { "addpd", { XM
, EXx
} },
1912 { "addsd", { XM
, EXq
} },
1917 { "mulps", { XM
, EXx
} },
1918 { "mulss", { XM
, EXd
} },
1919 { "mulpd", { XM
, EXx
} },
1920 { "mulsd", { XM
, EXq
} },
1925 { "cvtps2pd", { XM
, EXq
} },
1926 { "cvtss2sd", { XM
, EXd
} },
1927 { "cvtpd2ps", { XM
, EXx
} },
1928 { "cvtsd2ss", { XM
, EXq
} },
1933 { "cvtdq2ps", { XM
, EXx
} },
1934 { "cvttps2dq", { XM
, EXx
} },
1935 { "cvtps2dq", { XM
, EXx
} },
1936 { "(bad)", { XX
} },
1941 { "subps", { XM
, EXx
} },
1942 { "subss", { XM
, EXd
} },
1943 { "subpd", { XM
, EXx
} },
1944 { "subsd", { XM
, EXq
} },
1949 { "minps", { XM
, EXx
} },
1950 { "minss", { XM
, EXd
} },
1951 { "minpd", { XM
, EXx
} },
1952 { "minsd", { XM
, EXq
} },
1957 { "divps", { XM
, EXx
} },
1958 { "divss", { XM
, EXd
} },
1959 { "divpd", { XM
, EXx
} },
1960 { "divsd", { XM
, EXq
} },
1965 { "maxps", { XM
, EXx
} },
1966 { "maxss", { XM
, EXd
} },
1967 { "maxpd", { XM
, EXx
} },
1968 { "maxsd", { XM
, EXq
} },
1973 { "punpcklbw",{ MX
, EMd
} },
1974 { "(bad)", { XX
} },
1975 { "punpcklbw",{ MX
, EMx
} },
1976 { "(bad)", { XX
} },
1981 { "punpcklwd",{ MX
, EMd
} },
1982 { "(bad)", { XX
} },
1983 { "punpcklwd",{ MX
, EMx
} },
1984 { "(bad)", { XX
} },
1989 { "punpckldq",{ MX
, EMd
} },
1990 { "(bad)", { XX
} },
1991 { "punpckldq",{ MX
, EMx
} },
1992 { "(bad)", { XX
} },
1997 { "(bad)", { XX
} },
1998 { "(bad)", { XX
} },
1999 { "punpcklqdq", { XM
, EXx
} },
2000 { "(bad)", { XX
} },
2005 { "(bad)", { XX
} },
2006 { "(bad)", { XX
} },
2007 { "punpckhqdq", { XM
, EXx
} },
2008 { "(bad)", { XX
} },
2013 { "movq", { MX
, EM
} },
2014 { "movdqu", { XM
, EXx
} },
2015 { "movdqa", { XM
, EXx
} },
2016 { "(bad)", { XX
} },
2021 { "pshufw", { MX
, EM
, Ib
} },
2022 { "pshufhw",{ XM
, EXx
, Ib
} },
2023 { "pshufd", { XM
, EXx
, Ib
} },
2024 { "pshuflw",{ XM
, EXx
, Ib
} },
2027 /* PREFIX_0F73_REG_3 */
2029 { "(bad)", { XX
} },
2030 { "(bad)", { XX
} },
2031 { "psrldq", { XS
, Ib
} },
2032 { "(bad)", { XX
} },
2035 /* PREFIX_0F73_REG_7 */
2037 { "(bad)", { XX
} },
2038 { "(bad)", { XX
} },
2039 { "pslldq", { XS
, Ib
} },
2040 { "(bad)", { XX
} },
2045 {"vmread", { Em
, Gm
} },
2047 {"extrq", { XS
, Ib
, Ib
} },
2048 {"insertq", { XM
, XS
, Ib
, Ib
} },
2053 {"vmwrite", { Gm
, Em
} },
2055 {"extrq", { XM
, XS
} },
2056 {"insertq", { XM
, XS
} },
2061 { "(bad)", { XX
} },
2062 { "(bad)", { XX
} },
2063 { "haddpd", { XM
, EXx
} },
2064 { "haddps", { XM
, EXx
} },
2069 { "(bad)", { XX
} },
2070 { "(bad)", { XX
} },
2071 { "hsubpd", { XM
, EXx
} },
2072 { "hsubps", { XM
, EXx
} },
2077 { "movK", { Edq
, MX
} },
2078 { "movq", { XM
, EXq
} },
2079 { "movK", { Edq
, XM
} },
2080 { "(bad)", { XX
} },
2085 { "movq", { EM
, MX
} },
2086 { "movdqu", { EXx
, XM
} },
2087 { "movdqa", { EXx
, XM
} },
2088 { "(bad)", { XX
} },
2093 { "(bad)", { XX
} },
2094 { "popcntS", { Gv
, Ev
} },
2095 { "(bad)", { XX
} },
2096 { "(bad)", { XX
} },
2101 { "bsrS", { Gv
, Ev
} },
2102 { "lzcntS", { Gv
, Ev
} },
2103 { "bsrS", { Gv
, Ev
} },
2104 { "(bad)", { XX
} },
2109 { "cmpps", { XM
, EXx
, CMP
} },
2110 { "cmpss", { XM
, EXd
, CMP
} },
2111 { "cmppd", { XM
, EXx
, CMP
} },
2112 { "cmpsd", { XM
, EXq
, CMP
} },
2115 /* PREFIX_0FC7_REG_6 */
2117 { "vmptrld",{ Mq
} },
2118 { "vmxon", { Mq
} },
2119 { "vmclear",{ Mq
} },
2120 { "(bad)", { XX
} },
2125 { "(bad)", { XX
} },
2126 { "(bad)", { XX
} },
2127 { "addsubpd", { XM
, EXx
} },
2128 { "addsubps", { XM
, EXx
} },
2133 { "(bad)", { XX
} },
2134 { "movq2dq",{ XM
, MS
} },
2135 { "movq", { EXq
, XM
} },
2136 { "movdq2q",{ MX
, XS
} },
2141 { "(bad)", { XX
} },
2142 { "cvtdq2pd", { XM
, EXq
} },
2143 { "cvttpd2dq", { XM
, EXx
} },
2144 { "cvtpd2dq", { XM
, EXx
} },
2149 { "movntq", { EM
, MX
} },
2150 { "(bad)", { XX
} },
2151 { MOD_TABLE (MOD_0FE7_PREFIX_2
) },
2152 { "(bad)", { XX
} },
2157 { "(bad)", { XX
} },
2158 { "(bad)", { XX
} },
2159 { "(bad)", { XX
} },
2160 { MOD_TABLE (MOD_0FF0_PREFIX_3
) },
2165 { "maskmovq", { MX
, MS
} },
2166 { "(bad)", { XX
} },
2167 { "maskmovdqu", { XM
, XS
} },
2168 { "(bad)", { XX
} },
2173 { "(bad)", { XX
} },
2174 { "(bad)", { XX
} },
2175 { "pblendvb", { XM
, EXx
, XMM0
} },
2176 { "(bad)", { XX
} },
2181 { "(bad)", { XX
} },
2182 { "(bad)", { XX
} },
2183 { "blendvps", { XM
, EXx
, XMM0
} },
2184 { "(bad)", { XX
} },
2189 { "(bad)", { XX
} },
2190 { "(bad)", { XX
} },
2191 { "blendvpd", { XM
, EXx
, XMM0
} },
2192 { "(bad)", { XX
} },
2197 { "(bad)", { XX
} },
2198 { "(bad)", { XX
} },
2199 { "ptest", { XM
, EXx
} },
2200 { "(bad)", { XX
} },
2205 { "(bad)", { XX
} },
2206 { "(bad)", { XX
} },
2207 { "pmovsxbw", { XM
, EXq
} },
2208 { "(bad)", { XX
} },
2213 { "(bad)", { XX
} },
2214 { "(bad)", { XX
} },
2215 { "pmovsxbd", { XM
, EXd
} },
2216 { "(bad)", { XX
} },
2221 { "(bad)", { XX
} },
2222 { "(bad)", { XX
} },
2223 { "pmovsxbq", { XM
, EXw
} },
2224 { "(bad)", { XX
} },
2229 { "(bad)", { XX
} },
2230 { "(bad)", { XX
} },
2231 { "pmovsxwd", { XM
, EXq
} },
2232 { "(bad)", { XX
} },
2237 { "(bad)", { XX
} },
2238 { "(bad)", { XX
} },
2239 { "pmovsxwq", { XM
, EXd
} },
2240 { "(bad)", { XX
} },
2245 { "(bad)", { XX
} },
2246 { "(bad)", { XX
} },
2247 { "pmovsxdq", { XM
, EXq
} },
2248 { "(bad)", { XX
} },
2253 { "(bad)", { XX
} },
2254 { "(bad)", { XX
} },
2255 { "pmuldq", { XM
, EXx
} },
2256 { "(bad)", { XX
} },
2261 { "(bad)", { XX
} },
2262 { "(bad)", { XX
} },
2263 { "pcmpeqq", { XM
, EXx
} },
2264 { "(bad)", { XX
} },
2269 { "(bad)", { XX
} },
2270 { "(bad)", { XX
} },
2271 { MOD_TABLE (MOD_0F382A_PREFIX_2
) },
2272 { "(bad)", { XX
} },
2277 { "(bad)", { XX
} },
2278 { "(bad)", { XX
} },
2279 { "packusdw", { XM
, EXx
} },
2280 { "(bad)", { XX
} },
2285 { "(bad)", { XX
} },
2286 { "(bad)", { XX
} },
2287 { "pmovzxbw", { XM
, EXq
} },
2288 { "(bad)", { XX
} },
2293 { "(bad)", { XX
} },
2294 { "(bad)", { XX
} },
2295 { "pmovzxbd", { XM
, EXd
} },
2296 { "(bad)", { XX
} },
2301 { "(bad)", { XX
} },
2302 { "(bad)", { XX
} },
2303 { "pmovzxbq", { XM
, EXw
} },
2304 { "(bad)", { XX
} },
2309 { "(bad)", { XX
} },
2310 { "(bad)", { XX
} },
2311 { "pmovzxwd", { XM
, EXq
} },
2312 { "(bad)", { XX
} },
2317 { "(bad)", { XX
} },
2318 { "(bad)", { XX
} },
2319 { "pmovzxwq", { XM
, EXd
} },
2320 { "(bad)", { XX
} },
2325 { "(bad)", { XX
} },
2326 { "(bad)", { XX
} },
2327 { "pmovzxdq", { XM
, EXq
} },
2328 { "(bad)", { XX
} },
2333 { "(bad)", { XX
} },
2334 { "(bad)", { XX
} },
2335 { "pcmpgtq", { XM
, EXx
} },
2336 { "(bad)", { XX
} },
2341 { "(bad)", { XX
} },
2342 { "(bad)", { XX
} },
2343 { "pminsb", { XM
, EXx
} },
2344 { "(bad)", { XX
} },
2349 { "(bad)", { XX
} },
2350 { "(bad)", { XX
} },
2351 { "pminsd", { XM
, EXx
} },
2352 { "(bad)", { XX
} },
2357 { "(bad)", { XX
} },
2358 { "(bad)", { XX
} },
2359 { "pminuw", { XM
, EXx
} },
2360 { "(bad)", { XX
} },
2365 { "(bad)", { XX
} },
2366 { "(bad)", { XX
} },
2367 { "pminud", { XM
, EXx
} },
2368 { "(bad)", { XX
} },
2373 { "(bad)", { XX
} },
2374 { "(bad)", { XX
} },
2375 { "pmaxsb", { XM
, EXx
} },
2376 { "(bad)", { XX
} },
2381 { "(bad)", { XX
} },
2382 { "(bad)", { XX
} },
2383 { "pmaxsd", { XM
, EXx
} },
2384 { "(bad)", { XX
} },
2389 { "(bad)", { XX
} },
2390 { "(bad)", { XX
} },
2391 { "pmaxuw", { XM
, EXx
} },
2392 { "(bad)", { XX
} },
2397 { "(bad)", { XX
} },
2398 { "(bad)", { XX
} },
2399 { "pmaxud", { XM
, EXx
} },
2400 { "(bad)", { XX
} },
2405 { "(bad)", { XX
} },
2406 { "(bad)", { XX
} },
2407 { "pmulld", { XM
, EXx
} },
2408 { "(bad)", { XX
} },
2413 { "(bad)", { XX
} },
2414 { "(bad)", { XX
} },
2415 { "phminposuw", { XM
, EXx
} },
2416 { "(bad)", { XX
} },
2421 { "(bad)", { XX
} },
2422 { "(bad)", { XX
} },
2423 { "(bad)", { XX
} },
2424 { "crc32", { Gdq
, { CRC32_Fixup
, b_mode
} } },
2429 { "(bad)", { XX
} },
2430 { "(bad)", { XX
} },
2431 { "(bad)", { XX
} },
2432 { "crc32", { Gdq
, { CRC32_Fixup
, v_mode
} } },
2437 { "(bad)", { XX
} },
2438 { "(bad)", { XX
} },
2439 { "roundps", { XM
, EXx
, Ib
} },
2440 { "(bad)", { XX
} },
2445 { "(bad)", { XX
} },
2446 { "(bad)", { XX
} },
2447 { "roundpd", { XM
, EXx
, Ib
} },
2448 { "(bad)", { XX
} },
2453 { "(bad)", { XX
} },
2454 { "(bad)", { XX
} },
2455 { "roundss", { XM
, EXd
, Ib
} },
2456 { "(bad)", { XX
} },
2461 { "(bad)", { XX
} },
2462 { "(bad)", { XX
} },
2463 { "roundsd", { XM
, EXq
, Ib
} },
2464 { "(bad)", { XX
} },
2469 { "(bad)", { XX
} },
2470 { "(bad)", { XX
} },
2471 { "blendps", { XM
, EXx
, Ib
} },
2472 { "(bad)", { XX
} },
2477 { "(bad)", { XX
} },
2478 { "(bad)", { XX
} },
2479 { "blendpd", { XM
, EXx
, Ib
} },
2480 { "(bad)", { XX
} },
2485 { "(bad)", { XX
} },
2486 { "(bad)", { XX
} },
2487 { "pblendw", { XM
, EXx
, Ib
} },
2488 { "(bad)", { XX
} },
2493 { "(bad)", { XX
} },
2494 { "(bad)", { XX
} },
2495 { "pextrb", { Edqb
, XM
, Ib
} },
2496 { "(bad)", { XX
} },
2501 { "(bad)", { XX
} },
2502 { "(bad)", { XX
} },
2503 { "pextrw", { Edqw
, XM
, Ib
} },
2504 { "(bad)", { XX
} },
2509 { "(bad)", { XX
} },
2510 { "(bad)", { XX
} },
2511 { "pextrK", { Edq
, XM
, Ib
} },
2512 { "(bad)", { XX
} },
2517 { "(bad)", { XX
} },
2518 { "(bad)", { XX
} },
2519 { "extractps", { Edqd
, XM
, Ib
} },
2520 { "(bad)", { XX
} },
2525 { "(bad)", { XX
} },
2526 { "(bad)", { XX
} },
2527 { "pinsrb", { XM
, Edqb
, Ib
} },
2528 { "(bad)", { XX
} },
2533 { "(bad)", { XX
} },
2534 { "(bad)", { XX
} },
2535 { "insertps", { XM
, EXd
, Ib
} },
2536 { "(bad)", { XX
} },
2541 { "(bad)", { XX
} },
2542 { "(bad)", { XX
} },
2543 { "pinsrK", { XM
, Edq
, Ib
} },
2544 { "(bad)", { XX
} },
2549 { "(bad)", { XX
} },
2550 { "(bad)", { XX
} },
2551 { "dpps", { XM
, EXx
, Ib
} },
2552 { "(bad)", { XX
} },
2557 { "(bad)", { XX
} },
2558 { "(bad)", { XX
} },
2559 { "dppd", { XM
, EXx
, Ib
} },
2560 { "(bad)", { XX
} },
2565 { "(bad)", { XX
} },
2566 { "(bad)", { XX
} },
2567 { "mpsadbw", { XM
, EXx
, Ib
} },
2568 { "(bad)", { XX
} },
2573 { "(bad)", { XX
} },
2574 { "(bad)", { XX
} },
2575 { "pcmpestrm", { XM
, EXx
, Ib
} },
2576 { "(bad)", { XX
} },
2581 { "(bad)", { XX
} },
2582 { "(bad)", { XX
} },
2583 { "pcmpestri", { XM
, EXx
, Ib
} },
2584 { "(bad)", { XX
} },
2589 { "(bad)", { XX
} },
2590 { "(bad)", { XX
} },
2591 { "pcmpistrm", { XM
, EXx
, Ib
} },
2592 { "(bad)", { XX
} },
2597 { "(bad)", { XX
} },
2598 { "(bad)", { XX
} },
2599 { "pcmpistri", { XM
, EXx
, Ib
} },
2600 { "(bad)", { XX
} },
2604 static const struct dis386 x86_64_table
[][2] = {
2607 { "push{T|}", { es
} },
2608 { "(bad)", { XX
} },
2613 { "pop{T|}", { es
} },
2614 { "(bad)", { XX
} },
2619 { "push{T|}", { cs
} },
2620 { "(bad)", { XX
} },
2625 { "push{T|}", { ss
} },
2626 { "(bad)", { XX
} },
2631 { "pop{T|}", { ss
} },
2632 { "(bad)", { XX
} },
2637 { "push{T|}", { ds
} },
2638 { "(bad)", { XX
} },
2643 { "pop{T|}", { ds
} },
2644 { "(bad)", { XX
} },
2650 { "(bad)", { XX
} },
2656 { "(bad)", { XX
} },
2662 { "(bad)", { XX
} },
2668 { "(bad)", { XX
} },
2673 { "pusha{P|}", { XX
} },
2674 { "(bad)", { XX
} },
2679 { "popa{P|}", { XX
} },
2680 { "(bad)", { XX
} },
2685 { MOD_TABLE (MOD_62_32BIT
) },
2686 { "(bad)", { XX
} },
2691 { "arpl", { Ew
, Gw
} },
2692 { "movs{lq|xd}", { Gv
, Ed
} },
2697 { "ins{R|}", { Yzr
, indirDX
} },
2698 { "ins{G|}", { Yzr
, indirDX
} },
2703 { "outs{R|}", { indirDXr
, Xz
} },
2704 { "outs{G|}", { indirDXr
, Xz
} },
2709 { "Jcall{T|}", { Ap
} },
2710 { "(bad)", { XX
} },
2715 { MOD_TABLE (MOD_C4_32BIT
) },
2716 { "(bad)", { XX
} },
2721 { MOD_TABLE (MOD_C5_32BIT
) },
2722 { "(bad)", { XX
} },
2728 { "(bad)", { XX
} },
2734 { "(bad)", { XX
} },
2740 { "(bad)", { XX
} },
2745 { "Jjmp{T|}", { Ap
} },
2746 { "(bad)", { XX
} },
2749 /* X86_64_0F01_REG_0 */
2751 { "sgdt{Q|IQ}", { M
} },
2755 /* X86_64_0F01_REG_1 */
2757 { "sidt{Q|IQ}", { M
} },
2761 /* X86_64_0F01_REG_2 */
2763 { "lgdt{Q|Q}", { M
} },
2767 /* X86_64_0F01_REG_3 */
2769 { "lidt{Q|Q}", { M
} },
2774 static const struct dis386 three_byte_table
[][256] = {
2775 /* THREE_BYTE_0F24 */
2778 { "fmaddps", { { OP_DREX4
, q_mode
} } },
2779 { "fmaddpd", { { OP_DREX4
, q_mode
} } },
2780 { "fmaddss", { { OP_DREX4
, w_mode
} } },
2781 { "fmaddsd", { { OP_DREX4
, d_mode
} } },
2782 { "fmaddps", { { OP_DREX4
, DREX_OC1
+ q_mode
} } },
2783 { "fmaddpd", { { OP_DREX4
, DREX_OC1
+ q_mode
} } },
2784 { "fmaddss", { { OP_DREX4
, DREX_OC1
+ w_mode
} } },
2785 { "fmaddsd", { { OP_DREX4
, DREX_OC1
+ d_mode
} } },
2787 { "fmsubps", { { OP_DREX4
, q_mode
} } },
2788 { "fmsubpd", { { OP_DREX4
, q_mode
} } },
2789 { "fmsubss", { { OP_DREX4
, w_mode
} } },
2790 { "fmsubsd", { { OP_DREX4
, d_mode
} } },
2791 { "fmsubps", { { OP_DREX4
, DREX_OC1
+ q_mode
} } },
2792 { "fmsubpd", { { OP_DREX4
, DREX_OC1
+ q_mode
} } },
2793 { "fmsubss", { { OP_DREX4
, DREX_OC1
+ w_mode
} } },
2794 { "fmsubsd", { { OP_DREX4
, DREX_OC1
+ d_mode
} } },
2796 { "fnmaddps", { { OP_DREX4
, q_mode
} } },
2797 { "fnmaddpd", { { OP_DREX4
, q_mode
} } },
2798 { "fnmaddss", { { OP_DREX4
, w_mode
} } },
2799 { "fnmaddsd", { { OP_DREX4
, d_mode
} } },
2800 { "fnmaddps", { { OP_DREX4
, DREX_OC1
+ q_mode
} } },
2801 { "fnmaddpd", { { OP_DREX4
, DREX_OC1
+ q_mode
} } },
2802 { "fnmaddss", { { OP_DREX4
, DREX_OC1
+ w_mode
} } },
2803 { "fnmaddsd", { { OP_DREX4
, DREX_OC1
+ d_mode
} } },
2805 { "fnmsubps", { { OP_DREX4
, q_mode
} } },
2806 { "fnmsubpd", { { OP_DREX4
, q_mode
} } },
2807 { "fnmsubss", { { OP_DREX4
, w_mode
} } },
2808 { "fnmsubsd", { { OP_DREX4
, d_mode
} } },
2809 { "fnmsubps", { { OP_DREX4
, DREX_OC1
+ q_mode
} } },
2810 { "fnmsubpd", { { OP_DREX4
, DREX_OC1
+ q_mode
} } },
2811 { "fnmsubss", { { OP_DREX4
, DREX_OC1
+ w_mode
} } },
2812 { "fnmsubsd", { { OP_DREX4
, DREX_OC1
+ d_mode
} } },
2814 { "permps", { { OP_DREX4
, q_mode
} } },
2815 { "permpd", { { OP_DREX4
, q_mode
} } },
2816 { "pcmov", { { OP_DREX4
, q_mode
} } },
2817 { "pperm", { { OP_DREX4
, q_mode
} } },
2818 { "permps", { { OP_DREX4
, DREX_OC1
+ q_mode
} } },
2819 { "permpd", { { OP_DREX4
, DREX_OC1
+ q_mode
} } },
2820 { "pcmov", { { OP_DREX4
, DREX_OC1
+ w_mode
} } },
2821 { "pperm", { { OP_DREX4
, DREX_OC1
+ d_mode
} } },
2823 { "(bad)", { XX
} },
2824 { "(bad)", { XX
} },
2825 { "(bad)", { XX
} },
2826 { "(bad)", { XX
} },
2827 { "(bad)", { XX
} },
2828 { "(bad)", { XX
} },
2829 { "(bad)", { XX
} },
2830 { "(bad)", { XX
} },
2832 { "(bad)", { XX
} },
2833 { "(bad)", { XX
} },
2834 { "(bad)", { XX
} },
2835 { "(bad)", { XX
} },
2836 { "(bad)", { XX
} },
2837 { "(bad)", { XX
} },
2838 { "(bad)", { XX
} },
2839 { "(bad)", { XX
} },
2841 { "(bad)", { XX
} },
2842 { "(bad)", { XX
} },
2843 { "(bad)", { XX
} },
2844 { "(bad)", { XX
} },
2845 { "(bad)", { XX
} },
2846 { "(bad)", { XX
} },
2847 { "(bad)", { XX
} },
2848 { "(bad)", { XX
} },
2850 { "protb", { { OP_DREX3
, q_mode
} } },
2851 { "protw", { { OP_DREX3
, q_mode
} } },
2852 { "protd", { { OP_DREX3
, q_mode
} } },
2853 { "protq", { { OP_DREX3
, q_mode
} } },
2854 { "pshlb", { { OP_DREX3
, q_mode
} } },
2855 { "pshlw", { { OP_DREX3
, q_mode
} } },
2856 { "pshld", { { OP_DREX3
, q_mode
} } },
2857 { "pshlq", { { OP_DREX3
, q_mode
} } },
2859 { "pshab", { { OP_DREX3
, q_mode
} } },
2860 { "pshaw", { { OP_DREX3
, q_mode
} } },
2861 { "pshad", { { OP_DREX3
, q_mode
} } },
2862 { "pshaq", { { OP_DREX3
, q_mode
} } },
2863 { "(bad)", { XX
} },
2864 { "(bad)", { XX
} },
2865 { "(bad)", { XX
} },
2866 { "(bad)", { XX
} },
2868 { "(bad)", { XX
} },
2869 { "(bad)", { XX
} },
2870 { "(bad)", { XX
} },
2871 { "(bad)", { XX
} },
2872 { "(bad)", { XX
} },
2873 { "(bad)", { XX
} },
2874 { "(bad)", { XX
} },
2875 { "(bad)", { XX
} },
2877 { "(bad)", { XX
} },
2878 { "(bad)", { XX
} },
2879 { "(bad)", { XX
} },
2880 { "(bad)", { XX
} },
2881 { "(bad)", { XX
} },
2882 { "(bad)", { XX
} },
2883 { "(bad)", { XX
} },
2884 { "(bad)", { XX
} },
2886 { "(bad)", { XX
} },
2887 { "(bad)", { XX
} },
2888 { "(bad)", { XX
} },
2889 { "(bad)", { XX
} },
2890 { "(bad)", { XX
} },
2891 { "(bad)", { XX
} },
2892 { "(bad)", { XX
} },
2893 { "(bad)", { XX
} },
2895 { "(bad)", { XX
} },
2896 { "(bad)", { XX
} },
2897 { "(bad)", { XX
} },
2898 { "(bad)", { XX
} },
2899 { "(bad)", { XX
} },
2900 { "(bad)", { XX
} },
2901 { "(bad)", { XX
} },
2902 { "(bad)", { XX
} },
2904 { "(bad)", { XX
} },
2905 { "(bad)", { XX
} },
2906 { "(bad)", { XX
} },
2907 { "(bad)", { XX
} },
2908 { "(bad)", { XX
} },
2909 { "(bad)", { XX
} },
2910 { "(bad)", { XX
} },
2911 { "(bad)", { XX
} },
2913 { "(bad)", { XX
} },
2914 { "(bad)", { XX
} },
2915 { "(bad)", { XX
} },
2916 { "(bad)", { XX
} },
2917 { "(bad)", { XX
} },
2918 { "(bad)", { XX
} },
2919 { "(bad)", { XX
} },
2920 { "(bad)", { XX
} },
2922 { "(bad)", { XX
} },
2923 { "(bad)", { XX
} },
2924 { "(bad)", { XX
} },
2925 { "(bad)", { XX
} },
2926 { "(bad)", { XX
} },
2927 { "pmacssww", { { OP_DREX4
, DREX_OC1
+ DREX_NO_OC0
+ q_mode
} } },
2928 { "pmacsswd", { { OP_DREX4
, DREX_OC1
+ DREX_NO_OC0
+ q_mode
} } },
2929 { "pmacssdql", { { OP_DREX4
, DREX_OC1
+ DREX_NO_OC0
+ q_mode
} } },
2931 { "(bad)", { XX
} },
2932 { "(bad)", { XX
} },
2933 { "(bad)", { XX
} },
2934 { "(bad)", { XX
} },
2935 { "(bad)", { XX
} },
2936 { "(bad)", { XX
} },
2937 { "pmacssdd", { { OP_DREX4
, DREX_OC1
+ DREX_NO_OC0
+ q_mode
} } },
2938 { "pmacssdqh", { { OP_DREX4
, DREX_OC1
+ DREX_NO_OC0
+ q_mode
} } },
2940 { "(bad)", { XX
} },
2941 { "(bad)", { XX
} },
2942 { "(bad)", { XX
} },
2943 { "(bad)", { XX
} },
2944 { "(bad)", { XX
} },
2945 { "pmacsww", { { OP_DREX4
, DREX_OC1
+ DREX_NO_OC0
+ q_mode
} } },
2946 { "pmacswd", { { OP_DREX4
, DREX_OC1
+ DREX_NO_OC0
+ q_mode
} } },
2947 { "pmacsdql", { { OP_DREX4
, DREX_OC1
+ DREX_NO_OC0
+ q_mode
} } },
2949 { "(bad)", { XX
} },
2950 { "(bad)", { XX
} },
2951 { "(bad)", { XX
} },
2952 { "(bad)", { XX
} },
2953 { "(bad)", { XX
} },
2954 { "(bad)", { XX
} },
2955 { "pmacsdd", { { OP_DREX4
, DREX_OC1
+ DREX_NO_OC0
+ q_mode
} } },
2956 { "pmacsdqh", { { OP_DREX4
, DREX_OC1
+ DREX_NO_OC0
+ q_mode
} } },
2958 { "(bad)", { XX
} },
2959 { "(bad)", { XX
} },
2960 { "(bad)", { XX
} },
2961 { "(bad)", { XX
} },
2962 { "(bad)", { XX
} },
2963 { "(bad)", { XX
} },
2964 { "pmadcsswd", { { OP_DREX4
, DREX_OC1
+ DREX_NO_OC0
+ q_mode
} } },
2965 { "(bad)", { XX
} },
2967 { "(bad)", { XX
} },
2968 { "(bad)", { XX
} },
2969 { "(bad)", { XX
} },
2970 { "(bad)", { XX
} },
2971 { "(bad)", { XX
} },
2972 { "(bad)", { XX
} },
2973 { "(bad)", { XX
} },
2974 { "(bad)", { XX
} },
2976 { "(bad)", { XX
} },
2977 { "(bad)", { XX
} },
2978 { "(bad)", { XX
} },
2979 { "(bad)", { XX
} },
2980 { "(bad)", { XX
} },
2981 { "(bad)", { XX
} },
2982 { "pmadcswd", { { OP_DREX4
, DREX_OC1
+ DREX_NO_OC0
+ q_mode
} } },
2983 { "(bad)", { XX
} },
2985 { "(bad)", { XX
} },
2986 { "(bad)", { XX
} },
2987 { "(bad)", { XX
} },
2988 { "(bad)", { XX
} },
2989 { "(bad)", { XX
} },
2990 { "(bad)", { XX
} },
2991 { "(bad)", { XX
} },
2992 { "(bad)", { XX
} },
2994 { "(bad)", { XX
} },
2995 { "(bad)", { XX
} },
2996 { "(bad)", { XX
} },
2997 { "(bad)", { XX
} },
2998 { "(bad)", { XX
} },
2999 { "(bad)", { XX
} },
3000 { "(bad)", { XX
} },
3001 { "(bad)", { XX
} },
3003 { "(bad)", { XX
} },
3004 { "(bad)", { XX
} },
3005 { "(bad)", { XX
} },
3006 { "(bad)", { XX
} },
3007 { "(bad)", { XX
} },
3008 { "(bad)", { XX
} },
3009 { "(bad)", { XX
} },
3010 { "(bad)", { XX
} },
3012 { "(bad)", { XX
} },
3013 { "(bad)", { XX
} },
3014 { "(bad)", { XX
} },
3015 { "(bad)", { XX
} },
3016 { "(bad)", { XX
} },
3017 { "(bad)", { XX
} },
3018 { "(bad)", { XX
} },
3019 { "(bad)", { XX
} },
3021 { "(bad)", { XX
} },
3022 { "(bad)", { XX
} },
3023 { "(bad)", { XX
} },
3024 { "(bad)", { XX
} },
3025 { "(bad)", { XX
} },
3026 { "(bad)", { XX
} },
3027 { "(bad)", { XX
} },
3028 { "(bad)", { XX
} },
3030 { "(bad)", { XX
} },
3031 { "(bad)", { XX
} },
3032 { "(bad)", { XX
} },
3033 { "(bad)", { XX
} },
3034 { "(bad)", { XX
} },
3035 { "(bad)", { XX
} },
3036 { "(bad)", { XX
} },
3037 { "(bad)", { XX
} },
3039 { "(bad)", { XX
} },
3040 { "(bad)", { XX
} },
3041 { "(bad)", { XX
} },
3042 { "(bad)", { XX
} },
3043 { "(bad)", { XX
} },
3044 { "(bad)", { XX
} },
3045 { "(bad)", { XX
} },
3046 { "(bad)", { XX
} },
3048 { "(bad)", { XX
} },
3049 { "(bad)", { XX
} },
3050 { "(bad)", { XX
} },
3051 { "(bad)", { XX
} },
3052 { "(bad)", { XX
} },
3053 { "(bad)", { XX
} },
3054 { "(bad)", { XX
} },
3055 { "(bad)", { XX
} },
3057 { "(bad)", { XX
} },
3058 { "(bad)", { XX
} },
3059 { "(bad)", { XX
} },
3060 { "(bad)", { XX
} },
3061 { "(bad)", { XX
} },
3062 { "(bad)", { XX
} },
3063 { "(bad)", { XX
} },
3064 { "(bad)", { XX
} },
3066 /* THREE_BYTE_0F25 */
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 { "(bad)", { XX
} },
3079 { "(bad)", { XX
} },
3080 { "(bad)", { XX
} },
3081 { "(bad)", { XX
} },
3082 { "(bad)", { XX
} },
3083 { "(bad)", { XX
} },
3084 { "(bad)", { XX
} },
3085 { "(bad)", { XX
} },
3087 { "(bad)", { XX
} },
3088 { "(bad)", { XX
} },
3089 { "(bad)", { XX
} },
3090 { "(bad)", { XX
} },
3091 { "(bad)", { XX
} },
3092 { "(bad)", { XX
} },
3093 { "(bad)", { XX
} },
3094 { "(bad)", { XX
} },
3096 { "(bad)", { XX
} },
3097 { "(bad)", { XX
} },
3098 { "(bad)", { XX
} },
3099 { "(bad)", { XX
} },
3100 { "(bad)", { XX
} },
3101 { "(bad)", { XX
} },
3102 { "(bad)", { XX
} },
3103 { "(bad)", { XX
} },
3105 { "(bad)", { XX
} },
3106 { "(bad)", { XX
} },
3107 { "(bad)", { XX
} },
3108 { "(bad)", { XX
} },
3109 { "(bad)", { XX
} },
3110 { "(bad)", { XX
} },
3111 { "(bad)", { XX
} },
3112 { "(bad)", { XX
} },
3114 { "(bad)", { XX
} },
3115 { "(bad)", { XX
} },
3116 { "(bad)", { XX
} },
3117 { "(bad)", { XX
} },
3118 { "comps", { { OP_DREX3
, q_mode
}, { OP_DREX_FCMP
, b_mode
} } },
3119 { "compd", { { OP_DREX3
, q_mode
}, { OP_DREX_FCMP
, b_mode
} } },
3120 { "comss", { { OP_DREX3
, w_mode
}, { OP_DREX_FCMP
, b_mode
} } },
3121 { "comsd", { { OP_DREX3
, d_mode
}, { OP_DREX_FCMP
, b_mode
} } },
3123 { "(bad)", { XX
} },
3124 { "(bad)", { XX
} },
3125 { "(bad)", { XX
} },
3126 { "(bad)", { XX
} },
3127 { "(bad)", { XX
} },
3128 { "(bad)", { XX
} },
3129 { "(bad)", { XX
} },
3130 { "(bad)", { XX
} },
3132 { "(bad)", { XX
} },
3133 { "(bad)", { XX
} },
3134 { "(bad)", { XX
} },
3135 { "(bad)", { XX
} },
3136 { "(bad)", { XX
} },
3137 { "(bad)", { XX
} },
3138 { "(bad)", { XX
} },
3139 { "(bad)", { XX
} },
3141 { "(bad)", { XX
} },
3142 { "(bad)", { XX
} },
3143 { "(bad)", { XX
} },
3144 { "(bad)", { XX
} },
3145 { "(bad)", { XX
} },
3146 { "(bad)", { XX
} },
3147 { "(bad)", { XX
} },
3148 { "(bad)", { XX
} },
3150 { "(bad)", { XX
} },
3151 { "(bad)", { XX
} },
3152 { "(bad)", { XX
} },
3153 { "(bad)", { XX
} },
3154 { "pcomb", { { OP_DREX3
, q_mode
}, { OP_DREX_ICMP
, b_mode
} } },
3155 { "pcomw", { { OP_DREX3
, q_mode
}, { OP_DREX_ICMP
, b_mode
} } },
3156 { "pcomd", { { OP_DREX3
, q_mode
}, { OP_DREX_ICMP
, b_mode
} } },
3157 { "pcomq", { { OP_DREX3
, q_mode
}, { OP_DREX_ICMP
, b_mode
} } },
3159 { "(bad)", { XX
} },
3160 { "(bad)", { XX
} },
3161 { "(bad)", { XX
} },
3162 { "(bad)", { XX
} },
3163 { "(bad)", { XX
} },
3164 { "(bad)", { XX
} },
3165 { "(bad)", { XX
} },
3166 { "(bad)", { XX
} },
3168 { "(bad)", { XX
} },
3169 { "(bad)", { XX
} },
3170 { "(bad)", { XX
} },
3171 { "(bad)", { XX
} },
3172 { "(bad)", { XX
} },
3173 { "(bad)", { XX
} },
3174 { "(bad)", { XX
} },
3175 { "(bad)", { XX
} },
3177 { "(bad)", { XX
} },
3178 { "(bad)", { XX
} },
3179 { "(bad)", { XX
} },
3180 { "(bad)", { XX
} },
3181 { "(bad)", { XX
} },
3182 { "(bad)", { XX
} },
3183 { "(bad)", { XX
} },
3184 { "(bad)", { XX
} },
3186 { "(bad)", { XX
} },
3187 { "(bad)", { XX
} },
3188 { "(bad)", { XX
} },
3189 { "(bad)", { XX
} },
3190 { "pcomub", { { OP_DREX3
, q_mode
}, { OP_DREX_ICMP
, b_mode
} } },
3191 { "pcomuw", { { OP_DREX3
, q_mode
}, { OP_DREX_ICMP
, b_mode
} } },
3192 { "pcomud", { { OP_DREX3
, q_mode
}, { OP_DREX_ICMP
, b_mode
} } },
3193 { "pcomuq", { { OP_DREX3
, q_mode
}, { OP_DREX_ICMP
, b_mode
} } },
3195 { "(bad)", { XX
} },
3196 { "(bad)", { XX
} },
3197 { "(bad)", { XX
} },
3198 { "(bad)", { XX
} },
3199 { "(bad)", { XX
} },
3200 { "(bad)", { XX
} },
3201 { "(bad)", { XX
} },
3202 { "(bad)", { XX
} },
3204 { "(bad)", { XX
} },
3205 { "(bad)", { XX
} },
3206 { "(bad)", { XX
} },
3207 { "(bad)", { XX
} },
3208 { "(bad)", { XX
} },
3209 { "(bad)", { XX
} },
3210 { "(bad)", { XX
} },
3211 { "(bad)", { XX
} },
3213 { "(bad)", { XX
} },
3214 { "(bad)", { XX
} },
3215 { "(bad)", { XX
} },
3216 { "(bad)", { XX
} },
3217 { "(bad)", { XX
} },
3218 { "(bad)", { XX
} },
3219 { "(bad)", { XX
} },
3220 { "(bad)", { XX
} },
3222 { "(bad)", { XX
} },
3223 { "(bad)", { XX
} },
3224 { "(bad)", { XX
} },
3225 { "(bad)", { XX
} },
3226 { "(bad)", { XX
} },
3227 { "(bad)", { XX
} },
3228 { "(bad)", { XX
} },
3229 { "(bad)", { XX
} },
3231 { "(bad)", { XX
} },
3232 { "(bad)", { XX
} },
3233 { "(bad)", { XX
} },
3234 { "(bad)", { XX
} },
3235 { "(bad)", { XX
} },
3236 { "(bad)", { XX
} },
3237 { "(bad)", { XX
} },
3238 { "(bad)", { XX
} },
3240 { "(bad)", { XX
} },
3241 { "(bad)", { XX
} },
3242 { "(bad)", { XX
} },
3243 { "(bad)", { XX
} },
3244 { "(bad)", { XX
} },
3245 { "(bad)", { XX
} },
3246 { "(bad)", { XX
} },
3247 { "(bad)", { XX
} },
3249 { "(bad)", { XX
} },
3250 { "(bad)", { XX
} },
3251 { "(bad)", { XX
} },
3252 { "(bad)", { XX
} },
3253 { "(bad)", { XX
} },
3254 { "(bad)", { XX
} },
3255 { "(bad)", { XX
} },
3256 { "(bad)", { XX
} },
3258 { "(bad)", { XX
} },
3259 { "(bad)", { XX
} },
3260 { "(bad)", { XX
} },
3261 { "(bad)", { XX
} },
3262 { "(bad)", { XX
} },
3263 { "(bad)", { XX
} },
3264 { "(bad)", { XX
} },
3265 { "(bad)", { XX
} },
3267 { "(bad)", { XX
} },
3268 { "(bad)", { XX
} },
3269 { "(bad)", { XX
} },
3270 { "(bad)", { XX
} },
3271 { "(bad)", { XX
} },
3272 { "(bad)", { XX
} },
3273 { "(bad)", { XX
} },
3274 { "(bad)", { XX
} },
3276 { "(bad)", { XX
} },
3277 { "(bad)", { XX
} },
3278 { "(bad)", { XX
} },
3279 { "(bad)", { XX
} },
3280 { "(bad)", { XX
} },
3281 { "(bad)", { XX
} },
3282 { "(bad)", { XX
} },
3283 { "(bad)", { XX
} },
3285 { "(bad)", { XX
} },
3286 { "(bad)", { XX
} },
3287 { "(bad)", { XX
} },
3288 { "(bad)", { XX
} },
3289 { "(bad)", { XX
} },
3290 { "(bad)", { XX
} },
3291 { "(bad)", { XX
} },
3292 { "(bad)", { XX
} },
3294 { "(bad)", { XX
} },
3295 { "(bad)", { XX
} },
3296 { "(bad)", { XX
} },
3297 { "(bad)", { XX
} },
3298 { "(bad)", { XX
} },
3299 { "(bad)", { XX
} },
3300 { "(bad)", { XX
} },
3301 { "(bad)", { XX
} },
3303 { "(bad)", { XX
} },
3304 { "(bad)", { XX
} },
3305 { "(bad)", { XX
} },
3306 { "(bad)", { XX
} },
3307 { "(bad)", { XX
} },
3308 { "(bad)", { XX
} },
3309 { "(bad)", { XX
} },
3310 { "(bad)", { XX
} },
3312 { "(bad)", { XX
} },
3313 { "(bad)", { XX
} },
3314 { "(bad)", { XX
} },
3315 { "(bad)", { XX
} },
3316 { "(bad)", { XX
} },
3317 { "(bad)", { XX
} },
3318 { "(bad)", { XX
} },
3319 { "(bad)", { XX
} },
3321 { "(bad)", { XX
} },
3322 { "(bad)", { XX
} },
3323 { "(bad)", { XX
} },
3324 { "(bad)", { XX
} },
3325 { "(bad)", { XX
} },
3326 { "(bad)", { XX
} },
3327 { "(bad)", { XX
} },
3328 { "(bad)", { XX
} },
3330 { "(bad)", { XX
} },
3331 { "(bad)", { XX
} },
3332 { "(bad)", { XX
} },
3333 { "(bad)", { XX
} },
3334 { "(bad)", { XX
} },
3335 { "(bad)", { XX
} },
3336 { "(bad)", { XX
} },
3337 { "(bad)", { XX
} },
3339 { "(bad)", { XX
} },
3340 { "(bad)", { XX
} },
3341 { "(bad)", { XX
} },
3342 { "(bad)", { XX
} },
3343 { "(bad)", { XX
} },
3344 { "(bad)", { XX
} },
3345 { "(bad)", { XX
} },
3346 { "(bad)", { XX
} },
3348 { "(bad)", { XX
} },
3349 { "(bad)", { XX
} },
3350 { "(bad)", { XX
} },
3351 { "(bad)", { XX
} },
3352 { "(bad)", { XX
} },
3353 { "(bad)", { XX
} },
3354 { "(bad)", { XX
} },
3355 { "(bad)", { XX
} },
3357 /* THREE_BYTE_0F38 */
3360 { "pshufb", { MX
, EM
} },
3361 { "phaddw", { MX
, EM
} },
3362 { "phaddd", { MX
, EM
} },
3363 { "phaddsw", { MX
, EM
} },
3364 { "pmaddubsw", { MX
, EM
} },
3365 { "phsubw", { MX
, EM
} },
3366 { "phsubd", { MX
, EM
} },
3367 { "phsubsw", { MX
, EM
} },
3369 { "psignb", { MX
, EM
} },
3370 { "psignw", { MX
, EM
} },
3371 { "psignd", { MX
, EM
} },
3372 { "pmulhrsw", { MX
, EM
} },
3373 { "(bad)", { XX
} },
3374 { "(bad)", { XX
} },
3375 { "(bad)", { XX
} },
3376 { "(bad)", { XX
} },
3378 { PREFIX_TABLE (PREFIX_0F3810
) },
3379 { "(bad)", { XX
} },
3380 { "(bad)", { XX
} },
3381 { "(bad)", { XX
} },
3382 { PREFIX_TABLE (PREFIX_0F3814
) },
3383 { PREFIX_TABLE (PREFIX_0F3815
) },
3384 { "(bad)", { XX
} },
3385 { PREFIX_TABLE (PREFIX_0F3817
) },
3387 { "(bad)", { XX
} },
3388 { "(bad)", { XX
} },
3389 { "(bad)", { XX
} },
3390 { "(bad)", { XX
} },
3391 { "pabsb", { MX
, EM
} },
3392 { "pabsw", { MX
, EM
} },
3393 { "pabsd", { MX
, EM
} },
3394 { "(bad)", { XX
} },
3396 { PREFIX_TABLE (PREFIX_0F3820
) },
3397 { PREFIX_TABLE (PREFIX_0F3821
) },
3398 { PREFIX_TABLE (PREFIX_0F3822
) },
3399 { PREFIX_TABLE (PREFIX_0F3823
) },
3400 { PREFIX_TABLE (PREFIX_0F3824
) },
3401 { PREFIX_TABLE (PREFIX_0F3825
) },
3402 { "(bad)", { XX
} },
3403 { "(bad)", { XX
} },
3405 { PREFIX_TABLE (PREFIX_0F3828
) },
3406 { PREFIX_TABLE (PREFIX_0F3829
) },
3407 { PREFIX_TABLE (PREFIX_0F382A
) },
3408 { PREFIX_TABLE (PREFIX_0F382B
) },
3409 { "(bad)", { XX
} },
3410 { "(bad)", { XX
} },
3411 { "(bad)", { XX
} },
3412 { "(bad)", { XX
} },
3414 { PREFIX_TABLE (PREFIX_0F3830
) },
3415 { PREFIX_TABLE (PREFIX_0F3831
) },
3416 { PREFIX_TABLE (PREFIX_0F3832
) },
3417 { PREFIX_TABLE (PREFIX_0F3833
) },
3418 { PREFIX_TABLE (PREFIX_0F3834
) },
3419 { PREFIX_TABLE (PREFIX_0F3835
) },
3420 { "(bad)", { XX
} },
3421 { PREFIX_TABLE (PREFIX_0F3837
) },
3423 { PREFIX_TABLE (PREFIX_0F3838
) },
3424 { PREFIX_TABLE (PREFIX_0F3839
) },
3425 { PREFIX_TABLE (PREFIX_0F383A
) },
3426 { PREFIX_TABLE (PREFIX_0F383B
) },
3427 { PREFIX_TABLE (PREFIX_0F383C
) },
3428 { PREFIX_TABLE (PREFIX_0F383D
) },
3429 { PREFIX_TABLE (PREFIX_0F383E
) },
3430 { PREFIX_TABLE (PREFIX_0F383F
) },
3432 { PREFIX_TABLE (PREFIX_0F3840
) },
3433 { PREFIX_TABLE (PREFIX_0F3841
) },
3434 { "(bad)", { XX
} },
3435 { "(bad)", { XX
} },
3436 { "(bad)", { XX
} },
3437 { "(bad)", { XX
} },
3438 { "(bad)", { XX
} },
3439 { "(bad)", { XX
} },
3441 { "(bad)", { XX
} },
3442 { "(bad)", { XX
} },
3443 { "(bad)", { XX
} },
3444 { "(bad)", { XX
} },
3445 { "(bad)", { XX
} },
3446 { "(bad)", { XX
} },
3447 { "(bad)", { XX
} },
3448 { "(bad)", { XX
} },
3450 { "(bad)", { XX
} },
3451 { "(bad)", { XX
} },
3452 { "(bad)", { XX
} },
3453 { "(bad)", { XX
} },
3454 { "(bad)", { XX
} },
3455 { "(bad)", { XX
} },
3456 { "(bad)", { XX
} },
3457 { "(bad)", { XX
} },
3459 { "(bad)", { XX
} },
3460 { "(bad)", { XX
} },
3461 { "(bad)", { XX
} },
3462 { "(bad)", { XX
} },
3463 { "(bad)", { XX
} },
3464 { "(bad)", { XX
} },
3465 { "(bad)", { XX
} },
3466 { "(bad)", { XX
} },
3468 { "(bad)", { XX
} },
3469 { "(bad)", { XX
} },
3470 { "(bad)", { XX
} },
3471 { "(bad)", { XX
} },
3472 { "(bad)", { XX
} },
3473 { "(bad)", { XX
} },
3474 { "(bad)", { XX
} },
3475 { "(bad)", { XX
} },
3477 { "(bad)", { XX
} },
3478 { "(bad)", { XX
} },
3479 { "(bad)", { XX
} },
3480 { "(bad)", { XX
} },
3481 { "(bad)", { XX
} },
3482 { "(bad)", { XX
} },
3483 { "(bad)", { XX
} },
3484 { "(bad)", { XX
} },
3486 { "(bad)", { XX
} },
3487 { "(bad)", { XX
} },
3488 { "(bad)", { XX
} },
3489 { "(bad)", { XX
} },
3490 { "(bad)", { XX
} },
3491 { "(bad)", { XX
} },
3492 { "(bad)", { XX
} },
3493 { "(bad)", { XX
} },
3495 { "(bad)", { XX
} },
3496 { "(bad)", { XX
} },
3497 { "(bad)", { XX
} },
3498 { "(bad)", { XX
} },
3499 { "(bad)", { XX
} },
3500 { "(bad)", { XX
} },
3501 { "(bad)", { XX
} },
3502 { "(bad)", { XX
} },
3504 { "(bad)", { XX
} },
3505 { "(bad)", { XX
} },
3506 { "(bad)", { XX
} },
3507 { "(bad)", { XX
} },
3508 { "(bad)", { XX
} },
3509 { "(bad)", { XX
} },
3510 { "(bad)", { XX
} },
3511 { "(bad)", { XX
} },
3513 { "(bad)", { XX
} },
3514 { "(bad)", { XX
} },
3515 { "(bad)", { XX
} },
3516 { "(bad)", { XX
} },
3517 { "(bad)", { XX
} },
3518 { "(bad)", { XX
} },
3519 { "(bad)", { XX
} },
3520 { "(bad)", { XX
} },
3522 { "(bad)", { XX
} },
3523 { "(bad)", { XX
} },
3524 { "(bad)", { XX
} },
3525 { "(bad)", { XX
} },
3526 { "(bad)", { XX
} },
3527 { "(bad)", { XX
} },
3528 { "(bad)", { XX
} },
3529 { "(bad)", { XX
} },
3531 { "(bad)", { XX
} },
3532 { "(bad)", { XX
} },
3533 { "(bad)", { XX
} },
3534 { "(bad)", { XX
} },
3535 { "(bad)", { XX
} },
3536 { "(bad)", { XX
} },
3537 { "(bad)", { XX
} },
3538 { "(bad)", { XX
} },
3540 { "(bad)", { XX
} },
3541 { "(bad)", { XX
} },
3542 { "(bad)", { XX
} },
3543 { "(bad)", { XX
} },
3544 { "(bad)", { XX
} },
3545 { "(bad)", { XX
} },
3546 { "(bad)", { XX
} },
3547 { "(bad)", { XX
} },
3549 { "(bad)", { XX
} },
3550 { "(bad)", { XX
} },
3551 { "(bad)", { XX
} },
3552 { "(bad)", { XX
} },
3553 { "(bad)", { XX
} },
3554 { "(bad)", { XX
} },
3555 { "(bad)", { XX
} },
3556 { "(bad)", { XX
} },
3558 { "(bad)", { XX
} },
3559 { "(bad)", { XX
} },
3560 { "(bad)", { XX
} },
3561 { "(bad)", { XX
} },
3562 { "(bad)", { XX
} },
3563 { "(bad)", { XX
} },
3564 { "(bad)", { XX
} },
3565 { "(bad)", { XX
} },
3567 { "(bad)", { XX
} },
3568 { "(bad)", { XX
} },
3569 { "(bad)", { XX
} },
3570 { "(bad)", { XX
} },
3571 { "(bad)", { XX
} },
3572 { "(bad)", { XX
} },
3573 { "(bad)", { XX
} },
3574 { "(bad)", { XX
} },
3576 { "(bad)", { XX
} },
3577 { "(bad)", { XX
} },
3578 { "(bad)", { XX
} },
3579 { "(bad)", { XX
} },
3580 { "(bad)", { XX
} },
3581 { "(bad)", { XX
} },
3582 { "(bad)", { XX
} },
3583 { "(bad)", { XX
} },
3585 { "(bad)", { XX
} },
3586 { "(bad)", { XX
} },
3587 { "(bad)", { XX
} },
3588 { "(bad)", { XX
} },
3589 { "(bad)", { XX
} },
3590 { "(bad)", { XX
} },
3591 { "(bad)", { XX
} },
3592 { "(bad)", { XX
} },
3594 { "(bad)", { XX
} },
3595 { "(bad)", { XX
} },
3596 { "(bad)", { XX
} },
3597 { "(bad)", { XX
} },
3598 { "(bad)", { XX
} },
3599 { "(bad)", { XX
} },
3600 { "(bad)", { XX
} },
3601 { "(bad)", { XX
} },
3603 { "(bad)", { XX
} },
3604 { "(bad)", { XX
} },
3605 { "(bad)", { XX
} },
3606 { "(bad)", { XX
} },
3607 { "(bad)", { XX
} },
3608 { "(bad)", { XX
} },
3609 { "(bad)", { XX
} },
3610 { "(bad)", { XX
} },
3612 { "(bad)", { XX
} },
3613 { "(bad)", { XX
} },
3614 { "(bad)", { XX
} },
3615 { "(bad)", { XX
} },
3616 { "(bad)", { XX
} },
3617 { "(bad)", { XX
} },
3618 { "(bad)", { XX
} },
3619 { "(bad)", { XX
} },
3621 { "(bad)", { XX
} },
3622 { "(bad)", { XX
} },
3623 { "(bad)", { XX
} },
3624 { "(bad)", { XX
} },
3625 { "(bad)", { XX
} },
3626 { "(bad)", { XX
} },
3627 { "(bad)", { XX
} },
3628 { "(bad)", { XX
} },
3630 { PREFIX_TABLE (PREFIX_0F38F0
) },
3631 { PREFIX_TABLE (PREFIX_0F38F1
) },
3632 { "(bad)", { XX
} },
3633 { "(bad)", { XX
} },
3634 { "(bad)", { XX
} },
3635 { "(bad)", { XX
} },
3636 { "(bad)", { XX
} },
3637 { "(bad)", { XX
} },
3639 { "(bad)", { XX
} },
3640 { "(bad)", { XX
} },
3641 { "(bad)", { XX
} },
3642 { "(bad)", { XX
} },
3643 { "(bad)", { XX
} },
3644 { "(bad)", { XX
} },
3645 { "(bad)", { XX
} },
3646 { "(bad)", { XX
} },
3648 /* THREE_BYTE_0F3A */
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 { PREFIX_TABLE (PREFIX_0F3A08
) },
3661 { PREFIX_TABLE (PREFIX_0F3A09
) },
3662 { PREFIX_TABLE (PREFIX_0F3A0A
) },
3663 { PREFIX_TABLE (PREFIX_0F3A0B
) },
3664 { PREFIX_TABLE (PREFIX_0F3A0C
) },
3665 { PREFIX_TABLE (PREFIX_0F3A0D
) },
3666 { PREFIX_TABLE (PREFIX_0F3A0E
) },
3667 { "palignr", { MX
, EM
, Ib
} },
3669 { "(bad)", { XX
} },
3670 { "(bad)", { XX
} },
3671 { "(bad)", { XX
} },
3672 { "(bad)", { XX
} },
3673 { PREFIX_TABLE (PREFIX_0F3A14
) },
3674 { PREFIX_TABLE (PREFIX_0F3A15
) },
3675 { PREFIX_TABLE (PREFIX_0F3A16
) },
3676 { PREFIX_TABLE (PREFIX_0F3A17
) },
3678 { "(bad)", { XX
} },
3679 { "(bad)", { XX
} },
3680 { "(bad)", { XX
} },
3681 { "(bad)", { XX
} },
3682 { "(bad)", { XX
} },
3683 { "(bad)", { XX
} },
3684 { "(bad)", { XX
} },
3685 { "(bad)", { XX
} },
3687 { PREFIX_TABLE (PREFIX_0F3A20
) },
3688 { PREFIX_TABLE (PREFIX_0F3A21
) },
3689 { PREFIX_TABLE (PREFIX_0F3A22
) },
3690 { "(bad)", { XX
} },
3691 { "(bad)", { XX
} },
3692 { "(bad)", { XX
} },
3693 { "(bad)", { XX
} },
3694 { "(bad)", { XX
} },
3696 { "(bad)", { XX
} },
3697 { "(bad)", { XX
} },
3698 { "(bad)", { XX
} },
3699 { "(bad)", { XX
} },
3700 { "(bad)", { XX
} },
3701 { "(bad)", { XX
} },
3702 { "(bad)", { XX
} },
3703 { "(bad)", { XX
} },
3705 { "(bad)", { XX
} },
3706 { "(bad)", { XX
} },
3707 { "(bad)", { XX
} },
3708 { "(bad)", { XX
} },
3709 { "(bad)", { XX
} },
3710 { "(bad)", { XX
} },
3711 { "(bad)", { XX
} },
3712 { "(bad)", { XX
} },
3714 { "(bad)", { XX
} },
3715 { "(bad)", { XX
} },
3716 { "(bad)", { XX
} },
3717 { "(bad)", { XX
} },
3718 { "(bad)", { XX
} },
3719 { "(bad)", { XX
} },
3720 { "(bad)", { XX
} },
3721 { "(bad)", { XX
} },
3723 { PREFIX_TABLE (PREFIX_0F3A40
) },
3724 { PREFIX_TABLE (PREFIX_0F3A41
) },
3725 { PREFIX_TABLE (PREFIX_0F3A42
) },
3726 { "(bad)", { XX
} },
3727 { "(bad)", { XX
} },
3728 { "(bad)", { XX
} },
3729 { "(bad)", { XX
} },
3730 { "(bad)", { XX
} },
3732 { "(bad)", { XX
} },
3733 { "(bad)", { XX
} },
3734 { "(bad)", { XX
} },
3735 { "(bad)", { XX
} },
3736 { "(bad)", { XX
} },
3737 { "(bad)", { XX
} },
3738 { "(bad)", { XX
} },
3739 { "(bad)", { XX
} },
3741 { "(bad)", { XX
} },
3742 { "(bad)", { XX
} },
3743 { "(bad)", { XX
} },
3744 { "(bad)", { XX
} },
3745 { "(bad)", { XX
} },
3746 { "(bad)", { XX
} },
3747 { "(bad)", { XX
} },
3748 { "(bad)", { XX
} },
3750 { "(bad)", { XX
} },
3751 { "(bad)", { XX
} },
3752 { "(bad)", { XX
} },
3753 { "(bad)", { XX
} },
3754 { "(bad)", { XX
} },
3755 { "(bad)", { XX
} },
3756 { "(bad)", { XX
} },
3757 { "(bad)", { XX
} },
3759 { PREFIX_TABLE (PREFIX_0F3A60
) },
3760 { PREFIX_TABLE (PREFIX_0F3A61
) },
3761 { PREFIX_TABLE (PREFIX_0F3A62
) },
3762 { PREFIX_TABLE (PREFIX_0F3A63
) },
3763 { "(bad)", { XX
} },
3764 { "(bad)", { XX
} },
3765 { "(bad)", { XX
} },
3766 { "(bad)", { XX
} },
3768 { "(bad)", { XX
} },
3769 { "(bad)", { XX
} },
3770 { "(bad)", { XX
} },
3771 { "(bad)", { XX
} },
3772 { "(bad)", { XX
} },
3773 { "(bad)", { XX
} },
3774 { "(bad)", { XX
} },
3775 { "(bad)", { XX
} },
3777 { "(bad)", { XX
} },
3778 { "(bad)", { XX
} },
3779 { "(bad)", { XX
} },
3780 { "(bad)", { XX
} },
3781 { "(bad)", { XX
} },
3782 { "(bad)", { XX
} },
3783 { "(bad)", { XX
} },
3784 { "(bad)", { XX
} },
3786 { "(bad)", { XX
} },
3787 { "(bad)", { XX
} },
3788 { "(bad)", { XX
} },
3789 { "(bad)", { XX
} },
3790 { "(bad)", { XX
} },
3791 { "(bad)", { XX
} },
3792 { "(bad)", { XX
} },
3793 { "(bad)", { XX
} },
3795 { "(bad)", { XX
} },
3796 { "(bad)", { XX
} },
3797 { "(bad)", { XX
} },
3798 { "(bad)", { XX
} },
3799 { "(bad)", { XX
} },
3800 { "(bad)", { XX
} },
3801 { "(bad)", { XX
} },
3802 { "(bad)", { XX
} },
3804 { "(bad)", { XX
} },
3805 { "(bad)", { XX
} },
3806 { "(bad)", { XX
} },
3807 { "(bad)", { XX
} },
3808 { "(bad)", { XX
} },
3809 { "(bad)", { XX
} },
3810 { "(bad)", { XX
} },
3811 { "(bad)", { XX
} },
3813 { "(bad)", { XX
} },
3814 { "(bad)", { XX
} },
3815 { "(bad)", { XX
} },
3816 { "(bad)", { XX
} },
3817 { "(bad)", { XX
} },
3818 { "(bad)", { XX
} },
3819 { "(bad)", { XX
} },
3820 { "(bad)", { XX
} },
3822 { "(bad)", { XX
} },
3823 { "(bad)", { XX
} },
3824 { "(bad)", { XX
} },
3825 { "(bad)", { XX
} },
3826 { "(bad)", { XX
} },
3827 { "(bad)", { XX
} },
3828 { "(bad)", { XX
} },
3829 { "(bad)", { XX
} },
3831 { "(bad)", { XX
} },
3832 { "(bad)", { XX
} },
3833 { "(bad)", { XX
} },
3834 { "(bad)", { XX
} },
3835 { "(bad)", { XX
} },
3836 { "(bad)", { XX
} },
3837 { "(bad)", { XX
} },
3838 { "(bad)", { XX
} },
3840 { "(bad)", { XX
} },
3841 { "(bad)", { XX
} },
3842 { "(bad)", { XX
} },
3843 { "(bad)", { XX
} },
3844 { "(bad)", { XX
} },
3845 { "(bad)", { XX
} },
3846 { "(bad)", { XX
} },
3847 { "(bad)", { XX
} },
3849 { "(bad)", { XX
} },
3850 { "(bad)", { XX
} },
3851 { "(bad)", { XX
} },
3852 { "(bad)", { XX
} },
3853 { "(bad)", { XX
} },
3854 { "(bad)", { XX
} },
3855 { "(bad)", { XX
} },
3856 { "(bad)", { XX
} },
3858 { "(bad)", { XX
} },
3859 { "(bad)", { XX
} },
3860 { "(bad)", { XX
} },
3861 { "(bad)", { XX
} },
3862 { "(bad)", { XX
} },
3863 { "(bad)", { XX
} },
3864 { "(bad)", { XX
} },
3865 { "(bad)", { XX
} },
3867 { "(bad)", { XX
} },
3868 { "(bad)", { XX
} },
3869 { "(bad)", { XX
} },
3870 { "(bad)", { XX
} },
3871 { "(bad)", { XX
} },
3872 { "(bad)", { XX
} },
3873 { "(bad)", { XX
} },
3874 { "(bad)", { XX
} },
3876 { "(bad)", { XX
} },
3877 { "(bad)", { XX
} },
3878 { "(bad)", { XX
} },
3879 { "(bad)", { XX
} },
3880 { "(bad)", { XX
} },
3881 { "(bad)", { XX
} },
3882 { "(bad)", { XX
} },
3883 { "(bad)", { XX
} },
3885 { "(bad)", { XX
} },
3886 { "(bad)", { XX
} },
3887 { "(bad)", { XX
} },
3888 { "(bad)", { XX
} },
3889 { "(bad)", { XX
} },
3890 { "(bad)", { XX
} },
3891 { "(bad)", { XX
} },
3892 { "(bad)", { XX
} },
3894 { "(bad)", { XX
} },
3895 { "(bad)", { XX
} },
3896 { "(bad)", { XX
} },
3897 { "(bad)", { XX
} },
3898 { "(bad)", { XX
} },
3899 { "(bad)", { XX
} },
3900 { "(bad)", { XX
} },
3901 { "(bad)", { XX
} },
3903 { "(bad)", { XX
} },
3904 { "(bad)", { XX
} },
3905 { "(bad)", { XX
} },
3906 { "(bad)", { XX
} },
3907 { "(bad)", { XX
} },
3908 { "(bad)", { XX
} },
3909 { "(bad)", { XX
} },
3910 { "(bad)", { XX
} },
3912 { "(bad)", { XX
} },
3913 { "(bad)", { XX
} },
3914 { "(bad)", { XX
} },
3915 { "(bad)", { XX
} },
3916 { "(bad)", { XX
} },
3917 { "(bad)", { XX
} },
3918 { "(bad)", { XX
} },
3919 { "(bad)", { XX
} },
3921 { "(bad)", { XX
} },
3922 { "(bad)", { XX
} },
3923 { "(bad)", { XX
} },
3924 { "(bad)", { XX
} },
3925 { "(bad)", { XX
} },
3926 { "(bad)", { XX
} },
3927 { "(bad)", { XX
} },
3928 { "(bad)", { XX
} },
3930 { "(bad)", { XX
} },
3931 { "(bad)", { XX
} },
3932 { "(bad)", { XX
} },
3933 { "(bad)", { XX
} },
3934 { "(bad)", { XX
} },
3935 { "(bad)", { XX
} },
3936 { "(bad)", { XX
} },
3937 { "(bad)", { XX
} },
3939 /* THREE_BYTE_0F7A */
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 { "(bad)", { XX
} },
3952 { "(bad)", { XX
} },
3953 { "(bad)", { XX
} },
3954 { "(bad)", { XX
} },
3955 { "(bad)", { XX
} },
3956 { "(bad)", { XX
} },
3957 { "(bad)", { XX
} },
3958 { "(bad)", { XX
} },
3960 { "frczps", { XM
, EXq
} },
3961 { "frczpd", { XM
, EXq
} },
3962 { "frczss", { XM
, EXq
} },
3963 { "frczsd", { XM
, EXq
} },
3964 { "(bad)", { XX
} },
3965 { "(bad)", { XX
} },
3966 { "(bad)", { XX
} },
3967 { "(bad)", { XX
} },
3969 { "(bad)", { XX
} },
3970 { "(bad)", { XX
} },
3971 { "(bad)", { XX
} },
3972 { "(bad)", { XX
} },
3973 { "(bad)", { XX
} },
3974 { "(bad)", { XX
} },
3975 { "(bad)", { XX
} },
3976 { "(bad)", { XX
} },
3978 { "ptest", { XX
} },
3979 { "(bad)", { XX
} },
3980 { "(bad)", { XX
} },
3981 { "(bad)", { XX
} },
3982 { "(bad)", { XX
} },
3983 { "(bad)", { XX
} },
3984 { "(bad)", { XX
} },
3985 { "(bad)", { XX
} },
3987 { "(bad)", { XX
} },
3988 { "(bad)", { XX
} },
3989 { "(bad)", { XX
} },
3990 { "(bad)", { XX
} },
3991 { "(bad)", { XX
} },
3992 { "(bad)", { XX
} },
3993 { "(bad)", { XX
} },
3994 { "(bad)", { XX
} },
3996 { "cvtph2ps", { XM
, EXd
} },
3997 { "cvtps2ph", { EXd
, XM
} },
3998 { "(bad)", { XX
} },
3999 { "(bad)", { XX
} },
4000 { "(bad)", { XX
} },
4001 { "(bad)", { XX
} },
4002 { "(bad)", { XX
} },
4003 { "(bad)", { XX
} },
4005 { "(bad)", { XX
} },
4006 { "(bad)", { XX
} },
4007 { "(bad)", { XX
} },
4008 { "(bad)", { XX
} },
4009 { "(bad)", { XX
} },
4010 { "(bad)", { XX
} },
4011 { "(bad)", { XX
} },
4012 { "(bad)", { XX
} },
4014 { "(bad)", { XX
} },
4015 { "phaddbw", { XM
, EXq
} },
4016 { "phaddbd", { XM
, EXq
} },
4017 { "phaddbq", { XM
, EXq
} },
4018 { "(bad)", { XX
} },
4019 { "(bad)", { XX
} },
4020 { "phaddwd", { XM
, EXq
} },
4021 { "phaddwq", { XM
, EXq
} },
4023 { "(bad)", { XX
} },
4024 { "(bad)", { XX
} },
4025 { "(bad)", { XX
} },
4026 { "phadddq", { XM
, EXq
} },
4027 { "(bad)", { XX
} },
4028 { "(bad)", { XX
} },
4029 { "(bad)", { XX
} },
4030 { "(bad)", { XX
} },
4032 { "(bad)", { XX
} },
4033 { "phaddubw", { XM
, EXq
} },
4034 { "phaddubd", { XM
, EXq
} },
4035 { "phaddubq", { XM
, EXq
} },
4036 { "(bad)", { XX
} },
4037 { "(bad)", { XX
} },
4038 { "phadduwd", { XM
, EXq
} },
4039 { "phadduwq", { XM
, EXq
} },
4041 { "(bad)", { XX
} },
4042 { "(bad)", { XX
} },
4043 { "(bad)", { XX
} },
4044 { "phaddudq", { XM
, EXq
} },
4045 { "(bad)", { XX
} },
4046 { "(bad)", { XX
} },
4047 { "(bad)", { XX
} },
4048 { "(bad)", { XX
} },
4050 { "(bad)", { XX
} },
4051 { "phsubbw", { XM
, EXq
} },
4052 { "phsubbd", { XM
, EXq
} },
4053 { "phsubbq", { XM
, EXq
} },
4054 { "(bad)", { XX
} },
4055 { "(bad)", { XX
} },
4056 { "(bad)", { XX
} },
4057 { "(bad)", { XX
} },
4059 { "(bad)", { XX
} },
4060 { "(bad)", { XX
} },
4061 { "(bad)", { XX
} },
4062 { "(bad)", { XX
} },
4063 { "(bad)", { XX
} },
4064 { "(bad)", { XX
} },
4065 { "(bad)", { XX
} },
4066 { "(bad)", { XX
} },
4068 { "(bad)", { XX
} },
4069 { "(bad)", { XX
} },
4070 { "(bad)", { XX
} },
4071 { "(bad)", { XX
} },
4072 { "(bad)", { XX
} },
4073 { "(bad)", { XX
} },
4074 { "(bad)", { XX
} },
4075 { "(bad)", { XX
} },
4077 { "(bad)", { XX
} },
4078 { "(bad)", { XX
} },
4079 { "(bad)", { XX
} },
4080 { "(bad)", { XX
} },
4081 { "(bad)", { XX
} },
4082 { "(bad)", { XX
} },
4083 { "(bad)", { XX
} },
4084 { "(bad)", { XX
} },
4086 { "(bad)", { XX
} },
4087 { "(bad)", { XX
} },
4088 { "(bad)", { XX
} },
4089 { "(bad)", { XX
} },
4090 { "(bad)", { XX
} },
4091 { "(bad)", { XX
} },
4092 { "(bad)", { XX
} },
4093 { "(bad)", { XX
} },
4095 { "(bad)", { XX
} },
4096 { "(bad)", { XX
} },
4097 { "(bad)", { XX
} },
4098 { "(bad)", { XX
} },
4099 { "(bad)", { XX
} },
4100 { "(bad)", { XX
} },
4101 { "(bad)", { XX
} },
4102 { "(bad)", { XX
} },
4104 { "(bad)", { XX
} },
4105 { "(bad)", { XX
} },
4106 { "(bad)", { XX
} },
4107 { "(bad)", { XX
} },
4108 { "(bad)", { XX
} },
4109 { "(bad)", { XX
} },
4110 { "(bad)", { XX
} },
4111 { "(bad)", { XX
} },
4113 { "(bad)", { XX
} },
4114 { "(bad)", { XX
} },
4115 { "(bad)", { XX
} },
4116 { "(bad)", { XX
} },
4117 { "(bad)", { XX
} },
4118 { "(bad)", { XX
} },
4119 { "(bad)", { XX
} },
4120 { "(bad)", { XX
} },
4122 { "(bad)", { XX
} },
4123 { "(bad)", { XX
} },
4124 { "(bad)", { XX
} },
4125 { "(bad)", { XX
} },
4126 { "(bad)", { XX
} },
4127 { "(bad)", { XX
} },
4128 { "(bad)", { XX
} },
4129 { "(bad)", { XX
} },
4131 { "(bad)", { XX
} },
4132 { "(bad)", { XX
} },
4133 { "(bad)", { XX
} },
4134 { "(bad)", { XX
} },
4135 { "(bad)", { XX
} },
4136 { "(bad)", { XX
} },
4137 { "(bad)", { XX
} },
4138 { "(bad)", { XX
} },
4140 { "(bad)", { XX
} },
4141 { "(bad)", { XX
} },
4142 { "(bad)", { XX
} },
4143 { "(bad)", { XX
} },
4144 { "(bad)", { XX
} },
4145 { "(bad)", { XX
} },
4146 { "(bad)", { XX
} },
4147 { "(bad)", { XX
} },
4149 { "(bad)", { XX
} },
4150 { "(bad)", { XX
} },
4151 { "(bad)", { XX
} },
4152 { "(bad)", { XX
} },
4153 { "(bad)", { XX
} },
4154 { "(bad)", { XX
} },
4155 { "(bad)", { XX
} },
4156 { "(bad)", { XX
} },
4158 { "(bad)", { XX
} },
4159 { "(bad)", { XX
} },
4160 { "(bad)", { XX
} },
4161 { "(bad)", { XX
} },
4162 { "(bad)", { XX
} },
4163 { "(bad)", { XX
} },
4164 { "(bad)", { XX
} },
4165 { "(bad)", { XX
} },
4167 { "(bad)", { XX
} },
4168 { "(bad)", { XX
} },
4169 { "(bad)", { XX
} },
4170 { "(bad)", { XX
} },
4171 { "(bad)", { XX
} },
4172 { "(bad)", { XX
} },
4173 { "(bad)", { XX
} },
4174 { "(bad)", { XX
} },
4176 { "(bad)", { XX
} },
4177 { "(bad)", { XX
} },
4178 { "(bad)", { XX
} },
4179 { "(bad)", { XX
} },
4180 { "(bad)", { XX
} },
4181 { "(bad)", { XX
} },
4182 { "(bad)", { XX
} },
4183 { "(bad)", { XX
} },
4185 { "(bad)", { XX
} },
4186 { "(bad)", { XX
} },
4187 { "(bad)", { XX
} },
4188 { "(bad)", { XX
} },
4189 { "(bad)", { XX
} },
4190 { "(bad)", { XX
} },
4191 { "(bad)", { XX
} },
4192 { "(bad)", { XX
} },
4194 { "(bad)", { XX
} },
4195 { "(bad)", { XX
} },
4196 { "(bad)", { XX
} },
4197 { "(bad)", { XX
} },
4198 { "(bad)", { XX
} },
4199 { "(bad)", { XX
} },
4200 { "(bad)", { XX
} },
4201 { "(bad)", { XX
} },
4203 { "(bad)", { XX
} },
4204 { "(bad)", { XX
} },
4205 { "(bad)", { XX
} },
4206 { "(bad)", { XX
} },
4207 { "(bad)", { XX
} },
4208 { "(bad)", { XX
} },
4209 { "(bad)", { XX
} },
4210 { "(bad)", { XX
} },
4212 { "(bad)", { XX
} },
4213 { "(bad)", { XX
} },
4214 { "(bad)", { XX
} },
4215 { "(bad)", { XX
} },
4216 { "(bad)", { XX
} },
4217 { "(bad)", { XX
} },
4218 { "(bad)", { XX
} },
4219 { "(bad)", { XX
} },
4221 { "(bad)", { XX
} },
4222 { "(bad)", { XX
} },
4223 { "(bad)", { XX
} },
4224 { "(bad)", { XX
} },
4225 { "(bad)", { XX
} },
4226 { "(bad)", { XX
} },
4227 { "(bad)", { XX
} },
4228 { "(bad)", { XX
} },
4230 /* THREE_BYTE_0F7B */
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 { "(bad)", { XX
} },
4243 { "(bad)", { XX
} },
4244 { "(bad)", { XX
} },
4245 { "(bad)", { XX
} },
4246 { "(bad)", { XX
} },
4247 { "(bad)", { XX
} },
4248 { "(bad)", { XX
} },
4249 { "(bad)", { XX
} },
4251 { "(bad)", { XX
} },
4252 { "(bad)", { XX
} },
4253 { "(bad)", { XX
} },
4254 { "(bad)", { XX
} },
4255 { "(bad)", { XX
} },
4256 { "(bad)", { XX
} },
4257 { "(bad)", { XX
} },
4258 { "(bad)", { XX
} },
4260 { "(bad)", { XX
} },
4261 { "(bad)", { XX
} },
4262 { "(bad)", { XX
} },
4263 { "(bad)", { XX
} },
4264 { "(bad)", { XX
} },
4265 { "(bad)", { XX
} },
4266 { "(bad)", { XX
} },
4267 { "(bad)", { XX
} },
4269 { "(bad)", { XX
} },
4270 { "(bad)", { XX
} },
4271 { "(bad)", { XX
} },
4272 { "(bad)", { XX
} },
4273 { "(bad)", { XX
} },
4274 { "(bad)", { XX
} },
4275 { "(bad)", { XX
} },
4276 { "(bad)", { XX
} },
4278 { "(bad)", { XX
} },
4279 { "(bad)", { XX
} },
4280 { "(bad)", { XX
} },
4281 { "(bad)", { XX
} },
4282 { "(bad)", { XX
} },
4283 { "(bad)", { XX
} },
4284 { "(bad)", { XX
} },
4285 { "(bad)", { XX
} },
4287 { "(bad)", { XX
} },
4288 { "(bad)", { XX
} },
4289 { "(bad)", { XX
} },
4290 { "(bad)", { XX
} },
4291 { "(bad)", { XX
} },
4292 { "(bad)", { XX
} },
4293 { "(bad)", { XX
} },
4294 { "(bad)", { XX
} },
4296 { "(bad)", { XX
} },
4297 { "(bad)", { XX
} },
4298 { "(bad)", { XX
} },
4299 { "(bad)", { XX
} },
4300 { "(bad)", { XX
} },
4301 { "(bad)", { XX
} },
4302 { "(bad)", { XX
} },
4303 { "(bad)", { XX
} },
4305 { "protb", { XM
, EXq
, Ib
} },
4306 { "protw", { XM
, EXq
, Ib
} },
4307 { "protd", { XM
, EXq
, Ib
} },
4308 { "protq", { XM
, EXq
, Ib
} },
4309 { "pshlb", { XM
, EXq
, Ib
} },
4310 { "pshlw", { XM
, EXq
, Ib
} },
4311 { "pshld", { XM
, EXq
, Ib
} },
4312 { "pshlq", { XM
, EXq
, Ib
} },
4314 { "pshab", { XM
, EXq
, Ib
} },
4315 { "pshaw", { XM
, EXq
, Ib
} },
4316 { "pshad", { XM
, EXq
, Ib
} },
4317 { "pshaq", { XM
, EXq
, Ib
} },
4318 { "(bad)", { XX
} },
4319 { "(bad)", { XX
} },
4320 { "(bad)", { XX
} },
4321 { "(bad)", { XX
} },
4323 { "(bad)", { XX
} },
4324 { "(bad)", { XX
} },
4325 { "(bad)", { XX
} },
4326 { "(bad)", { XX
} },
4327 { "(bad)", { XX
} },
4328 { "(bad)", { XX
} },
4329 { "(bad)", { XX
} },
4330 { "(bad)", { XX
} },
4332 { "(bad)", { XX
} },
4333 { "(bad)", { XX
} },
4334 { "(bad)", { XX
} },
4335 { "(bad)", { XX
} },
4336 { "(bad)", { XX
} },
4337 { "(bad)", { XX
} },
4338 { "(bad)", { XX
} },
4339 { "(bad)", { XX
} },
4341 { "(bad)", { XX
} },
4342 { "(bad)", { XX
} },
4343 { "(bad)", { XX
} },
4344 { "(bad)", { XX
} },
4345 { "(bad)", { XX
} },
4346 { "(bad)", { XX
} },
4347 { "(bad)", { XX
} },
4348 { "(bad)", { XX
} },
4350 { "(bad)", { XX
} },
4351 { "(bad)", { XX
} },
4352 { "(bad)", { XX
} },
4353 { "(bad)", { XX
} },
4354 { "(bad)", { XX
} },
4355 { "(bad)", { XX
} },
4356 { "(bad)", { XX
} },
4357 { "(bad)", { XX
} },
4359 { "(bad)", { XX
} },
4360 { "(bad)", { XX
} },
4361 { "(bad)", { XX
} },
4362 { "(bad)", { XX
} },
4363 { "(bad)", { XX
} },
4364 { "(bad)", { XX
} },
4365 { "(bad)", { XX
} },
4366 { "(bad)", { XX
} },
4368 { "(bad)", { XX
} },
4369 { "(bad)", { XX
} },
4370 { "(bad)", { XX
} },
4371 { "(bad)", { XX
} },
4372 { "(bad)", { XX
} },
4373 { "(bad)", { XX
} },
4374 { "(bad)", { XX
} },
4375 { "(bad)", { XX
} },
4377 { "(bad)", { XX
} },
4378 { "(bad)", { XX
} },
4379 { "(bad)", { XX
} },
4380 { "(bad)", { XX
} },
4381 { "(bad)", { XX
} },
4382 { "(bad)", { XX
} },
4383 { "(bad)", { XX
} },
4384 { "(bad)", { XX
} },
4386 { "(bad)", { XX
} },
4387 { "(bad)", { XX
} },
4388 { "(bad)", { XX
} },
4389 { "(bad)", { XX
} },
4390 { "(bad)", { XX
} },
4391 { "(bad)", { XX
} },
4392 { "(bad)", { XX
} },
4393 { "(bad)", { XX
} },
4395 { "(bad)", { XX
} },
4396 { "(bad)", { XX
} },
4397 { "(bad)", { XX
} },
4398 { "(bad)", { XX
} },
4399 { "(bad)", { XX
} },
4400 { "(bad)", { XX
} },
4401 { "(bad)", { XX
} },
4402 { "(bad)", { XX
} },
4404 { "(bad)", { XX
} },
4405 { "(bad)", { XX
} },
4406 { "(bad)", { XX
} },
4407 { "(bad)", { XX
} },
4408 { "(bad)", { XX
} },
4409 { "(bad)", { XX
} },
4410 { "(bad)", { XX
} },
4411 { "(bad)", { XX
} },
4413 { "(bad)", { XX
} },
4414 { "(bad)", { XX
} },
4415 { "(bad)", { XX
} },
4416 { "(bad)", { XX
} },
4417 { "(bad)", { XX
} },
4418 { "(bad)", { XX
} },
4419 { "(bad)", { XX
} },
4420 { "(bad)", { XX
} },
4422 { "(bad)", { XX
} },
4423 { "(bad)", { XX
} },
4424 { "(bad)", { XX
} },
4425 { "(bad)", { XX
} },
4426 { "(bad)", { XX
} },
4427 { "(bad)", { XX
} },
4428 { "(bad)", { XX
} },
4429 { "(bad)", { XX
} },
4431 { "(bad)", { XX
} },
4432 { "(bad)", { XX
} },
4433 { "(bad)", { XX
} },
4434 { "(bad)", { XX
} },
4435 { "(bad)", { XX
} },
4436 { "(bad)", { XX
} },
4437 { "(bad)", { XX
} },
4438 { "(bad)", { XX
} },
4440 { "(bad)", { XX
} },
4441 { "(bad)", { XX
} },
4442 { "(bad)", { XX
} },
4443 { "(bad)", { XX
} },
4444 { "(bad)", { XX
} },
4445 { "(bad)", { XX
} },
4446 { "(bad)", { XX
} },
4447 { "(bad)", { XX
} },
4449 { "(bad)", { XX
} },
4450 { "(bad)", { XX
} },
4451 { "(bad)", { XX
} },
4452 { "(bad)", { XX
} },
4453 { "(bad)", { XX
} },
4454 { "(bad)", { XX
} },
4455 { "(bad)", { XX
} },
4456 { "(bad)", { XX
} },
4458 { "(bad)", { XX
} },
4459 { "(bad)", { XX
} },
4460 { "(bad)", { XX
} },
4461 { "(bad)", { XX
} },
4462 { "(bad)", { XX
} },
4463 { "(bad)", { XX
} },
4464 { "(bad)", { XX
} },
4465 { "(bad)", { XX
} },
4467 { "(bad)", { XX
} },
4468 { "(bad)", { XX
} },
4469 { "(bad)", { XX
} },
4470 { "(bad)", { XX
} },
4471 { "(bad)", { XX
} },
4472 { "(bad)", { XX
} },
4473 { "(bad)", { XX
} },
4474 { "(bad)", { XX
} },
4476 { "(bad)", { XX
} },
4477 { "(bad)", { XX
} },
4478 { "(bad)", { XX
} },
4479 { "(bad)", { XX
} },
4480 { "(bad)", { XX
} },
4481 { "(bad)", { XX
} },
4482 { "(bad)", { XX
} },
4483 { "(bad)", { XX
} },
4485 { "(bad)", { XX
} },
4486 { "(bad)", { XX
} },
4487 { "(bad)", { XX
} },
4488 { "(bad)", { XX
} },
4489 { "(bad)", { XX
} },
4490 { "(bad)", { XX
} },
4491 { "(bad)", { XX
} },
4492 { "(bad)", { XX
} },
4494 { "(bad)", { XX
} },
4495 { "(bad)", { XX
} },
4496 { "(bad)", { XX
} },
4497 { "(bad)", { XX
} },
4498 { "(bad)", { XX
} },
4499 { "(bad)", { XX
} },
4500 { "(bad)", { XX
} },
4501 { "(bad)", { XX
} },
4503 { "(bad)", { XX
} },
4504 { "(bad)", { XX
} },
4505 { "(bad)", { XX
} },
4506 { "(bad)", { XX
} },
4507 { "(bad)", { XX
} },
4508 { "(bad)", { XX
} },
4509 { "(bad)", { XX
} },
4510 { "(bad)", { XX
} },
4512 { "(bad)", { XX
} },
4513 { "(bad)", { XX
} },
4514 { "(bad)", { XX
} },
4515 { "(bad)", { XX
} },
4516 { "(bad)", { XX
} },
4517 { "(bad)", { XX
} },
4518 { "(bad)", { XX
} },
4519 { "(bad)", { XX
} },
4523 static const struct dis386 mod_table
[][2] = {
4526 { "leaS", { Gv
, M
} },
4527 { "(bad)", { XX
} },
4530 /* MOD_0F01_REG_0 */
4531 { X86_64_TABLE (X86_64_0F01_REG_0
) },
4532 { RM_TABLE (RM_0F01_REG_0
) },
4535 /* MOD_0F01_REG_1 */
4536 { X86_64_TABLE (X86_64_0F01_REG_1
) },
4537 { RM_TABLE (RM_0F01_REG_1
) },
4540 /* MOD_0F01_REG_2 */
4541 { X86_64_TABLE (X86_64_0F01_REG_2
) },
4542 { "(bad)", { XX
} },
4545 /* MOD_0F01_REG_3 */
4546 { X86_64_TABLE (X86_64_0F01_REG_3
) },
4547 { RM_TABLE (RM_0F01_REG_3
) },
4550 /* MOD_0F01_REG_7 */
4551 { "invlpg", { Mb
} },
4552 { RM_TABLE (RM_0F01_REG_7
) },
4555 /* MOD_0F12_PREFIX_0 */
4556 { "movlps", { XM
, EXq
} },
4557 { "movhlps", { XM
, EXq
} },
4561 { "movlpX", { EXq
, XM
} },
4562 { "(bad)", { XX
} },
4565 /* MOD_0F16_PREFIX_0 */
4566 { "movhps", { XM
, EXq
} },
4567 { "movlhps", { XM
, EXq
} },
4571 { "movhpX", { EXq
, XM
} },
4572 { "(bad)", { XX
} },
4575 /* MOD_0F18_REG_0 */
4576 { "prefetchnta", { Mb
} },
4577 { "(bad)", { XX
} },
4580 /* MOD_0F18_REG_1 */
4581 { "prefetcht0", { Mb
} },
4582 { "(bad)", { XX
} },
4585 /* MOD_0F18_REG_2 */
4586 { "prefetcht1", { Mb
} },
4587 { "(bad)", { XX
} },
4590 /* MOD_0F18_REG_3 */
4591 { "prefetcht2", { Mb
} },
4592 { "(bad)", { XX
} },
4596 { "(bad)", { XX
} },
4597 { "movZ", { Rm
, Cm
} },
4601 { "(bad)", { XX
} },
4602 { "movZ", { Rm
, Dm
} },
4606 { "(bad)", { XX
} },
4607 { "movZ", { Cm
, Rm
} },
4611 { "(bad)", { XX
} },
4612 { "movZ", { Dm
, Rm
} },
4616 { THREE_BYTE_TABLE (THREE_BYTE_0F24
) },
4617 { "movL", { Rd
, Td
} },
4621 { "(bad)", { XX
} },
4622 { "movL", { Td
, Rd
} },
4625 /* MOD_0F2B_PREFIX_0 */
4626 {"movntps", { Ev
, XM
} },
4627 { "(bad)", { XX
} },
4630 /* MOD_0F2B_PREFIX_1 */
4631 {"movntss", { Ed
, XM
} },
4632 { "(bad)", { XX
} },
4635 /* MOD_0F2B_PREFIX_2 */
4636 {"movntpd", { Ev
, XM
} },
4637 { "(bad)", { XX
} },
4640 /* MOD_0F2B_PREFIX_3 */
4641 {"movntsd", { Eq
, XM
} },
4642 { "(bad)", { XX
} },
4646 { "(bad)", { XX
} },
4647 { "movmskpX", { Gdq
, XS
} },
4650 /* MOD_0F71_REG_2 */
4651 { "(bad)", { XX
} },
4652 { "psrlw", { MS
, Ib
} },
4655 /* MOD_0F71_REG_4 */
4656 { "(bad)", { XX
} },
4657 { "psraw", { MS
, Ib
} },
4660 /* MOD_0F71_REG_6 */
4661 { "(bad)", { XX
} },
4662 { "psllw", { MS
, Ib
} },
4665 /* MOD_0F72_REG_2 */
4666 { "(bad)", { XX
} },
4667 { "psrld", { MS
, Ib
} },
4670 /* MOD_0F72_REG_4 */
4671 { "(bad)", { XX
} },
4672 { "psrad", { MS
, Ib
} },
4675 /* MOD_0F72_REG_6 */
4676 { "(bad)", { XX
} },
4677 { "pslld", { MS
, Ib
} },
4680 /* MOD_0F73_REG_2 */
4681 { "(bad)", { XX
} },
4682 { "psrlq", { MS
, Ib
} },
4685 /* MOD_0F73_REG_3 */
4686 { "(bad)", { XX
} },
4687 { PREFIX_TABLE (PREFIX_0F73_REG_3
) },
4690 /* MOD_0F73_REG_6 */
4691 { "(bad)", { XX
} },
4692 { "psllq", { MS
, Ib
} },
4695 /* MOD_0F73_REG_7 */
4696 { "(bad)", { XX
} },
4697 { PREFIX_TABLE (PREFIX_0F73_REG_7
) },
4700 /* MOD_0FAE_REG_0 */
4701 { "fxsave", { M
} },
4702 { "(bad)", { XX
} },
4705 /* MOD_0FAE_REG_1 */
4706 { "fxrstor", { M
} },
4707 { "(bad)", { XX
} },
4710 /* MOD_0FAE_REG_2 */
4711 { "ldmxcsr", { Md
} },
4712 { "(bad)", { XX
} },
4715 /* MOD_0FAE_REG_3 */
4716 { "stmxcsr", { Md
} },
4717 { "(bad)", { XX
} },
4720 /* MOD_0FAE_REG_5 */
4721 { "(bad)", { XX
} },
4722 { RM_TABLE (RM_0FAE_REG_5
) },
4725 /* MOD_0FAE_REG_6 */
4726 { "(bad)", { XX
} },
4727 { RM_TABLE (RM_0FAE_REG_6
) },
4730 /* MOD_0FAE_REG_7 */
4731 { "clflush", { Mb
} },
4732 { RM_TABLE (RM_0FAE_REG_7
) },
4736 { "lssS", { Gv
, Mp
} },
4737 { "(bad)", { XX
} },
4741 { "lfsS", { Gv
, Mp
} },
4742 { "(bad)", { XX
} },
4746 { "lgsS", { Gv
, Mp
} },
4747 { "(bad)", { XX
} },
4750 /* MOD_0FC7_REG_6 */
4751 { PREFIX_TABLE (PREFIX_0FC7_REG_6
) },
4752 { "(bad)", { XX
} },
4755 /* MOD_0FC7_REG_7 */
4756 { "vmptrst", { Mq
} },
4757 { "(bad)", { XX
} },
4761 { "(bad)", { XX
} },
4762 { "pmovmskb", { Gdq
, MS
} },
4765 /* MOD_0FE7_PREFIX_2 */
4766 { "movntdq", { EM
, XM
} },
4767 { "(bad)", { XX
} },
4770 /* MOD_0FF0_PREFIX_3 */
4771 { "lddqu", { XM
, M
} },
4772 { "(bad)", { XX
} },
4775 /* MOD_0F382A_PREFIX_2 */
4776 { "movntdqa", { XM
, EM
} },
4777 { "(bad)", { XX
} },
4781 { "bound{S|}", { Gv
, Ma
} },
4782 { "(bad)", { XX
} },
4786 { "lesS", { Gv
, Mp
} },
4787 { "(bad)", { XX
} },
4791 { "ldsS", { Gv
, Mp
} },
4792 { "(bad)", { XX
} },
4796 static const struct dis386 rm_table
[][8] = {
4799 { "(bad)", { XX
} },
4800 { "vmcall", { Skip_MODRM
} },
4801 { "vmlaunch", { Skip_MODRM
} },
4802 { "vmresume", { Skip_MODRM
} },
4803 { "vmxoff", { Skip_MODRM
} },
4804 { "(bad)", { XX
} },
4805 { "(bad)", { XX
} },
4806 { "(bad)", { XX
} },
4810 { "monitor", { { OP_Monitor
, 0 } } },
4811 { "mwait", { { OP_Mwait
, 0 } } },
4812 { "(bad)", { XX
} },
4813 { "(bad)", { XX
} },
4814 { "(bad)", { XX
} },
4815 { "(bad)", { XX
} },
4816 { "(bad)", { XX
} },
4817 { "(bad)", { XX
} },
4821 { "vmrun", { Skip_MODRM
} },
4822 { "vmmcall", { Skip_MODRM
} },
4823 { "vmload", { Skip_MODRM
} },
4824 { "vmsave", { Skip_MODRM
} },
4825 { "stgi", { Skip_MODRM
} },
4826 { "clgi", { Skip_MODRM
} },
4827 { "skinit", { Skip_MODRM
} },
4828 { "invlpga", { Skip_MODRM
} },
4832 { "swapgs", { Skip_MODRM
} },
4833 { "rdtscp", { Skip_MODRM
} },
4834 { "(bad)", { XX
} },
4835 { "(bad)", { XX
} },
4836 { "(bad)", { XX
} },
4837 { "(bad)", { XX
} },
4838 { "(bad)", { XX
} },
4839 { "(bad)", { XX
} },
4843 { "lfence", { Skip_MODRM
} },
4844 { "(bad)", { XX
} },
4845 { "(bad)", { XX
} },
4846 { "(bad)", { XX
} },
4847 { "(bad)", { XX
} },
4848 { "(bad)", { XX
} },
4849 { "(bad)", { XX
} },
4850 { "(bad)", { XX
} },
4854 { "mfence", { Skip_MODRM
} },
4855 { "(bad)", { XX
} },
4856 { "(bad)", { XX
} },
4857 { "(bad)", { XX
} },
4858 { "(bad)", { XX
} },
4859 { "(bad)", { XX
} },
4860 { "(bad)", { XX
} },
4861 { "(bad)", { XX
} },
4865 { "sfence", { Skip_MODRM
} },
4866 { "(bad)", { XX
} },
4867 { "(bad)", { XX
} },
4868 { "(bad)", { XX
} },
4869 { "(bad)", { XX
} },
4870 { "(bad)", { XX
} },
4871 { "(bad)", { XX
} },
4872 { "(bad)", { XX
} },
4876 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
4888 FETCH_DATA (the_info
, codep
+ 1);
4892 /* REX prefixes family. */
4909 if (address_mode
== mode_64bit
)
4915 prefixes
|= PREFIX_REPZ
;
4918 prefixes
|= PREFIX_REPNZ
;
4921 prefixes
|= PREFIX_LOCK
;
4924 prefixes
|= PREFIX_CS
;
4927 prefixes
|= PREFIX_SS
;
4930 prefixes
|= PREFIX_DS
;
4933 prefixes
|= PREFIX_ES
;
4936 prefixes
|= PREFIX_FS
;
4939 prefixes
|= PREFIX_GS
;
4942 prefixes
|= PREFIX_DATA
;
4945 prefixes
|= PREFIX_ADDR
;
4948 /* fwait is really an instruction. If there are prefixes
4949 before the fwait, they belong to the fwait, *not* to the
4950 following instruction. */
4951 if (prefixes
|| rex
)
4953 prefixes
|= PREFIX_FWAIT
;
4957 prefixes
= PREFIX_FWAIT
;
4962 /* Rex is ignored when followed by another prefix. */
4973 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
4977 prefix_name (int pref
, int sizeflag
)
4979 static const char *rexes
[16] =
4984 "rex.XB", /* 0x43 */
4986 "rex.RB", /* 0x45 */
4987 "rex.RX", /* 0x46 */
4988 "rex.RXB", /* 0x47 */
4990 "rex.WB", /* 0x49 */
4991 "rex.WX", /* 0x4a */
4992 "rex.WXB", /* 0x4b */
4993 "rex.WR", /* 0x4c */
4994 "rex.WRB", /* 0x4d */
4995 "rex.WRX", /* 0x4e */
4996 "rex.WRXB", /* 0x4f */
5001 /* REX prefixes family. */
5018 return rexes
[pref
- 0x40];
5038 return (sizeflag
& DFLAG
) ? "data16" : "data32";
5040 if (address_mode
== mode_64bit
)
5041 return (sizeflag
& AFLAG
) ? "addr32" : "addr64";
5043 return (sizeflag
& AFLAG
) ? "addr16" : "addr32";
5051 static char op_out
[MAX_OPERANDS
][100];
5052 static int op_ad
, op_index
[MAX_OPERANDS
];
5053 static int two_source_ops
;
5054 static bfd_vma op_address
[MAX_OPERANDS
];
5055 static bfd_vma op_riprel
[MAX_OPERANDS
];
5056 static bfd_vma start_pc
;
5059 * On the 386's of 1988, the maximum length of an instruction is 15 bytes.
5060 * (see topic "Redundant prefixes" in the "Differences from 8086"
5061 * section of the "Virtual 8086 Mode" chapter.)
5062 * 'pc' should be the address of this instruction, it will
5063 * be used to print the target address if this is a relative jump or call
5064 * The function returns the length of this instruction in bytes.
5067 static char intel_syntax
;
5068 static char intel_mnemonic
= !SYSV386_COMPAT
;
5069 static char open_char
;
5070 static char close_char
;
5071 static char separator_char
;
5072 static char scale_char
;
5074 /* Here for backwards compatibility. When gdb stops using
5075 print_insn_i386_att and print_insn_i386_intel these functions can
5076 disappear, and print_insn_i386 be merged into print_insn. */
5078 print_insn_i386_att (bfd_vma pc
, disassemble_info
*info
)
5082 return print_insn (pc
, info
);
5086 print_insn_i386_intel (bfd_vma pc
, disassemble_info
*info
)
5090 return print_insn (pc
, info
);
5094 print_insn_i386 (bfd_vma pc
, disassemble_info
*info
)
5098 return print_insn (pc
, info
);
5102 print_i386_disassembler_options (FILE *stream
)
5104 fprintf (stream
, _("\n\
5105 The following i386/x86-64 specific disassembler options are supported for use\n\
5106 with the -M switch (multiple options should be separated by commas):\n"));
5108 fprintf (stream
, _(" x86-64 Disassemble in 64bit mode\n"));
5109 fprintf (stream
, _(" i386 Disassemble in 32bit mode\n"));
5110 fprintf (stream
, _(" i8086 Disassemble in 16bit mode\n"));
5111 fprintf (stream
, _(" att Display instruction in AT&T syntax\n"));
5112 fprintf (stream
, _(" intel Display instruction in Intel syntax\n"));
5113 fprintf (stream
, _(" att-mnemonic\n"
5114 " Display instruction in AT&T mnemonic\n"));
5115 fprintf (stream
, _(" intel-mnemonic\n"
5116 " Display instruction in Intel mnemonic\n"));
5117 fprintf (stream
, _(" addr64 Assume 64bit address size\n"));
5118 fprintf (stream
, _(" addr32 Assume 32bit address size\n"));
5119 fprintf (stream
, _(" addr16 Assume 16bit address size\n"));
5120 fprintf (stream
, _(" data32 Assume 32bit data size\n"));
5121 fprintf (stream
, _(" data16 Assume 16bit data size\n"));
5122 fprintf (stream
, _(" suffix Always display instruction suffix in AT&T syntax\n"));
5125 /* Get a pointer to struct dis386 with a valid name. */
5127 static const struct dis386
*
5128 get_valid_dis386 (const struct dis386
*dp
, disassemble_info
*info
)
5132 if (dp
->name
!= NULL
)
5135 switch (dp
->op
[0].bytemode
)
5138 dp
= ®_table
[dp
->op
[1].bytemode
][modrm
.reg
];
5142 index
= modrm
.mod
== 0x3 ? 1 : 0;
5143 dp
= &mod_table
[dp
->op
[1].bytemode
][index
];
5147 dp
= &rm_table
[dp
->op
[1].bytemode
][modrm
.rm
];
5150 case USE_PREFIX_TABLE
:
5152 used_prefixes
|= (prefixes
& PREFIX_REPZ
);
5153 if (prefixes
& PREFIX_REPZ
)
5160 /* We should check PREFIX_REPNZ and PREFIX_REPZ before
5162 used_prefixes
|= (prefixes
& PREFIX_REPNZ
);
5163 if (prefixes
& PREFIX_REPNZ
)
5166 repnz_prefix
= NULL
;
5170 used_prefixes
|= (prefixes
& PREFIX_DATA
);
5171 if (prefixes
& PREFIX_DATA
)
5178 dp
= &prefix_table
[dp
->op
[1].bytemode
][index
];
5181 case USE_X86_64_TABLE
:
5182 index
= address_mode
== mode_64bit
? 1 : 0;
5183 dp
= &x86_64_table
[dp
->op
[1].bytemode
][index
];
5186 case USE_3BYTE_TABLE
:
5187 FETCH_DATA (info
, codep
+ 2);
5189 dp
= &three_byte_table
[dp
->op
[1].bytemode
][index
];
5190 modrm
.mod
= (*codep
>> 6) & 3;
5191 modrm
.reg
= (*codep
>> 3) & 7;
5192 modrm
.rm
= *codep
& 7;
5196 oappend (INTERNAL_DISASSEMBLER_ERROR
);
5200 if (dp
->name
!= NULL
)
5203 return get_valid_dis386 (dp
, info
);
5207 print_insn (bfd_vma pc
, disassemble_info
*info
)
5209 const struct dis386
*dp
;
5211 char *op_txt
[MAX_OPERANDS
];
5215 struct dis_private priv
;
5217 char prefix_obuf
[32];
5220 if (info
->mach
== bfd_mach_x86_64_intel_syntax
5221 || info
->mach
== bfd_mach_x86_64
)
5222 address_mode
= mode_64bit
;
5224 address_mode
= mode_32bit
;
5226 if (intel_syntax
== (char) -1)
5227 intel_syntax
= (info
->mach
== bfd_mach_i386_i386_intel_syntax
5228 || info
->mach
== bfd_mach_x86_64_intel_syntax
);
5230 if (info
->mach
== bfd_mach_i386_i386
5231 || info
->mach
== bfd_mach_x86_64
5232 || info
->mach
== bfd_mach_i386_i386_intel_syntax
5233 || info
->mach
== bfd_mach_x86_64_intel_syntax
)
5234 priv
.orig_sizeflag
= AFLAG
| DFLAG
;
5235 else if (info
->mach
== bfd_mach_i386_i8086
)
5236 priv
.orig_sizeflag
= 0;
5240 for (p
= info
->disassembler_options
; p
!= NULL
; )
5242 if (CONST_STRNEQ (p
, "x86-64"))
5244 address_mode
= mode_64bit
;
5245 priv
.orig_sizeflag
= AFLAG
| DFLAG
;
5247 else if (CONST_STRNEQ (p
, "i386"))
5249 address_mode
= mode_32bit
;
5250 priv
.orig_sizeflag
= AFLAG
| DFLAG
;
5252 else if (CONST_STRNEQ (p
, "i8086"))
5254 address_mode
= mode_16bit
;
5255 priv
.orig_sizeflag
= 0;
5257 else if (CONST_STRNEQ (p
, "intel"))
5260 if (CONST_STRNEQ (p
+ 5, "-mnemonic"))
5263 else if (CONST_STRNEQ (p
, "att"))
5266 if (CONST_STRNEQ (p
+ 3, "-mnemonic"))
5269 else if (CONST_STRNEQ (p
, "addr"))
5271 if (address_mode
== mode_64bit
)
5273 if (p
[4] == '3' && p
[5] == '2')
5274 priv
.orig_sizeflag
&= ~AFLAG
;
5275 else if (p
[4] == '6' && p
[5] == '4')
5276 priv
.orig_sizeflag
|= AFLAG
;
5280 if (p
[4] == '1' && p
[5] == '6')
5281 priv
.orig_sizeflag
&= ~AFLAG
;
5282 else if (p
[4] == '3' && p
[5] == '2')
5283 priv
.orig_sizeflag
|= AFLAG
;
5286 else if (CONST_STRNEQ (p
, "data"))
5288 if (p
[4] == '1' && p
[5] == '6')
5289 priv
.orig_sizeflag
&= ~DFLAG
;
5290 else if (p
[4] == '3' && p
[5] == '2')
5291 priv
.orig_sizeflag
|= DFLAG
;
5293 else if (CONST_STRNEQ (p
, "suffix"))
5294 priv
.orig_sizeflag
|= SUFFIX_ALWAYS
;
5296 p
= strchr (p
, ',');
5303 names64
= intel_names64
;
5304 names32
= intel_names32
;
5305 names16
= intel_names16
;
5306 names8
= intel_names8
;
5307 names8rex
= intel_names8rex
;
5308 names_seg
= intel_names_seg
;
5309 index64
= intel_index64
;
5310 index32
= intel_index32
;
5311 index16
= intel_index16
;
5314 separator_char
= '+';
5319 names64
= att_names64
;
5320 names32
= att_names32
;
5321 names16
= att_names16
;
5322 names8
= att_names8
;
5323 names8rex
= att_names8rex
;
5324 names_seg
= att_names_seg
;
5325 index64
= att_index64
;
5326 index32
= att_index32
;
5327 index16
= att_index16
;
5330 separator_char
= ',';
5334 /* The output looks better if we put 7 bytes on a line, since that
5335 puts most long word instructions on a single line. */
5336 info
->bytes_per_line
= 7;
5338 info
->private_data
= &priv
;
5339 priv
.max_fetched
= priv
.the_buffer
;
5340 priv
.insn_start
= pc
;
5343 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
5351 start_codep
= priv
.the_buffer
;
5352 codep
= priv
.the_buffer
;
5354 if (setjmp (priv
.bailout
) != 0)
5358 /* Getting here means we tried for data but didn't get it. That
5359 means we have an incomplete instruction of some sort. Just
5360 print the first byte as a prefix or a .byte pseudo-op. */
5361 if (codep
> priv
.the_buffer
)
5363 name
= prefix_name (priv
.the_buffer
[0], priv
.orig_sizeflag
);
5365 (*info
->fprintf_func
) (info
->stream
, "%s", name
);
5368 /* Just print the first byte as a .byte instruction. */
5369 (*info
->fprintf_func
) (info
->stream
, ".byte 0x%x",
5370 (unsigned int) priv
.the_buffer
[0]);
5383 sizeflag
= priv
.orig_sizeflag
;
5385 FETCH_DATA (info
, codep
+ 1);
5386 two_source_ops
= (*codep
== 0x62) || (*codep
== 0xc8);
5388 if (((prefixes
& PREFIX_FWAIT
)
5389 && ((*codep
< 0xd8) || (*codep
> 0xdf)))
5390 || (rex
&& rex_used
))
5394 /* fwait not followed by floating point instruction, or rex followed
5395 by other prefixes. Print the first prefix. */
5396 name
= prefix_name (priv
.the_buffer
[0], priv
.orig_sizeflag
);
5398 name
= INTERNAL_DISASSEMBLER_ERROR
;
5399 (*info
->fprintf_func
) (info
->stream
, "%s", name
);
5406 unsigned char threebyte
;
5407 FETCH_DATA (info
, codep
+ 2);
5408 threebyte
= *++codep
;
5409 dp
= &dis386_twobyte
[threebyte
];
5410 need_modrm
= twobyte_has_modrm
[*codep
];
5415 dp
= &dis386
[*codep
];
5416 need_modrm
= onebyte_has_modrm
[*codep
];
5420 if ((prefixes
& PREFIX_REPZ
))
5422 repz_prefix
= "repz ";
5423 used_prefixes
|= PREFIX_REPZ
;
5428 if ((prefixes
& PREFIX_REPNZ
))
5430 repnz_prefix
= "repnz ";
5431 used_prefixes
|= PREFIX_REPNZ
;
5434 repnz_prefix
= NULL
;
5436 if ((prefixes
& PREFIX_LOCK
))
5438 lock_prefix
= "lock ";
5439 used_prefixes
|= PREFIX_LOCK
;
5445 if (prefixes
& PREFIX_ADDR
)
5448 if (dp
->op
[2].bytemode
!= loop_jcxz_mode
|| intel_syntax
)
5450 if ((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
5451 addr_prefix
= "addr32 ";
5453 addr_prefix
= "addr16 ";
5454 used_prefixes
|= PREFIX_ADDR
;
5459 if ((prefixes
& PREFIX_DATA
))
5462 if (dp
->op
[2].bytemode
== cond_jump_mode
5463 && dp
->op
[0].bytemode
== v_mode
5466 if (sizeflag
& DFLAG
)
5467 data_prefix
= "data32 ";
5469 data_prefix
= "data16 ";
5470 used_prefixes
|= PREFIX_DATA
;
5476 FETCH_DATA (info
, codep
+ 1);
5477 modrm
.mod
= (*codep
>> 6) & 3;
5478 modrm
.reg
= (*codep
>> 3) & 7;
5479 modrm
.rm
= *codep
& 7;
5482 if (dp
->name
== NULL
&& dp
->op
[0].bytemode
== FLOATCODE
)
5488 dp
= get_valid_dis386 (dp
, info
);
5489 if (dp
!= NULL
&& putop (dp
->name
, sizeflag
) == 0)
5491 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
5494 op_ad
= MAX_OPERANDS
- 1 - i
;
5496 (*dp
->op
[i
].rtn
) (dp
->op
[i
].bytemode
, sizeflag
);
5501 /* See if any prefixes were not used. If so, print the first one
5502 separately. If we don't do this, we'll wind up printing an
5503 instruction stream which does not precisely correspond to the
5504 bytes we are disassembling. */
5505 if ((prefixes
& ~used_prefixes
) != 0)
5509 name
= prefix_name (priv
.the_buffer
[0], priv
.orig_sizeflag
);
5511 name
= INTERNAL_DISASSEMBLER_ERROR
;
5512 (*info
->fprintf_func
) (info
->stream
, "%s", name
);
5515 if (rex
& ~rex_used
)
5518 name
= prefix_name (rex
| 0x40, priv
.orig_sizeflag
);
5520 name
= INTERNAL_DISASSEMBLER_ERROR
;
5521 (*info
->fprintf_func
) (info
->stream
, "%s ", name
);
5525 prefix_obufp
= prefix_obuf
;
5527 prefix_obufp
= stpcpy (prefix_obufp
, lock_prefix
);
5529 prefix_obufp
= stpcpy (prefix_obufp
, repz_prefix
);
5531 prefix_obufp
= stpcpy (prefix_obufp
, repnz_prefix
);
5533 prefix_obufp
= stpcpy (prefix_obufp
, addr_prefix
);
5535 prefix_obufp
= stpcpy (prefix_obufp
, data_prefix
);
5537 if (prefix_obuf
[0] != 0)
5538 (*info
->fprintf_func
) (info
->stream
, "%s", prefix_obuf
);
5540 obufp
= obuf
+ strlen (obuf
);
5541 for (i
= strlen (obuf
) + strlen (prefix_obuf
); i
< 6; i
++)
5544 (*info
->fprintf_func
) (info
->stream
, "%s", obuf
);
5546 /* The enter and bound instructions are printed with operands in the same
5547 order as the intel book; everything else is printed in reverse order. */
5548 if (intel_syntax
|| two_source_ops
)
5552 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
5553 op_txt
[i
] = op_out
[i
];
5555 for (i
= 0; i
< (MAX_OPERANDS
>> 1); ++i
)
5557 op_ad
= op_index
[i
];
5558 op_index
[i
] = op_index
[MAX_OPERANDS
- 1 - i
];
5559 op_index
[MAX_OPERANDS
- 1 - i
] = op_ad
;
5560 riprel
= op_riprel
[i
];
5561 op_riprel
[i
] = op_riprel
[MAX_OPERANDS
- 1 - i
];
5562 op_riprel
[MAX_OPERANDS
- 1 - i
] = riprel
;
5567 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
5568 op_txt
[MAX_OPERANDS
- 1 - i
] = op_out
[i
];
5572 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
5576 (*info
->fprintf_func
) (info
->stream
, ",");
5577 if (op_index
[i
] != -1 && !op_riprel
[i
])
5578 (*info
->print_address_func
) ((bfd_vma
) op_address
[op_index
[i
]], info
);
5580 (*info
->fprintf_func
) (info
->stream
, "%s", op_txt
[i
]);
5584 for (i
= 0; i
< MAX_OPERANDS
; i
++)
5585 if (op_index
[i
] != -1 && op_riprel
[i
])
5587 (*info
->fprintf_func
) (info
->stream
, " # ");
5588 (*info
->print_address_func
) ((bfd_vma
) (start_pc
+ codep
- start_codep
5589 + op_address
[op_index
[i
]]), info
);
5592 return codep
- priv
.the_buffer
;
5595 static const char *float_mem
[] = {
5670 static const unsigned char float_mem_mode
[] = {
5745 #define ST { OP_ST, 0 }
5746 #define STi { OP_STi, 0 }
5748 #define FGRPd9_2 NULL, { { NULL, 0 } }
5749 #define FGRPd9_4 NULL, { { NULL, 1 } }
5750 #define FGRPd9_5 NULL, { { NULL, 2 } }
5751 #define FGRPd9_6 NULL, { { NULL, 3 } }
5752 #define FGRPd9_7 NULL, { { NULL, 4 } }
5753 #define FGRPda_5 NULL, { { NULL, 5 } }
5754 #define FGRPdb_4 NULL, { { NULL, 6 } }
5755 #define FGRPde_3 NULL, { { NULL, 7 } }
5756 #define FGRPdf_4 NULL, { { NULL, 8 } }
5758 static const struct dis386 float_reg
[][8] = {
5761 { "fadd", { ST
, STi
} },
5762 { "fmul", { ST
, STi
} },
5763 { "fcom", { STi
} },
5764 { "fcomp", { STi
} },
5765 { "fsub", { ST
, STi
} },
5766 { "fsubr", { ST
, STi
} },
5767 { "fdiv", { ST
, STi
} },
5768 { "fdivr", { ST
, STi
} },
5773 { "fxch", { STi
} },
5775 { "(bad)", { XX
} },
5783 { "fcmovb", { ST
, STi
} },
5784 { "fcmove", { ST
, STi
} },
5785 { "fcmovbe",{ ST
, STi
} },
5786 { "fcmovu", { ST
, STi
} },
5787 { "(bad)", { XX
} },
5789 { "(bad)", { XX
} },
5790 { "(bad)", { XX
} },
5794 { "fcmovnb",{ ST
, STi
} },
5795 { "fcmovne",{ ST
, STi
} },
5796 { "fcmovnbe",{ ST
, STi
} },
5797 { "fcmovnu",{ ST
, STi
} },
5799 { "fucomi", { ST
, STi
} },
5800 { "fcomi", { ST
, STi
} },
5801 { "(bad)", { XX
} },
5805 { "fadd", { STi
, ST
} },
5806 { "fmul", { STi
, ST
} },
5807 { "(bad)", { XX
} },
5808 { "(bad)", { XX
} },
5809 { "fsub!M", { STi
, ST
} },
5810 { "fsubM", { STi
, ST
} },
5811 { "fdiv!M", { STi
, ST
} },
5812 { "fdivM", { STi
, ST
} },
5816 { "ffree", { STi
} },
5817 { "(bad)", { XX
} },
5819 { "fstp", { STi
} },
5820 { "fucom", { STi
} },
5821 { "fucomp", { STi
} },
5822 { "(bad)", { XX
} },
5823 { "(bad)", { XX
} },
5827 { "faddp", { STi
, ST
} },
5828 { "fmulp", { STi
, ST
} },
5829 { "(bad)", { XX
} },
5831 { "fsub!Mp", { STi
, ST
} },
5832 { "fsubMp", { STi
, ST
} },
5833 { "fdiv!Mp", { STi
, ST
} },
5834 { "fdivMp", { STi
, ST
} },
5838 { "ffreep", { STi
} },
5839 { "(bad)", { XX
} },
5840 { "(bad)", { XX
} },
5841 { "(bad)", { XX
} },
5843 { "fucomip", { ST
, STi
} },
5844 { "fcomip", { ST
, STi
} },
5845 { "(bad)", { XX
} },
5849 static char *fgrps
[][8] = {
5852 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
5857 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
5862 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
5867 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
5872 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
5877 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
5882 "feni(287 only)","fdisi(287 only)","fNclex","fNinit",
5883 "fNsetpm(287 only)","(bad)","(bad)","(bad)",
5888 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
5893 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
5898 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED
,
5899 int sizeflag ATTRIBUTE_UNUSED
)
5901 /* Skip mod/rm byte. */
5907 dofloat (int sizeflag
)
5909 const struct dis386
*dp
;
5910 unsigned char floatop
;
5912 floatop
= codep
[-1];
5916 int fp_indx
= (floatop
- 0xd8) * 8 + modrm
.reg
;
5918 putop (float_mem
[fp_indx
], sizeflag
);
5921 OP_E (float_mem_mode
[fp_indx
], sizeflag
);
5924 /* Skip mod/rm byte. */
5928 dp
= &float_reg
[floatop
- 0xd8][modrm
.reg
];
5929 if (dp
->name
== NULL
)
5931 putop (fgrps
[dp
->op
[0].bytemode
][modrm
.rm
], sizeflag
);
5933 /* Instruction fnstsw is only one with strange arg. */
5934 if (floatop
== 0xdf && codep
[-1] == 0xe0)
5935 strcpy (op_out
[0], names16
[0]);
5939 putop (dp
->name
, sizeflag
);
5944 (*dp
->op
[0].rtn
) (dp
->op
[0].bytemode
, sizeflag
);
5949 (*dp
->op
[1].rtn
) (dp
->op
[1].bytemode
, sizeflag
);
5954 OP_ST (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
5956 oappend ("%st" + intel_syntax
);
5960 OP_STi (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
5962 sprintf (scratchbuf
, "%%st(%d)", modrm
.rm
);
5963 oappend (scratchbuf
+ intel_syntax
);
5966 /* Capital letters in template are macros. */
5968 putop (const char *template, int sizeflag
)
5973 unsigned int l
= 0, len
= 1;
5976 #define SAVE_LAST(c) \
5977 if (l < len && l < sizeof (last)) \
5982 for (p
= template; *p
; p
++)
6000 if (*p
== '}' || *p
== '\0')
6019 if (modrm
.mod
!= 3 || (sizeflag
& SUFFIX_ALWAYS
))
6025 if (sizeflag
& SUFFIX_ALWAYS
)
6029 if (intel_syntax
&& !alt
)
6031 if ((prefixes
& PREFIX_DATA
) || (sizeflag
& SUFFIX_ALWAYS
))
6033 if (sizeflag
& DFLAG
)
6034 *obufp
++ = intel_syntax
? 'd' : 'l';
6036 *obufp
++ = intel_syntax
? 'w' : 's';
6037 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6041 if (intel_syntax
|| !(sizeflag
& SUFFIX_ALWAYS
))
6048 else if (sizeflag
& DFLAG
)
6049 *obufp
++ = intel_syntax
? 'd' : 'l';
6052 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6057 case 'E': /* For jcxz/jecxz */
6058 if (address_mode
== mode_64bit
)
6060 if (sizeflag
& AFLAG
)
6066 if (sizeflag
& AFLAG
)
6068 used_prefixes
|= (prefixes
& PREFIX_ADDR
);
6073 if ((prefixes
& PREFIX_ADDR
) || (sizeflag
& SUFFIX_ALWAYS
))
6075 if (sizeflag
& AFLAG
)
6076 *obufp
++ = address_mode
== mode_64bit
? 'q' : 'l';
6078 *obufp
++ = address_mode
== mode_64bit
? 'l' : 'w';
6079 used_prefixes
|= (prefixes
& PREFIX_ADDR
);
6083 if (intel_syntax
|| (obufp
[-1] != 's' && !(sizeflag
& SUFFIX_ALWAYS
)))
6085 if ((rex
& REX_W
) || (sizeflag
& DFLAG
))
6090 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6095 if ((prefixes
& (PREFIX_CS
| PREFIX_DS
)) == PREFIX_CS
6096 || (prefixes
& (PREFIX_CS
| PREFIX_DS
)) == PREFIX_DS
)
6098 used_prefixes
|= prefixes
& (PREFIX_CS
| PREFIX_DS
);
6101 if (prefixes
& PREFIX_DS
)
6122 if (address_mode
== mode_64bit
&& (sizeflag
& SUFFIX_ALWAYS
))
6130 if (l
!= 0 || len
!= 1)
6138 if (sizeflag
& SUFFIX_ALWAYS
)
6142 if (intel_mnemonic
!= cond
)
6146 if ((prefixes
& PREFIX_FWAIT
) == 0)
6149 used_prefixes
|= PREFIX_FWAIT
;
6155 else if (intel_syntax
&& (sizeflag
& DFLAG
))
6160 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6165 if (address_mode
== mode_64bit
&& (sizeflag
& DFLAG
))
6174 if ((prefixes
& PREFIX_DATA
)
6176 || (sizeflag
& SUFFIX_ALWAYS
))
6183 if (sizeflag
& DFLAG
)
6188 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6194 if (address_mode
== mode_64bit
&& (sizeflag
& DFLAG
))
6196 if (modrm
.mod
!= 3 || (sizeflag
& SUFFIX_ALWAYS
))
6203 if (l
== 0 && len
== 1)
6206 if (intel_syntax
&& !alt
)
6209 if (modrm
.mod
!= 3 || (sizeflag
& SUFFIX_ALWAYS
))
6215 if (sizeflag
& DFLAG
)
6216 *obufp
++ = intel_syntax
? 'd' : 'l';
6220 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6225 if (l
!= 1 || len
!= 2 || last
[0] != 'L')
6231 || (modrm
.mod
== 3 && !(sizeflag
& SUFFIX_ALWAYS
)))
6246 else if (sizeflag
& DFLAG
)
6255 if (intel_syntax
&& !p
[1]
6256 && ((rex
& REX_W
) || (sizeflag
& DFLAG
)))
6259 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6264 if (address_mode
== mode_64bit
&& (sizeflag
& DFLAG
))
6266 if (sizeflag
& SUFFIX_ALWAYS
)
6274 if (sizeflag
& SUFFIX_ALWAYS
)
6280 if (sizeflag
& DFLAG
)
6284 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6289 if (prefixes
& PREFIX_DATA
)
6293 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6296 if (intel_syntax
|| !(sizeflag
& SUFFIX_ALWAYS
))
6304 /* implicit operand size 'l' for i386 or 'q' for x86-64 */
6306 /* operand size flag for cwtl, cbtw */
6315 else if (sizeflag
& DFLAG
)
6320 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6330 oappend (const char *s
)
6333 obufp
+= strlen (s
);
6339 if (prefixes
& PREFIX_CS
)
6341 used_prefixes
|= PREFIX_CS
;
6342 oappend ("%cs:" + intel_syntax
);
6344 if (prefixes
& PREFIX_DS
)
6346 used_prefixes
|= PREFIX_DS
;
6347 oappend ("%ds:" + intel_syntax
);
6349 if (prefixes
& PREFIX_SS
)
6351 used_prefixes
|= PREFIX_SS
;
6352 oappend ("%ss:" + intel_syntax
);
6354 if (prefixes
& PREFIX_ES
)
6356 used_prefixes
|= PREFIX_ES
;
6357 oappend ("%es:" + intel_syntax
);
6359 if (prefixes
& PREFIX_FS
)
6361 used_prefixes
|= PREFIX_FS
;
6362 oappend ("%fs:" + intel_syntax
);
6364 if (prefixes
& PREFIX_GS
)
6366 used_prefixes
|= PREFIX_GS
;
6367 oappend ("%gs:" + intel_syntax
);
6372 OP_indirE (int bytemode
, int sizeflag
)
6376 OP_E (bytemode
, sizeflag
);
6380 print_operand_value (char *buf
, int hex
, bfd_vma disp
)
6382 if (address_mode
== mode_64bit
)
6390 sprintf_vma (tmp
, disp
);
6391 for (i
= 0; tmp
[i
] == '0' && tmp
[i
+ 1]; i
++);
6392 strcpy (buf
+ 2, tmp
+ i
);
6396 bfd_signed_vma v
= disp
;
6403 /* Check for possible overflow on 0x8000000000000000. */
6406 strcpy (buf
, "9223372036854775808");
6420 tmp
[28 - i
] = (v
% 10) + '0';
6424 strcpy (buf
, tmp
+ 29 - i
);
6430 sprintf (buf
, "0x%x", (unsigned int) disp
);
6432 sprintf (buf
, "%d", (int) disp
);
6436 /* Put DISP in BUF as signed hex number. */
6439 print_displacement (char *buf
, bfd_vma disp
)
6441 bfd_signed_vma val
= disp
;
6450 /* Check for possible overflow. */
6453 switch (address_mode
)
6456 strcpy (buf
+ j
, "0x8000000000000000");
6459 strcpy (buf
+ j
, "0x80000000");
6462 strcpy (buf
+ j
, "0x8000");
6472 sprintf_vma (tmp
, val
);
6473 for (i
= 0; tmp
[i
] == '0'; i
++)
6477 strcpy (buf
+ j
, tmp
+ i
);
6481 intel_operand_size (int bytemode
, int sizeflag
)
6487 oappend ("BYTE PTR ");
6491 oappend ("WORD PTR ");
6494 if (address_mode
== mode_64bit
&& (sizeflag
& DFLAG
))
6496 oappend ("QWORD PTR ");
6497 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6505 oappend ("QWORD PTR ");
6506 else if ((sizeflag
& DFLAG
) || bytemode
== dq_mode
)
6507 oappend ("DWORD PTR ");
6509 oappend ("WORD PTR ");
6510 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6513 if ((rex
& REX_W
) || (sizeflag
& DFLAG
))
6515 oappend ("WORD PTR ");
6517 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6521 oappend ("DWORD PTR ");
6524 oappend ("QWORD PTR ");
6527 if (address_mode
== mode_64bit
)
6528 oappend ("QWORD PTR ");
6530 oappend ("DWORD PTR ");
6533 if (sizeflag
& DFLAG
)
6534 oappend ("FWORD PTR ");
6536 oappend ("DWORD PTR ");
6537 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6540 oappend ("TBYTE PTR ");
6543 oappend ("XMMWORD PTR ");
6546 oappend ("OWORD PTR ");
6554 OP_E_extended (int bytemode
, int sizeflag
, int has_drex
)
6563 /* Skip mod/rm byte. */
6574 oappend (names8rex
[modrm
.rm
+ add
]);
6576 oappend (names8
[modrm
.rm
+ add
]);
6579 oappend (names16
[modrm
.rm
+ add
]);
6582 oappend (names32
[modrm
.rm
+ add
]);
6585 oappend (names64
[modrm
.rm
+ add
]);
6588 if (address_mode
== mode_64bit
)
6589 oappend (names64
[modrm
.rm
+ add
]);
6591 oappend (names32
[modrm
.rm
+ add
]);
6594 if (address_mode
== mode_64bit
&& (sizeflag
& DFLAG
))
6596 oappend (names64
[modrm
.rm
+ add
]);
6597 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6609 oappend (names64
[modrm
.rm
+ add
]);
6610 else if ((sizeflag
& DFLAG
) || bytemode
!= v_mode
)
6611 oappend (names32
[modrm
.rm
+ add
]);
6613 oappend (names16
[modrm
.rm
+ add
]);
6614 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6619 oappend (INTERNAL_DISASSEMBLER_ERROR
);
6627 intel_operand_size (bytemode
, sizeflag
);
6630 if ((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
6632 /* 32/64 bit address mode */
6650 FETCH_DATA (the_info
, codep
+ 1);
6651 index
= (*codep
>> 3) & 7;
6652 scale
= (*codep
>> 6) & 3;
6657 haveindex
= index
!= 4;
6662 /* If we have a DREX byte, skip it now
6663 (it has already been handled) */
6666 FETCH_DATA (the_info
, codep
+ 1);
6673 if ((base
& 7) == 5)
6676 if (address_mode
== mode_64bit
&& !havesib
)
6682 FETCH_DATA (the_info
, codep
+ 1);
6684 if ((disp
& 0x80) != 0)
6692 /* In 32bit mode, we need index register to tell [offset] from
6693 [eiz*1 + offset]. */
6694 needindex
= (havesib
6697 && address_mode
== mode_32bit
);
6698 havedisp
= (havebase
6700 || (havesib
&& (haveindex
|| scale
!= 0)));
6703 if (modrm
.mod
!= 0 || (base
& 7) == 5)
6705 if (havedisp
|| riprel
)
6706 print_displacement (scratchbuf
, disp
);
6708 print_operand_value (scratchbuf
, 1, disp
);
6709 oappend (scratchbuf
);
6713 oappend (sizeflag
& AFLAG
? "(%rip)" : "(%eip)");
6717 if (havebase
|| haveindex
|| riprel
)
6718 used_prefixes
|= PREFIX_ADDR
;
6720 if (havedisp
|| (intel_syntax
&& riprel
))
6722 *obufp
++ = open_char
;
6723 if (intel_syntax
&& riprel
)
6726 oappend (sizeflag
& AFLAG
? "rip" : "eip");
6730 oappend (address_mode
== mode_64bit
&& (sizeflag
& AFLAG
)
6731 ? names64
[base
] : names32
[base
]);
6734 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
6735 print index to tell base + index from base. */
6739 || (havebase
&& base
!= ESP_REG_NUM
))
6741 if (!intel_syntax
|| havebase
)
6743 *obufp
++ = separator_char
;
6747 oappend (address_mode
== mode_64bit
6748 && (sizeflag
& AFLAG
)
6749 ? names64
[index
] : names32
[index
]);
6751 oappend (address_mode
== mode_64bit
6752 && (sizeflag
& AFLAG
)
6753 ? index64
: index32
);
6755 *obufp
++ = scale_char
;
6757 sprintf (scratchbuf
, "%d", 1 << scale
);
6758 oappend (scratchbuf
);
6762 && (disp
|| modrm
.mod
!= 0 || (base
& 7) == 5))
6764 if (!havedisp
|| (bfd_signed_vma
) disp
>= 0)
6769 else if (modrm
.mod
!= 1)
6773 disp
= - (bfd_signed_vma
) disp
;
6777 print_displacement (scratchbuf
, disp
);
6779 print_operand_value (scratchbuf
, 1, disp
);
6780 oappend (scratchbuf
);
6783 *obufp
++ = close_char
;
6786 else if (intel_syntax
)
6788 if (modrm
.mod
!= 0 || (base
& 7) == 5)
6790 if (prefixes
& (PREFIX_CS
| PREFIX_SS
| PREFIX_DS
6791 | PREFIX_ES
| PREFIX_FS
| PREFIX_GS
))
6795 oappend (names_seg
[ds_reg
- es_reg
]);
6798 print_operand_value (scratchbuf
, 1, disp
);
6799 oappend (scratchbuf
);
6804 { /* 16 bit address mode */
6811 if ((disp
& 0x8000) != 0)
6816 FETCH_DATA (the_info
, codep
+ 1);
6818 if ((disp
& 0x80) != 0)
6823 if ((disp
& 0x8000) != 0)
6829 if (modrm
.mod
!= 0 || modrm
.rm
== 6)
6831 print_displacement (scratchbuf
, disp
);
6832 oappend (scratchbuf
);
6835 if (modrm
.mod
!= 0 || modrm
.rm
!= 6)
6837 *obufp
++ = open_char
;
6839 oappend (index16
[modrm
.rm
]);
6841 && (disp
|| modrm
.mod
!= 0 || modrm
.rm
== 6))
6843 if ((bfd_signed_vma
) disp
>= 0)
6848 else if (modrm
.mod
!= 1)
6852 disp
= - (bfd_signed_vma
) disp
;
6855 print_displacement (scratchbuf
, disp
);
6856 oappend (scratchbuf
);
6859 *obufp
++ = close_char
;
6862 else if (intel_syntax
)
6864 if (prefixes
& (PREFIX_CS
| PREFIX_SS
| PREFIX_DS
6865 | PREFIX_ES
| PREFIX_FS
| PREFIX_GS
))
6869 oappend (names_seg
[ds_reg
- es_reg
]);
6872 print_operand_value (scratchbuf
, 1, disp
& 0xffff);
6873 oappend (scratchbuf
);
6879 OP_E (int bytemode
, int sizeflag
)
6881 OP_E_extended (bytemode
, sizeflag
, 0);
6886 OP_G (int bytemode
, int sizeflag
)
6897 oappend (names8rex
[modrm
.reg
+ add
]);
6899 oappend (names8
[modrm
.reg
+ add
]);
6902 oappend (names16
[modrm
.reg
+ add
]);
6905 oappend (names32
[modrm
.reg
+ add
]);
6908 oappend (names64
[modrm
.reg
+ add
]);
6917 oappend (names64
[modrm
.reg
+ add
]);
6918 else if ((sizeflag
& DFLAG
) || bytemode
!= v_mode
)
6919 oappend (names32
[modrm
.reg
+ add
]);
6921 oappend (names16
[modrm
.reg
+ add
]);
6922 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6925 if (address_mode
== mode_64bit
)
6926 oappend (names64
[modrm
.reg
+ add
]);
6928 oappend (names32
[modrm
.reg
+ add
]);
6931 oappend (INTERNAL_DISASSEMBLER_ERROR
);
6944 FETCH_DATA (the_info
, codep
+ 8);
6945 a
= *codep
++ & 0xff;
6946 a
|= (*codep
++ & 0xff) << 8;
6947 a
|= (*codep
++ & 0xff) << 16;
6948 a
|= (*codep
++ & 0xff) << 24;
6949 b
= *codep
++ & 0xff;
6950 b
|= (*codep
++ & 0xff) << 8;
6951 b
|= (*codep
++ & 0xff) << 16;
6952 b
|= (*codep
++ & 0xff) << 24;
6953 x
= a
+ ((bfd_vma
) b
<< 32);
6961 static bfd_signed_vma
6964 bfd_signed_vma x
= 0;
6966 FETCH_DATA (the_info
, codep
+ 4);
6967 x
= *codep
++ & (bfd_signed_vma
) 0xff;
6968 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 8;
6969 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 16;
6970 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 24;
6974 static bfd_signed_vma
6977 bfd_signed_vma x
= 0;
6979 FETCH_DATA (the_info
, codep
+ 4);
6980 x
= *codep
++ & (bfd_signed_vma
) 0xff;
6981 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 8;
6982 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 16;
6983 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 24;
6985 x
= (x
^ ((bfd_signed_vma
) 1 << 31)) - ((bfd_signed_vma
) 1 << 31);
6995 FETCH_DATA (the_info
, codep
+ 2);
6996 x
= *codep
++ & 0xff;
6997 x
|= (*codep
++ & 0xff) << 8;
7002 set_op (bfd_vma op
, int riprel
)
7004 op_index
[op_ad
] = op_ad
;
7005 if (address_mode
== mode_64bit
)
7007 op_address
[op_ad
] = op
;
7008 op_riprel
[op_ad
] = riprel
;
7012 /* Mask to get a 32-bit address. */
7013 op_address
[op_ad
] = op
& 0xffffffff;
7014 op_riprel
[op_ad
] = riprel
& 0xffffffff;
7019 OP_REG (int code
, int sizeflag
)
7031 case ax_reg
: case cx_reg
: case dx_reg
: case bx_reg
:
7032 case sp_reg
: case bp_reg
: case si_reg
: case di_reg
:
7033 s
= names16
[code
- ax_reg
+ add
];
7035 case es_reg
: case ss_reg
: case cs_reg
:
7036 case ds_reg
: case fs_reg
: case gs_reg
:
7037 s
= names_seg
[code
- es_reg
+ add
];
7039 case al_reg
: case ah_reg
: case cl_reg
: case ch_reg
:
7040 case dl_reg
: case dh_reg
: case bl_reg
: case bh_reg
:
7043 s
= names8rex
[code
- al_reg
+ add
];
7045 s
= names8
[code
- al_reg
];
7047 case rAX_reg
: case rCX_reg
: case rDX_reg
: case rBX_reg
:
7048 case rSP_reg
: case rBP_reg
: case rSI_reg
: case rDI_reg
:
7049 if (address_mode
== mode_64bit
&& (sizeflag
& DFLAG
))
7051 s
= names64
[code
- rAX_reg
+ add
];
7054 code
+= eAX_reg
- rAX_reg
;
7056 case eAX_reg
: case eCX_reg
: case eDX_reg
: case eBX_reg
:
7057 case eSP_reg
: case eBP_reg
: case eSI_reg
: case eDI_reg
:
7060 s
= names64
[code
- eAX_reg
+ add
];
7061 else if (sizeflag
& DFLAG
)
7062 s
= names32
[code
- eAX_reg
+ add
];
7064 s
= names16
[code
- eAX_reg
+ add
];
7065 used_prefixes
|= (prefixes
& PREFIX_DATA
);
7068 s
= INTERNAL_DISASSEMBLER_ERROR
;
7075 OP_IMREG (int code
, int sizeflag
)
7087 case ax_reg
: case cx_reg
: case dx_reg
: case bx_reg
:
7088 case sp_reg
: case bp_reg
: case si_reg
: case di_reg
:
7089 s
= names16
[code
- ax_reg
];
7091 case es_reg
: case ss_reg
: case cs_reg
:
7092 case ds_reg
: case fs_reg
: case gs_reg
:
7093 s
= names_seg
[code
- es_reg
];
7095 case al_reg
: case ah_reg
: case cl_reg
: case ch_reg
:
7096 case dl_reg
: case dh_reg
: case bl_reg
: case bh_reg
:
7099 s
= names8rex
[code
- al_reg
];
7101 s
= names8
[code
- al_reg
];
7103 case eAX_reg
: case eCX_reg
: case eDX_reg
: case eBX_reg
:
7104 case eSP_reg
: case eBP_reg
: case eSI_reg
: case eDI_reg
:
7107 s
= names64
[code
- eAX_reg
];
7108 else if (sizeflag
& DFLAG
)
7109 s
= names32
[code
- eAX_reg
];
7111 s
= names16
[code
- eAX_reg
];
7112 used_prefixes
|= (prefixes
& PREFIX_DATA
);
7115 if ((rex
& REX_W
) || (sizeflag
& DFLAG
))
7120 used_prefixes
|= (prefixes
& PREFIX_DATA
);
7123 s
= INTERNAL_DISASSEMBLER_ERROR
;
7130 OP_I (int bytemode
, int sizeflag
)
7133 bfd_signed_vma mask
= -1;
7138 FETCH_DATA (the_info
, codep
+ 1);
7143 if (address_mode
== mode_64bit
)
7153 else if (sizeflag
& DFLAG
)
7163 used_prefixes
|= (prefixes
& PREFIX_DATA
);
7174 oappend (INTERNAL_DISASSEMBLER_ERROR
);
7179 scratchbuf
[0] = '$';
7180 print_operand_value (scratchbuf
+ 1, 1, op
);
7181 oappend (scratchbuf
+ intel_syntax
);
7182 scratchbuf
[0] = '\0';
7186 OP_I64 (int bytemode
, int sizeflag
)
7189 bfd_signed_vma mask
= -1;
7191 if (address_mode
!= mode_64bit
)
7193 OP_I (bytemode
, sizeflag
);
7200 FETCH_DATA (the_info
, codep
+ 1);
7208 else if (sizeflag
& DFLAG
)
7218 used_prefixes
|= (prefixes
& PREFIX_DATA
);
7225 oappend (INTERNAL_DISASSEMBLER_ERROR
);
7230 scratchbuf
[0] = '$';
7231 print_operand_value (scratchbuf
+ 1, 1, op
);
7232 oappend (scratchbuf
+ intel_syntax
);
7233 scratchbuf
[0] = '\0';
7237 OP_sI (int bytemode
, int sizeflag
)
7240 bfd_signed_vma mask
= -1;
7245 FETCH_DATA (the_info
, codep
+ 1);
7247 if ((op
& 0x80) != 0)
7255 else if (sizeflag
& DFLAG
)
7264 if ((op
& 0x8000) != 0)
7267 used_prefixes
|= (prefixes
& PREFIX_DATA
);
7272 if ((op
& 0x8000) != 0)
7276 oappend (INTERNAL_DISASSEMBLER_ERROR
);
7280 scratchbuf
[0] = '$';
7281 print_operand_value (scratchbuf
+ 1, 1, op
);
7282 oappend (scratchbuf
+ intel_syntax
);
7286 OP_J (int bytemode
, int sizeflag
)
7290 bfd_vma segment
= 0;
7295 FETCH_DATA (the_info
, codep
+ 1);
7297 if ((disp
& 0x80) != 0)
7301 if ((sizeflag
& DFLAG
) || (rex
& REX_W
))
7306 if ((disp
& 0x8000) != 0)
7308 /* In 16bit mode, address is wrapped around at 64k within
7309 the same segment. Otherwise, a data16 prefix on a jump
7310 instruction means that the pc is masked to 16 bits after
7311 the displacement is added! */
7313 if ((prefixes
& PREFIX_DATA
) == 0)
7314 segment
= ((start_pc
+ codep
- start_codep
)
7315 & ~((bfd_vma
) 0xffff));
7317 used_prefixes
|= (prefixes
& PREFIX_DATA
);
7320 oappend (INTERNAL_DISASSEMBLER_ERROR
);
7323 disp
= ((start_pc
+ codep
- start_codep
+ disp
) & mask
) | segment
;
7325 print_operand_value (scratchbuf
, 1, disp
);
7326 oappend (scratchbuf
);
7330 OP_SEG (int bytemode
, int sizeflag
)
7332 if (bytemode
== w_mode
)
7333 oappend (names_seg
[modrm
.reg
]);
7335 OP_E (modrm
.mod
== 3 ? bytemode
: w_mode
, sizeflag
);
7339 OP_DIR (int dummy ATTRIBUTE_UNUSED
, int sizeflag
)
7343 if (sizeflag
& DFLAG
)
7353 used_prefixes
|= (prefixes
& PREFIX_DATA
);
7355 sprintf (scratchbuf
, "0x%x:0x%x", seg
, offset
);
7357 sprintf (scratchbuf
, "$0x%x,$0x%x", seg
, offset
);
7358 oappend (scratchbuf
);
7362 OP_OFF (int bytemode
, int sizeflag
)
7366 if (intel_syntax
&& (sizeflag
& SUFFIX_ALWAYS
))
7367 intel_operand_size (bytemode
, sizeflag
);
7370 if ((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
7377 if (!(prefixes
& (PREFIX_CS
| PREFIX_SS
| PREFIX_DS
7378 | PREFIX_ES
| PREFIX_FS
| PREFIX_GS
)))
7380 oappend (names_seg
[ds_reg
- es_reg
]);
7384 print_operand_value (scratchbuf
, 1, off
);
7385 oappend (scratchbuf
);
7389 OP_OFF64 (int bytemode
, int sizeflag
)
7393 if (address_mode
!= mode_64bit
7394 || (prefixes
& PREFIX_ADDR
))
7396 OP_OFF (bytemode
, sizeflag
);
7400 if (intel_syntax
&& (sizeflag
& SUFFIX_ALWAYS
))
7401 intel_operand_size (bytemode
, sizeflag
);
7408 if (!(prefixes
& (PREFIX_CS
| PREFIX_SS
| PREFIX_DS
7409 | PREFIX_ES
| PREFIX_FS
| PREFIX_GS
)))
7411 oappend (names_seg
[ds_reg
- es_reg
]);
7415 print_operand_value (scratchbuf
, 1, off
);
7416 oappend (scratchbuf
);
7420 ptr_reg (int code
, int sizeflag
)
7424 *obufp
++ = open_char
;
7425 used_prefixes
|= (prefixes
& PREFIX_ADDR
);
7426 if (address_mode
== mode_64bit
)
7428 if (!(sizeflag
& AFLAG
))
7429 s
= names32
[code
- eAX_reg
];
7431 s
= names64
[code
- eAX_reg
];
7433 else if (sizeflag
& AFLAG
)
7434 s
= names32
[code
- eAX_reg
];
7436 s
= names16
[code
- eAX_reg
];
7438 *obufp
++ = close_char
;
7443 OP_ESreg (int code
, int sizeflag
)
7449 case 0x6d: /* insw/insl */
7450 intel_operand_size (z_mode
, sizeflag
);
7452 case 0xa5: /* movsw/movsl/movsq */
7453 case 0xa7: /* cmpsw/cmpsl/cmpsq */
7454 case 0xab: /* stosw/stosl */
7455 case 0xaf: /* scasw/scasl */
7456 intel_operand_size (v_mode
, sizeflag
);
7459 intel_operand_size (b_mode
, sizeflag
);
7462 oappend ("%es:" + intel_syntax
);
7463 ptr_reg (code
, sizeflag
);
7467 OP_DSreg (int code
, int sizeflag
)
7473 case 0x6f: /* outsw/outsl */
7474 intel_operand_size (z_mode
, sizeflag
);
7476 case 0xa5: /* movsw/movsl/movsq */
7477 case 0xa7: /* cmpsw/cmpsl/cmpsq */
7478 case 0xad: /* lodsw/lodsl/lodsq */
7479 intel_operand_size (v_mode
, sizeflag
);
7482 intel_operand_size (b_mode
, sizeflag
);
7492 prefixes
|= PREFIX_DS
;
7494 ptr_reg (code
, sizeflag
);
7498 OP_C (int dummy ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
7506 else if (address_mode
!= mode_64bit
&& (prefixes
& PREFIX_LOCK
))
7509 used_prefixes
|= PREFIX_LOCK
;
7514 sprintf (scratchbuf
, "%%cr%d", modrm
.reg
+ add
);
7515 oappend (scratchbuf
+ intel_syntax
);
7519 OP_D (int dummy ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
7528 sprintf (scratchbuf
, "db%d", modrm
.reg
+ add
);
7530 sprintf (scratchbuf
, "%%db%d", modrm
.reg
+ add
);
7531 oappend (scratchbuf
);
7535 OP_T (int dummy ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
7537 sprintf (scratchbuf
, "%%tr%d", modrm
.reg
);
7538 oappend (scratchbuf
+ intel_syntax
);
7542 OP_R (int bytemode
, int sizeflag
)
7545 OP_E (bytemode
, sizeflag
);
7551 OP_MMX (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
7553 used_prefixes
|= (prefixes
& PREFIX_DATA
);
7554 if (prefixes
& PREFIX_DATA
)
7562 sprintf (scratchbuf
, "%%xmm%d", modrm
.reg
+ add
);
7565 sprintf (scratchbuf
, "%%mm%d", modrm
.reg
);
7566 oappend (scratchbuf
+ intel_syntax
);
7570 OP_XMM (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
7578 sprintf (scratchbuf
, "%%xmm%d", modrm
.reg
+ add
);
7579 oappend (scratchbuf
+ intel_syntax
);
7583 OP_EM (int bytemode
, int sizeflag
)
7587 if (intel_syntax
&& bytemode
== v_mode
)
7589 bytemode
= (prefixes
& PREFIX_DATA
) ? x_mode
: q_mode
;
7590 used_prefixes
|= (prefixes
& PREFIX_DATA
);
7592 OP_E (bytemode
, sizeflag
);
7596 /* Skip mod/rm byte. */
7599 used_prefixes
|= (prefixes
& PREFIX_DATA
);
7600 if (prefixes
& PREFIX_DATA
)
7609 sprintf (scratchbuf
, "%%xmm%d", modrm
.rm
+ add
);
7612 sprintf (scratchbuf
, "%%mm%d", modrm
.rm
);
7613 oappend (scratchbuf
+ intel_syntax
);
7616 /* cvt* are the only instructions in sse2 which have
7617 both SSE and MMX operands and also have 0x66 prefix
7618 in their opcode. 0x66 was originally used to differentiate
7619 between SSE and MMX instruction(operands). So we have to handle the
7620 cvt* separately using OP_EMC and OP_MXC */
7622 OP_EMC (int bytemode
, int sizeflag
)
7626 if (intel_syntax
&& bytemode
== v_mode
)
7628 bytemode
= (prefixes
& PREFIX_DATA
) ? x_mode
: q_mode
;
7629 used_prefixes
|= (prefixes
& PREFIX_DATA
);
7631 OP_E (bytemode
, sizeflag
);
7635 /* Skip mod/rm byte. */
7638 used_prefixes
|= (prefixes
& PREFIX_DATA
);
7639 sprintf (scratchbuf
, "%%mm%d", modrm
.rm
);
7640 oappend (scratchbuf
+ intel_syntax
);
7644 OP_MXC (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
7646 used_prefixes
|= (prefixes
& PREFIX_DATA
);
7647 sprintf (scratchbuf
, "%%mm%d", modrm
.reg
);
7648 oappend (scratchbuf
+ intel_syntax
);
7652 OP_EX (int bytemode
, int sizeflag
)
7657 OP_E (bytemode
, sizeflag
);
7666 /* Skip mod/rm byte. */
7669 sprintf (scratchbuf
, "%%xmm%d", modrm
.rm
+ add
);
7670 oappend (scratchbuf
+ intel_syntax
);
7674 OP_MS (int bytemode
, int sizeflag
)
7677 OP_EM (bytemode
, sizeflag
);
7683 OP_XS (int bytemode
, int sizeflag
)
7686 OP_EX (bytemode
, sizeflag
);
7692 OP_M (int bytemode
, int sizeflag
)
7695 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
7698 OP_E (bytemode
, sizeflag
);
7702 OP_0f07 (int bytemode
, int sizeflag
)
7704 if (modrm
.mod
!= 3 || modrm
.rm
!= 0)
7707 OP_E (bytemode
, sizeflag
);
7710 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
7711 32bit mode and "xchg %rax,%rax" in 64bit mode. */
7714 NOP_Fixup1 (int bytemode
, int sizeflag
)
7716 if ((prefixes
& PREFIX_DATA
) != 0
7719 && address_mode
== mode_64bit
))
7720 OP_REG (bytemode
, sizeflag
);
7722 strcpy (obuf
, "nop");
7726 NOP_Fixup2 (int bytemode
, int sizeflag
)
7728 if ((prefixes
& PREFIX_DATA
) != 0
7731 && address_mode
== mode_64bit
))
7732 OP_IMREG (bytemode
, sizeflag
);
7735 static const char *const Suffix3DNow
[] = {
7736 /* 00 */ NULL
, NULL
, NULL
, NULL
,
7737 /* 04 */ NULL
, NULL
, NULL
, NULL
,
7738 /* 08 */ NULL
, NULL
, NULL
, NULL
,
7739 /* 0C */ "pi2fw", "pi2fd", NULL
, NULL
,
7740 /* 10 */ NULL
, NULL
, NULL
, NULL
,
7741 /* 14 */ NULL
, NULL
, NULL
, NULL
,
7742 /* 18 */ NULL
, NULL
, NULL
, NULL
,
7743 /* 1C */ "pf2iw", "pf2id", NULL
, NULL
,
7744 /* 20 */ NULL
, NULL
, NULL
, NULL
,
7745 /* 24 */ NULL
, NULL
, NULL
, NULL
,
7746 /* 28 */ NULL
, NULL
, NULL
, NULL
,
7747 /* 2C */ NULL
, NULL
, NULL
, NULL
,
7748 /* 30 */ NULL
, NULL
, NULL
, NULL
,
7749 /* 34 */ NULL
, NULL
, NULL
, NULL
,
7750 /* 38 */ NULL
, NULL
, NULL
, NULL
,
7751 /* 3C */ NULL
, NULL
, NULL
, NULL
,
7752 /* 40 */ NULL
, NULL
, NULL
, NULL
,
7753 /* 44 */ NULL
, NULL
, NULL
, NULL
,
7754 /* 48 */ NULL
, NULL
, NULL
, NULL
,
7755 /* 4C */ NULL
, NULL
, NULL
, NULL
,
7756 /* 50 */ NULL
, NULL
, NULL
, NULL
,
7757 /* 54 */ NULL
, NULL
, NULL
, NULL
,
7758 /* 58 */ NULL
, NULL
, NULL
, NULL
,
7759 /* 5C */ NULL
, NULL
, NULL
, NULL
,
7760 /* 60 */ NULL
, NULL
, NULL
, NULL
,
7761 /* 64 */ NULL
, NULL
, NULL
, NULL
,
7762 /* 68 */ NULL
, NULL
, NULL
, NULL
,
7763 /* 6C */ NULL
, NULL
, NULL
, NULL
,
7764 /* 70 */ NULL
, NULL
, NULL
, NULL
,
7765 /* 74 */ NULL
, NULL
, NULL
, NULL
,
7766 /* 78 */ NULL
, NULL
, NULL
, NULL
,
7767 /* 7C */ NULL
, NULL
, NULL
, NULL
,
7768 /* 80 */ NULL
, NULL
, NULL
, NULL
,
7769 /* 84 */ NULL
, NULL
, NULL
, NULL
,
7770 /* 88 */ NULL
, NULL
, "pfnacc", NULL
,
7771 /* 8C */ NULL
, NULL
, "pfpnacc", NULL
,
7772 /* 90 */ "pfcmpge", NULL
, NULL
, NULL
,
7773 /* 94 */ "pfmin", NULL
, "pfrcp", "pfrsqrt",
7774 /* 98 */ NULL
, NULL
, "pfsub", NULL
,
7775 /* 9C */ NULL
, NULL
, "pfadd", NULL
,
7776 /* A0 */ "pfcmpgt", NULL
, NULL
, NULL
,
7777 /* A4 */ "pfmax", NULL
, "pfrcpit1", "pfrsqit1",
7778 /* A8 */ NULL
, NULL
, "pfsubr", NULL
,
7779 /* AC */ NULL
, NULL
, "pfacc", NULL
,
7780 /* B0 */ "pfcmpeq", NULL
, NULL
, NULL
,
7781 /* B4 */ "pfmul", NULL
, "pfrcpit2", "pmulhrw",
7782 /* B8 */ NULL
, NULL
, NULL
, "pswapd",
7783 /* BC */ NULL
, NULL
, NULL
, "pavgusb",
7784 /* C0 */ NULL
, NULL
, NULL
, NULL
,
7785 /* C4 */ NULL
, NULL
, NULL
, NULL
,
7786 /* C8 */ NULL
, NULL
, NULL
, NULL
,
7787 /* CC */ NULL
, NULL
, NULL
, NULL
,
7788 /* D0 */ NULL
, NULL
, NULL
, NULL
,
7789 /* D4 */ NULL
, NULL
, NULL
, NULL
,
7790 /* D8 */ NULL
, NULL
, NULL
, NULL
,
7791 /* DC */ NULL
, NULL
, NULL
, NULL
,
7792 /* E0 */ NULL
, NULL
, NULL
, NULL
,
7793 /* E4 */ NULL
, NULL
, NULL
, NULL
,
7794 /* E8 */ NULL
, NULL
, NULL
, NULL
,
7795 /* EC */ NULL
, NULL
, NULL
, NULL
,
7796 /* F0 */ NULL
, NULL
, NULL
, NULL
,
7797 /* F4 */ NULL
, NULL
, NULL
, NULL
,
7798 /* F8 */ NULL
, NULL
, NULL
, NULL
,
7799 /* FC */ NULL
, NULL
, NULL
, NULL
,
7803 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
7805 const char *mnemonic
;
7807 FETCH_DATA (the_info
, codep
+ 1);
7808 /* AMD 3DNow! instructions are specified by an opcode suffix in the
7809 place where an 8-bit immediate would normally go. ie. the last
7810 byte of the instruction. */
7811 obufp
= obuf
+ strlen (obuf
);
7812 mnemonic
= Suffix3DNow
[*codep
++ & 0xff];
7817 /* Since a variable sized modrm/sib chunk is between the start
7818 of the opcode (0x0f0f) and the opcode suffix, we need to do
7819 all the modrm processing first, and don't know until now that
7820 we have a bad opcode. This necessitates some cleaning up. */
7821 op_out
[0][0] = '\0';
7822 op_out
[1][0] = '\0';
7827 static const char *simd_cmp_op
[] = {
7839 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
7841 unsigned int cmp_type
;
7843 FETCH_DATA (the_info
, codep
+ 1);
7844 cmp_type
= *codep
++ & 0xff;
7848 char *p
= obuf
+ strlen (obuf
) - 2;
7852 sprintf (p
, "%s%s", simd_cmp_op
[cmp_type
], suffix
);
7856 /* We have a reserved extension byte. Output it directly. */
7857 scratchbuf
[0] = '$';
7858 print_operand_value (scratchbuf
+ 1, 1, cmp_type
);
7859 oappend (scratchbuf
+ intel_syntax
);
7860 scratchbuf
[0] = '\0';
7865 OP_Mwait (int bytemode ATTRIBUTE_UNUSED
,
7866 int sizeflag ATTRIBUTE_UNUSED
)
7868 /* mwait %eax,%ecx */
7871 const char **names
= (address_mode
== mode_64bit
7872 ? names64
: names32
);
7873 strcpy (op_out
[0], names
[0]);
7874 strcpy (op_out
[1], names
[1]);
7877 /* Skip mod/rm byte. */
7883 OP_Monitor (int bytemode ATTRIBUTE_UNUSED
,
7884 int sizeflag ATTRIBUTE_UNUSED
)
7886 /* monitor %eax,%ecx,%edx" */
7889 const char **op1_names
;
7890 const char **names
= (address_mode
== mode_64bit
7891 ? names64
: names32
);
7893 if (!(prefixes
& PREFIX_ADDR
))
7894 op1_names
= (address_mode
== mode_16bit
7898 /* Remove "addr16/addr32". */
7900 op1_names
= (address_mode
!= mode_32bit
7901 ? names32
: names16
);
7902 used_prefixes
|= PREFIX_ADDR
;
7904 strcpy (op_out
[0], op1_names
[0]);
7905 strcpy (op_out
[1], names
[1]);
7906 strcpy (op_out
[2], names
[2]);
7909 /* Skip mod/rm byte. */
7917 /* Throw away prefixes and 1st. opcode byte. */
7918 codep
= insn_codep
+ 1;
7923 REP_Fixup (int bytemode
, int sizeflag
)
7925 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
7927 if (prefixes
& PREFIX_REPZ
)
7928 repz_prefix
= "rep ";
7935 OP_IMREG (bytemode
, sizeflag
);
7938 OP_ESreg (bytemode
, sizeflag
);
7941 OP_DSreg (bytemode
, sizeflag
);
7950 CMPXCHG8B_Fixup (int bytemode
, int sizeflag
)
7955 /* Change cmpxchg8b to cmpxchg16b. */
7956 char *p
= obuf
+ strlen (obuf
) - 2;
7960 OP_M (bytemode
, sizeflag
);
7964 XMM_Fixup (int reg
, int sizeflag ATTRIBUTE_UNUSED
)
7966 sprintf (scratchbuf
, "%%xmm%d", reg
);
7967 oappend (scratchbuf
+ intel_syntax
);
7971 CRC32_Fixup (int bytemode
, int sizeflag
)
7973 /* Add proper suffix to "crc32". */
7974 char *p
= obuf
+ strlen (obuf
);
7991 else if (sizeflag
& DFLAG
)
7995 used_prefixes
|= (prefixes
& PREFIX_DATA
);
7998 oappend (INTERNAL_DISASSEMBLER_ERROR
);
8007 /* Skip mod/rm byte. */
8012 add
= (rex
& REX_B
) ? 8 : 0;
8013 if (bytemode
== b_mode
)
8017 oappend (names8rex
[modrm
.rm
+ add
]);
8019 oappend (names8
[modrm
.rm
+ add
]);
8025 oappend (names64
[modrm
.rm
+ add
]);
8026 else if ((prefixes
& PREFIX_DATA
))
8027 oappend (names16
[modrm
.rm
+ add
]);
8029 oappend (names32
[modrm
.rm
+ add
]);
8033 OP_E (bytemode
, sizeflag
);
8036 /* Print a DREX argument as either a register or memory operation. */
8038 print_drex_arg (unsigned int reg
, int bytemode
, int sizeflag
)
8040 if (reg
== DREX_REG_UNKNOWN
)
8043 else if (reg
!= DREX_REG_MEMORY
)
8045 sprintf (scratchbuf
, "%%xmm%d", reg
);
8046 oappend (scratchbuf
+ intel_syntax
);
8050 OP_E_extended (bytemode
, sizeflag
, 1);
8053 /* SSE5 instructions that have 4 arguments are encoded as:
8054 0f 24 <sub-opcode> <modrm> <optional-sib> <drex> <offset>.
8056 The <sub-opcode> byte has 1 bit (0x4) that is combined with 1 bit in
8057 the DREX field (0x8) to determine how the arguments are laid out.
8058 The destination register must be the same register as one of the
8059 inputs, and it is encoded in the DREX byte. No REX prefix is used
8060 for these instructions, since the DREX field contains the 3 extension
8061 bits provided by the REX prefix.
8063 The bytemode argument adds 2 extra bits for passing extra information:
8064 DREX_OC1 -- Set the OC1 bit to indicate dest == 1st arg
8065 DREX_NO_OC0 -- OC0 in DREX is invalid
8066 (but pretend it is set). */
8069 OP_DREX4 (int flag_bytemode
, int sizeflag
)
8071 unsigned int drex_byte
;
8072 unsigned int regs
[4];
8073 unsigned int modrm_regmem
;
8074 unsigned int modrm_reg
;
8075 unsigned int drex_reg
;
8078 int rex_used_save
= rex_used
;
8080 int oc1
= (flag_bytemode
& DREX_OC1
) ? 2 : 0;
8084 bytemode
= flag_bytemode
& ~ DREX_MASK
;
8086 for (i
= 0; i
< 4; i
++)
8087 regs
[i
] = DREX_REG_UNKNOWN
;
8089 /* Determine if we have a SIB byte in addition to MODRM before the
8091 if (((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
8096 /* Get the DREX byte. */
8097 FETCH_DATA (the_info
, codep
+ 2 + has_sib
);
8098 drex_byte
= codep
[has_sib
+1];
8099 drex_reg
= DREX_XMM (drex_byte
);
8100 modrm_reg
= modrm
.reg
+ ((drex_byte
& REX_R
) ? 8 : 0);
8102 /* Is OC0 legal? If not, hardwire oc0 == 1. */
8103 if (flag_bytemode
& DREX_NO_OC0
)
8106 if (DREX_OC0 (drex_byte
))
8110 oc0
= DREX_OC0 (drex_byte
);
8114 /* regmem == register */
8115 modrm_regmem
= modrm
.rm
+ ((drex_byte
& REX_B
) ? 8 : 0);
8117 /* skip modrm/drex since we don't call OP_E_extended */
8122 /* regmem == memory, fill in appropriate REX bits */
8123 modrm_regmem
= DREX_REG_MEMORY
;
8124 rex
= drex_byte
& (REX_B
| REX_X
| REX_R
);
8130 /* Based on the OC1/OC0 bits, lay out the arguments in the correct
8139 regs
[0] = modrm_regmem
;
8140 regs
[1] = modrm_reg
;
8146 regs
[0] = modrm_reg
;
8147 regs
[1] = modrm_regmem
;
8154 regs
[1] = modrm_regmem
;
8155 regs
[2] = modrm_reg
;
8161 regs
[1] = modrm_reg
;
8162 regs
[2] = modrm_regmem
;
8167 /* Print out the arguments. */
8168 for (i
= 0; i
< 4; i
++)
8170 int j
= (intel_syntax
) ? 3 - i
: i
;
8177 print_drex_arg (regs
[j
], bytemode
, sizeflag
);
8181 rex_used
= rex_used_save
;
8184 /* SSE5 instructions that have 3 arguments, and are encoded as:
8185 0f 24 <sub-opcode> <modrm> <optional-sib> <drex> <offset> (or)
8186 0f 25 <sub-opcode> <modrm> <optional-sib> <drex> <offset> <cmp-byte>
8188 The DREX field has 1 bit (0x8) to determine how the arguments are
8189 laid out. The destination register is encoded in the DREX byte.
8190 No REX prefix is used for these instructions, since the DREX field
8191 contains the 3 extension bits provided by the REX prefix. */
8194 OP_DREX3 (int flag_bytemode
, int sizeflag
)
8196 unsigned int drex_byte
;
8197 unsigned int regs
[3];
8198 unsigned int modrm_regmem
;
8199 unsigned int modrm_reg
;
8200 unsigned int drex_reg
;
8203 int rex_used_save
= rex_used
;
8208 bytemode
= flag_bytemode
& ~ DREX_MASK
;
8210 for (i
= 0; i
< 3; i
++)
8211 regs
[i
] = DREX_REG_UNKNOWN
;
8213 /* Determine if we have a SIB byte in addition to MODRM before the
8215 if (((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
8220 /* Get the DREX byte. */
8221 FETCH_DATA (the_info
, codep
+ 2 + has_sib
);
8222 drex_byte
= codep
[has_sib
+1];
8223 drex_reg
= DREX_XMM (drex_byte
);
8224 modrm_reg
= modrm
.reg
+ ((drex_byte
& REX_R
) ? 8 : 0);
8226 /* Is OC0 legal? If not, hardwire oc0 == 0 */
8227 oc0
= DREX_OC0 (drex_byte
);
8228 if ((flag_bytemode
& DREX_NO_OC0
) && oc0
)
8233 /* regmem == register */
8234 modrm_regmem
= modrm
.rm
+ ((drex_byte
& REX_B
) ? 8 : 0);
8236 /* skip modrm/drex since we don't call OP_E_extended. */
8241 /* regmem == memory, fill in appropriate REX bits. */
8242 modrm_regmem
= DREX_REG_MEMORY
;
8243 rex
= drex_byte
& (REX_B
| REX_X
| REX_R
);
8249 /* Based on the OC1/OC0 bits, lay out the arguments in the correct
8258 regs
[0] = modrm_regmem
;
8259 regs
[1] = modrm_reg
;
8264 regs
[0] = modrm_reg
;
8265 regs
[1] = modrm_regmem
;
8270 /* Print out the arguments. */
8271 for (i
= 0; i
< 3; i
++)
8273 int j
= (intel_syntax
) ? 2 - i
: i
;
8280 print_drex_arg (regs
[j
], bytemode
, sizeflag
);
8284 rex_used
= rex_used_save
;
8287 /* Emit a floating point comparison for comp<xx> instructions. */
8290 OP_DREX_FCMP (int bytemode ATTRIBUTE_UNUSED
,
8291 int sizeflag ATTRIBUTE_UNUSED
)
8295 static const char *const cmp_test
[] = {
8314 FETCH_DATA (the_info
, codep
+ 1);
8315 byte
= *codep
& 0xff;
8317 if (byte
>= ARRAY_SIZE (cmp_test
)
8322 /* The instruction isn't one we know about, so just append the
8323 extension byte as a numeric value. */
8329 sprintf (scratchbuf
, "com%s%s", cmp_test
[byte
], obuf
+3);
8330 strcpy (obuf
, scratchbuf
);
8335 /* Emit an integer point comparison for pcom<xx> instructions,
8336 rewriting the instruction to have the test inside of it. */
8339 OP_DREX_ICMP (int bytemode ATTRIBUTE_UNUSED
,
8340 int sizeflag ATTRIBUTE_UNUSED
)
8344 static const char *const cmp_test
[] = {
8355 FETCH_DATA (the_info
, codep
+ 1);
8356 byte
= *codep
& 0xff;
8358 if (byte
>= ARRAY_SIZE (cmp_test
)
8364 /* The instruction isn't one we know about, so just print the
8365 comparison test byte as a numeric value. */
8371 sprintf (scratchbuf
, "pcom%s%s", cmp_test
[byte
], obuf
+4);
8372 strcpy (obuf
, scratchbuf
);