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