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 OP_SIMD_Suffix (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 OPSIMD { OP_SIMD_Suffix, 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
364 #define b_mode 1 /* byte operand */
365 #define v_mode 2 /* operand size depends on prefixes */
366 #define w_mode 3 /* word operand */
367 #define d_mode 4 /* double word operand */
368 #define q_mode 5 /* quad word operand */
369 #define t_mode 6 /* ten-byte operand */
370 #define x_mode 7 /* 16-byte XMM operand */
371 #define m_mode 8 /* d_mode in 32bit, q_mode in 64bit mode. */
372 #define cond_jump_mode 9
373 #define loop_jcxz_mode 10
374 #define dq_mode 11 /* operand size depends on REX prefixes. */
375 #define dqw_mode 12 /* registers like dq_mode, memory like w_mode. */
376 #define f_mode 13 /* 4- or 6-byte pointer operand */
377 #define const_1_mode 14
378 #define stack_v_mode 15 /* v_mode for stack-related opcodes. */
379 #define z_mode 16 /* non-quad operand size depends on prefixes */
380 #define o_mode 17 /* 16-byte operand */
381 #define dqb_mode 18 /* registers like dq_mode, memory like b_mode. */
382 #define dqd_mode 19 /* registers like dq_mode, memory like d_mode. */
384 /* Flags that are OR'ed into the bytemode field to pass extra information. */
385 #define DREX_OC1 0x4000 /* OC1 bit set */
386 #define DREX_NO_OC0 0x2000 /* OC0 bit not used */
387 #define DREX_MASK 0x6000 /* mask to delete */
432 #define z_mode_ax_reg 149
433 #define indir_dx_reg 150
437 #define USE_PREFIX_USER_TABLE 3
438 #define X86_64_SPECIAL 4
439 #define IS_3BYTE_OPCODE 5
440 #define USE_OPC_EXT_TABLE 6
441 #define USE_OPC_EXT_RM_TABLE 7
443 #define FLOAT NULL, { { NULL, FLOATCODE } }
445 #define GRP1a NULL, { { NULL, USE_GROUPS }, { NULL, 0 } }
446 #define GRP1b NULL, { { NULL, USE_GROUPS }, { NULL, 1 } }
447 #define GRP1S NULL, { { NULL, USE_GROUPS }, { NULL, 2 } }
448 #define GRP1Ss NULL, { { NULL, USE_GROUPS }, { NULL, 3 } }
449 #define GRP2b NULL, { { NULL, USE_GROUPS }, { NULL, 4 } }
450 #define GRP2S NULL, { { NULL, USE_GROUPS }, { NULL, 5 } }
451 #define GRP2b_one NULL, { { NULL, USE_GROUPS }, { NULL, 6 } }
452 #define GRP2S_one NULL, { { NULL, USE_GROUPS }, { NULL, 7 } }
453 #define GRP2b_cl NULL, { { NULL, USE_GROUPS }, { NULL, 8 } }
454 #define GRP2S_cl NULL, { { NULL, USE_GROUPS }, { NULL, 9 } }
455 #define GRP3b NULL, { { NULL, USE_GROUPS }, { NULL, 10 } }
456 #define GRP3S NULL, { { NULL, USE_GROUPS }, { NULL, 11 } }
457 #define GRP4 NULL, { { NULL, USE_GROUPS }, { NULL, 12 } }
458 #define GRP5 NULL, { { NULL, USE_GROUPS }, { NULL, 13 } }
459 #define GRP6 NULL, { { NULL, USE_GROUPS }, { NULL, 14 } }
460 #define GRP7 NULL, { { NULL, USE_GROUPS }, { NULL, 15 } }
461 #define GRP8 NULL, { { NULL, USE_GROUPS }, { NULL, 16 } }
462 #define GRP9 NULL, { { NULL, USE_GROUPS }, { NULL, 17 } }
463 #define GRP11_C6 NULL, { { NULL, USE_GROUPS }, { NULL, 18 } }
464 #define GRP11_C7 NULL, { { NULL, USE_GROUPS }, { NULL, 19 } }
465 #define GRP12 NULL, { { NULL, USE_GROUPS }, { NULL, 20 } }
466 #define GRP13 NULL, { { NULL, USE_GROUPS }, { NULL, 21 } }
467 #define GRP14 NULL, { { NULL, USE_GROUPS }, { NULL, 22 } }
468 #define GRP15 NULL, { { NULL, USE_GROUPS }, { NULL, 23 } }
469 #define GRP16 NULL, { { NULL, USE_GROUPS }, { NULL, 24 } }
470 #define GRPAMD NULL, { { NULL, USE_GROUPS }, { NULL, 25 } }
471 #define GRPPADLCK1 NULL, { { NULL, USE_GROUPS }, { NULL, 26 } }
472 #define GRPPADLCK2 NULL, { { NULL, USE_GROUPS }, { NULL, 27 } }
474 #define PREGRP0 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 0 } }
475 #define PREGRP1 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 1 } }
476 #define PREGRP2 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 2 } }
477 #define PREGRP3 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 3 } }
478 #define PREGRP4 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 4 } }
479 #define PREGRP5 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 5 } }
480 #define PREGRP6 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 6 } }
481 #define PREGRP7 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 7 } }
482 #define PREGRP8 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 8 } }
483 #define PREGRP9 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 9 } }
484 #define PREGRP10 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 10 } }
485 #define PREGRP11 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 11 } }
486 #define PREGRP12 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 12 } }
487 #define PREGRP13 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 13 } }
488 #define PREGRP14 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 14 } }
489 #define PREGRP15 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 15 } }
490 #define PREGRP16 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 16 } }
491 #define PREGRP17 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 17 } }
492 #define PREGRP18 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 18 } }
493 #define PREGRP19 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 19 } }
494 #define PREGRP20 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 20 } }
495 #define PREGRP21 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 21 } }
496 #define PREGRP22 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 22 } }
497 #define PREGRP23 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 23 } }
498 #define PREGRP24 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 24 } }
499 #define PREGRP25 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 25 } }
500 #define PREGRP26 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 26 } }
501 #define PREGRP27 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 27 } }
502 #define PREGRP28 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 28 } }
503 #define PREGRP29 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 29 } }
504 #define PREGRP30 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 30 } }
505 #define PREGRP31 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 31 } }
506 #define PREGRP32 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 32 } }
507 #define PREGRP33 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 33 } }
508 #define PREGRP34 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 34 } }
509 #define PREGRP35 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 35 } }
510 #define PREGRP36 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 36 } }
511 #define PREGRP37 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 37 } }
512 #define PREGRP38 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 38 } }
513 #define PREGRP39 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 39 } }
514 #define PREGRP40 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 40 } }
515 #define PREGRP41 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 41 } }
516 #define PREGRP42 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 42 } }
517 #define PREGRP43 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 43 } }
518 #define PREGRP44 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 44 } }
519 #define PREGRP45 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 45 } }
520 #define PREGRP46 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 46 } }
521 #define PREGRP47 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 47 } }
522 #define PREGRP48 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 48 } }
523 #define PREGRP49 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 49 } }
524 #define PREGRP50 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 50 } }
525 #define PREGRP51 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 51 } }
526 #define PREGRP52 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 52 } }
527 #define PREGRP53 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 53 } }
528 #define PREGRP54 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 54 } }
529 #define PREGRP55 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 55 } }
530 #define PREGRP56 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 56 } }
531 #define PREGRP57 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 57 } }
532 #define PREGRP58 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 58 } }
533 #define PREGRP59 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 59 } }
534 #define PREGRP60 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 60 } }
535 #define PREGRP61 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 61 } }
536 #define PREGRP62 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 62 } }
537 #define PREGRP63 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 63 } }
538 #define PREGRP64 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 64 } }
539 #define PREGRP65 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 65 } }
540 #define PREGRP66 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 66 } }
541 #define PREGRP67 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 67 } }
542 #define PREGRP68 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 68 } }
543 #define PREGRP69 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 69 } }
544 #define PREGRP70 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 70 } }
545 #define PREGRP71 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 71 } }
546 #define PREGRP72 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 72 } }
547 #define PREGRP73 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 73 } }
548 #define PREGRP74 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 74 } }
549 #define PREGRP75 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 75 } }
550 #define PREGRP76 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 76 } }
551 #define PREGRP77 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 77 } }
552 #define PREGRP78 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 78 } }
553 #define PREGRP79 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 79 } }
554 #define PREGRP80 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 80 } }
555 #define PREGRP81 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 81 } }
556 #define PREGRP82 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 82 } }
557 #define PREGRP83 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 83 } }
558 #define PREGRP84 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 84 } }
559 #define PREGRP85 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 85 } }
560 #define PREGRP86 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 86 } }
561 #define PREGRP87 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 87 } }
562 #define PREGRP88 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 88 } }
563 #define PREGRP89 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 89 } }
564 #define PREGRP90 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 90 } }
565 #define PREGRP91 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 91 } }
566 #define PREGRP92 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 92 } }
567 #define PREGRP93 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 93 } }
568 #define PREGRP94 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 94 } }
569 #define PREGRP95 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 95 } }
570 #define PREGRP96 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 96 } }
571 #define PREGRP97 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 97 } }
572 #define PREGRP98 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 98 } }
573 #define PREGRP99 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 99 } }
574 #define PREGRP100 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 100 } }
577 #define X86_64_0 NULL, { { NULL, X86_64_SPECIAL }, { NULL, 0 } }
578 #define X86_64_1 NULL, { { NULL, X86_64_SPECIAL }, { NULL, 1 } }
579 #define X86_64_2 NULL, { { NULL, X86_64_SPECIAL }, { NULL, 2 } }
580 #define X86_64_3 NULL, { { NULL, X86_64_SPECIAL }, { NULL, 3 } }
582 #define THREE_BYTE_0 NULL, { { NULL, IS_3BYTE_OPCODE }, { NULL, 0 } }
583 #define THREE_BYTE_1 NULL, { { NULL, IS_3BYTE_OPCODE }, { NULL, 1 } }
584 #define THREE_BYTE_SSE5_0F24 NULL, { { NULL, IS_3BYTE_OPCODE }, { NULL, 2 } }
585 #define THREE_BYTE_SSE5_0F25 NULL, { { NULL, IS_3BYTE_OPCODE }, { NULL, 3 } }
586 #define THREE_BYTE_SSE5_0F7A NULL, { { NULL, IS_3BYTE_OPCODE }, { NULL, 4 } }
587 #define THREE_BYTE_SSE5_0F7B NULL, { { NULL, IS_3BYTE_OPCODE }, { NULL, 5 } }
589 #define OPC_EXT_0 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 0 } }
590 #define OPC_EXT_1 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 1 } }
591 #define OPC_EXT_2 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 2 } }
592 #define OPC_EXT_3 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 3 } }
593 #define OPC_EXT_4 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 4 } }
594 #define OPC_EXT_5 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 5 } }
595 #define OPC_EXT_6 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 6 } }
596 #define OPC_EXT_7 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 7 } }
597 #define OPC_EXT_8 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 8 } }
598 #define OPC_EXT_9 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 9 } }
599 #define OPC_EXT_10 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 10 } }
600 #define OPC_EXT_11 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 11 } }
601 #define OPC_EXT_12 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 12 } }
602 #define OPC_EXT_13 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 13 } }
603 #define OPC_EXT_14 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 14 } }
604 #define OPC_EXT_15 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 15 } }
605 #define OPC_EXT_16 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 16 } }
606 #define OPC_EXT_17 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 17 } }
607 #define OPC_EXT_18 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 18 } }
608 #define OPC_EXT_19 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 19 } }
609 #define OPC_EXT_20 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 20 } }
610 #define OPC_EXT_21 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 21 } }
611 #define OPC_EXT_22 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 22 } }
612 #define OPC_EXT_23 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 23 } }
613 #define OPC_EXT_24 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 24 } }
614 #define OPC_EXT_25 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 25 } }
615 #define OPC_EXT_26 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 26 } }
616 #define OPC_EXT_27 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 27 } }
617 #define OPC_EXT_28 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 28 } }
618 #define OPC_EXT_29 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 29 } }
619 #define OPC_EXT_30 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 30 } }
620 #define OPC_EXT_31 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 31 } }
621 #define OPC_EXT_32 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 32 } }
622 #define OPC_EXT_33 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 33 } }
623 #define OPC_EXT_34 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 34 } }
624 #define OPC_EXT_35 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 35 } }
625 #define OPC_EXT_36 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 36 } }
626 #define OPC_EXT_37 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 37 } }
627 #define OPC_EXT_38 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 38 } }
628 #define OPC_EXT_39 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 39 } }
629 #define OPC_EXT_40 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 40 } }
630 #define OPC_EXT_41 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 41 } }
631 #define OPC_EXT_42 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 42 } }
632 #define OPC_EXT_43 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 43 } }
633 #define OPC_EXT_44 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 44 } }
634 #define OPC_EXT_45 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 45 } }
636 #define OPC_EXT_RM_0 NULL, { { NULL, USE_OPC_EXT_RM_TABLE }, { NULL, 0 } }
637 #define OPC_EXT_RM_1 NULL, { { NULL, USE_OPC_EXT_RM_TABLE }, { NULL, 1 } }
638 #define OPC_EXT_RM_2 NULL, { { NULL, USE_OPC_EXT_RM_TABLE }, { NULL, 2 } }
639 #define OPC_EXT_RM_3 NULL, { { NULL, USE_OPC_EXT_RM_TABLE }, { NULL, 3 } }
640 #define OPC_EXT_RM_4 NULL, { { NULL, USE_OPC_EXT_RM_TABLE }, { NULL, 4 } }
641 #define OPC_EXT_RM_5 NULL, { { NULL, USE_OPC_EXT_RM_TABLE }, { NULL, 5 } }
642 #define OPC_EXT_RM_6 NULL, { { NULL, USE_OPC_EXT_RM_TABLE }, { NULL, 6 } }
644 typedef void (*op_rtn
) (int bytemode
, int sizeflag
);
655 /* Upper case letters in the instruction names here are macros.
656 'A' => print 'b' if no register operands or suffix_always is true
657 'B' => print 'b' if suffix_always is true
658 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
660 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
661 . suffix_always is true
662 'E' => print 'e' if 32-bit form of jcxz
663 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
664 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
665 'H' => print ",pt" or ",pn" branch hint
666 'I' => honor following macro letter even in Intel mode (implemented only
667 . for some of the macro letters)
669 'K' => print 'd' or 'q' if rex prefix is present.
670 'L' => print 'l' if suffix_always is true
671 'N' => print 'n' if instruction has no wait "prefix"
672 'O' => print 'd' or 'o' (or 'q' in Intel mode)
673 'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
674 . or suffix_always is true. print 'q' if rex prefix is present.
675 'Q' => print 'w', 'l' or 'q' if no register operands or suffix_always
677 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
678 'S' => print 'w', 'l' or 'q' if suffix_always is true
679 'T' => print 'q' in 64bit mode and behave as 'P' otherwise
680 'U' => print 'q' in 64bit mode and behave as 'Q' otherwise
681 'V' => print 'q' in 64bit mode and behave as 'S' otherwise
682 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
683 'X' => print 's', 'd' depending on data16 prefix (for XMM)
684 'Y' => 'q' if instruction has an REX 64bit overwrite prefix
685 'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
687 Many of the above letters print nothing in Intel mode. See "putop"
690 Braces '{' and '}', and vertical bars '|', indicate alternative
691 mnemonic strings for AT&T, Intel, X86_64 AT&T, and X86_64 Intel
692 modes. In cases where there are only two alternatives, the X86_64
693 instruction is reserved, and "(bad)" is printed.
696 static const struct dis386 dis386
[] = {
698 { "addB", { Eb
, Gb
} },
699 { "addS", { Ev
, Gv
} },
700 { "addB", { Gb
, Eb
} },
701 { "addS", { Gv
, Ev
} },
702 { "addB", { AL
, Ib
} },
703 { "addS", { eAX
, Iv
} },
704 { "push{T|}", { es
} },
705 { "pop{T|}", { es
} },
707 { "orB", { Eb
, Gb
} },
708 { "orS", { Ev
, Gv
} },
709 { "orB", { Gb
, Eb
} },
710 { "orS", { Gv
, Ev
} },
711 { "orB", { AL
, Ib
} },
712 { "orS", { eAX
, Iv
} },
713 { "push{T|}", { cs
} },
714 { "(bad)", { XX
} }, /* 0x0f extended opcode escape */
716 { "adcB", { Eb
, Gb
} },
717 { "adcS", { Ev
, Gv
} },
718 { "adcB", { Gb
, Eb
} },
719 { "adcS", { Gv
, Ev
} },
720 { "adcB", { AL
, Ib
} },
721 { "adcS", { eAX
, Iv
} },
722 { "push{T|}", { ss
} },
723 { "pop{T|}", { ss
} },
725 { "sbbB", { Eb
, Gb
} },
726 { "sbbS", { Ev
, Gv
} },
727 { "sbbB", { Gb
, Eb
} },
728 { "sbbS", { Gv
, Ev
} },
729 { "sbbB", { AL
, Ib
} },
730 { "sbbS", { eAX
, Iv
} },
731 { "push{T|}", { ds
} },
732 { "pop{T|}", { ds
} },
734 { "andB", { Eb
, Gb
} },
735 { "andS", { Ev
, Gv
} },
736 { "andB", { Gb
, Eb
} },
737 { "andS", { Gv
, Ev
} },
738 { "andB", { AL
, Ib
} },
739 { "andS", { eAX
, Iv
} },
740 { "(bad)", { XX
} }, /* SEG ES prefix */
741 { "daa{|}", { XX
} },
743 { "subB", { Eb
, Gb
} },
744 { "subS", { Ev
, Gv
} },
745 { "subB", { Gb
, Eb
} },
746 { "subS", { Gv
, Ev
} },
747 { "subB", { AL
, Ib
} },
748 { "subS", { eAX
, Iv
} },
749 { "(bad)", { XX
} }, /* SEG CS prefix */
750 { "das{|}", { XX
} },
752 { "xorB", { Eb
, Gb
} },
753 { "xorS", { Ev
, Gv
} },
754 { "xorB", { Gb
, Eb
} },
755 { "xorS", { Gv
, Ev
} },
756 { "xorB", { AL
, Ib
} },
757 { "xorS", { eAX
, Iv
} },
758 { "(bad)", { XX
} }, /* SEG SS prefix */
759 { "aaa{|}", { XX
} },
761 { "cmpB", { Eb
, Gb
} },
762 { "cmpS", { Ev
, Gv
} },
763 { "cmpB", { Gb
, Eb
} },
764 { "cmpS", { Gv
, Ev
} },
765 { "cmpB", { AL
, Ib
} },
766 { "cmpS", { eAX
, Iv
} },
767 { "(bad)", { XX
} }, /* SEG DS prefix */
768 { "aas{|}", { XX
} },
770 { "inc{S|}", { RMeAX
} },
771 { "inc{S|}", { RMeCX
} },
772 { "inc{S|}", { RMeDX
} },
773 { "inc{S|}", { RMeBX
} },
774 { "inc{S|}", { RMeSP
} },
775 { "inc{S|}", { RMeBP
} },
776 { "inc{S|}", { RMeSI
} },
777 { "inc{S|}", { RMeDI
} },
779 { "dec{S|}", { RMeAX
} },
780 { "dec{S|}", { RMeCX
} },
781 { "dec{S|}", { RMeDX
} },
782 { "dec{S|}", { RMeBX
} },
783 { "dec{S|}", { RMeSP
} },
784 { "dec{S|}", { RMeBP
} },
785 { "dec{S|}", { RMeSI
} },
786 { "dec{S|}", { RMeDI
} },
788 { "pushV", { RMrAX
} },
789 { "pushV", { RMrCX
} },
790 { "pushV", { RMrDX
} },
791 { "pushV", { RMrBX
} },
792 { "pushV", { RMrSP
} },
793 { "pushV", { RMrBP
} },
794 { "pushV", { RMrSI
} },
795 { "pushV", { RMrDI
} },
797 { "popV", { RMrAX
} },
798 { "popV", { RMrCX
} },
799 { "popV", { RMrDX
} },
800 { "popV", { RMrBX
} },
801 { "popV", { RMrSP
} },
802 { "popV", { RMrBP
} },
803 { "popV", { RMrSI
} },
804 { "popV", { RMrDI
} },
810 { "(bad)", { XX
} }, /* seg fs */
811 { "(bad)", { XX
} }, /* seg gs */
812 { "(bad)", { XX
} }, /* op size prefix */
813 { "(bad)", { XX
} }, /* adr size prefix */
816 { "imulS", { Gv
, Ev
, Iv
} },
817 { "pushT", { sIb
} },
818 { "imulS", { Gv
, Ev
, sIb
} },
819 { "ins{b||b|}", { Ybr
, indirDX
} },
820 { "ins{R||G|}", { Yzr
, indirDX
} },
821 { "outs{b||b|}", { indirDXr
, Xb
} },
822 { "outs{R||G|}", { indirDXr
, Xz
} },
824 { "joH", { Jb
, XX
, cond_jump_flag
} },
825 { "jnoH", { Jb
, XX
, cond_jump_flag
} },
826 { "jbH", { Jb
, XX
, cond_jump_flag
} },
827 { "jaeH", { Jb
, XX
, cond_jump_flag
} },
828 { "jeH", { Jb
, XX
, cond_jump_flag
} },
829 { "jneH", { Jb
, XX
, cond_jump_flag
} },
830 { "jbeH", { Jb
, XX
, cond_jump_flag
} },
831 { "jaH", { Jb
, XX
, cond_jump_flag
} },
833 { "jsH", { Jb
, XX
, cond_jump_flag
} },
834 { "jnsH", { Jb
, XX
, cond_jump_flag
} },
835 { "jpH", { Jb
, XX
, cond_jump_flag
} },
836 { "jnpH", { Jb
, XX
, cond_jump_flag
} },
837 { "jlH", { Jb
, XX
, cond_jump_flag
} },
838 { "jgeH", { Jb
, XX
, cond_jump_flag
} },
839 { "jleH", { Jb
, XX
, cond_jump_flag
} },
840 { "jgH", { Jb
, XX
, cond_jump_flag
} },
846 { "testB", { Eb
, Gb
} },
847 { "testS", { Ev
, Gv
} },
848 { "xchgB", { Eb
, Gb
} },
849 { "xchgS", { Ev
, Gv
} },
851 { "movB", { Eb
, Gb
} },
852 { "movS", { Ev
, Gv
} },
853 { "movB", { Gb
, Eb
} },
854 { "movS", { Gv
, Ev
} },
855 { "movD", { Sv
, Sw
} },
857 { "movD", { Sw
, Sv
} },
861 { "xchgS", { RMeCX
, eAX
} },
862 { "xchgS", { RMeDX
, eAX
} },
863 { "xchgS", { RMeBX
, eAX
} },
864 { "xchgS", { RMeSP
, eAX
} },
865 { "xchgS", { RMeBP
, eAX
} },
866 { "xchgS", { RMeSI
, eAX
} },
867 { "xchgS", { RMeDI
, eAX
} },
869 { "cW{t||t|}R", { XX
} },
870 { "cR{t||t|}O", { XX
} },
871 { "Jcall{T|}", { Ap
} },
872 { "(bad)", { XX
} }, /* fwait */
873 { "pushfT", { XX
} },
875 { "sahf{|}", { XX
} },
876 { "lahf{|}", { XX
} },
878 { "movB", { AL
, Ob
} },
879 { "movS", { eAX
, Ov
} },
880 { "movB", { Ob
, AL
} },
881 { "movS", { Ov
, eAX
} },
882 { "movs{b||b|}", { Ybr
, Xb
} },
883 { "movs{R||R|}", { Yvr
, Xv
} },
884 { "cmps{b||b|}", { Xb
, Yb
} },
885 { "cmps{R||R|}", { Xv
, Yv
} },
887 { "testB", { AL
, Ib
} },
888 { "testS", { eAX
, Iv
} },
889 { "stosB", { Ybr
, AL
} },
890 { "stosS", { Yvr
, eAX
} },
891 { "lodsB", { ALr
, Xb
} },
892 { "lodsS", { eAXr
, Xv
} },
893 { "scasB", { AL
, Yb
} },
894 { "scasS", { eAX
, Yv
} },
896 { "movB", { RMAL
, Ib
} },
897 { "movB", { RMCL
, Ib
} },
898 { "movB", { RMDL
, Ib
} },
899 { "movB", { RMBL
, Ib
} },
900 { "movB", { RMAH
, Ib
} },
901 { "movB", { RMCH
, Ib
} },
902 { "movB", { RMDH
, Ib
} },
903 { "movB", { RMBH
, Ib
} },
905 { "movS", { RMeAX
, Iv64
} },
906 { "movS", { RMeCX
, Iv64
} },
907 { "movS", { RMeDX
, Iv64
} },
908 { "movS", { RMeBX
, Iv64
} },
909 { "movS", { RMeSP
, Iv64
} },
910 { "movS", { RMeBP
, Iv64
} },
911 { "movS", { RMeSI
, Iv64
} },
912 { "movS", { RMeDI
, Iv64
} },
923 { "enterT", { Iw
, Ib
} },
924 { "leaveT", { XX
} },
929 { "into{|}", { XX
} },
936 { "aam{|}", { sIb
} },
937 { "aad{|}", { sIb
} },
939 { "xlat", { DSBX
} },
950 { "loopneFH", { Jb
, XX
, loop_jcxz_flag
} },
951 { "loopeFH", { Jb
, XX
, loop_jcxz_flag
} },
952 { "loopFH", { Jb
, XX
, loop_jcxz_flag
} },
953 { "jEcxzH", { Jb
, XX
, loop_jcxz_flag
} },
954 { "inB", { AL
, Ib
} },
955 { "inG", { zAX
, Ib
} },
956 { "outB", { Ib
, AL
} },
957 { "outG", { Ib
, zAX
} },
961 { "Jjmp{T|}", { Ap
} },
963 { "inB", { AL
, indirDX
} },
964 { "inG", { zAX
, indirDX
} },
965 { "outB", { indirDX
, AL
} },
966 { "outG", { indirDX
, zAX
} },
968 { "(bad)", { XX
} }, /* lock prefix */
970 { "(bad)", { XX
} }, /* repne */
971 { "(bad)", { XX
} }, /* repz */
987 static const struct dis386 dis386_twobyte
[] = {
991 { "larS", { Gv
, Ew
} },
992 { "lslS", { Gv
, Ew
} },
994 { "syscall", { XX
} },
996 { "sysretP", { XX
} },
999 { "wbinvd", { XX
} },
1000 { "(bad)", { XX
} },
1002 { "(bad)", { XX
} },
1004 { "femms", { XX
} },
1005 { "", { MX
, EM
, OPSUF
} }, /* See OP_3DNowSuffix. */
1011 { "unpcklpX", { XM
, EXq
} },
1012 { "unpckhpX", { XM
, EXq
} },
1017 { "(bad)", { XX
} },
1018 { "(bad)", { XX
} },
1019 { "(bad)", { XX
} },
1020 { "(bad)", { XX
} },
1021 { "(bad)", { XX
} },
1022 { "(bad)", { XX
} },
1030 { THREE_BYTE_SSE5_0F25
},
1032 { "(bad)", { XX
} },
1034 { "movapX", { XM
, EXx
} },
1035 { "movapX", { EXx
, XM
} },
1043 { "wrmsr", { XX
} },
1044 { "rdtsc", { XX
} },
1045 { "rdmsr", { XX
} },
1046 { "rdpmc", { XX
} },
1047 { "sysenter", { XX
} },
1048 { "sysexit", { XX
} },
1049 { "(bad)", { XX
} },
1050 { "(bad)", { XX
} },
1053 { "(bad)", { XX
} },
1055 { "(bad)", { XX
} },
1056 { "(bad)", { XX
} },
1057 { "(bad)", { XX
} },
1058 { "(bad)", { XX
} },
1059 { "(bad)", { XX
} },
1061 { "cmovo", { Gv
, Ev
} },
1062 { "cmovno", { Gv
, Ev
} },
1063 { "cmovb", { Gv
, Ev
} },
1064 { "cmovae", { Gv
, Ev
} },
1065 { "cmove", { Gv
, Ev
} },
1066 { "cmovne", { Gv
, Ev
} },
1067 { "cmovbe", { Gv
, Ev
} },
1068 { "cmova", { Gv
, Ev
} },
1070 { "cmovs", { Gv
, Ev
} },
1071 { "cmovns", { Gv
, Ev
} },
1072 { "cmovp", { Gv
, Ev
} },
1073 { "cmovnp", { Gv
, Ev
} },
1074 { "cmovl", { Gv
, Ev
} },
1075 { "cmovge", { Gv
, Ev
} },
1076 { "cmovle", { Gv
, Ev
} },
1077 { "cmovg", { Gv
, Ev
} },
1079 { "movmskpX", { Gdq
, XS
} },
1083 { "andpX", { XM
, EXx
} },
1084 { "andnpX", { XM
, EXx
} },
1085 { "orpX", { XM
, EXx
} },
1086 { "xorpX", { XM
, EXx
} },
1100 { "packsswb", { MX
, EM
} },
1101 { "pcmpgtb", { MX
, EM
} },
1102 { "pcmpgtw", { MX
, EM
} },
1103 { "pcmpgtd", { MX
, EM
} },
1104 { "packuswb", { MX
, EM
} },
1106 { "punpckhbw", { MX
, EM
} },
1107 { "punpckhwd", { MX
, EM
} },
1108 { "punpckhdq", { MX
, EM
} },
1109 { "packssdw", { MX
, EM
} },
1112 { "movK", { MX
, Edq
} },
1119 { "pcmpeqb", { MX
, EM
} },
1120 { "pcmpeqw", { MX
, EM
} },
1121 { "pcmpeqd", { MX
, EM
} },
1126 { THREE_BYTE_SSE5_0F7A
},
1127 { THREE_BYTE_SSE5_0F7B
},
1133 { "joH", { Jv
, XX
, cond_jump_flag
} },
1134 { "jnoH", { Jv
, XX
, cond_jump_flag
} },
1135 { "jbH", { Jv
, XX
, cond_jump_flag
} },
1136 { "jaeH", { Jv
, XX
, cond_jump_flag
} },
1137 { "jeH", { Jv
, XX
, cond_jump_flag
} },
1138 { "jneH", { Jv
, XX
, cond_jump_flag
} },
1139 { "jbeH", { Jv
, XX
, cond_jump_flag
} },
1140 { "jaH", { Jv
, XX
, cond_jump_flag
} },
1142 { "jsH", { Jv
, XX
, cond_jump_flag
} },
1143 { "jnsH", { Jv
, XX
, cond_jump_flag
} },
1144 { "jpH", { Jv
, XX
, cond_jump_flag
} },
1145 { "jnpH", { Jv
, XX
, cond_jump_flag
} },
1146 { "jlH", { Jv
, XX
, cond_jump_flag
} },
1147 { "jgeH", { Jv
, XX
, cond_jump_flag
} },
1148 { "jleH", { Jv
, XX
, cond_jump_flag
} },
1149 { "jgH", { Jv
, XX
, cond_jump_flag
} },
1152 { "setno", { Eb
} },
1154 { "setae", { Eb
} },
1156 { "setne", { Eb
} },
1157 { "setbe", { Eb
} },
1161 { "setns", { Eb
} },
1163 { "setnp", { Eb
} },
1165 { "setge", { Eb
} },
1166 { "setle", { Eb
} },
1169 { "pushT", { fs
} },
1171 { "cpuid", { XX
} },
1172 { "btS", { Ev
, Gv
} },
1173 { "shldS", { Ev
, Gv
, Ib
} },
1174 { "shldS", { Ev
, Gv
, CL
} },
1178 { "pushT", { gs
} },
1181 { "btsS", { Ev
, Gv
} },
1182 { "shrdS", { Ev
, Gv
, Ib
} },
1183 { "shrdS", { Ev
, Gv
, CL
} },
1185 { "imulS", { Gv
, Ev
} },
1187 { "cmpxchgB", { Eb
, Gb
} },
1188 { "cmpxchgS", { Ev
, Gv
} },
1190 { "btrS", { Ev
, Gv
} },
1193 { "movz{bR|x|bR|x}", { Gv
, Eb
} },
1194 { "movz{wR|x|wR|x}", { Gv
, Ew
} }, /* yes, there really is movzww ! */
1199 { "btcS", { Ev
, Gv
} },
1200 { "bsfS", { Gv
, Ev
} },
1202 { "movs{bR|x|bR|x}", { Gv
, Eb
} },
1203 { "movs{wR|x|wR|x}", { Gv
, Ew
} }, /* yes, there really is movsww ! */
1205 { "xaddB", { Eb
, Gb
} },
1206 { "xaddS", { Ev
, Gv
} },
1208 { "movntiS", { Ev
, Gv
} },
1209 { "pinsrw", { MX
, Edqw
, Ib
} },
1210 { "pextrw", { Gdq
, MS
, Ib
} },
1211 { "shufpX", { XM
, EXx
, Ib
} },
1214 { "bswap", { RMeAX
} },
1215 { "bswap", { RMeCX
} },
1216 { "bswap", { RMeDX
} },
1217 { "bswap", { RMeBX
} },
1218 { "bswap", { RMeSP
} },
1219 { "bswap", { RMeBP
} },
1220 { "bswap", { RMeSI
} },
1221 { "bswap", { RMeDI
} },
1224 { "psrlw", { MX
, EM
} },
1225 { "psrld", { MX
, EM
} },
1226 { "psrlq", { MX
, EM
} },
1227 { "paddq", { MX
, EM
} },
1228 { "pmullw", { MX
, EM
} },
1230 { "pmovmskb", { Gdq
, MS
} },
1232 { "psubusb", { MX
, EM
} },
1233 { "psubusw", { MX
, EM
} },
1234 { "pminub", { MX
, EM
} },
1235 { "pand", { MX
, EM
} },
1236 { "paddusb", { MX
, EM
} },
1237 { "paddusw", { MX
, EM
} },
1238 { "pmaxub", { MX
, EM
} },
1239 { "pandn", { MX
, EM
} },
1241 { "pavgb", { MX
, EM
} },
1242 { "psraw", { MX
, EM
} },
1243 { "psrad", { MX
, EM
} },
1244 { "pavgw", { MX
, EM
} },
1245 { "pmulhuw", { MX
, EM
} },
1246 { "pmulhw", { MX
, EM
} },
1250 { "psubsb", { MX
, EM
} },
1251 { "psubsw", { MX
, EM
} },
1252 { "pminsw", { MX
, EM
} },
1253 { "por", { MX
, EM
} },
1254 { "paddsb", { MX
, EM
} },
1255 { "paddsw", { MX
, EM
} },
1256 { "pmaxsw", { MX
, EM
} },
1257 { "pxor", { MX
, EM
} },
1260 { "psllw", { MX
, EM
} },
1261 { "pslld", { MX
, EM
} },
1262 { "psllq", { MX
, EM
} },
1263 { "pmuludq", { MX
, EM
} },
1264 { "pmaddwd", { MX
, EM
} },
1265 { "psadbw", { MX
, EM
} },
1268 { "psubb", { MX
, EM
} },
1269 { "psubw", { MX
, EM
} },
1270 { "psubd", { MX
, EM
} },
1271 { "psubq", { MX
, EM
} },
1272 { "paddb", { MX
, EM
} },
1273 { "paddw", { MX
, EM
} },
1274 { "paddd", { MX
, EM
} },
1275 { "(bad)", { XX
} },
1278 static const unsigned char onebyte_has_modrm
[256] = {
1279 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1280 /* ------------------------------- */
1281 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
1282 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
1283 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
1284 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
1285 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
1286 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
1287 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
1288 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
1289 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
1290 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
1291 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
1292 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
1293 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
1294 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
1295 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
1296 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
1297 /* ------------------------------- */
1298 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1301 static const unsigned char twobyte_has_modrm
[256] = {
1302 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1303 /* ------------------------------- */
1304 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
1305 /* 10 */ 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1, /* 1f */
1306 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
1307 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
1308 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
1309 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
1310 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
1311 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
1312 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
1313 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
1314 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
1315 /* b0 */ 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, /* bf */
1316 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
1317 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
1318 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
1319 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 /* ff */
1320 /* ------------------------------- */
1321 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1324 static char obuf
[100];
1326 static char scratchbuf
[100];
1327 static unsigned char *start_codep
;
1328 static unsigned char *insn_codep
;
1329 static unsigned char *codep
;
1330 static const char *lock_prefix
;
1331 static const char *data_prefix
;
1332 static const char *addr_prefix
;
1333 static const char *repz_prefix
;
1334 static const char *repnz_prefix
;
1335 static disassemble_info
*the_info
;
1343 static unsigned char need_modrm
;
1345 /* If we are accessing mod/rm/reg without need_modrm set, then the
1346 values are stale. Hitting this abort likely indicates that you
1347 need to update onebyte_has_modrm or twobyte_has_modrm. */
1348 #define MODRM_CHECK if (!need_modrm) abort ()
1350 static const char **names64
;
1351 static const char **names32
;
1352 static const char **names16
;
1353 static const char **names8
;
1354 static const char **names8rex
;
1355 static const char **names_seg
;
1356 static const char *index64
;
1357 static const char *index32
;
1358 static const char **index16
;
1360 static const char *intel_names64
[] = {
1361 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
1362 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
1364 static const char *intel_names32
[] = {
1365 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
1366 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
1368 static const char *intel_names16
[] = {
1369 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
1370 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
1372 static const char *intel_names8
[] = {
1373 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
1375 static const char *intel_names8rex
[] = {
1376 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
1377 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
1379 static const char *intel_names_seg
[] = {
1380 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
1382 static const char *intel_index64
= "riz";
1383 static const char *intel_index32
= "eiz";
1384 static const char *intel_index16
[] = {
1385 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
1388 static const char *att_names64
[] = {
1389 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
1390 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
1392 static const char *att_names32
[] = {
1393 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
1394 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
1396 static const char *att_names16
[] = {
1397 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
1398 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
1400 static const char *att_names8
[] = {
1401 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
1403 static const char *att_names8rex
[] = {
1404 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
1405 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
1407 static const char *att_names_seg
[] = {
1408 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
1410 static const char *att_index64
= "%riz";
1411 static const char *att_index32
= "%eiz";
1412 static const char *att_index16
[] = {
1413 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
1416 static const struct dis386 grps
[][8] = {
1419 { "popU", { stackEv
} },
1420 { "(bad)", { XX
} },
1421 { "(bad)", { XX
} },
1422 { "(bad)", { XX
} },
1423 { "(bad)", { XX
} },
1424 { "(bad)", { XX
} },
1425 { "(bad)", { XX
} },
1426 { "(bad)", { XX
} },
1430 { "addA", { Eb
, Ib
} },
1431 { "orA", { Eb
, Ib
} },
1432 { "adcA", { Eb
, Ib
} },
1433 { "sbbA", { Eb
, Ib
} },
1434 { "andA", { Eb
, Ib
} },
1435 { "subA", { Eb
, Ib
} },
1436 { "xorA", { Eb
, Ib
} },
1437 { "cmpA", { Eb
, Ib
} },
1441 { "addQ", { Ev
, Iv
} },
1442 { "orQ", { Ev
, Iv
} },
1443 { "adcQ", { Ev
, Iv
} },
1444 { "sbbQ", { Ev
, Iv
} },
1445 { "andQ", { Ev
, Iv
} },
1446 { "subQ", { Ev
, Iv
} },
1447 { "xorQ", { Ev
, Iv
} },
1448 { "cmpQ", { Ev
, Iv
} },
1452 { "addQ", { Ev
, sIb
} },
1453 { "orQ", { Ev
, sIb
} },
1454 { "adcQ", { Ev
, sIb
} },
1455 { "sbbQ", { Ev
, sIb
} },
1456 { "andQ", { Ev
, sIb
} },
1457 { "subQ", { Ev
, sIb
} },
1458 { "xorQ", { Ev
, sIb
} },
1459 { "cmpQ", { Ev
, sIb
} },
1463 { "rolA", { Eb
, Ib
} },
1464 { "rorA", { Eb
, Ib
} },
1465 { "rclA", { Eb
, Ib
} },
1466 { "rcrA", { Eb
, Ib
} },
1467 { "shlA", { Eb
, Ib
} },
1468 { "shrA", { Eb
, Ib
} },
1469 { "(bad)", { XX
} },
1470 { "sarA", { Eb
, Ib
} },
1474 { "rolQ", { Ev
, Ib
} },
1475 { "rorQ", { Ev
, Ib
} },
1476 { "rclQ", { Ev
, Ib
} },
1477 { "rcrQ", { Ev
, Ib
} },
1478 { "shlQ", { Ev
, Ib
} },
1479 { "shrQ", { Ev
, Ib
} },
1480 { "(bad)", { XX
} },
1481 { "sarQ", { Ev
, Ib
} },
1485 { "rolA", { Eb
, I1
} },
1486 { "rorA", { Eb
, I1
} },
1487 { "rclA", { Eb
, I1
} },
1488 { "rcrA", { Eb
, I1
} },
1489 { "shlA", { Eb
, I1
} },
1490 { "shrA", { Eb
, I1
} },
1491 { "(bad)", { XX
} },
1492 { "sarA", { Eb
, I1
} },
1496 { "rolQ", { Ev
, I1
} },
1497 { "rorQ", { Ev
, I1
} },
1498 { "rclQ", { Ev
, I1
} },
1499 { "rcrQ", { Ev
, I1
} },
1500 { "shlQ", { Ev
, I1
} },
1501 { "shrQ", { Ev
, I1
} },
1502 { "(bad)", { XX
} },
1503 { "sarQ", { Ev
, I1
} },
1507 { "rolA", { Eb
, CL
} },
1508 { "rorA", { Eb
, CL
} },
1509 { "rclA", { Eb
, CL
} },
1510 { "rcrA", { Eb
, CL
} },
1511 { "shlA", { Eb
, CL
} },
1512 { "shrA", { Eb
, CL
} },
1513 { "(bad)", { XX
} },
1514 { "sarA", { Eb
, CL
} },
1518 { "rolQ", { Ev
, CL
} },
1519 { "rorQ", { Ev
, CL
} },
1520 { "rclQ", { Ev
, CL
} },
1521 { "rcrQ", { Ev
, CL
} },
1522 { "shlQ", { Ev
, CL
} },
1523 { "shrQ", { Ev
, CL
} },
1524 { "(bad)", { XX
} },
1525 { "sarQ", { Ev
, CL
} },
1529 { "testA", { Eb
, Ib
} },
1530 { "(bad)", { Eb
} },
1533 { "mulA", { Eb
} }, /* Don't print the implicit %al register, */
1534 { "imulA", { Eb
} }, /* to distinguish these opcodes from other */
1535 { "divA", { Eb
} }, /* mul/imul opcodes. Do the same for div */
1536 { "idivA", { Eb
} }, /* and idiv for consistency. */
1540 { "testQ", { Ev
, Iv
} },
1541 { "(bad)", { XX
} },
1544 { "mulQ", { Ev
} }, /* Don't print the implicit register. */
1545 { "imulQ", { Ev
} },
1547 { "idivQ", { Ev
} },
1553 { "(bad)", { XX
} },
1554 { "(bad)", { XX
} },
1555 { "(bad)", { XX
} },
1556 { "(bad)", { XX
} },
1557 { "(bad)", { XX
} },
1558 { "(bad)", { XX
} },
1564 { "callT", { indirEv
} },
1565 { "JcallT", { indirEp
} },
1566 { "jmpT", { indirEv
} },
1567 { "JjmpT", { indirEp
} },
1568 { "pushU", { stackEv
} },
1569 { "(bad)", { XX
} },
1573 { "sldtD", { Sv
} },
1579 { "(bad)", { XX
} },
1580 { "(bad)", { XX
} },
1588 { "smswD", { Sv
} },
1589 { "(bad)", { XX
} },
1595 { "(bad)", { XX
} },
1596 { "(bad)", { XX
} },
1597 { "(bad)", { XX
} },
1598 { "(bad)", { XX
} },
1599 { "btQ", { Ev
, Ib
} },
1600 { "btsQ", { Ev
, Ib
} },
1601 { "btrQ", { Ev
, Ib
} },
1602 { "btcQ", { Ev
, Ib
} },
1606 { "(bad)", { XX
} },
1607 { "cmpxchg8b", { { CMPXCHG8B_Fixup
, q_mode
} } },
1608 { "(bad)", { XX
} },
1609 { "(bad)", { XX
} },
1610 { "(bad)", { XX
} },
1611 { "(bad)", { XX
} },
1617 { "movA", { Eb
, Ib
} },
1618 { "(bad)", { XX
} },
1619 { "(bad)", { XX
} },
1620 { "(bad)", { XX
} },
1621 { "(bad)", { XX
} },
1622 { "(bad)", { XX
} },
1623 { "(bad)", { XX
} },
1624 { "(bad)", { XX
} },
1628 { "movQ", { Ev
, Iv
} },
1629 { "(bad)", { XX
} },
1630 { "(bad)", { XX
} },
1631 { "(bad)", { XX
} },
1632 { "(bad)", { XX
} },
1633 { "(bad)", { XX
} },
1634 { "(bad)", { XX
} },
1635 { "(bad)", { XX
} },
1639 { "(bad)", { XX
} },
1640 { "(bad)", { XX
} },
1642 { "(bad)", { XX
} },
1644 { "(bad)", { XX
} },
1646 { "(bad)", { XX
} },
1650 { "(bad)", { XX
} },
1651 { "(bad)", { XX
} },
1653 { "(bad)", { XX
} },
1655 { "(bad)", { XX
} },
1657 { "(bad)", { XX
} },
1661 { "(bad)", { XX
} },
1662 { "(bad)", { XX
} },
1665 { "(bad)", { XX
} },
1666 { "(bad)", { XX
} },
1676 { "(bad)", { XX
} },
1687 { "(bad)", { XX
} },
1688 { "(bad)", { XX
} },
1689 { "(bad)", { XX
} },
1690 { "(bad)", { XX
} },
1694 { "prefetch", { Eb
} },
1695 { "prefetchw", { Eb
} },
1696 { "(bad)", { XX
} },
1697 { "(bad)", { XX
} },
1698 { "(bad)", { XX
} },
1699 { "(bad)", { XX
} },
1700 { "(bad)", { XX
} },
1701 { "(bad)", { XX
} },
1705 { "xstore-rng", { { OP_0f07
, 0 } } },
1706 { "xcrypt-ecb", { { OP_0f07
, 0 } } },
1707 { "xcrypt-cbc", { { OP_0f07
, 0 } } },
1708 { "xcrypt-ctr", { { OP_0f07
, 0 } } },
1709 { "xcrypt-cfb", { { OP_0f07
, 0 } } },
1710 { "xcrypt-ofb", { { OP_0f07
, 0 } } },
1711 { "(bad)", { { OP_0f07
, 0 } } },
1712 { "(bad)", { { OP_0f07
, 0 } } },
1716 { "montmul", { { OP_0f07
, 0 } } },
1717 { "xsha1", { { OP_0f07
, 0 } } },
1718 { "xsha256", { { OP_0f07
, 0 } } },
1719 { "(bad)", { { OP_0f07
, 0 } } },
1720 { "(bad)", { { OP_0f07
, 0 } } },
1721 { "(bad)", { { OP_0f07
, 0 } } },
1722 { "(bad)", { { OP_0f07
, 0 } } },
1723 { "(bad)", { { OP_0f07
, 0 } } },
1727 static const struct dis386 prefix_user_table
[][4] = {
1730 { "addps", { XM
, EXx
} },
1731 { "addss", { XM
, EXd
} },
1732 { "addpd", { XM
, EXx
} },
1733 { "addsd", { XM
, EXq
} },
1737 { "", { XM
, EXx
, OPSIMD
} }, /* See OP_SIMD_SUFFIX. */
1738 { "", { XM
, EXd
, OPSIMD
} },
1739 { "", { XM
, EXx
, OPSIMD
} },
1740 { "", { XM
, EXq
, OPSIMD
} },
1744 { "cvtpi2ps", { XM
, EMCq
} },
1745 { "cvtsi2ssY", { XM
, Ev
} },
1746 { "cvtpi2pd", { XM
, EMCq
} },
1747 { "cvtsi2sdY", { XM
, Ev
} },
1751 { "cvtps2pi", { MXC
, EXq
} },
1752 { "cvtss2siY", { Gv
, EXd
} },
1753 { "cvtpd2pi", { MXC
, EXx
} },
1754 { "cvtsd2siY", { Gv
, EXq
} },
1758 { "cvttps2pi", { MXC
, EXq
} },
1759 { "cvttss2siY", { Gv
, EXd
} },
1760 { "cvttpd2pi", { MXC
, EXx
} },
1761 { "cvttsd2siY", { Gv
, EXq
} },
1765 { "divps", { XM
, EXx
} },
1766 { "divss", { XM
, EXd
} },
1767 { "divpd", { XM
, EXx
} },
1768 { "divsd", { XM
, EXq
} },
1772 { "maxps", { XM
, EXx
} },
1773 { "maxss", { XM
, EXd
} },
1774 { "maxpd", { XM
, EXx
} },
1775 { "maxsd", { XM
, EXq
} },
1779 { "minps", { XM
, EXx
} },
1780 { "minss", { XM
, EXd
} },
1781 { "minpd", { XM
, EXx
} },
1782 { "minsd", { XM
, EXq
} },
1786 { "movups", { XM
, EXx
} },
1787 { "movss", { XM
, EXd
} },
1788 { "movupd", { XM
, EXx
} },
1789 { "movsd", { XM
, EXq
} },
1793 { "movups", { EXx
, XM
} },
1794 { "movss", { EXd
, XM
} },
1795 { "movupd", { EXx
, XM
} },
1796 { "movsd", { EXq
, XM
} },
1800 { "mulps", { XM
, EXx
} },
1801 { "mulss", { XM
, EXd
} },
1802 { "mulpd", { XM
, EXx
} },
1803 { "mulsd", { XM
, EXq
} },
1807 { "rcpps", { XM
, EXx
} },
1808 { "rcpss", { XM
, EXd
} },
1809 { "(bad)", { XM
, EXx
} },
1810 { "(bad)", { XM
, EXx
} },
1814 { "rsqrtps",{ XM
, EXx
} },
1815 { "rsqrtss",{ XM
, EXd
} },
1816 { "(bad)", { XM
, EXx
} },
1817 { "(bad)", { XM
, EXx
} },
1821 { "sqrtps", { XM
, EXx
} },
1822 { "sqrtss", { XM
, EXd
} },
1823 { "sqrtpd", { XM
, EXx
} },
1824 { "sqrtsd", { XM
, EXq
} },
1828 { "subps", { XM
, EXx
} },
1829 { "subss", { XM
, EXd
} },
1830 { "subpd", { XM
, EXx
} },
1831 { "subsd", { XM
, EXq
} },
1835 { "(bad)", { XM
, EXx
} },
1836 { "cvtdq2pd", { XM
, EXq
} },
1837 { "cvttpd2dq", { XM
, EXx
} },
1838 { "cvtpd2dq", { XM
, EXx
} },
1842 { "cvtdq2ps", { XM
, EXx
} },
1843 { "cvttps2dq", { XM
, EXx
} },
1844 { "cvtps2dq", { XM
, EXx
} },
1845 { "(bad)", { XM
, EXx
} },
1849 { "cvtps2pd", { XM
, EXq
} },
1850 { "cvtss2sd", { XM
, EXd
} },
1851 { "cvtpd2ps", { XM
, EXx
} },
1852 { "cvtsd2ss", { XM
, EXq
} },
1856 { "maskmovq", { MX
, MS
} },
1857 { "(bad)", { XM
, EXx
} },
1858 { "maskmovdqu", { XM
, XS
} },
1859 { "(bad)", { XM
, EXx
} },
1863 { "movq", { MX
, EM
} },
1864 { "movdqu", { XM
, EXx
} },
1865 { "movdqa", { XM
, EXx
} },
1866 { "(bad)", { XM
, EXx
} },
1870 { "movq", { EM
, MX
} },
1871 { "movdqu", { EXx
, XM
} },
1872 { "movdqa", { EXx
, XM
} },
1873 { "(bad)", { EXx
, XM
} },
1877 { "(bad)", { EXx
, XM
} },
1878 { "movq2dq",{ XM
, MS
} },
1879 { "movq", { EXq
, XM
} },
1880 { "movdq2q",{ MX
, XS
} },
1884 { "pshufw", { MX
, EM
, Ib
} },
1885 { "pshufhw",{ XM
, EXx
, Ib
} },
1886 { "pshufd", { XM
, EXx
, Ib
} },
1887 { "pshuflw",{ XM
, EXx
, Ib
} },
1891 { "movK", { Edq
, MX
} },
1892 { "movq", { XM
, EXq
} },
1893 { "movK", { Edq
, XM
} },
1894 { "(bad)", { Ed
, XM
} },
1898 { "(bad)", { MX
, EXx
} },
1899 { "(bad)", { XM
, EXx
} },
1900 { "punpckhqdq", { XM
, EXx
} },
1901 { "(bad)", { XM
, EXx
} },
1905 { "movntq", { EM
, MX
} },
1906 { "(bad)", { EM
, XM
} },
1907 { "movntdq",{ EM
, XM
} },
1908 { "(bad)", { EM
, XM
} },
1912 { "(bad)", { MX
, EXx
} },
1913 { "(bad)", { XM
, EXx
} },
1914 { "punpcklqdq", { XM
, EXx
} },
1915 { "(bad)", { XM
, EXx
} },
1919 { "(bad)", { MX
, EXx
} },
1920 { "(bad)", { XM
, EXx
} },
1921 { "addsubpd", { XM
, EXx
} },
1922 { "addsubps", { XM
, EXx
} },
1926 { "(bad)", { MX
, EXx
} },
1927 { "(bad)", { XM
, EXx
} },
1928 { "haddpd", { XM
, EXx
} },
1929 { "haddps", { XM
, EXx
} },
1933 { "(bad)", { MX
, EXx
} },
1934 { "(bad)", { XM
, EXx
} },
1935 { "hsubpd", { XM
, EXx
} },
1936 { "hsubps", { XM
, EXx
} },
1941 { "movsldup", { XM
, EXx
} },
1942 { "movlpd", { XM
, EXq
} },
1943 { "movddup", { XM
, EXq
} },
1948 { "movshdup", { XM
, EXx
} },
1949 { "movhpd", { XM
, EXq
} },
1950 { "(bad)", { XM
, EXq
} },
1954 { "(bad)", { XM
, EXx
} },
1955 { "(bad)", { XM
, EXx
} },
1956 { "(bad)", { XM
, EXx
} },
1961 {"movntps", { Ev
, XM
} },
1962 {"movntss", { Ed
, XM
} },
1963 {"movntpd", { Ev
, XM
} },
1964 {"movntsd", { Eq
, XM
} },
1969 {"vmread", { Em
, Gm
} },
1971 {"extrq", { XS
, Ib
, Ib
} },
1972 {"insertq", { XM
, XS
, Ib
, Ib
} },
1977 {"vmwrite", { Gm
, Em
} },
1979 {"extrq", { XM
, XS
} },
1980 {"insertq", { XM
, XS
} },
1985 { "bsrS", { Gv
, Ev
} },
1986 { "lzcntS", { Gv
, Ev
} },
1987 { "bsrS", { Gv
, Ev
} },
1988 { "(bad)", { XX
} },
1993 { "(bad)", { XX
} },
1994 { "popcntS", { Gv
, Ev
} },
1995 { "(bad)", { XX
} },
1996 { "(bad)", { XX
} },
2001 { "xchgS", { { NOP_Fixup1
, eAX_reg
}, { NOP_Fixup2
, eAX_reg
} } },
2002 { "pause", { XX
} },
2003 { "xchgS", { { NOP_Fixup1
, eAX_reg
}, { NOP_Fixup2
, eAX_reg
} } },
2004 { "(bad)", { XX
} },
2009 { "(bad)", { XX
} },
2010 { "(bad)", { XX
} },
2011 { "pblendvb", {XM
, EXx
, XMM0
} },
2012 { "(bad)", { XX
} },
2017 { "(bad)", { XX
} },
2018 { "(bad)", { XX
} },
2019 { "blendvps", {XM
, EXx
, XMM0
} },
2020 { "(bad)", { XX
} },
2025 { "(bad)", { XX
} },
2026 { "(bad)", { XX
} },
2027 { "blendvpd", { XM
, EXx
, XMM0
} },
2028 { "(bad)", { XX
} },
2033 { "(bad)", { XX
} },
2034 { "(bad)", { XX
} },
2035 { "ptest", { XM
, EXx
} },
2036 { "(bad)", { XX
} },
2041 { "(bad)", { XX
} },
2042 { "(bad)", { XX
} },
2043 { "pmovsxbw", { XM
, EXq
} },
2044 { "(bad)", { XX
} },
2049 { "(bad)", { XX
} },
2050 { "(bad)", { XX
} },
2051 { "pmovsxbd", { XM
, EXd
} },
2052 { "(bad)", { XX
} },
2057 { "(bad)", { XX
} },
2058 { "(bad)", { XX
} },
2059 { "pmovsxbq", { XM
, EXw
} },
2060 { "(bad)", { XX
} },
2065 { "(bad)", { XX
} },
2066 { "(bad)", { XX
} },
2067 { "pmovsxwd", { XM
, EXq
} },
2068 { "(bad)", { XX
} },
2073 { "(bad)", { XX
} },
2074 { "(bad)", { XX
} },
2075 { "pmovsxwq", { XM
, EXd
} },
2076 { "(bad)", { XX
} },
2081 { "(bad)", { XX
} },
2082 { "(bad)", { XX
} },
2083 { "pmovsxdq", { XM
, EXq
} },
2084 { "(bad)", { XX
} },
2089 { "(bad)", { XX
} },
2090 { "(bad)", { XX
} },
2091 { "pmuldq", { XM
, EXx
} },
2092 { "(bad)", { XX
} },
2097 { "(bad)", { XX
} },
2098 { "(bad)", { XX
} },
2099 { "pcmpeqq", { XM
, EXx
} },
2100 { "(bad)", { XX
} },
2105 { "(bad)", { XX
} },
2106 { "(bad)", { XX
} },
2107 { "movntdqa", { XM
, EM
} },
2108 { "(bad)", { XX
} },
2113 { "(bad)", { XX
} },
2114 { "(bad)", { XX
} },
2115 { "packusdw", { XM
, EXx
} },
2116 { "(bad)", { XX
} },
2121 { "(bad)", { XX
} },
2122 { "(bad)", { XX
} },
2123 { "pmovzxbw", { XM
, EXq
} },
2124 { "(bad)", { XX
} },
2129 { "(bad)", { XX
} },
2130 { "(bad)", { XX
} },
2131 { "pmovzxbd", { XM
, EXd
} },
2132 { "(bad)", { XX
} },
2137 { "(bad)", { XX
} },
2138 { "(bad)", { XX
} },
2139 { "pmovzxbq", { XM
, EXw
} },
2140 { "(bad)", { XX
} },
2145 { "(bad)", { XX
} },
2146 { "(bad)", { XX
} },
2147 { "pmovzxwd", { XM
, EXq
} },
2148 { "(bad)", { XX
} },
2153 { "(bad)", { XX
} },
2154 { "(bad)", { XX
} },
2155 { "pmovzxwq", { XM
, EXd
} },
2156 { "(bad)", { XX
} },
2161 { "(bad)", { XX
} },
2162 { "(bad)", { XX
} },
2163 { "pmovzxdq", { XM
, EXq
} },
2164 { "(bad)", { XX
} },
2169 { "(bad)", { XX
} },
2170 { "(bad)", { XX
} },
2171 { "pminsb", { XM
, EXx
} },
2172 { "(bad)", { XX
} },
2177 { "(bad)", { XX
} },
2178 { "(bad)", { XX
} },
2179 { "pminsd", { XM
, EXx
} },
2180 { "(bad)", { XX
} },
2185 { "(bad)", { XX
} },
2186 { "(bad)", { XX
} },
2187 { "pminuw", { XM
, EXx
} },
2188 { "(bad)", { XX
} },
2193 { "(bad)", { XX
} },
2194 { "(bad)", { XX
} },
2195 { "pminud", { XM
, EXx
} },
2196 { "(bad)", { XX
} },
2201 { "(bad)", { XX
} },
2202 { "(bad)", { XX
} },
2203 { "pmaxsb", { XM
, EXx
} },
2204 { "(bad)", { XX
} },
2209 { "(bad)", { XX
} },
2210 { "(bad)", { XX
} },
2211 { "pmaxsd", { XM
, EXx
} },
2212 { "(bad)", { XX
} },
2217 { "(bad)", { XX
} },
2218 { "(bad)", { XX
} },
2219 { "pmaxuw", { XM
, EXx
} },
2220 { "(bad)", { XX
} },
2225 { "(bad)", { XX
} },
2226 { "(bad)", { XX
} },
2227 { "pmaxud", { XM
, EXx
} },
2228 { "(bad)", { XX
} },
2233 { "(bad)", { XX
} },
2234 { "(bad)", { XX
} },
2235 { "pmulld", { XM
, EXx
} },
2236 { "(bad)", { XX
} },
2241 { "(bad)", { XX
} },
2242 { "(bad)", { XX
} },
2243 { "phminposuw", { XM
, EXx
} },
2244 { "(bad)", { XX
} },
2249 { "(bad)", { XX
} },
2250 { "(bad)", { XX
} },
2251 { "roundps", { XM
, EXx
, Ib
} },
2252 { "(bad)", { XX
} },
2257 { "(bad)", { XX
} },
2258 { "(bad)", { XX
} },
2259 { "roundpd", { XM
, EXx
, Ib
} },
2260 { "(bad)", { XX
} },
2265 { "(bad)", { XX
} },
2266 { "(bad)", { XX
} },
2267 { "roundss", { XM
, EXd
, Ib
} },
2268 { "(bad)", { XX
} },
2273 { "(bad)", { XX
} },
2274 { "(bad)", { XX
} },
2275 { "roundsd", { XM
, EXq
, Ib
} },
2276 { "(bad)", { XX
} },
2281 { "(bad)", { XX
} },
2282 { "(bad)", { XX
} },
2283 { "blendps", { XM
, EXx
, Ib
} },
2284 { "(bad)", { XX
} },
2289 { "(bad)", { XX
} },
2290 { "(bad)", { XX
} },
2291 { "blendpd", { XM
, EXx
, Ib
} },
2292 { "(bad)", { XX
} },
2297 { "(bad)", { XX
} },
2298 { "(bad)", { XX
} },
2299 { "pblendw", { XM
, EXx
, Ib
} },
2300 { "(bad)", { XX
} },
2305 { "(bad)", { XX
} },
2306 { "(bad)", { XX
} },
2307 { "pextrb", { Edqb
, XM
, Ib
} },
2308 { "(bad)", { XX
} },
2313 { "(bad)", { XX
} },
2314 { "(bad)", { XX
} },
2315 { "pextrw", { Edqw
, XM
, Ib
} },
2316 { "(bad)", { XX
} },
2321 { "(bad)", { XX
} },
2322 { "(bad)", { XX
} },
2323 { "pextrK", { Edq
, XM
, Ib
} },
2324 { "(bad)", { XX
} },
2329 { "(bad)", { XX
} },
2330 { "(bad)", { XX
} },
2331 { "extractps", { Edqd
, XM
, Ib
} },
2332 { "(bad)", { XX
} },
2337 { "(bad)", { XX
} },
2338 { "(bad)", { XX
} },
2339 { "pinsrb", { XM
, Edqb
, Ib
} },
2340 { "(bad)", { XX
} },
2345 { "(bad)", { XX
} },
2346 { "(bad)", { XX
} },
2347 { "insertps", { XM
, EXd
, Ib
} },
2348 { "(bad)", { XX
} },
2353 { "(bad)", { XX
} },
2354 { "(bad)", { XX
} },
2355 { "pinsrK", { XM
, Edq
, Ib
} },
2356 { "(bad)", { XX
} },
2361 { "(bad)", { XX
} },
2362 { "(bad)", { XX
} },
2363 { "dpps", { XM
, EXx
, Ib
} },
2364 { "(bad)", { XX
} },
2369 { "(bad)", { XX
} },
2370 { "(bad)", { XX
} },
2371 { "dppd", { XM
, EXx
, Ib
} },
2372 { "(bad)", { XX
} },
2377 { "(bad)", { XX
} },
2378 { "(bad)", { XX
} },
2379 { "mpsadbw", { XM
, EXx
, Ib
} },
2380 { "(bad)", { XX
} },
2385 { "(bad)", { XX
} },
2386 { "(bad)", { XX
} },
2387 { "pcmpgtq", { XM
, EXx
} },
2388 { "(bad)", { XX
} },
2393 { "(bad)", { XX
} },
2394 { "(bad)", { XX
} },
2395 { "(bad)", { XX
} },
2396 { "crc32", { Gdq
, { CRC32_Fixup
, b_mode
} } },
2401 { "(bad)", { XX
} },
2402 { "(bad)", { XX
} },
2403 { "(bad)", { XX
} },
2404 { "crc32", { Gdq
, { CRC32_Fixup
, v_mode
} } },
2409 { "(bad)", { XX
} },
2410 { "(bad)", { XX
} },
2411 { "pcmpestrm", { XM
, EXx
, Ib
} },
2412 { "(bad)", { XX
} },
2417 { "(bad)", { XX
} },
2418 { "(bad)", { XX
} },
2419 { "pcmpestri", { XM
, EXx
, Ib
} },
2420 { "(bad)", { XX
} },
2425 { "(bad)", { XX
} },
2426 { "(bad)", { XX
} },
2427 { "pcmpistrm", { XM
, EXx
, Ib
} },
2428 { "(bad)", { XX
} },
2433 { "(bad)", { XX
} },
2434 { "(bad)", { XX
} },
2435 { "pcmpistri", { XM
, EXx
, Ib
} },
2436 { "(bad)", { XX
} },
2441 { "ucomiss",{ XM
, EXd
} },
2442 { "(bad)", { XX
} },
2443 { "ucomisd",{ XM
, EXq
} },
2444 { "(bad)", { XX
} },
2449 { "comiss", { XM
, EXd
} },
2450 { "(bad)", { XX
} },
2451 { "comisd", { XM
, EXq
} },
2452 { "(bad)", { XX
} },
2457 { "punpcklbw",{ MX
, EMd
} },
2458 { "(bad)", { XX
} },
2459 { "punpcklbw",{ MX
, EMx
} },
2460 { "(bad)", { XX
} },
2465 { "punpcklwd",{ MX
, EMd
} },
2466 { "(bad)", { XX
} },
2467 { "punpcklwd",{ MX
, EMx
} },
2468 { "(bad)", { XX
} },
2473 { "punpckldq",{ MX
, EMd
} },
2474 { "(bad)", { XX
} },
2475 { "punpckldq",{ MX
, EMx
} },
2476 { "(bad)", { XX
} },
2481 { "vmptrld",{ Mq
} },
2482 { "vmxon", { Mq
} },
2483 { "vmclear",{ Mq
} },
2484 { "(bad)", { XX
} },
2489 { "(bad)", { XX
} },
2490 { "(bad)", { XX
} },
2491 { "psrldq", { MS
, Ib
} },
2492 { "(bad)", { XX
} },
2497 { "(bad)", { XX
} },
2498 { "(bad)", { XX
} },
2499 { "pslldq", { MS
, Ib
} },
2500 { "(bad)", { XX
} },
2504 static const struct dis386 x86_64_table
[][2] = {
2506 { "pusha{P|}", { XX
} },
2507 { "(bad)", { XX
} },
2510 { "popa{P|}", { XX
} },
2511 { "(bad)", { XX
} },
2515 { "(bad)", { XX
} },
2518 { "arpl", { Ew
, Gw
} },
2519 { "movs{||lq|xd}", { Gv
, Ed
} },
2523 static const struct dis386 three_byte_table
[][256] = {
2527 { "pshufb", { MX
, EM
} },
2528 { "phaddw", { MX
, EM
} },
2529 { "phaddd", { MX
, EM
} },
2530 { "phaddsw", { MX
, EM
} },
2531 { "pmaddubsw", { MX
, EM
} },
2532 { "phsubw", { MX
, EM
} },
2533 { "phsubd", { MX
, EM
} },
2534 { "phsubsw", { MX
, EM
} },
2536 { "psignb", { MX
, EM
} },
2537 { "psignw", { MX
, EM
} },
2538 { "psignd", { MX
, EM
} },
2539 { "pmulhrsw", { MX
, EM
} },
2540 { "(bad)", { XX
} },
2541 { "(bad)", { XX
} },
2542 { "(bad)", { XX
} },
2543 { "(bad)", { XX
} },
2546 { "(bad)", { XX
} },
2547 { "(bad)", { XX
} },
2548 { "(bad)", { XX
} },
2551 { "(bad)", { XX
} },
2554 { "(bad)", { XX
} },
2555 { "(bad)", { XX
} },
2556 { "(bad)", { XX
} },
2557 { "(bad)", { XX
} },
2558 { "pabsb", { MX
, EM
} },
2559 { "pabsw", { MX
, EM
} },
2560 { "pabsd", { MX
, EM
} },
2561 { "(bad)", { XX
} },
2569 { "(bad)", { XX
} },
2570 { "(bad)", { XX
} },
2576 { "(bad)", { XX
} },
2577 { "(bad)", { XX
} },
2578 { "(bad)", { XX
} },
2579 { "(bad)", { XX
} },
2587 { "(bad)", { XX
} },
2601 { "(bad)", { XX
} },
2602 { "(bad)", { XX
} },
2603 { "(bad)", { XX
} },
2604 { "(bad)", { XX
} },
2605 { "(bad)", { XX
} },
2606 { "(bad)", { XX
} },
2608 { "(bad)", { XX
} },
2609 { "(bad)", { XX
} },
2610 { "(bad)", { XX
} },
2611 { "(bad)", { XX
} },
2612 { "(bad)", { XX
} },
2613 { "(bad)", { XX
} },
2614 { "(bad)", { XX
} },
2615 { "(bad)", { XX
} },
2617 { "(bad)", { XX
} },
2618 { "(bad)", { XX
} },
2619 { "(bad)", { XX
} },
2620 { "(bad)", { XX
} },
2621 { "(bad)", { XX
} },
2622 { "(bad)", { XX
} },
2623 { "(bad)", { XX
} },
2624 { "(bad)", { XX
} },
2626 { "(bad)", { XX
} },
2627 { "(bad)", { XX
} },
2628 { "(bad)", { XX
} },
2629 { "(bad)", { XX
} },
2630 { "(bad)", { XX
} },
2631 { "(bad)", { XX
} },
2632 { "(bad)", { XX
} },
2633 { "(bad)", { XX
} },
2635 { "(bad)", { XX
} },
2636 { "(bad)", { XX
} },
2637 { "(bad)", { XX
} },
2638 { "(bad)", { XX
} },
2639 { "(bad)", { XX
} },
2640 { "(bad)", { XX
} },
2641 { "(bad)", { XX
} },
2642 { "(bad)", { XX
} },
2644 { "(bad)", { XX
} },
2645 { "(bad)", { XX
} },
2646 { "(bad)", { XX
} },
2647 { "(bad)", { XX
} },
2648 { "(bad)", { XX
} },
2649 { "(bad)", { XX
} },
2650 { "(bad)", { XX
} },
2651 { "(bad)", { XX
} },
2653 { "(bad)", { XX
} },
2654 { "(bad)", { XX
} },
2655 { "(bad)", { XX
} },
2656 { "(bad)", { XX
} },
2657 { "(bad)", { XX
} },
2658 { "(bad)", { XX
} },
2659 { "(bad)", { XX
} },
2660 { "(bad)", { XX
} },
2662 { "(bad)", { XX
} },
2663 { "(bad)", { XX
} },
2664 { "(bad)", { XX
} },
2665 { "(bad)", { XX
} },
2666 { "(bad)", { XX
} },
2667 { "(bad)", { XX
} },
2668 { "(bad)", { XX
} },
2669 { "(bad)", { XX
} },
2671 { "(bad)", { XX
} },
2672 { "(bad)", { XX
} },
2673 { "(bad)", { XX
} },
2674 { "(bad)", { XX
} },
2675 { "(bad)", { XX
} },
2676 { "(bad)", { XX
} },
2677 { "(bad)", { XX
} },
2678 { "(bad)", { XX
} },
2680 { "(bad)", { XX
} },
2681 { "(bad)", { XX
} },
2682 { "(bad)", { XX
} },
2683 { "(bad)", { XX
} },
2684 { "(bad)", { XX
} },
2685 { "(bad)", { XX
} },
2686 { "(bad)", { XX
} },
2687 { "(bad)", { XX
} },
2689 { "(bad)", { XX
} },
2690 { "(bad)", { XX
} },
2691 { "(bad)", { XX
} },
2692 { "(bad)", { XX
} },
2693 { "(bad)", { XX
} },
2694 { "(bad)", { XX
} },
2695 { "(bad)", { XX
} },
2696 { "(bad)", { XX
} },
2698 { "(bad)", { XX
} },
2699 { "(bad)", { XX
} },
2700 { "(bad)", { XX
} },
2701 { "(bad)", { XX
} },
2702 { "(bad)", { XX
} },
2703 { "(bad)", { XX
} },
2704 { "(bad)", { XX
} },
2705 { "(bad)", { XX
} },
2707 { "(bad)", { XX
} },
2708 { "(bad)", { XX
} },
2709 { "(bad)", { XX
} },
2710 { "(bad)", { XX
} },
2711 { "(bad)", { XX
} },
2712 { "(bad)", { XX
} },
2713 { "(bad)", { XX
} },
2714 { "(bad)", { XX
} },
2716 { "(bad)", { XX
} },
2717 { "(bad)", { XX
} },
2718 { "(bad)", { XX
} },
2719 { "(bad)", { XX
} },
2720 { "(bad)", { XX
} },
2721 { "(bad)", { XX
} },
2722 { "(bad)", { XX
} },
2723 { "(bad)", { XX
} },
2725 { "(bad)", { XX
} },
2726 { "(bad)", { XX
} },
2727 { "(bad)", { XX
} },
2728 { "(bad)", { XX
} },
2729 { "(bad)", { XX
} },
2730 { "(bad)", { XX
} },
2731 { "(bad)", { XX
} },
2732 { "(bad)", { XX
} },
2734 { "(bad)", { XX
} },
2735 { "(bad)", { XX
} },
2736 { "(bad)", { XX
} },
2737 { "(bad)", { XX
} },
2738 { "(bad)", { XX
} },
2739 { "(bad)", { XX
} },
2740 { "(bad)", { XX
} },
2741 { "(bad)", { XX
} },
2743 { "(bad)", { XX
} },
2744 { "(bad)", { XX
} },
2745 { "(bad)", { XX
} },
2746 { "(bad)", { XX
} },
2747 { "(bad)", { XX
} },
2748 { "(bad)", { XX
} },
2749 { "(bad)", { XX
} },
2750 { "(bad)", { XX
} },
2752 { "(bad)", { XX
} },
2753 { "(bad)", { XX
} },
2754 { "(bad)", { XX
} },
2755 { "(bad)", { XX
} },
2756 { "(bad)", { XX
} },
2757 { "(bad)", { XX
} },
2758 { "(bad)", { XX
} },
2759 { "(bad)", { XX
} },
2761 { "(bad)", { XX
} },
2762 { "(bad)", { XX
} },
2763 { "(bad)", { XX
} },
2764 { "(bad)", { XX
} },
2765 { "(bad)", { XX
} },
2766 { "(bad)", { XX
} },
2767 { "(bad)", { XX
} },
2768 { "(bad)", { XX
} },
2770 { "(bad)", { XX
} },
2771 { "(bad)", { XX
} },
2772 { "(bad)", { XX
} },
2773 { "(bad)", { XX
} },
2774 { "(bad)", { XX
} },
2775 { "(bad)", { XX
} },
2776 { "(bad)", { XX
} },
2777 { "(bad)", { XX
} },
2779 { "(bad)", { XX
} },
2780 { "(bad)", { XX
} },
2781 { "(bad)", { XX
} },
2782 { "(bad)", { XX
} },
2783 { "(bad)", { XX
} },
2784 { "(bad)", { XX
} },
2785 { "(bad)", { XX
} },
2786 { "(bad)", { XX
} },
2788 { "(bad)", { XX
} },
2789 { "(bad)", { XX
} },
2790 { "(bad)", { XX
} },
2791 { "(bad)", { XX
} },
2792 { "(bad)", { XX
} },
2793 { "(bad)", { XX
} },
2794 { "(bad)", { XX
} },
2795 { "(bad)", { XX
} },
2799 { "(bad)", { XX
} },
2800 { "(bad)", { XX
} },
2801 { "(bad)", { XX
} },
2802 { "(bad)", { XX
} },
2803 { "(bad)", { XX
} },
2804 { "(bad)", { XX
} },
2806 { "(bad)", { XX
} },
2807 { "(bad)", { XX
} },
2808 { "(bad)", { XX
} },
2809 { "(bad)", { XX
} },
2810 { "(bad)", { XX
} },
2811 { "(bad)", { XX
} },
2812 { "(bad)", { XX
} },
2813 { "(bad)", { XX
} },
2818 { "(bad)", { XX
} },
2819 { "(bad)", { XX
} },
2820 { "(bad)", { XX
} },
2821 { "(bad)", { XX
} },
2822 { "(bad)", { XX
} },
2823 { "(bad)", { XX
} },
2824 { "(bad)", { XX
} },
2825 { "(bad)", { XX
} },
2834 { "palignr", { MX
, EM
, Ib
} },
2836 { "(bad)", { XX
} },
2837 { "(bad)", { XX
} },
2838 { "(bad)", { XX
} },
2839 { "(bad)", { XX
} },
2845 { "(bad)", { XX
} },
2846 { "(bad)", { XX
} },
2847 { "(bad)", { XX
} },
2848 { "(bad)", { XX
} },
2849 { "(bad)", { XX
} },
2850 { "(bad)", { XX
} },
2851 { "(bad)", { XX
} },
2852 { "(bad)", { XX
} },
2857 { "(bad)", { XX
} },
2858 { "(bad)", { XX
} },
2859 { "(bad)", { XX
} },
2860 { "(bad)", { XX
} },
2861 { "(bad)", { XX
} },
2863 { "(bad)", { XX
} },
2864 { "(bad)", { XX
} },
2865 { "(bad)", { XX
} },
2866 { "(bad)", { XX
} },
2867 { "(bad)", { XX
} },
2868 { "(bad)", { XX
} },
2869 { "(bad)", { XX
} },
2870 { "(bad)", { XX
} },
2872 { "(bad)", { XX
} },
2873 { "(bad)", { XX
} },
2874 { "(bad)", { XX
} },
2875 { "(bad)", { XX
} },
2876 { "(bad)", { XX
} },
2877 { "(bad)", { XX
} },
2878 { "(bad)", { XX
} },
2879 { "(bad)", { XX
} },
2881 { "(bad)", { XX
} },
2882 { "(bad)", { XX
} },
2883 { "(bad)", { XX
} },
2884 { "(bad)", { XX
} },
2885 { "(bad)", { XX
} },
2886 { "(bad)", { XX
} },
2887 { "(bad)", { XX
} },
2888 { "(bad)", { XX
} },
2893 { "(bad)", { XX
} },
2894 { "(bad)", { XX
} },
2895 { "(bad)", { XX
} },
2896 { "(bad)", { XX
} },
2897 { "(bad)", { XX
} },
2899 { "(bad)", { XX
} },
2900 { "(bad)", { XX
} },
2901 { "(bad)", { XX
} },
2902 { "(bad)", { XX
} },
2903 { "(bad)", { XX
} },
2904 { "(bad)", { XX
} },
2905 { "(bad)", { XX
} },
2906 { "(bad)", { XX
} },
2908 { "(bad)", { XX
} },
2909 { "(bad)", { XX
} },
2910 { "(bad)", { XX
} },
2911 { "(bad)", { XX
} },
2912 { "(bad)", { XX
} },
2913 { "(bad)", { XX
} },
2914 { "(bad)", { XX
} },
2915 { "(bad)", { XX
} },
2917 { "(bad)", { XX
} },
2918 { "(bad)", { XX
} },
2919 { "(bad)", { XX
} },
2920 { "(bad)", { XX
} },
2921 { "(bad)", { XX
} },
2922 { "(bad)", { XX
} },
2923 { "(bad)", { XX
} },
2924 { "(bad)", { XX
} },
2930 { "(bad)", { XX
} },
2931 { "(bad)", { XX
} },
2932 { "(bad)", { XX
} },
2933 { "(bad)", { XX
} },
2935 { "(bad)", { XX
} },
2936 { "(bad)", { XX
} },
2937 { "(bad)", { XX
} },
2938 { "(bad)", { XX
} },
2939 { "(bad)", { XX
} },
2940 { "(bad)", { XX
} },
2941 { "(bad)", { XX
} },
2942 { "(bad)", { XX
} },
2944 { "(bad)", { XX
} },
2945 { "(bad)", { XX
} },
2946 { "(bad)", { XX
} },
2947 { "(bad)", { XX
} },
2948 { "(bad)", { XX
} },
2949 { "(bad)", { XX
} },
2950 { "(bad)", { XX
} },
2951 { "(bad)", { XX
} },
2953 { "(bad)", { XX
} },
2954 { "(bad)", { XX
} },
2955 { "(bad)", { XX
} },
2956 { "(bad)", { XX
} },
2957 { "(bad)", { XX
} },
2958 { "(bad)", { XX
} },
2959 { "(bad)", { XX
} },
2960 { "(bad)", { XX
} },
2962 { "(bad)", { XX
} },
2963 { "(bad)", { XX
} },
2964 { "(bad)", { XX
} },
2965 { "(bad)", { XX
} },
2966 { "(bad)", { XX
} },
2967 { "(bad)", { XX
} },
2968 { "(bad)", { XX
} },
2969 { "(bad)", { XX
} },
2971 { "(bad)", { XX
} },
2972 { "(bad)", { XX
} },
2973 { "(bad)", { XX
} },
2974 { "(bad)", { XX
} },
2975 { "(bad)", { XX
} },
2976 { "(bad)", { XX
} },
2977 { "(bad)", { XX
} },
2978 { "(bad)", { XX
} },
2980 { "(bad)", { XX
} },
2981 { "(bad)", { XX
} },
2982 { "(bad)", { XX
} },
2983 { "(bad)", { XX
} },
2984 { "(bad)", { XX
} },
2985 { "(bad)", { XX
} },
2986 { "(bad)", { XX
} },
2987 { "(bad)", { XX
} },
2989 { "(bad)", { XX
} },
2990 { "(bad)", { XX
} },
2991 { "(bad)", { XX
} },
2992 { "(bad)", { XX
} },
2993 { "(bad)", { XX
} },
2994 { "(bad)", { XX
} },
2995 { "(bad)", { XX
} },
2996 { "(bad)", { XX
} },
2998 { "(bad)", { XX
} },
2999 { "(bad)", { XX
} },
3000 { "(bad)", { XX
} },
3001 { "(bad)", { XX
} },
3002 { "(bad)", { XX
} },
3003 { "(bad)", { XX
} },
3004 { "(bad)", { XX
} },
3005 { "(bad)", { XX
} },
3007 { "(bad)", { XX
} },
3008 { "(bad)", { XX
} },
3009 { "(bad)", { XX
} },
3010 { "(bad)", { XX
} },
3011 { "(bad)", { XX
} },
3012 { "(bad)", { XX
} },
3013 { "(bad)", { XX
} },
3014 { "(bad)", { XX
} },
3016 { "(bad)", { XX
} },
3017 { "(bad)", { XX
} },
3018 { "(bad)", { XX
} },
3019 { "(bad)", { XX
} },
3020 { "(bad)", { XX
} },
3021 { "(bad)", { XX
} },
3022 { "(bad)", { XX
} },
3023 { "(bad)", { XX
} },
3025 { "(bad)", { XX
} },
3026 { "(bad)", { XX
} },
3027 { "(bad)", { XX
} },
3028 { "(bad)", { XX
} },
3029 { "(bad)", { XX
} },
3030 { "(bad)", { XX
} },
3031 { "(bad)", { XX
} },
3032 { "(bad)", { XX
} },
3034 { "(bad)", { XX
} },
3035 { "(bad)", { XX
} },
3036 { "(bad)", { XX
} },
3037 { "(bad)", { XX
} },
3038 { "(bad)", { XX
} },
3039 { "(bad)", { XX
} },
3040 { "(bad)", { XX
} },
3041 { "(bad)", { XX
} },
3043 { "(bad)", { XX
} },
3044 { "(bad)", { XX
} },
3045 { "(bad)", { XX
} },
3046 { "(bad)", { XX
} },
3047 { "(bad)", { XX
} },
3048 { "(bad)", { XX
} },
3049 { "(bad)", { XX
} },
3050 { "(bad)", { XX
} },
3052 { "(bad)", { XX
} },
3053 { "(bad)", { XX
} },
3054 { "(bad)", { XX
} },
3055 { "(bad)", { XX
} },
3056 { "(bad)", { XX
} },
3057 { "(bad)", { XX
} },
3058 { "(bad)", { XX
} },
3059 { "(bad)", { XX
} },
3061 { "(bad)", { XX
} },
3062 { "(bad)", { XX
} },
3063 { "(bad)", { XX
} },
3064 { "(bad)", { XX
} },
3065 { "(bad)", { XX
} },
3066 { "(bad)", { XX
} },
3067 { "(bad)", { XX
} },
3068 { "(bad)", { XX
} },
3070 { "(bad)", { XX
} },
3071 { "(bad)", { XX
} },
3072 { "(bad)", { XX
} },
3073 { "(bad)", { XX
} },
3074 { "(bad)", { XX
} },
3075 { "(bad)", { XX
} },
3076 { "(bad)", { XX
} },
3077 { "(bad)", { XX
} },
3079 { "(bad)", { XX
} },
3080 { "(bad)", { XX
} },
3081 { "(bad)", { XX
} },
3082 { "(bad)", { XX
} },
3083 { "(bad)", { XX
} },
3084 { "(bad)", { XX
} },
3085 { "(bad)", { XX
} },
3086 { "(bad)", { XX
} },
3088 { "(bad)", { XX
} },
3089 { "(bad)", { XX
} },
3090 { "(bad)", { XX
} },
3091 { "(bad)", { XX
} },
3092 { "(bad)", { XX
} },
3093 { "(bad)", { XX
} },
3094 { "(bad)", { XX
} },
3095 { "(bad)", { XX
} },
3097 { "(bad)", { XX
} },
3098 { "(bad)", { XX
} },
3099 { "(bad)", { XX
} },
3100 { "(bad)", { XX
} },
3101 { "(bad)", { XX
} },
3102 { "(bad)", { XX
} },
3103 { "(bad)", { XX
} },
3104 { "(bad)", { XX
} },
3106 /* THREE_BYTE_SSE5_0F24 */
3109 { "fmaddps", { { OP_DREX4
, q_mode
} } },
3110 { "fmaddpd", { { OP_DREX4
, q_mode
} } },
3111 { "fmaddss", { { OP_DREX4
, w_mode
} } },
3112 { "fmaddsd", { { OP_DREX4
, d_mode
} } },
3113 { "fmaddps", { { OP_DREX4
, DREX_OC1
+ q_mode
} } },
3114 { "fmaddpd", { { OP_DREX4
, DREX_OC1
+ q_mode
} } },
3115 { "fmaddss", { { OP_DREX4
, DREX_OC1
+ w_mode
} } },
3116 { "fmaddsd", { { OP_DREX4
, DREX_OC1
+ d_mode
} } },
3118 { "fmsubps", { { OP_DREX4
, q_mode
} } },
3119 { "fmsubpd", { { OP_DREX4
, q_mode
} } },
3120 { "fmsubss", { { OP_DREX4
, w_mode
} } },
3121 { "fmsubsd", { { OP_DREX4
, d_mode
} } },
3122 { "fmsubps", { { OP_DREX4
, DREX_OC1
+ q_mode
} } },
3123 { "fmsubpd", { { OP_DREX4
, DREX_OC1
+ q_mode
} } },
3124 { "fmsubss", { { OP_DREX4
, DREX_OC1
+ w_mode
} } },
3125 { "fmsubsd", { { OP_DREX4
, DREX_OC1
+ d_mode
} } },
3127 { "fnmaddps", { { OP_DREX4
, q_mode
} } },
3128 { "fnmaddpd", { { OP_DREX4
, q_mode
} } },
3129 { "fnmaddss", { { OP_DREX4
, w_mode
} } },
3130 { "fnmaddsd", { { OP_DREX4
, d_mode
} } },
3131 { "fnmaddps", { { OP_DREX4
, DREX_OC1
+ q_mode
} } },
3132 { "fnmaddpd", { { OP_DREX4
, DREX_OC1
+ q_mode
} } },
3133 { "fnmaddss", { { OP_DREX4
, DREX_OC1
+ w_mode
} } },
3134 { "fnmaddsd", { { OP_DREX4
, DREX_OC1
+ d_mode
} } },
3136 { "fnmsubps", { { OP_DREX4
, q_mode
} } },
3137 { "fnmsubpd", { { OP_DREX4
, q_mode
} } },
3138 { "fnmsubss", { { OP_DREX4
, w_mode
} } },
3139 { "fnmsubsd", { { OP_DREX4
, d_mode
} } },
3140 { "fnmsubps", { { OP_DREX4
, DREX_OC1
+ q_mode
} } },
3141 { "fnmsubpd", { { OP_DREX4
, DREX_OC1
+ q_mode
} } },
3142 { "fnmsubss", { { OP_DREX4
, DREX_OC1
+ w_mode
} } },
3143 { "fnmsubsd", { { OP_DREX4
, DREX_OC1
+ d_mode
} } },
3145 { "permps", { { OP_DREX4
, q_mode
} } },
3146 { "permpd", { { OP_DREX4
, q_mode
} } },
3147 { "pcmov", { { OP_DREX4
, q_mode
} } },
3148 { "pperm", { { OP_DREX4
, q_mode
} } },
3149 { "permps", { { OP_DREX4
, DREX_OC1
+ q_mode
} } },
3150 { "permpd", { { OP_DREX4
, DREX_OC1
+ q_mode
} } },
3151 { "pcmov", { { OP_DREX4
, DREX_OC1
+ w_mode
} } },
3152 { "pperm", { { OP_DREX4
, DREX_OC1
+ d_mode
} } },
3154 { "(bad)", { XX
} },
3155 { "(bad)", { XX
} },
3156 { "(bad)", { XX
} },
3157 { "(bad)", { XX
} },
3158 { "(bad)", { XX
} },
3159 { "(bad)", { XX
} },
3160 { "(bad)", { XX
} },
3161 { "(bad)", { XX
} },
3163 { "(bad)", { XX
} },
3164 { "(bad)", { XX
} },
3165 { "(bad)", { XX
} },
3166 { "(bad)", { XX
} },
3167 { "(bad)", { XX
} },
3168 { "(bad)", { XX
} },
3169 { "(bad)", { XX
} },
3170 { "(bad)", { XX
} },
3172 { "(bad)", { XX
} },
3173 { "(bad)", { XX
} },
3174 { "(bad)", { XX
} },
3175 { "(bad)", { XX
} },
3176 { "(bad)", { XX
} },
3177 { "(bad)", { XX
} },
3178 { "(bad)", { XX
} },
3179 { "(bad)", { XX
} },
3181 { "protb", { { OP_DREX3
, q_mode
} } },
3182 { "protw", { { OP_DREX3
, q_mode
} } },
3183 { "protd", { { OP_DREX3
, q_mode
} } },
3184 { "protq", { { OP_DREX3
, q_mode
} } },
3185 { "pshlb", { { OP_DREX3
, q_mode
} } },
3186 { "pshlw", { { OP_DREX3
, q_mode
} } },
3187 { "pshld", { { OP_DREX3
, q_mode
} } },
3188 { "pshlq", { { OP_DREX3
, q_mode
} } },
3190 { "pshab", { { OP_DREX3
, q_mode
} } },
3191 { "pshaw", { { OP_DREX3
, q_mode
} } },
3192 { "pshad", { { OP_DREX3
, q_mode
} } },
3193 { "pshaq", { { OP_DREX3
, q_mode
} } },
3194 { "(bad)", { XX
} },
3195 { "(bad)", { XX
} },
3196 { "(bad)", { XX
} },
3197 { "(bad)", { XX
} },
3199 { "(bad)", { XX
} },
3200 { "(bad)", { XX
} },
3201 { "(bad)", { XX
} },
3202 { "(bad)", { XX
} },
3203 { "(bad)", { XX
} },
3204 { "(bad)", { XX
} },
3205 { "(bad)", { XX
} },
3206 { "(bad)", { XX
} },
3208 { "(bad)", { XX
} },
3209 { "(bad)", { XX
} },
3210 { "(bad)", { XX
} },
3211 { "(bad)", { XX
} },
3212 { "(bad)", { XX
} },
3213 { "(bad)", { XX
} },
3214 { "(bad)", { XX
} },
3215 { "(bad)", { XX
} },
3217 { "(bad)", { XX
} },
3218 { "(bad)", { XX
} },
3219 { "(bad)", { XX
} },
3220 { "(bad)", { XX
} },
3221 { "(bad)", { XX
} },
3222 { "(bad)", { XX
} },
3223 { "(bad)", { XX
} },
3224 { "(bad)", { XX
} },
3226 { "(bad)", { XX
} },
3227 { "(bad)", { XX
} },
3228 { "(bad)", { XX
} },
3229 { "(bad)", { XX
} },
3230 { "(bad)", { XX
} },
3231 { "(bad)", { XX
} },
3232 { "(bad)", { XX
} },
3233 { "(bad)", { XX
} },
3235 { "(bad)", { XX
} },
3236 { "(bad)", { XX
} },
3237 { "(bad)", { XX
} },
3238 { "(bad)", { XX
} },
3239 { "(bad)", { XX
} },
3240 { "(bad)", { XX
} },
3241 { "(bad)", { XX
} },
3242 { "(bad)", { XX
} },
3244 { "(bad)", { XX
} },
3245 { "(bad)", { XX
} },
3246 { "(bad)", { XX
} },
3247 { "(bad)", { XX
} },
3248 { "(bad)", { XX
} },
3249 { "(bad)", { XX
} },
3250 { "(bad)", { XX
} },
3251 { "(bad)", { XX
} },
3253 { "(bad)", { XX
} },
3254 { "(bad)", { XX
} },
3255 { "(bad)", { XX
} },
3256 { "(bad)", { XX
} },
3257 { "(bad)", { XX
} },
3258 { "pmacssww", { { OP_DREX4
, DREX_OC1
+ DREX_NO_OC0
+ q_mode
} } },
3259 { "pmacsswd", { { OP_DREX4
, DREX_OC1
+ DREX_NO_OC0
+ q_mode
} } },
3260 { "pmacssdql", { { OP_DREX4
, DREX_OC1
+ DREX_NO_OC0
+ q_mode
} } },
3262 { "(bad)", { XX
} },
3263 { "(bad)", { XX
} },
3264 { "(bad)", { XX
} },
3265 { "(bad)", { XX
} },
3266 { "(bad)", { XX
} },
3267 { "(bad)", { XX
} },
3268 { "pmacssdd", { { OP_DREX4
, DREX_OC1
+ DREX_NO_OC0
+ q_mode
} } },
3269 { "pmacssdqh", { { OP_DREX4
, DREX_OC1
+ DREX_NO_OC0
+ q_mode
} } },
3271 { "(bad)", { XX
} },
3272 { "(bad)", { XX
} },
3273 { "(bad)", { XX
} },
3274 { "(bad)", { XX
} },
3275 { "(bad)", { XX
} },
3276 { "pmacsww", { { OP_DREX4
, DREX_OC1
+ DREX_NO_OC0
+ q_mode
} } },
3277 { "pmacswd", { { OP_DREX4
, DREX_OC1
+ DREX_NO_OC0
+ q_mode
} } },
3278 { "pmacsdql", { { OP_DREX4
, DREX_OC1
+ DREX_NO_OC0
+ q_mode
} } },
3280 { "(bad)", { XX
} },
3281 { "(bad)", { XX
} },
3282 { "(bad)", { XX
} },
3283 { "(bad)", { XX
} },
3284 { "(bad)", { XX
} },
3285 { "(bad)", { XX
} },
3286 { "pmacsdd", { { OP_DREX4
, DREX_OC1
+ DREX_NO_OC0
+ q_mode
} } },
3287 { "pmacsdqh", { { OP_DREX4
, DREX_OC1
+ DREX_NO_OC0
+ q_mode
} } },
3289 { "(bad)", { XX
} },
3290 { "(bad)", { XX
} },
3291 { "(bad)", { XX
} },
3292 { "(bad)", { XX
} },
3293 { "(bad)", { XX
} },
3294 { "(bad)", { XX
} },
3295 { "pmadcsswd", { { OP_DREX4
, DREX_OC1
+ DREX_NO_OC0
+ q_mode
} } },
3296 { "(bad)", { XX
} },
3298 { "(bad)", { XX
} },
3299 { "(bad)", { XX
} },
3300 { "(bad)", { XX
} },
3301 { "(bad)", { XX
} },
3302 { "(bad)", { XX
} },
3303 { "(bad)", { XX
} },
3304 { "(bad)", { XX
} },
3305 { "(bad)", { XX
} },
3307 { "(bad)", { XX
} },
3308 { "(bad)", { XX
} },
3309 { "(bad)", { XX
} },
3310 { "(bad)", { XX
} },
3311 { "(bad)", { XX
} },
3312 { "(bad)", { XX
} },
3313 { "pmadcswd", { { OP_DREX4
, DREX_OC1
+ DREX_NO_OC0
+ q_mode
} } },
3314 { "(bad)", { XX
} },
3316 { "(bad)", { XX
} },
3317 { "(bad)", { XX
} },
3318 { "(bad)", { XX
} },
3319 { "(bad)", { XX
} },
3320 { "(bad)", { XX
} },
3321 { "(bad)", { XX
} },
3322 { "(bad)", { XX
} },
3323 { "(bad)", { XX
} },
3325 { "(bad)", { XX
} },
3326 { "(bad)", { XX
} },
3327 { "(bad)", { XX
} },
3328 { "(bad)", { XX
} },
3329 { "(bad)", { XX
} },
3330 { "(bad)", { XX
} },
3331 { "(bad)", { XX
} },
3332 { "(bad)", { XX
} },
3334 { "(bad)", { XX
} },
3335 { "(bad)", { XX
} },
3336 { "(bad)", { XX
} },
3337 { "(bad)", { XX
} },
3338 { "(bad)", { XX
} },
3339 { "(bad)", { XX
} },
3340 { "(bad)", { XX
} },
3341 { "(bad)", { XX
} },
3343 { "(bad)", { XX
} },
3344 { "(bad)", { XX
} },
3345 { "(bad)", { XX
} },
3346 { "(bad)", { XX
} },
3347 { "(bad)", { XX
} },
3348 { "(bad)", { XX
} },
3349 { "(bad)", { XX
} },
3350 { "(bad)", { XX
} },
3352 { "(bad)", { XX
} },
3353 { "(bad)", { XX
} },
3354 { "(bad)", { XX
} },
3355 { "(bad)", { XX
} },
3356 { "(bad)", { XX
} },
3357 { "(bad)", { XX
} },
3358 { "(bad)", { XX
} },
3359 { "(bad)", { XX
} },
3361 { "(bad)", { XX
} },
3362 { "(bad)", { XX
} },
3363 { "(bad)", { XX
} },
3364 { "(bad)", { XX
} },
3365 { "(bad)", { XX
} },
3366 { "(bad)", { XX
} },
3367 { "(bad)", { XX
} },
3368 { "(bad)", { XX
} },
3370 { "(bad)", { XX
} },
3371 { "(bad)", { XX
} },
3372 { "(bad)", { XX
} },
3373 { "(bad)", { XX
} },
3374 { "(bad)", { XX
} },
3375 { "(bad)", { XX
} },
3376 { "(bad)", { XX
} },
3377 { "(bad)", { XX
} },
3379 { "(bad)", { XX
} },
3380 { "(bad)", { XX
} },
3381 { "(bad)", { XX
} },
3382 { "(bad)", { XX
} },
3383 { "(bad)", { XX
} },
3384 { "(bad)", { XX
} },
3385 { "(bad)", { XX
} },
3386 { "(bad)", { XX
} },
3388 { "(bad)", { XX
} },
3389 { "(bad)", { XX
} },
3390 { "(bad)", { XX
} },
3391 { "(bad)", { XX
} },
3392 { "(bad)", { XX
} },
3393 { "(bad)", { XX
} },
3394 { "(bad)", { XX
} },
3395 { "(bad)", { XX
} },
3397 /* THREE_BYTE_SSE5_0F25 */
3400 { "(bad)", { XX
} },
3401 { "(bad)", { XX
} },
3402 { "(bad)", { XX
} },
3403 { "(bad)", { XX
} },
3404 { "(bad)", { XX
} },
3405 { "(bad)", { XX
} },
3406 { "(bad)", { XX
} },
3407 { "(bad)", { XX
} },
3409 { "(bad)", { XX
} },
3410 { "(bad)", { XX
} },
3411 { "(bad)", { XX
} },
3412 { "(bad)", { XX
} },
3413 { "(bad)", { XX
} },
3414 { "(bad)", { XX
} },
3415 { "(bad)", { XX
} },
3416 { "(bad)", { XX
} },
3418 { "(bad)", { XX
} },
3419 { "(bad)", { XX
} },
3420 { "(bad)", { XX
} },
3421 { "(bad)", { XX
} },
3422 { "(bad)", { XX
} },
3423 { "(bad)", { XX
} },
3424 { "(bad)", { XX
} },
3425 { "(bad)", { XX
} },
3427 { "(bad)", { XX
} },
3428 { "(bad)", { XX
} },
3429 { "(bad)", { XX
} },
3430 { "(bad)", { XX
} },
3431 { "(bad)", { XX
} },
3432 { "(bad)", { XX
} },
3433 { "(bad)", { XX
} },
3434 { "(bad)", { XX
} },
3436 { "(bad)", { XX
} },
3437 { "(bad)", { XX
} },
3438 { "(bad)", { XX
} },
3439 { "(bad)", { XX
} },
3440 { "(bad)", { XX
} },
3441 { "(bad)", { XX
} },
3442 { "(bad)", { XX
} },
3443 { "(bad)", { XX
} },
3445 { "(bad)", { XX
} },
3446 { "(bad)", { XX
} },
3447 { "(bad)", { XX
} },
3448 { "(bad)", { XX
} },
3449 { "comps", { { OP_DREX3
, q_mode
}, { OP_DREX_FCMP
, b_mode
} } },
3450 { "compd", { { OP_DREX3
, q_mode
}, { OP_DREX_FCMP
, b_mode
} } },
3451 { "comss", { { OP_DREX3
, w_mode
}, { OP_DREX_FCMP
, b_mode
} } },
3452 { "comsd", { { OP_DREX3
, d_mode
}, { OP_DREX_FCMP
, b_mode
} } },
3454 { "(bad)", { XX
} },
3455 { "(bad)", { XX
} },
3456 { "(bad)", { XX
} },
3457 { "(bad)", { XX
} },
3458 { "(bad)", { XX
} },
3459 { "(bad)", { XX
} },
3460 { "(bad)", { XX
} },
3461 { "(bad)", { XX
} },
3463 { "(bad)", { XX
} },
3464 { "(bad)", { XX
} },
3465 { "(bad)", { XX
} },
3466 { "(bad)", { XX
} },
3467 { "(bad)", { XX
} },
3468 { "(bad)", { XX
} },
3469 { "(bad)", { XX
} },
3470 { "(bad)", { XX
} },
3472 { "(bad)", { XX
} },
3473 { "(bad)", { XX
} },
3474 { "(bad)", { XX
} },
3475 { "(bad)", { XX
} },
3476 { "(bad)", { XX
} },
3477 { "(bad)", { XX
} },
3478 { "(bad)", { XX
} },
3479 { "(bad)", { XX
} },
3481 { "(bad)", { XX
} },
3482 { "(bad)", { XX
} },
3483 { "(bad)", { XX
} },
3484 { "(bad)", { XX
} },
3485 { "pcomb", { { OP_DREX3
, q_mode
}, { OP_DREX_ICMP
, b_mode
} } },
3486 { "pcomw", { { OP_DREX3
, q_mode
}, { OP_DREX_ICMP
, b_mode
} } },
3487 { "pcomd", { { OP_DREX3
, q_mode
}, { OP_DREX_ICMP
, b_mode
} } },
3488 { "pcomq", { { OP_DREX3
, q_mode
}, { OP_DREX_ICMP
, b_mode
} } },
3490 { "(bad)", { XX
} },
3491 { "(bad)", { XX
} },
3492 { "(bad)", { XX
} },
3493 { "(bad)", { XX
} },
3494 { "(bad)", { XX
} },
3495 { "(bad)", { XX
} },
3496 { "(bad)", { XX
} },
3497 { "(bad)", { XX
} },
3499 { "(bad)", { XX
} },
3500 { "(bad)", { XX
} },
3501 { "(bad)", { XX
} },
3502 { "(bad)", { XX
} },
3503 { "(bad)", { XX
} },
3504 { "(bad)", { XX
} },
3505 { "(bad)", { XX
} },
3506 { "(bad)", { XX
} },
3508 { "(bad)", { XX
} },
3509 { "(bad)", { XX
} },
3510 { "(bad)", { XX
} },
3511 { "(bad)", { XX
} },
3512 { "(bad)", { XX
} },
3513 { "(bad)", { XX
} },
3514 { "(bad)", { XX
} },
3515 { "(bad)", { XX
} },
3517 { "(bad)", { XX
} },
3518 { "(bad)", { XX
} },
3519 { "(bad)", { XX
} },
3520 { "(bad)", { XX
} },
3521 { "pcomub", { { OP_DREX3
, q_mode
}, { OP_DREX_ICMP
, b_mode
} } },
3522 { "pcomuw", { { OP_DREX3
, q_mode
}, { OP_DREX_ICMP
, b_mode
} } },
3523 { "pcomud", { { OP_DREX3
, q_mode
}, { OP_DREX_ICMP
, b_mode
} } },
3524 { "pcomuq", { { OP_DREX3
, q_mode
}, { OP_DREX_ICMP
, b_mode
} } },
3526 { "(bad)", { XX
} },
3527 { "(bad)", { XX
} },
3528 { "(bad)", { XX
} },
3529 { "(bad)", { XX
} },
3530 { "(bad)", { XX
} },
3531 { "(bad)", { XX
} },
3532 { "(bad)", { XX
} },
3533 { "(bad)", { XX
} },
3535 { "(bad)", { XX
} },
3536 { "(bad)", { XX
} },
3537 { "(bad)", { XX
} },
3538 { "(bad)", { XX
} },
3539 { "(bad)", { XX
} },
3540 { "(bad)", { XX
} },
3541 { "(bad)", { XX
} },
3542 { "(bad)", { XX
} },
3544 { "(bad)", { XX
} },
3545 { "(bad)", { XX
} },
3546 { "(bad)", { XX
} },
3547 { "(bad)", { XX
} },
3548 { "(bad)", { XX
} },
3549 { "(bad)", { XX
} },
3550 { "(bad)", { XX
} },
3551 { "(bad)", { XX
} },
3553 { "(bad)", { XX
} },
3554 { "(bad)", { XX
} },
3555 { "(bad)", { XX
} },
3556 { "(bad)", { XX
} },
3557 { "(bad)", { XX
} },
3558 { "(bad)", { XX
} },
3559 { "(bad)", { XX
} },
3560 { "(bad)", { XX
} },
3562 { "(bad)", { XX
} },
3563 { "(bad)", { XX
} },
3564 { "(bad)", { XX
} },
3565 { "(bad)", { XX
} },
3566 { "(bad)", { XX
} },
3567 { "(bad)", { XX
} },
3568 { "(bad)", { XX
} },
3569 { "(bad)", { XX
} },
3571 { "(bad)", { XX
} },
3572 { "(bad)", { XX
} },
3573 { "(bad)", { XX
} },
3574 { "(bad)", { XX
} },
3575 { "(bad)", { XX
} },
3576 { "(bad)", { XX
} },
3577 { "(bad)", { XX
} },
3578 { "(bad)", { XX
} },
3580 { "(bad)", { XX
} },
3581 { "(bad)", { XX
} },
3582 { "(bad)", { XX
} },
3583 { "(bad)", { XX
} },
3584 { "(bad)", { XX
} },
3585 { "(bad)", { XX
} },
3586 { "(bad)", { XX
} },
3587 { "(bad)", { XX
} },
3589 { "(bad)", { XX
} },
3590 { "(bad)", { XX
} },
3591 { "(bad)", { XX
} },
3592 { "(bad)", { XX
} },
3593 { "(bad)", { XX
} },
3594 { "(bad)", { XX
} },
3595 { "(bad)", { XX
} },
3596 { "(bad)", { XX
} },
3598 { "(bad)", { XX
} },
3599 { "(bad)", { XX
} },
3600 { "(bad)", { XX
} },
3601 { "(bad)", { XX
} },
3602 { "(bad)", { XX
} },
3603 { "(bad)", { XX
} },
3604 { "(bad)", { XX
} },
3605 { "(bad)", { XX
} },
3607 { "(bad)", { XX
} },
3608 { "(bad)", { XX
} },
3609 { "(bad)", { XX
} },
3610 { "(bad)", { XX
} },
3611 { "(bad)", { XX
} },
3612 { "(bad)", { XX
} },
3613 { "(bad)", { XX
} },
3614 { "(bad)", { XX
} },
3616 { "(bad)", { XX
} },
3617 { "(bad)", { XX
} },
3618 { "(bad)", { XX
} },
3619 { "(bad)", { XX
} },
3620 { "(bad)", { XX
} },
3621 { "(bad)", { XX
} },
3622 { "(bad)", { XX
} },
3623 { "(bad)", { XX
} },
3625 { "(bad)", { XX
} },
3626 { "(bad)", { XX
} },
3627 { "(bad)", { XX
} },
3628 { "(bad)", { XX
} },
3629 { "(bad)", { XX
} },
3630 { "(bad)", { XX
} },
3631 { "(bad)", { XX
} },
3632 { "(bad)", { XX
} },
3634 { "(bad)", { XX
} },
3635 { "(bad)", { XX
} },
3636 { "(bad)", { XX
} },
3637 { "(bad)", { XX
} },
3638 { "(bad)", { XX
} },
3639 { "(bad)", { XX
} },
3640 { "(bad)", { XX
} },
3641 { "(bad)", { XX
} },
3643 { "(bad)", { XX
} },
3644 { "(bad)", { XX
} },
3645 { "(bad)", { XX
} },
3646 { "(bad)", { XX
} },
3647 { "(bad)", { XX
} },
3648 { "(bad)", { XX
} },
3649 { "(bad)", { XX
} },
3650 { "(bad)", { XX
} },
3652 { "(bad)", { XX
} },
3653 { "(bad)", { XX
} },
3654 { "(bad)", { XX
} },
3655 { "(bad)", { XX
} },
3656 { "(bad)", { XX
} },
3657 { "(bad)", { XX
} },
3658 { "(bad)", { XX
} },
3659 { "(bad)", { XX
} },
3661 { "(bad)", { XX
} },
3662 { "(bad)", { XX
} },
3663 { "(bad)", { XX
} },
3664 { "(bad)", { XX
} },
3665 { "(bad)", { XX
} },
3666 { "(bad)", { XX
} },
3667 { "(bad)", { XX
} },
3668 { "(bad)", { XX
} },
3670 { "(bad)", { XX
} },
3671 { "(bad)", { XX
} },
3672 { "(bad)", { XX
} },
3673 { "(bad)", { XX
} },
3674 { "(bad)", { XX
} },
3675 { "(bad)", { XX
} },
3676 { "(bad)", { XX
} },
3677 { "(bad)", { XX
} },
3679 { "(bad)", { XX
} },
3680 { "(bad)", { XX
} },
3681 { "(bad)", { XX
} },
3682 { "(bad)", { XX
} },
3683 { "(bad)", { XX
} },
3684 { "(bad)", { XX
} },
3685 { "(bad)", { XX
} },
3686 { "(bad)", { XX
} },
3688 /* THREE_BYTE_SSE5_0F7A */
3691 { "(bad)", { XX
} },
3692 { "(bad)", { XX
} },
3693 { "(bad)", { XX
} },
3694 { "(bad)", { XX
} },
3695 { "(bad)", { XX
} },
3696 { "(bad)", { XX
} },
3697 { "(bad)", { XX
} },
3698 { "(bad)", { XX
} },
3700 { "(bad)", { XX
} },
3701 { "(bad)", { XX
} },
3702 { "(bad)", { XX
} },
3703 { "(bad)", { XX
} },
3704 { "(bad)", { XX
} },
3705 { "(bad)", { XX
} },
3706 { "(bad)", { XX
} },
3707 { "(bad)", { XX
} },
3709 { "frczps", { XM
, EXq
} },
3710 { "frczpd", { XM
, EXq
} },
3711 { "frczss", { XM
, EXq
} },
3712 { "frczsd", { XM
, EXq
} },
3713 { "(bad)", { XX
} },
3714 { "(bad)", { XX
} },
3715 { "(bad)", { XX
} },
3716 { "(bad)", { XX
} },
3718 { "(bad)", { XX
} },
3719 { "(bad)", { XX
} },
3720 { "(bad)", { XX
} },
3721 { "(bad)", { XX
} },
3722 { "(bad)", { XX
} },
3723 { "(bad)", { XX
} },
3724 { "(bad)", { XX
} },
3725 { "(bad)", { XX
} },
3727 { "ptest", { XX
} },
3728 { "(bad)", { XX
} },
3729 { "(bad)", { XX
} },
3730 { "(bad)", { XX
} },
3731 { "(bad)", { XX
} },
3732 { "(bad)", { XX
} },
3733 { "(bad)", { XX
} },
3734 { "(bad)", { XX
} },
3736 { "(bad)", { XX
} },
3737 { "(bad)", { XX
} },
3738 { "(bad)", { XX
} },
3739 { "(bad)", { XX
} },
3740 { "(bad)", { XX
} },
3741 { "(bad)", { XX
} },
3742 { "(bad)", { XX
} },
3743 { "(bad)", { XX
} },
3745 { "cvtph2ps", { XM
, EXd
} },
3746 { "cvtps2ph", { EXd
, XM
} },
3747 { "(bad)", { XX
} },
3748 { "(bad)", { XX
} },
3749 { "(bad)", { XX
} },
3750 { "(bad)", { XX
} },
3751 { "(bad)", { XX
} },
3752 { "(bad)", { XX
} },
3754 { "(bad)", { XX
} },
3755 { "(bad)", { XX
} },
3756 { "(bad)", { XX
} },
3757 { "(bad)", { XX
} },
3758 { "(bad)", { XX
} },
3759 { "(bad)", { XX
} },
3760 { "(bad)", { XX
} },
3761 { "(bad)", { XX
} },
3763 { "(bad)", { XX
} },
3764 { "phaddbw", { XM
, EXq
} },
3765 { "phaddbd", { XM
, EXq
} },
3766 { "phaddbq", { XM
, EXq
} },
3767 { "(bad)", { XX
} },
3768 { "(bad)", { XX
} },
3769 { "phaddwd", { XM
, EXq
} },
3770 { "phaddwq", { XM
, EXq
} },
3772 { "(bad)", { XX
} },
3773 { "(bad)", { XX
} },
3774 { "(bad)", { XX
} },
3775 { "phadddq", { XM
, EXq
} },
3776 { "(bad)", { XX
} },
3777 { "(bad)", { XX
} },
3778 { "(bad)", { XX
} },
3779 { "(bad)", { XX
} },
3781 { "(bad)", { XX
} },
3782 { "phaddubw", { XM
, EXq
} },
3783 { "phaddubd", { XM
, EXq
} },
3784 { "phaddubq", { XM
, EXq
} },
3785 { "(bad)", { XX
} },
3786 { "(bad)", { XX
} },
3787 { "phadduwd", { XM
, EXq
} },
3788 { "phadduwq", { XM
, EXq
} },
3790 { "(bad)", { XX
} },
3791 { "(bad)", { XX
} },
3792 { "(bad)", { XX
} },
3793 { "phaddudq", { XM
, EXq
} },
3794 { "(bad)", { XX
} },
3795 { "(bad)", { XX
} },
3796 { "(bad)", { XX
} },
3797 { "(bad)", { XX
} },
3799 { "(bad)", { XX
} },
3800 { "phsubbw", { XM
, EXq
} },
3801 { "phsubbd", { XM
, EXq
} },
3802 { "phsubbq", { XM
, EXq
} },
3803 { "(bad)", { XX
} },
3804 { "(bad)", { XX
} },
3805 { "(bad)", { XX
} },
3806 { "(bad)", { XX
} },
3808 { "(bad)", { XX
} },
3809 { "(bad)", { XX
} },
3810 { "(bad)", { XX
} },
3811 { "(bad)", { XX
} },
3812 { "(bad)", { XX
} },
3813 { "(bad)", { XX
} },
3814 { "(bad)", { XX
} },
3815 { "(bad)", { XX
} },
3817 { "(bad)", { XX
} },
3818 { "(bad)", { XX
} },
3819 { "(bad)", { XX
} },
3820 { "(bad)", { XX
} },
3821 { "(bad)", { XX
} },
3822 { "(bad)", { XX
} },
3823 { "(bad)", { XX
} },
3824 { "(bad)", { XX
} },
3826 { "(bad)", { XX
} },
3827 { "(bad)", { XX
} },
3828 { "(bad)", { XX
} },
3829 { "(bad)", { XX
} },
3830 { "(bad)", { XX
} },
3831 { "(bad)", { XX
} },
3832 { "(bad)", { XX
} },
3833 { "(bad)", { XX
} },
3835 { "(bad)", { XX
} },
3836 { "(bad)", { XX
} },
3837 { "(bad)", { XX
} },
3838 { "(bad)", { XX
} },
3839 { "(bad)", { XX
} },
3840 { "(bad)", { XX
} },
3841 { "(bad)", { XX
} },
3842 { "(bad)", { XX
} },
3844 { "(bad)", { XX
} },
3845 { "(bad)", { XX
} },
3846 { "(bad)", { XX
} },
3847 { "(bad)", { XX
} },
3848 { "(bad)", { XX
} },
3849 { "(bad)", { XX
} },
3850 { "(bad)", { XX
} },
3851 { "(bad)", { XX
} },
3853 { "(bad)", { XX
} },
3854 { "(bad)", { XX
} },
3855 { "(bad)", { XX
} },
3856 { "(bad)", { XX
} },
3857 { "(bad)", { XX
} },
3858 { "(bad)", { XX
} },
3859 { "(bad)", { XX
} },
3860 { "(bad)", { XX
} },
3862 { "(bad)", { XX
} },
3863 { "(bad)", { XX
} },
3864 { "(bad)", { XX
} },
3865 { "(bad)", { XX
} },
3866 { "(bad)", { XX
} },
3867 { "(bad)", { XX
} },
3868 { "(bad)", { XX
} },
3869 { "(bad)", { XX
} },
3871 { "(bad)", { XX
} },
3872 { "(bad)", { XX
} },
3873 { "(bad)", { XX
} },
3874 { "(bad)", { XX
} },
3875 { "(bad)", { XX
} },
3876 { "(bad)", { XX
} },
3877 { "(bad)", { XX
} },
3878 { "(bad)", { XX
} },
3880 { "(bad)", { XX
} },
3881 { "(bad)", { XX
} },
3882 { "(bad)", { XX
} },
3883 { "(bad)", { XX
} },
3884 { "(bad)", { XX
} },
3885 { "(bad)", { XX
} },
3886 { "(bad)", { XX
} },
3887 { "(bad)", { XX
} },
3889 { "(bad)", { XX
} },
3890 { "(bad)", { XX
} },
3891 { "(bad)", { XX
} },
3892 { "(bad)", { XX
} },
3893 { "(bad)", { XX
} },
3894 { "(bad)", { XX
} },
3895 { "(bad)", { XX
} },
3896 { "(bad)", { XX
} },
3898 { "(bad)", { XX
} },
3899 { "(bad)", { XX
} },
3900 { "(bad)", { XX
} },
3901 { "(bad)", { XX
} },
3902 { "(bad)", { XX
} },
3903 { "(bad)", { XX
} },
3904 { "(bad)", { XX
} },
3905 { "(bad)", { XX
} },
3907 { "(bad)", { XX
} },
3908 { "(bad)", { XX
} },
3909 { "(bad)", { XX
} },
3910 { "(bad)", { XX
} },
3911 { "(bad)", { XX
} },
3912 { "(bad)", { XX
} },
3913 { "(bad)", { XX
} },
3914 { "(bad)", { XX
} },
3916 { "(bad)", { XX
} },
3917 { "(bad)", { XX
} },
3918 { "(bad)", { XX
} },
3919 { "(bad)", { XX
} },
3920 { "(bad)", { XX
} },
3921 { "(bad)", { XX
} },
3922 { "(bad)", { XX
} },
3923 { "(bad)", { XX
} },
3925 { "(bad)", { XX
} },
3926 { "(bad)", { XX
} },
3927 { "(bad)", { XX
} },
3928 { "(bad)", { XX
} },
3929 { "(bad)", { XX
} },
3930 { "(bad)", { XX
} },
3931 { "(bad)", { XX
} },
3932 { "(bad)", { XX
} },
3934 { "(bad)", { XX
} },
3935 { "(bad)", { XX
} },
3936 { "(bad)", { XX
} },
3937 { "(bad)", { XX
} },
3938 { "(bad)", { XX
} },
3939 { "(bad)", { XX
} },
3940 { "(bad)", { XX
} },
3941 { "(bad)", { XX
} },
3943 { "(bad)", { XX
} },
3944 { "(bad)", { XX
} },
3945 { "(bad)", { XX
} },
3946 { "(bad)", { XX
} },
3947 { "(bad)", { XX
} },
3948 { "(bad)", { XX
} },
3949 { "(bad)", { XX
} },
3950 { "(bad)", { XX
} },
3952 { "(bad)", { XX
} },
3953 { "(bad)", { XX
} },
3954 { "(bad)", { XX
} },
3955 { "(bad)", { XX
} },
3956 { "(bad)", { XX
} },
3957 { "(bad)", { XX
} },
3958 { "(bad)", { XX
} },
3959 { "(bad)", { XX
} },
3961 { "(bad)", { XX
} },
3962 { "(bad)", { XX
} },
3963 { "(bad)", { XX
} },
3964 { "(bad)", { XX
} },
3965 { "(bad)", { XX
} },
3966 { "(bad)", { XX
} },
3967 { "(bad)", { XX
} },
3968 { "(bad)", { XX
} },
3970 { "(bad)", { XX
} },
3971 { "(bad)", { XX
} },
3972 { "(bad)", { XX
} },
3973 { "(bad)", { XX
} },
3974 { "(bad)", { XX
} },
3975 { "(bad)", { XX
} },
3976 { "(bad)", { XX
} },
3977 { "(bad)", { XX
} },
3979 /* THREE_BYTE_SSE5_0F7B */
3982 { "(bad)", { XX
} },
3983 { "(bad)", { XX
} },
3984 { "(bad)", { XX
} },
3985 { "(bad)", { XX
} },
3986 { "(bad)", { XX
} },
3987 { "(bad)", { XX
} },
3988 { "(bad)", { XX
} },
3989 { "(bad)", { XX
} },
3991 { "(bad)", { XX
} },
3992 { "(bad)", { XX
} },
3993 { "(bad)", { XX
} },
3994 { "(bad)", { XX
} },
3995 { "(bad)", { XX
} },
3996 { "(bad)", { XX
} },
3997 { "(bad)", { XX
} },
3998 { "(bad)", { XX
} },
4000 { "(bad)", { XX
} },
4001 { "(bad)", { XX
} },
4002 { "(bad)", { XX
} },
4003 { "(bad)", { XX
} },
4004 { "(bad)", { XX
} },
4005 { "(bad)", { XX
} },
4006 { "(bad)", { XX
} },
4007 { "(bad)", { XX
} },
4009 { "(bad)", { XX
} },
4010 { "(bad)", { XX
} },
4011 { "(bad)", { XX
} },
4012 { "(bad)", { XX
} },
4013 { "(bad)", { XX
} },
4014 { "(bad)", { XX
} },
4015 { "(bad)", { XX
} },
4016 { "(bad)", { XX
} },
4018 { "(bad)", { XX
} },
4019 { "(bad)", { XX
} },
4020 { "(bad)", { XX
} },
4021 { "(bad)", { XX
} },
4022 { "(bad)", { XX
} },
4023 { "(bad)", { XX
} },
4024 { "(bad)", { XX
} },
4025 { "(bad)", { XX
} },
4027 { "(bad)", { XX
} },
4028 { "(bad)", { XX
} },
4029 { "(bad)", { XX
} },
4030 { "(bad)", { XX
} },
4031 { "(bad)", { XX
} },
4032 { "(bad)", { XX
} },
4033 { "(bad)", { XX
} },
4034 { "(bad)", { XX
} },
4036 { "(bad)", { XX
} },
4037 { "(bad)", { XX
} },
4038 { "(bad)", { XX
} },
4039 { "(bad)", { XX
} },
4040 { "(bad)", { XX
} },
4041 { "(bad)", { XX
} },
4042 { "(bad)", { XX
} },
4043 { "(bad)", { XX
} },
4045 { "(bad)", { XX
} },
4046 { "(bad)", { XX
} },
4047 { "(bad)", { XX
} },
4048 { "(bad)", { XX
} },
4049 { "(bad)", { XX
} },
4050 { "(bad)", { XX
} },
4051 { "(bad)", { XX
} },
4052 { "(bad)", { XX
} },
4054 { "protb", { XM
, EXq
, Ib
} },
4055 { "protw", { XM
, EXq
, Ib
} },
4056 { "protd", { XM
, EXq
, Ib
} },
4057 { "protq", { XM
, EXq
, Ib
} },
4058 { "pshlb", { XM
, EXq
, Ib
} },
4059 { "pshlw", { XM
, EXq
, Ib
} },
4060 { "pshld", { XM
, EXq
, Ib
} },
4061 { "pshlq", { XM
, EXq
, Ib
} },
4063 { "pshab", { XM
, EXq
, Ib
} },
4064 { "pshaw", { XM
, EXq
, Ib
} },
4065 { "pshad", { XM
, EXq
, Ib
} },
4066 { "pshaq", { XM
, EXq
, Ib
} },
4067 { "(bad)", { XX
} },
4068 { "(bad)", { XX
} },
4069 { "(bad)", { XX
} },
4070 { "(bad)", { XX
} },
4072 { "(bad)", { XX
} },
4073 { "(bad)", { XX
} },
4074 { "(bad)", { XX
} },
4075 { "(bad)", { XX
} },
4076 { "(bad)", { XX
} },
4077 { "(bad)", { XX
} },
4078 { "(bad)", { XX
} },
4079 { "(bad)", { XX
} },
4081 { "(bad)", { XX
} },
4082 { "(bad)", { XX
} },
4083 { "(bad)", { XX
} },
4084 { "(bad)", { XX
} },
4085 { "(bad)", { XX
} },
4086 { "(bad)", { XX
} },
4087 { "(bad)", { XX
} },
4088 { "(bad)", { XX
} },
4090 { "(bad)", { XX
} },
4091 { "(bad)", { XX
} },
4092 { "(bad)", { XX
} },
4093 { "(bad)", { XX
} },
4094 { "(bad)", { XX
} },
4095 { "(bad)", { XX
} },
4096 { "(bad)", { XX
} },
4097 { "(bad)", { XX
} },
4099 { "(bad)", { XX
} },
4100 { "(bad)", { XX
} },
4101 { "(bad)", { XX
} },
4102 { "(bad)", { XX
} },
4103 { "(bad)", { XX
} },
4104 { "(bad)", { XX
} },
4105 { "(bad)", { XX
} },
4106 { "(bad)", { XX
} },
4108 { "(bad)", { XX
} },
4109 { "(bad)", { XX
} },
4110 { "(bad)", { XX
} },
4111 { "(bad)", { XX
} },
4112 { "(bad)", { XX
} },
4113 { "(bad)", { XX
} },
4114 { "(bad)", { XX
} },
4115 { "(bad)", { XX
} },
4117 { "(bad)", { XX
} },
4118 { "(bad)", { XX
} },
4119 { "(bad)", { XX
} },
4120 { "(bad)", { XX
} },
4121 { "(bad)", { XX
} },
4122 { "(bad)", { XX
} },
4123 { "(bad)", { XX
} },
4124 { "(bad)", { XX
} },
4126 { "(bad)", { XX
} },
4127 { "(bad)", { XX
} },
4128 { "(bad)", { XX
} },
4129 { "(bad)", { XX
} },
4130 { "(bad)", { XX
} },
4131 { "(bad)", { XX
} },
4132 { "(bad)", { XX
} },
4133 { "(bad)", { XX
} },
4135 { "(bad)", { XX
} },
4136 { "(bad)", { XX
} },
4137 { "(bad)", { XX
} },
4138 { "(bad)", { XX
} },
4139 { "(bad)", { XX
} },
4140 { "(bad)", { XX
} },
4141 { "(bad)", { XX
} },
4142 { "(bad)", { XX
} },
4144 { "(bad)", { XX
} },
4145 { "(bad)", { XX
} },
4146 { "(bad)", { XX
} },
4147 { "(bad)", { XX
} },
4148 { "(bad)", { XX
} },
4149 { "(bad)", { XX
} },
4150 { "(bad)", { XX
} },
4151 { "(bad)", { XX
} },
4153 { "(bad)", { XX
} },
4154 { "(bad)", { XX
} },
4155 { "(bad)", { XX
} },
4156 { "(bad)", { XX
} },
4157 { "(bad)", { XX
} },
4158 { "(bad)", { XX
} },
4159 { "(bad)", { XX
} },
4160 { "(bad)", { XX
} },
4162 { "(bad)", { XX
} },
4163 { "(bad)", { XX
} },
4164 { "(bad)", { XX
} },
4165 { "(bad)", { XX
} },
4166 { "(bad)", { XX
} },
4167 { "(bad)", { XX
} },
4168 { "(bad)", { XX
} },
4169 { "(bad)", { XX
} },
4171 { "(bad)", { XX
} },
4172 { "(bad)", { XX
} },
4173 { "(bad)", { XX
} },
4174 { "(bad)", { XX
} },
4175 { "(bad)", { XX
} },
4176 { "(bad)", { XX
} },
4177 { "(bad)", { XX
} },
4178 { "(bad)", { XX
} },
4180 { "(bad)", { XX
} },
4181 { "(bad)", { XX
} },
4182 { "(bad)", { XX
} },
4183 { "(bad)", { XX
} },
4184 { "(bad)", { XX
} },
4185 { "(bad)", { XX
} },
4186 { "(bad)", { XX
} },
4187 { "(bad)", { XX
} },
4189 { "(bad)", { XX
} },
4190 { "(bad)", { XX
} },
4191 { "(bad)", { XX
} },
4192 { "(bad)", { XX
} },
4193 { "(bad)", { XX
} },
4194 { "(bad)", { XX
} },
4195 { "(bad)", { XX
} },
4196 { "(bad)", { XX
} },
4198 { "(bad)", { XX
} },
4199 { "(bad)", { XX
} },
4200 { "(bad)", { XX
} },
4201 { "(bad)", { XX
} },
4202 { "(bad)", { XX
} },
4203 { "(bad)", { XX
} },
4204 { "(bad)", { XX
} },
4205 { "(bad)", { XX
} },
4207 { "(bad)", { XX
} },
4208 { "(bad)", { XX
} },
4209 { "(bad)", { XX
} },
4210 { "(bad)", { XX
} },
4211 { "(bad)", { XX
} },
4212 { "(bad)", { XX
} },
4213 { "(bad)", { XX
} },
4214 { "(bad)", { XX
} },
4216 { "(bad)", { XX
} },
4217 { "(bad)", { XX
} },
4218 { "(bad)", { XX
} },
4219 { "(bad)", { XX
} },
4220 { "(bad)", { XX
} },
4221 { "(bad)", { XX
} },
4222 { "(bad)", { XX
} },
4223 { "(bad)", { XX
} },
4225 { "(bad)", { XX
} },
4226 { "(bad)", { XX
} },
4227 { "(bad)", { XX
} },
4228 { "(bad)", { XX
} },
4229 { "(bad)", { XX
} },
4230 { "(bad)", { XX
} },
4231 { "(bad)", { XX
} },
4232 { "(bad)", { XX
} },
4234 { "(bad)", { XX
} },
4235 { "(bad)", { XX
} },
4236 { "(bad)", { XX
} },
4237 { "(bad)", { XX
} },
4238 { "(bad)", { XX
} },
4239 { "(bad)", { XX
} },
4240 { "(bad)", { XX
} },
4241 { "(bad)", { XX
} },
4243 { "(bad)", { XX
} },
4244 { "(bad)", { XX
} },
4245 { "(bad)", { XX
} },
4246 { "(bad)", { XX
} },
4247 { "(bad)", { XX
} },
4248 { "(bad)", { XX
} },
4249 { "(bad)", { XX
} },
4250 { "(bad)", { XX
} },
4252 { "(bad)", { XX
} },
4253 { "(bad)", { XX
} },
4254 { "(bad)", { XX
} },
4255 { "(bad)", { XX
} },
4256 { "(bad)", { XX
} },
4257 { "(bad)", { XX
} },
4258 { "(bad)", { XX
} },
4259 { "(bad)", { XX
} },
4261 { "(bad)", { XX
} },
4262 { "(bad)", { XX
} },
4263 { "(bad)", { XX
} },
4264 { "(bad)", { XX
} },
4265 { "(bad)", { XX
} },
4266 { "(bad)", { XX
} },
4267 { "(bad)", { XX
} },
4268 { "(bad)", { XX
} },
4272 static const struct dis386 opc_ext_table
[][2] = {
4275 { "leaS", { Gv
, M
} },
4276 { "(bad)", { XX
} },
4280 { "les{S|}", { Gv
, Mp
} },
4281 { "(bad)", { XX
} },
4285 { "ldsS", { Gv
, Mp
} },
4286 { "(bad)", { XX
} },
4290 { "lssS", { Gv
, Mp
} },
4291 { "(bad)", { XX
} },
4295 { "lfsS", { Gv
, Mp
} },
4296 { "(bad)", { XX
} },
4300 { "lgsS", { Gv
, Mp
} },
4301 { "(bad)", { XX
} },
4305 { "sgdt{Q|IQ||}", { M
} },
4310 { "sidt{Q|IQ||}", { M
} },
4315 { "lgdt{Q|Q||}", { M
} },
4316 { "(bad)", { XX
} },
4321 { "(bad)", { XX
} },
4325 { "vmptrst", { Mq
} },
4326 { "(bad)", { XX
} },
4330 { "(bad)", { XX
} },
4331 { "psrlw", { MS
, Ib
} },
4335 { "(bad)", { XX
} },
4336 { "psraw", { MS
, Ib
} },
4340 { "(bad)", { XX
} },
4341 { "psllw", { MS
, Ib
} },
4345 { "(bad)", { XX
} },
4346 { "psrld", { MS
, Ib
} },
4350 { "(bad)", { XX
} },
4351 { "psrad", { MS
, Ib
} },
4355 { "(bad)", { XX
} },
4356 { "pslld", { MS
, Ib
} },
4360 { "(bad)", { XX
} },
4361 { "psrlq", { MS
, Ib
} },
4365 { "(bad)", { XX
} },
4370 { "(bad)", { XX
} },
4371 { "psllq", { MS
, Ib
} },
4375 { "(bad)", { XX
} },
4380 { "fxsave", { M
} },
4381 { "(bad)", { XX
} },
4385 { "fxrstor", { M
} },
4386 { "(bad)", { XX
} },
4390 { "ldmxcsr", { Md
} },
4391 { "(bad)", { XX
} },
4395 { "stmxcsr", { Md
} },
4396 { "(bad)", { XX
} },
4400 { "(bad)", { XX
} },
4405 { "(bad)", { XX
} },
4410 { "clflush", { Mb
} },
4415 { "prefetchnta", { Mb
} },
4416 { "(bad)", { XX
} },
4420 { "prefetcht0", { Mb
} },
4421 { "(bad)", { XX
} },
4425 { "prefetcht1", { Mb
} },
4426 { "(bad)", { XX
} },
4430 { "prefetcht2", { Mb
} },
4431 { "(bad)", { XX
} },
4435 { "lddqu", { XM
, M
} },
4436 { "(bad)", { XX
} },
4440 { "bound{S|}", { Gv
, Ma
} },
4441 { "(bad)", { XX
} },
4445 { "movlpX", { EXq
, XM
} },
4446 { "(bad)", { XX
} },
4450 { "movhpX", { EXq
, XM
} },
4451 { "(bad)", { XX
} },
4455 { "movlpX", { XM
, EXq
} },
4456 { "movhlpX", { XM
, EXq
} },
4460 { "movhpX", { XM
, EXq
} },
4461 { "movlhpX", { XM
, EXq
} },
4465 { "invlpg", { Mb
} },
4470 { "lidt{Q|Q||}", { M
} },
4475 { "(bad)", { XX
} },
4476 { "movZ", { Rm
, Cm
} },
4480 { "(bad)", { XX
} },
4481 { "movZ", { Rm
, Dm
} },
4485 { "(bad)", { XX
} },
4486 { "movZ", { Cm
, Rm
} },
4490 { "(bad)", { XX
} },
4491 { "movZ", { Dm
, Rm
} },
4495 { THREE_BYTE_SSE5_0F24
},
4496 { "movL", { Rd
, Td
} },
4500 { "(bad)", { XX
} },
4501 { "movL", { Td
, Rd
} },
4505 static const struct dis386 opc_ext_rm_table
[][8] = {
4508 { "(bad)", { XX
} },
4509 { "vmcall", { Skip_MODRM
} },
4510 { "vmlaunch", { Skip_MODRM
} },
4511 { "vmresume", { Skip_MODRM
} },
4512 { "vmxoff", { Skip_MODRM
} },
4513 { "(bad)", { XX
} },
4514 { "(bad)", { XX
} },
4515 { "(bad)", { XX
} },
4519 { "monitor", { { OP_Monitor
, 0 } } },
4520 { "mwait", { { OP_Mwait
, 0 } } },
4521 { "(bad)", { XX
} },
4522 { "(bad)", { XX
} },
4523 { "(bad)", { XX
} },
4524 { "(bad)", { XX
} },
4525 { "(bad)", { XX
} },
4526 { "(bad)", { XX
} },
4530 { "lfence", { Skip_MODRM
} },
4531 { "(bad)", { XX
} },
4532 { "(bad)", { XX
} },
4533 { "(bad)", { XX
} },
4534 { "(bad)", { XX
} },
4535 { "(bad)", { XX
} },
4536 { "(bad)", { XX
} },
4537 { "(bad)", { XX
} },
4541 { "mfence", { Skip_MODRM
} },
4542 { "(bad)", { XX
} },
4543 { "(bad)", { XX
} },
4544 { "(bad)", { XX
} },
4545 { "(bad)", { XX
} },
4546 { "(bad)", { XX
} },
4547 { "(bad)", { XX
} },
4548 { "(bad)", { XX
} },
4552 { "sfence", { Skip_MODRM
} },
4553 { "(bad)", { XX
} },
4554 { "(bad)", { XX
} },
4555 { "(bad)", { XX
} },
4556 { "(bad)", { XX
} },
4557 { "(bad)", { XX
} },
4558 { "(bad)", { XX
} },
4559 { "(bad)", { XX
} },
4563 { "swapgs", { Skip_MODRM
} },
4564 { "rdtscp", { Skip_MODRM
} },
4565 { "(bad)", { XX
} },
4566 { "(bad)", { XX
} },
4567 { "(bad)", { XX
} },
4568 { "(bad)", { XX
} },
4569 { "(bad)", { XX
} },
4570 { "(bad)", { XX
} },
4574 { "vmrun", { Skip_MODRM
} },
4575 { "vmmcall", { Skip_MODRM
} },
4576 { "vmload", { Skip_MODRM
} },
4577 { "vmsave", { Skip_MODRM
} },
4578 { "stgi", { Skip_MODRM
} },
4579 { "clgi", { Skip_MODRM
} },
4580 { "skinit", { Skip_MODRM
} },
4581 { "invlpga", { Skip_MODRM
} },
4585 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
4597 FETCH_DATA (the_info
, codep
+ 1);
4601 /* REX prefixes family. */
4618 if (address_mode
== mode_64bit
)
4624 prefixes
|= PREFIX_REPZ
;
4627 prefixes
|= PREFIX_REPNZ
;
4630 prefixes
|= PREFIX_LOCK
;
4633 prefixes
|= PREFIX_CS
;
4636 prefixes
|= PREFIX_SS
;
4639 prefixes
|= PREFIX_DS
;
4642 prefixes
|= PREFIX_ES
;
4645 prefixes
|= PREFIX_FS
;
4648 prefixes
|= PREFIX_GS
;
4651 prefixes
|= PREFIX_DATA
;
4654 prefixes
|= PREFIX_ADDR
;
4657 /* fwait is really an instruction. If there are prefixes
4658 before the fwait, they belong to the fwait, *not* to the
4659 following instruction. */
4660 if (prefixes
|| rex
)
4662 prefixes
|= PREFIX_FWAIT
;
4666 prefixes
= PREFIX_FWAIT
;
4671 /* Rex is ignored when followed by another prefix. */
4682 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
4686 prefix_name (int pref
, int sizeflag
)
4688 static const char *rexes
[16] =
4693 "rex.XB", /* 0x43 */
4695 "rex.RB", /* 0x45 */
4696 "rex.RX", /* 0x46 */
4697 "rex.RXB", /* 0x47 */
4699 "rex.WB", /* 0x49 */
4700 "rex.WX", /* 0x4a */
4701 "rex.WXB", /* 0x4b */
4702 "rex.WR", /* 0x4c */
4703 "rex.WRB", /* 0x4d */
4704 "rex.WRX", /* 0x4e */
4705 "rex.WRXB", /* 0x4f */
4710 /* REX prefixes family. */
4727 return rexes
[pref
- 0x40];
4747 return (sizeflag
& DFLAG
) ? "data16" : "data32";
4749 if (address_mode
== mode_64bit
)
4750 return (sizeflag
& AFLAG
) ? "addr32" : "addr64";
4752 return (sizeflag
& AFLAG
) ? "addr16" : "addr32";
4760 static char op_out
[MAX_OPERANDS
][100];
4761 static int op_ad
, op_index
[MAX_OPERANDS
];
4762 static int two_source_ops
;
4763 static bfd_vma op_address
[MAX_OPERANDS
];
4764 static bfd_vma op_riprel
[MAX_OPERANDS
];
4765 static bfd_vma start_pc
;
4768 * On the 386's of 1988, the maximum length of an instruction is 15 bytes.
4769 * (see topic "Redundant prefixes" in the "Differences from 8086"
4770 * section of the "Virtual 8086 Mode" chapter.)
4771 * 'pc' should be the address of this instruction, it will
4772 * be used to print the target address if this is a relative jump or call
4773 * The function returns the length of this instruction in bytes.
4776 static char intel_syntax
;
4777 static char open_char
;
4778 static char close_char
;
4779 static char separator_char
;
4780 static char scale_char
;
4782 /* Here for backwards compatibility. When gdb stops using
4783 print_insn_i386_att and print_insn_i386_intel these functions can
4784 disappear, and print_insn_i386 be merged into print_insn. */
4786 print_insn_i386_att (bfd_vma pc
, disassemble_info
*info
)
4790 return print_insn (pc
, info
);
4794 print_insn_i386_intel (bfd_vma pc
, disassemble_info
*info
)
4798 return print_insn (pc
, info
);
4802 print_insn_i386 (bfd_vma pc
, disassemble_info
*info
)
4806 return print_insn (pc
, info
);
4810 print_i386_disassembler_options (FILE *stream
)
4812 fprintf (stream
, _("\n\
4813 The following i386/x86-64 specific disassembler options are supported for use\n\
4814 with the -M switch (multiple options should be separated by commas):\n"));
4816 fprintf (stream
, _(" x86-64 Disassemble in 64bit mode\n"));
4817 fprintf (stream
, _(" i386 Disassemble in 32bit mode\n"));
4818 fprintf (stream
, _(" i8086 Disassemble in 16bit mode\n"));
4819 fprintf (stream
, _(" att Display instruction in AT&T syntax\n"));
4820 fprintf (stream
, _(" intel Display instruction in Intel syntax\n"));
4821 fprintf (stream
, _(" addr64 Assume 64bit address size\n"));
4822 fprintf (stream
, _(" addr32 Assume 32bit address size\n"));
4823 fprintf (stream
, _(" addr16 Assume 16bit address size\n"));
4824 fprintf (stream
, _(" data32 Assume 32bit data size\n"));
4825 fprintf (stream
, _(" data16 Assume 16bit data size\n"));
4826 fprintf (stream
, _(" suffix Always display instruction suffix in AT&T syntax\n"));
4829 /* Get a pointer to struct dis386 with a valid name. */
4831 static const struct dis386
*
4832 get_valid_dis386 (const struct dis386
*dp
, disassemble_info
*info
)
4836 if (dp
->name
!= NULL
)
4839 switch (dp
->op
[0].bytemode
)
4842 dp
= &grps
[dp
->op
[1].bytemode
][modrm
.reg
];
4845 case USE_PREFIX_USER_TABLE
:
4847 used_prefixes
|= (prefixes
& PREFIX_REPZ
);
4848 if (prefixes
& PREFIX_REPZ
)
4855 /* We should check PREFIX_REPNZ and PREFIX_REPZ before
4857 used_prefixes
|= (prefixes
& PREFIX_REPNZ
);
4858 if (prefixes
& PREFIX_REPNZ
)
4861 repnz_prefix
= NULL
;
4865 used_prefixes
|= (prefixes
& PREFIX_DATA
);
4866 if (prefixes
& PREFIX_DATA
)
4873 dp
= &prefix_user_table
[dp
->op
[1].bytemode
][index
];
4876 case X86_64_SPECIAL
:
4877 index
= address_mode
== mode_64bit
? 1 : 0;
4878 dp
= &x86_64_table
[dp
->op
[1].bytemode
][index
];
4881 case IS_3BYTE_OPCODE
:
4882 FETCH_DATA (info
, codep
+ 2);
4884 dp
= &three_byte_table
[dp
->op
[1].bytemode
][index
];
4885 modrm
.mod
= (*codep
>> 6) & 3;
4886 modrm
.reg
= (*codep
>> 3) & 7;
4887 modrm
.rm
= *codep
& 7;
4890 case USE_OPC_EXT_TABLE
:
4891 index
= modrm
.mod
== 0x3 ? 1 : 0;
4892 dp
= &opc_ext_table
[dp
->op
[1].bytemode
][index
];
4895 case USE_OPC_EXT_RM_TABLE
:
4897 dp
= &opc_ext_rm_table
[dp
->op
[1].bytemode
][index
];
4901 oappend (INTERNAL_DISASSEMBLER_ERROR
);
4905 if (dp
->name
!= NULL
)
4908 return get_valid_dis386 (dp
, info
);
4912 print_insn (bfd_vma pc
, disassemble_info
*info
)
4914 const struct dis386
*dp
;
4916 char *op_txt
[MAX_OPERANDS
];
4920 struct dis_private priv
;
4922 char prefix_obuf
[32];
4925 if (info
->mach
== bfd_mach_x86_64_intel_syntax
4926 || info
->mach
== bfd_mach_x86_64
)
4927 address_mode
= mode_64bit
;
4929 address_mode
= mode_32bit
;
4931 if (intel_syntax
== (char) -1)
4932 intel_syntax
= (info
->mach
== bfd_mach_i386_i386_intel_syntax
4933 || info
->mach
== bfd_mach_x86_64_intel_syntax
);
4935 if (info
->mach
== bfd_mach_i386_i386
4936 || info
->mach
== bfd_mach_x86_64
4937 || info
->mach
== bfd_mach_i386_i386_intel_syntax
4938 || info
->mach
== bfd_mach_x86_64_intel_syntax
)
4939 priv
.orig_sizeflag
= AFLAG
| DFLAG
;
4940 else if (info
->mach
== bfd_mach_i386_i8086
)
4941 priv
.orig_sizeflag
= 0;
4945 for (p
= info
->disassembler_options
; p
!= NULL
; )
4947 if (CONST_STRNEQ (p
, "x86-64"))
4949 address_mode
= mode_64bit
;
4950 priv
.orig_sizeflag
= AFLAG
| DFLAG
;
4952 else if (CONST_STRNEQ (p
, "i386"))
4954 address_mode
= mode_32bit
;
4955 priv
.orig_sizeflag
= AFLAG
| DFLAG
;
4957 else if (CONST_STRNEQ (p
, "i8086"))
4959 address_mode
= mode_16bit
;
4960 priv
.orig_sizeflag
= 0;
4962 else if (CONST_STRNEQ (p
, "intel"))
4966 else if (CONST_STRNEQ (p
, "att"))
4970 else if (CONST_STRNEQ (p
, "addr"))
4972 if (address_mode
== mode_64bit
)
4974 if (p
[4] == '3' && p
[5] == '2')
4975 priv
.orig_sizeflag
&= ~AFLAG
;
4976 else if (p
[4] == '6' && p
[5] == '4')
4977 priv
.orig_sizeflag
|= AFLAG
;
4981 if (p
[4] == '1' && p
[5] == '6')
4982 priv
.orig_sizeflag
&= ~AFLAG
;
4983 else if (p
[4] == '3' && p
[5] == '2')
4984 priv
.orig_sizeflag
|= AFLAG
;
4987 else if (CONST_STRNEQ (p
, "data"))
4989 if (p
[4] == '1' && p
[5] == '6')
4990 priv
.orig_sizeflag
&= ~DFLAG
;
4991 else if (p
[4] == '3' && p
[5] == '2')
4992 priv
.orig_sizeflag
|= DFLAG
;
4994 else if (CONST_STRNEQ (p
, "suffix"))
4995 priv
.orig_sizeflag
|= SUFFIX_ALWAYS
;
4997 p
= strchr (p
, ',');
5004 names64
= intel_names64
;
5005 names32
= intel_names32
;
5006 names16
= intel_names16
;
5007 names8
= intel_names8
;
5008 names8rex
= intel_names8rex
;
5009 names_seg
= intel_names_seg
;
5010 index64
= intel_index64
;
5011 index32
= intel_index32
;
5012 index16
= intel_index16
;
5015 separator_char
= '+';
5020 names64
= att_names64
;
5021 names32
= att_names32
;
5022 names16
= att_names16
;
5023 names8
= att_names8
;
5024 names8rex
= att_names8rex
;
5025 names_seg
= att_names_seg
;
5026 index64
= att_index64
;
5027 index32
= att_index32
;
5028 index16
= att_index16
;
5031 separator_char
= ',';
5035 /* The output looks better if we put 7 bytes on a line, since that
5036 puts most long word instructions on a single line. */
5037 info
->bytes_per_line
= 7;
5039 info
->private_data
= &priv
;
5040 priv
.max_fetched
= priv
.the_buffer
;
5041 priv
.insn_start
= pc
;
5044 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
5052 start_codep
= priv
.the_buffer
;
5053 codep
= priv
.the_buffer
;
5055 if (setjmp (priv
.bailout
) != 0)
5059 /* Getting here means we tried for data but didn't get it. That
5060 means we have an incomplete instruction of some sort. Just
5061 print the first byte as a prefix or a .byte pseudo-op. */
5062 if (codep
> priv
.the_buffer
)
5064 name
= prefix_name (priv
.the_buffer
[0], priv
.orig_sizeflag
);
5066 (*info
->fprintf_func
) (info
->stream
, "%s", name
);
5069 /* Just print the first byte as a .byte instruction. */
5070 (*info
->fprintf_func
) (info
->stream
, ".byte 0x%x",
5071 (unsigned int) priv
.the_buffer
[0]);
5084 sizeflag
= priv
.orig_sizeflag
;
5086 FETCH_DATA (info
, codep
+ 1);
5087 two_source_ops
= (*codep
== 0x62) || (*codep
== 0xc8);
5089 if (((prefixes
& PREFIX_FWAIT
)
5090 && ((*codep
< 0xd8) || (*codep
> 0xdf)))
5091 || (rex
&& rex_used
))
5095 /* fwait not followed by floating point instruction, or rex followed
5096 by other prefixes. Print the first prefix. */
5097 name
= prefix_name (priv
.the_buffer
[0], priv
.orig_sizeflag
);
5099 name
= INTERNAL_DISASSEMBLER_ERROR
;
5100 (*info
->fprintf_func
) (info
->stream
, "%s", name
);
5107 unsigned char threebyte
;
5108 FETCH_DATA (info
, codep
+ 2);
5109 threebyte
= *++codep
;
5110 dp
= &dis386_twobyte
[threebyte
];
5111 need_modrm
= twobyte_has_modrm
[*codep
];
5116 dp
= &dis386
[*codep
];
5117 need_modrm
= onebyte_has_modrm
[*codep
];
5121 if ((prefixes
& PREFIX_REPZ
))
5123 repz_prefix
= "repz ";
5124 used_prefixes
|= PREFIX_REPZ
;
5129 if ((prefixes
& PREFIX_REPNZ
))
5131 repnz_prefix
= "repnz ";
5132 used_prefixes
|= PREFIX_REPNZ
;
5135 repnz_prefix
= NULL
;
5137 if ((prefixes
& PREFIX_LOCK
))
5139 lock_prefix
= "lock ";
5140 used_prefixes
|= PREFIX_LOCK
;
5146 if (prefixes
& PREFIX_ADDR
)
5149 if (dp
->op
[2].bytemode
!= loop_jcxz_mode
|| intel_syntax
)
5151 if ((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
5152 addr_prefix
= "addr32 ";
5154 addr_prefix
= "addr16 ";
5155 used_prefixes
|= PREFIX_ADDR
;
5160 if ((prefixes
& PREFIX_DATA
))
5163 if (dp
->op
[2].bytemode
== cond_jump_mode
5164 && dp
->op
[0].bytemode
== v_mode
5167 if (sizeflag
& DFLAG
)
5168 data_prefix
= "data32 ";
5170 data_prefix
= "data16 ";
5171 used_prefixes
|= PREFIX_DATA
;
5177 FETCH_DATA (info
, codep
+ 1);
5178 modrm
.mod
= (*codep
>> 6) & 3;
5179 modrm
.reg
= (*codep
>> 3) & 7;
5180 modrm
.rm
= *codep
& 7;
5183 if (dp
->name
== NULL
&& dp
->op
[0].bytemode
== FLOATCODE
)
5189 dp
= get_valid_dis386 (dp
, info
);
5190 if (dp
!= NULL
&& putop (dp
->name
, sizeflag
) == 0)
5192 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
5195 op_ad
= MAX_OPERANDS
- 1 - i
;
5197 (*dp
->op
[i
].rtn
) (dp
->op
[i
].bytemode
, sizeflag
);
5202 /* See if any prefixes were not used. If so, print the first one
5203 separately. If we don't do this, we'll wind up printing an
5204 instruction stream which does not precisely correspond to the
5205 bytes we are disassembling. */
5206 if ((prefixes
& ~used_prefixes
) != 0)
5210 name
= prefix_name (priv
.the_buffer
[0], priv
.orig_sizeflag
);
5212 name
= INTERNAL_DISASSEMBLER_ERROR
;
5213 (*info
->fprintf_func
) (info
->stream
, "%s", name
);
5216 if (rex
& ~rex_used
)
5219 name
= prefix_name (rex
| 0x40, priv
.orig_sizeflag
);
5221 name
= INTERNAL_DISASSEMBLER_ERROR
;
5222 (*info
->fprintf_func
) (info
->stream
, "%s ", name
);
5226 prefix_obufp
= prefix_obuf
;
5228 prefix_obufp
= stpcpy (prefix_obufp
, lock_prefix
);
5230 prefix_obufp
= stpcpy (prefix_obufp
, repz_prefix
);
5232 prefix_obufp
= stpcpy (prefix_obufp
, repnz_prefix
);
5234 prefix_obufp
= stpcpy (prefix_obufp
, addr_prefix
);
5236 prefix_obufp
= stpcpy (prefix_obufp
, data_prefix
);
5238 if (prefix_obuf
[0] != 0)
5239 (*info
->fprintf_func
) (info
->stream
, "%s", prefix_obuf
);
5241 obufp
= obuf
+ strlen (obuf
);
5242 for (i
= strlen (obuf
) + strlen (prefix_obuf
); i
< 6; i
++)
5245 (*info
->fprintf_func
) (info
->stream
, "%s", obuf
);
5247 /* The enter and bound instructions are printed with operands in the same
5248 order as the intel book; everything else is printed in reverse order. */
5249 if (intel_syntax
|| two_source_ops
)
5253 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
5254 op_txt
[i
] = op_out
[i
];
5256 for (i
= 0; i
< (MAX_OPERANDS
>> 1); ++i
)
5258 op_ad
= op_index
[i
];
5259 op_index
[i
] = op_index
[MAX_OPERANDS
- 1 - i
];
5260 op_index
[MAX_OPERANDS
- 1 - i
] = op_ad
;
5261 riprel
= op_riprel
[i
];
5262 op_riprel
[i
] = op_riprel
[MAX_OPERANDS
- 1 - i
];
5263 op_riprel
[MAX_OPERANDS
- 1 - i
] = riprel
;
5268 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
5269 op_txt
[MAX_OPERANDS
- 1 - i
] = op_out
[i
];
5273 for (i
= 0; i
< MAX_OPERANDS
; ++i
)
5277 (*info
->fprintf_func
) (info
->stream
, ",");
5278 if (op_index
[i
] != -1 && !op_riprel
[i
])
5279 (*info
->print_address_func
) ((bfd_vma
) op_address
[op_index
[i
]], info
);
5281 (*info
->fprintf_func
) (info
->stream
, "%s", op_txt
[i
]);
5285 for (i
= 0; i
< MAX_OPERANDS
; i
++)
5286 if (op_index
[i
] != -1 && op_riprel
[i
])
5288 (*info
->fprintf_func
) (info
->stream
, " # ");
5289 (*info
->print_address_func
) ((bfd_vma
) (start_pc
+ codep
- start_codep
5290 + op_address
[op_index
[i
]]), info
);
5293 return codep
- priv
.the_buffer
;
5296 static const char *float_mem
[] = {
5371 static const unsigned char float_mem_mode
[] = {
5446 #define ST { OP_ST, 0 }
5447 #define STi { OP_STi, 0 }
5449 #define FGRPd9_2 NULL, { { NULL, 0 } }
5450 #define FGRPd9_4 NULL, { { NULL, 1 } }
5451 #define FGRPd9_5 NULL, { { NULL, 2 } }
5452 #define FGRPd9_6 NULL, { { NULL, 3 } }
5453 #define FGRPd9_7 NULL, { { NULL, 4 } }
5454 #define FGRPda_5 NULL, { { NULL, 5 } }
5455 #define FGRPdb_4 NULL, { { NULL, 6 } }
5456 #define FGRPde_3 NULL, { { NULL, 7 } }
5457 #define FGRPdf_4 NULL, { { NULL, 8 } }
5459 static const struct dis386 float_reg
[][8] = {
5462 { "fadd", { ST
, STi
} },
5463 { "fmul", { ST
, STi
} },
5464 { "fcom", { STi
} },
5465 { "fcomp", { STi
} },
5466 { "fsub", { ST
, STi
} },
5467 { "fsubr", { ST
, STi
} },
5468 { "fdiv", { ST
, STi
} },
5469 { "fdivr", { ST
, STi
} },
5474 { "fxch", { STi
} },
5476 { "(bad)", { XX
} },
5484 { "fcmovb", { ST
, STi
} },
5485 { "fcmove", { ST
, STi
} },
5486 { "fcmovbe",{ ST
, STi
} },
5487 { "fcmovu", { ST
, STi
} },
5488 { "(bad)", { XX
} },
5490 { "(bad)", { XX
} },
5491 { "(bad)", { XX
} },
5495 { "fcmovnb",{ ST
, STi
} },
5496 { "fcmovne",{ ST
, STi
} },
5497 { "fcmovnbe",{ ST
, STi
} },
5498 { "fcmovnu",{ ST
, STi
} },
5500 { "fucomi", { ST
, STi
} },
5501 { "fcomi", { ST
, STi
} },
5502 { "(bad)", { XX
} },
5506 { "fadd", { STi
, ST
} },
5507 { "fmul", { STi
, ST
} },
5508 { "(bad)", { XX
} },
5509 { "(bad)", { XX
} },
5511 { "fsub", { STi
, ST
} },
5512 { "fsubr", { STi
, ST
} },
5513 { "fdiv", { STi
, ST
} },
5514 { "fdivr", { STi
, ST
} },
5516 { "fsubr", { STi
, ST
} },
5517 { "fsub", { STi
, ST
} },
5518 { "fdivr", { STi
, ST
} },
5519 { "fdiv", { STi
, ST
} },
5524 { "ffree", { STi
} },
5525 { "(bad)", { XX
} },
5527 { "fstp", { STi
} },
5528 { "fucom", { STi
} },
5529 { "fucomp", { STi
} },
5530 { "(bad)", { XX
} },
5531 { "(bad)", { XX
} },
5535 { "faddp", { STi
, ST
} },
5536 { "fmulp", { STi
, ST
} },
5537 { "(bad)", { XX
} },
5540 { "fsubp", { STi
, ST
} },
5541 { "fsubrp", { STi
, ST
} },
5542 { "fdivp", { STi
, ST
} },
5543 { "fdivrp", { STi
, ST
} },
5545 { "fsubrp", { STi
, ST
} },
5546 { "fsubp", { STi
, ST
} },
5547 { "fdivrp", { STi
, ST
} },
5548 { "fdivp", { STi
, ST
} },
5553 { "ffreep", { STi
} },
5554 { "(bad)", { XX
} },
5555 { "(bad)", { XX
} },
5556 { "(bad)", { XX
} },
5558 { "fucomip", { ST
, STi
} },
5559 { "fcomip", { ST
, STi
} },
5560 { "(bad)", { XX
} },
5564 static char *fgrps
[][8] = {
5567 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
5572 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
5577 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
5582 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
5587 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
5592 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
5597 "feni(287 only)","fdisi(287 only)","fNclex","fNinit",
5598 "fNsetpm(287 only)","(bad)","(bad)","(bad)",
5603 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
5608 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
5613 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED
,
5614 int sizeflag ATTRIBUTE_UNUSED
)
5616 /* Skip mod/rm byte. */
5622 dofloat (int sizeflag
)
5624 const struct dis386
*dp
;
5625 unsigned char floatop
;
5627 floatop
= codep
[-1];
5631 int fp_indx
= (floatop
- 0xd8) * 8 + modrm
.reg
;
5633 putop (float_mem
[fp_indx
], sizeflag
);
5636 OP_E (float_mem_mode
[fp_indx
], sizeflag
);
5639 /* Skip mod/rm byte. */
5643 dp
= &float_reg
[floatop
- 0xd8][modrm
.reg
];
5644 if (dp
->name
== NULL
)
5646 putop (fgrps
[dp
->op
[0].bytemode
][modrm
.rm
], sizeflag
);
5648 /* Instruction fnstsw is only one with strange arg. */
5649 if (floatop
== 0xdf && codep
[-1] == 0xe0)
5650 strcpy (op_out
[0], names16
[0]);
5654 putop (dp
->name
, sizeflag
);
5659 (*dp
->op
[0].rtn
) (dp
->op
[0].bytemode
, sizeflag
);
5664 (*dp
->op
[1].rtn
) (dp
->op
[1].bytemode
, sizeflag
);
5669 OP_ST (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
5671 oappend ("%st" + intel_syntax
);
5675 OP_STi (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
5677 sprintf (scratchbuf
, "%%st(%d)", modrm
.rm
);
5678 oappend (scratchbuf
+ intel_syntax
);
5681 /* Capital letters in template are macros. */
5683 putop (const char *template, int sizeflag
)
5688 for (p
= template; *p
; p
++)
5699 if (address_mode
== mode_64bit
)
5707 /* Alternative not valid. */
5708 strcpy (obuf
, "(bad)");
5712 else if (*p
== '\0')
5733 if (modrm
.mod
!= 3 || (sizeflag
& SUFFIX_ALWAYS
))
5739 if (sizeflag
& SUFFIX_ALWAYS
)
5743 if (intel_syntax
&& !alt
)
5745 if ((prefixes
& PREFIX_DATA
) || (sizeflag
& SUFFIX_ALWAYS
))
5747 if (sizeflag
& DFLAG
)
5748 *obufp
++ = intel_syntax
? 'd' : 'l';
5750 *obufp
++ = intel_syntax
? 'w' : 's';
5751 used_prefixes
|= (prefixes
& PREFIX_DATA
);
5755 if (intel_syntax
|| !(sizeflag
& SUFFIX_ALWAYS
))
5762 else if (sizeflag
& DFLAG
)
5763 *obufp
++ = intel_syntax
? 'd' : 'l';
5766 used_prefixes
|= (prefixes
& PREFIX_DATA
);
5771 case 'E': /* For jcxz/jecxz */
5772 if (address_mode
== mode_64bit
)
5774 if (sizeflag
& AFLAG
)
5780 if (sizeflag
& AFLAG
)
5782 used_prefixes
|= (prefixes
& PREFIX_ADDR
);
5787 if ((prefixes
& PREFIX_ADDR
) || (sizeflag
& SUFFIX_ALWAYS
))
5789 if (sizeflag
& AFLAG
)
5790 *obufp
++ = address_mode
== mode_64bit
? 'q' : 'l';
5792 *obufp
++ = address_mode
== mode_64bit
? 'l' : 'w';
5793 used_prefixes
|= (prefixes
& PREFIX_ADDR
);
5797 if (intel_syntax
|| (obufp
[-1] != 's' && !(sizeflag
& SUFFIX_ALWAYS
)))
5799 if ((rex
& REX_W
) || (sizeflag
& DFLAG
))
5804 used_prefixes
|= (prefixes
& PREFIX_DATA
);
5809 if ((prefixes
& (PREFIX_CS
| PREFIX_DS
)) == PREFIX_CS
5810 || (prefixes
& (PREFIX_CS
| PREFIX_DS
)) == PREFIX_DS
)
5812 used_prefixes
|= prefixes
& (PREFIX_CS
| PREFIX_DS
);
5815 if (prefixes
& PREFIX_DS
)
5836 if (address_mode
== mode_64bit
&& (sizeflag
& SUFFIX_ALWAYS
))
5845 if (sizeflag
& SUFFIX_ALWAYS
)
5849 if ((prefixes
& PREFIX_FWAIT
) == 0)
5852 used_prefixes
|= PREFIX_FWAIT
;
5858 else if (intel_syntax
&& (sizeflag
& DFLAG
))
5863 used_prefixes
|= (prefixes
& PREFIX_DATA
);
5868 if (address_mode
== mode_64bit
&& (sizeflag
& DFLAG
))
5877 if ((prefixes
& PREFIX_DATA
)
5879 || (sizeflag
& SUFFIX_ALWAYS
))
5886 if (sizeflag
& DFLAG
)
5891 used_prefixes
|= (prefixes
& PREFIX_DATA
);
5897 if (address_mode
== mode_64bit
&& (sizeflag
& DFLAG
))
5899 if (modrm
.mod
!= 3 || (sizeflag
& SUFFIX_ALWAYS
))
5905 if (intel_syntax
&& !alt
)
5908 if (modrm
.mod
!= 3 || (sizeflag
& SUFFIX_ALWAYS
))
5914 if (sizeflag
& DFLAG
)
5915 *obufp
++ = intel_syntax
? 'd' : 'l';
5919 used_prefixes
|= (prefixes
& PREFIX_DATA
);
5926 else if (sizeflag
& DFLAG
)
5935 if (intel_syntax
&& !p
[1]
5936 && ((rex
& REX_W
) || (sizeflag
& DFLAG
)))
5939 used_prefixes
|= (prefixes
& PREFIX_DATA
);
5944 if (address_mode
== mode_64bit
&& (sizeflag
& DFLAG
))
5946 if (sizeflag
& SUFFIX_ALWAYS
)
5954 if (sizeflag
& SUFFIX_ALWAYS
)
5960 if (sizeflag
& DFLAG
)
5964 used_prefixes
|= (prefixes
& PREFIX_DATA
);
5969 if (prefixes
& PREFIX_DATA
)
5973 used_prefixes
|= (prefixes
& PREFIX_DATA
);
5984 /* implicit operand size 'l' for i386 or 'q' for x86-64 */
5986 /* operand size flag for cwtl, cbtw */
5995 else if (sizeflag
& DFLAG
)
6000 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6010 oappend (const char *s
)
6013 obufp
+= strlen (s
);
6019 if (prefixes
& PREFIX_CS
)
6021 used_prefixes
|= PREFIX_CS
;
6022 oappend ("%cs:" + intel_syntax
);
6024 if (prefixes
& PREFIX_DS
)
6026 used_prefixes
|= PREFIX_DS
;
6027 oappend ("%ds:" + intel_syntax
);
6029 if (prefixes
& PREFIX_SS
)
6031 used_prefixes
|= PREFIX_SS
;
6032 oappend ("%ss:" + intel_syntax
);
6034 if (prefixes
& PREFIX_ES
)
6036 used_prefixes
|= PREFIX_ES
;
6037 oappend ("%es:" + intel_syntax
);
6039 if (prefixes
& PREFIX_FS
)
6041 used_prefixes
|= PREFIX_FS
;
6042 oappend ("%fs:" + intel_syntax
);
6044 if (prefixes
& PREFIX_GS
)
6046 used_prefixes
|= PREFIX_GS
;
6047 oappend ("%gs:" + intel_syntax
);
6052 OP_indirE (int bytemode
, int sizeflag
)
6056 OP_E (bytemode
, sizeflag
);
6060 print_operand_value (char *buf
, int hex
, bfd_vma disp
)
6062 if (address_mode
== mode_64bit
)
6070 sprintf_vma (tmp
, disp
);
6071 for (i
= 0; tmp
[i
] == '0' && tmp
[i
+ 1]; i
++);
6072 strcpy (buf
+ 2, tmp
+ i
);
6076 bfd_signed_vma v
= disp
;
6083 /* Check for possible overflow on 0x8000000000000000. */
6086 strcpy (buf
, "9223372036854775808");
6100 tmp
[28 - i
] = (v
% 10) + '0';
6104 strcpy (buf
, tmp
+ 29 - i
);
6110 sprintf (buf
, "0x%x", (unsigned int) disp
);
6112 sprintf (buf
, "%d", (int) disp
);
6116 /* Put DISP in BUF as signed hex number. */
6119 print_displacement (char *buf
, bfd_vma disp
)
6121 bfd_signed_vma val
= disp
;
6130 /* Check for possible overflow. */
6133 switch (address_mode
)
6136 strcpy (buf
+ j
, "0x8000000000000000");
6139 strcpy (buf
+ j
, "0x80000000");
6142 strcpy (buf
+ j
, "0x8000");
6152 sprintf_vma (tmp
, val
);
6153 for (i
= 0; tmp
[i
] == '0'; i
++)
6157 strcpy (buf
+ j
, tmp
+ i
);
6161 intel_operand_size (int bytemode
, int sizeflag
)
6167 oappend ("BYTE PTR ");
6171 oappend ("WORD PTR ");
6174 if (address_mode
== mode_64bit
&& (sizeflag
& DFLAG
))
6176 oappend ("QWORD PTR ");
6177 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6185 oappend ("QWORD PTR ");
6186 else if ((sizeflag
& DFLAG
) || bytemode
== dq_mode
)
6187 oappend ("DWORD PTR ");
6189 oappend ("WORD PTR ");
6190 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6193 if ((rex
& REX_W
) || (sizeflag
& DFLAG
))
6195 oappend ("WORD PTR ");
6197 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6201 oappend ("DWORD PTR ");
6204 oappend ("QWORD PTR ");
6207 if (address_mode
== mode_64bit
)
6208 oappend ("QWORD PTR ");
6210 oappend ("DWORD PTR ");
6213 if (sizeflag
& DFLAG
)
6214 oappend ("FWORD PTR ");
6216 oappend ("DWORD PTR ");
6217 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6220 oappend ("TBYTE PTR ");
6223 oappend ("XMMWORD PTR ");
6226 oappend ("OWORD PTR ");
6234 OP_E_extended (int bytemode
, int sizeflag
, int has_drex
)
6243 /* Skip mod/rm byte. */
6254 oappend (names8rex
[modrm
.rm
+ add
]);
6256 oappend (names8
[modrm
.rm
+ add
]);
6259 oappend (names16
[modrm
.rm
+ add
]);
6262 oappend (names32
[modrm
.rm
+ add
]);
6265 oappend (names64
[modrm
.rm
+ add
]);
6268 if (address_mode
== mode_64bit
)
6269 oappend (names64
[modrm
.rm
+ add
]);
6271 oappend (names32
[modrm
.rm
+ add
]);
6274 if (address_mode
== mode_64bit
&& (sizeflag
& DFLAG
))
6276 oappend (names64
[modrm
.rm
+ add
]);
6277 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6289 oappend (names64
[modrm
.rm
+ add
]);
6290 else if ((sizeflag
& DFLAG
) || bytemode
!= v_mode
)
6291 oappend (names32
[modrm
.rm
+ add
]);
6293 oappend (names16
[modrm
.rm
+ add
]);
6294 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6299 oappend (INTERNAL_DISASSEMBLER_ERROR
);
6307 intel_operand_size (bytemode
, sizeflag
);
6310 if ((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
6312 /* 32/64 bit address mode */
6329 FETCH_DATA (the_info
, codep
+ 1);
6330 index
= (*codep
>> 3) & 7;
6331 scale
= (*codep
>> 6) & 3;
6336 haveindex
= index
!= 4;
6341 /* If we have a DREX byte, skip it now
6342 (it has already been handled) */
6345 FETCH_DATA (the_info
, codep
+ 1);
6352 if ((base
& 7) == 5)
6355 if (address_mode
== mode_64bit
&& !havesib
)
6361 FETCH_DATA (the_info
, codep
+ 1);
6363 if ((disp
& 0x80) != 0)
6371 havedisp
= havebase
|| (havesib
&& (haveindex
|| scale
!= 0));
6374 if (modrm
.mod
!= 0 || (base
& 7) == 5)
6376 if (havedisp
|| riprel
)
6377 print_displacement (scratchbuf
, disp
);
6379 print_operand_value (scratchbuf
, 1, disp
);
6380 oappend (scratchbuf
);
6388 if (havedisp
|| (intel_syntax
&& riprel
))
6390 *obufp
++ = open_char
;
6391 if (intel_syntax
&& riprel
)
6398 oappend (address_mode
== mode_64bit
&& (sizeflag
& AFLAG
)
6399 ? names64
[base
] : names32
[base
]);
6402 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
6403 print index to tell base + index from base. */
6406 || (havebase
&& base
!= ESP_REG_NUM
))
6408 if (!intel_syntax
|| havebase
)
6410 *obufp
++ = separator_char
;
6414 oappend (address_mode
== mode_64bit
6415 && (sizeflag
& AFLAG
)
6416 ? names64
[index
] : names32
[index
]);
6418 oappend (address_mode
== mode_64bit
6419 && (sizeflag
& AFLAG
)
6420 ? index64
: index32
);
6422 *obufp
++ = scale_char
;
6424 sprintf (scratchbuf
, "%d", 1 << scale
);
6425 oappend (scratchbuf
);
6429 && (disp
|| modrm
.mod
!= 0 || (base
& 7) == 5))
6431 if (!havedisp
|| (bfd_signed_vma
) disp
>= 0)
6436 else if (modrm
.mod
!= 1)
6440 disp
= - (bfd_signed_vma
) disp
;
6444 print_displacement (scratchbuf
, disp
);
6446 print_operand_value (scratchbuf
, 1, disp
);
6447 oappend (scratchbuf
);
6450 *obufp
++ = close_char
;
6453 else if (intel_syntax
)
6455 if (modrm
.mod
!= 0 || (base
& 7) == 5)
6457 if (prefixes
& (PREFIX_CS
| PREFIX_SS
| PREFIX_DS
6458 | PREFIX_ES
| PREFIX_FS
| PREFIX_GS
))
6462 oappend (names_seg
[ds_reg
- es_reg
]);
6465 print_operand_value (scratchbuf
, 1, disp
);
6466 oappend (scratchbuf
);
6471 { /* 16 bit address mode */
6478 if ((disp
& 0x8000) != 0)
6483 FETCH_DATA (the_info
, codep
+ 1);
6485 if ((disp
& 0x80) != 0)
6490 if ((disp
& 0x8000) != 0)
6496 if (modrm
.mod
!= 0 || modrm
.rm
== 6)
6498 print_displacement (scratchbuf
, disp
);
6499 oappend (scratchbuf
);
6502 if (modrm
.mod
!= 0 || modrm
.rm
!= 6)
6504 *obufp
++ = open_char
;
6506 oappend (index16
[modrm
.rm
]);
6508 && (disp
|| modrm
.mod
!= 0 || modrm
.rm
== 6))
6510 if ((bfd_signed_vma
) disp
>= 0)
6515 else if (modrm
.mod
!= 1)
6519 disp
= - (bfd_signed_vma
) disp
;
6522 print_displacement (scratchbuf
, disp
);
6523 oappend (scratchbuf
);
6526 *obufp
++ = close_char
;
6529 else if (intel_syntax
)
6531 if (prefixes
& (PREFIX_CS
| PREFIX_SS
| PREFIX_DS
6532 | PREFIX_ES
| PREFIX_FS
| PREFIX_GS
))
6536 oappend (names_seg
[ds_reg
- es_reg
]);
6539 print_operand_value (scratchbuf
, 1, disp
& 0xffff);
6540 oappend (scratchbuf
);
6546 OP_E (int bytemode
, int sizeflag
)
6548 OP_E_extended (bytemode
, sizeflag
, 0);
6553 OP_G (int bytemode
, int sizeflag
)
6564 oappend (names8rex
[modrm
.reg
+ add
]);
6566 oappend (names8
[modrm
.reg
+ add
]);
6569 oappend (names16
[modrm
.reg
+ add
]);
6572 oappend (names32
[modrm
.reg
+ add
]);
6575 oappend (names64
[modrm
.reg
+ add
]);
6584 oappend (names64
[modrm
.reg
+ add
]);
6585 else if ((sizeflag
& DFLAG
) || bytemode
!= v_mode
)
6586 oappend (names32
[modrm
.reg
+ add
]);
6588 oappend (names16
[modrm
.reg
+ add
]);
6589 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6592 if (address_mode
== mode_64bit
)
6593 oappend (names64
[modrm
.reg
+ add
]);
6595 oappend (names32
[modrm
.reg
+ add
]);
6598 oappend (INTERNAL_DISASSEMBLER_ERROR
);
6611 FETCH_DATA (the_info
, codep
+ 8);
6612 a
= *codep
++ & 0xff;
6613 a
|= (*codep
++ & 0xff) << 8;
6614 a
|= (*codep
++ & 0xff) << 16;
6615 a
|= (*codep
++ & 0xff) << 24;
6616 b
= *codep
++ & 0xff;
6617 b
|= (*codep
++ & 0xff) << 8;
6618 b
|= (*codep
++ & 0xff) << 16;
6619 b
|= (*codep
++ & 0xff) << 24;
6620 x
= a
+ ((bfd_vma
) b
<< 32);
6628 static bfd_signed_vma
6631 bfd_signed_vma x
= 0;
6633 FETCH_DATA (the_info
, codep
+ 4);
6634 x
= *codep
++ & (bfd_signed_vma
) 0xff;
6635 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 8;
6636 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 16;
6637 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 24;
6641 static bfd_signed_vma
6644 bfd_signed_vma x
= 0;
6646 FETCH_DATA (the_info
, codep
+ 4);
6647 x
= *codep
++ & (bfd_signed_vma
) 0xff;
6648 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 8;
6649 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 16;
6650 x
|= (*codep
++ & (bfd_signed_vma
) 0xff) << 24;
6652 x
= (x
^ ((bfd_signed_vma
) 1 << 31)) - ((bfd_signed_vma
) 1 << 31);
6662 FETCH_DATA (the_info
, codep
+ 2);
6663 x
= *codep
++ & 0xff;
6664 x
|= (*codep
++ & 0xff) << 8;
6669 set_op (bfd_vma op
, int riprel
)
6671 op_index
[op_ad
] = op_ad
;
6672 if (address_mode
== mode_64bit
)
6674 op_address
[op_ad
] = op
;
6675 op_riprel
[op_ad
] = riprel
;
6679 /* Mask to get a 32-bit address. */
6680 op_address
[op_ad
] = op
& 0xffffffff;
6681 op_riprel
[op_ad
] = riprel
& 0xffffffff;
6686 OP_REG (int code
, int sizeflag
)
6696 case ax_reg
: case cx_reg
: case dx_reg
: case bx_reg
:
6697 case sp_reg
: case bp_reg
: case si_reg
: case di_reg
:
6698 s
= names16
[code
- ax_reg
+ add
];
6700 case es_reg
: case ss_reg
: case cs_reg
:
6701 case ds_reg
: case fs_reg
: case gs_reg
:
6702 s
= names_seg
[code
- es_reg
+ add
];
6704 case al_reg
: case ah_reg
: case cl_reg
: case ch_reg
:
6705 case dl_reg
: case dh_reg
: case bl_reg
: case bh_reg
:
6708 s
= names8rex
[code
- al_reg
+ add
];
6710 s
= names8
[code
- al_reg
];
6712 case rAX_reg
: case rCX_reg
: case rDX_reg
: case rBX_reg
:
6713 case rSP_reg
: case rBP_reg
: case rSI_reg
: case rDI_reg
:
6714 if (address_mode
== mode_64bit
&& (sizeflag
& DFLAG
))
6716 s
= names64
[code
- rAX_reg
+ add
];
6719 code
+= eAX_reg
- rAX_reg
;
6721 case eAX_reg
: case eCX_reg
: case eDX_reg
: case eBX_reg
:
6722 case eSP_reg
: case eBP_reg
: case eSI_reg
: case eDI_reg
:
6725 s
= names64
[code
- eAX_reg
+ add
];
6726 else if (sizeflag
& DFLAG
)
6727 s
= names32
[code
- eAX_reg
+ add
];
6729 s
= names16
[code
- eAX_reg
+ add
];
6730 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6733 s
= INTERNAL_DISASSEMBLER_ERROR
;
6740 OP_IMREG (int code
, int sizeflag
)
6752 case ax_reg
: case cx_reg
: case dx_reg
: case bx_reg
:
6753 case sp_reg
: case bp_reg
: case si_reg
: case di_reg
:
6754 s
= names16
[code
- ax_reg
];
6756 case es_reg
: case ss_reg
: case cs_reg
:
6757 case ds_reg
: case fs_reg
: case gs_reg
:
6758 s
= names_seg
[code
- es_reg
];
6760 case al_reg
: case ah_reg
: case cl_reg
: case ch_reg
:
6761 case dl_reg
: case dh_reg
: case bl_reg
: case bh_reg
:
6764 s
= names8rex
[code
- al_reg
];
6766 s
= names8
[code
- al_reg
];
6768 case eAX_reg
: case eCX_reg
: case eDX_reg
: case eBX_reg
:
6769 case eSP_reg
: case eBP_reg
: case eSI_reg
: case eDI_reg
:
6772 s
= names64
[code
- eAX_reg
];
6773 else if (sizeflag
& DFLAG
)
6774 s
= names32
[code
- eAX_reg
];
6776 s
= names16
[code
- eAX_reg
];
6777 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6780 if ((rex
& REX_W
) || (sizeflag
& DFLAG
))
6785 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6788 s
= INTERNAL_DISASSEMBLER_ERROR
;
6795 OP_I (int bytemode
, int sizeflag
)
6798 bfd_signed_vma mask
= -1;
6803 FETCH_DATA (the_info
, codep
+ 1);
6808 if (address_mode
== mode_64bit
)
6818 else if (sizeflag
& DFLAG
)
6828 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6839 oappend (INTERNAL_DISASSEMBLER_ERROR
);
6844 scratchbuf
[0] = '$';
6845 print_operand_value (scratchbuf
+ 1, 1, op
);
6846 oappend (scratchbuf
+ intel_syntax
);
6847 scratchbuf
[0] = '\0';
6851 OP_I64 (int bytemode
, int sizeflag
)
6854 bfd_signed_vma mask
= -1;
6856 if (address_mode
!= mode_64bit
)
6858 OP_I (bytemode
, sizeflag
);
6865 FETCH_DATA (the_info
, codep
+ 1);
6873 else if (sizeflag
& DFLAG
)
6883 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6890 oappend (INTERNAL_DISASSEMBLER_ERROR
);
6895 scratchbuf
[0] = '$';
6896 print_operand_value (scratchbuf
+ 1, 1, op
);
6897 oappend (scratchbuf
+ intel_syntax
);
6898 scratchbuf
[0] = '\0';
6902 OP_sI (int bytemode
, int sizeflag
)
6905 bfd_signed_vma mask
= -1;
6910 FETCH_DATA (the_info
, codep
+ 1);
6912 if ((op
& 0x80) != 0)
6920 else if (sizeflag
& DFLAG
)
6929 if ((op
& 0x8000) != 0)
6932 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6937 if ((op
& 0x8000) != 0)
6941 oappend (INTERNAL_DISASSEMBLER_ERROR
);
6945 scratchbuf
[0] = '$';
6946 print_operand_value (scratchbuf
+ 1, 1, op
);
6947 oappend (scratchbuf
+ intel_syntax
);
6951 OP_J (int bytemode
, int sizeflag
)
6955 bfd_vma segment
= 0;
6960 FETCH_DATA (the_info
, codep
+ 1);
6962 if ((disp
& 0x80) != 0)
6966 if ((sizeflag
& DFLAG
) || (rex
& REX_W
))
6971 if ((disp
& 0x8000) != 0)
6973 /* In 16bit mode, address is wrapped around at 64k within
6974 the same segment. Otherwise, a data16 prefix on a jump
6975 instruction means that the pc is masked to 16 bits after
6976 the displacement is added! */
6978 if ((prefixes
& PREFIX_DATA
) == 0)
6979 segment
= ((start_pc
+ codep
- start_codep
)
6980 & ~((bfd_vma
) 0xffff));
6982 used_prefixes
|= (prefixes
& PREFIX_DATA
);
6985 oappend (INTERNAL_DISASSEMBLER_ERROR
);
6988 disp
= ((start_pc
+ codep
- start_codep
+ disp
) & mask
) | segment
;
6990 print_operand_value (scratchbuf
, 1, disp
);
6991 oappend (scratchbuf
);
6995 OP_SEG (int bytemode
, int sizeflag
)
6997 if (bytemode
== w_mode
)
6998 oappend (names_seg
[modrm
.reg
]);
7000 OP_E (modrm
.mod
== 3 ? bytemode
: w_mode
, sizeflag
);
7004 OP_DIR (int dummy ATTRIBUTE_UNUSED
, int sizeflag
)
7008 if (sizeflag
& DFLAG
)
7018 used_prefixes
|= (prefixes
& PREFIX_DATA
);
7020 sprintf (scratchbuf
, "0x%x:0x%x", seg
, offset
);
7022 sprintf (scratchbuf
, "$0x%x,$0x%x", seg
, offset
);
7023 oappend (scratchbuf
);
7027 OP_OFF (int bytemode
, int sizeflag
)
7031 if (intel_syntax
&& (sizeflag
& SUFFIX_ALWAYS
))
7032 intel_operand_size (bytemode
, sizeflag
);
7035 if ((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
7042 if (!(prefixes
& (PREFIX_CS
| PREFIX_SS
| PREFIX_DS
7043 | PREFIX_ES
| PREFIX_FS
| PREFIX_GS
)))
7045 oappend (names_seg
[ds_reg
- es_reg
]);
7049 print_operand_value (scratchbuf
, 1, off
);
7050 oappend (scratchbuf
);
7054 OP_OFF64 (int bytemode
, int sizeflag
)
7058 if (address_mode
!= mode_64bit
7059 || (prefixes
& PREFIX_ADDR
))
7061 OP_OFF (bytemode
, sizeflag
);
7065 if (intel_syntax
&& (sizeflag
& SUFFIX_ALWAYS
))
7066 intel_operand_size (bytemode
, sizeflag
);
7073 if (!(prefixes
& (PREFIX_CS
| PREFIX_SS
| PREFIX_DS
7074 | PREFIX_ES
| PREFIX_FS
| PREFIX_GS
)))
7076 oappend (names_seg
[ds_reg
- es_reg
]);
7080 print_operand_value (scratchbuf
, 1, off
);
7081 oappend (scratchbuf
);
7085 ptr_reg (int code
, int sizeflag
)
7089 *obufp
++ = open_char
;
7090 used_prefixes
|= (prefixes
& PREFIX_ADDR
);
7091 if (address_mode
== mode_64bit
)
7093 if (!(sizeflag
& AFLAG
))
7094 s
= names32
[code
- eAX_reg
];
7096 s
= names64
[code
- eAX_reg
];
7098 else if (sizeflag
& AFLAG
)
7099 s
= names32
[code
- eAX_reg
];
7101 s
= names16
[code
- eAX_reg
];
7103 *obufp
++ = close_char
;
7108 OP_ESreg (int code
, int sizeflag
)
7114 case 0x6d: /* insw/insl */
7115 intel_operand_size (z_mode
, sizeflag
);
7117 case 0xa5: /* movsw/movsl/movsq */
7118 case 0xa7: /* cmpsw/cmpsl/cmpsq */
7119 case 0xab: /* stosw/stosl */
7120 case 0xaf: /* scasw/scasl */
7121 intel_operand_size (v_mode
, sizeflag
);
7124 intel_operand_size (b_mode
, sizeflag
);
7127 oappend ("%es:" + intel_syntax
);
7128 ptr_reg (code
, sizeflag
);
7132 OP_DSreg (int code
, int sizeflag
)
7138 case 0x6f: /* outsw/outsl */
7139 intel_operand_size (z_mode
, sizeflag
);
7141 case 0xa5: /* movsw/movsl/movsq */
7142 case 0xa7: /* cmpsw/cmpsl/cmpsq */
7143 case 0xad: /* lodsw/lodsl/lodsq */
7144 intel_operand_size (v_mode
, sizeflag
);
7147 intel_operand_size (b_mode
, sizeflag
);
7157 prefixes
|= PREFIX_DS
;
7159 ptr_reg (code
, sizeflag
);
7163 OP_C (int dummy ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
7171 else if (address_mode
!= mode_64bit
&& (prefixes
& PREFIX_LOCK
))
7174 used_prefixes
|= PREFIX_LOCK
;
7177 sprintf (scratchbuf
, "%%cr%d", modrm
.reg
+ add
);
7178 oappend (scratchbuf
+ intel_syntax
);
7182 OP_D (int dummy ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
7189 sprintf (scratchbuf
, "db%d", modrm
.reg
+ add
);
7191 sprintf (scratchbuf
, "%%db%d", modrm
.reg
+ add
);
7192 oappend (scratchbuf
);
7196 OP_T (int dummy ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
7198 sprintf (scratchbuf
, "%%tr%d", modrm
.reg
);
7199 oappend (scratchbuf
+ intel_syntax
);
7203 OP_R (int bytemode
, int sizeflag
)
7206 OP_E (bytemode
, sizeflag
);
7212 OP_MMX (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
7214 used_prefixes
|= (prefixes
& PREFIX_DATA
);
7215 if (prefixes
& PREFIX_DATA
)
7221 sprintf (scratchbuf
, "%%xmm%d", modrm
.reg
+ add
);
7224 sprintf (scratchbuf
, "%%mm%d", modrm
.reg
);
7225 oappend (scratchbuf
+ intel_syntax
);
7229 OP_XMM (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
7235 sprintf (scratchbuf
, "%%xmm%d", modrm
.reg
+ add
);
7236 oappend (scratchbuf
+ intel_syntax
);
7240 OP_EM (int bytemode
, int sizeflag
)
7244 if (intel_syntax
&& bytemode
== v_mode
)
7246 bytemode
= (prefixes
& PREFIX_DATA
) ? x_mode
: q_mode
;
7247 used_prefixes
|= (prefixes
& PREFIX_DATA
);
7249 OP_E (bytemode
, sizeflag
);
7253 /* Skip mod/rm byte. */
7256 used_prefixes
|= (prefixes
& PREFIX_DATA
);
7257 if (prefixes
& PREFIX_DATA
)
7264 sprintf (scratchbuf
, "%%xmm%d", modrm
.rm
+ add
);
7267 sprintf (scratchbuf
, "%%mm%d", modrm
.rm
);
7268 oappend (scratchbuf
+ intel_syntax
);
7271 /* cvt* are the only instructions in sse2 which have
7272 both SSE and MMX operands and also have 0x66 prefix
7273 in their opcode. 0x66 was originally used to differentiate
7274 between SSE and MMX instruction(operands). So we have to handle the
7275 cvt* separately using OP_EMC and OP_MXC */
7277 OP_EMC (int bytemode
, int sizeflag
)
7281 if (intel_syntax
&& bytemode
== v_mode
)
7283 bytemode
= (prefixes
& PREFIX_DATA
) ? x_mode
: q_mode
;
7284 used_prefixes
|= (prefixes
& PREFIX_DATA
);
7286 OP_E (bytemode
, sizeflag
);
7290 /* Skip mod/rm byte. */
7293 used_prefixes
|= (prefixes
& PREFIX_DATA
);
7294 sprintf (scratchbuf
, "%%mm%d", modrm
.rm
);
7295 oappend (scratchbuf
+ intel_syntax
);
7299 OP_MXC (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
7301 used_prefixes
|= (prefixes
& PREFIX_DATA
);
7302 sprintf (scratchbuf
, "%%mm%d", modrm
.reg
);
7303 oappend (scratchbuf
+ intel_syntax
);
7307 OP_EX (int bytemode
, int sizeflag
)
7312 OP_E (bytemode
, sizeflag
);
7319 /* Skip mod/rm byte. */
7322 sprintf (scratchbuf
, "%%xmm%d", modrm
.rm
+ add
);
7323 oappend (scratchbuf
+ intel_syntax
);
7327 OP_MS (int bytemode
, int sizeflag
)
7330 OP_EM (bytemode
, sizeflag
);
7336 OP_XS (int bytemode
, int sizeflag
)
7339 OP_EX (bytemode
, sizeflag
);
7345 OP_M (int bytemode
, int sizeflag
)
7348 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
7351 OP_E (bytemode
, sizeflag
);
7355 OP_0f07 (int bytemode
, int sizeflag
)
7357 if (modrm
.mod
!= 3 || modrm
.rm
!= 0)
7360 OP_E (bytemode
, sizeflag
);
7363 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
7364 32bit mode and "xchg %rax,%rax" in 64bit mode. */
7367 NOP_Fixup1 (int bytemode
, int sizeflag
)
7369 if ((prefixes
& PREFIX_DATA
) != 0
7372 && address_mode
== mode_64bit
))
7373 OP_REG (bytemode
, sizeflag
);
7375 strcpy (obuf
, "nop");
7379 NOP_Fixup2 (int bytemode
, int sizeflag
)
7381 if ((prefixes
& PREFIX_DATA
) != 0
7384 && address_mode
== mode_64bit
))
7385 OP_IMREG (bytemode
, sizeflag
);
7388 static const char *const Suffix3DNow
[] = {
7389 /* 00 */ NULL
, NULL
, NULL
, NULL
,
7390 /* 04 */ NULL
, NULL
, NULL
, NULL
,
7391 /* 08 */ NULL
, NULL
, NULL
, NULL
,
7392 /* 0C */ "pi2fw", "pi2fd", NULL
, NULL
,
7393 /* 10 */ NULL
, NULL
, NULL
, NULL
,
7394 /* 14 */ NULL
, NULL
, NULL
, NULL
,
7395 /* 18 */ NULL
, NULL
, NULL
, NULL
,
7396 /* 1C */ "pf2iw", "pf2id", NULL
, NULL
,
7397 /* 20 */ NULL
, NULL
, NULL
, NULL
,
7398 /* 24 */ NULL
, NULL
, NULL
, NULL
,
7399 /* 28 */ NULL
, NULL
, NULL
, NULL
,
7400 /* 2C */ NULL
, NULL
, NULL
, NULL
,
7401 /* 30 */ NULL
, NULL
, NULL
, NULL
,
7402 /* 34 */ NULL
, NULL
, NULL
, NULL
,
7403 /* 38 */ NULL
, NULL
, NULL
, NULL
,
7404 /* 3C */ NULL
, NULL
, NULL
, NULL
,
7405 /* 40 */ NULL
, NULL
, NULL
, NULL
,
7406 /* 44 */ NULL
, NULL
, NULL
, NULL
,
7407 /* 48 */ NULL
, NULL
, NULL
, NULL
,
7408 /* 4C */ NULL
, NULL
, NULL
, NULL
,
7409 /* 50 */ NULL
, NULL
, NULL
, NULL
,
7410 /* 54 */ NULL
, NULL
, NULL
, NULL
,
7411 /* 58 */ NULL
, NULL
, NULL
, NULL
,
7412 /* 5C */ NULL
, NULL
, NULL
, NULL
,
7413 /* 60 */ NULL
, NULL
, NULL
, NULL
,
7414 /* 64 */ NULL
, NULL
, NULL
, NULL
,
7415 /* 68 */ NULL
, NULL
, NULL
, NULL
,
7416 /* 6C */ NULL
, NULL
, NULL
, NULL
,
7417 /* 70 */ NULL
, NULL
, NULL
, NULL
,
7418 /* 74 */ NULL
, NULL
, NULL
, NULL
,
7419 /* 78 */ NULL
, NULL
, NULL
, NULL
,
7420 /* 7C */ NULL
, NULL
, NULL
, NULL
,
7421 /* 80 */ NULL
, NULL
, NULL
, NULL
,
7422 /* 84 */ NULL
, NULL
, NULL
, NULL
,
7423 /* 88 */ NULL
, NULL
, "pfnacc", NULL
,
7424 /* 8C */ NULL
, NULL
, "pfpnacc", NULL
,
7425 /* 90 */ "pfcmpge", NULL
, NULL
, NULL
,
7426 /* 94 */ "pfmin", NULL
, "pfrcp", "pfrsqrt",
7427 /* 98 */ NULL
, NULL
, "pfsub", NULL
,
7428 /* 9C */ NULL
, NULL
, "pfadd", NULL
,
7429 /* A0 */ "pfcmpgt", NULL
, NULL
, NULL
,
7430 /* A4 */ "pfmax", NULL
, "pfrcpit1", "pfrsqit1",
7431 /* A8 */ NULL
, NULL
, "pfsubr", NULL
,
7432 /* AC */ NULL
, NULL
, "pfacc", NULL
,
7433 /* B0 */ "pfcmpeq", NULL
, NULL
, NULL
,
7434 /* B4 */ "pfmul", NULL
, "pfrcpit2", "pmulhrw",
7435 /* B8 */ NULL
, NULL
, NULL
, "pswapd",
7436 /* BC */ NULL
, NULL
, NULL
, "pavgusb",
7437 /* C0 */ NULL
, NULL
, NULL
, NULL
,
7438 /* C4 */ NULL
, NULL
, NULL
, NULL
,
7439 /* C8 */ NULL
, NULL
, NULL
, NULL
,
7440 /* CC */ NULL
, NULL
, NULL
, NULL
,
7441 /* D0 */ NULL
, NULL
, NULL
, NULL
,
7442 /* D4 */ NULL
, NULL
, NULL
, NULL
,
7443 /* D8 */ NULL
, NULL
, NULL
, NULL
,
7444 /* DC */ NULL
, NULL
, NULL
, NULL
,
7445 /* E0 */ NULL
, NULL
, NULL
, NULL
,
7446 /* E4 */ NULL
, NULL
, NULL
, NULL
,
7447 /* E8 */ NULL
, NULL
, NULL
, NULL
,
7448 /* EC */ NULL
, NULL
, NULL
, NULL
,
7449 /* F0 */ NULL
, NULL
, NULL
, NULL
,
7450 /* F4 */ NULL
, NULL
, NULL
, NULL
,
7451 /* F8 */ NULL
, NULL
, NULL
, NULL
,
7452 /* FC */ NULL
, NULL
, NULL
, NULL
,
7456 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
7458 const char *mnemonic
;
7460 FETCH_DATA (the_info
, codep
+ 1);
7461 /* AMD 3DNow! instructions are specified by an opcode suffix in the
7462 place where an 8-bit immediate would normally go. ie. the last
7463 byte of the instruction. */
7464 obufp
= obuf
+ strlen (obuf
);
7465 mnemonic
= Suffix3DNow
[*codep
++ & 0xff];
7470 /* Since a variable sized modrm/sib chunk is between the start
7471 of the opcode (0x0f0f) and the opcode suffix, we need to do
7472 all the modrm processing first, and don't know until now that
7473 we have a bad opcode. This necessitates some cleaning up. */
7474 op_out
[0][0] = '\0';
7475 op_out
[1][0] = '\0';
7480 static const char *simd_cmp_op
[] = {
7492 OP_SIMD_Suffix (int bytemode ATTRIBUTE_UNUSED
, int sizeflag ATTRIBUTE_UNUSED
)
7494 unsigned int cmp_type
;
7496 FETCH_DATA (the_info
, codep
+ 1);
7497 obufp
= obuf
+ strlen (obuf
);
7498 cmp_type
= *codep
++ & 0xff;
7501 char suffix1
= 'p', suffix2
= 's';
7502 used_prefixes
|= (prefixes
& PREFIX_REPZ
);
7503 if (prefixes
& PREFIX_REPZ
)
7507 used_prefixes
|= (prefixes
& PREFIX_DATA
);
7508 if (prefixes
& PREFIX_DATA
)
7512 used_prefixes
|= (prefixes
& PREFIX_REPNZ
);
7513 if (prefixes
& PREFIX_REPNZ
)
7514 suffix1
= 's', suffix2
= 'd';
7517 sprintf (scratchbuf
, "cmp%s%c%c",
7518 simd_cmp_op
[cmp_type
], suffix1
, suffix2
);
7519 used_prefixes
|= (prefixes
& PREFIX_REPZ
);
7520 oappend (scratchbuf
);
7524 /* We have a bad extension byte. Clean up. */
7525 op_out
[0][0] = '\0';
7526 op_out
[1][0] = '\0';
7532 OP_Mwait (int bytemode ATTRIBUTE_UNUSED
,
7533 int sizeflag ATTRIBUTE_UNUSED
)
7535 /* mwait %eax,%ecx */
7538 const char **names
= (address_mode
== mode_64bit
7539 ? names64
: names32
);
7540 strcpy (op_out
[0], names
[0]);
7541 strcpy (op_out
[1], names
[1]);
7544 /* Skip mod/rm byte. */
7550 OP_Monitor (int bytemode ATTRIBUTE_UNUSED
,
7551 int sizeflag ATTRIBUTE_UNUSED
)
7553 /* monitor %eax,%ecx,%edx" */
7556 const char **op1_names
;
7557 const char **names
= (address_mode
== mode_64bit
7558 ? names64
: names32
);
7560 if (!(prefixes
& PREFIX_ADDR
))
7561 op1_names
= (address_mode
== mode_16bit
7565 /* Remove "addr16/addr32". */
7567 op1_names
= (address_mode
!= mode_32bit
7568 ? names32
: names16
);
7569 used_prefixes
|= PREFIX_ADDR
;
7571 strcpy (op_out
[0], op1_names
[0]);
7572 strcpy (op_out
[1], names
[1]);
7573 strcpy (op_out
[2], names
[2]);
7576 /* Skip mod/rm byte. */
7584 /* Throw away prefixes and 1st. opcode byte. */
7585 codep
= insn_codep
+ 1;
7590 REP_Fixup (int bytemode
, int sizeflag
)
7592 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
7594 if (prefixes
& PREFIX_REPZ
)
7595 repz_prefix
= "rep ";
7602 OP_IMREG (bytemode
, sizeflag
);
7605 OP_ESreg (bytemode
, sizeflag
);
7608 OP_DSreg (bytemode
, sizeflag
);
7617 CMPXCHG8B_Fixup (int bytemode
, int sizeflag
)
7622 /* Change cmpxchg8b to cmpxchg16b. */
7623 char *p
= obuf
+ strlen (obuf
) - 2;
7627 OP_M (bytemode
, sizeflag
);
7631 XMM_Fixup (int reg
, int sizeflag ATTRIBUTE_UNUSED
)
7633 sprintf (scratchbuf
, "%%xmm%d", reg
);
7634 oappend (scratchbuf
+ intel_syntax
);
7638 CRC32_Fixup (int bytemode
, int sizeflag
)
7640 /* Add proper suffix to "crc32". */
7641 char *p
= obuf
+ strlen (obuf
);
7658 else if (sizeflag
& DFLAG
)
7662 used_prefixes
|= (prefixes
& PREFIX_DATA
);
7665 oappend (INTERNAL_DISASSEMBLER_ERROR
);
7674 /* Skip mod/rm byte. */
7679 add
= (rex
& REX_B
) ? 8 : 0;
7680 if (bytemode
== b_mode
)
7684 oappend (names8rex
[modrm
.rm
+ add
]);
7686 oappend (names8
[modrm
.rm
+ add
]);
7692 oappend (names64
[modrm
.rm
+ add
]);
7693 else if ((prefixes
& PREFIX_DATA
))
7694 oappend (names16
[modrm
.rm
+ add
]);
7696 oappend (names32
[modrm
.rm
+ add
]);
7700 OP_E (bytemode
, sizeflag
);
7703 /* Print a DREX argument as either a register or memory operation. */
7705 print_drex_arg (unsigned int reg
, int bytemode
, int sizeflag
)
7707 if (reg
== DREX_REG_UNKNOWN
)
7710 else if (reg
!= DREX_REG_MEMORY
)
7712 sprintf (scratchbuf
, "%%xmm%d", reg
);
7713 oappend (scratchbuf
+ intel_syntax
);
7717 OP_E_extended (bytemode
, sizeflag
, 1);
7720 /* SSE5 instructions that have 4 arguments are encoded as:
7721 0f 24 <sub-opcode> <modrm> <optional-sib> <drex> <offset>.
7723 The <sub-opcode> byte has 1 bit (0x4) that is combined with 1 bit in
7724 the DREX field (0x8) to determine how the arguments are laid out.
7725 The destination register must be the same register as one of the
7726 inputs, and it is encoded in the DREX byte. No REX prefix is used
7727 for these instructions, since the DREX field contains the 3 extension
7728 bits provided by the REX prefix.
7730 The bytemode argument adds 2 extra bits for passing extra information:
7731 DREX_OC1 -- Set the OC1 bit to indicate dest == 1st arg
7732 DREX_NO_OC0 -- OC0 in DREX is invalid
7733 (but pretend it is set). */
7736 OP_DREX4 (int flag_bytemode
, int sizeflag
)
7738 unsigned int drex_byte
;
7739 unsigned int regs
[4];
7740 unsigned int modrm_regmem
;
7741 unsigned int modrm_reg
;
7742 unsigned int drex_reg
;
7745 int rex_used_save
= rex_used
;
7747 int oc1
= (flag_bytemode
& DREX_OC1
) ? 2 : 0;
7751 bytemode
= flag_bytemode
& ~ DREX_MASK
;
7753 for (i
= 0; i
< 4; i
++)
7754 regs
[i
] = DREX_REG_UNKNOWN
;
7756 /* Determine if we have a SIB byte in addition to MODRM before the
7758 if (((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
7763 /* Get the DREX byte. */
7764 FETCH_DATA (the_info
, codep
+ 2 + has_sib
);
7765 drex_byte
= codep
[has_sib
+1];
7766 drex_reg
= DREX_XMM (drex_byte
);
7767 modrm_reg
= modrm
.reg
+ ((drex_byte
& REX_R
) ? 8 : 0);
7769 /* Is OC0 legal? If not, hardwire oc0 == 1. */
7770 if (flag_bytemode
& DREX_NO_OC0
)
7773 if (DREX_OC0 (drex_byte
))
7777 oc0
= DREX_OC0 (drex_byte
);
7781 /* regmem == register */
7782 modrm_regmem
= modrm
.rm
+ ((drex_byte
& REX_B
) ? 8 : 0);
7784 /* skip modrm/drex since we don't call OP_E_extended */
7789 /* regmem == memory, fill in appropriate REX bits */
7790 modrm_regmem
= DREX_REG_MEMORY
;
7791 rex
= drex_byte
& (REX_B
| REX_X
| REX_R
);
7797 /* Based on the OC1/OC0 bits, lay out the arguments in the correct
7806 regs
[0] = modrm_regmem
;
7807 regs
[1] = modrm_reg
;
7813 regs
[0] = modrm_reg
;
7814 regs
[1] = modrm_regmem
;
7821 regs
[1] = modrm_regmem
;
7822 regs
[2] = modrm_reg
;
7828 regs
[1] = modrm_reg
;
7829 regs
[2] = modrm_regmem
;
7834 /* Print out the arguments. */
7835 for (i
= 0; i
< 4; i
++)
7837 int j
= (intel_syntax
) ? 3 - i
: i
;
7844 print_drex_arg (regs
[j
], bytemode
, sizeflag
);
7848 rex_used
= rex_used_save
;
7851 /* SSE5 instructions that have 3 arguments, and are encoded as:
7852 0f 24 <sub-opcode> <modrm> <optional-sib> <drex> <offset> (or)
7853 0f 25 <sub-opcode> <modrm> <optional-sib> <drex> <offset> <cmp-byte>
7855 The DREX field has 1 bit (0x8) to determine how the arguments are
7856 laid out. The destination register is encoded in the DREX byte.
7857 No REX prefix is used for these instructions, since the DREX field
7858 contains the 3 extension bits provided by the REX prefix. */
7861 OP_DREX3 (int flag_bytemode
, int sizeflag
)
7863 unsigned int drex_byte
;
7864 unsigned int regs
[3];
7865 unsigned int modrm_regmem
;
7866 unsigned int modrm_reg
;
7867 unsigned int drex_reg
;
7870 int rex_used_save
= rex_used
;
7875 bytemode
= flag_bytemode
& ~ DREX_MASK
;
7877 for (i
= 0; i
< 3; i
++)
7878 regs
[i
] = DREX_REG_UNKNOWN
;
7880 /* Determine if we have a SIB byte in addition to MODRM before the
7882 if (((sizeflag
& AFLAG
) || address_mode
== mode_64bit
)
7887 /* Get the DREX byte. */
7888 FETCH_DATA (the_info
, codep
+ 2 + has_sib
);
7889 drex_byte
= codep
[has_sib
+1];
7890 drex_reg
= DREX_XMM (drex_byte
);
7891 modrm_reg
= modrm
.reg
+ ((drex_byte
& REX_R
) ? 8 : 0);
7893 /* Is OC0 legal? If not, hardwire oc0 == 0 */
7894 oc0
= DREX_OC0 (drex_byte
);
7895 if ((flag_bytemode
& DREX_NO_OC0
) && oc0
)
7900 /* regmem == register */
7901 modrm_regmem
= modrm
.rm
+ ((drex_byte
& REX_B
) ? 8 : 0);
7903 /* skip modrm/drex since we don't call OP_E_extended. */
7908 /* regmem == memory, fill in appropriate REX bits. */
7909 modrm_regmem
= DREX_REG_MEMORY
;
7910 rex
= drex_byte
& (REX_B
| REX_X
| REX_R
);
7916 /* Based on the OC1/OC0 bits, lay out the arguments in the correct
7925 regs
[0] = modrm_regmem
;
7926 regs
[1] = modrm_reg
;
7931 regs
[0] = modrm_reg
;
7932 regs
[1] = modrm_regmem
;
7937 /* Print out the arguments. */
7938 for (i
= 0; i
< 3; i
++)
7940 int j
= (intel_syntax
) ? 2 - i
: i
;
7947 print_drex_arg (regs
[j
], bytemode
, sizeflag
);
7951 rex_used
= rex_used_save
;
7954 /* Emit a floating point comparison for comp<xx> instructions. */
7957 OP_DREX_FCMP (int bytemode ATTRIBUTE_UNUSED
,
7958 int sizeflag ATTRIBUTE_UNUSED
)
7962 static const char *const cmp_test
[] = {
7981 FETCH_DATA (the_info
, codep
+ 1);
7982 byte
= *codep
& 0xff;
7984 if (byte
>= ARRAY_SIZE (cmp_test
)
7989 /* The instruction isn't one we know about, so just append the
7990 extension byte as a numeric value. */
7996 sprintf (scratchbuf
, "com%s%s", cmp_test
[byte
], obuf
+3);
7997 strcpy (obuf
, scratchbuf
);
8002 /* Emit an integer point comparison for pcom<xx> instructions,
8003 rewriting the instruction to have the test inside of it. */
8006 OP_DREX_ICMP (int bytemode ATTRIBUTE_UNUSED
,
8007 int sizeflag ATTRIBUTE_UNUSED
)
8011 static const char *const cmp_test
[] = {
8022 FETCH_DATA (the_info
, codep
+ 1);
8023 byte
= *codep
& 0xff;
8025 if (byte
>= ARRAY_SIZE (cmp_test
)
8031 /* The instruction isn't one we know about, so just print the
8032 comparison test byte as a numeric value. */
8038 sprintf (scratchbuf
, "pcom%s%s", cmp_test
[byte
], obuf
+4);
8039 strcpy (obuf
, scratchbuf
);