opcodes/
[deliverable/binutils-gdb.git] / opcodes / i386-dis.c
CommitLineData
252b5132 1/* Print i386 instructions for GDB, the GNU debugger.
060d22b0 2 Copyright 1988, 1989, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
0112cd26 3 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
252b5132 4
20f0a1fc
NC
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
f4321104 19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
20f0a1fc
NC
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. */
252b5132
RH
33
34#include "dis-asm.h"
35#include "sysdep.h"
36#include "opintl.h"
37
272c9217 38#define MAXLEN 15
252b5132
RH
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
26ca5450
AJ
48static int fetch_data (struct disassemble_info *, bfd_byte *);
49static void ckprefix (void);
50static const char *prefix_name (int, int);
51static int print_insn (bfd_vma, disassemble_info *);
52static void dofloat (int);
53static void OP_ST (int, int);
54static void OP_STi (int, int);
55static int putop (const char *, int);
56static void oappend (const char *);
57static void append_seg (void);
58static void OP_indirE (int, int);
59static void print_operand_value (char *, int, bfd_vma);
60static void OP_E (int, int);
61static void OP_G (int, int);
62static bfd_vma get64 (void);
63static bfd_signed_vma get32 (void);
64static bfd_signed_vma get32s (void);
65static int get16 (void);
66static void set_op (bfd_vma, int);
67static void OP_REG (int, int);
68static void OP_IMREG (int, int);
69static void OP_I (int, int);
70static void OP_I64 (int, int);
71static void OP_sI (int, int);
72static void OP_J (int, int);
73static void OP_SEG (int, int);
74static void OP_DIR (int, int);
75static void OP_OFF (int, int);
76static void OP_OFF64 (int, int);
77static void ptr_reg (int, int);
78static void OP_ESreg (int, int);
79static void OP_DSreg (int, int);
80static void OP_C (int, int);
81static void OP_D (int, int);
82static void OP_T (int, int);
83static void OP_Rd (int, int);
84static void OP_MMX (int, int);
85static void OP_XMM (int, int);
86static void OP_EM (int, int);
87static void OP_EX (int, int);
4d9567e0
MM
88static void OP_EMC (int,int);
89static void OP_MXC (int,int);
26ca5450
AJ
90static void OP_MS (int, int);
91static void OP_XS (int, int);
cc0ec051 92static void OP_M (int, int);
90700ea2 93static void OP_VMX (int, int);
cc0ec051
AM
94static void OP_0fae (int, int);
95static void OP_0f07 (int, int);
46e883c5
L
96static void NOP_Fixup1 (int, int);
97static void NOP_Fixup2 (int, int);
26ca5450
AJ
98static void OP_3DNowSuffix (int, int);
99static void OP_SIMD_Suffix (int, int);
100static void SIMD_Fixup (int, int);
101static void PNI_Fixup (int, int);
30123838 102static void SVME_Fixup (int, int);
4fd61dcb 103static void INVLPG_Fixup (int, int);
26ca5450 104static void BadOp (void);
4cc91dba 105static void SEG_Fixup (int, int);
90700ea2 106static void VMX_Fixup (int, int);
35c52694 107static void REP_Fixup (int, int);
252b5132 108
6608db57 109struct dis_private {
252b5132
RH
110 /* Points to first byte not fetched. */
111 bfd_byte *max_fetched;
112 bfd_byte the_buffer[MAXLEN];
113 bfd_vma insn_start;
e396998b 114 int orig_sizeflag;
252b5132
RH
115 jmp_buf bailout;
116};
117
5076851f
ILT
118/* The opcode for the fwait instruction, which we treat as a prefix
119 when we can. */
120#define FWAIT_OPCODE (0x9b)
121
cb712a9e
L
122enum address_mode
123{
124 mode_16bit,
125 mode_32bit,
126 mode_64bit
127};
128
129enum address_mode address_mode;
52b15da3 130
5076851f
ILT
131/* Flags for the prefixes for the current instruction. See below. */
132static int prefixes;
133
52b15da3
JH
134/* REX prefix the current instruction. See below. */
135static int rex;
136/* Bits of REX we've already used. */
137static 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
7d421014
ILT
154/* Flags for prefixes which we somehow handled when printing the
155 current instruction. */
156static int used_prefixes;
157
5076851f
ILT
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
252b5132
RH
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) \
6608db57 176 ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
252b5132
RH
177 ? 1 : fetch_data ((info), (addr)))
178
179static int
26ca5450 180fetch_data (struct disassemble_info *info, bfd_byte *addr)
252b5132
RH
181{
182 int status;
6608db57 183 struct dis_private *priv = (struct dis_private *) info->private_data;
252b5132
RH
184 bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
185
272c9217
JB
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;
252b5132
RH
193 if (status != 0)
194 {
7d421014 195 /* If we did manage to read at least one byte, then
db6eb5be
AM
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. */
7d421014 199 if (priv->max_fetched == priv->the_buffer)
5076851f 200 (*info->memory_error_func) (status, start, info);
252b5132
RH
201 longjmp (priv->bailout, 1);
202 }
203 else
204 priv->max_fetched = addr;
205 return 1;
206}
207
57d91c3c
ILT
208#define XX NULL, 0
209
252b5132 210#define Eb OP_E, b_mode
52b15da3
JH
211#define Ev OP_E, v_mode
212#define Ed OP_E, d_mode
9306ca4a 213#define Eq OP_E, q_mode
db6eb5be 214#define Edq OP_E, dq_mode
9306ca4a 215#define Edqw OP_E, dqw_mode
1a114b12 216#define indirEv OP_indirE, stack_v_mode
9306ca4a 217#define indirEp OP_indirE, f_mode
1a114b12 218#define stackEv OP_E, stack_v_mode
90700ea2 219#define Em OP_E, m_mode
252b5132
RH
220#define Ew OP_E, w_mode
221#define Ma OP_E, v_mode
cc0ec051 222#define M OP_M, 0 /* lea, lgdt, etc. */
9306ca4a 223#define Mp OP_M, f_mode /* 32 or 48 bit memory operand for LDS, LES etc */
992aaec9 224#define Gb OP_G, b_mode
252b5132 225#define Gv OP_G, v_mode
992aaec9 226#define Gd OP_G, d_mode
9306ca4a 227#define Gdq OP_G, dq_mode
90700ea2 228#define Gm OP_G, m_mode
252b5132 229#define Gw OP_G, w_mode
2da11e11 230#define Rd OP_Rd, d_mode
52b15da3 231#define Rm OP_Rd, m_mode
252b5132
RH
232#define Ib OP_I, b_mode
233#define sIb OP_sI, b_mode /* sign extened byte */
234#define Iv OP_I, v_mode
52b15da3
JH
235#define Iq OP_I, q_mode
236#define Iv64 OP_I64, v_mode
252b5132 237#define Iw OP_I, w_mode
9306ca4a 238#define I1 OP_I, const_1_mode
252b5132
RH
239#define Jb OP_J, b_mode
240#define Jv OP_J, v_mode
52b15da3
JH
241#define Cm OP_C, m_mode
242#define Dm OP_D, m_mode
252b5132 243#define Td OP_T, d_mode
4cc91dba 244#define Sv SEG_Fixup, v_mode
252b5132 245
52b15da3
JH
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
52b15da3
JH
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
52fd6d94 292#define zAX OP_IMREG, z_mode_ax_reg
52b15da3 293#define indirDX OP_IMREG, indir_dx_reg
252b5132
RH
294
295#define Sw OP_SEG, w_mode
c608c12e 296#define Ap OP_DIR, 0
1a114b12
JB
297#define Ob OP_OFF64, b_mode
298#define Ov OP_OFF64, v_mode
252b5132
RH
299#define Xb OP_DSreg, eSI_reg
300#define Xv OP_DSreg, eSI_reg
52fd6d94 301#define Xz OP_DSreg, eSI_reg
252b5132
RH
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
c608c12e 314#define XM OP_XMM, 0
252b5132 315#define EM OP_EM, v_mode
c608c12e 316#define EX OP_EX, v_mode
2da11e11 317#define MS OP_MS, v_mode
992aaec9 318#define XS OP_XS, v_mode
4d9567e0
MM
319#define EMC OP_EMC, v_mode
320#define MXC OP_MXC, 0
90700ea2 321#define VM OP_VMX, q_mode
252b5132 322#define OPSUF OP_3DNowSuffix, 0
c608c12e 323#define OPSIMD OP_SIMD_Suffix, 0
252b5132 324
35c52694
L
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
52fd6d94 330#define Yzr REP_Fixup, eDI_reg
35c52694
L
331#define indirDXr REP_Fixup, indir_dx_reg
332#define ALr REP_Fixup, al_reg
333#define eAXr REP_Fixup, eAX_reg
334
3ffd33cf
AM
335#define cond_jump_flag NULL, cond_jump_mode
336#define loop_jcxz_flag NULL, loop_jcxz_mode
337
252b5132 338/* bits in sizeflag */
252b5132 339#define SUFFIX_ALWAYS 4
252b5132
RH
340#define AFLAG 2
341#define DFLAG 1
342
52b15da3
JH
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 */
9306ca4a
JB
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
1a114b12 357#define stack_v_mode 15 /* v_mode for stack-related opcodes. */
52fd6d94 358#define z_mode 16 /* non-quad operand size depends on prefixes */
252b5132
RH
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
252b5132 366
c608c12e
AM
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
252b5132
RH
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
52b15da3
JH
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
52fd6d94 403#define z_mode_ax_reg 149
252b5132
RH
404#define indir_dx_reg 150
405
6439fc28
AM
406#define FLOATCODE 1
407#define USE_GROUPS 2
408#define USE_PREFIX_USER_TABLE 3
409#define X86_64_SPECIAL 4
331d2d0d 410#define IS_3BYTE_OPCODE 5
6439fc28 411
050dfa73
MM
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
a6bd098c
L
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
050dfa73
MM
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
7918206c
MM
479#define PREGRP37 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 37, NULL, 0, NULL, 0
480
050dfa73
MM
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
331d2d0d 486
26ca5450 487typedef void (*op_rtn) (int bytemode, int sizeflag);
252b5132
RH
488
489struct dis386 {
2da11e11 490 const char *name;
252b5132
RH
491 op_rtn op1;
492 int bytemode1;
493 op_rtn op2;
494 int bytemode2;
495 op_rtn op3;
496 int bytemode3;
050dfa73
MM
497 op_rtn op4;
498 int bytemode4;
252b5132
RH
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
9306ca4a
JB
504 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
505 . size prefix
252b5132 506 'E' => print 'e' if 32-bit form of jcxz
3ffd33cf 507 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
52fd6d94 508 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
5dd0794d 509 'H' => print ",pt" or ",pn" branch hint
9306ca4a
JB
510 'I' => honor following macro letter even in Intel mode (implemented only
511 . for some of the macro letters)
512 'J' => print 'l'
252b5132
RH
513 'L' => print 'l' if suffix_always is true
514 'N' => print 'n' if instruction has no wait "prefix"
a35ca55a 515 'O' => print 'd' or 'o' (or 'q' in Intel mode)
52b15da3 516 'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
e396998b
AM
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
a35ca55a 520 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
52b15da3 521 'S' => print 'w', 'l' or 'q' if suffix_always is true
6439fc28
AM
522 'T' => print 'q' in 64bit mode and behave as 'P' otherwise
523 'U' => print 'q' in 64bit mode and behave as 'Q' otherwise
1a114b12 524 'V' => print 'q' in 64bit mode and behave as 'S' otherwise
a35ca55a 525 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
9306ca4a 526 'X' => print 's', 'd' depending on data16 prefix (for XMM)
76f227a5 527 'Y' => 'q' if instruction has an REX 64bit overwrite prefix
6dd5059a 528 'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
52b15da3 529
6439fc28
AM
530 Many of the above letters print nothing in Intel mode. See "putop"
531 for the details.
52b15da3 532
6439fc28
AM
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*/
252b5132 538
6439fc28 539static const struct dis386 dis386[] = {
252b5132 540 /* 00 */
050dfa73
MM
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 },
252b5132 549 /* 08 */
050dfa73
MM
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 */
252b5132 558 /* 10 */
050dfa73
MM
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 },
252b5132 567 /* 18 */
050dfa73
MM
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 },
252b5132 576 /* 20 */
050dfa73
MM
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 },
252b5132 585 /* 28 */
050dfa73
MM
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 },
252b5132 594 /* 30 */
050dfa73
MM
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 },
252b5132 603 /* 38 */
050dfa73
MM
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 },
252b5132 612 /* 40 */
050dfa73
MM
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 },
252b5132 621 /* 48 */
050dfa73
MM
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 },
252b5132 630 /* 50 */
050dfa73
MM
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 },
252b5132 639 /* 58 */
050dfa73
MM
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 },
252b5132 648 /* 60 */
050dfa73
MM
649 { "pusha{P|}", XX, XX, XX, XX},
650 { "popa{P|}", XX, XX, XX, XX },
651 { "bound{S|}", Gv, Ma, XX, XX },
6439fc28 652 { X86_64_0 },
050dfa73
MM
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 */
252b5132 657 /* 68 */
050dfa73
MM
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 },
52fd6d94 663 { "ins{R||G|}", Yzr, indirDX, XX, XX },
050dfa73 664 { "outs{b||b|}", indirDXr, Xb, XX, XX },
52fd6d94 665 { "outs{R||G|}", indirDXr, Xz, XX, XX },
252b5132 666 /* 70 */
050dfa73
MM
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 },
252b5132 675 /* 78 */
050dfa73
MM
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 },
252b5132
RH
684 /* 80 */
685 { GRP1b },
686 { GRP1S },
050dfa73 687 { "(bad)", XX, XX, XX, XX },
252b5132 688 { GRP1Ss },
050dfa73
MM
689 { "testB", Eb, Gb, XX, XX },
690 { "testS", Ev, Gv, XX, XX },
691 { "xchgB", Eb, Gb, XX, XX },
692 { "xchgS", Ev, Gv, XX, XX },
252b5132 693 /* 88 */
050dfa73
MM
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 },
252b5132 702 /* 90 */
050dfa73
MM
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 },
252b5132 711 /* 98 */
a35ca55a
JB
712 { "cW{t||t|}R", XX, XX, XX, XX },
713 { "cR{t||t|}O", XX, XX, XX, XX },
050dfa73
MM
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 },
252b5132 720 /* a0 */
050dfa73
MM
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 },
252b5132 729 /* a8 */
050dfa73
MM
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 },
252b5132 738 /* b0 */
050dfa73
MM
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 },
252b5132 747 /* b8 */
050dfa73
MM
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 },
252b5132
RH
756 /* c0 */
757 { GRP2b },
758 { GRP2S },
050dfa73
MM
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 },
a6bd098c
L
763 { GRP11_C6 },
764 { GRP11_C7 },
252b5132 765 /* c8 */
050dfa73
MM
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 },
252b5132
RH
774 /* d0 */
775 { GRP2b_one },
776 { GRP2S_one },
777 { GRP2b_cl },
778 { GRP2S_cl },
050dfa73
MM
779 { "aam{|}", sIb, XX, XX, XX },
780 { "aad{|}", sIb, XX, XX, XX },
781 { "(bad)", XX, XX, XX, XX },
782 { "xlat", DSBX, XX, XX, XX },
252b5132
RH
783 /* d8 */
784 { FLOAT },
785 { FLOAT },
786 { FLOAT },
787 { FLOAT },
788 { FLOAT },
789 { FLOAT },
790 { FLOAT },
791 { FLOAT },
792 /* e0 */
050dfa73
MM
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 },
52fd6d94 798 { "inG", zAX, Ib, XX, XX },
050dfa73 799 { "outB", Ib, AL, XX, XX },
52fd6d94 800 { "outG", Ib, zAX, XX, XX },
252b5132 801 /* e8 */
050dfa73
MM
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 },
52fd6d94 807 { "inG", zAX, indirDX, XX, XX },
050dfa73 808 { "outB", indirDX, AL, XX, XX },
52fd6d94 809 { "outG", indirDX, zAX, XX, XX },
252b5132 810 /* f0 */
050dfa73
MM
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 },
252b5132
RH
817 { GRP3b },
818 { GRP3S },
819 /* f8 */
050dfa73
MM
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 },
252b5132
RH
826 { GRP4 },
827 { GRP5 },
828};
829
6439fc28 830static const struct dis386 dis386_twobyte[] = {
252b5132
RH
831 /* 00 */
832 { GRP6 },
833 { GRP7 },
050dfa73
MM
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 },
252b5132 840 /* 08 */
050dfa73
MM
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 },
c608c12e 846 { GRPAMD },
050dfa73
MM
847 { "femms", XX, XX, XX, XX },
848 { "", MX, EM, OPSUF, XX }, /* See OP_3DNowSuffix. */
252b5132 849 /* 10 */
c608c12e
AM
850 { PREGRP8 },
851 { PREGRP9 },
ca164297 852 { PREGRP30 },
050dfa73
MM
853 { "movlpX", EX, XM, SIMD_Fixup, 'h', XX },
854 { "unpcklpX", XM, EX, XX, XX },
855 { "unpckhpX", XM, EX, XX, XX },
ca164297 856 { PREGRP31 },
050dfa73 857 { "movhpX", EX, XM, SIMD_Fixup, 'l', XX },
252b5132 858 /* 18 */
b3882df9 859 { GRP16 },
050dfa73
MM
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 },
252b5132 867 /* 20 */
050dfa73
MM
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 },
252b5132 876 /* 28 */
050dfa73
MM
877 { "movapX", XM, EX, XX, XX },
878 { "movapX", EX, XM, XX, XX },
c608c12e 879 { PREGRP2 },
050dfa73 880 { PREGRP33 },
2da11e11 881 { PREGRP4 },
c608c12e 882 { PREGRP3 },
050dfa73
MM
883 { "ucomisX", XM,EX, XX, XX },
884 { "comisX", XM,EX, XX, XX },
252b5132 885 /* 30 */
050dfa73
MM
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 },
252b5132 894 /* 38 */
331d2d0d 895 { THREE_BYTE_0 },
050dfa73 896 { "(bad)", XX, XX, XX, XX },
331d2d0d 897 { THREE_BYTE_1 },
050dfa73
MM
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 },
252b5132 903 /* 40 */
050dfa73
MM
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 },
252b5132 912 /* 48 */
050dfa73
MM
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 },
252b5132 921 /* 50 */
050dfa73 922 { "movmskpX", Gdq, XS, XX, XX },
c608c12e
AM
923 { PREGRP13 },
924 { PREGRP12 },
925 { PREGRP11 },
050dfa73
MM
926 { "andpX", XM, EX, XX, XX },
927 { "andnpX", XM, EX, XX, XX },
928 { "orpX", XM, EX, XX, XX },
929 { "xorpX", XM, EX, XX, XX },
252b5132 930 /* 58 */
c608c12e
AM
931 { PREGRP0 },
932 { PREGRP10 },
041bd2e0
JH
933 { PREGRP17 },
934 { PREGRP16 },
c608c12e
AM
935 { PREGRP14 },
936 { PREGRP7 },
937 { PREGRP5 },
2da11e11 938 { PREGRP6 },
252b5132 939 /* 60 */
050dfa73
MM
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 },
252b5132 948 /* 68 */
050dfa73
MM
949 { "punpckhbw", MX, EM, XX, XX },
950 { "punpckhwd", MX, EM, XX, XX },
951 { "punpckhdq", MX, EM, XX, XX },
952 { "packssdw", MX, EM, XX, XX },
0f17484f 953 { PREGRP26 },
041bd2e0 954 { PREGRP24 },
050dfa73 955 { "movd", MX, Edq, XX, XX },
041bd2e0 956 { PREGRP19 },
252b5132 957 /* 70 */
041bd2e0 958 { PREGRP22 },
252b5132 959 { GRP12 },
b3882df9
L
960 { GRP13 },
961 { GRP14 },
050dfa73
MM
962 { "pcmpeqb", MX, EM, XX, XX },
963 { "pcmpeqw", MX, EM, XX, XX },
964 { "pcmpeqd", MX, EM, XX, XX },
965 { "emms", XX, XX, XX, XX },
252b5132 966 /* 78 */
050dfa73
MM
967 { PREGRP34 },
968 { PREGRP35 },
969 { "(bad)", XX, XX, XX, XX },
970 { "(bad)", XX, XX, XX, XX },
ca164297
L
971 { PREGRP28 },
972 { PREGRP29 },
041bd2e0
JH
973 { PREGRP23 },
974 { PREGRP20 },
252b5132 975 /* 80 */
050dfa73
MM
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 },
252b5132 984 /* 88 */
050dfa73
MM
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 },
252b5132 993 /* 90 */
050dfa73
MM
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 },
252b5132 1002 /* 98 */
050dfa73
MM
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 },
252b5132 1011 /* a0 */
050dfa73
MM
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 },
30d1c836
ML
1018 { GRPPADLCK2 },
1019 { GRPPADLCK1 },
252b5132 1020 /* a8 */
050dfa73
MM
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 },
b3882df9 1027 { GRP15 },
050dfa73 1028 { "imulS", Gv, Ev, XX, XX },
252b5132 1029 /* b0 */
050dfa73
MM
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 ! */
252b5132 1038 /* b8 */
7918206c 1039 { PREGRP37 },
050dfa73 1040 { "ud2b", XX, XX, XX, XX },
252b5132 1041 { GRP8 },
050dfa73
MM
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 ! */
252b5132 1047 /* c0 */
050dfa73
MM
1048 { "xaddB", Eb, Gb, XX, XX },
1049 { "xaddS", Ev, Gv, XX, XX },
c608c12e 1050 { PREGRP1 },
050dfa73
MM
1051 { "movntiS", Ev, Gv, XX, XX },
1052 { "pinsrw", MX, Edqw, Ib, XX },
1053 { "pextrw", Gdq, MS, Ib, XX },
1054 { "shufpX", XM, EX, Ib, XX },
252b5132
RH
1055 { GRP9 },
1056 /* c8 */
050dfa73
MM
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 },
252b5132 1065 /* d0 */
ca164297 1066 { PREGRP27 },
050dfa73
MM
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 },
041bd2e0 1072 { PREGRP21 },
050dfa73 1073 { "pmovmskb", Gdq, MS, XX, XX },
252b5132 1074 /* d8 */
050dfa73
MM
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 },
252b5132 1083 /* e0 */
050dfa73
MM
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 },
041bd2e0 1090 { PREGRP15 },
0f17484f 1091 { PREGRP25 },
252b5132 1092 /* e8 */
050dfa73
MM
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 },
252b5132 1101 /* f0 */
ca164297 1102 { PREGRP32 },
050dfa73
MM
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 },
041bd2e0 1109 { PREGRP18 },
252b5132 1110 /* f8 */
050dfa73
MM
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 }
252b5132
RH
1119};
1120
1121static const unsigned char onebyte_has_modrm[256] = {
c608c12e
AM
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 */
252b5132
RH
1142};
1143
1144static const unsigned char twobyte_has_modrm[256] = {
c608c12e
AM
1145 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1146 /* ------------------------------- */
252b5132 1147 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
15965411 1148 /* 10 */ 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1, /* 1f */
4bba6815 1149 /* 20 */ 1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1, /* 2f */
331d2d0d 1150 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
252b5132 1151 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
4bba6815
AM
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 */
90700ea2 1154 /* 70 */ 1,1,1,1,1,1,1,0,1,1,0,0,1,1,1,1, /* 7f */
252b5132
RH
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 */
30d1c836 1157 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
050dfa73 1158 /* b0 */ 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, /* bf */
252b5132 1159 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
ca164297 1160 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
4bba6815 1161 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
ca164297 1162 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 /* ff */
c608c12e
AM
1163 /* ------------------------------- */
1164 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1165};
1166
eec0f4ca 1167static const unsigned char twobyte_uses_DATA_prefix[256] = {
c608c12e
AM
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 */
ca164297 1171 /* 10 */ 1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0, /* 1f */
050dfa73 1172 /* 20 */ 0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0, /* 2f */
331d2d0d 1173 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
c608c12e 1174 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 4f */
041bd2e0
JH
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 */
050dfa73 1177 /* 70 */ 1,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1, /* 7f */
c608c12e
AM
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 */
ca164297 1183 /* d0 */ 1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, /* df */
041bd2e0 1184 /* e0 */ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, /* ef */
ca164297 1185 /* f0 */ 1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0 /* ff */
c608c12e
AM
1186 /* ------------------------------- */
1187 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
252b5132
RH
1188};
1189
eec0f4ca
L
1190static 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
1213static 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. */
1237static 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. */
1261static 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. */
1285static 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. */
1309static 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. */
1333static 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. */
1357static 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
252b5132
RH
1380static char obuf[100];
1381static char *obufp;
1382static char scratchbuf[100];
1383static unsigned char *start_codep;
1384static unsigned char *insn_codep;
1385static unsigned char *codep;
1386static disassemble_info *the_info;
1387static int mod;
1388static int rm;
1389static int reg;
4bba6815 1390static unsigned char need_modrm;
252b5132 1391
4bba6815
AM
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
d708bcba
AM
1397static const char **names64;
1398static const char **names32;
1399static const char **names16;
1400static const char **names8;
1401static const char **names8rex;
1402static const char **names_seg;
1403static const char **index16;
1404
1405static const char *intel_names64[] = {
1406 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
1407 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
1408};
1409static const char *intel_names32[] = {
1410 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
1411 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
1412};
1413static const char *intel_names16[] = {
1414 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
1415 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
1416};
1417static const char *intel_names8[] = {
1418 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
1419};
1420static const char *intel_names8rex[] = {
1421 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
1422 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
1423};
1424static const char *intel_names_seg[] = {
1425 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
1426};
1427static const char *intel_index16[] = {
1428 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
1429};
1430
1431static const char *att_names64[] = {
1432 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
52b15da3
JH
1433 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
1434};
d708bcba
AM
1435static const char *att_names32[] = {
1436 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
52b15da3 1437 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
252b5132 1438};
d708bcba
AM
1439static const char *att_names16[] = {
1440 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
52b15da3 1441 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
252b5132 1442};
d708bcba
AM
1443static const char *att_names8[] = {
1444 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
252b5132 1445};
d708bcba
AM
1446static const char *att_names8rex[] = {
1447 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
52b15da3
JH
1448 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
1449};
d708bcba
AM
1450static const char *att_names_seg[] = {
1451 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
252b5132 1452};
d708bcba
AM
1453static const char *att_index16[] = {
1454 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
252b5132
RH
1455};
1456
2da11e11 1457static const struct dis386 grps[][8] = {
252b5132
RH
1458 /* GRP1b */
1459 {
050dfa73
MM
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 }
252b5132
RH
1468 },
1469 /* GRP1S */
1470 {
050dfa73
MM
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 }
252b5132
RH
1479 },
1480 /* GRP1Ss */
1481 {
050dfa73
MM
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 }
252b5132
RH
1490 },
1491 /* GRP2b */
1492 {
050dfa73
MM
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 },
252b5132
RH
1501 },
1502 /* GRP2S */
1503 {
050dfa73
MM
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 },
252b5132
RH
1512 },
1513 /* GRP2b_one */
1514 {
050dfa73
MM
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 },
252b5132
RH
1523 },
1524 /* GRP2S_one */
1525 {
050dfa73
MM
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 },
252b5132
RH
1534 },
1535 /* GRP2b_cl */
1536 {
050dfa73
MM
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 },
252b5132
RH
1545 },
1546 /* GRP2S_cl */
1547 {
050dfa73
MM
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 }
252b5132
RH
1556 },
1557 /* GRP3b */
1558 {
050dfa73
MM
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. */
252b5132
RH
1567 },
1568 /* GRP3S */
1569 {
050dfa73
MM
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 },
252b5132
RH
1578 },
1579 /* GRP4 */
1580 {
050dfa73
MM
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 },
252b5132
RH
1589 },
1590 /* GRP5 */
1591 {
050dfa73
MM
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 },
252b5132
RH
1600 },
1601 /* GRP6 */
1602 {
2b516b72
L
1603 { "sldt", Ev, XX, XX, XX },
1604 { "str", Ev, XX, XX, XX },
050dfa73
MM
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 }
252b5132
RH
1611 },
1612 /* GRP7 */
1613 {
050dfa73
MM
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 },
2b516b72 1618 { "smsw", Ev, XX, XX, XX },
050dfa73
MM
1619 { "(bad)", XX, XX, XX, XX },
1620 { "lmsw", Ew, XX, XX, XX },
1621 { "invlpg", INVLPG_Fixup, w_mode, XX, XX, XX },
252b5132
RH
1622 },
1623 /* GRP8 */
1624 {
050dfa73
MM
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 },
252b5132
RH
1633 },
1634 /* GRP9 */
1635 {
050dfa73
MM
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 },
252b5132 1644 },
a6bd098c
L
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 },
b3882df9 1667 /* GRP12 */
252b5132 1668 {
050dfa73
MM
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 },
252b5132 1677 },
b3882df9 1678 /* GRP13 */
252b5132 1679 {
050dfa73
MM
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 },
252b5132 1688 },
b3882df9 1689 /* GRP14 */
252b5132 1690 {
050dfa73
MM
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 },
252b5132 1699 },
b3882df9 1700 /* GRP15 */
252b5132 1701 {
050dfa73
MM
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 },
c608c12e 1710 },
b3882df9 1711 /* GRP16 */
c608c12e 1712 {
050dfa73
MM
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 },
252b5132 1721 },
c608c12e 1722 /* GRPAMD */
252b5132 1723 {
050dfa73
MM
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 },
0f10071e 1732 },
30d1c836 1733 /* GRPPADLCK1 */
cc0ec051 1734 {
050dfa73
MM
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 },
30d1c836
ML
1743 },
1744 /* GRPPADLCK2 */
1745 {
050dfa73
MM
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 },
252b5132 1754 }
252b5132
RH
1755};
1756
041bd2e0 1757static const struct dis386 prefix_user_table[][4] = {
c608c12e
AM
1758 /* PREGRP0 */
1759 {
050dfa73
MM
1760 { "addps", XM, EX, XX, XX },
1761 { "addss", XM, EX, XX, XX },
1762 { "addpd", XM, EX, XX, XX },
1763 { "addsd", XM, EX, XX, XX },
c608c12e
AM
1764 },
1765 /* PREGRP1 */
1766 {
050dfa73
MM
1767 { "", XM, EX, OPSIMD, XX }, /* See OP_SIMD_SUFFIX. */
1768 { "", XM, EX, OPSIMD, XX },
1769 { "", XM, EX, OPSIMD, XX },
1770 { "", XM, EX, OPSIMD, XX },
c608c12e
AM
1771 },
1772 /* PREGRP2 */
1773 {
4d9567e0 1774 { "cvtpi2ps", XM, EMC, XX, XX },
050dfa73 1775 { "cvtsi2ssY", XM, Ev, XX, XX },
4d9567e0 1776 { "cvtpi2pd", XM, EMC, XX, XX },
050dfa73 1777 { "cvtsi2sdY", XM, Ev, XX, XX },
c608c12e
AM
1778 },
1779 /* PREGRP3 */
1780 {
4d9567e0 1781 { "cvtps2pi", MXC, EX, XX, XX },
050dfa73 1782 { "cvtss2siY", Gv, EX, XX, XX },
4d9567e0 1783 { "cvtpd2pi", MXC, EX, XX, XX },
050dfa73 1784 { "cvtsd2siY", Gv, EX, XX, XX },
c608c12e
AM
1785 },
1786 /* PREGRP4 */
1787 {
4d9567e0 1788 { "cvttps2pi", MXC, EX, XX, XX },
050dfa73 1789 { "cvttss2siY", Gv, EX, XX, XX },
4d9567e0 1790 { "cvttpd2pi", MXC, EX, XX, XX },
050dfa73 1791 { "cvttsd2siY", Gv, EX, XX, XX },
c608c12e
AM
1792 },
1793 /* PREGRP5 */
1794 {
050dfa73
MM
1795 { "divps", XM, EX, XX, XX },
1796 { "divss", XM, EX, XX, XX },
1797 { "divpd", XM, EX, XX, XX },
1798 { "divsd", XM, EX, XX, XX },
c608c12e
AM
1799 },
1800 /* PREGRP6 */
1801 {
050dfa73
MM
1802 { "maxps", XM, EX, XX, XX },
1803 { "maxss", XM, EX, XX, XX },
1804 { "maxpd", XM, EX, XX, XX },
1805 { "maxsd", XM, EX, XX, XX },
c608c12e
AM
1806 },
1807 /* PREGRP7 */
1808 {
050dfa73
MM
1809 { "minps", XM, EX, XX, XX },
1810 { "minss", XM, EX, XX, XX },
1811 { "minpd", XM, EX, XX, XX },
1812 { "minsd", XM, EX, XX, XX },
c608c12e
AM
1813 },
1814 /* PREGRP8 */
1815 {
050dfa73
MM
1816 { "movups", XM, EX, XX, XX },
1817 { "movss", XM, EX, XX, XX },
1818 { "movupd", XM, EX, XX, XX },
1819 { "movsd", XM, EX, XX, XX },
c608c12e
AM
1820 },
1821 /* PREGRP9 */
1822 {
050dfa73
MM
1823 { "movups", EX, XM, XX, XX },
1824 { "movss", EX, XM, XX, XX },
1825 { "movupd", EX, XM, XX, XX },
1826 { "movsd", EX, XM, XX, XX },
c608c12e
AM
1827 },
1828 /* PREGRP10 */
1829 {
050dfa73
MM
1830 { "mulps", XM, EX, XX, XX },
1831 { "mulss", XM, EX, XX, XX },
1832 { "mulpd", XM, EX, XX, XX },
1833 { "mulsd", XM, EX, XX, XX },
c608c12e
AM
1834 },
1835 /* PREGRP11 */
1836 {
050dfa73
MM
1837 { "rcpps", XM, EX, XX, XX },
1838 { "rcpss", XM, EX, XX, XX },
1839 { "(bad)", XM, EX, XX, XX },
1840 { "(bad)", XM, EX, XX, XX },
c608c12e
AM
1841 },
1842 /* PREGRP12 */
1843 {
050dfa73
MM
1844 { "rsqrtps", XM, EX, XX, XX },
1845 { "rsqrtss", XM, EX, XX, XX },
1846 { "(bad)", XM, EX, XX, XX },
1847 { "(bad)", XM, EX, XX, XX },
c608c12e
AM
1848 },
1849 /* PREGRP13 */
1850 {
050dfa73
MM
1851 { "sqrtps", XM, EX, XX, XX },
1852 { "sqrtss", XM, EX, XX, XX },
1853 { "sqrtpd", XM, EX, XX, XX },
1854 { "sqrtsd", XM, EX, XX, XX },
c608c12e
AM
1855 },
1856 /* PREGRP14 */
1857 {
050dfa73
MM
1858 { "subps", XM, EX, XX, XX },
1859 { "subss", XM, EX, XX, XX },
1860 { "subpd", XM, EX, XX, XX },
1861 { "subsd", XM, EX, XX, XX },
041bd2e0
JH
1862 },
1863 /* PREGRP15 */
1864 {
050dfa73
MM
1865 { "(bad)", XM, EX, XX, XX},
1866 { "cvtdq2pd", XM, EX, XX, XX },
1867 { "cvttpd2dq", XM, EX, XX, XX },
1868 { "cvtpd2dq", XM, EX, XX, XX },
041bd2e0
JH
1869 },
1870 /* PREGRP16 */
1871 {
050dfa73
MM
1872 { "cvtdq2ps", XM, EX, XX, XX },
1873 { "cvttps2dq",XM, EX, XX, XX },
1874 { "cvtps2dq",XM, EX, XX, XX },
1875 { "(bad)", XM, EX, XX, XX },
041bd2e0
JH
1876 },
1877 /* PREGRP17 */
1878 {
050dfa73
MM
1879 { "cvtps2pd", XM, EX, XX, XX },
1880 { "cvtss2sd", XM, EX, XX, XX },
1881 { "cvtpd2ps", XM, EX, XX, XX },
1882 { "cvtsd2ss", XM, EX, XX, XX },
041bd2e0
JH
1883 },
1884 /* PREGRP18 */
1885 {
050dfa73
MM
1886 { "maskmovq", MX, MS, XX, XX },
1887 { "(bad)", XM, EX, XX, XX },
c4b5fff9 1888 { "maskmovdqu", XM, XS, XX, XX },
050dfa73 1889 { "(bad)", XM, EX, XX, XX },
041bd2e0
JH
1890 },
1891 /* PREGRP19 */
1892 {
050dfa73
MM
1893 { "movq", MX, EM, XX, XX },
1894 { "movdqu", XM, EX, XX, XX },
1895 { "movdqa", XM, EX, XX, XX },
1896 { "(bad)", XM, EX, XX, XX },
041bd2e0
JH
1897 },
1898 /* PREGRP20 */
1899 {
050dfa73
MM
1900 { "movq", EM, MX, XX, XX },
1901 { "movdqu", EX, XM, XX, XX },
1902 { "movdqa", EX, XM, XX, XX },
1903 { "(bad)", EX, XM, XX, XX },
041bd2e0
JH
1904 },
1905 /* PREGRP21 */
1906 {
050dfa73
MM
1907 { "(bad)", EX, XM, XX, XX },
1908 { "movq2dq", XM, MS, XX, XX },
1909 { "movq", EX, XM, XX, XX },
1910 { "movdq2q", MX, XS, XX, XX },
041bd2e0
JH
1911 },
1912 /* PREGRP22 */
1913 {
050dfa73
MM
1914 { "pshufw", MX, EM, Ib, XX },
1915 { "pshufhw", XM, EX, Ib, XX },
1916 { "pshufd", XM, EX, Ib, XX },
1917 { "pshuflw", XM, EX, Ib, XX},
041bd2e0
JH
1918 },
1919 /* PREGRP23 */
1920 {
050dfa73
MM
1921 { "movd", Edq, MX, XX, XX },
1922 { "movq", XM, EX, XX, XX },
1923 { "movd", Edq, XM, XX, XX },
1924 { "(bad)", Ed, XM, XX, XX },
041bd2e0
JH
1925 },
1926 /* PREGRP24 */
1927 {
050dfa73
MM
1928 { "(bad)", MX, EX, XX, XX },
1929 { "(bad)", XM, EX, XX, XX },
1930 { "punpckhqdq", XM, EX, XX, XX },
1931 { "(bad)", XM, EX, XX, XX },
0f17484f
AM
1932 },
1933 /* PREGRP25 */
1934 {
050dfa73
MM
1935 { "movntq", EM, MX, XX, XX },
1936 { "(bad)", EM, XM, XX, XX },
1937 { "movntdq", EM, XM, XX, XX },
1938 { "(bad)", EM, XM, XX, XX },
0f17484f
AM
1939 },
1940 /* PREGRP26 */
1941 {
050dfa73
MM
1942 { "(bad)", MX, EX, XX, XX },
1943 { "(bad)", XM, EX, XX, XX },
1944 { "punpcklqdq", XM, EX, XX, XX },
1945 { "(bad)", XM, EX, XX, XX },
041bd2e0 1946 },
ca164297
L
1947 /* PREGRP27 */
1948 {
050dfa73
MM
1949 { "(bad)", MX, EX, XX, XX },
1950 { "(bad)", XM, EX, XX, XX },
1951 { "addsubpd", XM, EX, XX, XX },
1952 { "addsubps", XM, EX, XX, XX },
ca164297
L
1953 },
1954 /* PREGRP28 */
1955 {
050dfa73
MM
1956 { "(bad)", MX, EX, XX, XX },
1957 { "(bad)", XM, EX, XX, XX },
1958 { "haddpd", XM, EX, XX, XX },
1959 { "haddps", XM, EX, XX, XX },
ca164297
L
1960 },
1961 /* PREGRP29 */
1962 {
050dfa73
MM
1963 { "(bad)", MX, EX, XX, XX },
1964 { "(bad)", XM, EX, XX, XX },
1965 { "hsubpd", XM, EX, XX, XX },
1966 { "hsubps", XM, EX, XX, XX },
ca164297
L
1967 },
1968 /* PREGRP30 */
1969 {
050dfa73
MM
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 },
ca164297
L
1974 },
1975 /* PREGRP31 */
1976 {
050dfa73
MM
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 },
ca164297
L
1981 },
1982 /* PREGRP32 */
1983 {
050dfa73
MM
1984 { "(bad)", XM, EX, XX, XX },
1985 { "(bad)", XM, EX, XX, XX },
1986 { "(bad)", XM, EX, XX, XX },
1987 { "lddqu", XM, M, XX, XX },
ca164297 1988 },
050dfa73
MM
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
7918206c
MM
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 },
c608c12e
AM
2028};
2029
6439fc28
AM
2030static const struct dis386 x86_64_table[][2] = {
2031 {
050dfa73
MM
2032 { "arpl", Ew, Gw, XX, XX },
2033 { "movs{||lq|xd}", Gv, Ed, XX, XX },
6439fc28
AM
2034 },
2035};
2036
96fbad73 2037static const struct dis386 three_byte_table[][256] = {
331d2d0d
L
2038 /* THREE_BYTE_0 */
2039 {
96fbad73 2040 /* 00 */
050dfa73
MM
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 },
96fbad73 2049 /* 08 */
050dfa73
MM
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 },
96fbad73 2058 /* 10 */
050dfa73
MM
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 },
96fbad73 2067 /* 18 */
050dfa73
MM
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 },
96fbad73
L
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 },
050dfa73 2327 { "(bad)", XX, XX, XX, XX }
331d2d0d
L
2328 },
2329 /* THREE_BYTE_1 */
2330 {
96fbad73 2331 /* 00 */
050dfa73
MM
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 },
96fbad73 2340 /* 08 */
050dfa73
MM
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 },
96fbad73
L
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 */
050dfa73
MM
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 },
96fbad73 2610 /* f8 */
050dfa73
MM
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 }
331d2d0d
L
2619 },
2620};
2621
c608c12e
AM
2622#define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
2623
252b5132 2624static void
26ca5450 2625ckprefix (void)
252b5132 2626{
52b15da3
JH
2627 int newrex;
2628 rex = 0;
252b5132 2629 prefixes = 0;
7d421014 2630 used_prefixes = 0;
52b15da3 2631 rex_used = 0;
252b5132
RH
2632 while (1)
2633 {
2634 FETCH_DATA (the_info, codep + 1);
52b15da3 2635 newrex = 0;
252b5132
RH
2636 switch (*codep)
2637 {
52b15da3
JH
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:
cb712a9e 2655 if (address_mode == mode_64bit)
52b15da3
JH
2656 newrex = *codep;
2657 else
2658 return;
2659 break;
252b5132
RH
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;
5076851f 2693 case FWAIT_OPCODE:
252b5132
RH
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. */
3e7d61b2 2697 if (prefixes || rex)
252b5132
RH
2698 {
2699 prefixes |= PREFIX_FWAIT;
2700 codep++;
2701 return;
2702 }
2703 prefixes = PREFIX_FWAIT;
2704 break;
2705 default:
2706 return;
2707 }
52b15da3
JH
2708 /* Rex is ignored when followed by another prefix. */
2709 if (rex)
2710 {
3e7d61b2
AM
2711 rex_used = rex;
2712 return;
52b15da3
JH
2713 }
2714 rex = newrex;
252b5132
RH
2715 codep++;
2716 }
2717}
2718
7d421014
ILT
2719/* Return the name of the prefix byte PREF, or NULL if PREF is not a
2720 prefix byte. */
2721
2722static const char *
26ca5450 2723prefix_name (int pref, int sizeflag)
7d421014
ILT
2724{
2725 switch (pref)
2726 {
52b15da3
JH
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";
7d421014
ILT
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:
cb712a9e 2781 if (address_mode == mode_64bit)
db6eb5be 2782 return (sizeflag & AFLAG) ? "addr32" : "addr64";
c1a64871 2783 else
2888cb7a 2784 return (sizeflag & AFLAG) ? "addr16" : "addr32";
7d421014
ILT
2785 case FWAIT_OPCODE:
2786 return "fwait";
2787 default:
2788 return NULL;
2789 }
2790}
2791
050dfa73
MM
2792static char op1out[100], op2out[100], op3out[100], op4out[100];
2793static int op_ad, op_index[4];
1d9f512f 2794static int two_source_ops;
050dfa73
MM
2795static bfd_vma op_address[4];
2796static bfd_vma op_riprel[4];
52b15da3 2797static bfd_vma start_pc;
252b5132
RH
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
252b5132
RH
2808static char intel_syntax;
2809static char open_char;
2810static char close_char;
2811static char separator_char;
2812static char scale_char;
2813
e396998b
AM
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. */
252b5132 2817int
26ca5450 2818print_insn_i386_att (bfd_vma pc, disassemble_info *info)
252b5132
RH
2819{
2820 intel_syntax = 0;
e396998b
AM
2821
2822 return print_insn (pc, info);
252b5132
RH
2823}
2824
2825int
26ca5450 2826print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
252b5132
RH
2827{
2828 intel_syntax = 1;
e396998b
AM
2829
2830 return print_insn (pc, info);
252b5132
RH
2831}
2832
e396998b 2833int
26ca5450 2834print_insn_i386 (bfd_vma pc, disassemble_info *info)
e396998b
AM
2835{
2836 intel_syntax = -1;
2837
2838 return print_insn (pc, info);
2839}
2840
2841static int
26ca5450 2842print_insn (bfd_vma pc, disassemble_info *info)
252b5132 2843{
2da11e11 2844 const struct dis386 *dp;
252b5132 2845 int i;
050dfa73 2846 char *first, *second, *third, *fourth;
252b5132 2847 int needcomma;
eec0f4ca
L
2848 unsigned char uses_DATA_prefix, uses_LOCK_prefix;
2849 unsigned char uses_REPNZ_prefix, uses_REPZ_prefix;
e396998b
AM
2850 int sizeflag;
2851 const char *p;
252b5132 2852 struct dis_private priv;
eec0f4ca 2853 unsigned char op;
252b5132 2854
cb712a9e
L
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;
52b15da3 2860
8373f971 2861 if (intel_syntax == (char) -1)
e396998b
AM
2862 intel_syntax = (info->mach == bfd_mach_i386_i386_intel_syntax
2863 || info->mach == bfd_mach_x86_64_intel_syntax);
2864
2da11e11 2865 if (info->mach == bfd_mach_i386_i386
52b15da3
JH
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)
e396998b 2869 priv.orig_sizeflag = AFLAG | DFLAG;
2da11e11 2870 else if (info->mach == bfd_mach_i386_i8086)
e396998b 2871 priv.orig_sizeflag = 0;
2da11e11
AM
2872 else
2873 abort ();
e396998b
AM
2874
2875 for (p = info->disassembler_options; p != NULL; )
2876 {
0112cd26 2877 if (CONST_STRNEQ (p, "x86-64"))
e396998b 2878 {
cb712a9e 2879 address_mode = mode_64bit;
e396998b
AM
2880 priv.orig_sizeflag = AFLAG | DFLAG;
2881 }
0112cd26 2882 else if (CONST_STRNEQ (p, "i386"))
e396998b 2883 {
cb712a9e 2884 address_mode = mode_32bit;
e396998b
AM
2885 priv.orig_sizeflag = AFLAG | DFLAG;
2886 }
0112cd26 2887 else if (CONST_STRNEQ (p, "i8086"))
e396998b 2888 {
cb712a9e 2889 address_mode = mode_16bit;
e396998b
AM
2890 priv.orig_sizeflag = 0;
2891 }
0112cd26 2892 else if (CONST_STRNEQ (p, "intel"))
e396998b
AM
2893 {
2894 intel_syntax = 1;
2895 }
0112cd26 2896 else if (CONST_STRNEQ (p, "att"))
e396998b
AM
2897 {
2898 intel_syntax = 0;
2899 }
0112cd26 2900 else if (CONST_STRNEQ (p, "addr"))
e396998b
AM
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 }
0112cd26 2907 else if (CONST_STRNEQ (p, "data"))
e396998b
AM
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 }
0112cd26 2914 else if (CONST_STRNEQ (p, "suffix"))
e396998b
AM
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 }
2da11e11 2950
4fe53c98 2951 /* The output looks better if we put 7 bytes on a line, since that
c608c12e 2952 puts most long word instructions on a single line. */
4fe53c98 2953 info->bytes_per_line = 7;
252b5132 2954
26ca5450 2955 info->private_data = &priv;
252b5132
RH
2956 priv.max_fetched = priv.the_buffer;
2957 priv.insn_start = pc;
252b5132
RH
2958
2959 obuf[0] = 0;
2960 op1out[0] = 0;
2961 op2out[0] = 0;
2962 op3out[0] = 0;
050dfa73 2963 op4out[0] = 0;
252b5132 2964
050dfa73 2965 op_index[0] = op_index[1] = op_index[2] = op_index[3] = -1;
252b5132
RH
2966
2967 the_info = info;
2968 start_pc = pc;
e396998b
AM
2969 start_codep = priv.the_buffer;
2970 codep = priv.the_buffer;
252b5132 2971
5076851f
ILT
2972 if (setjmp (priv.bailout) != 0)
2973 {
7d421014
ILT
2974 const char *name;
2975
5076851f 2976 /* Getting here means we tried for data but didn't get it. That
e396998b
AM
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)
5076851f 2980 {
e396998b 2981 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
7d421014
ILT
2982 if (name != NULL)
2983 (*info->fprintf_func) (info->stream, "%s", name);
2984 else
5076851f 2985 {
7d421014
ILT
2986 /* Just print the first byte as a .byte instruction. */
2987 (*info->fprintf_func) (info->stream, ".byte 0x%x",
e396998b 2988 (unsigned int) priv.the_buffer[0]);
5076851f 2989 }
5076851f 2990
7d421014 2991 return 1;
5076851f
ILT
2992 }
2993
2994 return -1;
2995 }
2996
52b15da3 2997 obufp = obuf;
252b5132
RH
2998 ckprefix ();
2999
3000 insn_codep = codep;
e396998b 3001 sizeflag = priv.orig_sizeflag;
252b5132
RH
3002
3003 FETCH_DATA (info, codep + 1);
3004 two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
3005
3e7d61b2
AM
3006 if (((prefixes & PREFIX_FWAIT)
3007 && ((*codep < 0xd8) || (*codep > 0xdf)))
3008 || (rex && rex_used))
252b5132 3009 {
7d421014
ILT
3010 const char *name;
3011
3e7d61b2
AM
3012 /* fwait not followed by floating point instruction, or rex followed
3013 by other prefixes. Print the first prefix. */
e396998b 3014 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
7d421014
ILT
3015 if (name == NULL)
3016 name = INTERNAL_DISASSEMBLER_ERROR;
3017 (*info->fprintf_func) (info->stream, "%s", name);
3018 return 1;
252b5132
RH
3019 }
3020
eec0f4ca 3021 op = 0;
252b5132
RH
3022 if (*codep == 0x0f)
3023 {
eec0f4ca 3024 unsigned char threebyte;
252b5132 3025 FETCH_DATA (info, codep + 2);
eec0f4ca
L
3026 threebyte = *++codep;
3027 dp = &dis386_twobyte[threebyte];
252b5132 3028 need_modrm = twobyte_has_modrm[*codep];
eec0f4ca
L
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];
c4a530c5 3032 uses_LOCK_prefix = (*codep & ~0x02) == 0x20;
eec0f4ca
L
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 }
252b5132
RH
3054 }
3055 else
3056 {
6439fc28 3057 dp = &dis386[*codep];
252b5132 3058 need_modrm = onebyte_has_modrm[*codep];
eec0f4ca
L
3059 uses_DATA_prefix = 0;
3060 uses_REPNZ_prefix = 0;
3061 uses_REPZ_prefix = 0;
c4a530c5 3062 uses_LOCK_prefix = 0;
eec0f4ca 3063 codep++;
252b5132 3064 }
050dfa73 3065
eec0f4ca 3066 if (!uses_REPZ_prefix && (prefixes & PREFIX_REPZ))
7d421014
ILT
3067 {
3068 oappend ("repz ");
3069 used_prefixes |= PREFIX_REPZ;
3070 }
eec0f4ca 3071 if (!uses_REPNZ_prefix && (prefixes & PREFIX_REPNZ))
7d421014
ILT
3072 {
3073 oappend ("repnz ");
3074 used_prefixes |= PREFIX_REPNZ;
3075 }
050dfa73 3076
c4a530c5 3077 if (!uses_LOCK_prefix && (prefixes & PREFIX_LOCK))
7d421014
ILT
3078 {
3079 oappend ("lock ");
3080 used_prefixes |= PREFIX_LOCK;
3081 }
c608c12e 3082
c608c12e
AM
3083 if (prefixes & PREFIX_ADDR)
3084 {
3085 sizeflag ^= AFLAG;
6439fc28 3086 if (dp->bytemode3 != loop_jcxz_mode || intel_syntax)
3ffd33cf 3087 {
cb712a9e 3088 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
3ffd33cf
AM
3089 oappend ("addr32 ");
3090 else
3091 oappend ("addr16 ");
3092 used_prefixes |= PREFIX_ADDR;
3093 }
3094 }
3095
eec0f4ca 3096 if (!uses_DATA_prefix && (prefixes & PREFIX_DATA))
3ffd33cf
AM
3097 {
3098 sizeflag ^= DFLAG;
6439fc28
AM
3099 if (dp->bytemode3 == cond_jump_mode
3100 && dp->bytemode1 == v_mode
3101 && !intel_syntax)
3ffd33cf
AM
3102 {
3103 if (sizeflag & DFLAG)
3104 oappend ("data32 ");
3105 else
3106 oappend ("data16 ");
3107 used_prefixes |= PREFIX_DATA;
3108 }
3109 }
3110
331d2d0d
L
3111 if (dp->name == NULL && dp->bytemode1 == IS_3BYTE_OPCODE)
3112 {
eec0f4ca 3113 dp = &three_byte_table[dp->bytemode2][op];
331d2d0d
L
3114 mod = (*codep >> 6) & 3;
3115 reg = (*codep >> 3) & 7;
3116 rm = *codep & 7;
3117 }
3118 else if (need_modrm)
252b5132
RH
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 {
041bd2e0 3132 int index;
252b5132 3133 if (dp->name == NULL)
c608c12e 3134 {
6439fc28 3135 switch (dp->bytemode1)
c608c12e 3136 {
6439fc28
AM
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 {
d81afd0c
L
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;
6439fc28
AM
3153 else
3154 {
d81afd0c
L
3155 used_prefixes |= (prefixes & PREFIX_DATA);
3156 if (prefixes & PREFIX_DATA)
3157 index = 2;
6439fc28
AM
3158 }
3159 }
3160 dp = &prefix_user_table[dp->bytemode2][index];
3161 break;
252b5132 3162
6439fc28 3163 case X86_64_SPECIAL:
cb712a9e
L
3164 index = address_mode == mode_64bit ? 1 : 0;
3165 dp = &x86_64_table[dp->bytemode2][index];
6439fc28 3166 break;
252b5132 3167
6439fc28
AM
3168 default:
3169 oappend (INTERNAL_DISASSEMBLER_ERROR);
3170 break;
3171 }
3172 }
252b5132 3173
6439fc28
AM
3174 if (putop (dp->name, sizeflag) == 0)
3175 {
3176 obufp = op1out;
050dfa73 3177 op_ad = 3;
6439fc28 3178 if (dp->op1)
6608db57 3179 (*dp->op1) (dp->bytemode1, sizeflag);
6439fc28
AM
3180
3181 obufp = op2out;
050dfa73 3182 op_ad = 2;
6439fc28 3183 if (dp->op2)
6608db57 3184 (*dp->op2) (dp->bytemode2, sizeflag);
6439fc28
AM
3185
3186 obufp = op3out;
050dfa73 3187 op_ad = 1;
6439fc28 3188 if (dp->op3)
6608db57 3189 (*dp->op3) (dp->bytemode3, sizeflag);
050dfa73
MM
3190
3191 obufp = op4out;
3192 op_ad = 0;
3193 if (dp->op4)
3194 (*dp->op4) (dp->bytemode4, sizeflag);
6439fc28 3195 }
252b5132
RH
3196 }
3197
7d421014
ILT
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
e396998b 3206 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
7d421014
ILT
3207 if (name == NULL)
3208 name = INTERNAL_DISASSEMBLER_ERROR;
3209 (*info->fprintf_func) (info->stream, "%s", name);
3210 return 1;
3211 }
52b15da3
JH
3212 if (rex & ~rex_used)
3213 {
3214 const char *name;
e396998b 3215 name = prefix_name (rex | 0x40, priv.orig_sizeflag);
52b15da3
JH
3216 if (name == NULL)
3217 name = INTERNAL_DISASSEMBLER_ERROR;
3218 (*info->fprintf_func) (info->stream, "%s ", name);
3219 }
7d421014 3220
252b5132
RH
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. */
2da11e11 3229 if (intel_syntax || two_source_ops)
252b5132
RH
3230 {
3231 first = op1out;
3232 second = op2out;
3233 third = op3out;
050dfa73 3234 fourth = op4out;
252b5132 3235 op_ad = op_index[0];
050dfa73
MM
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];
252b5132 3240 op_index[2] = op_ad;
050dfa73 3241
252b5132
RH
3242 }
3243 else
3244 {
050dfa73
MM
3245 first = op4out;
3246 second = op3out;
3247 third = op2out;
3248 fourth = op1out;
252b5132
RH
3249 }
3250 needcomma = 0;
3251 if (*first)
3252 {
52b15da3 3253 if (op_index[0] != -1 && !op_riprel[0])
252b5132
RH
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 }
050dfa73 3259
252b5132
RH
3260 if (*second)
3261 {
3262 if (needcomma)
3263 (*info->fprintf_func) (info->stream, ",");
52b15da3 3264 if (op_index[1] != -1 && !op_riprel[1])
252b5132
RH
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 }
050dfa73 3270
252b5132
RH
3271 if (*third)
3272 {
3273 if (needcomma)
3274 (*info->fprintf_func) (info->stream, ",");
52b15da3 3275 if (op_index[2] != -1 && !op_riprel[2])
252b5132
RH
3276 (*info->print_address_func) ((bfd_vma) op_address[op_index[2]], info);
3277 else
3278 (*info->fprintf_func) (info->stream, "%s", third);
050dfa73
MM
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);
252b5132 3290 }
050dfa73
MM
3291
3292 for (i = 0; i < 4; i++)
52b15da3
JH
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 }
e396998b 3299 return codep - priv.the_buffer;
252b5132
RH
3300}
3301
6439fc28 3302static const char *float_mem[] = {
252b5132 3303 /* d8 */
6439fc28
AM
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|}",
db6eb5be 3312 /* d9 */
6439fc28 3313 "fld{s||s|}",
252b5132 3314 "(bad)",
6439fc28
AM
3315 "fst{s||s|}",
3316 "fstp{s||s|}",
9306ca4a 3317 "fldenvIC",
252b5132 3318 "fldcw",
9306ca4a 3319 "fNstenvIC",
252b5132
RH
3320 "fNstcw",
3321 /* da */
6439fc28
AM
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|}",
252b5132 3330 /* db */
6439fc28 3331 "fild{l||l|}",
ca164297 3332 "fisttp{l||l|}",
6439fc28
AM
3333 "fist{l||l|}",
3334 "fistp{l||l|}",
252b5132 3335 "(bad)",
6439fc28 3336 "fld{t||t|}",
252b5132 3337 "(bad)",
6439fc28 3338 "fstp{t||t|}",
252b5132 3339 /* dc */
6439fc28
AM
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|}",
252b5132 3348 /* dd */
6439fc28 3349 "fld{l||l|}",
1d9f512f 3350 "fisttp{ll||ll|}",
6439fc28
AM
3351 "fst{l||l|}",
3352 "fstp{l||l|}",
9306ca4a 3353 "frstorIC",
252b5132 3354 "(bad)",
9306ca4a 3355 "fNsaveIC",
252b5132
RH
3356 "fNstsw",
3357 /* de */
3358 "fiadd",
3359 "fimul",
3360 "ficom",
3361 "ficomp",
3362 "fisub",
3363 "fisubr",
3364 "fidiv",
3365 "fidivr",
3366 /* df */
3367 "fild",
ca164297 3368 "fisttp",
252b5132
RH
3369 "fist",
3370 "fistp",
3371 "fbld",
6439fc28 3372 "fild{ll||ll|}",
252b5132 3373 "fbstp",
1d9f512f
AM
3374 "fistp{ll||ll|}",
3375};
3376
3377static 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,
9306ca4a 3411 t_mode,
1d9f512f 3412 0,
9306ca4a 3413 t_mode,
1d9f512f
AM
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,
9306ca4a 3446 t_mode,
1d9f512f 3447 q_mode,
9306ca4a 3448 t_mode,
1d9f512f 3449 q_mode
252b5132
RH
3450};
3451
3452#define ST OP_ST, 0
3453#define STi OP_STi, 0
3454
050dfa73
MM
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
252b5132 3464
2da11e11 3465static const struct dis386 float_reg[][8] = {
252b5132
RH
3466 /* d8 */
3467 {
050dfa73
MM
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 },
252b5132
RH
3476 },
3477 /* d9 */
3478 {
050dfa73
MM
3479 { "fld", STi, XX, XX, XX },
3480 { "fxch", STi, XX, XX, XX },
252b5132 3481 { FGRPd9_2 },
050dfa73 3482 { "(bad)", XX, XX, XX, XX },
252b5132
RH
3483 { FGRPd9_4 },
3484 { FGRPd9_5 },
3485 { FGRPd9_6 },
3486 { FGRPd9_7 },
3487 },
3488 /* da */
3489 {
050dfa73
MM
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 },
252b5132 3495 { FGRPda_5 },
050dfa73
MM
3496 { "(bad)", XX, XX, XX, XX },
3497 { "(bad)", XX, XX, XX, XX },
252b5132
RH
3498 },
3499 /* db */
3500 {
050dfa73
MM
3501 { "fcmovnb",ST, STi, XX, XX },
3502 { "fcmovne",ST, STi, XX, XX },
3503 { "fcmovnbe",ST, STi, XX, XX },
3504 { "fcmovnu",ST, STi, XX, XX },
252b5132 3505 { FGRPdb_4 },
050dfa73
MM
3506 { "fucomi", ST, STi, XX, XX },
3507 { "fcomi", ST, STi, XX, XX },
3508 { "(bad)", XX, XX, XX, XX },
252b5132
RH
3509 },
3510 /* dc */
3511 {
050dfa73
MM
3512 { "fadd", STi, ST, XX, XX },
3513 { "fmul", STi, ST, XX, XX },
3514 { "(bad)", XX, XX, XX, XX },
3515 { "(bad)", XX, XX, XX, XX },
252b5132 3516#if UNIXWARE_COMPAT
050dfa73
MM
3517 { "fsub", STi, ST, XX, XX },
3518 { "fsubr", STi, ST, XX, XX },
3519 { "fdiv", STi, ST, XX, XX },
3520 { "fdivr", STi, ST, XX, XX },
252b5132 3521#else
050dfa73
MM
3522 { "fsubr", STi, ST, XX, XX },
3523 { "fsub", STi, ST, XX, XX },
3524 { "fdivr", STi, ST, XX, XX },
3525 { "fdiv", STi, ST, XX, XX },
252b5132
RH
3526#endif
3527 },
3528 /* dd */
3529 {
050dfa73
MM
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 },
252b5132
RH
3538 },
3539 /* de */
3540 {
050dfa73
MM
3541 { "faddp", STi, ST, XX, XX },
3542 { "fmulp", STi, ST, XX, XX },
3543 { "(bad)", XX, XX, XX, XX },
252b5132
RH
3544 { FGRPde_3 },
3545#if UNIXWARE_COMPAT
050dfa73
MM
3546 { "fsubp", STi, ST, XX, XX },
3547 { "fsubrp", STi, ST, XX, XX },
3548 { "fdivp", STi, ST, XX, XX },
3549 { "fdivrp", STi, ST, XX, XX },
252b5132 3550#else
050dfa73
MM
3551 { "fsubrp", STi, ST, XX, XX },
3552 { "fsubp", STi, ST, XX, XX },
3553 { "fdivrp", STi, ST, XX, XX },
3554 { "fdivp", STi, ST, XX, XX },
252b5132
RH
3555#endif
3556 },
3557 /* df */
3558 {
050dfa73
MM
3559 { "ffreep", STi, XX, XX, XX },
3560 { "(bad)", XX, XX, XX, XX },
3561 { "(bad)", XX, XX, XX, XX },
3562 { "(bad)", XX, XX, XX, XX },
252b5132 3563 { FGRPdf_4 },
050dfa73
MM
3564 { "fucomip",ST, STi, XX, XX },
3565 { "fcomip", ST, STi, XX, XX },
3566 { "(bad)", XX, XX, XX, XX },
252b5132
RH
3567 },
3568};
3569
252b5132
RH
3570static 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
3618static void
26ca5450 3619dofloat (int sizeflag)
252b5132 3620{
2da11e11 3621 const struct dis386 *dp;
252b5132
RH
3622 unsigned char floatop;
3623
3624 floatop = codep[-1];
3625
3626 if (mod != 3)
3627 {
1d9f512f
AM
3628 int fp_indx = (floatop - 0xd8) * 8 + reg;
3629
3630 putop (float_mem[fp_indx], sizeflag);
252b5132 3631 obufp = op1out;
6e50d963 3632 op_ad = 2;
1d9f512f 3633 OP_E (float_mem_mode[fp_indx], sizeflag);
252b5132
RH
3634 return;
3635 }
6608db57 3636 /* Skip mod/rm byte. */
4bba6815 3637 MODRM_CHECK;
252b5132
RH
3638 codep++;
3639
3640 dp = &float_reg[floatop - 0xd8][reg];
3641 if (dp->name == NULL)
3642 {
3643 putop (fgrps[dp->bytemode1][rm], sizeflag);
3644
6608db57 3645 /* Instruction fnstsw is only one with strange arg. */
252b5132
RH
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;
6e50d963 3654 op_ad = 2;
252b5132 3655 if (dp->op1)
6608db57 3656 (*dp->op1) (dp->bytemode1, sizeflag);
6e50d963 3657
252b5132 3658 obufp = op2out;
6e50d963 3659 op_ad = 1;
252b5132 3660 if (dp->op2)
6608db57 3661 (*dp->op2) (dp->bytemode2, sizeflag);
252b5132
RH
3662 }
3663}
3664
252b5132 3665static void
26ca5450 3666OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 3667{
422673a9 3668 oappend ("%st" + intel_syntax);
252b5132
RH
3669}
3670
252b5132 3671static void
26ca5450 3672OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132
RH
3673{
3674 sprintf (scratchbuf, "%%st(%d)", rm);
d708bcba 3675 oappend (scratchbuf + intel_syntax);
252b5132
RH
3676}
3677
6608db57 3678/* Capital letters in template are macros. */
6439fc28 3679static int
26ca5450 3680putop (const char *template, int sizeflag)
252b5132 3681{
2da11e11 3682 const char *p;
9306ca4a 3683 int alt = 0;
252b5132
RH
3684
3685 for (p = template; *p; p++)
3686 {
3687 switch (*p)
3688 {
3689 default:
3690 *obufp++ = *p;
3691 break;
6439fc28
AM
3692 case '{':
3693 alt = 0;
3694 if (intel_syntax)
3695 alt += 1;
cb712a9e 3696 if (address_mode == mode_64bit)
6439fc28
AM
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 }
9306ca4a
JB
3714 /* Fall through. */
3715 case 'I':
3716 alt = 1;
3717 continue;
6439fc28
AM
3718 case '|':
3719 while (*++p != '}')
3720 {
3721 if (*p == '\0')
3722 abort ();
3723 }
3724 break;
3725 case '}':
3726 break;
252b5132 3727 case 'A':
db6eb5be
AM
3728 if (intel_syntax)
3729 break;
e396998b 3730 if (mod != 3 || (sizeflag & SUFFIX_ALWAYS))
252b5132
RH
3731 *obufp++ = 'b';
3732 break;
3733 case 'B':
db6eb5be
AM
3734 if (intel_syntax)
3735 break;
252b5132
RH
3736 if (sizeflag & SUFFIX_ALWAYS)
3737 *obufp++ = 'b';
252b5132 3738 break;
9306ca4a
JB
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;
252b5132 3751 case 'E': /* For jcxz/jecxz */
cb712a9e 3752 if (address_mode == mode_64bit)
c1a64871
JH
3753 {
3754 if (sizeflag & AFLAG)
3755 *obufp++ = 'r';
3756 else
3757 *obufp++ = 'e';
3758 }
3759 else
3760 if (sizeflag & AFLAG)
3761 *obufp++ = 'e';
3ffd33cf
AM
3762 used_prefixes |= (prefixes & PREFIX_ADDR);
3763 break;
3764 case 'F':
db6eb5be
AM
3765 if (intel_syntax)
3766 break;
e396998b 3767 if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
3ffd33cf
AM
3768 {
3769 if (sizeflag & AFLAG)
cb712a9e 3770 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
3ffd33cf 3771 else
cb712a9e 3772 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
3ffd33cf
AM
3773 used_prefixes |= (prefixes & PREFIX_ADDR);
3774 }
252b5132 3775 break;
52fd6d94
JB
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;
5dd0794d 3786 case 'H':
db6eb5be
AM
3787 if (intel_syntax)
3788 break;
5dd0794d
AM
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;
9306ca4a
JB
3801 case 'J':
3802 if (intel_syntax)
3803 break;
3804 *obufp++ = 'l';
3805 break;
6dd5059a
L
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. */
252b5132 3815 case 'L':
db6eb5be
AM
3816 if (intel_syntax)
3817 break;
252b5132
RH
3818 if (sizeflag & SUFFIX_ALWAYS)
3819 *obufp++ = 'l';
252b5132
RH
3820 break;
3821 case 'N':
3822 if ((prefixes & PREFIX_FWAIT) == 0)
3823 *obufp++ = 'n';
7d421014
ILT
3824 else
3825 used_prefixes |= PREFIX_FWAIT;
252b5132 3826 break;
52b15da3
JH
3827 case 'O':
3828 USED_REX (REX_MODE64);
3829 if (rex & REX_MODE64)
6439fc28 3830 *obufp++ = 'o';
a35ca55a
JB
3831 else if (intel_syntax && (sizeflag & DFLAG))
3832 *obufp++ = 'q';
52b15da3
JH
3833 else
3834 *obufp++ = 'd';
a35ca55a
JB
3835 if (!(rex & REX_MODE64))
3836 used_prefixes |= (prefixes & PREFIX_DATA);
52b15da3 3837 break;
6439fc28 3838 case 'T':
db6eb5be
AM
3839 if (intel_syntax)
3840 break;
cb712a9e 3841 if (address_mode == mode_64bit && (sizeflag & DFLAG))
6439fc28
AM
3842 {
3843 *obufp++ = 'q';
3844 break;
3845 }
6608db57 3846 /* Fall through. */
252b5132 3847 case 'P':
db6eb5be
AM
3848 if (intel_syntax)
3849 break;
252b5132 3850 if ((prefixes & PREFIX_DATA)
52b15da3 3851 || (rex & REX_MODE64)
e396998b 3852 || (sizeflag & SUFFIX_ALWAYS))
252b5132 3853 {
52b15da3
JH
3854 USED_REX (REX_MODE64);
3855 if (rex & REX_MODE64)
3856 *obufp++ = 'q';
c2419411 3857 else
52b15da3
JH
3858 {
3859 if (sizeflag & DFLAG)
3860 *obufp++ = 'l';
3861 else
3862 *obufp++ = 'w';
52b15da3 3863 }
1a114b12 3864 used_prefixes |= (prefixes & PREFIX_DATA);
252b5132
RH
3865 }
3866 break;
6439fc28 3867 case 'U':
db6eb5be
AM
3868 if (intel_syntax)
3869 break;
cb712a9e 3870 if (address_mode == mode_64bit && (sizeflag & DFLAG))
6439fc28 3871 {
1a114b12
JB
3872 if (mod != 3 || (sizeflag & SUFFIX_ALWAYS))
3873 *obufp++ = 'q';
6439fc28
AM
3874 break;
3875 }
6608db57 3876 /* Fall through. */
252b5132 3877 case 'Q':
9306ca4a 3878 if (intel_syntax && !alt)
db6eb5be 3879 break;
90530880 3880 USED_REX (REX_MODE64);
e396998b 3881 if (mod != 3 || (sizeflag & SUFFIX_ALWAYS))
252b5132 3882 {
52b15da3
JH
3883 if (rex & REX_MODE64)
3884 *obufp++ = 'q';
252b5132 3885 else
52b15da3
JH
3886 {
3887 if (sizeflag & DFLAG)
9306ca4a 3888 *obufp++ = intel_syntax ? 'd' : 'l';
52b15da3
JH
3889 else
3890 *obufp++ = 'w';
52b15da3 3891 }
1a114b12 3892 used_prefixes |= (prefixes & PREFIX_DATA);
252b5132
RH
3893 }
3894 break;
3895 case 'R':
52b15da3 3896 USED_REX (REX_MODE64);
a35ca55a
JB
3897 if (rex & REX_MODE64)
3898 *obufp++ = 'q';
3899 else if (sizeflag & DFLAG)
c608c12e 3900 {
a35ca55a 3901 if (intel_syntax)
c608c12e 3902 *obufp++ = 'd';
c608c12e 3903 else
a35ca55a 3904 *obufp++ = 'l';
c608c12e 3905 }
252b5132 3906 else
a35ca55a
JB
3907 *obufp++ = 'w';
3908 if (intel_syntax && !p[1]
3909 && ((rex & REX_MODE64) || (sizeflag & DFLAG)))
3910 *obufp++ = 'e';
52b15da3
JH
3911 if (!(rex & REX_MODE64))
3912 used_prefixes |= (prefixes & PREFIX_DATA);
252b5132 3913 break;
1a114b12
JB
3914 case 'V':
3915 if (intel_syntax)
3916 break;
cb712a9e 3917 if (address_mode == mode_64bit && (sizeflag & DFLAG))
1a114b12
JB
3918 {
3919 if (sizeflag & SUFFIX_ALWAYS)
3920 *obufp++ = 'q';
3921 break;
3922 }
3923 /* Fall through. */
252b5132 3924 case 'S':
db6eb5be
AM
3925 if (intel_syntax)
3926 break;
252b5132
RH
3927 if (sizeflag & SUFFIX_ALWAYS)
3928 {
52b15da3
JH
3929 if (rex & REX_MODE64)
3930 *obufp++ = 'q';
252b5132 3931 else
52b15da3
JH
3932 {
3933 if (sizeflag & DFLAG)
3934 *obufp++ = 'l';
3935 else
3936 *obufp++ = 'w';
3937 used_prefixes |= (prefixes & PREFIX_DATA);
3938 }
252b5132 3939 }
252b5132 3940 break;
041bd2e0
JH
3941 case 'X':
3942 if (prefixes & PREFIX_DATA)
3943 *obufp++ = 'd';
3944 else
3945 *obufp++ = 's';
db6eb5be 3946 used_prefixes |= (prefixes & PREFIX_DATA);
041bd2e0 3947 break;
76f227a5 3948 case 'Y':
db6eb5be
AM
3949 if (intel_syntax)
3950 break;
76f227a5
JH
3951 if (rex & REX_MODE64)
3952 {
3953 USED_REX (REX_MODE64);
3954 *obufp++ = 'q';
3955 }
3956 break;
52b15da3 3957 /* implicit operand size 'l' for i386 or 'q' for x86-64 */
252b5132 3958 case 'W':
252b5132 3959 /* operand size flag for cwtl, cbtw */
a35ca55a
JB
3960 USED_REX (REX_MODE64);
3961 if (rex & REX_MODE64)
3962 {
3963 if (intel_syntax)
3964 *obufp++ = 'd';
3965 else
3966 *obufp++ = 'l';
3967 }
52b15da3 3968 else if (sizeflag & DFLAG)
252b5132
RH
3969 *obufp++ = 'w';
3970 else
3971 *obufp++ = 'b';
a35ca55a 3972 if (!(rex & REX_MODE64))
52b15da3 3973 used_prefixes |= (prefixes & PREFIX_DATA);
252b5132
RH
3974 break;
3975 }
9306ca4a 3976 alt = 0;
252b5132
RH
3977 }
3978 *obufp = 0;
6439fc28 3979 return 0;
252b5132
RH
3980}
3981
3982static void
26ca5450 3983oappend (const char *s)
252b5132
RH
3984{
3985 strcpy (obufp, s);
3986 obufp += strlen (s);
3987}
3988
3989static void
26ca5450 3990append_seg (void)
252b5132
RH
3991{
3992 if (prefixes & PREFIX_CS)
7d421014 3993 {
7d421014 3994 used_prefixes |= PREFIX_CS;
d708bcba 3995 oappend ("%cs:" + intel_syntax);
7d421014 3996 }
252b5132 3997 if (prefixes & PREFIX_DS)
7d421014 3998 {
7d421014 3999 used_prefixes |= PREFIX_DS;
d708bcba 4000 oappend ("%ds:" + intel_syntax);
7d421014 4001 }
252b5132 4002 if (prefixes & PREFIX_SS)
7d421014 4003 {
7d421014 4004 used_prefixes |= PREFIX_SS;
d708bcba 4005 oappend ("%ss:" + intel_syntax);
7d421014 4006 }
252b5132 4007 if (prefixes & PREFIX_ES)
7d421014 4008 {
7d421014 4009 used_prefixes |= PREFIX_ES;
d708bcba 4010 oappend ("%es:" + intel_syntax);
7d421014 4011 }
252b5132 4012 if (prefixes & PREFIX_FS)
7d421014 4013 {
7d421014 4014 used_prefixes |= PREFIX_FS;
d708bcba 4015 oappend ("%fs:" + intel_syntax);
7d421014 4016 }
252b5132 4017 if (prefixes & PREFIX_GS)
7d421014 4018 {
7d421014 4019 used_prefixes |= PREFIX_GS;
d708bcba 4020 oappend ("%gs:" + intel_syntax);
7d421014 4021 }
252b5132
RH
4022}
4023
4024static void
26ca5450 4025OP_indirE (int bytemode, int sizeflag)
252b5132
RH
4026{
4027 if (!intel_syntax)
4028 oappend ("*");
4029 OP_E (bytemode, sizeflag);
4030}
4031
52b15da3 4032static void
26ca5450 4033print_operand_value (char *buf, int hex, bfd_vma disp)
52b15da3 4034{
cb712a9e 4035 if (address_mode == mode_64bit)
52b15da3
JH
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);
6608db57 4044 for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
52b15da3
JH
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;
6608db57 4056 /* Check for possible overflow on 0x8000000000000000. */
52b15da3
JH
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 {
6608db57 4073 tmp[28 - i] = (v % 10) + '0';
52b15da3
JH
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
3f31e633
JB
4089static void
4090intel_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;
1a114b12 4101 case stack_v_mode:
cb712a9e 4102 if (address_mode == mode_64bit && (sizeflag & DFLAG))
3f31e633
JB
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;
52fd6d94
JB
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;
3f31e633
JB
4127 case d_mode:
4128 oappend ("DWORD PTR ");
4129 break;
4130 case q_mode:
4131 oappend ("QWORD PTR ");
4132 break;
4133 case m_mode:
cb712a9e 4134 if (address_mode == mode_64bit)
3f31e633
JB
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
252b5132 4157static void
26ca5450 4158OP_E (int bytemode, int sizeflag)
252b5132 4159{
52b15da3
JH
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;
252b5132 4166
6608db57 4167 /* Skip mod/rm byte. */
4bba6815 4168 MODRM_CHECK;
252b5132
RH
4169 codep++;
4170
4171 if (mod == 3)
4172 {
4173 switch (bytemode)
4174 {
4175 case b_mode:
52b15da3
JH
4176 USED_REX (0);
4177 if (rex)
4178 oappend (names8rex[rm + add]);
4179 else
4180 oappend (names8[rm + add]);
252b5132
RH
4181 break;
4182 case w_mode:
52b15da3 4183 oappend (names16[rm + add]);
252b5132 4184 break;
2da11e11 4185 case d_mode:
52b15da3
JH
4186 oappend (names32[rm + add]);
4187 break;
4188 case q_mode:
4189 oappend (names64[rm + add]);
4190 break;
4191 case m_mode:
cb712a9e 4192 if (address_mode == mode_64bit)
52b15da3
JH
4193 oappend (names64[rm + add]);
4194 else
4195 oappend (names32[rm + add]);
2da11e11 4196 break;
1a114b12 4197 case stack_v_mode:
cb712a9e 4198 if (address_mode == mode_64bit && (sizeflag & DFLAG))
003519a7 4199 {
1a114b12 4200 oappend (names64[rm + add]);
003519a7 4201 used_prefixes |= (prefixes & PREFIX_DATA);
1a114b12 4202 break;
003519a7 4203 }
1a114b12
JB
4204 bytemode = v_mode;
4205 /* FALLTHRU */
252b5132 4206 case v_mode:
db6eb5be 4207 case dq_mode:
9306ca4a 4208 case dqw_mode:
52b15da3
JH
4209 USED_REX (REX_MODE64);
4210 if (rex & REX_MODE64)
4211 oappend (names64[rm + add]);
9306ca4a 4212 else if ((sizeflag & DFLAG) || bytemode != v_mode)
52b15da3 4213 oappend (names32[rm + add]);
252b5132 4214 else
52b15da3 4215 oappend (names16[rm + add]);
7d421014 4216 used_prefixes |= (prefixes & PREFIX_DATA);
252b5132 4217 break;
2da11e11 4218 case 0:
c608c12e 4219 break;
252b5132 4220 default:
c608c12e 4221 oappend (INTERNAL_DISASSEMBLER_ERROR);
252b5132
RH
4222 break;
4223 }
4224 return;
4225 }
4226
4227 disp = 0;
3f31e633
JB
4228 if (intel_syntax)
4229 intel_operand_size (bytemode, sizeflag);
252b5132
RH
4230 append_seg ();
4231
cb712a9e 4232 if ((sizeflag & AFLAG) || address_mode == mode_64bit) /* 32 bit address mode */
252b5132
RH
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);
252b5132 4248 index = (*codep >> 3) & 7;
cb712a9e 4249 if (address_mode == mode_64bit || index != 0x4)
9df48ba9 4250 /* When INDEX == 0x4 in 32 bit mode, SCALE is ignored. */
2033b4b9 4251 scale = (*codep >> 6) & 3;
252b5132 4252 base = *codep & 7;
52b15da3 4253 USED_REX (REX_EXTY);
52b15da3
JH
4254 if (rex & REX_EXTY)
4255 index += 8;
252b5132
RH
4256 codep++;
4257 }
2888cb7a 4258 base += add;
252b5132
RH
4259
4260 switch (mod)
4261 {
4262 case 0:
52b15da3 4263 if ((base & 7) == 5)
252b5132
RH
4264 {
4265 havebase = 0;
cb712a9e 4266 if (address_mode == mode_64bit && !havesib)
52b15da3
JH
4267 riprel = 1;
4268 disp = get32s ();
252b5132
RH
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:
52b15da3 4278 disp = get32s ();
252b5132
RH
4279 break;
4280 }
4281
4282 if (!intel_syntax)
db6eb5be
AM
4283 if (mod != 0 || (base & 7) == 5)
4284 {
52b15da3 4285 print_operand_value (scratchbuf, !riprel, disp);
db6eb5be 4286 oappend (scratchbuf);
52b15da3
JH
4287 if (riprel)
4288 {
4289 set_op (disp, 1);
4290 oappend ("(%rip)");
4291 }
db6eb5be 4292 }
2da11e11 4293
252b5132
RH
4294 if (havebase || (havesib && (index != 4 || scale != 0)))
4295 {
252b5132 4296 *obufp++ = open_char;
52b15da3
JH
4297 if (intel_syntax && riprel)
4298 oappend ("rip + ");
db6eb5be 4299 *obufp = '\0';
252b5132 4300 if (havebase)
cb712a9e 4301 oappend (address_mode == mode_64bit && (sizeflag & AFLAG)
c1a64871 4302 ? names64[base] : names32[base]);
252b5132
RH
4303 if (havesib)
4304 {
4305 if (index != 4)
4306 {
9306ca4a 4307 if (!intel_syntax || havebase)
db6eb5be 4308 {
9306ca4a
JB
4309 *obufp++ = separator_char;
4310 *obufp = '\0';
db6eb5be 4311 }
cb712a9e 4312 oappend (address_mode == mode_64bit && (sizeflag & AFLAG)
9306ca4a 4313 ? names64[index] : names32[index]);
252b5132 4314 }
a02a862a 4315 if (scale != 0 || (!intel_syntax && index != 4))
db6eb5be
AM
4316 {
4317 *obufp++ = scale_char;
4318 *obufp = '\0';
4319 sprintf (scratchbuf, "%d", 1 << scale);
4320 oappend (scratchbuf);
4321 }
252b5132 4322 }
3d456fa1
JB
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 }
252b5132
RH
4340
4341 *obufp++ = close_char;
db6eb5be 4342 *obufp = '\0';
252b5132
RH
4343 }
4344 else if (intel_syntax)
db6eb5be
AM
4345 {
4346 if (mod != 0 || (base & 7) == 5)
4347 {
252b5132
RH
4348 if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
4349 | PREFIX_ES | PREFIX_FS | PREFIX_GS))
4350 ;
4351 else
4352 {
d708bcba 4353 oappend (names_seg[ds_reg - es_reg]);
252b5132
RH
4354 oappend (":");
4355 }
52b15da3 4356 print_operand_value (scratchbuf, 1, disp);
db6eb5be
AM
4357 oappend (scratchbuf);
4358 }
4359 }
252b5132
RH
4360 }
4361 else
4362 { /* 16 bit address mode */
4363 switch (mod)
4364 {
4365 case 0:
2888cb7a 4366 if (rm == 6)
252b5132
RH
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)
2888cb7a 4387 if (mod != 0 || rm == 6)
db6eb5be 4388 {
52b15da3 4389 print_operand_value (scratchbuf, 0, disp);
db6eb5be
AM
4390 oappend (scratchbuf);
4391 }
252b5132 4392
2888cb7a 4393 if (mod != 0 || rm != 6)
252b5132
RH
4394 {
4395 *obufp++ = open_char;
db6eb5be 4396 *obufp = '\0';
3d456fa1
JB
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
db6eb5be
AM
4416 *obufp++ = close_char;
4417 *obufp = '\0';
252b5132 4418 }
3d456fa1
JB
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 }
252b5132
RH
4432 }
4433}
4434
252b5132 4435static void
26ca5450 4436OP_G (int bytemode, int sizeflag)
252b5132 4437{
52b15da3
JH
4438 int add = 0;
4439 USED_REX (REX_EXTX);
4440 if (rex & REX_EXTX)
4441 add += 8;
252b5132
RH
4442 switch (bytemode)
4443 {
4444 case b_mode:
52b15da3
JH
4445 USED_REX (0);
4446 if (rex)
4447 oappend (names8rex[reg + add]);
4448 else
4449 oappend (names8[reg + add]);
252b5132
RH
4450 break;
4451 case w_mode:
52b15da3 4452 oappend (names16[reg + add]);
252b5132
RH
4453 break;
4454 case d_mode:
52b15da3
JH
4455 oappend (names32[reg + add]);
4456 break;
4457 case q_mode:
4458 oappend (names64[reg + add]);
252b5132
RH
4459 break;
4460 case v_mode:
9306ca4a
JB
4461 case dq_mode:
4462 case dqw_mode:
52b15da3
JH
4463 USED_REX (REX_MODE64);
4464 if (rex & REX_MODE64)
4465 oappend (names64[reg + add]);
9306ca4a 4466 else if ((sizeflag & DFLAG) || bytemode != v_mode)
52b15da3 4467 oappend (names32[reg + add]);
252b5132 4468 else
52b15da3 4469 oappend (names16[reg + add]);
7d421014 4470 used_prefixes |= (prefixes & PREFIX_DATA);
252b5132 4471 break;
90700ea2 4472 case m_mode:
cb712a9e 4473 if (address_mode == mode_64bit)
90700ea2
L
4474 oappend (names64[reg + add]);
4475 else
4476 oappend (names32[reg + add]);
4477 break;
252b5132
RH
4478 default:
4479 oappend (INTERNAL_DISASSEMBLER_ERROR);
4480 break;
4481 }
4482}
4483
52b15da3 4484static bfd_vma
26ca5450 4485get64 (void)
52b15da3 4486{
5dd0794d 4487 bfd_vma x;
52b15da3 4488#ifdef BFD64
5dd0794d
AM
4489 unsigned int a;
4490 unsigned int b;
4491
52b15da3
JH
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;
5dd0794d 4497 b = *codep++ & 0xff;
52b15da3
JH
4498 b |= (*codep++ & 0xff) << 8;
4499 b |= (*codep++ & 0xff) << 16;
4500 b |= (*codep++ & 0xff) << 24;
4501 x = a + ((bfd_vma) b << 32);
4502#else
6608db57 4503 abort ();
5dd0794d 4504 x = 0;
52b15da3
JH
4505#endif
4506 return x;
4507}
4508
4509static bfd_signed_vma
26ca5450 4510get32 (void)
252b5132 4511{
52b15da3 4512 bfd_signed_vma x = 0;
252b5132
RH
4513
4514 FETCH_DATA (the_info, codep + 4);
52b15da3
JH
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
4522static bfd_signed_vma
26ca5450 4523get32s (void)
52b15da3
JH
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
252b5132
RH
4535 return x;
4536}
4537
4538static int
26ca5450 4539get16 (void)
252b5132
RH
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
4549static void
26ca5450 4550set_op (bfd_vma op, int riprel)
252b5132
RH
4551{
4552 op_index[op_ad] = op_ad;
cb712a9e 4553 if (address_mode == mode_64bit)
7081ff04
AJ
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 }
252b5132
RH
4564}
4565
4566static void
26ca5450 4567OP_REG (int code, int sizeflag)
252b5132 4568{
2da11e11 4569 const char *s;
52b15da3
JH
4570 int add = 0;
4571 USED_REX (REX_EXTZ);
4572 if (rex & REX_EXTZ)
4573 add = 8;
4574
4575 switch (code)
4576 {
52b15da3
JH
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;
6439fc28
AM
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:
cb712a9e 4595 if (address_mode == mode_64bit && (sizeflag & DFLAG))
6439fc28
AM
4596 {
4597 s = names64[code - rAX_reg + add];
4598 break;
4599 }
4600 code += eAX_reg - rAX_reg;
6608db57 4601 /* Fall through. */
52b15da3
JH
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;
52b15da3
JH
4613 default:
4614 s = INTERNAL_DISASSEMBLER_ERROR;
4615 break;
4616 }
4617 oappend (s);
4618}
4619
4620static void
26ca5450 4621OP_IMREG (int code, int sizeflag)
52b15da3
JH
4622{
4623 const char *s;
252b5132
RH
4624
4625 switch (code)
4626 {
4627 case indir_dx_reg:
d708bcba 4628 if (intel_syntax)
52fd6d94 4629 s = "dx";
d708bcba 4630 else
db6eb5be 4631 s = "(%dx)";
252b5132
RH
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:
52b15da3
JH
4643 USED_REX (0);
4644 if (rex)
4645 s = names8rex[code - al_reg];
4646 else
4647 s = names8[code - al_reg];
252b5132
RH
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:
52b15da3
JH
4651 USED_REX (REX_MODE64);
4652 if (rex & REX_MODE64)
4653 s = names64[code - eAX_reg];
4654 else if (sizeflag & DFLAG)
252b5132
RH
4655 s = names32[code - eAX_reg];
4656 else
4657 s = names16[code - eAX_reg];
7d421014 4658 used_prefixes |= (prefixes & PREFIX_DATA);
252b5132 4659 break;
52fd6d94
JB
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;
252b5132
RH
4668 default:
4669 s = INTERNAL_DISASSEMBLER_ERROR;
4670 break;
4671 }
4672 oappend (s);
4673}
4674
4675static void
26ca5450 4676OP_I (int bytemode, int sizeflag)
252b5132 4677{
52b15da3
JH
4678 bfd_signed_vma op;
4679 bfd_signed_vma mask = -1;
252b5132
RH
4680
4681 switch (bytemode)
4682 {
4683 case b_mode:
4684 FETCH_DATA (the_info, codep + 1);
52b15da3
JH
4685 op = *codep++;
4686 mask = 0xff;
4687 break;
4688 case q_mode:
cb712a9e 4689 if (address_mode == mode_64bit)
6439fc28
AM
4690 {
4691 op = get32s ();
4692 break;
4693 }
6608db57 4694 /* Fall through. */
252b5132 4695 case v_mode:
52b15da3
JH
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 }
252b5132 4704 else
52b15da3
JH
4705 {
4706 op = get16 ();
4707 mask = 0xfffff;
4708 }
7d421014 4709 used_prefixes |= (prefixes & PREFIX_DATA);
252b5132
RH
4710 break;
4711 case w_mode:
52b15da3 4712 mask = 0xfffff;
252b5132
RH
4713 op = get16 ();
4714 break;
9306ca4a
JB
4715 case const_1_mode:
4716 if (intel_syntax)
4717 oappend ("1");
4718 return;
252b5132
RH
4719 default:
4720 oappend (INTERNAL_DISASSEMBLER_ERROR);
4721 return;
4722 }
4723
52b15da3
JH
4724 op &= mask;
4725 scratchbuf[0] = '$';
d708bcba
AM
4726 print_operand_value (scratchbuf + 1, 1, op);
4727 oappend (scratchbuf + intel_syntax);
52b15da3
JH
4728 scratchbuf[0] = '\0';
4729}
4730
4731static void
26ca5450 4732OP_I64 (int bytemode, int sizeflag)
52b15da3
JH
4733{
4734 bfd_signed_vma op;
4735 bfd_signed_vma mask = -1;
4736
cb712a9e 4737 if (address_mode != mode_64bit)
6439fc28
AM
4738 {
4739 OP_I (bytemode, sizeflag);
4740 return;
4741 }
4742
52b15da3
JH
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] = '$';
d708bcba
AM
4777 print_operand_value (scratchbuf + 1, 1, op);
4778 oappend (scratchbuf + intel_syntax);
252b5132
RH
4779 scratchbuf[0] = '\0';
4780}
4781
4782static void
26ca5450 4783OP_sI (int bytemode, int sizeflag)
252b5132 4784{
52b15da3
JH
4785 bfd_signed_vma op;
4786 bfd_signed_vma mask = -1;
252b5132
RH
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;
52b15da3 4795 mask = 0xffffffff;
252b5132
RH
4796 break;
4797 case v_mode:
52b15da3
JH
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 }
252b5132
RH
4806 else
4807 {
52b15da3 4808 mask = 0xffffffff;
6608db57 4809 op = get16 ();
252b5132
RH
4810 if ((op & 0x8000) != 0)
4811 op -= 0x10000;
4812 }
7d421014 4813 used_prefixes |= (prefixes & PREFIX_DATA);
252b5132
RH
4814 break;
4815 case w_mode:
4816 op = get16 ();
52b15da3 4817 mask = 0xffffffff;
252b5132
RH
4818 if ((op & 0x8000) != 0)
4819 op -= 0x10000;
4820 break;
4821 default:
4822 oappend (INTERNAL_DISASSEMBLER_ERROR);
4823 return;
4824 }
52b15da3
JH
4825
4826 scratchbuf[0] = '$';
4827 print_operand_value (scratchbuf + 1, 1, op);
d708bcba 4828 oappend (scratchbuf + intel_syntax);
252b5132
RH
4829}
4830
4831static void
26ca5450 4832OP_J (int bytemode, int sizeflag)
252b5132 4833{
52b15da3 4834 bfd_vma disp;
7081ff04 4835 bfd_vma mask = -1;
252b5132
RH
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:
1a114b12 4846 if ((sizeflag & DFLAG) || (rex & REX_MODE64))
52b15da3 4847 disp = get32s ();
252b5132
RH
4848 else
4849 {
4850 disp = get16 ();
6608db57 4851 /* For some reason, a data16 prefix on a jump instruction
252b5132
RH
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;
52b15da3
JH
4862 set_op (disp, 0);
4863 print_operand_value (scratchbuf, 1, disp);
252b5132
RH
4864 oappend (scratchbuf);
4865}
4866
252b5132 4867static void
26ca5450 4868OP_SEG (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 4869{
d708bcba 4870 oappend (names_seg[reg]);
252b5132
RH
4871}
4872
4873static void
26ca5450 4874OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
252b5132
RH
4875{
4876 int seg, offset;
4877
c608c12e 4878 if (sizeflag & DFLAG)
252b5132 4879 {
c608c12e
AM
4880 offset = get32 ();
4881 seg = get16 ();
252b5132 4882 }
c608c12e
AM
4883 else
4884 {
4885 offset = get16 ();
4886 seg = get16 ();
4887 }
7d421014 4888 used_prefixes |= (prefixes & PREFIX_DATA);
d708bcba 4889 if (intel_syntax)
3f31e633 4890 sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
d708bcba
AM
4891 else
4892 sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
c608c12e 4893 oappend (scratchbuf);
252b5132
RH
4894}
4895
252b5132 4896static void
3f31e633 4897OP_OFF (int bytemode, int sizeflag)
252b5132 4898{
52b15da3 4899 bfd_vma off;
252b5132 4900
3f31e633
JB
4901 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
4902 intel_operand_size (bytemode, sizeflag);
252b5132
RH
4903 append_seg ();
4904
cb712a9e 4905 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
252b5132
RH
4906 off = get32 ();
4907 else
4908 off = get16 ();
4909
4910 if (intel_syntax)
4911 {
4912 if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
db6eb5be 4913 | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
252b5132 4914 {
d708bcba 4915 oappend (names_seg[ds_reg - es_reg]);
252b5132
RH
4916 oappend (":");
4917 }
4918 }
52b15da3
JH
4919 print_operand_value (scratchbuf, 1, off);
4920 oappend (scratchbuf);
4921}
6439fc28 4922
52b15da3 4923static void
3f31e633 4924OP_OFF64 (int bytemode, int sizeflag)
52b15da3
JH
4925{
4926 bfd_vma off;
4927
539e75ad
L
4928 if (address_mode != mode_64bit
4929 || (prefixes & PREFIX_ADDR))
6439fc28
AM
4930 {
4931 OP_OFF (bytemode, sizeflag);
4932 return;
4933 }
4934
3f31e633
JB
4935 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
4936 intel_operand_size (bytemode, sizeflag);
52b15da3
JH
4937 append_seg ();
4938
6608db57 4939 off = get64 ();
52b15da3
JH
4940
4941 if (intel_syntax)
4942 {
4943 if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
db6eb5be 4944 | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
52b15da3 4945 {
d708bcba 4946 oappend (names_seg[ds_reg - es_reg]);
52b15da3
JH
4947 oappend (":");
4948 }
4949 }
4950 print_operand_value (scratchbuf, 1, off);
252b5132
RH
4951 oappend (scratchbuf);
4952}
4953
4954static void
26ca5450 4955ptr_reg (int code, int sizeflag)
252b5132 4956{
2da11e11 4957 const char *s;
d708bcba 4958
1d9f512f 4959 *obufp++ = open_char;
20f0a1fc 4960 used_prefixes |= (prefixes & PREFIX_ADDR);
cb712a9e 4961 if (address_mode == mode_64bit)
c1a64871
JH
4962 {
4963 if (!(sizeflag & AFLAG))
db6eb5be 4964 s = names32[code - eAX_reg];
c1a64871 4965 else
db6eb5be 4966 s = names64[code - eAX_reg];
c1a64871 4967 }
52b15da3 4968 else if (sizeflag & AFLAG)
252b5132
RH
4969 s = names32[code - eAX_reg];
4970 else
4971 s = names16[code - eAX_reg];
4972 oappend (s);
1d9f512f
AM
4973 *obufp++ = close_char;
4974 *obufp = 0;
252b5132
RH
4975}
4976
4977static void
26ca5450 4978OP_ESreg (int code, int sizeflag)
252b5132 4979{
9306ca4a 4980 if (intel_syntax)
52fd6d94
JB
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 }
d708bcba 4997 oappend ("%es:" + intel_syntax);
252b5132
RH
4998 ptr_reg (code, sizeflag);
4999}
5000
5001static void
26ca5450 5002OP_DSreg (int code, int sizeflag)
252b5132 5003{
9306ca4a 5004 if (intel_syntax)
52fd6d94
JB
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 }
252b5132
RH
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;
6608db57 5028 append_seg ();
252b5132
RH
5029 ptr_reg (code, sizeflag);
5030}
5031
252b5132 5032static void
26ca5450 5033OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 5034{
52b15da3 5035 int add = 0;
52b15da3 5036 if (rex & REX_EXTX)
c4a530c5
JB
5037 {
5038 USED_REX (REX_EXTX);
5039 add = 8;
5040 }
cb712a9e 5041 else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
c4a530c5
JB
5042 {
5043 used_prefixes |= PREFIX_LOCK;
5044 add = 8;
5045 }
d708bcba
AM
5046 sprintf (scratchbuf, "%%cr%d", reg + add);
5047 oappend (scratchbuf + intel_syntax);
252b5132
RH
5048}
5049
252b5132 5050static void
26ca5450 5051OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 5052{
52b15da3
JH
5053 int add = 0;
5054 USED_REX (REX_EXTX);
5055 if (rex & REX_EXTX)
5056 add = 8;
d708bcba 5057 if (intel_syntax)
6608db57 5058 sprintf (scratchbuf, "db%d", reg + add);
d708bcba 5059 else
6608db57 5060 sprintf (scratchbuf, "%%db%d", reg + add);
252b5132
RH
5061 oappend (scratchbuf);
5062}
5063
252b5132 5064static void
26ca5450 5065OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 5066{
252b5132 5067 sprintf (scratchbuf, "%%tr%d", reg);
d708bcba 5068 oappend (scratchbuf + intel_syntax);
252b5132
RH
5069}
5070
5071static void
26ca5450 5072OP_Rd (int bytemode, int sizeflag)
252b5132 5073{
2da11e11
AM
5074 if (mod == 3)
5075 OP_E (bytemode, sizeflag);
5076 else
6608db57 5077 BadOp ();
252b5132
RH
5078}
5079
5080static void
26ca5450 5081OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132 5082{
041bd2e0
JH
5083 used_prefixes |= (prefixes & PREFIX_DATA);
5084 if (prefixes & PREFIX_DATA)
20f0a1fc
NC
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 }
041bd2e0 5092 else
20f0a1fc 5093 sprintf (scratchbuf, "%%mm%d", reg);
d708bcba 5094 oappend (scratchbuf + intel_syntax);
252b5132
RH
5095}
5096
c608c12e 5097static void
26ca5450 5098OP_XMM (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
c608c12e 5099{
041bd2e0
JH
5100 int add = 0;
5101 USED_REX (REX_EXTX);
5102 if (rex & REX_EXTX)
5103 add = 8;
5104 sprintf (scratchbuf, "%%xmm%d", reg + add);
d708bcba 5105 oappend (scratchbuf + intel_syntax);
c608c12e
AM
5106}
5107
252b5132 5108static void
26ca5450 5109OP_EM (int bytemode, int sizeflag)
252b5132
RH
5110{
5111 if (mod != 3)
5112 {
9306ca4a
JB
5113 if (intel_syntax && bytemode == v_mode)
5114 {
5115 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
5116 used_prefixes |= (prefixes & PREFIX_DATA);
5117 }
252b5132
RH
5118 OP_E (bytemode, sizeflag);
5119 return;
5120 }
5121
6608db57 5122 /* Skip mod/rm byte. */
4bba6815 5123 MODRM_CHECK;
252b5132 5124 codep++;
041bd2e0
JH
5125 used_prefixes |= (prefixes & PREFIX_DATA);
5126 if (prefixes & PREFIX_DATA)
20f0a1fc
NC
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 }
041bd2e0 5135 else
20f0a1fc 5136 sprintf (scratchbuf, "%%mm%d", rm);
d708bcba 5137 oappend (scratchbuf + intel_syntax);
252b5132
RH
5138}
5139
4d9567e0
MM
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 */
5145static void
5146OP_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
5167static void
5168OP_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
c608c12e 5175static void
26ca5450 5176OP_EX (int bytemode, int sizeflag)
c608c12e 5177{
041bd2e0 5178 int add = 0;
c608c12e
AM
5179 if (mod != 3)
5180 {
9306ca4a
JB
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 }
c608c12e
AM
5192 OP_E (bytemode, sizeflag);
5193 return;
5194 }
041bd2e0
JH
5195 USED_REX (REX_EXTZ);
5196 if (rex & REX_EXTZ)
5197 add = 8;
c608c12e 5198
6608db57 5199 /* Skip mod/rm byte. */
4bba6815 5200 MODRM_CHECK;
c608c12e 5201 codep++;
041bd2e0 5202 sprintf (scratchbuf, "%%xmm%d", rm + add);
d708bcba 5203 oappend (scratchbuf + intel_syntax);
c608c12e
AM
5204}
5205
252b5132 5206static void
26ca5450 5207OP_MS (int bytemode, int sizeflag)
252b5132 5208{
2da11e11
AM
5209 if (mod == 3)
5210 OP_EM (bytemode, sizeflag);
5211 else
6608db57 5212 BadOp ();
252b5132
RH
5213}
5214
992aaec9 5215static void
26ca5450 5216OP_XS (int bytemode, int sizeflag)
992aaec9
AM
5217{
5218 if (mod == 3)
5219 OP_EX (bytemode, sizeflag);
5220 else
6608db57 5221 BadOp ();
992aaec9
AM
5222}
5223
cc0ec051
AM
5224static void
5225OP_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
5233static void
5234OP_0f07 (int bytemode, int sizeflag)
5235{
5236 if (mod != 3 || rm != 0)
5237 BadOp ();
5238 else
5239 OP_E (bytemode, sizeflag);
5240}
5241
5242static void
5243OP_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
46e883c5
L
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
cc0ec051 5270static void
46e883c5 5271NOP_Fixup1 (int bytemode, int sizeflag)
cc0ec051 5272{
cc0ec051
AM
5273 if (prefixes == PREFIX_REPZ)
5274 strcpy (obuf, "pause");
46e883c5
L
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
5282static void
5283NOP_Fixup2 (int bytemode, int sizeflag)
5284{
5285 if (prefixes == PREFIX_DATA
5286 || ((rex & REX_MODE64) && rex != 0x48))
5287 OP_IMREG (bytemode, sizeflag);
cc0ec051
AM
5288}
5289
84037f8c 5290static const char *const Suffix3DNow[] = {
252b5132
RH
5291/* 00 */ NULL, NULL, NULL, NULL,
5292/* 04 */ NULL, NULL, NULL, NULL,
5293/* 08 */ NULL, NULL, NULL, NULL,
9e525108 5294/* 0C */ "pi2fw", "pi2fd", NULL, NULL,
252b5132
RH
5295/* 10 */ NULL, NULL, NULL, NULL,
5296/* 14 */ NULL, NULL, NULL, NULL,
5297/* 18 */ NULL, NULL, NULL, NULL,
9e525108 5298/* 1C */ "pf2iw", "pf2id", NULL, NULL,
252b5132
RH
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,
9e525108
AM
5325/* 88 */ NULL, NULL, "pfnacc", NULL,
5326/* 8C */ NULL, NULL, "pfpnacc", NULL,
252b5132
RH
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",
9e525108 5337/* B8 */ NULL, NULL, NULL, "pswapd",
252b5132
RH
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
5357static void
26ca5450 5358OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
252b5132
RH
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. */
6608db57 5366 obufp = obuf + strlen (obuf);
c608c12e 5367 mnemonic = Suffix3DNow[*codep++ & 0xff];
252b5132 5368 if (mnemonic)
2da11e11 5369 oappend (mnemonic);
252b5132
RH
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. */
2da11e11
AM
5376 op1out[0] = '\0';
5377 op2out[0] = '\0';
6608db57 5378 BadOp ();
252b5132
RH
5379 }
5380}
c608c12e 5381
6608db57 5382static const char *simd_cmp_op[] = {
c608c12e
AM
5383 "eq",
5384 "lt",
5385 "le",
5386 "unord",
5387 "neq",
5388 "nlt",
5389 "nle",
5390 "ord"
5391};
5392
5393static void
26ca5450 5394OP_SIMD_Suffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
c608c12e
AM
5395{
5396 unsigned int cmp_type;
5397
5398 FETCH_DATA (the_info, codep + 1);
6608db57 5399 obufp = obuf + strlen (obuf);
c608c12e
AM
5400 cmp_type = *codep++ & 0xff;
5401 if (cmp_type < 8)
5402 {
041bd2e0
JH
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);
7d421014 5421 used_prefixes |= (prefixes & PREFIX_REPZ);
2da11e11 5422 oappend (scratchbuf);
c608c12e
AM
5423 }
5424 else
5425 {
5426 /* We have a bad extension byte. Clean up. */
2da11e11
AM
5427 op1out[0] = '\0';
5428 op2out[0] = '\0';
6608db57 5429 BadOp ();
c608c12e
AM
5430 }
5431}
5432
5433static void
26ca5450 5434SIMD_Fixup (int extrachar, int sizeflag ATTRIBUTE_UNUSED)
c608c12e
AM
5435{
5436 /* Change movlps/movhps to movhlps/movlhps for 2 register operand
5437 forms of these instructions. */
5438 if (mod == 3)
5439 {
6608db57
KH
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;
c608c12e
AM
5446 }
5447}
2da11e11 5448
ca164297 5449static void
4fd61dcb 5450PNI_Fixup (int extrachar ATTRIBUTE_UNUSED, int sizeflag)
ca164297 5451{
1d9f512f 5452 if (mod == 3 && reg == 1 && rm <= 1)
ca164297 5453 {
ca164297 5454 /* Override "sidt". */
cb712a9e
L
5455 size_t olen = strlen (obuf);
5456 char *p = obuf + olen - 4;
5457 const char **names = (address_mode == mode_64bit
5458 ? names64 : names32);
1d9f512f 5459
22cbf2e7 5460 /* We might have a suffix when disassembling with -Msuffix. */
1d9f512f
AM
5461 if (*p == 'i')
5462 --p;
5463
cb712a9e
L
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) == ' '
0112cd26
NC
5469 && CONST_STRNEQ (p - 7, "addr")
5470 && (CONST_STRNEQ (p - 3, "16")
5471 || CONST_STRNEQ (p - 3, "32")))
cb712a9e
L
5472 p -= 7;
5473
ca164297
L
5474 if (rm)
5475 {
5476 /* mwait %eax,%ecx */
1d9f512f 5477 strcpy (p, "mwait");
6128c599 5478 if (!intel_syntax)
cb712a9e 5479 strcpy (op1out, names[0]);
ca164297
L
5480 }
5481 else
5482 {
5483 /* monitor %eax,%ecx,%edx" */
1d9f512f 5484 strcpy (p, "monitor");
6128c599
JB
5485 if (!intel_syntax)
5486 {
cb712a9e
L
5487 const char **op1_names;
5488 if (!(prefixes & PREFIX_ADDR))
5489 op1_names = (address_mode == mode_16bit
5490 ? names16 : names);
6128c599
JB
5491 else
5492 {
cb712a9e
L
5493 op1_names = (address_mode != mode_32bit
5494 ? names32 : names16);
6128c599
JB
5495 used_prefixes |= PREFIX_ADDR;
5496 }
cb712a9e
L
5497 strcpy (op1out, op1_names[0]);
5498 strcpy (op3out, names[2]);
6128c599
JB
5499 }
5500 }
5501 if (!intel_syntax)
5502 {
cb712a9e 5503 strcpy (op2out, names[1]);
6128c599 5504 two_source_ops = 1;
ca164297
L
5505 }
5506
5507 codep++;
5508 }
5509 else
30123838
JB
5510 OP_M (0, sizeflag);
5511}
5512
5513static void
5514SVME_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;
cb712a9e 5571 if (address_mode == mode_64bit || (sizeflag & AFLAG))
30123838
JB
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 }
ca164297
L
5581}
5582
4fd61dcb
JJ
5583static void
5584INVLPG_Fixup (int bytemode, int sizeflag)
5585{
373ff435 5586 const char *alt;
4fd61dcb 5587
373ff435
JB
5588 switch (*codep)
5589 {
5590 case 0xf8:
5591 alt = "swapgs";
5592 break;
5593 case 0xf9:
5594 alt = "rdtscp";
5595 break;
5596 default:
30123838 5597 OP_M (bytemode, sizeflag);
373ff435 5598 return;
4fd61dcb 5599 }
373ff435
JB
5600 /* Override "invlpg". */
5601 strcpy (obuf + strlen (obuf) - 6, alt);
5602 codep++;
4fd61dcb
JJ
5603}
5604
6608db57
KH
5605static void
5606BadOp (void)
2da11e11 5607{
6608db57
KH
5608 /* Throw away prefixes and 1st. opcode byte. */
5609 codep = insn_codep + 1;
2da11e11
AM
5610 oappend ("(bad)");
5611}
4cc91dba
L
5612
5613static void
5614SEG_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}
90700ea2
L
5661
5662static void
5663VMX_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
22cbf2e7
L
5670 /* We might have a suffix when disassembling with -Msuffix. */
5671 if (*p == 'g')
90700ea2
L
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
5696static void
5697OP_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}
35c52694
L
5708
5709static void
5710REP_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}
This page took 0.698981 seconds and 4 git commands to generate.