2007-08-29 H.J. Lu <hongjiu.lu@intel.com>
[deliverable/binutils-gdb.git] / opcodes / i386-dis.c
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.
4
5 This file is part of the GNU opcodes library.
6
7 This library is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
10 any later version.
11
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.
16
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. */
21
22
23 /* 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu)
24 July 1988
25 modified by John Hassey (hassey@dg-rtp.dg.com)
26 x86-64 support added by Jan Hubicka (jh@suse.cz)
27 VIA PadLock support by Michal Ludvig (mludvig@suse.cz). */
28
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. */
35
36 #include "dis-asm.h"
37 #include "sysdep.h"
38 #include "opintl.h"
39 #include "opcode/i386.h"
40
41 #include <setjmp.h>
42
43 static int fetch_data (struct disassemble_info *, bfd_byte *);
44 static void ckprefix (void);
45 static const char *prefix_name (int, int);
46 static int print_insn (bfd_vma, disassemble_info *);
47 static void dofloat (int);
48 static void OP_ST (int, int);
49 static void OP_STi (int, int);
50 static int putop (const char *, int);
51 static void oappend (const char *);
52 static void append_seg (void);
53 static void OP_indirE (int, int);
54 static void print_operand_value (char *, int, bfd_vma);
55 static void print_displacement (char *, bfd_vma);
56 static void OP_E (int, int);
57 static void OP_G (int, int);
58 static bfd_vma get64 (void);
59 static bfd_signed_vma get32 (void);
60 static bfd_signed_vma get32s (void);
61 static int get16 (void);
62 static void set_op (bfd_vma, int);
63 static void OP_Skip_MODRM (int, int);
64 static void OP_REG (int, int);
65 static void OP_IMREG (int, int);
66 static void OP_I (int, int);
67 static void OP_I64 (int, int);
68 static void OP_sI (int, int);
69 static void OP_J (int, int);
70 static void OP_SEG (int, int);
71 static void OP_DIR (int, int);
72 static void OP_OFF (int, int);
73 static void OP_OFF64 (int, int);
74 static void ptr_reg (int, int);
75 static void OP_ESreg (int, int);
76 static void OP_DSreg (int, int);
77 static void OP_C (int, int);
78 static void OP_D (int, int);
79 static void OP_T (int, int);
80 static void OP_R (int, int);
81 static void OP_MMX (int, int);
82 static void OP_XMM (int, int);
83 static void OP_EM (int, int);
84 static void OP_EX (int, int);
85 static void OP_EMC (int,int);
86 static void OP_MXC (int,int);
87 static void OP_MS (int, int);
88 static void OP_XS (int, int);
89 static void OP_M (int, int);
90 static void OP_0f07 (int, int);
91 static void OP_Monitor (int, int);
92 static void OP_Mwait (int, int);
93 static void NOP_Fixup1 (int, int);
94 static void NOP_Fixup2 (int, int);
95 static void OP_3DNowSuffix (int, int);
96 static void OP_SIMD_Suffix (int, int);
97 static void SVME_Fixup (int, int);
98 static void INVLPG_Fixup (int, int);
99 static void BadOp (void);
100 static void REP_Fixup (int, int);
101 static void CMPXCHG8B_Fixup (int, int);
102 static void XMM_Fixup (int, int);
103 static void CRC32_Fixup (int, int);
104
105 struct dis_private {
106 /* Points to first byte not fetched. */
107 bfd_byte *max_fetched;
108 bfd_byte the_buffer[MAX_MNEM_SIZE];
109 bfd_vma insn_start;
110 int orig_sizeflag;
111 jmp_buf bailout;
112 };
113
114 enum address_mode
115 {
116 mode_16bit,
117 mode_32bit,
118 mode_64bit
119 };
120
121 enum address_mode address_mode;
122
123 /* Flags for the prefixes for the current instruction. See below. */
124 static int prefixes;
125
126 /* REX prefix the current instruction. See below. */
127 static int rex;
128 /* Bits of REX we've already used. */
129 static int rex_used;
130 /* Mark parts used in the REX prefix. When we are testing for
131 empty prefix (for 8bit register REX extension), just mask it
132 out. Otherwise test for REX bit is excuse for existence of REX
133 only in case value is nonzero. */
134 #define USED_REX(value) \
135 { \
136 if (value) \
137 { \
138 if ((rex & value)) \
139 rex_used |= (value) | REX_OPCODE; \
140 } \
141 else \
142 rex_used |= REX_OPCODE; \
143 }
144
145 /* Flags for prefixes which we somehow handled when printing the
146 current instruction. */
147 static int used_prefixes;
148
149 /* Flags stored in PREFIXES. */
150 #define PREFIX_REPZ 1
151 #define PREFIX_REPNZ 2
152 #define PREFIX_LOCK 4
153 #define PREFIX_CS 8
154 #define PREFIX_SS 0x10
155 #define PREFIX_DS 0x20
156 #define PREFIX_ES 0x40
157 #define PREFIX_FS 0x80
158 #define PREFIX_GS 0x100
159 #define PREFIX_DATA 0x200
160 #define PREFIX_ADDR 0x400
161 #define PREFIX_FWAIT 0x800
162
163 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
164 to ADDR (exclusive) are valid. Returns 1 for success, longjmps
165 on error. */
166 #define FETCH_DATA(info, addr) \
167 ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
168 ? 1 : fetch_data ((info), (addr)))
169
170 static int
171 fetch_data (struct disassemble_info *info, bfd_byte *addr)
172 {
173 int status;
174 struct dis_private *priv = (struct dis_private *) info->private_data;
175 bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
176
177 if (addr <= priv->the_buffer + MAX_MNEM_SIZE)
178 status = (*info->read_memory_func) (start,
179 priv->max_fetched,
180 addr - priv->max_fetched,
181 info);
182 else
183 status = -1;
184 if (status != 0)
185 {
186 /* If we did manage to read at least one byte, then
187 print_insn_i386 will do something sensible. Otherwise, print
188 an error. We do that here because this is where we know
189 STATUS. */
190 if (priv->max_fetched == priv->the_buffer)
191 (*info->memory_error_func) (status, start, info);
192 longjmp (priv->bailout, 1);
193 }
194 else
195 priv->max_fetched = addr;
196 return 1;
197 }
198
199 #define XX { NULL, 0 }
200
201 #define Eb { OP_E, b_mode }
202 #define Ev { OP_E, v_mode }
203 #define Ed { OP_E, d_mode }
204 #define Edq { OP_E, dq_mode }
205 #define Edqw { OP_E, dqw_mode }
206 #define Edqb { OP_E, dqb_mode }
207 #define Edqd { OP_E, dqd_mode }
208 #define Eq { OP_E, q_mode }
209 #define indirEv { OP_indirE, stack_v_mode }
210 #define indirEp { OP_indirE, f_mode }
211 #define stackEv { OP_E, stack_v_mode }
212 #define Em { OP_E, m_mode }
213 #define Ew { OP_E, w_mode }
214 #define M { OP_M, 0 } /* lea, lgdt, etc. */
215 #define Ma { OP_M, v_mode }
216 #define Mb { OP_M, b_mode }
217 #define Md { OP_M, d_mode }
218 #define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */
219 #define Mq { OP_M, q_mode }
220 #define Gb { OP_G, b_mode }
221 #define Gv { OP_G, v_mode }
222 #define Gd { OP_G, d_mode }
223 #define Gdq { OP_G, dq_mode }
224 #define Gm { OP_G, m_mode }
225 #define Gw { OP_G, w_mode }
226 #define Rd { OP_R, d_mode }
227 #define Rm { OP_R, m_mode }
228 #define Ib { OP_I, b_mode }
229 #define sIb { OP_sI, b_mode } /* sign extened byte */
230 #define Iv { OP_I, v_mode }
231 #define Iq { OP_I, q_mode }
232 #define Iv64 { OP_I64, v_mode }
233 #define Iw { OP_I, w_mode }
234 #define I1 { OP_I, const_1_mode }
235 #define Jb { OP_J, b_mode }
236 #define Jv { OP_J, v_mode }
237 #define Cm { OP_C, m_mode }
238 #define Dm { OP_D, m_mode }
239 #define Td { OP_T, d_mode }
240 #define Skip_MODRM { OP_Skip_MODRM, 0 }
241
242 #define RMeAX { OP_REG, eAX_reg }
243 #define RMeBX { OP_REG, eBX_reg }
244 #define RMeCX { OP_REG, eCX_reg }
245 #define RMeDX { OP_REG, eDX_reg }
246 #define RMeSP { OP_REG, eSP_reg }
247 #define RMeBP { OP_REG, eBP_reg }
248 #define RMeSI { OP_REG, eSI_reg }
249 #define RMeDI { OP_REG, eDI_reg }
250 #define RMrAX { OP_REG, rAX_reg }
251 #define RMrBX { OP_REG, rBX_reg }
252 #define RMrCX { OP_REG, rCX_reg }
253 #define RMrDX { OP_REG, rDX_reg }
254 #define RMrSP { OP_REG, rSP_reg }
255 #define RMrBP { OP_REG, rBP_reg }
256 #define RMrSI { OP_REG, rSI_reg }
257 #define RMrDI { OP_REG, rDI_reg }
258 #define RMAL { OP_REG, al_reg }
259 #define RMAL { OP_REG, al_reg }
260 #define RMCL { OP_REG, cl_reg }
261 #define RMDL { OP_REG, dl_reg }
262 #define RMBL { OP_REG, bl_reg }
263 #define RMAH { OP_REG, ah_reg }
264 #define RMCH { OP_REG, ch_reg }
265 #define RMDH { OP_REG, dh_reg }
266 #define RMBH { OP_REG, bh_reg }
267 #define RMAX { OP_REG, ax_reg }
268 #define RMDX { OP_REG, dx_reg }
269
270 #define eAX { OP_IMREG, eAX_reg }
271 #define eBX { OP_IMREG, eBX_reg }
272 #define eCX { OP_IMREG, eCX_reg }
273 #define eDX { OP_IMREG, eDX_reg }
274 #define eSP { OP_IMREG, eSP_reg }
275 #define eBP { OP_IMREG, eBP_reg }
276 #define eSI { OP_IMREG, eSI_reg }
277 #define eDI { OP_IMREG, eDI_reg }
278 #define AL { OP_IMREG, al_reg }
279 #define CL { OP_IMREG, cl_reg }
280 #define DL { OP_IMREG, dl_reg }
281 #define BL { OP_IMREG, bl_reg }
282 #define AH { OP_IMREG, ah_reg }
283 #define CH { OP_IMREG, ch_reg }
284 #define DH { OP_IMREG, dh_reg }
285 #define BH { OP_IMREG, bh_reg }
286 #define AX { OP_IMREG, ax_reg }
287 #define DX { OP_IMREG, dx_reg }
288 #define zAX { OP_IMREG, z_mode_ax_reg }
289 #define indirDX { OP_IMREG, indir_dx_reg }
290
291 #define Sw { OP_SEG, w_mode }
292 #define Sv { OP_SEG, v_mode }
293 #define Ap { OP_DIR, 0 }
294 #define Ob { OP_OFF64, b_mode }
295 #define Ov { OP_OFF64, v_mode }
296 #define Xb { OP_DSreg, eSI_reg }
297 #define Xv { OP_DSreg, eSI_reg }
298 #define Xz { OP_DSreg, eSI_reg }
299 #define Yb { OP_ESreg, eDI_reg }
300 #define Yv { OP_ESreg, eDI_reg }
301 #define DSBX { OP_DSreg, eBX_reg }
302
303 #define es { OP_REG, es_reg }
304 #define ss { OP_REG, ss_reg }
305 #define cs { OP_REG, cs_reg }
306 #define ds { OP_REG, ds_reg }
307 #define fs { OP_REG, fs_reg }
308 #define gs { OP_REG, gs_reg }
309
310 #define MX { OP_MMX, 0 }
311 #define XM { OP_XMM, 0 }
312 #define EM { OP_EM, v_mode }
313 #define EMd { OP_EM, d_mode }
314 #define EMx { OP_EM, x_mode }
315 #define EXw { OP_EX, w_mode }
316 #define EXd { OP_EX, d_mode }
317 #define EXq { OP_EX, q_mode }
318 #define EXx { OP_EX, x_mode }
319 #define MS { OP_MS, v_mode }
320 #define XS { OP_XS, v_mode }
321 #define EMCq { OP_EMC, q_mode }
322 #define MXC { OP_MXC, 0 }
323 #define OPSUF { OP_3DNowSuffix, 0 }
324 #define OPSIMD { OP_SIMD_Suffix, 0 }
325 #define XMM0 { XMM_Fixup, 0 }
326
327 /* Used handle "rep" prefix for string instructions. */
328 #define Xbr { REP_Fixup, eSI_reg }
329 #define Xvr { REP_Fixup, eSI_reg }
330 #define Ybr { REP_Fixup, eDI_reg }
331 #define Yvr { REP_Fixup, eDI_reg }
332 #define Yzr { REP_Fixup, eDI_reg }
333 #define indirDXr { REP_Fixup, indir_dx_reg }
334 #define ALr { REP_Fixup, al_reg }
335 #define eAXr { REP_Fixup, eAX_reg }
336
337 #define cond_jump_flag { NULL, cond_jump_mode }
338 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
339
340 /* bits in sizeflag */
341 #define SUFFIX_ALWAYS 4
342 #define AFLAG 2
343 #define DFLAG 1
344
345 #define b_mode 1 /* byte operand */
346 #define v_mode 2 /* operand size depends on prefixes */
347 #define w_mode 3 /* word operand */
348 #define d_mode 4 /* double word operand */
349 #define q_mode 5 /* quad word operand */
350 #define t_mode 6 /* ten-byte operand */
351 #define x_mode 7 /* 16-byte XMM operand */
352 #define m_mode 8 /* d_mode in 32bit, q_mode in 64bit mode. */
353 #define cond_jump_mode 9
354 #define loop_jcxz_mode 10
355 #define dq_mode 11 /* operand size depends on REX prefixes. */
356 #define dqw_mode 12 /* registers like dq_mode, memory like w_mode. */
357 #define f_mode 13 /* 4- or 6-byte pointer operand */
358 #define const_1_mode 14
359 #define stack_v_mode 15 /* v_mode for stack-related opcodes. */
360 #define z_mode 16 /* non-quad operand size depends on prefixes */
361 #define o_mode 17 /* 16-byte operand */
362 #define dqb_mode 18 /* registers like dq_mode, memory like b_mode. */
363 #define dqd_mode 19 /* registers like dq_mode, memory like d_mode. */
364
365 #define es_reg 100
366 #define cs_reg 101
367 #define ss_reg 102
368 #define ds_reg 103
369 #define fs_reg 104
370 #define gs_reg 105
371
372 #define eAX_reg 108
373 #define eCX_reg 109
374 #define eDX_reg 110
375 #define eBX_reg 111
376 #define eSP_reg 112
377 #define eBP_reg 113
378 #define eSI_reg 114
379 #define eDI_reg 115
380
381 #define al_reg 116
382 #define cl_reg 117
383 #define dl_reg 118
384 #define bl_reg 119
385 #define ah_reg 120
386 #define ch_reg 121
387 #define dh_reg 122
388 #define bh_reg 123
389
390 #define ax_reg 124
391 #define cx_reg 125
392 #define dx_reg 126
393 #define bx_reg 127
394 #define sp_reg 128
395 #define bp_reg 129
396 #define si_reg 130
397 #define di_reg 131
398
399 #define rAX_reg 132
400 #define rCX_reg 133
401 #define rDX_reg 134
402 #define rBX_reg 135
403 #define rSP_reg 136
404 #define rBP_reg 137
405 #define rSI_reg 138
406 #define rDI_reg 139
407
408 #define z_mode_ax_reg 149
409 #define indir_dx_reg 150
410
411 #define FLOATCODE 1
412 #define USE_GROUPS 2
413 #define USE_PREFIX_USER_TABLE 3
414 #define X86_64_SPECIAL 4
415 #define IS_3BYTE_OPCODE 5
416 #define USE_OPC_EXT_TABLE 6
417 #define USE_OPC_EXT_RM_TABLE 7
418
419 #define FLOAT NULL, { { NULL, FLOATCODE } }
420
421 #define GRP1a NULL, { { NULL, USE_GROUPS }, { NULL, 0 } }
422 #define GRP1b NULL, { { NULL, USE_GROUPS }, { NULL, 1 } }
423 #define GRP1S NULL, { { NULL, USE_GROUPS }, { NULL, 2 } }
424 #define GRP1Ss NULL, { { NULL, USE_GROUPS }, { NULL, 3 } }
425 #define GRP2b NULL, { { NULL, USE_GROUPS }, { NULL, 4 } }
426 #define GRP2S NULL, { { NULL, USE_GROUPS }, { NULL, 5 } }
427 #define GRP2b_one NULL, { { NULL, USE_GROUPS }, { NULL, 6 } }
428 #define GRP2S_one NULL, { { NULL, USE_GROUPS }, { NULL, 7 } }
429 #define GRP2b_cl NULL, { { NULL, USE_GROUPS }, { NULL, 8 } }
430 #define GRP2S_cl NULL, { { NULL, USE_GROUPS }, { NULL, 9 } }
431 #define GRP3b NULL, { { NULL, USE_GROUPS }, { NULL, 10 } }
432 #define GRP3S NULL, { { NULL, USE_GROUPS }, { NULL, 11 } }
433 #define GRP4 NULL, { { NULL, USE_GROUPS }, { NULL, 12 } }
434 #define GRP5 NULL, { { NULL, USE_GROUPS }, { NULL, 13 } }
435 #define GRP6 NULL, { { NULL, USE_GROUPS }, { NULL, 14 } }
436 #define GRP7 NULL, { { NULL, USE_GROUPS }, { NULL, 15 } }
437 #define GRP8 NULL, { { NULL, USE_GROUPS }, { NULL, 16 } }
438 #define GRP9 NULL, { { NULL, USE_GROUPS }, { NULL, 17 } }
439 #define GRP11_C6 NULL, { { NULL, USE_GROUPS }, { NULL, 18 } }
440 #define GRP11_C7 NULL, { { NULL, USE_GROUPS }, { NULL, 19 } }
441 #define GRP12 NULL, { { NULL, USE_GROUPS }, { NULL, 20 } }
442 #define GRP13 NULL, { { NULL, USE_GROUPS }, { NULL, 21 } }
443 #define GRP14 NULL, { { NULL, USE_GROUPS }, { NULL, 22 } }
444 #define GRP15 NULL, { { NULL, USE_GROUPS }, { NULL, 23 } }
445 #define GRP16 NULL, { { NULL, USE_GROUPS }, { NULL, 24 } }
446 #define GRPAMD NULL, { { NULL, USE_GROUPS }, { NULL, 25 } }
447 #define GRPPADLCK1 NULL, { { NULL, USE_GROUPS }, { NULL, 26 } }
448 #define GRPPADLCK2 NULL, { { NULL, USE_GROUPS }, { NULL, 27 } }
449
450 #define PREGRP0 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 0 } }
451 #define PREGRP1 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 1 } }
452 #define PREGRP2 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 2 } }
453 #define PREGRP3 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 3 } }
454 #define PREGRP4 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 4 } }
455 #define PREGRP5 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 5 } }
456 #define PREGRP6 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 6 } }
457 #define PREGRP7 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 7 } }
458 #define PREGRP8 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 8 } }
459 #define PREGRP9 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 9 } }
460 #define PREGRP10 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 10 } }
461 #define PREGRP11 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 11 } }
462 #define PREGRP12 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 12 } }
463 #define PREGRP13 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 13 } }
464 #define PREGRP14 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 14 } }
465 #define PREGRP15 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 15 } }
466 #define PREGRP16 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 16 } }
467 #define PREGRP17 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 17 } }
468 #define PREGRP18 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 18 } }
469 #define PREGRP19 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 19 } }
470 #define PREGRP20 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 20 } }
471 #define PREGRP21 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 21 } }
472 #define PREGRP22 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 22 } }
473 #define PREGRP23 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 23 } }
474 #define PREGRP24 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 24 } }
475 #define PREGRP25 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 25 } }
476 #define PREGRP26 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 26 } }
477 #define PREGRP27 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 27 } }
478 #define PREGRP28 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 28 } }
479 #define PREGRP29 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 29 } }
480 #define PREGRP30 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 30 } }
481 #define PREGRP31 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 31 } }
482 #define PREGRP32 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 32 } }
483 #define PREGRP33 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 33 } }
484 #define PREGRP34 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 34 } }
485 #define PREGRP35 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 35 } }
486 #define PREGRP36 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 36 } }
487 #define PREGRP37 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 37 } }
488 #define PREGRP38 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 38 } }
489 #define PREGRP39 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 39 } }
490 #define PREGRP40 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 40 } }
491 #define PREGRP41 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 41 } }
492 #define PREGRP42 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 42 } }
493 #define PREGRP43 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 43 } }
494 #define PREGRP44 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 44 } }
495 #define PREGRP45 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 45 } }
496 #define PREGRP46 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 46 } }
497 #define PREGRP47 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 47 } }
498 #define PREGRP48 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 48 } }
499 #define PREGRP49 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 49 } }
500 #define PREGRP50 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 50 } }
501 #define PREGRP51 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 51 } }
502 #define PREGRP52 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 52 } }
503 #define PREGRP53 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 53 } }
504 #define PREGRP54 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 54 } }
505 #define PREGRP55 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 55 } }
506 #define PREGRP56 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 56 } }
507 #define PREGRP57 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 57 } }
508 #define PREGRP58 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 58 } }
509 #define PREGRP59 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 59 } }
510 #define PREGRP60 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 60 } }
511 #define PREGRP61 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 61 } }
512 #define PREGRP62 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 62 } }
513 #define PREGRP63 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 63 } }
514 #define PREGRP64 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 64 } }
515 #define PREGRP65 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 65 } }
516 #define PREGRP66 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 66 } }
517 #define PREGRP67 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 67 } }
518 #define PREGRP68 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 68 } }
519 #define PREGRP69 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 69 } }
520 #define PREGRP70 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 70 } }
521 #define PREGRP71 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 71 } }
522 #define PREGRP72 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 72 } }
523 #define PREGRP73 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 73 } }
524 #define PREGRP74 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 74 } }
525 #define PREGRP75 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 75 } }
526 #define PREGRP76 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 76 } }
527 #define PREGRP77 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 77 } }
528 #define PREGRP78 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 78 } }
529 #define PREGRP79 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 79 } }
530 #define PREGRP80 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 80 } }
531 #define PREGRP81 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 81 } }
532 #define PREGRP82 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 82 } }
533 #define PREGRP83 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 83 } }
534 #define PREGRP84 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 84 } }
535 #define PREGRP85 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 85 } }
536 #define PREGRP86 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 86 } }
537 #define PREGRP87 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 87 } }
538 #define PREGRP88 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 88 } }
539 #define PREGRP89 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 89 } }
540 #define PREGRP90 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 90 } }
541 #define PREGRP91 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 91 } }
542 #define PREGRP92 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 92 } }
543 #define PREGRP93 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 93 } }
544 #define PREGRP94 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 94 } }
545 #define PREGRP95 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 95 } }
546 #define PREGRP96 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 96 } }
547 #define PREGRP97 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 97 } }
548 #define PREGRP98 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 98 } }
549 #define PREGRP99 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 99 } }
550 #define PREGRP100 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 100 } }
551
552
553 #define X86_64_0 NULL, { { NULL, X86_64_SPECIAL }, { NULL, 0 } }
554 #define X86_64_1 NULL, { { NULL, X86_64_SPECIAL }, { NULL, 1 } }
555 #define X86_64_2 NULL, { { NULL, X86_64_SPECIAL }, { NULL, 2 } }
556 #define X86_64_3 NULL, { { NULL, X86_64_SPECIAL }, { NULL, 3 } }
557
558 #define THREE_BYTE_0 NULL, { { NULL, IS_3BYTE_OPCODE }, { NULL, 0 } }
559 #define THREE_BYTE_1 NULL, { { NULL, IS_3BYTE_OPCODE }, { NULL, 1 } }
560
561 #define OPC_EXT_0 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 0 } }
562 #define OPC_EXT_1 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 1 } }
563 #define OPC_EXT_2 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 2 } }
564 #define OPC_EXT_3 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 3 } }
565 #define OPC_EXT_4 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 4 } }
566 #define OPC_EXT_5 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 5 } }
567 #define OPC_EXT_6 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 6 } }
568 #define OPC_EXT_7 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 7 } }
569 #define OPC_EXT_8 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 8 } }
570 #define OPC_EXT_9 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 9 } }
571 #define OPC_EXT_10 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 10 } }
572 #define OPC_EXT_11 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 11 } }
573 #define OPC_EXT_12 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 12 } }
574 #define OPC_EXT_13 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 13 } }
575 #define OPC_EXT_14 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 14 } }
576 #define OPC_EXT_15 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 15 } }
577 #define OPC_EXT_16 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 16 } }
578 #define OPC_EXT_17 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 17 } }
579 #define OPC_EXT_18 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 18 } }
580 #define OPC_EXT_19 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 19 } }
581 #define OPC_EXT_20 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 20 } }
582 #define OPC_EXT_21 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 21 } }
583 #define OPC_EXT_22 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 22 } }
584 #define OPC_EXT_23 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 23 } }
585 #define OPC_EXT_24 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 24 } }
586 #define OPC_EXT_25 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 25 } }
587 #define OPC_EXT_26 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 26 } }
588 #define OPC_EXT_27 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 27 } }
589 #define OPC_EXT_28 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 28 } }
590 #define OPC_EXT_29 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 29 } }
591 #define OPC_EXT_30 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 30 } }
592 #define OPC_EXT_31 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 31 } }
593 #define OPC_EXT_32 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 32 } }
594 #define OPC_EXT_33 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 33 } }
595 #define OPC_EXT_34 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 34 } }
596 #define OPC_EXT_35 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 35 } }
597 #define OPC_EXT_36 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 36 } }
598 #define OPC_EXT_37 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 37 } }
599
600 #define OPC_EXT_RM_0 NULL, { { NULL, USE_OPC_EXT_RM_TABLE }, { NULL, 0 } }
601 #define OPC_EXT_RM_1 NULL, { { NULL, USE_OPC_EXT_RM_TABLE }, { NULL, 1 } }
602 #define OPC_EXT_RM_2 NULL, { { NULL, USE_OPC_EXT_RM_TABLE }, { NULL, 2 } }
603 #define OPC_EXT_RM_3 NULL, { { NULL, USE_OPC_EXT_RM_TABLE }, { NULL, 3 } }
604 #define OPC_EXT_RM_4 NULL, { { NULL, USE_OPC_EXT_RM_TABLE }, { NULL, 4 } }
605
606 typedef void (*op_rtn) (int bytemode, int sizeflag);
607
608 struct dis386 {
609 const char *name;
610 struct
611 {
612 op_rtn rtn;
613 int bytemode;
614 } op[MAX_OPERANDS];
615 };
616
617 /* Upper case letters in the instruction names here are macros.
618 'A' => print 'b' if no register operands or suffix_always is true
619 'B' => print 'b' if suffix_always is true
620 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
621 . size prefix
622 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
623 . suffix_always is true
624 'E' => print 'e' if 32-bit form of jcxz
625 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
626 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
627 'H' => print ",pt" or ",pn" branch hint
628 'I' => honor following macro letter even in Intel mode (implemented only
629 . for some of the macro letters)
630 'J' => print 'l'
631 'K' => print 'd' or 'q' if rex prefix is present.
632 'L' => print 'l' if suffix_always is true
633 'N' => print 'n' if instruction has no wait "prefix"
634 'O' => print 'd' or 'o' (or 'q' in Intel mode)
635 'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
636 . or suffix_always is true. print 'q' if rex prefix is present.
637 'Q' => print 'w', 'l' or 'q' if no register operands or suffix_always
638 . is true
639 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
640 'S' => print 'w', 'l' or 'q' if suffix_always is true
641 'T' => print 'q' in 64bit mode and behave as 'P' otherwise
642 'U' => print 'q' in 64bit mode and behave as 'Q' otherwise
643 'V' => print 'q' in 64bit mode and behave as 'S' otherwise
644 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
645 'X' => print 's', 'd' depending on data16 prefix (for XMM)
646 'Y' => 'q' if instruction has an REX 64bit overwrite prefix
647 'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
648
649 Many of the above letters print nothing in Intel mode. See "putop"
650 for the details.
651
652 Braces '{' and '}', and vertical bars '|', indicate alternative
653 mnemonic strings for AT&T, Intel, X86_64 AT&T, and X86_64 Intel
654 modes. In cases where there are only two alternatives, the X86_64
655 instruction is reserved, and "(bad)" is printed.
656 */
657
658 static const struct dis386 dis386[] = {
659 /* 00 */
660 { "addB", { Eb, Gb } },
661 { "addS", { Ev, Gv } },
662 { "addB", { Gb, Eb } },
663 { "addS", { Gv, Ev } },
664 { "addB", { AL, Ib } },
665 { "addS", { eAX, Iv } },
666 { "push{T|}", { es } },
667 { "pop{T|}", { es } },
668 /* 08 */
669 { "orB", { Eb, Gb } },
670 { "orS", { Ev, Gv } },
671 { "orB", { Gb, Eb } },
672 { "orS", { Gv, Ev } },
673 { "orB", { AL, Ib } },
674 { "orS", { eAX, Iv } },
675 { "push{T|}", { cs } },
676 { "(bad)", { XX } }, /* 0x0f extended opcode escape */
677 /* 10 */
678 { "adcB", { Eb, Gb } },
679 { "adcS", { Ev, Gv } },
680 { "adcB", { Gb, Eb } },
681 { "adcS", { Gv, Ev } },
682 { "adcB", { AL, Ib } },
683 { "adcS", { eAX, Iv } },
684 { "push{T|}", { ss } },
685 { "pop{T|}", { ss } },
686 /* 18 */
687 { "sbbB", { Eb, Gb } },
688 { "sbbS", { Ev, Gv } },
689 { "sbbB", { Gb, Eb } },
690 { "sbbS", { Gv, Ev } },
691 { "sbbB", { AL, Ib } },
692 { "sbbS", { eAX, Iv } },
693 { "push{T|}", { ds } },
694 { "pop{T|}", { ds } },
695 /* 20 */
696 { "andB", { Eb, Gb } },
697 { "andS", { Ev, Gv } },
698 { "andB", { Gb, Eb } },
699 { "andS", { Gv, Ev } },
700 { "andB", { AL, Ib } },
701 { "andS", { eAX, Iv } },
702 { "(bad)", { XX } }, /* SEG ES prefix */
703 { "daa{|}", { XX } },
704 /* 28 */
705 { "subB", { Eb, Gb } },
706 { "subS", { Ev, Gv } },
707 { "subB", { Gb, Eb } },
708 { "subS", { Gv, Ev } },
709 { "subB", { AL, Ib } },
710 { "subS", { eAX, Iv } },
711 { "(bad)", { XX } }, /* SEG CS prefix */
712 { "das{|}", { XX } },
713 /* 30 */
714 { "xorB", { Eb, Gb } },
715 { "xorS", { Ev, Gv } },
716 { "xorB", { Gb, Eb } },
717 { "xorS", { Gv, Ev } },
718 { "xorB", { AL, Ib } },
719 { "xorS", { eAX, Iv } },
720 { "(bad)", { XX } }, /* SEG SS prefix */
721 { "aaa{|}", { XX } },
722 /* 38 */
723 { "cmpB", { Eb, Gb } },
724 { "cmpS", { Ev, Gv } },
725 { "cmpB", { Gb, Eb } },
726 { "cmpS", { Gv, Ev } },
727 { "cmpB", { AL, Ib } },
728 { "cmpS", { eAX, Iv } },
729 { "(bad)", { XX } }, /* SEG DS prefix */
730 { "aas{|}", { XX } },
731 /* 40 */
732 { "inc{S|}", { RMeAX } },
733 { "inc{S|}", { RMeCX } },
734 { "inc{S|}", { RMeDX } },
735 { "inc{S|}", { RMeBX } },
736 { "inc{S|}", { RMeSP } },
737 { "inc{S|}", { RMeBP } },
738 { "inc{S|}", { RMeSI } },
739 { "inc{S|}", { RMeDI } },
740 /* 48 */
741 { "dec{S|}", { RMeAX } },
742 { "dec{S|}", { RMeCX } },
743 { "dec{S|}", { RMeDX } },
744 { "dec{S|}", { RMeBX } },
745 { "dec{S|}", { RMeSP } },
746 { "dec{S|}", { RMeBP } },
747 { "dec{S|}", { RMeSI } },
748 { "dec{S|}", { RMeDI } },
749 /* 50 */
750 { "pushV", { RMrAX } },
751 { "pushV", { RMrCX } },
752 { "pushV", { RMrDX } },
753 { "pushV", { RMrBX } },
754 { "pushV", { RMrSP } },
755 { "pushV", { RMrBP } },
756 { "pushV", { RMrSI } },
757 { "pushV", { RMrDI } },
758 /* 58 */
759 { "popV", { RMrAX } },
760 { "popV", { RMrCX } },
761 { "popV", { RMrDX } },
762 { "popV", { RMrBX } },
763 { "popV", { RMrSP } },
764 { "popV", { RMrBP } },
765 { "popV", { RMrSI } },
766 { "popV", { RMrDI } },
767 /* 60 */
768 { X86_64_0 },
769 { X86_64_1 },
770 { X86_64_2 },
771 { X86_64_3 },
772 { "(bad)", { XX } }, /* seg fs */
773 { "(bad)", { XX } }, /* seg gs */
774 { "(bad)", { XX } }, /* op size prefix */
775 { "(bad)", { XX } }, /* adr size prefix */
776 /* 68 */
777 { "pushT", { Iq } },
778 { "imulS", { Gv, Ev, Iv } },
779 { "pushT", { sIb } },
780 { "imulS", { Gv, Ev, sIb } },
781 { "ins{b||b|}", { Ybr, indirDX } },
782 { "ins{R||G|}", { Yzr, indirDX } },
783 { "outs{b||b|}", { indirDXr, Xb } },
784 { "outs{R||G|}", { indirDXr, Xz } },
785 /* 70 */
786 { "joH", { Jb, XX, cond_jump_flag } },
787 { "jnoH", { Jb, XX, cond_jump_flag } },
788 { "jbH", { Jb, XX, cond_jump_flag } },
789 { "jaeH", { Jb, XX, cond_jump_flag } },
790 { "jeH", { Jb, XX, cond_jump_flag } },
791 { "jneH", { Jb, XX, cond_jump_flag } },
792 { "jbeH", { Jb, XX, cond_jump_flag } },
793 { "jaH", { Jb, XX, cond_jump_flag } },
794 /* 78 */
795 { "jsH", { Jb, XX, cond_jump_flag } },
796 { "jnsH", { Jb, XX, cond_jump_flag } },
797 { "jpH", { Jb, XX, cond_jump_flag } },
798 { "jnpH", { Jb, XX, cond_jump_flag } },
799 { "jlH", { Jb, XX, cond_jump_flag } },
800 { "jgeH", { Jb, XX, cond_jump_flag } },
801 { "jleH", { Jb, XX, cond_jump_flag } },
802 { "jgH", { Jb, XX, cond_jump_flag } },
803 /* 80 */
804 { GRP1b },
805 { GRP1S },
806 { "(bad)", { XX } },
807 { GRP1Ss },
808 { "testB", { Eb, Gb } },
809 { "testS", { Ev, Gv } },
810 { "xchgB", { Eb, Gb } },
811 { "xchgS", { Ev, Gv } },
812 /* 88 */
813 { "movB", { Eb, Gb } },
814 { "movS", { Ev, Gv } },
815 { "movB", { Gb, Eb } },
816 { "movS", { Gv, Ev } },
817 { "movD", { Sv, Sw } },
818 { OPC_EXT_0 },
819 { "movD", { Sw, Sv } },
820 { GRP1a },
821 /* 90 */
822 { PREGRP38 },
823 { "xchgS", { RMeCX, eAX } },
824 { "xchgS", { RMeDX, eAX } },
825 { "xchgS", { RMeBX, eAX } },
826 { "xchgS", { RMeSP, eAX } },
827 { "xchgS", { RMeBP, eAX } },
828 { "xchgS", { RMeSI, eAX } },
829 { "xchgS", { RMeDI, eAX } },
830 /* 98 */
831 { "cW{t||t|}R", { XX } },
832 { "cR{t||t|}O", { XX } },
833 { "Jcall{T|}", { Ap } },
834 { "(bad)", { XX } }, /* fwait */
835 { "pushfT", { XX } },
836 { "popfT", { XX } },
837 { "sahf{|}", { XX } },
838 { "lahf{|}", { XX } },
839 /* a0 */
840 { "movB", { AL, Ob } },
841 { "movS", { eAX, Ov } },
842 { "movB", { Ob, AL } },
843 { "movS", { Ov, eAX } },
844 { "movs{b||b|}", { Ybr, Xb } },
845 { "movs{R||R|}", { Yvr, Xv } },
846 { "cmps{b||b|}", { Xb, Yb } },
847 { "cmps{R||R|}", { Xv, Yv } },
848 /* a8 */
849 { "testB", { AL, Ib } },
850 { "testS", { eAX, Iv } },
851 { "stosB", { Ybr, AL } },
852 { "stosS", { Yvr, eAX } },
853 { "lodsB", { ALr, Xb } },
854 { "lodsS", { eAXr, Xv } },
855 { "scasB", { AL, Yb } },
856 { "scasS", { eAX, Yv } },
857 /* b0 */
858 { "movB", { RMAL, Ib } },
859 { "movB", { RMCL, Ib } },
860 { "movB", { RMDL, Ib } },
861 { "movB", { RMBL, Ib } },
862 { "movB", { RMAH, Ib } },
863 { "movB", { RMCH, Ib } },
864 { "movB", { RMDH, Ib } },
865 { "movB", { RMBH, Ib } },
866 /* b8 */
867 { "movS", { RMeAX, Iv64 } },
868 { "movS", { RMeCX, Iv64 } },
869 { "movS", { RMeDX, Iv64 } },
870 { "movS", { RMeBX, Iv64 } },
871 { "movS", { RMeSP, Iv64 } },
872 { "movS", { RMeBP, Iv64 } },
873 { "movS", { RMeSI, Iv64 } },
874 { "movS", { RMeDI, Iv64 } },
875 /* c0 */
876 { GRP2b },
877 { GRP2S },
878 { "retT", { Iw } },
879 { "retT", { XX } },
880 { OPC_EXT_1 },
881 { OPC_EXT_2 },
882 { GRP11_C6 },
883 { GRP11_C7 },
884 /* c8 */
885 { "enterT", { Iw, Ib } },
886 { "leaveT", { XX } },
887 { "lretP", { Iw } },
888 { "lretP", { XX } },
889 { "int3", { XX } },
890 { "int", { Ib } },
891 { "into{|}", { XX } },
892 { "iretP", { XX } },
893 /* d0 */
894 { GRP2b_one },
895 { GRP2S_one },
896 { GRP2b_cl },
897 { GRP2S_cl },
898 { "aam{|}", { sIb } },
899 { "aad{|}", { sIb } },
900 { "(bad)", { XX } },
901 { "xlat", { DSBX } },
902 /* d8 */
903 { FLOAT },
904 { FLOAT },
905 { FLOAT },
906 { FLOAT },
907 { FLOAT },
908 { FLOAT },
909 { FLOAT },
910 { FLOAT },
911 /* e0 */
912 { "loopneFH", { Jb, XX, loop_jcxz_flag } },
913 { "loopeFH", { Jb, XX, loop_jcxz_flag } },
914 { "loopFH", { Jb, XX, loop_jcxz_flag } },
915 { "jEcxzH", { Jb, XX, loop_jcxz_flag } },
916 { "inB", { AL, Ib } },
917 { "inG", { zAX, Ib } },
918 { "outB", { Ib, AL } },
919 { "outG", { Ib, zAX } },
920 /* e8 */
921 { "callT", { Jv } },
922 { "jmpT", { Jv } },
923 { "Jjmp{T|}", { Ap } },
924 { "jmp", { Jb } },
925 { "inB", { AL, indirDX } },
926 { "inG", { zAX, indirDX } },
927 { "outB", { indirDX, AL } },
928 { "outG", { indirDX, zAX } },
929 /* f0 */
930 { "(bad)", { XX } }, /* lock prefix */
931 { "icebp", { XX } },
932 { "(bad)", { XX } }, /* repne */
933 { "(bad)", { XX } }, /* repz */
934 { "hlt", { XX } },
935 { "cmc", { XX } },
936 { GRP3b },
937 { GRP3S },
938 /* f8 */
939 { "clc", { XX } },
940 { "stc", { XX } },
941 { "cli", { XX } },
942 { "sti", { XX } },
943 { "cld", { XX } },
944 { "std", { XX } },
945 { GRP4 },
946 { GRP5 },
947 };
948
949 static const struct dis386 dis386_twobyte[] = {
950 /* 00 */
951 { GRP6 },
952 { GRP7 },
953 { "larS", { Gv, Ew } },
954 { "lslS", { Gv, Ew } },
955 { "(bad)", { XX } },
956 { "syscall", { XX } },
957 { "clts", { XX } },
958 { "sysretP", { XX } },
959 /* 08 */
960 { "invd", { XX } },
961 { "wbinvd", { XX } },
962 { "(bad)", { XX } },
963 { "ud2a", { XX } },
964 { "(bad)", { XX } },
965 { GRPAMD },
966 { "femms", { XX } },
967 { "", { MX, EM, OPSUF } }, /* See OP_3DNowSuffix. */
968 /* 10 */
969 { PREGRP8 },
970 { PREGRP9 },
971 { PREGRP30 },
972 { OPC_EXT_34 },
973 { "unpcklpX", { XM, EXq } },
974 { "unpckhpX", { XM, EXq } },
975 { PREGRP31 },
976 { OPC_EXT_35 },
977 /* 18 */
978 { GRP16 },
979 { "(bad)", { XX } },
980 { "(bad)", { XX } },
981 { "(bad)", { XX } },
982 { "(bad)", { XX } },
983 { "(bad)", { XX } },
984 { "(bad)", { XX } },
985 { "nopQ", { Ev } },
986 /* 20 */
987 { "movZ", { Rm, Cm } },
988 { "movZ", { Rm, Dm } },
989 { "movZ", { Cm, Rm } },
990 { "movZ", { Dm, Rm } },
991 { "movL", { Rd, Td } },
992 { "(bad)", { XX } },
993 { "movL", { Td, Rd } },
994 { "(bad)", { XX } },
995 /* 28 */
996 { "movapX", { XM, EXx } },
997 { "movapX", { EXx, XM } },
998 { PREGRP2 },
999 { PREGRP33 },
1000 { PREGRP4 },
1001 { PREGRP3 },
1002 { PREGRP93 },
1003 { PREGRP94 },
1004 /* 30 */
1005 { "wrmsr", { XX } },
1006 { "rdtsc", { XX } },
1007 { "rdmsr", { XX } },
1008 { "rdpmc", { XX } },
1009 { "sysenter", { XX } },
1010 { "sysexit", { XX } },
1011 { "(bad)", { XX } },
1012 { "(bad)", { XX } },
1013 /* 38 */
1014 { THREE_BYTE_0 },
1015 { "(bad)", { XX } },
1016 { THREE_BYTE_1 },
1017 { "(bad)", { XX } },
1018 { "(bad)", { XX } },
1019 { "(bad)", { XX } },
1020 { "(bad)", { XX } },
1021 { "(bad)", { XX } },
1022 /* 40 */
1023 { "cmovo", { Gv, Ev } },
1024 { "cmovno", { Gv, Ev } },
1025 { "cmovb", { Gv, Ev } },
1026 { "cmovae", { Gv, Ev } },
1027 { "cmove", { Gv, Ev } },
1028 { "cmovne", { Gv, Ev } },
1029 { "cmovbe", { Gv, Ev } },
1030 { "cmova", { Gv, Ev } },
1031 /* 48 */
1032 { "cmovs", { Gv, Ev } },
1033 { "cmovns", { Gv, Ev } },
1034 { "cmovp", { Gv, Ev } },
1035 { "cmovnp", { Gv, Ev } },
1036 { "cmovl", { Gv, Ev } },
1037 { "cmovge", { Gv, Ev } },
1038 { "cmovle", { Gv, Ev } },
1039 { "cmovg", { Gv, Ev } },
1040 /* 50 */
1041 { "movmskpX", { Gdq, XS } },
1042 { PREGRP13 },
1043 { PREGRP12 },
1044 { PREGRP11 },
1045 { "andpX", { XM, EXx } },
1046 { "andnpX", { XM, EXx } },
1047 { "orpX", { XM, EXx } },
1048 { "xorpX", { XM, EXx } },
1049 /* 58 */
1050 { PREGRP0 },
1051 { PREGRP10 },
1052 { PREGRP17 },
1053 { PREGRP16 },
1054 { PREGRP14 },
1055 { PREGRP7 },
1056 { PREGRP5 },
1057 { PREGRP6 },
1058 /* 60 */
1059 { PREGRP95 },
1060 { PREGRP96 },
1061 { PREGRP97 },
1062 { "packsswb", { MX, EM } },
1063 { "pcmpgtb", { MX, EM } },
1064 { "pcmpgtw", { MX, EM } },
1065 { "pcmpgtd", { MX, EM } },
1066 { "packuswb", { MX, EM } },
1067 /* 68 */
1068 { "punpckhbw", { MX, EM } },
1069 { "punpckhwd", { MX, EM } },
1070 { "punpckhdq", { MX, EM } },
1071 { "packssdw", { MX, EM } },
1072 { PREGRP26 },
1073 { PREGRP24 },
1074 { "movK", { MX, Edq } },
1075 { PREGRP19 },
1076 /* 70 */
1077 { PREGRP22 },
1078 { GRP12 },
1079 { GRP13 },
1080 { GRP14 },
1081 { "pcmpeqb", { MX, EM } },
1082 { "pcmpeqw", { MX, EM } },
1083 { "pcmpeqd", { MX, EM } },
1084 { "emms", { XX } },
1085 /* 78 */
1086 { PREGRP34 },
1087 { PREGRP35 },
1088 { "(bad)", { XX } },
1089 { "(bad)", { XX } },
1090 { PREGRP28 },
1091 { PREGRP29 },
1092 { PREGRP23 },
1093 { PREGRP20 },
1094 /* 80 */
1095 { "joH", { Jv, XX, cond_jump_flag } },
1096 { "jnoH", { Jv, XX, cond_jump_flag } },
1097 { "jbH", { Jv, XX, cond_jump_flag } },
1098 { "jaeH", { Jv, XX, cond_jump_flag } },
1099 { "jeH", { Jv, XX, cond_jump_flag } },
1100 { "jneH", { Jv, XX, cond_jump_flag } },
1101 { "jbeH", { Jv, XX, cond_jump_flag } },
1102 { "jaH", { Jv, XX, cond_jump_flag } },
1103 /* 88 */
1104 { "jsH", { Jv, XX, cond_jump_flag } },
1105 { "jnsH", { Jv, XX, cond_jump_flag } },
1106 { "jpH", { Jv, XX, cond_jump_flag } },
1107 { "jnpH", { Jv, XX, cond_jump_flag } },
1108 { "jlH", { Jv, XX, cond_jump_flag } },
1109 { "jgeH", { Jv, XX, cond_jump_flag } },
1110 { "jleH", { Jv, XX, cond_jump_flag } },
1111 { "jgH", { Jv, XX, cond_jump_flag } },
1112 /* 90 */
1113 { "seto", { Eb } },
1114 { "setno", { Eb } },
1115 { "setb", { Eb } },
1116 { "setae", { Eb } },
1117 { "sete", { Eb } },
1118 { "setne", { Eb } },
1119 { "setbe", { Eb } },
1120 { "seta", { Eb } },
1121 /* 98 */
1122 { "sets", { Eb } },
1123 { "setns", { Eb } },
1124 { "setp", { Eb } },
1125 { "setnp", { Eb } },
1126 { "setl", { Eb } },
1127 { "setge", { Eb } },
1128 { "setle", { Eb } },
1129 { "setg", { Eb } },
1130 /* a0 */
1131 { "pushT", { fs } },
1132 { "popT", { fs } },
1133 { "cpuid", { XX } },
1134 { "btS", { Ev, Gv } },
1135 { "shldS", { Ev, Gv, Ib } },
1136 { "shldS", { Ev, Gv, CL } },
1137 { GRPPADLCK2 },
1138 { GRPPADLCK1 },
1139 /* a8 */
1140 { "pushT", { gs } },
1141 { "popT", { gs } },
1142 { "rsm", { XX } },
1143 { "btsS", { Ev, Gv } },
1144 { "shrdS", { Ev, Gv, Ib } },
1145 { "shrdS", { Ev, Gv, CL } },
1146 { GRP15 },
1147 { "imulS", { Gv, Ev } },
1148 /* b0 */
1149 { "cmpxchgB", { Eb, Gb } },
1150 { "cmpxchgS", { Ev, Gv } },
1151 { OPC_EXT_3 },
1152 { "btrS", { Ev, Gv } },
1153 { OPC_EXT_4 },
1154 { OPC_EXT_5 },
1155 { "movz{bR|x|bR|x}", { Gv, Eb } },
1156 { "movz{wR|x|wR|x}", { Gv, Ew } }, /* yes, there really is movzww ! */
1157 /* b8 */
1158 { PREGRP37 },
1159 { "ud2b", { XX } },
1160 { GRP8 },
1161 { "btcS", { Ev, Gv } },
1162 { "bsfS", { Gv, Ev } },
1163 { PREGRP36 },
1164 { "movs{bR|x|bR|x}", { Gv, Eb } },
1165 { "movs{wR|x|wR|x}", { Gv, Ew } }, /* yes, there really is movsww ! */
1166 /* c0 */
1167 { "xaddB", { Eb, Gb } },
1168 { "xaddS", { Ev, Gv } },
1169 { PREGRP1 },
1170 { "movntiS", { Ev, Gv } },
1171 { "pinsrw", { MX, Edqw, Ib } },
1172 { "pextrw", { Gdq, MS, Ib } },
1173 { "shufpX", { XM, EXx, Ib } },
1174 { GRP9 },
1175 /* c8 */
1176 { "bswap", { RMeAX } },
1177 { "bswap", { RMeCX } },
1178 { "bswap", { RMeDX } },
1179 { "bswap", { RMeBX } },
1180 { "bswap", { RMeSP } },
1181 { "bswap", { RMeBP } },
1182 { "bswap", { RMeSI } },
1183 { "bswap", { RMeDI } },
1184 /* d0 */
1185 { PREGRP27 },
1186 { "psrlw", { MX, EM } },
1187 { "psrld", { MX, EM } },
1188 { "psrlq", { MX, EM } },
1189 { "paddq", { MX, EM } },
1190 { "pmullw", { MX, EM } },
1191 { PREGRP21 },
1192 { "pmovmskb", { Gdq, MS } },
1193 /* d8 */
1194 { "psubusb", { MX, EM } },
1195 { "psubusw", { MX, EM } },
1196 { "pminub", { MX, EM } },
1197 { "pand", { MX, EM } },
1198 { "paddusb", { MX, EM } },
1199 { "paddusw", { MX, EM } },
1200 { "pmaxub", { MX, EM } },
1201 { "pandn", { MX, EM } },
1202 /* e0 */
1203 { "pavgb", { MX, EM } },
1204 { "psraw", { MX, EM } },
1205 { "psrad", { MX, EM } },
1206 { "pavgw", { MX, EM } },
1207 { "pmulhuw", { MX, EM } },
1208 { "pmulhw", { MX, EM } },
1209 { PREGRP15 },
1210 { PREGRP25 },
1211 /* e8 */
1212 { "psubsb", { MX, EM } },
1213 { "psubsw", { MX, EM } },
1214 { "pminsw", { MX, EM } },
1215 { "por", { MX, EM } },
1216 { "paddsb", { MX, EM } },
1217 { "paddsw", { MX, EM } },
1218 { "pmaxsw", { MX, EM } },
1219 { "pxor", { MX, EM } },
1220 /* f0 */
1221 { PREGRP32 },
1222 { "psllw", { MX, EM } },
1223 { "pslld", { MX, EM } },
1224 { "psllq", { MX, EM } },
1225 { "pmuludq", { MX, EM } },
1226 { "pmaddwd", { MX, EM } },
1227 { "psadbw", { MX, EM } },
1228 { PREGRP18 },
1229 /* f8 */
1230 { "psubb", { MX, EM } },
1231 { "psubw", { MX, EM } },
1232 { "psubd", { MX, EM } },
1233 { "psubq", { MX, EM } },
1234 { "paddb", { MX, EM } },
1235 { "paddw", { MX, EM } },
1236 { "paddd", { MX, EM } },
1237 { "(bad)", { XX } },
1238 };
1239
1240 static const unsigned char onebyte_has_modrm[256] = {
1241 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1242 /* ------------------------------- */
1243 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
1244 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
1245 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
1246 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
1247 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
1248 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
1249 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
1250 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
1251 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
1252 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
1253 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
1254 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
1255 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
1256 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
1257 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
1258 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
1259 /* ------------------------------- */
1260 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1261 };
1262
1263 static const unsigned char twobyte_has_modrm[256] = {
1264 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1265 /* ------------------------------- */
1266 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
1267 /* 10 */ 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1, /* 1f */
1268 /* 20 */ 1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1, /* 2f */
1269 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
1270 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
1271 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
1272 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
1273 /* 70 */ 1,1,1,1,1,1,1,0,1,1,0,0,1,1,1,1, /* 7f */
1274 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
1275 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
1276 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
1277 /* b0 */ 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, /* bf */
1278 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
1279 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
1280 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
1281 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 /* ff */
1282 /* ------------------------------- */
1283 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1284 };
1285
1286 static char obuf[100];
1287 static char *obufp;
1288 static char scratchbuf[100];
1289 static unsigned char *start_codep;
1290 static unsigned char *insn_codep;
1291 static unsigned char *codep;
1292 static const char *lock_prefix;
1293 static const char *data_prefix;
1294 static const char *addr_prefix;
1295 static const char *repz_prefix;
1296 static const char *repnz_prefix;
1297 static disassemble_info *the_info;
1298 static struct
1299 {
1300 int mod;
1301 int reg;
1302 int rm;
1303 }
1304 modrm;
1305 static unsigned char need_modrm;
1306
1307 /* If we are accessing mod/rm/reg without need_modrm set, then the
1308 values are stale. Hitting this abort likely indicates that you
1309 need to update onebyte_has_modrm or twobyte_has_modrm. */
1310 #define MODRM_CHECK if (!need_modrm) abort ()
1311
1312 static const char **names64;
1313 static const char **names32;
1314 static const char **names16;
1315 static const char **names8;
1316 static const char **names8rex;
1317 static const char **names_seg;
1318 static const char **index16;
1319
1320 static const char *intel_names64[] = {
1321 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
1322 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
1323 };
1324 static const char *intel_names32[] = {
1325 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
1326 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
1327 };
1328 static const char *intel_names16[] = {
1329 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
1330 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
1331 };
1332 static const char *intel_names8[] = {
1333 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
1334 };
1335 static const char *intel_names8rex[] = {
1336 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
1337 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
1338 };
1339 static const char *intel_names_seg[] = {
1340 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
1341 };
1342 static const char *intel_index16[] = {
1343 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
1344 };
1345
1346 static const char *att_names64[] = {
1347 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
1348 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
1349 };
1350 static const char *att_names32[] = {
1351 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
1352 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
1353 };
1354 static const char *att_names16[] = {
1355 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
1356 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
1357 };
1358 static const char *att_names8[] = {
1359 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
1360 };
1361 static const char *att_names8rex[] = {
1362 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
1363 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
1364 };
1365 static const char *att_names_seg[] = {
1366 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
1367 };
1368 static const char *att_index16[] = {
1369 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
1370 };
1371
1372 static const struct dis386 grps[][8] = {
1373 /* GRP1a */
1374 {
1375 { "popU", { stackEv } },
1376 { "(bad)", { XX } },
1377 { "(bad)", { XX } },
1378 { "(bad)", { XX } },
1379 { "(bad)", { XX } },
1380 { "(bad)", { XX } },
1381 { "(bad)", { XX } },
1382 { "(bad)", { XX } },
1383 },
1384 /* GRP1b */
1385 {
1386 { "addA", { Eb, Ib } },
1387 { "orA", { Eb, Ib } },
1388 { "adcA", { Eb, Ib } },
1389 { "sbbA", { Eb, Ib } },
1390 { "andA", { Eb, Ib } },
1391 { "subA", { Eb, Ib } },
1392 { "xorA", { Eb, Ib } },
1393 { "cmpA", { Eb, Ib } },
1394 },
1395 /* GRP1S */
1396 {
1397 { "addQ", { Ev, Iv } },
1398 { "orQ", { Ev, Iv } },
1399 { "adcQ", { Ev, Iv } },
1400 { "sbbQ", { Ev, Iv } },
1401 { "andQ", { Ev, Iv } },
1402 { "subQ", { Ev, Iv } },
1403 { "xorQ", { Ev, Iv } },
1404 { "cmpQ", { Ev, Iv } },
1405 },
1406 /* GRP1Ss */
1407 {
1408 { "addQ", { Ev, sIb } },
1409 { "orQ", { Ev, sIb } },
1410 { "adcQ", { Ev, sIb } },
1411 { "sbbQ", { Ev, sIb } },
1412 { "andQ", { Ev, sIb } },
1413 { "subQ", { Ev, sIb } },
1414 { "xorQ", { Ev, sIb } },
1415 { "cmpQ", { Ev, sIb } },
1416 },
1417 /* GRP2b */
1418 {
1419 { "rolA", { Eb, Ib } },
1420 { "rorA", { Eb, Ib } },
1421 { "rclA", { Eb, Ib } },
1422 { "rcrA", { Eb, Ib } },
1423 { "shlA", { Eb, Ib } },
1424 { "shrA", { Eb, Ib } },
1425 { "(bad)", { XX } },
1426 { "sarA", { Eb, Ib } },
1427 },
1428 /* GRP2S */
1429 {
1430 { "rolQ", { Ev, Ib } },
1431 { "rorQ", { Ev, Ib } },
1432 { "rclQ", { Ev, Ib } },
1433 { "rcrQ", { Ev, Ib } },
1434 { "shlQ", { Ev, Ib } },
1435 { "shrQ", { Ev, Ib } },
1436 { "(bad)", { XX } },
1437 { "sarQ", { Ev, Ib } },
1438 },
1439 /* GRP2b_one */
1440 {
1441 { "rolA", { Eb, I1 } },
1442 { "rorA", { Eb, I1 } },
1443 { "rclA", { Eb, I1 } },
1444 { "rcrA", { Eb, I1 } },
1445 { "shlA", { Eb, I1 } },
1446 { "shrA", { Eb, I1 } },
1447 { "(bad)", { XX } },
1448 { "sarA", { Eb, I1 } },
1449 },
1450 /* GRP2S_one */
1451 {
1452 { "rolQ", { Ev, I1 } },
1453 { "rorQ", { Ev, I1 } },
1454 { "rclQ", { Ev, I1 } },
1455 { "rcrQ", { Ev, I1 } },
1456 { "shlQ", { Ev, I1 } },
1457 { "shrQ", { Ev, I1 } },
1458 { "(bad)", { XX } },
1459 { "sarQ", { Ev, I1 } },
1460 },
1461 /* GRP2b_cl */
1462 {
1463 { "rolA", { Eb, CL } },
1464 { "rorA", { Eb, CL } },
1465 { "rclA", { Eb, CL } },
1466 { "rcrA", { Eb, CL } },
1467 { "shlA", { Eb, CL } },
1468 { "shrA", { Eb, CL } },
1469 { "(bad)", { XX } },
1470 { "sarA", { Eb, CL } },
1471 },
1472 /* GRP2S_cl */
1473 {
1474 { "rolQ", { Ev, CL } },
1475 { "rorQ", { Ev, CL } },
1476 { "rclQ", { Ev, CL } },
1477 { "rcrQ", { Ev, CL } },
1478 { "shlQ", { Ev, CL } },
1479 { "shrQ", { Ev, CL } },
1480 { "(bad)", { XX } },
1481 { "sarQ", { Ev, CL } },
1482 },
1483 /* GRP3b */
1484 {
1485 { "testA", { Eb, Ib } },
1486 { "(bad)", { Eb } },
1487 { "notA", { Eb } },
1488 { "negA", { Eb } },
1489 { "mulA", { Eb } }, /* Don't print the implicit %al register, */
1490 { "imulA", { Eb } }, /* to distinguish these opcodes from other */
1491 { "divA", { Eb } }, /* mul/imul opcodes. Do the same for div */
1492 { "idivA", { Eb } }, /* and idiv for consistency. */
1493 },
1494 /* GRP3S */
1495 {
1496 { "testQ", { Ev, Iv } },
1497 { "(bad)", { XX } },
1498 { "notQ", { Ev } },
1499 { "negQ", { Ev } },
1500 { "mulQ", { Ev } }, /* Don't print the implicit register. */
1501 { "imulQ", { Ev } },
1502 { "divQ", { Ev } },
1503 { "idivQ", { Ev } },
1504 },
1505 /* GRP4 */
1506 {
1507 { "incA", { Eb } },
1508 { "decA", { Eb } },
1509 { "(bad)", { XX } },
1510 { "(bad)", { XX } },
1511 { "(bad)", { XX } },
1512 { "(bad)", { XX } },
1513 { "(bad)", { XX } },
1514 { "(bad)", { XX } },
1515 },
1516 /* GRP5 */
1517 {
1518 { "incQ", { Ev } },
1519 { "decQ", { Ev } },
1520 { "callT", { indirEv } },
1521 { "JcallT", { indirEp } },
1522 { "jmpT", { indirEv } },
1523 { "JjmpT", { indirEp } },
1524 { "pushU", { stackEv } },
1525 { "(bad)", { XX } },
1526 },
1527 /* GRP6 */
1528 {
1529 { "sldtD", { Sv } },
1530 { "strD", { Sv } },
1531 { "lldt", { Ew } },
1532 { "ltr", { Ew } },
1533 { "verr", { Ew } },
1534 { "verw", { Ew } },
1535 { "(bad)", { XX } },
1536 { "(bad)", { XX } },
1537 },
1538 /* GRP7 */
1539 {
1540 { OPC_EXT_6 },
1541 { OPC_EXT_7 },
1542 { OPC_EXT_8 },
1543 { "lidt{Q|Q||}", { { SVME_Fixup, 0 } } },
1544 { "smswD", { Sv } },
1545 { "(bad)", { XX } },
1546 { "lmsw", { Ew } },
1547 { "invlpg", { { INVLPG_Fixup, 0 } } },
1548 },
1549 /* GRP8 */
1550 {
1551 { "(bad)", { XX } },
1552 { "(bad)", { XX } },
1553 { "(bad)", { XX } },
1554 { "(bad)", { XX } },
1555 { "btQ", { Ev, Ib } },
1556 { "btsQ", { Ev, Ib } },
1557 { "btrQ", { Ev, Ib } },
1558 { "btcQ", { Ev, Ib } },
1559 },
1560 /* GRP9 */
1561 {
1562 { "(bad)", { XX } },
1563 { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } } },
1564 { "(bad)", { XX } },
1565 { "(bad)", { XX } },
1566 { "(bad)", { XX } },
1567 { "(bad)", { XX } },
1568 { OPC_EXT_9 },
1569 { OPC_EXT_10 },
1570 },
1571 /* GRP11_C6 */
1572 {
1573 { "movA", { Eb, Ib } },
1574 { "(bad)", { XX } },
1575 { "(bad)", { XX } },
1576 { "(bad)", { XX } },
1577 { "(bad)", { XX } },
1578 { "(bad)", { XX } },
1579 { "(bad)", { XX } },
1580 { "(bad)", { XX } },
1581 },
1582 /* GRP11_C7 */
1583 {
1584 { "movQ", { Ev, Iv } },
1585 { "(bad)", { XX } },
1586 { "(bad)", { XX } },
1587 { "(bad)", { XX } },
1588 { "(bad)", { XX } },
1589 { "(bad)", { XX } },
1590 { "(bad)", { XX } },
1591 { "(bad)", { XX } },
1592 },
1593 /* GRP12 */
1594 {
1595 { "(bad)", { XX } },
1596 { "(bad)", { XX } },
1597 { OPC_EXT_11 },
1598 { "(bad)", { XX } },
1599 { OPC_EXT_12 },
1600 { "(bad)", { XX } },
1601 { OPC_EXT_13 },
1602 { "(bad)", { XX } },
1603 },
1604 /* GRP13 */
1605 {
1606 { "(bad)", { XX } },
1607 { "(bad)", { XX } },
1608 { OPC_EXT_14 },
1609 { "(bad)", { XX } },
1610 { OPC_EXT_15 },
1611 { "(bad)", { XX } },
1612 { OPC_EXT_16 },
1613 { "(bad)", { XX } },
1614 },
1615 /* GRP14 */
1616 {
1617 { "(bad)", { XX } },
1618 { "(bad)", { XX } },
1619 { OPC_EXT_17 },
1620 { OPC_EXT_18 },
1621 { "(bad)", { XX } },
1622 { "(bad)", { XX } },
1623 { OPC_EXT_19 },
1624 { OPC_EXT_20 },
1625 },
1626 /* GRP15 */
1627 {
1628 { OPC_EXT_21 },
1629 { OPC_EXT_22 },
1630 { OPC_EXT_23 },
1631 { OPC_EXT_24 },
1632 { "(bad)", { XX } },
1633 { OPC_EXT_25 },
1634 { OPC_EXT_26 },
1635 { OPC_EXT_27 },
1636 },
1637 /* GRP16 */
1638 {
1639 { OPC_EXT_28 },
1640 { OPC_EXT_29 },
1641 { OPC_EXT_30 },
1642 { OPC_EXT_31 },
1643 { "(bad)", { XX } },
1644 { "(bad)", { XX } },
1645 { "(bad)", { XX } },
1646 { "(bad)", { XX } },
1647 },
1648 /* GRPAMD */
1649 {
1650 { "prefetch", { Eb } },
1651 { "prefetchw", { Eb } },
1652 { "(bad)", { XX } },
1653 { "(bad)", { XX } },
1654 { "(bad)", { XX } },
1655 { "(bad)", { XX } },
1656 { "(bad)", { XX } },
1657 { "(bad)", { XX } },
1658 },
1659 /* GRPPADLCK1 */
1660 {
1661 { "xstore-rng", { { OP_0f07, 0 } } },
1662 { "xcrypt-ecb", { { OP_0f07, 0 } } },
1663 { "xcrypt-cbc", { { OP_0f07, 0 } } },
1664 { "xcrypt-ctr", { { OP_0f07, 0 } } },
1665 { "xcrypt-cfb", { { OP_0f07, 0 } } },
1666 { "xcrypt-ofb", { { OP_0f07, 0 } } },
1667 { "(bad)", { { OP_0f07, 0 } } },
1668 { "(bad)", { { OP_0f07, 0 } } },
1669 },
1670 /* GRPPADLCK2 */
1671 {
1672 { "montmul", { { OP_0f07, 0 } } },
1673 { "xsha1", { { OP_0f07, 0 } } },
1674 { "xsha256", { { OP_0f07, 0 } } },
1675 { "(bad)", { { OP_0f07, 0 } } },
1676 { "(bad)", { { OP_0f07, 0 } } },
1677 { "(bad)", { { OP_0f07, 0 } } },
1678 { "(bad)", { { OP_0f07, 0 } } },
1679 { "(bad)", { { OP_0f07, 0 } } },
1680 }
1681 };
1682
1683 static const struct dis386 prefix_user_table[][4] = {
1684 /* PREGRP0 */
1685 {
1686 { "addps", { XM, EXx } },
1687 { "addss", { XM, EXd } },
1688 { "addpd", { XM, EXx } },
1689 { "addsd", { XM, EXq } },
1690 },
1691 /* PREGRP1 */
1692 {
1693 { "", { XM, EXx, OPSIMD } }, /* See OP_SIMD_SUFFIX. */
1694 { "", { XM, EXd, OPSIMD } },
1695 { "", { XM, EXx, OPSIMD } },
1696 { "", { XM, EXq, OPSIMD } },
1697 },
1698 /* PREGRP2 */
1699 {
1700 { "cvtpi2ps", { XM, EMCq } },
1701 { "cvtsi2ssY", { XM, Ev } },
1702 { "cvtpi2pd", { XM, EMCq } },
1703 { "cvtsi2sdY", { XM, Ev } },
1704 },
1705 /* PREGRP3 */
1706 {
1707 { "cvtps2pi", { MXC, EXq } },
1708 { "cvtss2siY", { Gv, EXd } },
1709 { "cvtpd2pi", { MXC, EXx } },
1710 { "cvtsd2siY", { Gv, EXq } },
1711 },
1712 /* PREGRP4 */
1713 {
1714 { "cvttps2pi", { MXC, EXq } },
1715 { "cvttss2siY", { Gv, EXd } },
1716 { "cvttpd2pi", { MXC, EXx } },
1717 { "cvttsd2siY", { Gv, EXq } },
1718 },
1719 /* PREGRP5 */
1720 {
1721 { "divps", { XM, EXx } },
1722 { "divss", { XM, EXd } },
1723 { "divpd", { XM, EXx } },
1724 { "divsd", { XM, EXq } },
1725 },
1726 /* PREGRP6 */
1727 {
1728 { "maxps", { XM, EXx } },
1729 { "maxss", { XM, EXd } },
1730 { "maxpd", { XM, EXx } },
1731 { "maxsd", { XM, EXq } },
1732 },
1733 /* PREGRP7 */
1734 {
1735 { "minps", { XM, EXx } },
1736 { "minss", { XM, EXd } },
1737 { "minpd", { XM, EXx } },
1738 { "minsd", { XM, EXq } },
1739 },
1740 /* PREGRP8 */
1741 {
1742 { "movups", { XM, EXx } },
1743 { "movss", { XM, EXd } },
1744 { "movupd", { XM, EXx } },
1745 { "movsd", { XM, EXq } },
1746 },
1747 /* PREGRP9 */
1748 {
1749 { "movups", { EXx, XM } },
1750 { "movss", { EXd, XM } },
1751 { "movupd", { EXx, XM } },
1752 { "movsd", { EXq, XM } },
1753 },
1754 /* PREGRP10 */
1755 {
1756 { "mulps", { XM, EXx } },
1757 { "mulss", { XM, EXd } },
1758 { "mulpd", { XM, EXx } },
1759 { "mulsd", { XM, EXq } },
1760 },
1761 /* PREGRP11 */
1762 {
1763 { "rcpps", { XM, EXx } },
1764 { "rcpss", { XM, EXd } },
1765 { "(bad)", { XM, EXx } },
1766 { "(bad)", { XM, EXx } },
1767 },
1768 /* PREGRP12 */
1769 {
1770 { "rsqrtps",{ XM, EXx } },
1771 { "rsqrtss",{ XM, EXd } },
1772 { "(bad)", { XM, EXx } },
1773 { "(bad)", { XM, EXx } },
1774 },
1775 /* PREGRP13 */
1776 {
1777 { "sqrtps", { XM, EXx } },
1778 { "sqrtss", { XM, EXd } },
1779 { "sqrtpd", { XM, EXx } },
1780 { "sqrtsd", { XM, EXq } },
1781 },
1782 /* PREGRP14 */
1783 {
1784 { "subps", { XM, EXx } },
1785 { "subss", { XM, EXd } },
1786 { "subpd", { XM, EXx } },
1787 { "subsd", { XM, EXq } },
1788 },
1789 /* PREGRP15 */
1790 {
1791 { "(bad)", { XM, EXx } },
1792 { "cvtdq2pd", { XM, EXq } },
1793 { "cvttpd2dq", { XM, EXx } },
1794 { "cvtpd2dq", { XM, EXx } },
1795 },
1796 /* PREGRP16 */
1797 {
1798 { "cvtdq2ps", { XM, EXx } },
1799 { "cvttps2dq", { XM, EXx } },
1800 { "cvtps2dq", { XM, EXx } },
1801 { "(bad)", { XM, EXx } },
1802 },
1803 /* PREGRP17 */
1804 {
1805 { "cvtps2pd", { XM, EXq } },
1806 { "cvtss2sd", { XM, EXd } },
1807 { "cvtpd2ps", { XM, EXx } },
1808 { "cvtsd2ss", { XM, EXq } },
1809 },
1810 /* PREGRP18 */
1811 {
1812 { "maskmovq", { MX, MS } },
1813 { "(bad)", { XM, EXx } },
1814 { "maskmovdqu", { XM, XS } },
1815 { "(bad)", { XM, EXx } },
1816 },
1817 /* PREGRP19 */
1818 {
1819 { "movq", { MX, EM } },
1820 { "movdqu", { XM, EXx } },
1821 { "movdqa", { XM, EXx } },
1822 { "(bad)", { XM, EXx } },
1823 },
1824 /* PREGRP20 */
1825 {
1826 { "movq", { EM, MX } },
1827 { "movdqu", { EXx, XM } },
1828 { "movdqa", { EXx, XM } },
1829 { "(bad)", { EXx, XM } },
1830 },
1831 /* PREGRP21 */
1832 {
1833 { "(bad)", { EXx, XM } },
1834 { "movq2dq",{ XM, MS } },
1835 { "movq", { EXq, XM } },
1836 { "movdq2q",{ MX, XS } },
1837 },
1838 /* PREGRP22 */
1839 {
1840 { "pshufw", { MX, EM, Ib } },
1841 { "pshufhw",{ XM, EXx, Ib } },
1842 { "pshufd", { XM, EXx, Ib } },
1843 { "pshuflw",{ XM, EXx, Ib } },
1844 },
1845 /* PREGRP23 */
1846 {
1847 { "movK", { Edq, MX } },
1848 { "movq", { XM, EXq } },
1849 { "movK", { Edq, XM } },
1850 { "(bad)", { Ed, XM } },
1851 },
1852 /* PREGRP24 */
1853 {
1854 { "(bad)", { MX, EXx } },
1855 { "(bad)", { XM, EXx } },
1856 { "punpckhqdq", { XM, EXx } },
1857 { "(bad)", { XM, EXx } },
1858 },
1859 /* PREGRP25 */
1860 {
1861 { "movntq", { EM, MX } },
1862 { "(bad)", { EM, XM } },
1863 { "movntdq",{ EM, XM } },
1864 { "(bad)", { EM, XM } },
1865 },
1866 /* PREGRP26 */
1867 {
1868 { "(bad)", { MX, EXx } },
1869 { "(bad)", { XM, EXx } },
1870 { "punpcklqdq", { XM, EXx } },
1871 { "(bad)", { XM, EXx } },
1872 },
1873 /* PREGRP27 */
1874 {
1875 { "(bad)", { MX, EXx } },
1876 { "(bad)", { XM, EXx } },
1877 { "addsubpd", { XM, EXx } },
1878 { "addsubps", { XM, EXx } },
1879 },
1880 /* PREGRP28 */
1881 {
1882 { "(bad)", { MX, EXx } },
1883 { "(bad)", { XM, EXx } },
1884 { "haddpd", { XM, EXx } },
1885 { "haddps", { XM, EXx } },
1886 },
1887 /* PREGRP29 */
1888 {
1889 { "(bad)", { MX, EXx } },
1890 { "(bad)", { XM, EXx } },
1891 { "hsubpd", { XM, EXx } },
1892 { "hsubps", { XM, EXx } },
1893 },
1894 /* PREGRP30 */
1895 {
1896 { OPC_EXT_36 },
1897 { "movsldup", { XM, EXx } },
1898 { "movlpd", { XM, EXq } },
1899 { "movddup", { XM, EXq } },
1900 },
1901 /* PREGRP31 */
1902 {
1903 { OPC_EXT_37 },
1904 { "movshdup", { XM, EXx } },
1905 { "movhpd", { XM, EXq } },
1906 { "(bad)", { XM, EXq } },
1907 },
1908 /* PREGRP32 */
1909 {
1910 { "(bad)", { XM, EXx } },
1911 { "(bad)", { XM, EXx } },
1912 { "(bad)", { XM, EXx } },
1913 { OPC_EXT_32 },
1914 },
1915 /* PREGRP33 */
1916 {
1917 {"movntps", { Ev, XM } },
1918 {"movntss", { Ed, XM } },
1919 {"movntpd", { Ev, XM } },
1920 {"movntsd", { Eq, XM } },
1921 },
1922
1923 /* PREGRP34 */
1924 {
1925 {"vmread", { Em, Gm } },
1926 {"(bad)", { XX } },
1927 {"extrq", { XS, Ib, Ib } },
1928 {"insertq", { XM, XS, Ib, Ib } },
1929 },
1930
1931 /* PREGRP35 */
1932 {
1933 {"vmwrite", { Gm, Em } },
1934 {"(bad)", { XX } },
1935 {"extrq", { XM, XS } },
1936 {"insertq", { XM, XS } },
1937 },
1938
1939 /* PREGRP36 */
1940 {
1941 { "bsrS", { Gv, Ev } },
1942 { "lzcntS", { Gv, Ev } },
1943 { "bsrS", { Gv, Ev } },
1944 { "(bad)", { XX } },
1945 },
1946
1947 /* PREGRP37 */
1948 {
1949 { "(bad)", { XX } },
1950 { "popcntS", { Gv, Ev } },
1951 { "(bad)", { XX } },
1952 { "(bad)", { XX } },
1953 },
1954
1955 /* PREGRP38 */
1956 {
1957 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
1958 { "pause", { XX } },
1959 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
1960 { "(bad)", { XX } },
1961 },
1962
1963 /* PREGRP39 */
1964 {
1965 { "(bad)", { XX } },
1966 { "(bad)", { XX } },
1967 { "pblendvb", {XM, EXx, XMM0 } },
1968 { "(bad)", { XX } },
1969 },
1970
1971 /* PREGRP40 */
1972 {
1973 { "(bad)", { XX } },
1974 { "(bad)", { XX } },
1975 { "blendvps", {XM, EXx, XMM0 } },
1976 { "(bad)", { XX } },
1977 },
1978
1979 /* PREGRP41 */
1980 {
1981 { "(bad)", { XX } },
1982 { "(bad)", { XX } },
1983 { "blendvpd", { XM, EXx, XMM0 } },
1984 { "(bad)", { XX } },
1985 },
1986
1987 /* PREGRP42 */
1988 {
1989 { "(bad)", { XX } },
1990 { "(bad)", { XX } },
1991 { "ptest", { XM, EXx } },
1992 { "(bad)", { XX } },
1993 },
1994
1995 /* PREGRP43 */
1996 {
1997 { "(bad)", { XX } },
1998 { "(bad)", { XX } },
1999 { "pmovsxbw", { XM, EXq } },
2000 { "(bad)", { XX } },
2001 },
2002
2003 /* PREGRP44 */
2004 {
2005 { "(bad)", { XX } },
2006 { "(bad)", { XX } },
2007 { "pmovsxbd", { XM, EXd } },
2008 { "(bad)", { XX } },
2009 },
2010
2011 /* PREGRP45 */
2012 {
2013 { "(bad)", { XX } },
2014 { "(bad)", { XX } },
2015 { "pmovsxbq", { XM, EXw } },
2016 { "(bad)", { XX } },
2017 },
2018
2019 /* PREGRP46 */
2020 {
2021 { "(bad)", { XX } },
2022 { "(bad)", { XX } },
2023 { "pmovsxwd", { XM, EXq } },
2024 { "(bad)", { XX } },
2025 },
2026
2027 /* PREGRP47 */
2028 {
2029 { "(bad)", { XX } },
2030 { "(bad)", { XX } },
2031 { "pmovsxwq", { XM, EXd } },
2032 { "(bad)", { XX } },
2033 },
2034
2035 /* PREGRP48 */
2036 {
2037 { "(bad)", { XX } },
2038 { "(bad)", { XX } },
2039 { "pmovsxdq", { XM, EXq } },
2040 { "(bad)", { XX } },
2041 },
2042
2043 /* PREGRP49 */
2044 {
2045 { "(bad)", { XX } },
2046 { "(bad)", { XX } },
2047 { "pmuldq", { XM, EXx } },
2048 { "(bad)", { XX } },
2049 },
2050
2051 /* PREGRP50 */
2052 {
2053 { "(bad)", { XX } },
2054 { "(bad)", { XX } },
2055 { "pcmpeqq", { XM, EXx } },
2056 { "(bad)", { XX } },
2057 },
2058
2059 /* PREGRP51 */
2060 {
2061 { "(bad)", { XX } },
2062 { "(bad)", { XX } },
2063 { "movntdqa", { XM, EM } },
2064 { "(bad)", { XX } },
2065 },
2066
2067 /* PREGRP52 */
2068 {
2069 { "(bad)", { XX } },
2070 { "(bad)", { XX } },
2071 { "packusdw", { XM, EXx } },
2072 { "(bad)", { XX } },
2073 },
2074
2075 /* PREGRP53 */
2076 {
2077 { "(bad)", { XX } },
2078 { "(bad)", { XX } },
2079 { "pmovzxbw", { XM, EXq } },
2080 { "(bad)", { XX } },
2081 },
2082
2083 /* PREGRP54 */
2084 {
2085 { "(bad)", { XX } },
2086 { "(bad)", { XX } },
2087 { "pmovzxbd", { XM, EXd } },
2088 { "(bad)", { XX } },
2089 },
2090
2091 /* PREGRP55 */
2092 {
2093 { "(bad)", { XX } },
2094 { "(bad)", { XX } },
2095 { "pmovzxbq", { XM, EXw } },
2096 { "(bad)", { XX } },
2097 },
2098
2099 /* PREGRP56 */
2100 {
2101 { "(bad)", { XX } },
2102 { "(bad)", { XX } },
2103 { "pmovzxwd", { XM, EXq } },
2104 { "(bad)", { XX } },
2105 },
2106
2107 /* PREGRP57 */
2108 {
2109 { "(bad)", { XX } },
2110 { "(bad)", { XX } },
2111 { "pmovzxwq", { XM, EXd } },
2112 { "(bad)", { XX } },
2113 },
2114
2115 /* PREGRP58 */
2116 {
2117 { "(bad)", { XX } },
2118 { "(bad)", { XX } },
2119 { "pmovzxdq", { XM, EXq } },
2120 { "(bad)", { XX } },
2121 },
2122
2123 /* PREGRP59 */
2124 {
2125 { "(bad)", { XX } },
2126 { "(bad)", { XX } },
2127 { "pminsb", { XM, EXx } },
2128 { "(bad)", { XX } },
2129 },
2130
2131 /* PREGRP60 */
2132 {
2133 { "(bad)", { XX } },
2134 { "(bad)", { XX } },
2135 { "pminsd", { XM, EXx } },
2136 { "(bad)", { XX } },
2137 },
2138
2139 /* PREGRP61 */
2140 {
2141 { "(bad)", { XX } },
2142 { "(bad)", { XX } },
2143 { "pminuw", { XM, EXx } },
2144 { "(bad)", { XX } },
2145 },
2146
2147 /* PREGRP62 */
2148 {
2149 { "(bad)", { XX } },
2150 { "(bad)", { XX } },
2151 { "pminud", { XM, EXx } },
2152 { "(bad)", { XX } },
2153 },
2154
2155 /* PREGRP63 */
2156 {
2157 { "(bad)", { XX } },
2158 { "(bad)", { XX } },
2159 { "pmaxsb", { XM, EXx } },
2160 { "(bad)", { XX } },
2161 },
2162
2163 /* PREGRP64 */
2164 {
2165 { "(bad)", { XX } },
2166 { "(bad)", { XX } },
2167 { "pmaxsd", { XM, EXx } },
2168 { "(bad)", { XX } },
2169 },
2170
2171 /* PREGRP65 */
2172 {
2173 { "(bad)", { XX } },
2174 { "(bad)", { XX } },
2175 { "pmaxuw", { XM, EXx } },
2176 { "(bad)", { XX } },
2177 },
2178
2179 /* PREGRP66 */
2180 {
2181 { "(bad)", { XX } },
2182 { "(bad)", { XX } },
2183 { "pmaxud", { XM, EXx } },
2184 { "(bad)", { XX } },
2185 },
2186
2187 /* PREGRP67 */
2188 {
2189 { "(bad)", { XX } },
2190 { "(bad)", { XX } },
2191 { "pmulld", { XM, EXx } },
2192 { "(bad)", { XX } },
2193 },
2194
2195 /* PREGRP68 */
2196 {
2197 { "(bad)", { XX } },
2198 { "(bad)", { XX } },
2199 { "phminposuw", { XM, EXx } },
2200 { "(bad)", { XX } },
2201 },
2202
2203 /* PREGRP69 */
2204 {
2205 { "(bad)", { XX } },
2206 { "(bad)", { XX } },
2207 { "roundps", { XM, EXx, Ib } },
2208 { "(bad)", { XX } },
2209 },
2210
2211 /* PREGRP70 */
2212 {
2213 { "(bad)", { XX } },
2214 { "(bad)", { XX } },
2215 { "roundpd", { XM, EXx, Ib } },
2216 { "(bad)", { XX } },
2217 },
2218
2219 /* PREGRP71 */
2220 {
2221 { "(bad)", { XX } },
2222 { "(bad)", { XX } },
2223 { "roundss", { XM, EXd, Ib } },
2224 { "(bad)", { XX } },
2225 },
2226
2227 /* PREGRP72 */
2228 {
2229 { "(bad)", { XX } },
2230 { "(bad)", { XX } },
2231 { "roundsd", { XM, EXq, Ib } },
2232 { "(bad)", { XX } },
2233 },
2234
2235 /* PREGRP73 */
2236 {
2237 { "(bad)", { XX } },
2238 { "(bad)", { XX } },
2239 { "blendps", { XM, EXx, Ib } },
2240 { "(bad)", { XX } },
2241 },
2242
2243 /* PREGRP74 */
2244 {
2245 { "(bad)", { XX } },
2246 { "(bad)", { XX } },
2247 { "blendpd", { XM, EXx, Ib } },
2248 { "(bad)", { XX } },
2249 },
2250
2251 /* PREGRP75 */
2252 {
2253 { "(bad)", { XX } },
2254 { "(bad)", { XX } },
2255 { "pblendw", { XM, EXx, Ib } },
2256 { "(bad)", { XX } },
2257 },
2258
2259 /* PREGRP76 */
2260 {
2261 { "(bad)", { XX } },
2262 { "(bad)", { XX } },
2263 { "pextrb", { Edqb, XM, Ib } },
2264 { "(bad)", { XX } },
2265 },
2266
2267 /* PREGRP77 */
2268 {
2269 { "(bad)", { XX } },
2270 { "(bad)", { XX } },
2271 { "pextrw", { Edqw, XM, Ib } },
2272 { "(bad)", { XX } },
2273 },
2274
2275 /* PREGRP78 */
2276 {
2277 { "(bad)", { XX } },
2278 { "(bad)", { XX } },
2279 { "pextrK", { Edq, XM, Ib } },
2280 { "(bad)", { XX } },
2281 },
2282
2283 /* PREGRP79 */
2284 {
2285 { "(bad)", { XX } },
2286 { "(bad)", { XX } },
2287 { "extractps", { Edqd, XM, Ib } },
2288 { "(bad)", { XX } },
2289 },
2290
2291 /* PREGRP80 */
2292 {
2293 { "(bad)", { XX } },
2294 { "(bad)", { XX } },
2295 { "pinsrb", { XM, Edqb, Ib } },
2296 { "(bad)", { XX } },
2297 },
2298
2299 /* PREGRP81 */
2300 {
2301 { "(bad)", { XX } },
2302 { "(bad)", { XX } },
2303 { "insertps", { XM, EXd, Ib } },
2304 { "(bad)", { XX } },
2305 },
2306
2307 /* PREGRP82 */
2308 {
2309 { "(bad)", { XX } },
2310 { "(bad)", { XX } },
2311 { "pinsrK", { XM, Edq, Ib } },
2312 { "(bad)", { XX } },
2313 },
2314
2315 /* PREGRP83 */
2316 {
2317 { "(bad)", { XX } },
2318 { "(bad)", { XX } },
2319 { "dpps", { XM, EXx, Ib } },
2320 { "(bad)", { XX } },
2321 },
2322
2323 /* PREGRP84 */
2324 {
2325 { "(bad)", { XX } },
2326 { "(bad)", { XX } },
2327 { "dppd", { XM, EXx, Ib } },
2328 { "(bad)", { XX } },
2329 },
2330
2331 /* PREGRP85 */
2332 {
2333 { "(bad)", { XX } },
2334 { "(bad)", { XX } },
2335 { "mpsadbw", { XM, EXx, Ib } },
2336 { "(bad)", { XX } },
2337 },
2338
2339 /* PREGRP86 */
2340 {
2341 { "(bad)", { XX } },
2342 { "(bad)", { XX } },
2343 { "pcmpgtq", { XM, EXx } },
2344 { "(bad)", { XX } },
2345 },
2346
2347 /* PREGRP87 */
2348 {
2349 { "(bad)", { XX } },
2350 { "(bad)", { XX } },
2351 { "(bad)", { XX } },
2352 { "crc32", { Gdq, { CRC32_Fixup, b_mode } } },
2353 },
2354
2355 /* PREGRP88 */
2356 {
2357 { "(bad)", { XX } },
2358 { "(bad)", { XX } },
2359 { "(bad)", { XX } },
2360 { "crc32", { Gdq, { CRC32_Fixup, v_mode } } },
2361 },
2362
2363 /* PREGRP89 */
2364 {
2365 { "(bad)", { XX } },
2366 { "(bad)", { XX } },
2367 { "pcmpestrm", { XM, EXx, Ib } },
2368 { "(bad)", { XX } },
2369 },
2370
2371 /* PREGRP90 */
2372 {
2373 { "(bad)", { XX } },
2374 { "(bad)", { XX } },
2375 { "pcmpestri", { XM, EXx, Ib } },
2376 { "(bad)", { XX } },
2377 },
2378
2379 /* PREGRP91 */
2380 {
2381 { "(bad)", { XX } },
2382 { "(bad)", { XX } },
2383 { "pcmpistrm", { XM, EXx, Ib } },
2384 { "(bad)", { XX } },
2385 },
2386
2387 /* PREGRP92 */
2388 {
2389 { "(bad)", { XX } },
2390 { "(bad)", { XX } },
2391 { "pcmpistri", { XM, EXx, Ib } },
2392 { "(bad)", { XX } },
2393 },
2394
2395 /* PREGRP93 */
2396 {
2397 { "ucomiss",{ XM, EXd } },
2398 { "(bad)", { XX } },
2399 { "ucomisd",{ XM, EXq } },
2400 { "(bad)", { XX } },
2401 },
2402
2403 /* PREGRP94 */
2404 {
2405 { "comiss", { XM, EXd } },
2406 { "(bad)", { XX } },
2407 { "comisd", { XM, EXq } },
2408 { "(bad)", { XX } },
2409 },
2410
2411 /* PREGRP95 */
2412 {
2413 { "punpcklbw",{ MX, EMd } },
2414 { "(bad)", { XX } },
2415 { "punpcklbw",{ MX, EMx } },
2416 { "(bad)", { XX } },
2417 },
2418
2419 /* PREGRP96 */
2420 {
2421 { "punpcklwd",{ MX, EMd } },
2422 { "(bad)", { XX } },
2423 { "punpcklwd",{ MX, EMx } },
2424 { "(bad)", { XX } },
2425 },
2426
2427 /* PREGRP97 */
2428 {
2429 { "punpckldq",{ MX, EMd } },
2430 { "(bad)", { XX } },
2431 { "punpckldq",{ MX, EMx } },
2432 { "(bad)", { XX } },
2433 },
2434
2435 /* PREGRP98 */
2436 {
2437 { "vmptrld",{ Mq } },
2438 { "vmxon", { Mq } },
2439 { "vmclear",{ Mq } },
2440 { "(bad)", { XX } },
2441 },
2442
2443 /* PREGRP99 */
2444 {
2445 { "(bad)", { XX } },
2446 { "(bad)", { XX } },
2447 { "psrldq", { MS, Ib } },
2448 { "(bad)", { XX } },
2449 },
2450
2451 /* PREGRP100 */
2452 {
2453 { "(bad)", { XX } },
2454 { "(bad)", { XX } },
2455 { "pslldq", { MS, Ib } },
2456 { "(bad)", { XX } },
2457 },
2458 };
2459
2460 static const struct dis386 x86_64_table[][2] = {
2461 {
2462 { "pusha{P|}", { XX } },
2463 { "(bad)", { XX } },
2464 },
2465 {
2466 { "popa{P|}", { XX } },
2467 { "(bad)", { XX } },
2468 },
2469 {
2470 { OPC_EXT_33 },
2471 { "(bad)", { XX } },
2472 },
2473 {
2474 { "arpl", { Ew, Gw } },
2475 { "movs{||lq|xd}", { Gv, Ed } },
2476 },
2477 };
2478
2479 static const struct dis386 three_byte_table[][256] = {
2480 /* THREE_BYTE_0 */
2481 {
2482 /* 00 */
2483 { "pshufb", { MX, EM } },
2484 { "phaddw", { MX, EM } },
2485 { "phaddd", { MX, EM } },
2486 { "phaddsw", { MX, EM } },
2487 { "pmaddubsw", { MX, EM } },
2488 { "phsubw", { MX, EM } },
2489 { "phsubd", { MX, EM } },
2490 { "phsubsw", { MX, EM } },
2491 /* 08 */
2492 { "psignb", { MX, EM } },
2493 { "psignw", { MX, EM } },
2494 { "psignd", { MX, EM } },
2495 { "pmulhrsw", { MX, EM } },
2496 { "(bad)", { XX } },
2497 { "(bad)", { XX } },
2498 { "(bad)", { XX } },
2499 { "(bad)", { XX } },
2500 /* 10 */
2501 { PREGRP39 },
2502 { "(bad)", { XX } },
2503 { "(bad)", { XX } },
2504 { "(bad)", { XX } },
2505 { PREGRP40 },
2506 { PREGRP41 },
2507 { "(bad)", { XX } },
2508 { PREGRP42 },
2509 /* 18 */
2510 { "(bad)", { XX } },
2511 { "(bad)", { XX } },
2512 { "(bad)", { XX } },
2513 { "(bad)", { XX } },
2514 { "pabsb", { MX, EM } },
2515 { "pabsw", { MX, EM } },
2516 { "pabsd", { MX, EM } },
2517 { "(bad)", { XX } },
2518 /* 20 */
2519 { PREGRP43 },
2520 { PREGRP44 },
2521 { PREGRP45 },
2522 { PREGRP46 },
2523 { PREGRP47 },
2524 { PREGRP48 },
2525 { "(bad)", { XX } },
2526 { "(bad)", { XX } },
2527 /* 28 */
2528 { PREGRP49 },
2529 { PREGRP50 },
2530 { PREGRP51 },
2531 { PREGRP52 },
2532 { "(bad)", { XX } },
2533 { "(bad)", { XX } },
2534 { "(bad)", { XX } },
2535 { "(bad)", { XX } },
2536 /* 30 */
2537 { PREGRP53 },
2538 { PREGRP54 },
2539 { PREGRP55 },
2540 { PREGRP56 },
2541 { PREGRP57 },
2542 { PREGRP58 },
2543 { "(bad)", { XX } },
2544 { PREGRP86 },
2545 /* 38 */
2546 { PREGRP59 },
2547 { PREGRP60 },
2548 { PREGRP61 },
2549 { PREGRP62 },
2550 { PREGRP63 },
2551 { PREGRP64 },
2552 { PREGRP65 },
2553 { PREGRP66 },
2554 /* 40 */
2555 { PREGRP67 },
2556 { PREGRP68 },
2557 { "(bad)", { XX } },
2558 { "(bad)", { XX } },
2559 { "(bad)", { XX } },
2560 { "(bad)", { XX } },
2561 { "(bad)", { XX } },
2562 { "(bad)", { XX } },
2563 /* 48 */
2564 { "(bad)", { XX } },
2565 { "(bad)", { XX } },
2566 { "(bad)", { XX } },
2567 { "(bad)", { XX } },
2568 { "(bad)", { XX } },
2569 { "(bad)", { XX } },
2570 { "(bad)", { XX } },
2571 { "(bad)", { XX } },
2572 /* 50 */
2573 { "(bad)", { XX } },
2574 { "(bad)", { XX } },
2575 { "(bad)", { XX } },
2576 { "(bad)", { XX } },
2577 { "(bad)", { XX } },
2578 { "(bad)", { XX } },
2579 { "(bad)", { XX } },
2580 { "(bad)", { XX } },
2581 /* 58 */
2582 { "(bad)", { XX } },
2583 { "(bad)", { XX } },
2584 { "(bad)", { XX } },
2585 { "(bad)", { XX } },
2586 { "(bad)", { XX } },
2587 { "(bad)", { XX } },
2588 { "(bad)", { XX } },
2589 { "(bad)", { XX } },
2590 /* 60 */
2591 { "(bad)", { XX } },
2592 { "(bad)", { XX } },
2593 { "(bad)", { XX } },
2594 { "(bad)", { XX } },
2595 { "(bad)", { XX } },
2596 { "(bad)", { XX } },
2597 { "(bad)", { XX } },
2598 { "(bad)", { XX } },
2599 /* 68 */
2600 { "(bad)", { XX } },
2601 { "(bad)", { XX } },
2602 { "(bad)", { XX } },
2603 { "(bad)", { XX } },
2604 { "(bad)", { XX } },
2605 { "(bad)", { XX } },
2606 { "(bad)", { XX } },
2607 { "(bad)", { XX } },
2608 /* 70 */
2609 { "(bad)", { XX } },
2610 { "(bad)", { XX } },
2611 { "(bad)", { XX } },
2612 { "(bad)", { XX } },
2613 { "(bad)", { XX } },
2614 { "(bad)", { XX } },
2615 { "(bad)", { XX } },
2616 { "(bad)", { XX } },
2617 /* 78 */
2618 { "(bad)", { XX } },
2619 { "(bad)", { XX } },
2620 { "(bad)", { XX } },
2621 { "(bad)", { XX } },
2622 { "(bad)", { XX } },
2623 { "(bad)", { XX } },
2624 { "(bad)", { XX } },
2625 { "(bad)", { XX } },
2626 /* 80 */
2627 { "(bad)", { XX } },
2628 { "(bad)", { XX } },
2629 { "(bad)", { XX } },
2630 { "(bad)", { XX } },
2631 { "(bad)", { XX } },
2632 { "(bad)", { XX } },
2633 { "(bad)", { XX } },
2634 { "(bad)", { XX } },
2635 /* 88 */
2636 { "(bad)", { XX } },
2637 { "(bad)", { XX } },
2638 { "(bad)", { XX } },
2639 { "(bad)", { XX } },
2640 { "(bad)", { XX } },
2641 { "(bad)", { XX } },
2642 { "(bad)", { XX } },
2643 { "(bad)", { XX } },
2644 /* 90 */
2645 { "(bad)", { XX } },
2646 { "(bad)", { XX } },
2647 { "(bad)", { XX } },
2648 { "(bad)", { XX } },
2649 { "(bad)", { XX } },
2650 { "(bad)", { XX } },
2651 { "(bad)", { XX } },
2652 { "(bad)", { XX } },
2653 /* 98 */
2654 { "(bad)", { XX } },
2655 { "(bad)", { XX } },
2656 { "(bad)", { XX } },
2657 { "(bad)", { XX } },
2658 { "(bad)", { XX } },
2659 { "(bad)", { XX } },
2660 { "(bad)", { XX } },
2661 { "(bad)", { XX } },
2662 /* a0 */
2663 { "(bad)", { XX } },
2664 { "(bad)", { XX } },
2665 { "(bad)", { XX } },
2666 { "(bad)", { XX } },
2667 { "(bad)", { XX } },
2668 { "(bad)", { XX } },
2669 { "(bad)", { XX } },
2670 { "(bad)", { XX } },
2671 /* a8 */
2672 { "(bad)", { XX } },
2673 { "(bad)", { XX } },
2674 { "(bad)", { XX } },
2675 { "(bad)", { XX } },
2676 { "(bad)", { XX } },
2677 { "(bad)", { XX } },
2678 { "(bad)", { XX } },
2679 { "(bad)", { XX } },
2680 /* b0 */
2681 { "(bad)", { XX } },
2682 { "(bad)", { XX } },
2683 { "(bad)", { XX } },
2684 { "(bad)", { XX } },
2685 { "(bad)", { XX } },
2686 { "(bad)", { XX } },
2687 { "(bad)", { XX } },
2688 { "(bad)", { XX } },
2689 /* b8 */
2690 { "(bad)", { XX } },
2691 { "(bad)", { XX } },
2692 { "(bad)", { XX } },
2693 { "(bad)", { XX } },
2694 { "(bad)", { XX } },
2695 { "(bad)", { XX } },
2696 { "(bad)", { XX } },
2697 { "(bad)", { XX } },
2698 /* c0 */
2699 { "(bad)", { XX } },
2700 { "(bad)", { XX } },
2701 { "(bad)", { XX } },
2702 { "(bad)", { XX } },
2703 { "(bad)", { XX } },
2704 { "(bad)", { XX } },
2705 { "(bad)", { XX } },
2706 { "(bad)", { XX } },
2707 /* c8 */
2708 { "(bad)", { XX } },
2709 { "(bad)", { XX } },
2710 { "(bad)", { XX } },
2711 { "(bad)", { XX } },
2712 { "(bad)", { XX } },
2713 { "(bad)", { XX } },
2714 { "(bad)", { XX } },
2715 { "(bad)", { XX } },
2716 /* d0 */
2717 { "(bad)", { XX } },
2718 { "(bad)", { XX } },
2719 { "(bad)", { XX } },
2720 { "(bad)", { XX } },
2721 { "(bad)", { XX } },
2722 { "(bad)", { XX } },
2723 { "(bad)", { XX } },
2724 { "(bad)", { XX } },
2725 /* d8 */
2726 { "(bad)", { XX } },
2727 { "(bad)", { XX } },
2728 { "(bad)", { XX } },
2729 { "(bad)", { XX } },
2730 { "(bad)", { XX } },
2731 { "(bad)", { XX } },
2732 { "(bad)", { XX } },
2733 { "(bad)", { XX } },
2734 /* e0 */
2735 { "(bad)", { XX } },
2736 { "(bad)", { XX } },
2737 { "(bad)", { XX } },
2738 { "(bad)", { XX } },
2739 { "(bad)", { XX } },
2740 { "(bad)", { XX } },
2741 { "(bad)", { XX } },
2742 { "(bad)", { XX } },
2743 /* e8 */
2744 { "(bad)", { XX } },
2745 { "(bad)", { XX } },
2746 { "(bad)", { XX } },
2747 { "(bad)", { XX } },
2748 { "(bad)", { XX } },
2749 { "(bad)", { XX } },
2750 { "(bad)", { XX } },
2751 { "(bad)", { XX } },
2752 /* f0 */
2753 { PREGRP87 },
2754 { PREGRP88 },
2755 { "(bad)", { XX } },
2756 { "(bad)", { XX } },
2757 { "(bad)", { XX } },
2758 { "(bad)", { XX } },
2759 { "(bad)", { XX } },
2760 { "(bad)", { XX } },
2761 /* f8 */
2762 { "(bad)", { XX } },
2763 { "(bad)", { XX } },
2764 { "(bad)", { XX } },
2765 { "(bad)", { XX } },
2766 { "(bad)", { XX } },
2767 { "(bad)", { XX } },
2768 { "(bad)", { XX } },
2769 { "(bad)", { XX } },
2770 },
2771 /* THREE_BYTE_1 */
2772 {
2773 /* 00 */
2774 { "(bad)", { XX } },
2775 { "(bad)", { XX } },
2776 { "(bad)", { XX } },
2777 { "(bad)", { XX } },
2778 { "(bad)", { XX } },
2779 { "(bad)", { XX } },
2780 { "(bad)", { XX } },
2781 { "(bad)", { XX } },
2782 /* 08 */
2783 { PREGRP69 },
2784 { PREGRP70 },
2785 { PREGRP71 },
2786 { PREGRP72 },
2787 { PREGRP73 },
2788 { PREGRP74 },
2789 { PREGRP75 },
2790 { "palignr", { MX, EM, Ib } },
2791 /* 10 */
2792 { "(bad)", { XX } },
2793 { "(bad)", { XX } },
2794 { "(bad)", { XX } },
2795 { "(bad)", { XX } },
2796 { PREGRP76 },
2797 { PREGRP77 },
2798 { PREGRP78 },
2799 { PREGRP79 },
2800 /* 18 */
2801 { "(bad)", { XX } },
2802 { "(bad)", { XX } },
2803 { "(bad)", { XX } },
2804 { "(bad)", { XX } },
2805 { "(bad)", { XX } },
2806 { "(bad)", { XX } },
2807 { "(bad)", { XX } },
2808 { "(bad)", { XX } },
2809 /* 20 */
2810 { PREGRP80 },
2811 { PREGRP81 },
2812 { PREGRP82 },
2813 { "(bad)", { XX } },
2814 { "(bad)", { XX } },
2815 { "(bad)", { XX } },
2816 { "(bad)", { XX } },
2817 { "(bad)", { XX } },
2818 /* 28 */
2819 { "(bad)", { XX } },
2820 { "(bad)", { XX } },
2821 { "(bad)", { XX } },
2822 { "(bad)", { XX } },
2823 { "(bad)", { XX } },
2824 { "(bad)", { XX } },
2825 { "(bad)", { XX } },
2826 { "(bad)", { XX } },
2827 /* 30 */
2828 { "(bad)", { XX } },
2829 { "(bad)", { XX } },
2830 { "(bad)", { XX } },
2831 { "(bad)", { XX } },
2832 { "(bad)", { XX } },
2833 { "(bad)", { XX } },
2834 { "(bad)", { XX } },
2835 { "(bad)", { XX } },
2836 /* 38 */
2837 { "(bad)", { XX } },
2838 { "(bad)", { XX } },
2839 { "(bad)", { XX } },
2840 { "(bad)", { XX } },
2841 { "(bad)", { XX } },
2842 { "(bad)", { XX } },
2843 { "(bad)", { XX } },
2844 { "(bad)", { XX } },
2845 /* 40 */
2846 { PREGRP83 },
2847 { PREGRP84 },
2848 { PREGRP85 },
2849 { "(bad)", { XX } },
2850 { "(bad)", { XX } },
2851 { "(bad)", { XX } },
2852 { "(bad)", { XX } },
2853 { "(bad)", { XX } },
2854 /* 48 */
2855 { "(bad)", { XX } },
2856 { "(bad)", { XX } },
2857 { "(bad)", { XX } },
2858 { "(bad)", { XX } },
2859 { "(bad)", { XX } },
2860 { "(bad)", { XX } },
2861 { "(bad)", { XX } },
2862 { "(bad)", { XX } },
2863 /* 50 */
2864 { "(bad)", { XX } },
2865 { "(bad)", { XX } },
2866 { "(bad)", { XX } },
2867 { "(bad)", { XX } },
2868 { "(bad)", { XX } },
2869 { "(bad)", { XX } },
2870 { "(bad)", { XX } },
2871 { "(bad)", { XX } },
2872 /* 58 */
2873 { "(bad)", { XX } },
2874 { "(bad)", { XX } },
2875 { "(bad)", { XX } },
2876 { "(bad)", { XX } },
2877 { "(bad)", { XX } },
2878 { "(bad)", { XX } },
2879 { "(bad)", { XX } },
2880 { "(bad)", { XX } },
2881 /* 60 */
2882 { PREGRP89 },
2883 { PREGRP90 },
2884 { PREGRP91 },
2885 { PREGRP92 },
2886 { "(bad)", { XX } },
2887 { "(bad)", { XX } },
2888 { "(bad)", { XX } },
2889 { "(bad)", { XX } },
2890 /* 68 */
2891 { "(bad)", { XX } },
2892 { "(bad)", { XX } },
2893 { "(bad)", { XX } },
2894 { "(bad)", { XX } },
2895 { "(bad)", { XX } },
2896 { "(bad)", { XX } },
2897 { "(bad)", { XX } },
2898 { "(bad)", { XX } },
2899 /* 70 */
2900 { "(bad)", { XX } },
2901 { "(bad)", { XX } },
2902 { "(bad)", { XX } },
2903 { "(bad)", { XX } },
2904 { "(bad)", { XX } },
2905 { "(bad)", { XX } },
2906 { "(bad)", { XX } },
2907 { "(bad)", { XX } },
2908 /* 78 */
2909 { "(bad)", { XX } },
2910 { "(bad)", { XX } },
2911 { "(bad)", { XX } },
2912 { "(bad)", { XX } },
2913 { "(bad)", { XX } },
2914 { "(bad)", { XX } },
2915 { "(bad)", { XX } },
2916 { "(bad)", { XX } },
2917 /* 80 */
2918 { "(bad)", { XX } },
2919 { "(bad)", { XX } },
2920 { "(bad)", { XX } },
2921 { "(bad)", { XX } },
2922 { "(bad)", { XX } },
2923 { "(bad)", { XX } },
2924 { "(bad)", { XX } },
2925 { "(bad)", { XX } },
2926 /* 88 */
2927 { "(bad)", { XX } },
2928 { "(bad)", { XX } },
2929 { "(bad)", { XX } },
2930 { "(bad)", { XX } },
2931 { "(bad)", { XX } },
2932 { "(bad)", { XX } },
2933 { "(bad)", { XX } },
2934 { "(bad)", { XX } },
2935 /* 90 */
2936 { "(bad)", { XX } },
2937 { "(bad)", { XX } },
2938 { "(bad)", { XX } },
2939 { "(bad)", { XX } },
2940 { "(bad)", { XX } },
2941 { "(bad)", { XX } },
2942 { "(bad)", { XX } },
2943 { "(bad)", { XX } },
2944 /* 98 */
2945 { "(bad)", { XX } },
2946 { "(bad)", { XX } },
2947 { "(bad)", { XX } },
2948 { "(bad)", { XX } },
2949 { "(bad)", { XX } },
2950 { "(bad)", { XX } },
2951 { "(bad)", { XX } },
2952 { "(bad)", { XX } },
2953 /* a0 */
2954 { "(bad)", { XX } },
2955 { "(bad)", { XX } },
2956 { "(bad)", { XX } },
2957 { "(bad)", { XX } },
2958 { "(bad)", { XX } },
2959 { "(bad)", { XX } },
2960 { "(bad)", { XX } },
2961 { "(bad)", { XX } },
2962 /* a8 */
2963 { "(bad)", { XX } },
2964 { "(bad)", { XX } },
2965 { "(bad)", { XX } },
2966 { "(bad)", { XX } },
2967 { "(bad)", { XX } },
2968 { "(bad)", { XX } },
2969 { "(bad)", { XX } },
2970 { "(bad)", { XX } },
2971 /* b0 */
2972 { "(bad)", { XX } },
2973 { "(bad)", { XX } },
2974 { "(bad)", { XX } },
2975 { "(bad)", { XX } },
2976 { "(bad)", { XX } },
2977 { "(bad)", { XX } },
2978 { "(bad)", { XX } },
2979 { "(bad)", { XX } },
2980 /* b8 */
2981 { "(bad)", { XX } },
2982 { "(bad)", { XX } },
2983 { "(bad)", { XX } },
2984 { "(bad)", { XX } },
2985 { "(bad)", { XX } },
2986 { "(bad)", { XX } },
2987 { "(bad)", { XX } },
2988 { "(bad)", { XX } },
2989 /* c0 */
2990 { "(bad)", { XX } },
2991 { "(bad)", { XX } },
2992 { "(bad)", { XX } },
2993 { "(bad)", { XX } },
2994 { "(bad)", { XX } },
2995 { "(bad)", { XX } },
2996 { "(bad)", { XX } },
2997 { "(bad)", { XX } },
2998 /* c8 */
2999 { "(bad)", { XX } },
3000 { "(bad)", { XX } },
3001 { "(bad)", { XX } },
3002 { "(bad)", { XX } },
3003 { "(bad)", { XX } },
3004 { "(bad)", { XX } },
3005 { "(bad)", { XX } },
3006 { "(bad)", { XX } },
3007 /* d0 */
3008 { "(bad)", { XX } },
3009 { "(bad)", { XX } },
3010 { "(bad)", { XX } },
3011 { "(bad)", { XX } },
3012 { "(bad)", { XX } },
3013 { "(bad)", { XX } },
3014 { "(bad)", { XX } },
3015 { "(bad)", { XX } },
3016 /* d8 */
3017 { "(bad)", { XX } },
3018 { "(bad)", { XX } },
3019 { "(bad)", { XX } },
3020 { "(bad)", { XX } },
3021 { "(bad)", { XX } },
3022 { "(bad)", { XX } },
3023 { "(bad)", { XX } },
3024 { "(bad)", { XX } },
3025 /* e0 */
3026 { "(bad)", { XX } },
3027 { "(bad)", { XX } },
3028 { "(bad)", { XX } },
3029 { "(bad)", { XX } },
3030 { "(bad)", { XX } },
3031 { "(bad)", { XX } },
3032 { "(bad)", { XX } },
3033 { "(bad)", { XX } },
3034 /* e8 */
3035 { "(bad)", { XX } },
3036 { "(bad)", { XX } },
3037 { "(bad)", { XX } },
3038 { "(bad)", { XX } },
3039 { "(bad)", { XX } },
3040 { "(bad)", { XX } },
3041 { "(bad)", { XX } },
3042 { "(bad)", { XX } },
3043 /* f0 */
3044 { "(bad)", { XX } },
3045 { "(bad)", { XX } },
3046 { "(bad)", { XX } },
3047 { "(bad)", { XX } },
3048 { "(bad)", { XX } },
3049 { "(bad)", { XX } },
3050 { "(bad)", { XX } },
3051 { "(bad)", { XX } },
3052 /* f8 */
3053 { "(bad)", { XX } },
3054 { "(bad)", { XX } },
3055 { "(bad)", { XX } },
3056 { "(bad)", { XX } },
3057 { "(bad)", { XX } },
3058 { "(bad)", { XX } },
3059 { "(bad)", { XX } },
3060 { "(bad)", { XX } },
3061 }
3062 };
3063
3064 static const struct dis386 opc_ext_table[][2] = {
3065 {
3066 /* OPC_EXT_0 */
3067 { "leaS", { Gv, M } },
3068 { "(bad)", { XX } },
3069 },
3070 {
3071 /* OPC_EXT_1 */
3072 { "les{S|}", { Gv, Mp } },
3073 { "(bad)", { XX } },
3074 },
3075 {
3076 /* OPC_EXT_2 */
3077 { "ldsS", { Gv, Mp } },
3078 { "(bad)", { XX } },
3079 },
3080 {
3081 /* OPC_EXT_3 */
3082 { "lssS", { Gv, Mp } },
3083 { "(bad)", { XX } },
3084 },
3085 {
3086 /* OPC_EXT_4 */
3087 { "lfsS", { Gv, Mp } },
3088 { "(bad)", { XX } },
3089 },
3090 {
3091 /* OPC_EXT_5 */
3092 { "lgsS", { Gv, Mp } },
3093 { "(bad)", { XX } },
3094 },
3095 {
3096 /* OPC_EXT_6 */
3097 { "sgdt{Q|IQ||}", { M } },
3098 { OPC_EXT_RM_0 },
3099 },
3100 {
3101 /* OPC_EXT_7 */
3102 { "sidt{Q|IQ||}", { M } },
3103 { OPC_EXT_RM_1 },
3104 },
3105 {
3106 /* OPC_EXT_8 */
3107 { "lgdt{Q|Q||}", { M } },
3108 { "(bad)", { XX } },
3109 },
3110 {
3111 /* OPC_EXT_9 */
3112 { PREGRP98 },
3113 { "(bad)", { XX } },
3114 },
3115 {
3116 /* OPC_EXT_10 */
3117 { "vmptrst", { Mq } },
3118 { "(bad)", { XX } },
3119 },
3120 {
3121 /* OPC_EXT_11 */
3122 { "(bad)", { XX } },
3123 { "psrlw", { MS, Ib } },
3124 },
3125 {
3126 /* OPC_EXT_12 */
3127 { "(bad)", { XX } },
3128 { "psraw", { MS, Ib } },
3129 },
3130 {
3131 /* OPC_EXT_13 */
3132 { "(bad)", { XX } },
3133 { "psllw", { MS, Ib } },
3134 },
3135 {
3136 /* OPC_EXT_14 */
3137 { "(bad)", { XX } },
3138 { "psrld", { MS, Ib } },
3139 },
3140 {
3141 /* OPC_EXT_15 */
3142 { "(bad)", { XX } },
3143 { "psrad", { MS, Ib } },
3144 },
3145 {
3146 /* OPC_EXT_16 */
3147 { "(bad)", { XX } },
3148 { "pslld", { MS, Ib } },
3149 },
3150 {
3151 /* OPC_EXT_17 */
3152 { "(bad)", { XX } },
3153 { "psrlq", { MS, Ib } },
3154 },
3155 {
3156 /* OPC_EXT_18 */
3157 { "(bad)", { XX } },
3158 { PREGRP99 },
3159 },
3160 {
3161 /* OPC_EXT_19 */
3162 { "(bad)", { XX } },
3163 { "psllq", { MS, Ib } },
3164 },
3165 {
3166 /* OPC_EXT_20 */
3167 { "(bad)", { XX } },
3168 { PREGRP100 },
3169 },
3170 {
3171 /* OPC_EXT_21 */
3172 { "fxsave", { M } },
3173 { "(bad)", { XX } },
3174 },
3175 {
3176 /* OPC_EXT_22 */
3177 { "fxrstor", { M } },
3178 { "(bad)", { XX } },
3179 },
3180 {
3181 /* OPC_EXT_23 */
3182 { "ldmxcsr", { Md } },
3183 { "(bad)", { XX } },
3184 },
3185 {
3186 /* OPC_EXT_24 */
3187 { "stmxcsr", { Md } },
3188 { "(bad)", { XX } },
3189 },
3190 {
3191 /* OPC_EXT_25 */
3192 { "(bad)", { XX } },
3193 { OPC_EXT_RM_2 },
3194 },
3195 {
3196 /* OPC_EXT_26 */
3197 { "(bad)", { XX } },
3198 { OPC_EXT_RM_3 },
3199 },
3200 {
3201 /* OPC_EXT_27 */
3202 { "clflush", { Mb } },
3203 { OPC_EXT_RM_4 },
3204 },
3205 {
3206 /* OPC_EXT_28 */
3207 { "prefetchnta", { Mb } },
3208 { "(bad)", { XX } },
3209 },
3210 {
3211 /* OPC_EXT_29 */
3212 { "prefetcht0", { Mb } },
3213 { "(bad)", { XX } },
3214 },
3215 {
3216 /* OPC_EXT_30 */
3217 { "prefetcht1", { Mb } },
3218 { "(bad)", { XX } },
3219 },
3220 {
3221 /* OPC_EXT_31 */
3222 { "prefetcht2", { Mb } },
3223 { "(bad)", { XX } },
3224 },
3225 {
3226 /* OPC_EXT_32 */
3227 { "lddqu", { XM, M } },
3228 { "(bad)", { XX } },
3229 },
3230 {
3231 /* OPC_EXT_33 */
3232 { "bound{S|}", { Gv, Ma } },
3233 { "(bad)", { XX } },
3234 },
3235 {
3236 /* OPC_EXT_34 */
3237 { "movlpX", { EXq, XM } },
3238 { "(bad)", { XX } },
3239 },
3240 {
3241 /* OPC_EXT_35 */
3242 { "movhpX", { EXq, XM } },
3243 { "(bad)", { XX } },
3244 },
3245 {
3246 /* OPC_EXT_36 */
3247 { "movlpX", { XM, EXq } },
3248 { "movhlpX", { XM, EXq } },
3249 },
3250 {
3251 /* OPC_EXT_37 */
3252 { "movhpX", { XM, EXq } },
3253 { "movlhpX", { XM, EXq } },
3254 },
3255 };
3256
3257 static const struct dis386 opc_ext_rm_table[][8] = {
3258 {
3259 /* OPC_EXT_RM_0 */
3260 { "(bad)", { XX } },
3261 { "vmcall", { Skip_MODRM } },
3262 { "vmlaunch", { Skip_MODRM } },
3263 { "vmresume", { Skip_MODRM } },
3264 { "vmxoff", { Skip_MODRM } },
3265 { "(bad)", { XX } },
3266 { "(bad)", { XX } },
3267 { "(bad)", { XX } },
3268 },
3269 {
3270 /* OPC_EXT_RM_1 */
3271 { "monitor", { { OP_Monitor, 0 } } },
3272 { "mwait", { { OP_Mwait, 0 } } },
3273 { "(bad)", { XX } },
3274 { "(bad)", { XX } },
3275 { "(bad)", { XX } },
3276 { "(bad)", { XX } },
3277 { "(bad)", { XX } },
3278 { "(bad)", { XX } },
3279 },
3280 {
3281 /* OPC_EXT_RM_2 */
3282 { "lfence", { Skip_MODRM } },
3283 { "(bad)", { XX } },
3284 { "(bad)", { XX } },
3285 { "(bad)", { XX } },
3286 { "(bad)", { XX } },
3287 { "(bad)", { XX } },
3288 { "(bad)", { XX } },
3289 { "(bad)", { XX } },
3290 },
3291 {
3292 /* OPC_EXT_RM_3 */
3293 { "mfence", { Skip_MODRM } },
3294 { "(bad)", { XX } },
3295 { "(bad)", { XX } },
3296 { "(bad)", { XX } },
3297 { "(bad)", { XX } },
3298 { "(bad)", { XX } },
3299 { "(bad)", { XX } },
3300 { "(bad)", { XX } },
3301 },
3302 {
3303 /* OPC_EXT_RM_4 */
3304 { "sfence", { Skip_MODRM } },
3305 { "(bad)", { XX } },
3306 { "(bad)", { XX } },
3307 { "(bad)", { XX } },
3308 { "(bad)", { XX } },
3309 { "(bad)", { XX } },
3310 { "(bad)", { XX } },
3311 { "(bad)", { XX } },
3312 },
3313 };
3314
3315 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
3316
3317 static void
3318 ckprefix (void)
3319 {
3320 int newrex;
3321 rex = 0;
3322 prefixes = 0;
3323 used_prefixes = 0;
3324 rex_used = 0;
3325 while (1)
3326 {
3327 FETCH_DATA (the_info, codep + 1);
3328 newrex = 0;
3329 switch (*codep)
3330 {
3331 /* REX prefixes family. */
3332 case 0x40:
3333 case 0x41:
3334 case 0x42:
3335 case 0x43:
3336 case 0x44:
3337 case 0x45:
3338 case 0x46:
3339 case 0x47:
3340 case 0x48:
3341 case 0x49:
3342 case 0x4a:
3343 case 0x4b:
3344 case 0x4c:
3345 case 0x4d:
3346 case 0x4e:
3347 case 0x4f:
3348 if (address_mode == mode_64bit)
3349 newrex = *codep;
3350 else
3351 return;
3352 break;
3353 case 0xf3:
3354 prefixes |= PREFIX_REPZ;
3355 break;
3356 case 0xf2:
3357 prefixes |= PREFIX_REPNZ;
3358 break;
3359 case 0xf0:
3360 prefixes |= PREFIX_LOCK;
3361 break;
3362 case 0x2e:
3363 prefixes |= PREFIX_CS;
3364 break;
3365 case 0x36:
3366 prefixes |= PREFIX_SS;
3367 break;
3368 case 0x3e:
3369 prefixes |= PREFIX_DS;
3370 break;
3371 case 0x26:
3372 prefixes |= PREFIX_ES;
3373 break;
3374 case 0x64:
3375 prefixes |= PREFIX_FS;
3376 break;
3377 case 0x65:
3378 prefixes |= PREFIX_GS;
3379 break;
3380 case 0x66:
3381 prefixes |= PREFIX_DATA;
3382 break;
3383 case 0x67:
3384 prefixes |= PREFIX_ADDR;
3385 break;
3386 case FWAIT_OPCODE:
3387 /* fwait is really an instruction. If there are prefixes
3388 before the fwait, they belong to the fwait, *not* to the
3389 following instruction. */
3390 if (prefixes || rex)
3391 {
3392 prefixes |= PREFIX_FWAIT;
3393 codep++;
3394 return;
3395 }
3396 prefixes = PREFIX_FWAIT;
3397 break;
3398 default:
3399 return;
3400 }
3401 /* Rex is ignored when followed by another prefix. */
3402 if (rex)
3403 {
3404 rex_used = rex;
3405 return;
3406 }
3407 rex = newrex;
3408 codep++;
3409 }
3410 }
3411
3412 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
3413 prefix byte. */
3414
3415 static const char *
3416 prefix_name (int pref, int sizeflag)
3417 {
3418 static const char *rexes [16] =
3419 {
3420 "rex", /* 0x40 */
3421 "rex.B", /* 0x41 */
3422 "rex.X", /* 0x42 */
3423 "rex.XB", /* 0x43 */
3424 "rex.R", /* 0x44 */
3425 "rex.RB", /* 0x45 */
3426 "rex.RX", /* 0x46 */
3427 "rex.RXB", /* 0x47 */
3428 "rex.W", /* 0x48 */
3429 "rex.WB", /* 0x49 */
3430 "rex.WX", /* 0x4a */
3431 "rex.WXB", /* 0x4b */
3432 "rex.WR", /* 0x4c */
3433 "rex.WRB", /* 0x4d */
3434 "rex.WRX", /* 0x4e */
3435 "rex.WRXB", /* 0x4f */
3436 };
3437
3438 switch (pref)
3439 {
3440 /* REX prefixes family. */
3441 case 0x40:
3442 case 0x41:
3443 case 0x42:
3444 case 0x43:
3445 case 0x44:
3446 case 0x45:
3447 case 0x46:
3448 case 0x47:
3449 case 0x48:
3450 case 0x49:
3451 case 0x4a:
3452 case 0x4b:
3453 case 0x4c:
3454 case 0x4d:
3455 case 0x4e:
3456 case 0x4f:
3457 return rexes [pref - 0x40];
3458 case 0xf3:
3459 return "repz";
3460 case 0xf2:
3461 return "repnz";
3462 case 0xf0:
3463 return "lock";
3464 case 0x2e:
3465 return "cs";
3466 case 0x36:
3467 return "ss";
3468 case 0x3e:
3469 return "ds";
3470 case 0x26:
3471 return "es";
3472 case 0x64:
3473 return "fs";
3474 case 0x65:
3475 return "gs";
3476 case 0x66:
3477 return (sizeflag & DFLAG) ? "data16" : "data32";
3478 case 0x67:
3479 if (address_mode == mode_64bit)
3480 return (sizeflag & AFLAG) ? "addr32" : "addr64";
3481 else
3482 return (sizeflag & AFLAG) ? "addr16" : "addr32";
3483 case FWAIT_OPCODE:
3484 return "fwait";
3485 default:
3486 return NULL;
3487 }
3488 }
3489
3490 static char op_out[MAX_OPERANDS][100];
3491 static int op_ad, op_index[MAX_OPERANDS];
3492 static int two_source_ops;
3493 static bfd_vma op_address[MAX_OPERANDS];
3494 static bfd_vma op_riprel[MAX_OPERANDS];
3495 static bfd_vma start_pc;
3496
3497 /*
3498 * On the 386's of 1988, the maximum length of an instruction is 15 bytes.
3499 * (see topic "Redundant prefixes" in the "Differences from 8086"
3500 * section of the "Virtual 8086 Mode" chapter.)
3501 * 'pc' should be the address of this instruction, it will
3502 * be used to print the target address if this is a relative jump or call
3503 * The function returns the length of this instruction in bytes.
3504 */
3505
3506 static char intel_syntax;
3507 static char open_char;
3508 static char close_char;
3509 static char separator_char;
3510 static char scale_char;
3511
3512 /* Here for backwards compatibility. When gdb stops using
3513 print_insn_i386_att and print_insn_i386_intel these functions can
3514 disappear, and print_insn_i386 be merged into print_insn. */
3515 int
3516 print_insn_i386_att (bfd_vma pc, disassemble_info *info)
3517 {
3518 intel_syntax = 0;
3519
3520 return print_insn (pc, info);
3521 }
3522
3523 int
3524 print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
3525 {
3526 intel_syntax = 1;
3527
3528 return print_insn (pc, info);
3529 }
3530
3531 int
3532 print_insn_i386 (bfd_vma pc, disassemble_info *info)
3533 {
3534 intel_syntax = -1;
3535
3536 return print_insn (pc, info);
3537 }
3538
3539 void
3540 print_i386_disassembler_options (FILE *stream)
3541 {
3542 fprintf (stream, _("\n\
3543 The following i386/x86-64 specific disassembler options are supported for use\n\
3544 with the -M switch (multiple options should be separated by commas):\n"));
3545
3546 fprintf (stream, _(" x86-64 Disassemble in 64bit mode\n"));
3547 fprintf (stream, _(" i386 Disassemble in 32bit mode\n"));
3548 fprintf (stream, _(" i8086 Disassemble in 16bit mode\n"));
3549 fprintf (stream, _(" att Display instruction in AT&T syntax\n"));
3550 fprintf (stream, _(" intel Display instruction in Intel syntax\n"));
3551 fprintf (stream, _(" addr64 Assume 64bit address size\n"));
3552 fprintf (stream, _(" addr32 Assume 32bit address size\n"));
3553 fprintf (stream, _(" addr16 Assume 16bit address size\n"));
3554 fprintf (stream, _(" data32 Assume 32bit data size\n"));
3555 fprintf (stream, _(" data16 Assume 16bit data size\n"));
3556 fprintf (stream, _(" suffix Always display instruction suffix in AT&T syntax\n"));
3557 }
3558
3559 /* Get a pointer to struct dis386 with a valid name. */
3560
3561 static const struct dis386 *
3562 get_valid_dis386 (const struct dis386 *dp)
3563 {
3564 int index;
3565
3566 if (dp->name != NULL)
3567 return dp;
3568
3569 switch (dp->op[0].bytemode)
3570 {
3571 case USE_GROUPS:
3572 dp = &grps[dp->op[1].bytemode][modrm.reg];
3573 break;
3574
3575 case USE_PREFIX_USER_TABLE:
3576 index = 0;
3577 used_prefixes |= (prefixes & PREFIX_REPZ);
3578 if (prefixes & PREFIX_REPZ)
3579 {
3580 index = 1;
3581 repz_prefix = NULL;
3582 }
3583 else
3584 {
3585 /* We should check PREFIX_REPNZ and PREFIX_REPZ before
3586 PREFIX_DATA. */
3587 used_prefixes |= (prefixes & PREFIX_REPNZ);
3588 if (prefixes & PREFIX_REPNZ)
3589 {
3590 index = 3;
3591 repnz_prefix = NULL;
3592 }
3593 else
3594 {
3595 used_prefixes |= (prefixes & PREFIX_DATA);
3596 if (prefixes & PREFIX_DATA)
3597 {
3598 index = 2;
3599 data_prefix = NULL;
3600 }
3601 }
3602 }
3603 dp = &prefix_user_table[dp->op[1].bytemode][index];
3604 break;
3605
3606 case X86_64_SPECIAL:
3607 index = address_mode == mode_64bit ? 1 : 0;
3608 dp = &x86_64_table[dp->op[1].bytemode][index];
3609 break;
3610
3611 case USE_OPC_EXT_TABLE:
3612 index = modrm.mod == 0x3 ? 1 : 0;
3613 dp = &opc_ext_table[dp->op[1].bytemode][index];
3614 break;
3615
3616 case USE_OPC_EXT_RM_TABLE:
3617 index = modrm.rm;
3618 dp = &opc_ext_rm_table[dp->op[1].bytemode][index];
3619 break;
3620
3621 default:
3622 oappend (INTERNAL_DISASSEMBLER_ERROR);
3623 return NULL;
3624 }
3625
3626 if (dp->name != NULL)
3627 return dp;
3628 else
3629 return get_valid_dis386 (dp);
3630 }
3631
3632 static int
3633 print_insn (bfd_vma pc, disassemble_info *info)
3634 {
3635 const struct dis386 *dp;
3636 int i;
3637 char *op_txt[MAX_OPERANDS];
3638 int needcomma;
3639 int sizeflag;
3640 const char *p;
3641 struct dis_private priv;
3642 unsigned char op;
3643 char prefix_obuf[32];
3644 char *prefix_obufp;
3645
3646 if (info->mach == bfd_mach_x86_64_intel_syntax
3647 || info->mach == bfd_mach_x86_64)
3648 address_mode = mode_64bit;
3649 else
3650 address_mode = mode_32bit;
3651
3652 if (intel_syntax == (char) -1)
3653 intel_syntax = (info->mach == bfd_mach_i386_i386_intel_syntax
3654 || info->mach == bfd_mach_x86_64_intel_syntax);
3655
3656 if (info->mach == bfd_mach_i386_i386
3657 || info->mach == bfd_mach_x86_64
3658 || info->mach == bfd_mach_i386_i386_intel_syntax
3659 || info->mach == bfd_mach_x86_64_intel_syntax)
3660 priv.orig_sizeflag = AFLAG | DFLAG;
3661 else if (info->mach == bfd_mach_i386_i8086)
3662 priv.orig_sizeflag = 0;
3663 else
3664 abort ();
3665
3666 for (p = info->disassembler_options; p != NULL; )
3667 {
3668 if (CONST_STRNEQ (p, "x86-64"))
3669 {
3670 address_mode = mode_64bit;
3671 priv.orig_sizeflag = AFLAG | DFLAG;
3672 }
3673 else if (CONST_STRNEQ (p, "i386"))
3674 {
3675 address_mode = mode_32bit;
3676 priv.orig_sizeflag = AFLAG | DFLAG;
3677 }
3678 else if (CONST_STRNEQ (p, "i8086"))
3679 {
3680 address_mode = mode_16bit;
3681 priv.orig_sizeflag = 0;
3682 }
3683 else if (CONST_STRNEQ (p, "intel"))
3684 {
3685 intel_syntax = 1;
3686 }
3687 else if (CONST_STRNEQ (p, "att"))
3688 {
3689 intel_syntax = 0;
3690 }
3691 else if (CONST_STRNEQ (p, "addr"))
3692 {
3693 if (address_mode == mode_64bit)
3694 {
3695 if (p[4] == '3' && p[5] == '2')
3696 priv.orig_sizeflag &= ~AFLAG;
3697 else if (p[4] == '6' && p[5] == '4')
3698 priv.orig_sizeflag |= AFLAG;
3699 }
3700 else
3701 {
3702 if (p[4] == '1' && p[5] == '6')
3703 priv.orig_sizeflag &= ~AFLAG;
3704 else if (p[4] == '3' && p[5] == '2')
3705 priv.orig_sizeflag |= AFLAG;
3706 }
3707 }
3708 else if (CONST_STRNEQ (p, "data"))
3709 {
3710 if (p[4] == '1' && p[5] == '6')
3711 priv.orig_sizeflag &= ~DFLAG;
3712 else if (p[4] == '3' && p[5] == '2')
3713 priv.orig_sizeflag |= DFLAG;
3714 }
3715 else if (CONST_STRNEQ (p, "suffix"))
3716 priv.orig_sizeflag |= SUFFIX_ALWAYS;
3717
3718 p = strchr (p, ',');
3719 if (p != NULL)
3720 p++;
3721 }
3722
3723 if (intel_syntax)
3724 {
3725 names64 = intel_names64;
3726 names32 = intel_names32;
3727 names16 = intel_names16;
3728 names8 = intel_names8;
3729 names8rex = intel_names8rex;
3730 names_seg = intel_names_seg;
3731 index16 = intel_index16;
3732 open_char = '[';
3733 close_char = ']';
3734 separator_char = '+';
3735 scale_char = '*';
3736 }
3737 else
3738 {
3739 names64 = att_names64;
3740 names32 = att_names32;
3741 names16 = att_names16;
3742 names8 = att_names8;
3743 names8rex = att_names8rex;
3744 names_seg = att_names_seg;
3745 index16 = att_index16;
3746 open_char = '(';
3747 close_char = ')';
3748 separator_char = ',';
3749 scale_char = ',';
3750 }
3751
3752 /* The output looks better if we put 7 bytes on a line, since that
3753 puts most long word instructions on a single line. */
3754 info->bytes_per_line = 7;
3755
3756 info->private_data = &priv;
3757 priv.max_fetched = priv.the_buffer;
3758 priv.insn_start = pc;
3759
3760 obuf[0] = 0;
3761 for (i = 0; i < MAX_OPERANDS; ++i)
3762 {
3763 op_out[i][0] = 0;
3764 op_index[i] = -1;
3765 }
3766
3767 the_info = info;
3768 start_pc = pc;
3769 start_codep = priv.the_buffer;
3770 codep = priv.the_buffer;
3771
3772 if (setjmp (priv.bailout) != 0)
3773 {
3774 const char *name;
3775
3776 /* Getting here means we tried for data but didn't get it. That
3777 means we have an incomplete instruction of some sort. Just
3778 print the first byte as a prefix or a .byte pseudo-op. */
3779 if (codep > priv.the_buffer)
3780 {
3781 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
3782 if (name != NULL)
3783 (*info->fprintf_func) (info->stream, "%s", name);
3784 else
3785 {
3786 /* Just print the first byte as a .byte instruction. */
3787 (*info->fprintf_func) (info->stream, ".byte 0x%x",
3788 (unsigned int) priv.the_buffer[0]);
3789 }
3790
3791 return 1;
3792 }
3793
3794 return -1;
3795 }
3796
3797 obufp = obuf;
3798 ckprefix ();
3799
3800 insn_codep = codep;
3801 sizeflag = priv.orig_sizeflag;
3802
3803 FETCH_DATA (info, codep + 1);
3804 two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
3805
3806 if (((prefixes & PREFIX_FWAIT)
3807 && ((*codep < 0xd8) || (*codep > 0xdf)))
3808 || (rex && rex_used))
3809 {
3810 const char *name;
3811
3812 /* fwait not followed by floating point instruction, or rex followed
3813 by other prefixes. Print the first prefix. */
3814 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
3815 if (name == NULL)
3816 name = INTERNAL_DISASSEMBLER_ERROR;
3817 (*info->fprintf_func) (info->stream, "%s", name);
3818 return 1;
3819 }
3820
3821 op = 0;
3822 if (*codep == 0x0f)
3823 {
3824 unsigned char threebyte;
3825 FETCH_DATA (info, codep + 2);
3826 threebyte = *++codep;
3827 dp = &dis386_twobyte[threebyte];
3828 need_modrm = twobyte_has_modrm[*codep];
3829 codep++;
3830 if (dp->name == NULL && dp->op[0].bytemode == IS_3BYTE_OPCODE)
3831 {
3832 FETCH_DATA (info, codep + 2);
3833 op = *codep++;
3834 }
3835 }
3836 else
3837 {
3838 dp = &dis386[*codep];
3839 need_modrm = onebyte_has_modrm[*codep];
3840 codep++;
3841 }
3842
3843 if ((prefixes & PREFIX_REPZ))
3844 {
3845 repz_prefix = "repz ";
3846 used_prefixes |= PREFIX_REPZ;
3847 }
3848 else
3849 repz_prefix = NULL;
3850
3851 if ((prefixes & PREFIX_REPNZ))
3852 {
3853 repnz_prefix = "repnz ";
3854 used_prefixes |= PREFIX_REPNZ;
3855 }
3856 else
3857 repnz_prefix = NULL;
3858
3859 if ((prefixes & PREFIX_LOCK))
3860 {
3861 lock_prefix = "lock ";
3862 used_prefixes |= PREFIX_LOCK;
3863 }
3864 else
3865 lock_prefix = NULL;
3866
3867 addr_prefix = NULL;
3868 if (prefixes & PREFIX_ADDR)
3869 {
3870 sizeflag ^= AFLAG;
3871 if (dp->op[2].bytemode != loop_jcxz_mode || intel_syntax)
3872 {
3873 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
3874 addr_prefix = "addr32 ";
3875 else
3876 addr_prefix = "addr16 ";
3877 used_prefixes |= PREFIX_ADDR;
3878 }
3879 }
3880
3881 data_prefix = NULL;
3882 if ((prefixes & PREFIX_DATA))
3883 {
3884 sizeflag ^= DFLAG;
3885 if (dp->op[2].bytemode == cond_jump_mode
3886 && dp->op[0].bytemode == v_mode
3887 && !intel_syntax)
3888 {
3889 if (sizeflag & DFLAG)
3890 data_prefix = "data32 ";
3891 else
3892 data_prefix = "data16 ";
3893 used_prefixes |= PREFIX_DATA;
3894 }
3895 }
3896
3897 if (dp->name == NULL && dp->op[0].bytemode == IS_3BYTE_OPCODE)
3898 {
3899 dp = &three_byte_table[dp->op[1].bytemode][op];
3900 modrm.mod = (*codep >> 6) & 3;
3901 modrm.reg = (*codep >> 3) & 7;
3902 modrm.rm = *codep & 7;
3903 }
3904 else if (need_modrm)
3905 {
3906 FETCH_DATA (info, codep + 1);
3907 modrm.mod = (*codep >> 6) & 3;
3908 modrm.reg = (*codep >> 3) & 7;
3909 modrm.rm = *codep & 7;
3910 }
3911
3912 if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
3913 {
3914 dofloat (sizeflag);
3915 }
3916 else
3917 {
3918 dp = get_valid_dis386 (dp);
3919 if (dp != NULL && putop (dp->name, sizeflag) == 0)
3920 {
3921 for (i = 0; i < MAX_OPERANDS; ++i)
3922 {
3923 obufp = op_out[i];
3924 op_ad = MAX_OPERANDS - 1 - i;
3925 if (dp->op[i].rtn)
3926 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
3927 }
3928 }
3929 }
3930
3931 /* See if any prefixes were not used. If so, print the first one
3932 separately. If we don't do this, we'll wind up printing an
3933 instruction stream which does not precisely correspond to the
3934 bytes we are disassembling. */
3935 if ((prefixes & ~used_prefixes) != 0)
3936 {
3937 const char *name;
3938
3939 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
3940 if (name == NULL)
3941 name = INTERNAL_DISASSEMBLER_ERROR;
3942 (*info->fprintf_func) (info->stream, "%s", name);
3943 return 1;
3944 }
3945 if (rex & ~rex_used)
3946 {
3947 const char *name;
3948 name = prefix_name (rex | 0x40, priv.orig_sizeflag);
3949 if (name == NULL)
3950 name = INTERNAL_DISASSEMBLER_ERROR;
3951 (*info->fprintf_func) (info->stream, "%s ", name);
3952 }
3953
3954 prefix_obuf[0] = 0;
3955 prefix_obufp = prefix_obuf;
3956 if (lock_prefix)
3957 prefix_obufp = stpcpy (prefix_obufp, lock_prefix);
3958 if (repz_prefix)
3959 prefix_obufp = stpcpy (prefix_obufp, repz_prefix);
3960 if (repnz_prefix)
3961 prefix_obufp = stpcpy (prefix_obufp, repnz_prefix);
3962 if (addr_prefix)
3963 prefix_obufp = stpcpy (prefix_obufp, addr_prefix);
3964 if (data_prefix)
3965 prefix_obufp = stpcpy (prefix_obufp, data_prefix);
3966
3967 if (prefix_obuf[0] != 0)
3968 (*info->fprintf_func) (info->stream, "%s", prefix_obuf);
3969
3970 obufp = obuf + strlen (obuf);
3971 for (i = strlen (obuf) + strlen (prefix_obuf); i < 6; i++)
3972 oappend (" ");
3973 oappend (" ");
3974 (*info->fprintf_func) (info->stream, "%s", obuf);
3975
3976 /* The enter and bound instructions are printed with operands in the same
3977 order as the intel book; everything else is printed in reverse order. */
3978 if (intel_syntax || two_source_ops)
3979 {
3980 bfd_vma riprel;
3981
3982 for (i = 0; i < MAX_OPERANDS; ++i)
3983 op_txt[i] = op_out[i];
3984
3985 for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
3986 {
3987 op_ad = op_index[i];
3988 op_index[i] = op_index[MAX_OPERANDS - 1 - i];
3989 op_index[MAX_OPERANDS - 1 - i] = op_ad;
3990 riprel = op_riprel[i];
3991 op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
3992 op_riprel[MAX_OPERANDS - 1 - i] = riprel;
3993 }
3994 }
3995 else
3996 {
3997 for (i = 0; i < MAX_OPERANDS; ++i)
3998 op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
3999 }
4000
4001 needcomma = 0;
4002 for (i = 0; i < MAX_OPERANDS; ++i)
4003 if (*op_txt[i])
4004 {
4005 if (needcomma)
4006 (*info->fprintf_func) (info->stream, ",");
4007 if (op_index[i] != -1 && !op_riprel[i])
4008 (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
4009 else
4010 (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
4011 needcomma = 1;
4012 }
4013
4014 for (i = 0; i < MAX_OPERANDS; i++)
4015 if (op_index[i] != -1 && op_riprel[i])
4016 {
4017 (*info->fprintf_func) (info->stream, " # ");
4018 (*info->print_address_func) ((bfd_vma) (start_pc + codep - start_codep
4019 + op_address[op_index[i]]), info);
4020 break;
4021 }
4022 return codep - priv.the_buffer;
4023 }
4024
4025 static const char *float_mem[] = {
4026 /* d8 */
4027 "fadd{s||s|}",
4028 "fmul{s||s|}",
4029 "fcom{s||s|}",
4030 "fcomp{s||s|}",
4031 "fsub{s||s|}",
4032 "fsubr{s||s|}",
4033 "fdiv{s||s|}",
4034 "fdivr{s||s|}",
4035 /* d9 */
4036 "fld{s||s|}",
4037 "(bad)",
4038 "fst{s||s|}",
4039 "fstp{s||s|}",
4040 "fldenvIC",
4041 "fldcw",
4042 "fNstenvIC",
4043 "fNstcw",
4044 /* da */
4045 "fiadd{l||l|}",
4046 "fimul{l||l|}",
4047 "ficom{l||l|}",
4048 "ficomp{l||l|}",
4049 "fisub{l||l|}",
4050 "fisubr{l||l|}",
4051 "fidiv{l||l|}",
4052 "fidivr{l||l|}",
4053 /* db */
4054 "fild{l||l|}",
4055 "fisttp{l||l|}",
4056 "fist{l||l|}",
4057 "fistp{l||l|}",
4058 "(bad)",
4059 "fld{t||t|}",
4060 "(bad)",
4061 "fstp{t||t|}",
4062 /* dc */
4063 "fadd{l||l|}",
4064 "fmul{l||l|}",
4065 "fcom{l||l|}",
4066 "fcomp{l||l|}",
4067 "fsub{l||l|}",
4068 "fsubr{l||l|}",
4069 "fdiv{l||l|}",
4070 "fdivr{l||l|}",
4071 /* dd */
4072 "fld{l||l|}",
4073 "fisttp{ll||ll|}",
4074 "fst{l||l|}",
4075 "fstp{l||l|}",
4076 "frstorIC",
4077 "(bad)",
4078 "fNsaveIC",
4079 "fNstsw",
4080 /* de */
4081 "fiadd",
4082 "fimul",
4083 "ficom",
4084 "ficomp",
4085 "fisub",
4086 "fisubr",
4087 "fidiv",
4088 "fidivr",
4089 /* df */
4090 "fild",
4091 "fisttp",
4092 "fist",
4093 "fistp",
4094 "fbld",
4095 "fild{ll||ll|}",
4096 "fbstp",
4097 "fistp{ll||ll|}",
4098 };
4099
4100 static const unsigned char float_mem_mode[] = {
4101 /* d8 */
4102 d_mode,
4103 d_mode,
4104 d_mode,
4105 d_mode,
4106 d_mode,
4107 d_mode,
4108 d_mode,
4109 d_mode,
4110 /* d9 */
4111 d_mode,
4112 0,
4113 d_mode,
4114 d_mode,
4115 0,
4116 w_mode,
4117 0,
4118 w_mode,
4119 /* da */
4120 d_mode,
4121 d_mode,
4122 d_mode,
4123 d_mode,
4124 d_mode,
4125 d_mode,
4126 d_mode,
4127 d_mode,
4128 /* db */
4129 d_mode,
4130 d_mode,
4131 d_mode,
4132 d_mode,
4133 0,
4134 t_mode,
4135 0,
4136 t_mode,
4137 /* dc */
4138 q_mode,
4139 q_mode,
4140 q_mode,
4141 q_mode,
4142 q_mode,
4143 q_mode,
4144 q_mode,
4145 q_mode,
4146 /* dd */
4147 q_mode,
4148 q_mode,
4149 q_mode,
4150 q_mode,
4151 0,
4152 0,
4153 0,
4154 w_mode,
4155 /* de */
4156 w_mode,
4157 w_mode,
4158 w_mode,
4159 w_mode,
4160 w_mode,
4161 w_mode,
4162 w_mode,
4163 w_mode,
4164 /* df */
4165 w_mode,
4166 w_mode,
4167 w_mode,
4168 w_mode,
4169 t_mode,
4170 q_mode,
4171 t_mode,
4172 q_mode
4173 };
4174
4175 #define ST { OP_ST, 0 }
4176 #define STi { OP_STi, 0 }
4177
4178 #define FGRPd9_2 NULL, { { NULL, 0 } }
4179 #define FGRPd9_4 NULL, { { NULL, 1 } }
4180 #define FGRPd9_5 NULL, { { NULL, 2 } }
4181 #define FGRPd9_6 NULL, { { NULL, 3 } }
4182 #define FGRPd9_7 NULL, { { NULL, 4 } }
4183 #define FGRPda_5 NULL, { { NULL, 5 } }
4184 #define FGRPdb_4 NULL, { { NULL, 6 } }
4185 #define FGRPde_3 NULL, { { NULL, 7 } }
4186 #define FGRPdf_4 NULL, { { NULL, 8 } }
4187
4188 static const struct dis386 float_reg[][8] = {
4189 /* d8 */
4190 {
4191 { "fadd", { ST, STi } },
4192 { "fmul", { ST, STi } },
4193 { "fcom", { STi } },
4194 { "fcomp", { STi } },
4195 { "fsub", { ST, STi } },
4196 { "fsubr", { ST, STi } },
4197 { "fdiv", { ST, STi } },
4198 { "fdivr", { ST, STi } },
4199 },
4200 /* d9 */
4201 {
4202 { "fld", { STi } },
4203 { "fxch", { STi } },
4204 { FGRPd9_2 },
4205 { "(bad)", { XX } },
4206 { FGRPd9_4 },
4207 { FGRPd9_5 },
4208 { FGRPd9_6 },
4209 { FGRPd9_7 },
4210 },
4211 /* da */
4212 {
4213 { "fcmovb", { ST, STi } },
4214 { "fcmove", { ST, STi } },
4215 { "fcmovbe",{ ST, STi } },
4216 { "fcmovu", { ST, STi } },
4217 { "(bad)", { XX } },
4218 { FGRPda_5 },
4219 { "(bad)", { XX } },
4220 { "(bad)", { XX } },
4221 },
4222 /* db */
4223 {
4224 { "fcmovnb",{ ST, STi } },
4225 { "fcmovne",{ ST, STi } },
4226 { "fcmovnbe",{ ST, STi } },
4227 { "fcmovnu",{ ST, STi } },
4228 { FGRPdb_4 },
4229 { "fucomi", { ST, STi } },
4230 { "fcomi", { ST, STi } },
4231 { "(bad)", { XX } },
4232 },
4233 /* dc */
4234 {
4235 { "fadd", { STi, ST } },
4236 { "fmul", { STi, ST } },
4237 { "(bad)", { XX } },
4238 { "(bad)", { XX } },
4239 #if SYSV386_COMPAT
4240 { "fsub", { STi, ST } },
4241 { "fsubr", { STi, ST } },
4242 { "fdiv", { STi, ST } },
4243 { "fdivr", { STi, ST } },
4244 #else
4245 { "fsubr", { STi, ST } },
4246 { "fsub", { STi, ST } },
4247 { "fdivr", { STi, ST } },
4248 { "fdiv", { STi, ST } },
4249 #endif
4250 },
4251 /* dd */
4252 {
4253 { "ffree", { STi } },
4254 { "(bad)", { XX } },
4255 { "fst", { STi } },
4256 { "fstp", { STi } },
4257 { "fucom", { STi } },
4258 { "fucomp", { STi } },
4259 { "(bad)", { XX } },
4260 { "(bad)", { XX } },
4261 },
4262 /* de */
4263 {
4264 { "faddp", { STi, ST } },
4265 { "fmulp", { STi, ST } },
4266 { "(bad)", { XX } },
4267 { FGRPde_3 },
4268 #if SYSV386_COMPAT
4269 { "fsubp", { STi, ST } },
4270 { "fsubrp", { STi, ST } },
4271 { "fdivp", { STi, ST } },
4272 { "fdivrp", { STi, ST } },
4273 #else
4274 { "fsubrp", { STi, ST } },
4275 { "fsubp", { STi, ST } },
4276 { "fdivrp", { STi, ST } },
4277 { "fdivp", { STi, ST } },
4278 #endif
4279 },
4280 /* df */
4281 {
4282 { "ffreep", { STi } },
4283 { "(bad)", { XX } },
4284 { "(bad)", { XX } },
4285 { "(bad)", { XX } },
4286 { FGRPdf_4 },
4287 { "fucomip", { ST, STi } },
4288 { "fcomip", { ST, STi } },
4289 { "(bad)", { XX } },
4290 },
4291 };
4292
4293 static char *fgrps[][8] = {
4294 /* d9_2 0 */
4295 {
4296 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
4297 },
4298
4299 /* d9_4 1 */
4300 {
4301 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
4302 },
4303
4304 /* d9_5 2 */
4305 {
4306 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
4307 },
4308
4309 /* d9_6 3 */
4310 {
4311 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
4312 },
4313
4314 /* d9_7 4 */
4315 {
4316 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
4317 },
4318
4319 /* da_5 5 */
4320 {
4321 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
4322 },
4323
4324 /* db_4 6 */
4325 {
4326 "feni(287 only)","fdisi(287 only)","fNclex","fNinit",
4327 "fNsetpm(287 only)","(bad)","(bad)","(bad)",
4328 },
4329
4330 /* de_3 7 */
4331 {
4332 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
4333 },
4334
4335 /* df_4 8 */
4336 {
4337 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
4338 },
4339 };
4340
4341 static void
4342 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
4343 int sizeflag ATTRIBUTE_UNUSED)
4344 {
4345 /* Skip mod/rm byte. */
4346 MODRM_CHECK;
4347 codep++;
4348 }
4349
4350 static void
4351 dofloat (int sizeflag)
4352 {
4353 const struct dis386 *dp;
4354 unsigned char floatop;
4355
4356 floatop = codep[-1];
4357
4358 if (modrm.mod != 3)
4359 {
4360 int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
4361
4362 putop (float_mem[fp_indx], sizeflag);
4363 obufp = op_out[0];
4364 op_ad = 2;
4365 OP_E (float_mem_mode[fp_indx], sizeflag);
4366 return;
4367 }
4368 /* Skip mod/rm byte. */
4369 MODRM_CHECK;
4370 codep++;
4371
4372 dp = &float_reg[floatop - 0xd8][modrm.reg];
4373 if (dp->name == NULL)
4374 {
4375 putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
4376
4377 /* Instruction fnstsw is only one with strange arg. */
4378 if (floatop == 0xdf && codep[-1] == 0xe0)
4379 strcpy (op_out[0], names16[0]);
4380 }
4381 else
4382 {
4383 putop (dp->name, sizeflag);
4384
4385 obufp = op_out[0];
4386 op_ad = 2;
4387 if (dp->op[0].rtn)
4388 (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
4389
4390 obufp = op_out[1];
4391 op_ad = 1;
4392 if (dp->op[1].rtn)
4393 (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
4394 }
4395 }
4396
4397 static void
4398 OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
4399 {
4400 oappend ("%st" + intel_syntax);
4401 }
4402
4403 static void
4404 OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
4405 {
4406 sprintf (scratchbuf, "%%st(%d)", modrm.rm);
4407 oappend (scratchbuf + intel_syntax);
4408 }
4409
4410 /* Capital letters in template are macros. */
4411 static int
4412 putop (const char *template, int sizeflag)
4413 {
4414 const char *p;
4415 int alt = 0;
4416
4417 for (p = template; *p; p++)
4418 {
4419 switch (*p)
4420 {
4421 default:
4422 *obufp++ = *p;
4423 break;
4424 case '{':
4425 alt = 0;
4426 if (intel_syntax)
4427 alt += 1;
4428 if (address_mode == mode_64bit)
4429 alt += 2;
4430 while (alt != 0)
4431 {
4432 while (*++p != '|')
4433 {
4434 if (*p == '}')
4435 {
4436 /* Alternative not valid. */
4437 strcpy (obuf, "(bad)");
4438 obufp = obuf + 5;
4439 return 1;
4440 }
4441 else if (*p == '\0')
4442 abort ();
4443 }
4444 alt--;
4445 }
4446 /* Fall through. */
4447 case 'I':
4448 alt = 1;
4449 continue;
4450 case '|':
4451 while (*++p != '}')
4452 {
4453 if (*p == '\0')
4454 abort ();
4455 }
4456 break;
4457 case '}':
4458 break;
4459 case 'A':
4460 if (intel_syntax)
4461 break;
4462 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
4463 *obufp++ = 'b';
4464 break;
4465 case 'B':
4466 if (intel_syntax)
4467 break;
4468 if (sizeflag & SUFFIX_ALWAYS)
4469 *obufp++ = 'b';
4470 break;
4471 case 'C':
4472 if (intel_syntax && !alt)
4473 break;
4474 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
4475 {
4476 if (sizeflag & DFLAG)
4477 *obufp++ = intel_syntax ? 'd' : 'l';
4478 else
4479 *obufp++ = intel_syntax ? 'w' : 's';
4480 used_prefixes |= (prefixes & PREFIX_DATA);
4481 }
4482 break;
4483 case 'D':
4484 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
4485 break;
4486 USED_REX (REX_W);
4487 if (modrm.mod == 3)
4488 {
4489 if (rex & REX_W)
4490 *obufp++ = 'q';
4491 else if (sizeflag & DFLAG)
4492 *obufp++ = intel_syntax ? 'd' : 'l';
4493 else
4494 *obufp++ = 'w';
4495 used_prefixes |= (prefixes & PREFIX_DATA);
4496 }
4497 else
4498 *obufp++ = 'w';
4499 break;
4500 case 'E': /* For jcxz/jecxz */
4501 if (address_mode == mode_64bit)
4502 {
4503 if (sizeflag & AFLAG)
4504 *obufp++ = 'r';
4505 else
4506 *obufp++ = 'e';
4507 }
4508 else
4509 if (sizeflag & AFLAG)
4510 *obufp++ = 'e';
4511 used_prefixes |= (prefixes & PREFIX_ADDR);
4512 break;
4513 case 'F':
4514 if (intel_syntax)
4515 break;
4516 if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
4517 {
4518 if (sizeflag & AFLAG)
4519 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
4520 else
4521 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
4522 used_prefixes |= (prefixes & PREFIX_ADDR);
4523 }
4524 break;
4525 case 'G':
4526 if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
4527 break;
4528 if ((rex & REX_W) || (sizeflag & DFLAG))
4529 *obufp++ = 'l';
4530 else
4531 *obufp++ = 'w';
4532 if (!(rex & REX_W))
4533 used_prefixes |= (prefixes & PREFIX_DATA);
4534 break;
4535 case 'H':
4536 if (intel_syntax)
4537 break;
4538 if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
4539 || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
4540 {
4541 used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
4542 *obufp++ = ',';
4543 *obufp++ = 'p';
4544 if (prefixes & PREFIX_DS)
4545 *obufp++ = 't';
4546 else
4547 *obufp++ = 'n';
4548 }
4549 break;
4550 case 'J':
4551 if (intel_syntax)
4552 break;
4553 *obufp++ = 'l';
4554 break;
4555 case 'K':
4556 USED_REX (REX_W);
4557 if (rex & REX_W)
4558 *obufp++ = 'q';
4559 else
4560 *obufp++ = 'd';
4561 break;
4562 case 'Z':
4563 if (intel_syntax)
4564 break;
4565 if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
4566 {
4567 *obufp++ = 'q';
4568 break;
4569 }
4570 /* Fall through. */
4571 case 'L':
4572 if (intel_syntax)
4573 break;
4574 if (sizeflag & SUFFIX_ALWAYS)
4575 *obufp++ = 'l';
4576 break;
4577 case 'N':
4578 if ((prefixes & PREFIX_FWAIT) == 0)
4579 *obufp++ = 'n';
4580 else
4581 used_prefixes |= PREFIX_FWAIT;
4582 break;
4583 case 'O':
4584 USED_REX (REX_W);
4585 if (rex & REX_W)
4586 *obufp++ = 'o';
4587 else if (intel_syntax && (sizeflag & DFLAG))
4588 *obufp++ = 'q';
4589 else
4590 *obufp++ = 'd';
4591 if (!(rex & REX_W))
4592 used_prefixes |= (prefixes & PREFIX_DATA);
4593 break;
4594 case 'T':
4595 if (intel_syntax)
4596 break;
4597 if (address_mode == mode_64bit && (sizeflag & DFLAG))
4598 {
4599 *obufp++ = 'q';
4600 break;
4601 }
4602 /* Fall through. */
4603 case 'P':
4604 if (intel_syntax)
4605 break;
4606 if ((prefixes & PREFIX_DATA)
4607 || (rex & REX_W)
4608 || (sizeflag & SUFFIX_ALWAYS))
4609 {
4610 USED_REX (REX_W);
4611 if (rex & REX_W)
4612 *obufp++ = 'q';
4613 else
4614 {
4615 if (sizeflag & DFLAG)
4616 *obufp++ = 'l';
4617 else
4618 *obufp++ = 'w';
4619 }
4620 used_prefixes |= (prefixes & PREFIX_DATA);
4621 }
4622 break;
4623 case 'U':
4624 if (intel_syntax)
4625 break;
4626 if (address_mode == mode_64bit && (sizeflag & DFLAG))
4627 {
4628 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
4629 *obufp++ = 'q';
4630 break;
4631 }
4632 /* Fall through. */
4633 case 'Q':
4634 if (intel_syntax && !alt)
4635 break;
4636 USED_REX (REX_W);
4637 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
4638 {
4639 if (rex & REX_W)
4640 *obufp++ = 'q';
4641 else
4642 {
4643 if (sizeflag & DFLAG)
4644 *obufp++ = intel_syntax ? 'd' : 'l';
4645 else
4646 *obufp++ = 'w';
4647 }
4648 used_prefixes |= (prefixes & PREFIX_DATA);
4649 }
4650 break;
4651 case 'R':
4652 USED_REX (REX_W);
4653 if (rex & REX_W)
4654 *obufp++ = 'q';
4655 else if (sizeflag & DFLAG)
4656 {
4657 if (intel_syntax)
4658 *obufp++ = 'd';
4659 else
4660 *obufp++ = 'l';
4661 }
4662 else
4663 *obufp++ = 'w';
4664 if (intel_syntax && !p[1]
4665 && ((rex & REX_W) || (sizeflag & DFLAG)))
4666 *obufp++ = 'e';
4667 if (!(rex & REX_W))
4668 used_prefixes |= (prefixes & PREFIX_DATA);
4669 break;
4670 case 'V':
4671 if (intel_syntax)
4672 break;
4673 if (address_mode == mode_64bit && (sizeflag & DFLAG))
4674 {
4675 if (sizeflag & SUFFIX_ALWAYS)
4676 *obufp++ = 'q';
4677 break;
4678 }
4679 /* Fall through. */
4680 case 'S':
4681 if (intel_syntax)
4682 break;
4683 if (sizeflag & SUFFIX_ALWAYS)
4684 {
4685 if (rex & REX_W)
4686 *obufp++ = 'q';
4687 else
4688 {
4689 if (sizeflag & DFLAG)
4690 *obufp++ = 'l';
4691 else
4692 *obufp++ = 'w';
4693 used_prefixes |= (prefixes & PREFIX_DATA);
4694 }
4695 }
4696 break;
4697 case 'X':
4698 if (prefixes & PREFIX_DATA)
4699 *obufp++ = 'd';
4700 else
4701 *obufp++ = 's';
4702 used_prefixes |= (prefixes & PREFIX_DATA);
4703 break;
4704 case 'Y':
4705 if (intel_syntax)
4706 break;
4707 if (rex & REX_W)
4708 {
4709 USED_REX (REX_W);
4710 *obufp++ = 'q';
4711 }
4712 break;
4713 /* implicit operand size 'l' for i386 or 'q' for x86-64 */
4714 case 'W':
4715 /* operand size flag for cwtl, cbtw */
4716 USED_REX (REX_W);
4717 if (rex & REX_W)
4718 {
4719 if (intel_syntax)
4720 *obufp++ = 'd';
4721 else
4722 *obufp++ = 'l';
4723 }
4724 else if (sizeflag & DFLAG)
4725 *obufp++ = 'w';
4726 else
4727 *obufp++ = 'b';
4728 if (!(rex & REX_W))
4729 used_prefixes |= (prefixes & PREFIX_DATA);
4730 break;
4731 }
4732 alt = 0;
4733 }
4734 *obufp = 0;
4735 return 0;
4736 }
4737
4738 static void
4739 oappend (const char *s)
4740 {
4741 strcpy (obufp, s);
4742 obufp += strlen (s);
4743 }
4744
4745 static void
4746 append_seg (void)
4747 {
4748 if (prefixes & PREFIX_CS)
4749 {
4750 used_prefixes |= PREFIX_CS;
4751 oappend ("%cs:" + intel_syntax);
4752 }
4753 if (prefixes & PREFIX_DS)
4754 {
4755 used_prefixes |= PREFIX_DS;
4756 oappend ("%ds:" + intel_syntax);
4757 }
4758 if (prefixes & PREFIX_SS)
4759 {
4760 used_prefixes |= PREFIX_SS;
4761 oappend ("%ss:" + intel_syntax);
4762 }
4763 if (prefixes & PREFIX_ES)
4764 {
4765 used_prefixes |= PREFIX_ES;
4766 oappend ("%es:" + intel_syntax);
4767 }
4768 if (prefixes & PREFIX_FS)
4769 {
4770 used_prefixes |= PREFIX_FS;
4771 oappend ("%fs:" + intel_syntax);
4772 }
4773 if (prefixes & PREFIX_GS)
4774 {
4775 used_prefixes |= PREFIX_GS;
4776 oappend ("%gs:" + intel_syntax);
4777 }
4778 }
4779
4780 static void
4781 OP_indirE (int bytemode, int sizeflag)
4782 {
4783 if (!intel_syntax)
4784 oappend ("*");
4785 OP_E (bytemode, sizeflag);
4786 }
4787
4788 static void
4789 print_operand_value (char *buf, int hex, bfd_vma disp)
4790 {
4791 if (address_mode == mode_64bit)
4792 {
4793 if (hex)
4794 {
4795 char tmp[30];
4796 int i;
4797 buf[0] = '0';
4798 buf[1] = 'x';
4799 sprintf_vma (tmp, disp);
4800 for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
4801 strcpy (buf + 2, tmp + i);
4802 }
4803 else
4804 {
4805 bfd_signed_vma v = disp;
4806 char tmp[30];
4807 int i;
4808 if (v < 0)
4809 {
4810 *(buf++) = '-';
4811 v = -disp;
4812 /* Check for possible overflow on 0x8000000000000000. */
4813 if (v < 0)
4814 {
4815 strcpy (buf, "9223372036854775808");
4816 return;
4817 }
4818 }
4819 if (!v)
4820 {
4821 strcpy (buf, "0");
4822 return;
4823 }
4824
4825 i = 0;
4826 tmp[29] = 0;
4827 while (v)
4828 {
4829 tmp[28 - i] = (v % 10) + '0';
4830 v /= 10;
4831 i++;
4832 }
4833 strcpy (buf, tmp + 29 - i);
4834 }
4835 }
4836 else
4837 {
4838 if (hex)
4839 sprintf (buf, "0x%x", (unsigned int) disp);
4840 else
4841 sprintf (buf, "%d", (int) disp);
4842 }
4843 }
4844
4845 /* Put DISP in BUF as signed hex number. */
4846
4847 static void
4848 print_displacement (char *buf, bfd_vma disp)
4849 {
4850 bfd_signed_vma val = disp;
4851 char tmp[30];
4852 int i, j = 0;
4853
4854 if (val < 0)
4855 {
4856 buf[j++] = '-';
4857 val = -disp;
4858
4859 /* Check for possible overflow. */
4860 if (val < 0)
4861 {
4862 switch (address_mode)
4863 {
4864 case mode_64bit:
4865 strcpy (buf + j, "0x8000000000000000");
4866 break;
4867 case mode_32bit:
4868 strcpy (buf + j, "0x80000000");
4869 break;
4870 case mode_16bit:
4871 strcpy (buf + j, "0x8000");
4872 break;
4873 }
4874 return;
4875 }
4876 }
4877
4878 buf[j++] = '0';
4879 buf[j++] = 'x';
4880
4881 sprintf_vma (tmp, val);
4882 for (i = 0; tmp[i] == '0'; i++)
4883 continue;
4884 if (tmp[i] == '\0')
4885 i--;
4886 strcpy (buf + j, tmp + i);
4887 }
4888
4889 static void
4890 intel_operand_size (int bytemode, int sizeflag)
4891 {
4892 switch (bytemode)
4893 {
4894 case b_mode:
4895 case dqb_mode:
4896 oappend ("BYTE PTR ");
4897 break;
4898 case w_mode:
4899 case dqw_mode:
4900 oappend ("WORD PTR ");
4901 break;
4902 case stack_v_mode:
4903 if (address_mode == mode_64bit && (sizeflag & DFLAG))
4904 {
4905 oappend ("QWORD PTR ");
4906 used_prefixes |= (prefixes & PREFIX_DATA);
4907 break;
4908 }
4909 /* FALLTHRU */
4910 case v_mode:
4911 case dq_mode:
4912 USED_REX (REX_W);
4913 if (rex & REX_W)
4914 oappend ("QWORD PTR ");
4915 else if ((sizeflag & DFLAG) || bytemode == dq_mode)
4916 oappend ("DWORD PTR ");
4917 else
4918 oappend ("WORD PTR ");
4919 used_prefixes |= (prefixes & PREFIX_DATA);
4920 break;
4921 case z_mode:
4922 if ((rex & REX_W) || (sizeflag & DFLAG))
4923 *obufp++ = 'D';
4924 oappend ("WORD PTR ");
4925 if (!(rex & REX_W))
4926 used_prefixes |= (prefixes & PREFIX_DATA);
4927 break;
4928 case d_mode:
4929 case dqd_mode:
4930 oappend ("DWORD PTR ");
4931 break;
4932 case q_mode:
4933 oappend ("QWORD PTR ");
4934 break;
4935 case m_mode:
4936 if (address_mode == mode_64bit)
4937 oappend ("QWORD PTR ");
4938 else
4939 oappend ("DWORD PTR ");
4940 break;
4941 case f_mode:
4942 if (sizeflag & DFLAG)
4943 oappend ("FWORD PTR ");
4944 else
4945 oappend ("DWORD PTR ");
4946 used_prefixes |= (prefixes & PREFIX_DATA);
4947 break;
4948 case t_mode:
4949 oappend ("TBYTE PTR ");
4950 break;
4951 case x_mode:
4952 oappend ("XMMWORD PTR ");
4953 break;
4954 case o_mode:
4955 oappend ("OWORD PTR ");
4956 break;
4957 default:
4958 break;
4959 }
4960 }
4961
4962 static void
4963 OP_E (int bytemode, int sizeflag)
4964 {
4965 bfd_vma disp;
4966 int add = 0;
4967 int riprel = 0;
4968 USED_REX (REX_B);
4969 if (rex & REX_B)
4970 add += 8;
4971
4972 /* Skip mod/rm byte. */
4973 MODRM_CHECK;
4974 codep++;
4975
4976 if (modrm.mod == 3)
4977 {
4978 switch (bytemode)
4979 {
4980 case b_mode:
4981 USED_REX (0);
4982 if (rex)
4983 oappend (names8rex[modrm.rm + add]);
4984 else
4985 oappend (names8[modrm.rm + add]);
4986 break;
4987 case w_mode:
4988 oappend (names16[modrm.rm + add]);
4989 break;
4990 case d_mode:
4991 oappend (names32[modrm.rm + add]);
4992 break;
4993 case q_mode:
4994 oappend (names64[modrm.rm + add]);
4995 break;
4996 case m_mode:
4997 if (address_mode == mode_64bit)
4998 oappend (names64[modrm.rm + add]);
4999 else
5000 oappend (names32[modrm.rm + add]);
5001 break;
5002 case stack_v_mode:
5003 if (address_mode == mode_64bit && (sizeflag & DFLAG))
5004 {
5005 oappend (names64[modrm.rm + add]);
5006 used_prefixes |= (prefixes & PREFIX_DATA);
5007 break;
5008 }
5009 bytemode = v_mode;
5010 /* FALLTHRU */
5011 case v_mode:
5012 case dq_mode:
5013 case dqb_mode:
5014 case dqd_mode:
5015 case dqw_mode:
5016 USED_REX (REX_W);
5017 if (rex & REX_W)
5018 oappend (names64[modrm.rm + add]);
5019 else if ((sizeflag & DFLAG) || bytemode != v_mode)
5020 oappend (names32[modrm.rm + add]);
5021 else
5022 oappend (names16[modrm.rm + add]);
5023 used_prefixes |= (prefixes & PREFIX_DATA);
5024 break;
5025 case 0:
5026 break;
5027 default:
5028 oappend (INTERNAL_DISASSEMBLER_ERROR);
5029 break;
5030 }
5031 return;
5032 }
5033
5034 disp = 0;
5035 if (intel_syntax)
5036 intel_operand_size (bytemode, sizeflag);
5037 append_seg ();
5038
5039 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
5040 {
5041 /* 32/64 bit address mode */
5042 int havedisp;
5043 int havesib;
5044 int havebase;
5045 int base;
5046 int index = 0;
5047 int scale = 0;
5048
5049 havesib = 0;
5050 havebase = 1;
5051 base = modrm.rm;
5052
5053 if (base == 4)
5054 {
5055 havesib = 1;
5056 FETCH_DATA (the_info, codep + 1);
5057 index = (*codep >> 3) & 7;
5058 if (address_mode == mode_64bit || index != 0x4)
5059 /* When INDEX == 0x4 in 32 bit mode, SCALE is ignored. */
5060 scale = (*codep >> 6) & 3;
5061 base = *codep & 7;
5062 USED_REX (REX_X);
5063 if (rex & REX_X)
5064 index += 8;
5065 codep++;
5066 }
5067 base += add;
5068
5069 switch (modrm.mod)
5070 {
5071 case 0:
5072 if ((base & 7) == 5)
5073 {
5074 havebase = 0;
5075 if (address_mode == mode_64bit && !havesib)
5076 riprel = 1;
5077 disp = get32s ();
5078 }
5079 break;
5080 case 1:
5081 FETCH_DATA (the_info, codep + 1);
5082 disp = *codep++;
5083 if ((disp & 0x80) != 0)
5084 disp -= 0x100;
5085 break;
5086 case 2:
5087 disp = get32s ();
5088 break;
5089 }
5090
5091 havedisp = havebase || (havesib && (index != 4 || scale != 0));
5092
5093 if (!intel_syntax)
5094 if (modrm.mod != 0 || (base & 7) == 5)
5095 {
5096 if (havedisp || riprel)
5097 print_displacement (scratchbuf, disp);
5098 else
5099 print_operand_value (scratchbuf, 1, disp);
5100 oappend (scratchbuf);
5101 if (riprel)
5102 {
5103 set_op (disp, 1);
5104 oappend ("(%rip)");
5105 }
5106 }
5107
5108 if (havedisp || (intel_syntax && riprel))
5109 {
5110 *obufp++ = open_char;
5111 if (intel_syntax && riprel)
5112 {
5113 set_op (disp, 1);
5114 oappend ("rip");
5115 }
5116 *obufp = '\0';
5117 if (havebase)
5118 oappend (address_mode == mode_64bit && (sizeflag & AFLAG)
5119 ? names64[base] : names32[base]);
5120 if (havesib)
5121 {
5122 if (index != 4)
5123 {
5124 if (!intel_syntax || havebase)
5125 {
5126 *obufp++ = separator_char;
5127 *obufp = '\0';
5128 }
5129 oappend (address_mode == mode_64bit && (sizeflag & AFLAG)
5130 ? names64[index] : names32[index]);
5131 }
5132 if (scale != 0 || (!intel_syntax && index != 4))
5133 {
5134 *obufp++ = scale_char;
5135 *obufp = '\0';
5136 sprintf (scratchbuf, "%d", 1 << scale);
5137 oappend (scratchbuf);
5138 }
5139 }
5140 if (intel_syntax
5141 && (disp || modrm.mod != 0 || (base & 7) == 5))
5142 {
5143 if ((bfd_signed_vma) disp >= 0)
5144 {
5145 *obufp++ = '+';
5146 *obufp = '\0';
5147 }
5148 else if (modrm.mod != 1)
5149 {
5150 *obufp++ = '-';
5151 *obufp = '\0';
5152 disp = - (bfd_signed_vma) disp;
5153 }
5154
5155 print_displacement (scratchbuf, disp);
5156 oappend (scratchbuf);
5157 }
5158
5159 *obufp++ = close_char;
5160 *obufp = '\0';
5161 }
5162 else if (intel_syntax)
5163 {
5164 if (modrm.mod != 0 || (base & 7) == 5)
5165 {
5166 if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
5167 | PREFIX_ES | PREFIX_FS | PREFIX_GS))
5168 ;
5169 else
5170 {
5171 oappend (names_seg[ds_reg - es_reg]);
5172 oappend (":");
5173 }
5174 print_operand_value (scratchbuf, 1, disp);
5175 oappend (scratchbuf);
5176 }
5177 }
5178 }
5179 else
5180 { /* 16 bit address mode */
5181 switch (modrm.mod)
5182 {
5183 case 0:
5184 if (modrm.rm == 6)
5185 {
5186 disp = get16 ();
5187 if ((disp & 0x8000) != 0)
5188 disp -= 0x10000;
5189 }
5190 break;
5191 case 1:
5192 FETCH_DATA (the_info, codep + 1);
5193 disp = *codep++;
5194 if ((disp & 0x80) != 0)
5195 disp -= 0x100;
5196 break;
5197 case 2:
5198 disp = get16 ();
5199 if ((disp & 0x8000) != 0)
5200 disp -= 0x10000;
5201 break;
5202 }
5203
5204 if (!intel_syntax)
5205 if (modrm.mod != 0 || modrm.rm == 6)
5206 {
5207 print_displacement (scratchbuf, disp);
5208 oappend (scratchbuf);
5209 }
5210
5211 if (modrm.mod != 0 || modrm.rm != 6)
5212 {
5213 *obufp++ = open_char;
5214 *obufp = '\0';
5215 oappend (index16[modrm.rm]);
5216 if (intel_syntax
5217 && (disp || modrm.mod != 0 || modrm.rm == 6))
5218 {
5219 if ((bfd_signed_vma) disp >= 0)
5220 {
5221 *obufp++ = '+';
5222 *obufp = '\0';
5223 }
5224 else if (modrm.mod != 1)
5225 {
5226 *obufp++ = '-';
5227 *obufp = '\0';
5228 disp = - (bfd_signed_vma) disp;
5229 }
5230
5231 print_displacement (scratchbuf, disp);
5232 oappend (scratchbuf);
5233 }
5234
5235 *obufp++ = close_char;
5236 *obufp = '\0';
5237 }
5238 else if (intel_syntax)
5239 {
5240 if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
5241 | PREFIX_ES | PREFIX_FS | PREFIX_GS))
5242 ;
5243 else
5244 {
5245 oappend (names_seg[ds_reg - es_reg]);
5246 oappend (":");
5247 }
5248 print_operand_value (scratchbuf, 1, disp & 0xffff);
5249 oappend (scratchbuf);
5250 }
5251 }
5252 }
5253
5254 static void
5255 OP_G (int bytemode, int sizeflag)
5256 {
5257 int add = 0;
5258 USED_REX (REX_R);
5259 if (rex & REX_R)
5260 add += 8;
5261 switch (bytemode)
5262 {
5263 case b_mode:
5264 USED_REX (0);
5265 if (rex)
5266 oappend (names8rex[modrm.reg + add]);
5267 else
5268 oappend (names8[modrm.reg + add]);
5269 break;
5270 case w_mode:
5271 oappend (names16[modrm.reg + add]);
5272 break;
5273 case d_mode:
5274 oappend (names32[modrm.reg + add]);
5275 break;
5276 case q_mode:
5277 oappend (names64[modrm.reg + add]);
5278 break;
5279 case v_mode:
5280 case dq_mode:
5281 case dqb_mode:
5282 case dqd_mode:
5283 case dqw_mode:
5284 USED_REX (REX_W);
5285 if (rex & REX_W)
5286 oappend (names64[modrm.reg + add]);
5287 else if ((sizeflag & DFLAG) || bytemode != v_mode)
5288 oappend (names32[modrm.reg + add]);
5289 else
5290 oappend (names16[modrm.reg + add]);
5291 used_prefixes |= (prefixes & PREFIX_DATA);
5292 break;
5293 case m_mode:
5294 if (address_mode == mode_64bit)
5295 oappend (names64[modrm.reg + add]);
5296 else
5297 oappend (names32[modrm.reg + add]);
5298 break;
5299 default:
5300 oappend (INTERNAL_DISASSEMBLER_ERROR);
5301 break;
5302 }
5303 }
5304
5305 static bfd_vma
5306 get64 (void)
5307 {
5308 bfd_vma x;
5309 #ifdef BFD64
5310 unsigned int a;
5311 unsigned int b;
5312
5313 FETCH_DATA (the_info, codep + 8);
5314 a = *codep++ & 0xff;
5315 a |= (*codep++ & 0xff) << 8;
5316 a |= (*codep++ & 0xff) << 16;
5317 a |= (*codep++ & 0xff) << 24;
5318 b = *codep++ & 0xff;
5319 b |= (*codep++ & 0xff) << 8;
5320 b |= (*codep++ & 0xff) << 16;
5321 b |= (*codep++ & 0xff) << 24;
5322 x = a + ((bfd_vma) b << 32);
5323 #else
5324 abort ();
5325 x = 0;
5326 #endif
5327 return x;
5328 }
5329
5330 static bfd_signed_vma
5331 get32 (void)
5332 {
5333 bfd_signed_vma x = 0;
5334
5335 FETCH_DATA (the_info, codep + 4);
5336 x = *codep++ & (bfd_signed_vma) 0xff;
5337 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
5338 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
5339 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
5340 return x;
5341 }
5342
5343 static bfd_signed_vma
5344 get32s (void)
5345 {
5346 bfd_signed_vma x = 0;
5347
5348 FETCH_DATA (the_info, codep + 4);
5349 x = *codep++ & (bfd_signed_vma) 0xff;
5350 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
5351 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
5352 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
5353
5354 x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
5355
5356 return x;
5357 }
5358
5359 static int
5360 get16 (void)
5361 {
5362 int x = 0;
5363
5364 FETCH_DATA (the_info, codep + 2);
5365 x = *codep++ & 0xff;
5366 x |= (*codep++ & 0xff) << 8;
5367 return x;
5368 }
5369
5370 static void
5371 set_op (bfd_vma op, int riprel)
5372 {
5373 op_index[op_ad] = op_ad;
5374 if (address_mode == mode_64bit)
5375 {
5376 op_address[op_ad] = op;
5377 op_riprel[op_ad] = riprel;
5378 }
5379 else
5380 {
5381 /* Mask to get a 32-bit address. */
5382 op_address[op_ad] = op & 0xffffffff;
5383 op_riprel[op_ad] = riprel & 0xffffffff;
5384 }
5385 }
5386
5387 static void
5388 OP_REG (int code, int sizeflag)
5389 {
5390 const char *s;
5391 int add = 0;
5392 USED_REX (REX_B);
5393 if (rex & REX_B)
5394 add = 8;
5395
5396 switch (code)
5397 {
5398 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
5399 case sp_reg: case bp_reg: case si_reg: case di_reg:
5400 s = names16[code - ax_reg + add];
5401 break;
5402 case es_reg: case ss_reg: case cs_reg:
5403 case ds_reg: case fs_reg: case gs_reg:
5404 s = names_seg[code - es_reg + add];
5405 break;
5406 case al_reg: case ah_reg: case cl_reg: case ch_reg:
5407 case dl_reg: case dh_reg: case bl_reg: case bh_reg:
5408 USED_REX (0);
5409 if (rex)
5410 s = names8rex[code - al_reg + add];
5411 else
5412 s = names8[code - al_reg];
5413 break;
5414 case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
5415 case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
5416 if (address_mode == mode_64bit && (sizeflag & DFLAG))
5417 {
5418 s = names64[code - rAX_reg + add];
5419 break;
5420 }
5421 code += eAX_reg - rAX_reg;
5422 /* Fall through. */
5423 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
5424 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
5425 USED_REX (REX_W);
5426 if (rex & REX_W)
5427 s = names64[code - eAX_reg + add];
5428 else if (sizeflag & DFLAG)
5429 s = names32[code - eAX_reg + add];
5430 else
5431 s = names16[code - eAX_reg + add];
5432 used_prefixes |= (prefixes & PREFIX_DATA);
5433 break;
5434 default:
5435 s = INTERNAL_DISASSEMBLER_ERROR;
5436 break;
5437 }
5438 oappend (s);
5439 }
5440
5441 static void
5442 OP_IMREG (int code, int sizeflag)
5443 {
5444 const char *s;
5445
5446 switch (code)
5447 {
5448 case indir_dx_reg:
5449 if (intel_syntax)
5450 s = "dx";
5451 else
5452 s = "(%dx)";
5453 break;
5454 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
5455 case sp_reg: case bp_reg: case si_reg: case di_reg:
5456 s = names16[code - ax_reg];
5457 break;
5458 case es_reg: case ss_reg: case cs_reg:
5459 case ds_reg: case fs_reg: case gs_reg:
5460 s = names_seg[code - es_reg];
5461 break;
5462 case al_reg: case ah_reg: case cl_reg: case ch_reg:
5463 case dl_reg: case dh_reg: case bl_reg: case bh_reg:
5464 USED_REX (0);
5465 if (rex)
5466 s = names8rex[code - al_reg];
5467 else
5468 s = names8[code - al_reg];
5469 break;
5470 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
5471 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
5472 USED_REX (REX_W);
5473 if (rex & REX_W)
5474 s = names64[code - eAX_reg];
5475 else if (sizeflag & DFLAG)
5476 s = names32[code - eAX_reg];
5477 else
5478 s = names16[code - eAX_reg];
5479 used_prefixes |= (prefixes & PREFIX_DATA);
5480 break;
5481 case z_mode_ax_reg:
5482 if ((rex & REX_W) || (sizeflag & DFLAG))
5483 s = *names32;
5484 else
5485 s = *names16;
5486 if (!(rex & REX_W))
5487 used_prefixes |= (prefixes & PREFIX_DATA);
5488 break;
5489 default:
5490 s = INTERNAL_DISASSEMBLER_ERROR;
5491 break;
5492 }
5493 oappend (s);
5494 }
5495
5496 static void
5497 OP_I (int bytemode, int sizeflag)
5498 {
5499 bfd_signed_vma op;
5500 bfd_signed_vma mask = -1;
5501
5502 switch (bytemode)
5503 {
5504 case b_mode:
5505 FETCH_DATA (the_info, codep + 1);
5506 op = *codep++;
5507 mask = 0xff;
5508 break;
5509 case q_mode:
5510 if (address_mode == mode_64bit)
5511 {
5512 op = get32s ();
5513 break;
5514 }
5515 /* Fall through. */
5516 case v_mode:
5517 USED_REX (REX_W);
5518 if (rex & REX_W)
5519 op = get32s ();
5520 else if (sizeflag & DFLAG)
5521 {
5522 op = get32 ();
5523 mask = 0xffffffff;
5524 }
5525 else
5526 {
5527 op = get16 ();
5528 mask = 0xfffff;
5529 }
5530 used_prefixes |= (prefixes & PREFIX_DATA);
5531 break;
5532 case w_mode:
5533 mask = 0xfffff;
5534 op = get16 ();
5535 break;
5536 case const_1_mode:
5537 if (intel_syntax)
5538 oappend ("1");
5539 return;
5540 default:
5541 oappend (INTERNAL_DISASSEMBLER_ERROR);
5542 return;
5543 }
5544
5545 op &= mask;
5546 scratchbuf[0] = '$';
5547 print_operand_value (scratchbuf + 1, 1, op);
5548 oappend (scratchbuf + intel_syntax);
5549 scratchbuf[0] = '\0';
5550 }
5551
5552 static void
5553 OP_I64 (int bytemode, int sizeflag)
5554 {
5555 bfd_signed_vma op;
5556 bfd_signed_vma mask = -1;
5557
5558 if (address_mode != mode_64bit)
5559 {
5560 OP_I (bytemode, sizeflag);
5561 return;
5562 }
5563
5564 switch (bytemode)
5565 {
5566 case b_mode:
5567 FETCH_DATA (the_info, codep + 1);
5568 op = *codep++;
5569 mask = 0xff;
5570 break;
5571 case v_mode:
5572 USED_REX (REX_W);
5573 if (rex & REX_W)
5574 op = get64 ();
5575 else if (sizeflag & DFLAG)
5576 {
5577 op = get32 ();
5578 mask = 0xffffffff;
5579 }
5580 else
5581 {
5582 op = get16 ();
5583 mask = 0xfffff;
5584 }
5585 used_prefixes |= (prefixes & PREFIX_DATA);
5586 break;
5587 case w_mode:
5588 mask = 0xfffff;
5589 op = get16 ();
5590 break;
5591 default:
5592 oappend (INTERNAL_DISASSEMBLER_ERROR);
5593 return;
5594 }
5595
5596 op &= mask;
5597 scratchbuf[0] = '$';
5598 print_operand_value (scratchbuf + 1, 1, op);
5599 oappend (scratchbuf + intel_syntax);
5600 scratchbuf[0] = '\0';
5601 }
5602
5603 static void
5604 OP_sI (int bytemode, int sizeflag)
5605 {
5606 bfd_signed_vma op;
5607 bfd_signed_vma mask = -1;
5608
5609 switch (bytemode)
5610 {
5611 case b_mode:
5612 FETCH_DATA (the_info, codep + 1);
5613 op = *codep++;
5614 if ((op & 0x80) != 0)
5615 op -= 0x100;
5616 mask = 0xffffffff;
5617 break;
5618 case v_mode:
5619 USED_REX (REX_W);
5620 if (rex & REX_W)
5621 op = get32s ();
5622 else if (sizeflag & DFLAG)
5623 {
5624 op = get32s ();
5625 mask = 0xffffffff;
5626 }
5627 else
5628 {
5629 mask = 0xffffffff;
5630 op = get16 ();
5631 if ((op & 0x8000) != 0)
5632 op -= 0x10000;
5633 }
5634 used_prefixes |= (prefixes & PREFIX_DATA);
5635 break;
5636 case w_mode:
5637 op = get16 ();
5638 mask = 0xffffffff;
5639 if ((op & 0x8000) != 0)
5640 op -= 0x10000;
5641 break;
5642 default:
5643 oappend (INTERNAL_DISASSEMBLER_ERROR);
5644 return;
5645 }
5646
5647 scratchbuf[0] = '$';
5648 print_operand_value (scratchbuf + 1, 1, op);
5649 oappend (scratchbuf + intel_syntax);
5650 }
5651
5652 static void
5653 OP_J (int bytemode, int sizeflag)
5654 {
5655 bfd_vma disp;
5656 bfd_vma mask = -1;
5657 bfd_vma segment = 0;
5658
5659 switch (bytemode)
5660 {
5661 case b_mode:
5662 FETCH_DATA (the_info, codep + 1);
5663 disp = *codep++;
5664 if ((disp & 0x80) != 0)
5665 disp -= 0x100;
5666 break;
5667 case v_mode:
5668 if ((sizeflag & DFLAG) || (rex & REX_W))
5669 disp = get32s ();
5670 else
5671 {
5672 disp = get16 ();
5673 if ((disp & 0x8000) != 0)
5674 disp -= 0x10000;
5675 /* In 16bit mode, address is wrapped around at 64k within
5676 the same segment. Otherwise, a data16 prefix on a jump
5677 instruction means that the pc is masked to 16 bits after
5678 the displacement is added! */
5679 mask = 0xffff;
5680 if ((prefixes & PREFIX_DATA) == 0)
5681 segment = ((start_pc + codep - start_codep)
5682 & ~((bfd_vma) 0xffff));
5683 }
5684 used_prefixes |= (prefixes & PREFIX_DATA);
5685 break;
5686 default:
5687 oappend (INTERNAL_DISASSEMBLER_ERROR);
5688 return;
5689 }
5690 disp = ((start_pc + codep - start_codep + disp) & mask) | segment;
5691 set_op (disp, 0);
5692 print_operand_value (scratchbuf, 1, disp);
5693 oappend (scratchbuf);
5694 }
5695
5696 static void
5697 OP_SEG (int bytemode, int sizeflag)
5698 {
5699 if (bytemode == w_mode)
5700 oappend (names_seg[modrm.reg]);
5701 else
5702 OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
5703 }
5704
5705 static void
5706 OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
5707 {
5708 int seg, offset;
5709
5710 if (sizeflag & DFLAG)
5711 {
5712 offset = get32 ();
5713 seg = get16 ();
5714 }
5715 else
5716 {
5717 offset = get16 ();
5718 seg = get16 ();
5719 }
5720 used_prefixes |= (prefixes & PREFIX_DATA);
5721 if (intel_syntax)
5722 sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
5723 else
5724 sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
5725 oappend (scratchbuf);
5726 }
5727
5728 static void
5729 OP_OFF (int bytemode, int sizeflag)
5730 {
5731 bfd_vma off;
5732
5733 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
5734 intel_operand_size (bytemode, sizeflag);
5735 append_seg ();
5736
5737 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
5738 off = get32 ();
5739 else
5740 off = get16 ();
5741
5742 if (intel_syntax)
5743 {
5744 if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
5745 | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
5746 {
5747 oappend (names_seg[ds_reg - es_reg]);
5748 oappend (":");
5749 }
5750 }
5751 print_operand_value (scratchbuf, 1, off);
5752 oappend (scratchbuf);
5753 }
5754
5755 static void
5756 OP_OFF64 (int bytemode, int sizeflag)
5757 {
5758 bfd_vma off;
5759
5760 if (address_mode != mode_64bit
5761 || (prefixes & PREFIX_ADDR))
5762 {
5763 OP_OFF (bytemode, sizeflag);
5764 return;
5765 }
5766
5767 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
5768 intel_operand_size (bytemode, sizeflag);
5769 append_seg ();
5770
5771 off = get64 ();
5772
5773 if (intel_syntax)
5774 {
5775 if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
5776 | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
5777 {
5778 oappend (names_seg[ds_reg - es_reg]);
5779 oappend (":");
5780 }
5781 }
5782 print_operand_value (scratchbuf, 1, off);
5783 oappend (scratchbuf);
5784 }
5785
5786 static void
5787 ptr_reg (int code, int sizeflag)
5788 {
5789 const char *s;
5790
5791 *obufp++ = open_char;
5792 used_prefixes |= (prefixes & PREFIX_ADDR);
5793 if (address_mode == mode_64bit)
5794 {
5795 if (!(sizeflag & AFLAG))
5796 s = names32[code - eAX_reg];
5797 else
5798 s = names64[code - eAX_reg];
5799 }
5800 else if (sizeflag & AFLAG)
5801 s = names32[code - eAX_reg];
5802 else
5803 s = names16[code - eAX_reg];
5804 oappend (s);
5805 *obufp++ = close_char;
5806 *obufp = 0;
5807 }
5808
5809 static void
5810 OP_ESreg (int code, int sizeflag)
5811 {
5812 if (intel_syntax)
5813 {
5814 switch (codep[-1])
5815 {
5816 case 0x6d: /* insw/insl */
5817 intel_operand_size (z_mode, sizeflag);
5818 break;
5819 case 0xa5: /* movsw/movsl/movsq */
5820 case 0xa7: /* cmpsw/cmpsl/cmpsq */
5821 case 0xab: /* stosw/stosl */
5822 case 0xaf: /* scasw/scasl */
5823 intel_operand_size (v_mode, sizeflag);
5824 break;
5825 default:
5826 intel_operand_size (b_mode, sizeflag);
5827 }
5828 }
5829 oappend ("%es:" + intel_syntax);
5830 ptr_reg (code, sizeflag);
5831 }
5832
5833 static void
5834 OP_DSreg (int code, int sizeflag)
5835 {
5836 if (intel_syntax)
5837 {
5838 switch (codep[-1])
5839 {
5840 case 0x6f: /* outsw/outsl */
5841 intel_operand_size (z_mode, sizeflag);
5842 break;
5843 case 0xa5: /* movsw/movsl/movsq */
5844 case 0xa7: /* cmpsw/cmpsl/cmpsq */
5845 case 0xad: /* lodsw/lodsl/lodsq */
5846 intel_operand_size (v_mode, sizeflag);
5847 break;
5848 default:
5849 intel_operand_size (b_mode, sizeflag);
5850 }
5851 }
5852 if ((prefixes
5853 & (PREFIX_CS
5854 | PREFIX_DS
5855 | PREFIX_SS
5856 | PREFIX_ES
5857 | PREFIX_FS
5858 | PREFIX_GS)) == 0)
5859 prefixes |= PREFIX_DS;
5860 append_seg ();
5861 ptr_reg (code, sizeflag);
5862 }
5863
5864 static void
5865 OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
5866 {
5867 int add = 0;
5868 if (rex & REX_R)
5869 {
5870 USED_REX (REX_R);
5871 add = 8;
5872 }
5873 else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
5874 {
5875 lock_prefix = NULL;
5876 used_prefixes |= PREFIX_LOCK;
5877 add = 8;
5878 }
5879 sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
5880 oappend (scratchbuf + intel_syntax);
5881 }
5882
5883 static void
5884 OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
5885 {
5886 int add = 0;
5887 USED_REX (REX_R);
5888 if (rex & REX_R)
5889 add = 8;
5890 if (intel_syntax)
5891 sprintf (scratchbuf, "db%d", modrm.reg + add);
5892 else
5893 sprintf (scratchbuf, "%%db%d", modrm.reg + add);
5894 oappend (scratchbuf);
5895 }
5896
5897 static void
5898 OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
5899 {
5900 sprintf (scratchbuf, "%%tr%d", modrm.reg);
5901 oappend (scratchbuf + intel_syntax);
5902 }
5903
5904 static void
5905 OP_R (int bytemode, int sizeflag)
5906 {
5907 if (modrm.mod == 3)
5908 OP_E (bytemode, sizeflag);
5909 else
5910 BadOp ();
5911 }
5912
5913 static void
5914 OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
5915 {
5916 used_prefixes |= (prefixes & PREFIX_DATA);
5917 if (prefixes & PREFIX_DATA)
5918 {
5919 int add = 0;
5920 USED_REX (REX_R);
5921 if (rex & REX_R)
5922 add = 8;
5923 sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
5924 }
5925 else
5926 sprintf (scratchbuf, "%%mm%d", modrm.reg);
5927 oappend (scratchbuf + intel_syntax);
5928 }
5929
5930 static void
5931 OP_XMM (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
5932 {
5933 int add = 0;
5934 USED_REX (REX_R);
5935 if (rex & REX_R)
5936 add = 8;
5937 sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
5938 oappend (scratchbuf + intel_syntax);
5939 }
5940
5941 static void
5942 OP_EM (int bytemode, int sizeflag)
5943 {
5944 if (modrm.mod != 3)
5945 {
5946 if (intel_syntax && bytemode == v_mode)
5947 {
5948 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
5949 used_prefixes |= (prefixes & PREFIX_DATA);
5950 }
5951 OP_E (bytemode, sizeflag);
5952 return;
5953 }
5954
5955 /* Skip mod/rm byte. */
5956 MODRM_CHECK;
5957 codep++;
5958 used_prefixes |= (prefixes & PREFIX_DATA);
5959 if (prefixes & PREFIX_DATA)
5960 {
5961 int add = 0;
5962
5963 USED_REX (REX_B);
5964 if (rex & REX_B)
5965 add = 8;
5966 sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
5967 }
5968 else
5969 sprintf (scratchbuf, "%%mm%d", modrm.rm);
5970 oappend (scratchbuf + intel_syntax);
5971 }
5972
5973 /* cvt* are the only instructions in sse2 which have
5974 both SSE and MMX operands and also have 0x66 prefix
5975 in their opcode. 0x66 was originally used to differentiate
5976 between SSE and MMX instruction(operands). So we have to handle the
5977 cvt* separately using OP_EMC and OP_MXC */
5978 static void
5979 OP_EMC (int bytemode, int sizeflag)
5980 {
5981 if (modrm.mod != 3)
5982 {
5983 if (intel_syntax && bytemode == v_mode)
5984 {
5985 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
5986 used_prefixes |= (prefixes & PREFIX_DATA);
5987 }
5988 OP_E (bytemode, sizeflag);
5989 return;
5990 }
5991
5992 /* Skip mod/rm byte. */
5993 MODRM_CHECK;
5994 codep++;
5995 used_prefixes |= (prefixes & PREFIX_DATA);
5996 sprintf (scratchbuf, "%%mm%d", modrm.rm);
5997 oappend (scratchbuf + intel_syntax);
5998 }
5999
6000 static void
6001 OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
6002 {
6003 used_prefixes |= (prefixes & PREFIX_DATA);
6004 sprintf (scratchbuf, "%%mm%d", modrm.reg);
6005 oappend (scratchbuf + intel_syntax);
6006 }
6007
6008 static void
6009 OP_EX (int bytemode, int sizeflag)
6010 {
6011 int add = 0;
6012 if (modrm.mod != 3)
6013 {
6014 OP_E (bytemode, sizeflag);
6015 return;
6016 }
6017 USED_REX (REX_B);
6018 if (rex & REX_B)
6019 add = 8;
6020
6021 /* Skip mod/rm byte. */
6022 MODRM_CHECK;
6023 codep++;
6024 sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
6025 oappend (scratchbuf + intel_syntax);
6026 }
6027
6028 static void
6029 OP_MS (int bytemode, int sizeflag)
6030 {
6031 if (modrm.mod == 3)
6032 OP_EM (bytemode, sizeflag);
6033 else
6034 BadOp ();
6035 }
6036
6037 static void
6038 OP_XS (int bytemode, int sizeflag)
6039 {
6040 if (modrm.mod == 3)
6041 OP_EX (bytemode, sizeflag);
6042 else
6043 BadOp ();
6044 }
6045
6046 static void
6047 OP_M (int bytemode, int sizeflag)
6048 {
6049 if (modrm.mod == 3)
6050 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
6051 BadOp ();
6052 else
6053 OP_E (bytemode, sizeflag);
6054 }
6055
6056 static void
6057 OP_0f07 (int bytemode, int sizeflag)
6058 {
6059 if (modrm.mod != 3 || modrm.rm != 0)
6060 BadOp ();
6061 else
6062 OP_E (bytemode, sizeflag);
6063 }
6064
6065 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
6066 32bit mode and "xchg %rax,%rax" in 64bit mode. */
6067
6068 static void
6069 NOP_Fixup1 (int bytemode, int sizeflag)
6070 {
6071 if ((prefixes & PREFIX_DATA) != 0
6072 || (rex != 0
6073 && rex != 0x48
6074 && address_mode == mode_64bit))
6075 OP_REG (bytemode, sizeflag);
6076 else
6077 strcpy (obuf, "nop");
6078 }
6079
6080 static void
6081 NOP_Fixup2 (int bytemode, int sizeflag)
6082 {
6083 if ((prefixes & PREFIX_DATA) != 0
6084 || (rex != 0
6085 && rex != 0x48
6086 && address_mode == mode_64bit))
6087 OP_IMREG (bytemode, sizeflag);
6088 }
6089
6090 static const char *const Suffix3DNow[] = {
6091 /* 00 */ NULL, NULL, NULL, NULL,
6092 /* 04 */ NULL, NULL, NULL, NULL,
6093 /* 08 */ NULL, NULL, NULL, NULL,
6094 /* 0C */ "pi2fw", "pi2fd", NULL, NULL,
6095 /* 10 */ NULL, NULL, NULL, NULL,
6096 /* 14 */ NULL, NULL, NULL, NULL,
6097 /* 18 */ NULL, NULL, NULL, NULL,
6098 /* 1C */ "pf2iw", "pf2id", NULL, NULL,
6099 /* 20 */ NULL, NULL, NULL, NULL,
6100 /* 24 */ NULL, NULL, NULL, NULL,
6101 /* 28 */ NULL, NULL, NULL, NULL,
6102 /* 2C */ NULL, NULL, NULL, NULL,
6103 /* 30 */ NULL, NULL, NULL, NULL,
6104 /* 34 */ NULL, NULL, NULL, NULL,
6105 /* 38 */ NULL, NULL, NULL, NULL,
6106 /* 3C */ NULL, NULL, NULL, NULL,
6107 /* 40 */ NULL, NULL, NULL, NULL,
6108 /* 44 */ NULL, NULL, NULL, NULL,
6109 /* 48 */ NULL, NULL, NULL, NULL,
6110 /* 4C */ NULL, NULL, NULL, NULL,
6111 /* 50 */ NULL, NULL, NULL, NULL,
6112 /* 54 */ NULL, NULL, NULL, NULL,
6113 /* 58 */ NULL, NULL, NULL, NULL,
6114 /* 5C */ NULL, NULL, NULL, NULL,
6115 /* 60 */ NULL, NULL, NULL, NULL,
6116 /* 64 */ NULL, NULL, NULL, NULL,
6117 /* 68 */ NULL, NULL, NULL, NULL,
6118 /* 6C */ NULL, NULL, NULL, NULL,
6119 /* 70 */ NULL, NULL, NULL, NULL,
6120 /* 74 */ NULL, NULL, NULL, NULL,
6121 /* 78 */ NULL, NULL, NULL, NULL,
6122 /* 7C */ NULL, NULL, NULL, NULL,
6123 /* 80 */ NULL, NULL, NULL, NULL,
6124 /* 84 */ NULL, NULL, NULL, NULL,
6125 /* 88 */ NULL, NULL, "pfnacc", NULL,
6126 /* 8C */ NULL, NULL, "pfpnacc", NULL,
6127 /* 90 */ "pfcmpge", NULL, NULL, NULL,
6128 /* 94 */ "pfmin", NULL, "pfrcp", "pfrsqrt",
6129 /* 98 */ NULL, NULL, "pfsub", NULL,
6130 /* 9C */ NULL, NULL, "pfadd", NULL,
6131 /* A0 */ "pfcmpgt", NULL, NULL, NULL,
6132 /* A4 */ "pfmax", NULL, "pfrcpit1", "pfrsqit1",
6133 /* A8 */ NULL, NULL, "pfsubr", NULL,
6134 /* AC */ NULL, NULL, "pfacc", NULL,
6135 /* B0 */ "pfcmpeq", NULL, NULL, NULL,
6136 /* B4 */ "pfmul", NULL, "pfrcpit2", "pmulhrw",
6137 /* B8 */ NULL, NULL, NULL, "pswapd",
6138 /* BC */ NULL, NULL, NULL, "pavgusb",
6139 /* C0 */ NULL, NULL, NULL, NULL,
6140 /* C4 */ NULL, NULL, NULL, NULL,
6141 /* C8 */ NULL, NULL, NULL, NULL,
6142 /* CC */ NULL, NULL, NULL, NULL,
6143 /* D0 */ NULL, NULL, NULL, NULL,
6144 /* D4 */ NULL, NULL, NULL, NULL,
6145 /* D8 */ NULL, NULL, NULL, NULL,
6146 /* DC */ NULL, NULL, NULL, NULL,
6147 /* E0 */ NULL, NULL, NULL, NULL,
6148 /* E4 */ NULL, NULL, NULL, NULL,
6149 /* E8 */ NULL, NULL, NULL, NULL,
6150 /* EC */ NULL, NULL, NULL, NULL,
6151 /* F0 */ NULL, NULL, NULL, NULL,
6152 /* F4 */ NULL, NULL, NULL, NULL,
6153 /* F8 */ NULL, NULL, NULL, NULL,
6154 /* FC */ NULL, NULL, NULL, NULL,
6155 };
6156
6157 static void
6158 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
6159 {
6160 const char *mnemonic;
6161
6162 FETCH_DATA (the_info, codep + 1);
6163 /* AMD 3DNow! instructions are specified by an opcode suffix in the
6164 place where an 8-bit immediate would normally go. ie. the last
6165 byte of the instruction. */
6166 obufp = obuf + strlen (obuf);
6167 mnemonic = Suffix3DNow[*codep++ & 0xff];
6168 if (mnemonic)
6169 oappend (mnemonic);
6170 else
6171 {
6172 /* Since a variable sized modrm/sib chunk is between the start
6173 of the opcode (0x0f0f) and the opcode suffix, we need to do
6174 all the modrm processing first, and don't know until now that
6175 we have a bad opcode. This necessitates some cleaning up. */
6176 op_out[0][0] = '\0';
6177 op_out[1][0] = '\0';
6178 BadOp ();
6179 }
6180 }
6181
6182 static const char *simd_cmp_op[] = {
6183 "eq",
6184 "lt",
6185 "le",
6186 "unord",
6187 "neq",
6188 "nlt",
6189 "nle",
6190 "ord"
6191 };
6192
6193 static void
6194 OP_SIMD_Suffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
6195 {
6196 unsigned int cmp_type;
6197
6198 FETCH_DATA (the_info, codep + 1);
6199 obufp = obuf + strlen (obuf);
6200 cmp_type = *codep++ & 0xff;
6201 if (cmp_type < 8)
6202 {
6203 char suffix1 = 'p', suffix2 = 's';
6204 used_prefixes |= (prefixes & PREFIX_REPZ);
6205 if (prefixes & PREFIX_REPZ)
6206 suffix1 = 's';
6207 else
6208 {
6209 used_prefixes |= (prefixes & PREFIX_DATA);
6210 if (prefixes & PREFIX_DATA)
6211 suffix2 = 'd';
6212 else
6213 {
6214 used_prefixes |= (prefixes & PREFIX_REPNZ);
6215 if (prefixes & PREFIX_REPNZ)
6216 suffix1 = 's', suffix2 = 'd';
6217 }
6218 }
6219 sprintf (scratchbuf, "cmp%s%c%c",
6220 simd_cmp_op[cmp_type], suffix1, suffix2);
6221 used_prefixes |= (prefixes & PREFIX_REPZ);
6222 oappend (scratchbuf);
6223 }
6224 else
6225 {
6226 /* We have a bad extension byte. Clean up. */
6227 op_out[0][0] = '\0';
6228 op_out[1][0] = '\0';
6229 BadOp ();
6230 }
6231 }
6232
6233 static void
6234 OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
6235 int sizeflag ATTRIBUTE_UNUSED)
6236 {
6237 /* mwait %eax,%ecx */
6238 if (!intel_syntax)
6239 {
6240 const char **names = (address_mode == mode_64bit
6241 ? names64 : names32);
6242 strcpy (op_out[0], names[0]);
6243 strcpy (op_out[1], names[1]);
6244 two_source_ops = 1;
6245 }
6246 /* Skip mod/rm byte. */
6247 MODRM_CHECK;
6248 codep++;
6249 }
6250
6251 static void
6252 OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
6253 int sizeflag ATTRIBUTE_UNUSED)
6254 {
6255 /* monitor %eax,%ecx,%edx" */
6256 if (!intel_syntax)
6257 {
6258 const char **op1_names;
6259 const char **names = (address_mode == mode_64bit
6260 ? names64 : names32);
6261
6262 if (!(prefixes & PREFIX_ADDR))
6263 op1_names = (address_mode == mode_16bit
6264 ? names16 : names);
6265 else
6266 {
6267 /* Remove "addr16/addr32". */
6268 addr_prefix = NULL;
6269 op1_names = (address_mode != mode_32bit
6270 ? names32 : names16);
6271 used_prefixes |= PREFIX_ADDR;
6272 }
6273 strcpy (op_out[0], op1_names[0]);
6274 strcpy (op_out[1], names[1]);
6275 strcpy (op_out[2], names[2]);
6276 two_source_ops = 1;
6277 }
6278 /* Skip mod/rm byte. */
6279 MODRM_CHECK;
6280 codep++;
6281 }
6282
6283 static void
6284 SVME_Fixup (int bytemode, int sizeflag)
6285 {
6286 const char *alt;
6287 char *p;
6288
6289 switch (*codep)
6290 {
6291 case 0xd8:
6292 alt = "vmrun";
6293 break;
6294 case 0xd9:
6295 alt = "vmmcall";
6296 break;
6297 case 0xda:
6298 alt = "vmload";
6299 break;
6300 case 0xdb:
6301 alt = "vmsave";
6302 break;
6303 case 0xdc:
6304 alt = "stgi";
6305 break;
6306 case 0xdd:
6307 alt = "clgi";
6308 break;
6309 case 0xde:
6310 alt = "skinit";
6311 break;
6312 case 0xdf:
6313 alt = "invlpga";
6314 break;
6315 default:
6316 OP_M (bytemode, sizeflag);
6317 return;
6318 }
6319 /* Override "lidt". */
6320 p = obuf + strlen (obuf) - 4;
6321 /* We might have a suffix. */
6322 if (*p == 'i')
6323 --p;
6324 strcpy (p, alt);
6325 if (!(prefixes & PREFIX_ADDR))
6326 {
6327 ++codep;
6328 return;
6329 }
6330 used_prefixes |= PREFIX_ADDR;
6331 switch (*codep++)
6332 {
6333 case 0xdf:
6334 strcpy (op_out[1], names32[1]);
6335 two_source_ops = 1;
6336 /* Fall through. */
6337 case 0xd8:
6338 case 0xda:
6339 case 0xdb:
6340 *obufp++ = open_char;
6341 if (address_mode == mode_64bit || (sizeflag & AFLAG))
6342 alt = names32[0];
6343 else
6344 alt = names16[0];
6345 strcpy (obufp, alt);
6346 obufp += strlen (alt);
6347 *obufp++ = close_char;
6348 *obufp = '\0';
6349 break;
6350 }
6351 }
6352
6353 static void
6354 INVLPG_Fixup (int bytemode, int sizeflag)
6355 {
6356 const char *alt;
6357
6358 switch (*codep)
6359 {
6360 case 0xf8:
6361 alt = "swapgs";
6362 break;
6363 case 0xf9:
6364 alt = "rdtscp";
6365 break;
6366 default:
6367 OP_M (bytemode, sizeflag);
6368 return;
6369 }
6370 /* Override "invlpg". */
6371 strcpy (obuf + strlen (obuf) - 6, alt);
6372 codep++;
6373 }
6374
6375 static void
6376 BadOp (void)
6377 {
6378 /* Throw away prefixes and 1st. opcode byte. */
6379 codep = insn_codep + 1;
6380 oappend ("(bad)");
6381 }
6382
6383 static void
6384 REP_Fixup (int bytemode, int sizeflag)
6385 {
6386 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
6387 lods and stos. */
6388 if (prefixes & PREFIX_REPZ)
6389 repz_prefix = "rep ";
6390
6391 switch (bytemode)
6392 {
6393 case al_reg:
6394 case eAX_reg:
6395 case indir_dx_reg:
6396 OP_IMREG (bytemode, sizeflag);
6397 break;
6398 case eDI_reg:
6399 OP_ESreg (bytemode, sizeflag);
6400 break;
6401 case eSI_reg:
6402 OP_DSreg (bytemode, sizeflag);
6403 break;
6404 default:
6405 abort ();
6406 break;
6407 }
6408 }
6409
6410 static void
6411 CMPXCHG8B_Fixup (int bytemode, int sizeflag)
6412 {
6413 USED_REX (REX_W);
6414 if (rex & REX_W)
6415 {
6416 /* Change cmpxchg8b to cmpxchg16b. */
6417 char *p = obuf + strlen (obuf) - 2;
6418 strcpy (p, "16b");
6419 bytemode = o_mode;
6420 }
6421 OP_M (bytemode, sizeflag);
6422 }
6423
6424 static void
6425 XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
6426 {
6427 sprintf (scratchbuf, "%%xmm%d", reg);
6428 oappend (scratchbuf + intel_syntax);
6429 }
6430
6431 static void
6432 CRC32_Fixup (int bytemode, int sizeflag)
6433 {
6434 /* Add proper suffix to "crc32". */
6435 char *p = obuf + strlen (obuf);
6436
6437 switch (bytemode)
6438 {
6439 case b_mode:
6440 if (intel_syntax)
6441 break;
6442
6443 *p++ = 'b';
6444 break;
6445 case v_mode:
6446 if (intel_syntax)
6447 break;
6448
6449 USED_REX (REX_W);
6450 if (rex & REX_W)
6451 *p++ = 'q';
6452 else if (sizeflag & DFLAG)
6453 *p++ = 'l';
6454 else
6455 *p++ = 'w';
6456 used_prefixes |= (prefixes & PREFIX_DATA);
6457 break;
6458 default:
6459 oappend (INTERNAL_DISASSEMBLER_ERROR);
6460 break;
6461 }
6462 *p = '\0';
6463
6464 if (modrm.mod == 3)
6465 {
6466 int add;
6467
6468 /* Skip mod/rm byte. */
6469 MODRM_CHECK;
6470 codep++;
6471
6472 USED_REX (REX_B);
6473 add = (rex & REX_B) ? 8 : 0;
6474 if (bytemode == b_mode)
6475 {
6476 USED_REX (0);
6477 if (rex)
6478 oappend (names8rex[modrm.rm + add]);
6479 else
6480 oappend (names8[modrm.rm + add]);
6481 }
6482 else
6483 {
6484 USED_REX (REX_W);
6485 if (rex & REX_W)
6486 oappend (names64[modrm.rm + add]);
6487 else if ((prefixes & PREFIX_DATA))
6488 oappend (names16[modrm.rm + add]);
6489 else
6490 oappend (names32[modrm.rm + add]);
6491 }
6492 }
6493 else
6494 OP_E (bytemode, sizeflag);
6495 }
This page took 0.163467 seconds and 5 git commands to generate.