Statistics
| Branch: | Revision:

root / i386-dis.c @ 6774e44a

History | View | Annotate | Download (159.1 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 8167ee88 Blue Swirl
   along with this program; if not, see <http://www.gnu.org/licenses/>. */
20 dc99065b bellard
21 c2c73b42 blueswir1
/* 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu)
22 c2c73b42 blueswir1
   July 1988
23 c2c73b42 blueswir1
    modified by John Hassey (hassey@dg-rtp.dg.com)
24 c2c73b42 blueswir1
    x86-64 support added by Jan Hubicka (jh@suse.cz)
25 c2c73b42 blueswir1
    VIA PadLock support by Michal Ludvig (mludvig@suse.cz).  */
26 dc99065b bellard
27 c2c73b42 blueswir1
/* The main tables describing the instructions is essentially a copy
28 c2c73b42 blueswir1
   of the "Opcode Map" chapter (Appendix A) of the Intel 80386
29 c2c73b42 blueswir1
   Programmers Manual.  Usually, there is a capital letter, followed
30 c2c73b42 blueswir1
   by a small letter.  The capital letter tell the addressing mode,
31 c2c73b42 blueswir1
   and the small letter tells about the operand size.  Refer to
32 c2c73b42 blueswir1
   the Intel manual for details.  */
33 dc99065b bellard
34 bb0ebb1f bellard
#include <stdlib.h>
35 dc99065b bellard
#include "dis-asm.h"
36 88103cfe blueswir1
/* include/opcode/i386.h r1.78 */
37 dc99065b bellard
38 88103cfe blueswir1
/* opcode/i386.h -- Intel 80386 opcode macros
39 88103cfe blueswir1
   Copyright 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
40 88103cfe blueswir1
   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
41 88103cfe blueswir1
   Free Software Foundation, Inc.
42 dc99065b bellard

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

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

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

55 88103cfe blueswir1
   You should have received a copy of the GNU General Public License
56 8167ee88 Blue Swirl
   along with this program; if not, see <http://www.gnu.org/licenses/>.  */
57 88103cfe blueswir1
58 88103cfe blueswir1
/* The SystemV/386 SVR3.2 assembler, and probably all AT&T derived
59 88103cfe blueswir1
   ix86 Unix assemblers, generate floating point instructions with
60 88103cfe blueswir1
   reversed source and destination registers in certain cases.
61 88103cfe blueswir1
   Unfortunately, gcc and possibly many other programs use this
62 88103cfe blueswir1
   reversed syntax, so we're stuck with it.
63 88103cfe blueswir1

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

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

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

720 bc51c5c9 bellard
   Many of the above letters print nothing in Intel mode.  See "putop"
721 bc51c5c9 bellard
   for the details.
722 bc51c5c9 bellard

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