Statistics
| Branch: | Revision:

root / i386-dis.c @ 2ac71179

History | View | Annotate | Download (159.2 kB)

1 88103cfe blueswir1
/* opcodes/i386-dis.c r1.126 */
2 dc99065b bellard
/* Print i386 instructions for GDB, the GNU debugger.
3 bc51c5c9 bellard
   Copyright 1988, 1989, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4 88103cfe blueswir1
   2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
5 dc99065b bellard

6 c2c73b42 blueswir1
   This file is part of GDB.
7 dc99065b bellard

8 c2c73b42 blueswir1
   This program is free software; you can redistribute it and/or modify
9 c2c73b42 blueswir1
   it under the terms of the GNU General Public License as published by
10 c2c73b42 blueswir1
   the Free Software Foundation; either version 2 of the License, or
11 c2c73b42 blueswir1
   (at your option) any later version.
12 dc99065b bellard

13 c2c73b42 blueswir1
   This program is distributed in the hope that it will be useful,
14 c2c73b42 blueswir1
   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 c2c73b42 blueswir1
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 c2c73b42 blueswir1
   GNU General Public License for more details.
17 dc99065b bellard

18 c2c73b42 blueswir1
   You should have received a copy of the GNU General Public License
19 c2c73b42 blueswir1
   along with this program; if not, write to the Free Software
20 c2c73b42 blueswir1
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
21 dc99065b bellard
22 c2c73b42 blueswir1
/* 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu)
23 c2c73b42 blueswir1
   July 1988
24 c2c73b42 blueswir1
    modified by John Hassey (hassey@dg-rtp.dg.com)
25 c2c73b42 blueswir1
    x86-64 support added by Jan Hubicka (jh@suse.cz)
26 c2c73b42 blueswir1
    VIA PadLock support by Michal Ludvig (mludvig@suse.cz).  */
27 dc99065b bellard
28 c2c73b42 blueswir1
/* The main tables describing the instructions is essentially a copy
29 c2c73b42 blueswir1
   of the "Opcode Map" chapter (Appendix A) of the Intel 80386
30 c2c73b42 blueswir1
   Programmers Manual.  Usually, there is a capital letter, followed
31 c2c73b42 blueswir1
   by a small letter.  The capital letter tell the addressing mode,
32 c2c73b42 blueswir1
   and the small letter tells about the operand size.  Refer to
33 c2c73b42 blueswir1
   the Intel manual for details.  */
34 dc99065b bellard
35 bb0ebb1f bellard
#include <stdlib.h>
36 dc99065b bellard
#include "dis-asm.h"
37 88103cfe blueswir1
/* include/opcode/i386.h r1.78 */
38 dc99065b bellard
39 88103cfe blueswir1
/* opcode/i386.h -- Intel 80386 opcode macros
40 88103cfe blueswir1
   Copyright 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
41 88103cfe blueswir1
   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
42 88103cfe blueswir1
   Free Software Foundation, Inc.
43 dc99065b bellard

44 88103cfe blueswir1
   This file is part of GAS, the GNU Assembler, and GDB, the GNU Debugger.
45 88103cfe blueswir1

46 88103cfe blueswir1
   This program is free software; you can redistribute it and/or modify
47 88103cfe blueswir1
   it under the terms of the GNU General Public License as published by
48 88103cfe blueswir1
   the Free Software Foundation; either version 2 of the License, or
49 88103cfe blueswir1
   (at your option) any later version.
50 88103cfe blueswir1

51 88103cfe blueswir1
   This program is distributed in the hope that it will be useful,
52 88103cfe blueswir1
   but WITHOUT ANY WARRANTY; without even the implied warranty of
53 88103cfe blueswir1
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
54 88103cfe blueswir1
   GNU General Public License for more details.
55 bc51c5c9 bellard

56 88103cfe blueswir1
   You should have received a copy of the GNU General Public License
57 88103cfe blueswir1
   along with this program; if not, write to the Free Software
58 88103cfe blueswir1
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
59 88103cfe blueswir1
60 88103cfe blueswir1
/* The SystemV/386 SVR3.2 assembler, and probably all AT&T derived
61 88103cfe blueswir1
   ix86 Unix assemblers, generate floating point instructions with
62 88103cfe blueswir1
   reversed source and destination registers in certain cases.
63 88103cfe blueswir1
   Unfortunately, gcc and possibly many other programs use this
64 88103cfe blueswir1
   reversed syntax, so we're stuck with it.
65 88103cfe blueswir1

66 88103cfe blueswir1
   eg. `fsub %st(3),%st' results in st = st - st(3) as expected, but
67 88103cfe blueswir1
   `fsub %st,%st(3)' results in st(3) = st - st(3), rather than
68 88103cfe blueswir1
   the expected st(3) = st(3) - st
69 88103cfe blueswir1

70 88103cfe blueswir1
   This happens with all the non-commutative arithmetic floating point
71 88103cfe blueswir1
   operations with two register operands, where the source register is
72 88103cfe blueswir1
   %st, and destination register is %st(i).
73 88103cfe blueswir1

74 88103cfe blueswir1
   The affected opcode map is dceX, dcfX, deeX, defX.  */
75 88103cfe blueswir1
76 88103cfe blueswir1
#ifndef SYSV386_COMPAT
77 bc51c5c9 bellard
/* Set non-zero for broken, compatible instructions.  Set to zero for
78 88103cfe blueswir1
   non-broken opcodes at your peril.  gcc generates SystemV/386
79 88103cfe blueswir1
   compatible instructions.  */
80 88103cfe blueswir1
#define SYSV386_COMPAT 1
81 88103cfe blueswir1
#endif
82 88103cfe blueswir1
#ifndef OLDGCC_COMPAT
83 88103cfe blueswir1
/* Set non-zero to cater for old (<= 2.8.1) versions of gcc that could
84 88103cfe blueswir1
   generate nonsense fsubp, fsubrp, fdivp and fdivrp with operands
85 88103cfe blueswir1
   reversed.  */
86 88103cfe blueswir1
#define OLDGCC_COMPAT SYSV386_COMPAT
87 bc51c5c9 bellard
#endif
88 bc51c5c9 bellard
89 88103cfe blueswir1
#define MOV_AX_DISP32 0xa0
90 88103cfe blueswir1
#define POP_SEG_SHORT 0x07
91 88103cfe blueswir1
#define JUMP_PC_RELATIVE 0xeb
92 88103cfe blueswir1
#define INT_OPCODE  0xcd
93 88103cfe blueswir1
#define INT3_OPCODE 0xcc
94 88103cfe blueswir1
/* The opcode for the fwait instruction, which disassembler treats as a
95 88103cfe blueswir1
   prefix when it can.  */
96 88103cfe blueswir1
#define FWAIT_OPCODE 0x9b
97 88103cfe blueswir1
#define ADDR_PREFIX_OPCODE 0x67
98 88103cfe blueswir1
#define DATA_PREFIX_OPCODE 0x66
99 88103cfe blueswir1
#define LOCK_PREFIX_OPCODE 0xf0
100 88103cfe blueswir1
#define CS_PREFIX_OPCODE 0x2e
101 88103cfe blueswir1
#define DS_PREFIX_OPCODE 0x3e
102 88103cfe blueswir1
#define ES_PREFIX_OPCODE 0x26
103 88103cfe blueswir1
#define FS_PREFIX_OPCODE 0x64
104 88103cfe blueswir1
#define GS_PREFIX_OPCODE 0x65
105 88103cfe blueswir1
#define SS_PREFIX_OPCODE 0x36
106 88103cfe blueswir1
#define REPNE_PREFIX_OPCODE 0xf2
107 88103cfe blueswir1
#define REPE_PREFIX_OPCODE  0xf3
108 88103cfe blueswir1
109 88103cfe blueswir1
#define TWO_BYTE_OPCODE_ESCAPE 0x0f
110 88103cfe blueswir1
#define NOP_OPCODE (char) 0x90
111 88103cfe blueswir1
112 88103cfe blueswir1
/* register numbers */
113 88103cfe blueswir1
#define EBP_REG_NUM 5
114 88103cfe blueswir1
#define ESP_REG_NUM 4
115 88103cfe blueswir1
116 88103cfe blueswir1
/* modrm_byte.regmem for twobyte escape */
117 88103cfe blueswir1
#define ESCAPE_TO_TWO_BYTE_ADDRESSING ESP_REG_NUM
118 88103cfe blueswir1
/* index_base_byte.index for no index register addressing */
119 88103cfe blueswir1
#define NO_INDEX_REGISTER ESP_REG_NUM
120 88103cfe blueswir1
/* index_base_byte.base for no base register addressing */
121 88103cfe blueswir1
#define NO_BASE_REGISTER EBP_REG_NUM
122 88103cfe blueswir1
#define NO_BASE_REGISTER_16 6
123 88103cfe blueswir1
124 88103cfe blueswir1
/* modrm.mode = REGMEM_FIELD_HAS_REG when a register is in there */
125 88103cfe blueswir1
#define REGMEM_FIELD_HAS_REG 0x3/* always = 0x3 */
126 88103cfe blueswir1
#define REGMEM_FIELD_HAS_MEM (~REGMEM_FIELD_HAS_REG)
127 88103cfe blueswir1
128 88103cfe blueswir1
/* x86-64 extension prefix.  */
129 88103cfe blueswir1
#define REX_OPCODE        0x40
130 88103cfe blueswir1
131 88103cfe blueswir1
/* Indicates 64 bit operand size.  */
132 88103cfe blueswir1
#define REX_W        8
133 88103cfe blueswir1
/* High extension to reg field of modrm byte.  */
134 88103cfe blueswir1
#define REX_R        4
135 88103cfe blueswir1
/* High extension to SIB index field.  */
136 88103cfe blueswir1
#define REX_X        2
137 88103cfe blueswir1
/* High extension to base field of modrm or SIB, or reg field of opcode.  */
138 88103cfe blueswir1
#define REX_B        1
139 88103cfe blueswir1
140 88103cfe blueswir1
/* max operands per insn */
141 88103cfe blueswir1
#define MAX_OPERANDS 4
142 88103cfe blueswir1
143 88103cfe blueswir1
/* max immediates per insn (lcall, ljmp, insertq, extrq) */
144 88103cfe blueswir1
#define MAX_IMMEDIATE_OPERANDS 2
145 88103cfe blueswir1
146 88103cfe blueswir1
/* max memory refs per insn (string ops) */
147 88103cfe blueswir1
#define MAX_MEMORY_OPERANDS 2
148 88103cfe blueswir1
149 88103cfe blueswir1
/* max size of insn mnemonics.  */
150 88103cfe blueswir1
#define MAX_MNEM_SIZE 16
151 88103cfe blueswir1
152 88103cfe blueswir1
/* max size of register name in insn mnemonics.  */
153 88103cfe blueswir1
#define MAX_REG_NAME_SIZE 8
154 88103cfe blueswir1
155 88103cfe blueswir1
/* opcodes/i386-dis.c r1.126 */
156 88103cfe blueswir1
#include "qemu-common.h"
157 88103cfe blueswir1
158 88103cfe blueswir1
#include <setjmp.h>
159 88103cfe blueswir1
160 c2c73b42 blueswir1
static int fetch_data (struct disassemble_info *, bfd_byte *);
161 c2c73b42 blueswir1
static void ckprefix (void);
162 c2c73b42 blueswir1
static const char *prefix_name (int, int);
163 c2c73b42 blueswir1
static int print_insn (bfd_vma, disassemble_info *);
164 c2c73b42 blueswir1
static void dofloat (int);
165 c2c73b42 blueswir1
static void OP_ST (int, int);
166 c2c73b42 blueswir1
static void OP_STi (int, int);
167 c2c73b42 blueswir1
static int putop (const char *, int);
168 c2c73b42 blueswir1
static void oappend (const char *);
169 c2c73b42 blueswir1
static void append_seg (void);
170 c2c73b42 blueswir1
static void OP_indirE (int, int);
171 c2c73b42 blueswir1
static void print_operand_value (char *buf, size_t bufsize, int hex, bfd_vma disp);
172 88103cfe blueswir1
static void print_displacement (char *, bfd_vma);
173 c2c73b42 blueswir1
static void OP_E (int, int);
174 c2c73b42 blueswir1
static void OP_G (int, int);
175 c2c73b42 blueswir1
static bfd_vma get64 (void);
176 c2c73b42 blueswir1
static bfd_signed_vma get32 (void);
177 c2c73b42 blueswir1
static bfd_signed_vma get32s (void);
178 c2c73b42 blueswir1
static int get16 (void);
179 c2c73b42 blueswir1
static void set_op (bfd_vma, int);
180 c2c73b42 blueswir1
static void OP_REG (int, int);
181 c2c73b42 blueswir1
static void OP_IMREG (int, int);
182 c2c73b42 blueswir1
static void OP_I (int, int);
183 c2c73b42 blueswir1
static void OP_I64 (int, int);
184 c2c73b42 blueswir1
static void OP_sI (int, int);
185 c2c73b42 blueswir1
static void OP_J (int, int);
186 c2c73b42 blueswir1
static void OP_SEG (int, int);
187 c2c73b42 blueswir1
static void OP_DIR (int, int);
188 c2c73b42 blueswir1
static void OP_OFF (int, int);
189 c2c73b42 blueswir1
static void OP_OFF64 (int, int);
190 c2c73b42 blueswir1
static void ptr_reg (int, int);
191 c2c73b42 blueswir1
static void OP_ESreg (int, int);
192 c2c73b42 blueswir1
static void OP_DSreg (int, int);
193 c2c73b42 blueswir1
static void OP_C (int, int);
194 c2c73b42 blueswir1
static void OP_D (int, int);
195 c2c73b42 blueswir1
static void OP_T (int, int);
196 88103cfe blueswir1
static void OP_R (int, int);
197 c2c73b42 blueswir1
static void OP_MMX (int, int);
198 c2c73b42 blueswir1
static void OP_XMM (int, int);
199 c2c73b42 blueswir1
static void OP_EM (int, int);
200 c2c73b42 blueswir1
static void OP_EX (int, int);
201 88103cfe blueswir1
static void OP_EMC (int,int);
202 88103cfe blueswir1
static void OP_MXC (int,int);
203 c2c73b42 blueswir1
static void OP_MS (int, int);
204 c2c73b42 blueswir1
static void OP_XS (int, int);
205 c2c73b42 blueswir1
static void OP_M (int, int);
206 c2c73b42 blueswir1
static void OP_VMX (int, int);
207 c2c73b42 blueswir1
static void OP_0fae (int, int);
208 c2c73b42 blueswir1
static void OP_0f07 (int, int);
209 88103cfe blueswir1
static void NOP_Fixup1 (int, int);
210 88103cfe blueswir1
static void NOP_Fixup2 (int, int);
211 c2c73b42 blueswir1
static void OP_3DNowSuffix (int, int);
212 c2c73b42 blueswir1
static void OP_SIMD_Suffix (int, int);
213 c2c73b42 blueswir1
static void SIMD_Fixup (int, int);
214 c2c73b42 blueswir1
static void PNI_Fixup (int, int);
215 c2c73b42 blueswir1
static void SVME_Fixup (int, int);
216 c2c73b42 blueswir1
static void INVLPG_Fixup (int, int);
217 c2c73b42 blueswir1
static void BadOp (void);
218 c2c73b42 blueswir1
static void VMX_Fixup (int, int);
219 c2c73b42 blueswir1
static void REP_Fixup (int, int);
220 88103cfe blueswir1
static void CMPXCHG8B_Fixup (int, int);
221 88103cfe blueswir1
static void XMM_Fixup (int, int);
222 88103cfe blueswir1
static void CRC32_Fixup (int, int);
223 dc99065b bellard
224 bc51c5c9 bellard
struct dis_private {
225 dc99065b bellard
  /* Points to first byte not fetched.  */
226 dc99065b bellard
  bfd_byte *max_fetched;
227 88103cfe blueswir1
  bfd_byte the_buffer[MAX_MNEM_SIZE];
228 dc99065b bellard
  bfd_vma insn_start;
229 bc51c5c9 bellard
  int orig_sizeflag;
230 dc99065b bellard
  jmp_buf bailout;
231 dc99065b bellard
};
232 dc99065b bellard
233 c2c73b42 blueswir1
enum address_mode
234 c2c73b42 blueswir1
{
235 c2c73b42 blueswir1
  mode_16bit,
236 c2c73b42 blueswir1
  mode_32bit,
237 c2c73b42 blueswir1
  mode_64bit
238 c2c73b42 blueswir1
};
239 c2c73b42 blueswir1
240 c2c73b42 blueswir1
static enum address_mode address_mode;
241 bc51c5c9 bellard
242 bc51c5c9 bellard
/* Flags for the prefixes for the current instruction.  See below.  */
243 bc51c5c9 bellard
static int prefixes;
244 bc51c5c9 bellard
245 bc51c5c9 bellard
/* REX prefix the current instruction.  See below.  */
246 bc51c5c9 bellard
static int rex;
247 bc51c5c9 bellard
/* Bits of REX we've already used.  */
248 bc51c5c9 bellard
static int rex_used;
249 bc51c5c9 bellard
/* Mark parts used in the REX prefix.  When we are testing for
250 bc51c5c9 bellard
   empty prefix (for 8bit register REX extension), just mask it
251 bc51c5c9 bellard
   out.  Otherwise test for REX bit is excuse for existence of REX
252 bc51c5c9 bellard
   only in case value is nonzero.  */
253 bc51c5c9 bellard
#define USED_REX(value)                                        \
254 bc51c5c9 bellard
  {                                                        \
255 bc51c5c9 bellard
    if (value)                                                \
256 88103cfe blueswir1
      {                                                        \
257 88103cfe blueswir1
        if ((rex & value))                                \
258 88103cfe blueswir1
          rex_used |= (value) | REX_OPCODE;                \
259 88103cfe blueswir1
      }                                                        \
260 bc51c5c9 bellard
    else                                                \
261 88103cfe blueswir1
      rex_used |= REX_OPCODE;                                \
262 bc51c5c9 bellard
  }
263 bc51c5c9 bellard
264 bc51c5c9 bellard
/* Flags for prefixes which we somehow handled when printing the
265 bc51c5c9 bellard
   current instruction.  */
266 bc51c5c9 bellard
static int used_prefixes;
267 bc51c5c9 bellard
268 bc51c5c9 bellard
/* Flags stored in PREFIXES.  */
269 bc51c5c9 bellard
#define PREFIX_REPZ 1
270 bc51c5c9 bellard
#define PREFIX_REPNZ 2
271 bc51c5c9 bellard
#define PREFIX_LOCK 4
272 bc51c5c9 bellard
#define PREFIX_CS 8
273 bc51c5c9 bellard
#define PREFIX_SS 0x10
274 bc51c5c9 bellard
#define PREFIX_DS 0x20
275 bc51c5c9 bellard
#define PREFIX_ES 0x40
276 bc51c5c9 bellard
#define PREFIX_FS 0x80
277 bc51c5c9 bellard
#define PREFIX_GS 0x100
278 bc51c5c9 bellard
#define PREFIX_DATA 0x200
279 bc51c5c9 bellard
#define PREFIX_ADDR 0x400
280 bc51c5c9 bellard
#define PREFIX_FWAIT 0x800
281 bc51c5c9 bellard
282 dc99065b bellard
/* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
283 dc99065b bellard
   to ADDR (exclusive) are valid.  Returns 1 for success, longjmps
284 dc99065b bellard
   on error.  */
285 dc99065b bellard
#define FETCH_DATA(info, addr) \
286 bc51c5c9 bellard
  ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
287 dc99065b bellard
   ? 1 : fetch_data ((info), (addr)))
288 dc99065b bellard
289 dc99065b bellard
static int
290 c2c73b42 blueswir1
fetch_data (struct disassemble_info *info, bfd_byte *addr)
291 dc99065b bellard
{
292 dc99065b bellard
  int status;
293 bc51c5c9 bellard
  struct dis_private *priv = (struct dis_private *) info->private_data;
294 dc99065b bellard
  bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
295 dc99065b bellard
296 88103cfe blueswir1
  if (addr <= priv->the_buffer + MAX_MNEM_SIZE)
297 c2c73b42 blueswir1
    status = (*info->read_memory_func) (start,
298 c2c73b42 blueswir1
                                        priv->max_fetched,
299 c2c73b42 blueswir1
                                        addr - priv->max_fetched,
300 c2c73b42 blueswir1
                                        info);
301 c2c73b42 blueswir1
  else
302 c2c73b42 blueswir1
    status = -1;
303 dc99065b bellard
  if (status != 0)
304 dc99065b bellard
    {
305 bc51c5c9 bellard
      /* If we did manage to read at least one byte, then
306 c2c73b42 blueswir1
         print_insn_i386 will do something sensible.  Otherwise, print
307 c2c73b42 blueswir1
         an error.  We do that here because this is where we know
308 c2c73b42 blueswir1
         STATUS.  */
309 bc51c5c9 bellard
      if (priv->max_fetched == priv->the_buffer)
310 bc51c5c9 bellard
        (*info->memory_error_func) (status, start, info);
311 dc99065b bellard
      longjmp (priv->bailout, 1);
312 dc99065b bellard
    }
313 dc99065b bellard
  else
314 dc99065b bellard
    priv->max_fetched = addr;
315 dc99065b bellard
  return 1;
316 dc99065b bellard
}
317 dc99065b bellard
318 88103cfe blueswir1
#define XX { NULL, 0 }
319 88103cfe blueswir1
320 88103cfe blueswir1
#define Eb { OP_E, b_mode }
321 88103cfe blueswir1
#define Ev { OP_E, v_mode }
322 88103cfe blueswir1
#define Ed { OP_E, d_mode }
323 88103cfe blueswir1
#define Edq { OP_E, dq_mode }
324 88103cfe blueswir1
#define Edqw { OP_E, dqw_mode }
325 88103cfe blueswir1
#define Edqb { OP_E, dqb_mode }
326 88103cfe blueswir1
#define Edqd { OP_E, dqd_mode }
327 88103cfe blueswir1
#define indirEv { OP_indirE, stack_v_mode }
328 88103cfe blueswir1
#define indirEp { OP_indirE, f_mode }
329 88103cfe blueswir1
#define stackEv { OP_E, stack_v_mode }
330 88103cfe blueswir1
#define Em { OP_E, m_mode }
331 88103cfe blueswir1
#define Ew { OP_E, w_mode }
332 88103cfe blueswir1
#define M { OP_M, 0 }                /* lea, lgdt, etc. */
333 88103cfe blueswir1
#define Ma { OP_M, v_mode }
334 88103cfe blueswir1
#define Mp { OP_M, f_mode }                /* 32 or 48 bit memory operand for LDS, LES etc */
335 88103cfe blueswir1
#define Mq { OP_M, q_mode }
336 88103cfe blueswir1
#define Gb { OP_G, b_mode }
337 88103cfe blueswir1
#define Gv { OP_G, v_mode }
338 88103cfe blueswir1
#define Gd { OP_G, d_mode }
339 88103cfe blueswir1
#define Gdq { OP_G, dq_mode }
340 88103cfe blueswir1
#define Gm { OP_G, m_mode }
341 88103cfe blueswir1
#define Gw { OP_G, w_mode }
342 88103cfe blueswir1
#define Rd { OP_R, d_mode }
343 88103cfe blueswir1
#define Rm { OP_R, m_mode }
344 88103cfe blueswir1
#define Ib { OP_I, b_mode }
345 88103cfe blueswir1
#define sIb { OP_sI, b_mode }        /* sign extened byte */
346 88103cfe blueswir1
#define Iv { OP_I, v_mode }
347 88103cfe blueswir1
#define Iq { OP_I, q_mode }
348 88103cfe blueswir1
#define Iv64 { OP_I64, v_mode }
349 88103cfe blueswir1
#define Iw { OP_I, w_mode }
350 88103cfe blueswir1
#define I1 { OP_I, const_1_mode }
351 88103cfe blueswir1
#define Jb { OP_J, b_mode }
352 88103cfe blueswir1
#define Jv { OP_J, v_mode }
353 88103cfe blueswir1
#define Cm { OP_C, m_mode }
354 88103cfe blueswir1
#define Dm { OP_D, m_mode }
355 88103cfe blueswir1
#define Td { OP_T, d_mode }
356 88103cfe blueswir1
357 88103cfe blueswir1
#define RMeAX { OP_REG, eAX_reg }
358 88103cfe blueswir1
#define RMeBX { OP_REG, eBX_reg }
359 88103cfe blueswir1
#define RMeCX { OP_REG, eCX_reg }
360 88103cfe blueswir1
#define RMeDX { OP_REG, eDX_reg }
361 88103cfe blueswir1
#define RMeSP { OP_REG, eSP_reg }
362 88103cfe blueswir1
#define RMeBP { OP_REG, eBP_reg }
363 88103cfe blueswir1
#define RMeSI { OP_REG, eSI_reg }
364 88103cfe blueswir1
#define RMeDI { OP_REG, eDI_reg }
365 88103cfe blueswir1
#define RMrAX { OP_REG, rAX_reg }
366 88103cfe blueswir1
#define RMrBX { OP_REG, rBX_reg }
367 88103cfe blueswir1
#define RMrCX { OP_REG, rCX_reg }
368 88103cfe blueswir1
#define RMrDX { OP_REG, rDX_reg }
369 88103cfe blueswir1
#define RMrSP { OP_REG, rSP_reg }
370 88103cfe blueswir1
#define RMrBP { OP_REG, rBP_reg }
371 88103cfe blueswir1
#define RMrSI { OP_REG, rSI_reg }
372 88103cfe blueswir1
#define RMrDI { OP_REG, rDI_reg }
373 88103cfe blueswir1
#define RMAL { OP_REG, al_reg }
374 88103cfe blueswir1
#define RMAL { OP_REG, al_reg }
375 88103cfe blueswir1
#define RMCL { OP_REG, cl_reg }
376 88103cfe blueswir1
#define RMDL { OP_REG, dl_reg }
377 88103cfe blueswir1
#define RMBL { OP_REG, bl_reg }
378 88103cfe blueswir1
#define RMAH { OP_REG, ah_reg }
379 88103cfe blueswir1
#define RMCH { OP_REG, ch_reg }
380 88103cfe blueswir1
#define RMDH { OP_REG, dh_reg }
381 88103cfe blueswir1
#define RMBH { OP_REG, bh_reg }
382 88103cfe blueswir1
#define RMAX { OP_REG, ax_reg }
383 88103cfe blueswir1
#define RMDX { OP_REG, dx_reg }
384 88103cfe blueswir1
385 88103cfe blueswir1
#define eAX { OP_IMREG, eAX_reg }
386 88103cfe blueswir1
#define eBX { OP_IMREG, eBX_reg }
387 88103cfe blueswir1
#define eCX { OP_IMREG, eCX_reg }
388 88103cfe blueswir1
#define eDX { OP_IMREG, eDX_reg }
389 88103cfe blueswir1
#define eSP { OP_IMREG, eSP_reg }
390 88103cfe blueswir1
#define eBP { OP_IMREG, eBP_reg }
391 88103cfe blueswir1
#define eSI { OP_IMREG, eSI_reg }
392 88103cfe blueswir1
#define eDI { OP_IMREG, eDI_reg }
393 88103cfe blueswir1
#define AL { OP_IMREG, al_reg }
394 88103cfe blueswir1
#define CL { OP_IMREG, cl_reg }
395 88103cfe blueswir1
#define DL { OP_IMREG, dl_reg }
396 88103cfe blueswir1
#define BL { OP_IMREG, bl_reg }
397 88103cfe blueswir1
#define AH { OP_IMREG, ah_reg }
398 88103cfe blueswir1
#define CH { OP_IMREG, ch_reg }
399 88103cfe blueswir1
#define DH { OP_IMREG, dh_reg }
400 88103cfe blueswir1
#define BH { OP_IMREG, bh_reg }
401 88103cfe blueswir1
#define AX { OP_IMREG, ax_reg }
402 88103cfe blueswir1
#define DX { OP_IMREG, dx_reg }
403 88103cfe blueswir1
#define zAX { OP_IMREG, z_mode_ax_reg }
404 88103cfe blueswir1
#define indirDX { OP_IMREG, indir_dx_reg }
405 88103cfe blueswir1
406 88103cfe blueswir1
#define Sw { OP_SEG, w_mode }
407 88103cfe blueswir1
#define Sv { OP_SEG, v_mode }
408 88103cfe blueswir1
#define Ap { OP_DIR, 0 }
409 88103cfe blueswir1
#define Ob { OP_OFF64, b_mode }
410 88103cfe blueswir1
#define Ov { OP_OFF64, v_mode }
411 88103cfe blueswir1
#define Xb { OP_DSreg, eSI_reg }
412 88103cfe blueswir1
#define Xv { OP_DSreg, eSI_reg }
413 88103cfe blueswir1
#define Xz { OP_DSreg, eSI_reg }
414 88103cfe blueswir1
#define Yb { OP_ESreg, eDI_reg }
415 88103cfe blueswir1
#define Yv { OP_ESreg, eDI_reg }
416 88103cfe blueswir1
#define DSBX { OP_DSreg, eBX_reg }
417 88103cfe blueswir1
418 88103cfe blueswir1
#define es { OP_REG, es_reg }
419 88103cfe blueswir1
#define ss { OP_REG, ss_reg }
420 88103cfe blueswir1
#define cs { OP_REG, cs_reg }
421 88103cfe blueswir1
#define ds { OP_REG, ds_reg }
422 88103cfe blueswir1
#define fs { OP_REG, fs_reg }
423 88103cfe blueswir1
#define gs { OP_REG, gs_reg }
424 88103cfe blueswir1
425 88103cfe blueswir1
#define MX { OP_MMX, 0 }
426 88103cfe blueswir1
#define XM { OP_XMM, 0 }
427 88103cfe blueswir1
#define EM { OP_EM, v_mode }
428 88103cfe blueswir1
#define EMd { OP_EM, d_mode }
429 88103cfe blueswir1
#define EMq { OP_EM, q_mode }
430 88103cfe blueswir1
#define EXd { OP_EX, d_mode }
431 88103cfe blueswir1
#define EXq { OP_EX, q_mode }
432 88103cfe blueswir1
#define EXx { OP_EX, x_mode }
433 88103cfe blueswir1
#define MS { OP_MS, v_mode }
434 88103cfe blueswir1
#define XS { OP_XS, v_mode }
435 88103cfe blueswir1
#define EMC { OP_EMC, v_mode }
436 88103cfe blueswir1
#define MXC { OP_MXC, 0 }
437 88103cfe blueswir1
#define VM { OP_VMX, q_mode }
438 88103cfe blueswir1
#define OPSUF { OP_3DNowSuffix, 0 }
439 88103cfe blueswir1
#define OPSIMD { OP_SIMD_Suffix, 0 }
440 88103cfe blueswir1
#define XMM0 { XMM_Fixup, 0 }
441 bc51c5c9 bellard
442 c2c73b42 blueswir1
/* Used handle "rep" prefix for string instructions.  */
443 88103cfe blueswir1
#define Xbr { REP_Fixup, eSI_reg }
444 88103cfe blueswir1
#define Xvr { REP_Fixup, eSI_reg }
445 88103cfe blueswir1
#define Ybr { REP_Fixup, eDI_reg }
446 88103cfe blueswir1
#define Yvr { REP_Fixup, eDI_reg }
447 88103cfe blueswir1
#define Yzr { REP_Fixup, eDI_reg }
448 88103cfe blueswir1
#define indirDXr { REP_Fixup, indir_dx_reg }
449 88103cfe blueswir1
#define ALr { REP_Fixup, al_reg }
450 88103cfe blueswir1
#define eAXr { REP_Fixup, eAX_reg }
451 88103cfe blueswir1
452 88103cfe blueswir1
#define cond_jump_flag { NULL, cond_jump_mode }
453 88103cfe blueswir1
#define loop_jcxz_flag { NULL, loop_jcxz_mode }
454 bc51c5c9 bellard
455 bc51c5c9 bellard
/* bits in sizeflag */
456 bc51c5c9 bellard
#define SUFFIX_ALWAYS 4
457 bc51c5c9 bellard
#define AFLAG 2
458 bc51c5c9 bellard
#define DFLAG 1
459 dc99065b bellard
460 bc51c5c9 bellard
#define b_mode 1  /* byte operand */
461 bc51c5c9 bellard
#define v_mode 2  /* operand size depends on prefixes */
462 bc51c5c9 bellard
#define w_mode 3  /* word operand */
463 bc51c5c9 bellard
#define d_mode 4  /* double word operand  */
464 bc51c5c9 bellard
#define q_mode 5  /* quad word operand */
465 c2c73b42 blueswir1
#define t_mode 6  /* ten-byte operand */
466 c2c73b42 blueswir1
#define x_mode 7  /* 16-byte XMM operand */
467 c2c73b42 blueswir1
#define m_mode 8  /* d_mode in 32bit, q_mode in 64bit mode.  */
468 c2c73b42 blueswir1
#define cond_jump_mode 9
469 c2c73b42 blueswir1
#define loop_jcxz_mode 10
470 c2c73b42 blueswir1
#define dq_mode 11 /* operand size depends on REX prefixes.  */
471 c2c73b42 blueswir1
#define dqw_mode 12 /* registers like dq_mode, memory like w_mode.  */
472 c2c73b42 blueswir1
#define f_mode 13 /* 4- or 6-byte pointer operand */
473 c2c73b42 blueswir1
#define const_1_mode 14
474 c2c73b42 blueswir1
#define stack_v_mode 15 /* v_mode for stack-related opcodes.  */
475 88103cfe blueswir1
#define z_mode 16 /* non-quad operand size depends on prefixes */
476 88103cfe blueswir1
#define o_mode 17  /* 16-byte operand */
477 88103cfe blueswir1
#define dqb_mode 18 /* registers like dq_mode, memory like b_mode.  */
478 88103cfe blueswir1
#define dqd_mode 19 /* registers like dq_mode, memory like d_mode.  */
479 dc99065b bellard
480 dc99065b bellard
#define es_reg 100
481 dc99065b bellard
#define cs_reg 101
482 dc99065b bellard
#define ss_reg 102
483 dc99065b bellard
#define ds_reg 103
484 dc99065b bellard
#define fs_reg 104
485 dc99065b bellard
#define gs_reg 105
486 dc99065b bellard
487 bc51c5c9 bellard
#define eAX_reg 108
488 bc51c5c9 bellard
#define eCX_reg 109
489 bc51c5c9 bellard
#define eDX_reg 110
490 bc51c5c9 bellard
#define eBX_reg 111
491 bc51c5c9 bellard
#define eSP_reg 112
492 bc51c5c9 bellard
#define eBP_reg 113
493 bc51c5c9 bellard
#define eSI_reg 114
494 bc51c5c9 bellard
#define eDI_reg 115
495 dc99065b bellard
496 dc99065b bellard
#define al_reg 116
497 dc99065b bellard
#define cl_reg 117
498 dc99065b bellard
#define dl_reg 118
499 dc99065b bellard
#define bl_reg 119
500 dc99065b bellard
#define ah_reg 120
501 dc99065b bellard
#define ch_reg 121
502 dc99065b bellard
#define dh_reg 122
503 dc99065b bellard
#define bh_reg 123
504 dc99065b bellard
505 dc99065b bellard
#define ax_reg 124
506 dc99065b bellard
#define cx_reg 125
507 dc99065b bellard
#define dx_reg 126
508 dc99065b bellard
#define bx_reg 127
509 dc99065b bellard
#define sp_reg 128
510 dc99065b bellard
#define bp_reg 129
511 dc99065b bellard
#define si_reg 130
512 dc99065b bellard
#define di_reg 131
513 dc99065b bellard
514 bc51c5c9 bellard
#define rAX_reg 132
515 bc51c5c9 bellard
#define rCX_reg 133
516 bc51c5c9 bellard
#define rDX_reg 134
517 bc51c5c9 bellard
#define rBX_reg 135
518 bc51c5c9 bellard
#define rSP_reg 136
519 bc51c5c9 bellard
#define rBP_reg 137
520 bc51c5c9 bellard
#define rSI_reg 138
521 bc51c5c9 bellard
#define rDI_reg 139
522 bc51c5c9 bellard
523 88103cfe blueswir1
#define z_mode_ax_reg 149
524 dc99065b bellard
#define indir_dx_reg 150
525 dc99065b bellard
526 bc51c5c9 bellard
#define FLOATCODE 1
527 bc51c5c9 bellard
#define USE_GROUPS 2
528 bc51c5c9 bellard
#define USE_PREFIX_USER_TABLE 3
529 bc51c5c9 bellard
#define X86_64_SPECIAL 4
530 c2c73b42 blueswir1
#define IS_3BYTE_OPCODE 5
531 bc51c5c9 bellard
532 88103cfe blueswir1
#define FLOAT          NULL, { { NULL, FLOATCODE } }
533 88103cfe blueswir1
534 88103cfe blueswir1
#define GRP1a          NULL, { { NULL, USE_GROUPS }, { NULL,  0 } }
535 88103cfe blueswir1
#define GRP1b          NULL, { { NULL, USE_GROUPS }, { NULL,  1 } }
536 88103cfe blueswir1
#define GRP1S          NULL, { { NULL, USE_GROUPS }, { NULL,  2 } }
537 88103cfe blueswir1
#define GRP1Ss          NULL, { { NULL, USE_GROUPS }, { NULL,  3 } }
538 88103cfe blueswir1
#define GRP2b          NULL, { { NULL, USE_GROUPS }, { NULL,  4 } }
539 88103cfe blueswir1
#define GRP2S          NULL, { { NULL, USE_GROUPS }, { NULL,  5 } }
540 88103cfe blueswir1
#define GRP2b_one NULL, { { NULL, USE_GROUPS }, { NULL,  6 } }
541 88103cfe blueswir1
#define GRP2S_one NULL, { { NULL, USE_GROUPS }, { NULL,  7 } }
542 88103cfe blueswir1
#define GRP2b_cl  NULL, { { NULL, USE_GROUPS }, { NULL,  8 } }
543 88103cfe blueswir1
#define GRP2S_cl  NULL, { { NULL, USE_GROUPS }, { NULL,  9 } }
544 88103cfe blueswir1
#define GRP3b          NULL, { { NULL, USE_GROUPS }, { NULL, 10 } }
545 88103cfe blueswir1
#define GRP3S          NULL, { { NULL, USE_GROUPS }, { NULL, 11 } }
546 88103cfe blueswir1
#define GRP4          NULL, { { NULL, USE_GROUPS }, { NULL, 12 } }
547 88103cfe blueswir1
#define GRP5          NULL, { { NULL, USE_GROUPS }, { NULL, 13 } }
548 88103cfe blueswir1
#define GRP6          NULL, { { NULL, USE_GROUPS }, { NULL, 14 } }
549 88103cfe blueswir1
#define GRP7          NULL, { { NULL, USE_GROUPS }, { NULL, 15 } }
550 88103cfe blueswir1
#define GRP8          NULL, { { NULL, USE_GROUPS }, { NULL, 16 } }
551 88103cfe blueswir1
#define GRP9          NULL, { { NULL, USE_GROUPS }, { NULL, 17 } }
552 88103cfe blueswir1
#define GRP11_C6  NULL, { { NULL, USE_GROUPS }, { NULL, 18 } }
553 88103cfe blueswir1
#define GRP11_C7  NULL, { { NULL, USE_GROUPS }, { NULL, 19 } }
554 88103cfe blueswir1
#define GRP12          NULL, { { NULL, USE_GROUPS }, { NULL, 20 } }
555 88103cfe blueswir1
#define GRP13          NULL, { { NULL, USE_GROUPS }, { NULL, 21 } }
556 88103cfe blueswir1
#define GRP14          NULL, { { NULL, USE_GROUPS }, { NULL, 22 } }
557 88103cfe blueswir1
#define GRP15          NULL, { { NULL, USE_GROUPS }, { NULL, 23 } }
558 88103cfe blueswir1
#define GRP16          NULL, { { NULL, USE_GROUPS }, { NULL, 24 } }
559 88103cfe blueswir1
#define GRPAMD          NULL, { { NULL, USE_GROUPS }, { NULL, 25 } }
560 88103cfe blueswir1
#define GRPPADLCK1 NULL, { { NULL, USE_GROUPS }, { NULL, 26 } }
561 88103cfe blueswir1
#define GRPPADLCK2 NULL, { { NULL, USE_GROUPS }, { NULL, 27 } }
562 88103cfe blueswir1
563 88103cfe blueswir1
#define PREGRP0   NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL,  0 } }
564 88103cfe blueswir1
#define PREGRP1   NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL,  1 } }
565 88103cfe blueswir1
#define PREGRP2   NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL,  2 } }
566 88103cfe blueswir1
#define PREGRP3   NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL,  3 } }
567 88103cfe blueswir1
#define PREGRP4   NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL,  4 } }
568 88103cfe blueswir1
#define PREGRP5   NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL,  5 } }
569 88103cfe blueswir1
#define PREGRP6   NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL,  6 } }
570 88103cfe blueswir1
#define PREGRP7   NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL,  7 } }
571 88103cfe blueswir1
#define PREGRP8   NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL,  8 } }
572 88103cfe blueswir1
#define PREGRP9   NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL,  9 } }
573 88103cfe blueswir1
#define PREGRP10  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 10 } }
574 88103cfe blueswir1
#define PREGRP11  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 11 } }
575 88103cfe blueswir1
#define PREGRP12  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 12 } }
576 88103cfe blueswir1
#define PREGRP13  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 13 } }
577 88103cfe blueswir1
#define PREGRP14  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 14 } }
578 88103cfe blueswir1
#define PREGRP15  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 15 } }
579 88103cfe blueswir1
#define PREGRP16  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 16 } }
580 88103cfe blueswir1
#define PREGRP17  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 17 } }
581 88103cfe blueswir1
#define PREGRP18  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 18 } }
582 88103cfe blueswir1
#define PREGRP19  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 19 } }
583 88103cfe blueswir1
#define PREGRP20  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 20 } }
584 88103cfe blueswir1
#define PREGRP21  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 21 } }
585 88103cfe blueswir1
#define PREGRP22  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 22 } }
586 88103cfe blueswir1
#define PREGRP23  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 23 } }
587 88103cfe blueswir1
#define PREGRP24  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 24 } }
588 88103cfe blueswir1
#define PREGRP25  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 25 } }
589 88103cfe blueswir1
#define PREGRP26  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 26 } }
590 88103cfe blueswir1
#define PREGRP27  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 27 } }
591 88103cfe blueswir1
#define PREGRP28  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 28 } }
592 88103cfe blueswir1
#define PREGRP29  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 29 } }
593 88103cfe blueswir1
#define PREGRP30  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 30 } }
594 88103cfe blueswir1
#define PREGRP31  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 31 } }
595 88103cfe blueswir1
#define PREGRP32  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 32 } }
596 88103cfe blueswir1
#define PREGRP33  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 33 } }
597 88103cfe blueswir1
#define PREGRP34  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 34 } }
598 88103cfe blueswir1
#define PREGRP35  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 35 } }
599 88103cfe blueswir1
#define PREGRP36  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 36 } }
600 88103cfe blueswir1
#define PREGRP37  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 37 } }
601 88103cfe blueswir1
#define PREGRP38  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 38 } }
602 88103cfe blueswir1
#define PREGRP39  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 39 } }
603 88103cfe blueswir1
#define PREGRP40  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 40 } }
604 88103cfe blueswir1
#define PREGRP41  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 41 } }
605 88103cfe blueswir1
#define PREGRP42  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 42 } }
606 88103cfe blueswir1
#define PREGRP43  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 43 } }
607 88103cfe blueswir1
#define PREGRP44  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 44 } }
608 88103cfe blueswir1
#define PREGRP45  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 45 } }
609 88103cfe blueswir1
#define PREGRP46  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 46 } }
610 88103cfe blueswir1
#define PREGRP47  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 47 } }
611 88103cfe blueswir1
#define PREGRP48  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 48 } }
612 88103cfe blueswir1
#define PREGRP49  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 49 } }
613 88103cfe blueswir1
#define PREGRP50  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 50 } }
614 88103cfe blueswir1
#define PREGRP51  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 51 } }
615 88103cfe blueswir1
#define PREGRP52  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 52 } }
616 88103cfe blueswir1
#define PREGRP53  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 53 } }
617 88103cfe blueswir1
#define PREGRP54  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 54 } }
618 88103cfe blueswir1
#define PREGRP55  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 55 } }
619 88103cfe blueswir1
#define PREGRP56  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 56 } }
620 88103cfe blueswir1
#define PREGRP57  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 57 } }
621 88103cfe blueswir1
#define PREGRP58  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 58 } }
622 88103cfe blueswir1
#define PREGRP59  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 59 } }
623 88103cfe blueswir1
#define PREGRP60  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 60 } }
624 88103cfe blueswir1
#define PREGRP61  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 61 } }
625 88103cfe blueswir1
#define PREGRP62  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 62 } }
626 88103cfe blueswir1
#define PREGRP63  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 63 } }
627 88103cfe blueswir1
#define PREGRP64  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 64 } }
628 88103cfe blueswir1
#define PREGRP65  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 65 } }
629 88103cfe blueswir1
#define PREGRP66  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 66 } }
630 88103cfe blueswir1
#define PREGRP67  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 67 } }
631 88103cfe blueswir1
#define PREGRP68  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 68 } }
632 88103cfe blueswir1
#define PREGRP69  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 69 } }
633 88103cfe blueswir1
#define PREGRP70  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 70 } }
634 88103cfe blueswir1
#define PREGRP71  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 71 } }
635 88103cfe blueswir1
#define PREGRP72  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 72 } }
636 88103cfe blueswir1
#define PREGRP73  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 73 } }
637 88103cfe blueswir1
#define PREGRP74  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 74 } }
638 88103cfe blueswir1
#define PREGRP75  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 75 } }
639 88103cfe blueswir1
#define PREGRP76  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 76 } }
640 88103cfe blueswir1
#define PREGRP77  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 77 } }
641 88103cfe blueswir1
#define PREGRP78  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 78 } }
642 88103cfe blueswir1
#define PREGRP79  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 79 } }
643 88103cfe blueswir1
#define PREGRP80  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 80 } }
644 88103cfe blueswir1
#define PREGRP81  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 81 } }
645 88103cfe blueswir1
#define PREGRP82  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 82 } }
646 88103cfe blueswir1
#define PREGRP83  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 83 } }
647 88103cfe blueswir1
#define PREGRP84  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 84 } }
648 88103cfe blueswir1
#define PREGRP85  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 85 } }
649 88103cfe blueswir1
#define PREGRP86  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 86 } }
650 88103cfe blueswir1
#define PREGRP87  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 87 } }
651 88103cfe blueswir1
#define PREGRP88  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 88 } }
652 88103cfe blueswir1
#define PREGRP89  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 89 } }
653 88103cfe blueswir1
#define PREGRP90  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 90 } }
654 88103cfe blueswir1
#define PREGRP91  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 91 } }
655 88103cfe blueswir1
#define PREGRP92  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 92 } }
656 88103cfe blueswir1
#define PREGRP93  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 93 } }
657 88103cfe blueswir1
#define PREGRP94  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 94 } }
658 88103cfe blueswir1
#define PREGRP95  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 95 } }
659 88103cfe blueswir1
#define PREGRP96  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 96 } }
660 88103cfe blueswir1
#define PREGRP97  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 97 } }
661 88103cfe blueswir1
662 88103cfe blueswir1
663 88103cfe blueswir1
#define X86_64_0  NULL, { { NULL, X86_64_SPECIAL }, { NULL, 0 } }
664 88103cfe blueswir1
#define X86_64_1  NULL, { { NULL, X86_64_SPECIAL }, { NULL, 1 } }
665 88103cfe blueswir1
#define X86_64_2  NULL, { { NULL, X86_64_SPECIAL }, { NULL, 2 } }
666 88103cfe blueswir1
#define X86_64_3  NULL, { { NULL, X86_64_SPECIAL }, { NULL, 3 } }
667 88103cfe blueswir1
668 88103cfe blueswir1
#define THREE_BYTE_0 NULL, { { NULL, IS_3BYTE_OPCODE }, { NULL, 0 } }
669 88103cfe blueswir1
#define THREE_BYTE_1 NULL, { { NULL, IS_3BYTE_OPCODE }, { NULL, 1 } }
670 c2c73b42 blueswir1
671 c2c73b42 blueswir1
typedef void (*op_rtn) (int bytemode, int sizeflag);
672 dc99065b bellard
673 dc99065b bellard
struct dis386 {
674 bc51c5c9 bellard
  const char *name;
675 88103cfe blueswir1
  struct
676 88103cfe blueswir1
    {
677 88103cfe blueswir1
      op_rtn rtn;
678 88103cfe blueswir1
      int bytemode;
679 88103cfe blueswir1
    } op[MAX_OPERANDS];
680 dc99065b bellard
};
681 dc99065b bellard
682 bc51c5c9 bellard
/* Upper case letters in the instruction names here are macros.
683 bc51c5c9 bellard
   'A' => print 'b' if no register operands or suffix_always is true
684 bc51c5c9 bellard
   'B' => print 'b' if suffix_always is true
685 c2c73b42 blueswir1
   'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
686 c2c73b42 blueswir1
   .      size prefix
687 88103cfe blueswir1
   'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
688 88103cfe blueswir1
   .      suffix_always is true
689 bc51c5c9 bellard
   'E' => print 'e' if 32-bit form of jcxz
690 bc51c5c9 bellard
   'F' => print 'w' or 'l' depending on address size prefix (loop insns)
691 88103cfe blueswir1
   'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
692 bc51c5c9 bellard
   'H' => print ",pt" or ",pn" branch hint
693 c2c73b42 blueswir1
   'I' => honor following macro letter even in Intel mode (implemented only
694 c2c73b42 blueswir1
   .      for some of the macro letters)
695 c2c73b42 blueswir1
   'J' => print 'l'
696 88103cfe blueswir1
   'K' => print 'd' or 'q' if rex prefix is present.
697 bc51c5c9 bellard
   'L' => print 'l' if suffix_always is true
698 bc51c5c9 bellard
   'N' => print 'n' if instruction has no wait "prefix"
699 88103cfe blueswir1
   'O' => print 'd' or 'o' (or 'q' in Intel mode)
700 bc51c5c9 bellard
   'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
701 bc51c5c9 bellard
   .      or suffix_always is true.  print 'q' if rex prefix is present.
702 bc51c5c9 bellard
   'Q' => print 'w', 'l' or 'q' if no register operands or suffix_always
703 bc51c5c9 bellard
   .      is true
704 88103cfe blueswir1
   'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
705 bc51c5c9 bellard
   'S' => print 'w', 'l' or 'q' if suffix_always is true
706 bc51c5c9 bellard
   'T' => print 'q' in 64bit mode and behave as 'P' otherwise
707 bc51c5c9 bellard
   'U' => print 'q' in 64bit mode and behave as 'Q' otherwise
708 c2c73b42 blueswir1
   'V' => print 'q' in 64bit mode and behave as 'S' otherwise
709 88103cfe blueswir1
   'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
710 c2c73b42 blueswir1
   'X' => print 's', 'd' depending on data16 prefix (for XMM)
711 bc51c5c9 bellard
   'Y' => 'q' if instruction has an REX 64bit overwrite prefix
712 c2c73b42 blueswir1
   'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
713 bc51c5c9 bellard

714 bc51c5c9 bellard
   Many of the above letters print nothing in Intel mode.  See "putop"
715 bc51c5c9 bellard
   for the details.
716 bc51c5c9 bellard

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