OpenCores
URL https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk

Subversion Repositories openrisc_2011-10-31

[/] [openrisc/] [trunk/] [gnu-src/] [gdb-6.8/] [opcodes/] [i386-dis.c] - Blame information for rev 157

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 24 jeremybenn
/* Print i386 instructions for GDB, the GNU debugger.
2
   Copyright 1988, 1989, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3
   2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
4
 
5
   This file is part of the GNU opcodes library.
6
 
7
   This library is free software; you can redistribute it and/or modify
8
   it under the terms of the GNU General Public License as published by
9
   the Free Software Foundation; either version 3, or (at your option)
10
   any later version.
11
 
12
   It is distributed in the hope that it will be useful, but WITHOUT
13
   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14
   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
15
   License for more details.
16
 
17
   You should have received a copy of the GNU General Public License
18
   along with this program; if not, write to the Free Software
19
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20
   MA 02110-1301, USA.  */
21
 
22
 
23
/* 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu)
24
   July 1988
25
    modified by John Hassey (hassey@dg-rtp.dg.com)
26
    x86-64 support added by Jan Hubicka (jh@suse.cz)
27
    VIA PadLock support by Michal Ludvig (mludvig@suse.cz).  */
28
 
29
/* The main tables describing the instructions is essentially a copy
30
   of the "Opcode Map" chapter (Appendix A) of the Intel 80386
31
   Programmers Manual.  Usually, there is a capital letter, followed
32
   by a small letter.  The capital letter tell the addressing mode,
33
   and the small letter tells about the operand size.  Refer to
34
   the Intel manual for details.  */
35
 
36
#include "sysdep.h"
37
#include "dis-asm.h"
38
#include "opintl.h"
39
#include "opcode/i386.h"
40
#include "libiberty.h"
41
 
42
#include <setjmp.h>
43
 
44
static int fetch_data (struct disassemble_info *, bfd_byte *);
45
static void ckprefix (void);
46
static const char *prefix_name (int, int);
47
static int print_insn (bfd_vma, disassemble_info *);
48
static void dofloat (int);
49
static void OP_ST (int, int);
50
static void OP_STi (int, int);
51
static int putop (const char *, int);
52
static void oappend (const char *);
53
static void append_seg (void);
54
static void OP_indirE (int, int);
55
static void print_operand_value (char *, int, bfd_vma);
56
static void OP_E_extended (int, int, int);
57
static void print_displacement (char *, bfd_vma);
58
static void OP_E (int, int);
59
static void OP_G (int, int);
60
static bfd_vma get64 (void);
61
static bfd_signed_vma get32 (void);
62
static bfd_signed_vma get32s (void);
63
static int get16 (void);
64
static void set_op (bfd_vma, int);
65
static void OP_Skip_MODRM (int, int);
66
static void OP_REG (int, int);
67
static void OP_IMREG (int, int);
68
static void OP_I (int, int);
69
static void OP_I64 (int, int);
70
static void OP_sI (int, int);
71
static void OP_J (int, int);
72
static void OP_SEG (int, int);
73
static void OP_DIR (int, int);
74
static void OP_OFF (int, int);
75
static void OP_OFF64 (int, int);
76
static void ptr_reg (int, int);
77
static void OP_ESreg (int, int);
78
static void OP_DSreg (int, int);
79
static void OP_C (int, int);
80
static void OP_D (int, int);
81
static void OP_T (int, int);
82
static void OP_R (int, int);
83
static void OP_MMX (int, int);
84
static void OP_XMM (int, int);
85
static void OP_EM (int, int);
86
static void OP_EX (int, int);
87
static void OP_EMC (int,int);
88
static void OP_MXC (int,int);
89
static void OP_MS (int, int);
90
static void OP_XS (int, int);
91
static void OP_M (int, int);
92
static void OP_0f07 (int, int);
93
static void OP_Monitor (int, int);
94
static void OP_Mwait (int, int);
95
static void NOP_Fixup1 (int, int);
96
static void NOP_Fixup2 (int, int);
97
static void OP_3DNowSuffix (int, int);
98
static void CMP_Fixup (int, int);
99
static void BadOp (void);
100
static void REP_Fixup (int, int);
101
static void CMPXCHG8B_Fixup (int, int);
102
static void XMM_Fixup (int, int);
103
static void CRC32_Fixup (int, int);
104
static void print_drex_arg (unsigned int, int, int);
105
static void OP_DREX4 (int, int);
106
static void OP_DREX3 (int, int);
107
static void OP_DREX_ICMP (int, int);
108
static void OP_DREX_FCMP (int, int);
109
 
110
struct dis_private {
111
  /* Points to first byte not fetched.  */
112
  bfd_byte *max_fetched;
113
  bfd_byte the_buffer[MAX_MNEM_SIZE];
114
  bfd_vma insn_start;
115
  int orig_sizeflag;
116
  jmp_buf bailout;
117
};
118
 
119
enum address_mode
120
{
121
  mode_16bit,
122
  mode_32bit,
123
  mode_64bit
124
};
125
 
126
enum address_mode address_mode;
127
 
128
/* Flags for the prefixes for the current instruction.  See below.  */
129
static int prefixes;
130
 
131
/* REX prefix the current instruction.  See below.  */
132
static int rex;
133
/* Bits of REX we've already used.  */
134
static int rex_used;
135
/* Mark parts used in the REX prefix.  When we are testing for
136
   empty prefix (for 8bit register REX extension), just mask it
137
   out.  Otherwise test for REX bit is excuse for existence of REX
138
   only in case value is nonzero.  */
139
#define USED_REX(value)                                 \
140
  {                                                     \
141
    if (value)                                          \
142
      {                                                 \
143
        if ((rex & value))                              \
144
          rex_used |= (value) | REX_OPCODE;             \
145
      }                                                 \
146
    else                                                \
147
      rex_used |= REX_OPCODE;                           \
148
  }
149
 
150
/* Special 'registers' for DREX handling */
151
#define DREX_REG_UNKNOWN        1000    /* not initialized */
152
#define DREX_REG_MEMORY         1001    /* use MODRM/SIB/OFFSET memory */
153
 
154
/* The DREX byte has the following fields:
155
   Bits 7-4 -- DREX.Dest, xmm destination register
156
   Bit 3    -- DREX.OC0, operand config bit defines operand order
157
   Bit 2    -- DREX.R, equivalent to REX_R bit, to extend ModRM register
158
   Bit 1    -- DREX.X, equivalent to REX_X bit, to extend SIB index field
159
   Bit 0    -- DREX.W, equivalent to REX_B bit, to extend ModRM r/m field,
160
               SIB base field, or opcode reg field.  */
161
#define DREX_XMM(drex) ((drex >> 4) & 0xf)
162
#define DREX_OC0(drex) ((drex >> 3) & 0x1)
163
 
164
/* Flags for prefixes which we somehow handled when printing the
165
   current instruction.  */
166
static int used_prefixes;
167
 
168
/* Flags stored in PREFIXES.  */
169
#define PREFIX_REPZ 1
170
#define PREFIX_REPNZ 2
171
#define PREFIX_LOCK 4
172
#define PREFIX_CS 8
173
#define PREFIX_SS 0x10
174
#define PREFIX_DS 0x20
175
#define PREFIX_ES 0x40
176
#define PREFIX_FS 0x80
177
#define PREFIX_GS 0x100
178
#define PREFIX_DATA 0x200
179
#define PREFIX_ADDR 0x400
180
#define PREFIX_FWAIT 0x800
181
 
182
/* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
183
   to ADDR (exclusive) are valid.  Returns 1 for success, longjmps
184
   on error.  */
185
#define FETCH_DATA(info, addr) \
186
  ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
187
   ? 1 : fetch_data ((info), (addr)))
188
 
189
static int
190
fetch_data (struct disassemble_info *info, bfd_byte *addr)
191
{
192
  int status;
193
  struct dis_private *priv = (struct dis_private *) info->private_data;
194
  bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
195
 
196
  if (addr <= priv->the_buffer + MAX_MNEM_SIZE)
197
    status = (*info->read_memory_func) (start,
198
                                        priv->max_fetched,
199
                                        addr - priv->max_fetched,
200
                                        info);
201
  else
202
    status = -1;
203
  if (status != 0)
204
    {
205
      /* If we did manage to read at least one byte, then
206
         print_insn_i386 will do something sensible.  Otherwise, print
207
         an error.  We do that here because this is where we know
208
         STATUS.  */
209
      if (priv->max_fetched == priv->the_buffer)
210
        (*info->memory_error_func) (status, start, info);
211
      longjmp (priv->bailout, 1);
212
    }
213
  else
214
    priv->max_fetched = addr;
215
  return 1;
216
}
217
 
218
#define XX { NULL, 0 }
219
 
220
#define Eb { OP_E, b_mode }
221
#define Ev { OP_E, v_mode }
222
#define Ed { OP_E, d_mode }
223
#define Edq { OP_E, dq_mode }
224
#define Edqw { OP_E, dqw_mode }
225
#define Edqb { OP_E, dqb_mode }
226
#define Edqd { OP_E, dqd_mode }
227
#define Eq { OP_E, q_mode }
228
#define indirEv { OP_indirE, stack_v_mode }
229
#define indirEp { OP_indirE, f_mode }
230
#define stackEv { OP_E, stack_v_mode }
231
#define Em { OP_E, m_mode }
232
#define Ew { OP_E, w_mode }
233
#define M { OP_M, 0 }           /* lea, lgdt, etc. */
234
#define Ma { OP_M, a_mode }
235
#define Mb { OP_M, b_mode }
236
#define Md { OP_M, d_mode }
237
#define Mp { OP_M, f_mode }             /* 32 or 48 bit memory operand for LDS, LES etc */
238
#define Mq { OP_M, q_mode }
239
#define Mx { OP_M, x_mode }
240
#define Gb { OP_G, b_mode }
241
#define Gv { OP_G, v_mode }
242
#define Gd { OP_G, d_mode }
243
#define Gdq { OP_G, dq_mode }
244
#define Gm { OP_G, m_mode }
245
#define Gw { OP_G, w_mode }
246
#define Rd { OP_R, d_mode }
247
#define Rm { OP_R, m_mode }
248
#define Ib { OP_I, b_mode }
249
#define sIb { OP_sI, b_mode }   /* sign extened byte */
250
#define Iv { OP_I, v_mode }
251
#define Iq { OP_I, q_mode }
252
#define Iv64 { OP_I64, v_mode }
253
#define Iw { OP_I, w_mode }
254
#define I1 { OP_I, const_1_mode }
255
#define Jb { OP_J, b_mode }
256
#define Jv { OP_J, v_mode }
257
#define Cm { OP_C, m_mode }
258
#define Dm { OP_D, m_mode }
259
#define Td { OP_T, d_mode }
260
#define Skip_MODRM { OP_Skip_MODRM, 0 }
261
 
262
#define RMeAX { OP_REG, eAX_reg }
263
#define RMeBX { OP_REG, eBX_reg }
264
#define RMeCX { OP_REG, eCX_reg }
265
#define RMeDX { OP_REG, eDX_reg }
266
#define RMeSP { OP_REG, eSP_reg }
267
#define RMeBP { OP_REG, eBP_reg }
268
#define RMeSI { OP_REG, eSI_reg }
269
#define RMeDI { OP_REG, eDI_reg }
270
#define RMrAX { OP_REG, rAX_reg }
271
#define RMrBX { OP_REG, rBX_reg }
272
#define RMrCX { OP_REG, rCX_reg }
273
#define RMrDX { OP_REG, rDX_reg }
274
#define RMrSP { OP_REG, rSP_reg }
275
#define RMrBP { OP_REG, rBP_reg }
276
#define RMrSI { OP_REG, rSI_reg }
277
#define RMrDI { OP_REG, rDI_reg }
278
#define RMAL { OP_REG, al_reg }
279
#define RMAL { OP_REG, al_reg }
280
#define RMCL { OP_REG, cl_reg }
281
#define RMDL { OP_REG, dl_reg }
282
#define RMBL { OP_REG, bl_reg }
283
#define RMAH { OP_REG, ah_reg }
284
#define RMCH { OP_REG, ch_reg }
285
#define RMDH { OP_REG, dh_reg }
286
#define RMBH { OP_REG, bh_reg }
287
#define RMAX { OP_REG, ax_reg }
288
#define RMDX { OP_REG, dx_reg }
289
 
290
#define eAX { OP_IMREG, eAX_reg }
291
#define eBX { OP_IMREG, eBX_reg }
292
#define eCX { OP_IMREG, eCX_reg }
293
#define eDX { OP_IMREG, eDX_reg }
294
#define eSP { OP_IMREG, eSP_reg }
295
#define eBP { OP_IMREG, eBP_reg }
296
#define eSI { OP_IMREG, eSI_reg }
297
#define eDI { OP_IMREG, eDI_reg }
298
#define AL { OP_IMREG, al_reg }
299
#define CL { OP_IMREG, cl_reg }
300
#define DL { OP_IMREG, dl_reg }
301
#define BL { OP_IMREG, bl_reg }
302
#define AH { OP_IMREG, ah_reg }
303
#define CH { OP_IMREG, ch_reg }
304
#define DH { OP_IMREG, dh_reg }
305
#define BH { OP_IMREG, bh_reg }
306
#define AX { OP_IMREG, ax_reg }
307
#define DX { OP_IMREG, dx_reg }
308
#define zAX { OP_IMREG, z_mode_ax_reg }
309
#define indirDX { OP_IMREG, indir_dx_reg }
310
 
311
#define Sw { OP_SEG, w_mode }
312
#define Sv { OP_SEG, v_mode }
313
#define Ap { OP_DIR, 0 }
314
#define Ob { OP_OFF64, b_mode }
315
#define Ov { OP_OFF64, v_mode }
316
#define Xb { OP_DSreg, eSI_reg }
317
#define Xv { OP_DSreg, eSI_reg }
318
#define Xz { OP_DSreg, eSI_reg }
319
#define Yb { OP_ESreg, eDI_reg }
320
#define Yv { OP_ESreg, eDI_reg }
321
#define DSBX { OP_DSreg, eBX_reg }
322
 
323
#define es { OP_REG, es_reg }
324
#define ss { OP_REG, ss_reg }
325
#define cs { OP_REG, cs_reg }
326
#define ds { OP_REG, ds_reg }
327
#define fs { OP_REG, fs_reg }
328
#define gs { OP_REG, gs_reg }
329
 
330
#define MX { OP_MMX, 0 }
331
#define XM { OP_XMM, 0 }
332
#define EM { OP_EM, v_mode }
333
#define EMd { OP_EM, d_mode }
334
#define EMx { OP_EM, x_mode }
335
#define EXw { OP_EX, w_mode }
336
#define EXd { OP_EX, d_mode }
337
#define EXq { OP_EX, q_mode }
338
#define EXx { OP_EX, x_mode }
339
#define MS { OP_MS, v_mode }
340
#define XS { OP_XS, v_mode }
341
#define EMCq { OP_EMC, q_mode }
342
#define MXC { OP_MXC, 0 }
343
#define OPSUF { OP_3DNowSuffix, 0 }
344
#define CMP { CMP_Fixup, 0 }
345
#define XMM0 { XMM_Fixup, 0 }
346
 
347
/* Used handle "rep" prefix for string instructions.  */
348
#define Xbr { REP_Fixup, eSI_reg }
349
#define Xvr { REP_Fixup, eSI_reg }
350
#define Ybr { REP_Fixup, eDI_reg }
351
#define Yvr { REP_Fixup, eDI_reg }
352
#define Yzr { REP_Fixup, eDI_reg }
353
#define indirDXr { REP_Fixup, indir_dx_reg }
354
#define ALr { REP_Fixup, al_reg }
355
#define eAXr { REP_Fixup, eAX_reg }
356
 
357
#define cond_jump_flag { NULL, cond_jump_mode }
358
#define loop_jcxz_flag { NULL, loop_jcxz_mode }
359
 
360
/* bits in sizeflag */
361
#define SUFFIX_ALWAYS 4
362
#define AFLAG 2
363
#define DFLAG 1
364
 
365
/* byte operand */
366
#define b_mode                  1
367
/* operand size depends on prefixes */
368
#define v_mode                  (b_mode + 1)
369
/* word operand */
370
#define w_mode                  (v_mode + 1)
371
/* double word operand  */
372
#define d_mode                  (w_mode + 1)
373
/* quad word operand */
374
#define q_mode                  (d_mode + 1)
375
/* ten-byte operand */
376
#define t_mode                  (q_mode + 1)
377
/* 16-byte XMM operand */
378
#define x_mode                  (t_mode + 1)
379
/* d_mode in 32bit, q_mode in 64bit mode.  */
380
#define m_mode                  (x_mode + 1)
381
/* pair of v_mode operands */
382
#define a_mode                  (m_mode + 1)
383
#define cond_jump_mode          (a_mode + 1)
384
#define loop_jcxz_mode          (cond_jump_mode + 1)
385
/* operand size depends on REX prefixes.  */
386
#define dq_mode                 (loop_jcxz_mode + 1)
387
/* registers like dq_mode, memory like w_mode.  */
388
#define dqw_mode                (dq_mode + 1)
389
/* 4- or 6-byte pointer operand */
390
#define f_mode                  (dqw_mode + 1)
391
#define const_1_mode            (f_mode + 1)
392
/* v_mode for stack-related opcodes.  */
393
#define stack_v_mode            (const_1_mode + 1)
394
/* non-quad operand size depends on prefixes */
395
#define z_mode                  (stack_v_mode + 1)
396
/* 16-byte operand */
397
#define o_mode                  (z_mode + 1)
398
/* registers like dq_mode, memory like b_mode.  */
399
#define dqb_mode                (o_mode + 1)
400
/* registers like dq_mode, memory like d_mode.  */
401
#define dqd_mode                (dqb_mode + 1)
402
 
403
#define es_reg                  (dqd_mode + 1)
404
#define cs_reg                  (es_reg + 1)
405
#define ss_reg                  (cs_reg + 1)
406
#define ds_reg                  (ss_reg + 1)
407
#define fs_reg                  (ds_reg + 1)
408
#define gs_reg                  (fs_reg + 1)
409
 
410
#define eAX_reg                 (gs_reg + 1)
411
#define eCX_reg                 (eAX_reg + 1)
412
#define eDX_reg                 (eCX_reg + 1)
413
#define eBX_reg                 (eDX_reg + 1)
414
#define eSP_reg                 (eBX_reg + 1)
415
#define eBP_reg                 (eSP_reg + 1)
416
#define eSI_reg                 (eBP_reg + 1)
417
#define eDI_reg                 (eSI_reg + 1)
418
 
419
#define al_reg                  (eDI_reg + 1)
420
#define cl_reg                  (al_reg + 1)
421
#define dl_reg                  (cl_reg + 1)
422
#define bl_reg                  (dl_reg + 1)
423
#define ah_reg                  (bl_reg + 1)
424
#define ch_reg                  (ah_reg + 1)
425
#define dh_reg                  (ch_reg + 1)
426
#define bh_reg                  (dh_reg + 1)
427
 
428
#define ax_reg                  (bh_reg + 1)
429
#define cx_reg                  (ax_reg + 1)
430
#define dx_reg                  (cx_reg + 1)
431
#define bx_reg                  (dx_reg + 1)
432
#define sp_reg                  (bx_reg + 1)
433
#define bp_reg                  (sp_reg + 1)
434
#define si_reg                  (bp_reg + 1)
435
#define di_reg                  (si_reg + 1)
436
 
437
#define rAX_reg                 (di_reg + 1)
438
#define rCX_reg                 (rAX_reg + 1)
439
#define rDX_reg                 (rCX_reg + 1)
440
#define rBX_reg                 (rDX_reg + 1)
441
#define rSP_reg                 (rBX_reg + 1)
442
#define rBP_reg                 (rSP_reg + 1)
443
#define rSI_reg                 (rBP_reg + 1)
444
#define rDI_reg                 (rSI_reg + 1)
445
 
446
#define z_mode_ax_reg           (rDI_reg + 1)
447
#define indir_dx_reg            (z_mode_ax_reg + 1)
448
 
449
#define MAX_BYTEMODE    indir_dx_reg
450
 
451
/* Flags that are OR'ed into the bytemode field to pass extra
452
   information.  */
453
#define DREX_OC1                0x10000 /* OC1 bit set */
454
#define DREX_NO_OC0             0x20000 /* OC0 bit not used */
455
#define DREX_MASK               0x40000 /* mask to delete */
456
 
457
#if MAX_BYTEMODE >= DREX_OC1
458
#error MAX_BYTEMODE must be less than DREX_OC1
459
#endif
460
 
461
#define FLOATCODE               1
462
#define USE_REG_TABLE           (FLOATCODE + 1)
463
#define USE_MOD_TABLE           (USE_REG_TABLE + 1)
464
#define USE_RM_TABLE            (USE_MOD_TABLE + 1)
465
#define USE_PREFIX_TABLE        (USE_RM_TABLE + 1)
466
#define USE_X86_64_TABLE        (USE_PREFIX_TABLE + 1)
467
#define USE_3BYTE_TABLE         (USE_X86_64_TABLE + 1)
468
 
469
#define FLOAT                   NULL, { { NULL, FLOATCODE } }
470
 
471
#define DIS386(T, I)            NULL, { { NULL, (T)}, { NULL,  (I) } }
472
#define REG_TABLE(I)            DIS386 (USE_REG_TABLE, (I))
473
#define MOD_TABLE(I)            DIS386 (USE_MOD_TABLE, (I))
474
#define RM_TABLE(I)             DIS386 (USE_RM_TABLE, (I))
475
#define PREFIX_TABLE(I)         DIS386 (USE_PREFIX_TABLE, (I))
476
#define X86_64_TABLE(I)         DIS386 (USE_X86_64_TABLE, (I))
477
#define THREE_BYTE_TABLE(I)     DIS386 (USE_3BYTE_TABLE, (I))
478
 
479
#define REG_80                  0
480
#define REG_81                  (REG_80 + 1)
481
#define REG_82                  (REG_81 + 1)
482
#define REG_8F                  (REG_82 + 1)
483
#define REG_C0                  (REG_8F + 1)
484
#define REG_C1                  (REG_C0 + 1)
485
#define REG_C6                  (REG_C1 + 1)
486
#define REG_C7                  (REG_C6 + 1)
487
#define REG_D0                  (REG_C7 + 1)
488
#define REG_D1                  (REG_D0 + 1)
489
#define REG_D2                  (REG_D1 + 1)
490
#define REG_D3                  (REG_D2 + 1)
491
#define REG_F6                  (REG_D3 + 1)
492
#define REG_F7                  (REG_F6 + 1)
493
#define REG_FE                  (REG_F7 + 1)
494
#define REG_FF                  (REG_FE + 1)
495
#define REG_0F00                (REG_FF + 1)
496
#define REG_0F01                (REG_0F00 + 1)
497
#define REG_0F0D                (REG_0F01 + 1)
498
#define REG_0F18                (REG_0F0D + 1)
499
#define REG_0F71                (REG_0F18 + 1)
500
#define REG_0F72                (REG_0F71 + 1)
501
#define REG_0F73                (REG_0F72 + 1)
502
#define REG_0FA6                (REG_0F73 + 1)
503
#define REG_0FA7                (REG_0FA6 + 1)
504
#define REG_0FAE                (REG_0FA7 + 1)
505
#define REG_0FBA                (REG_0FAE + 1)
506
#define REG_0FC7                (REG_0FBA + 1)
507
 
508
#define MOD_8D                  0
509
#define MOD_0F01_REG_0          (MOD_8D + 1)
510
#define MOD_0F01_REG_1          (MOD_0F01_REG_0 + 1)
511
#define MOD_0F01_REG_2          (MOD_0F01_REG_1 + 1)
512
#define MOD_0F01_REG_3          (MOD_0F01_REG_2 + 1)
513
#define MOD_0F01_REG_7          (MOD_0F01_REG_3 + 1)
514
#define MOD_0F12_PREFIX_0       (MOD_0F01_REG_7 + 1)
515
#define MOD_0F13                (MOD_0F12_PREFIX_0 + 1)
516
#define MOD_0F16_PREFIX_0       (MOD_0F13 + 1)
517
#define MOD_0F17                (MOD_0F16_PREFIX_0 + 1)
518
#define MOD_0F18_REG_0          (MOD_0F17 + 1)
519
#define MOD_0F18_REG_1          (MOD_0F18_REG_0 + 1)
520
#define MOD_0F18_REG_2          (MOD_0F18_REG_1 + 1)
521
#define MOD_0F18_REG_3          (MOD_0F18_REG_2 + 1)
522
#define MOD_0F20                (MOD_0F18_REG_3 + 1)
523
#define MOD_0F21                (MOD_0F20 + 1)
524
#define MOD_0F22                (MOD_0F21 + 1)
525
#define MOD_0F23                (MOD_0F22 + 1)
526
#define MOD_0F24                (MOD_0F23 + 1)
527
#define MOD_0F26                (MOD_0F24 + 1)
528
#define MOD_0F2B_PREFIX_0       (MOD_0F26 + 1)
529
#define MOD_0F2B_PREFIX_1       (MOD_0F2B_PREFIX_0 + 1)
530
#define MOD_0F2B_PREFIX_2       (MOD_0F2B_PREFIX_1 + 1)
531
#define MOD_0F2B_PREFIX_3       (MOD_0F2B_PREFIX_2 + 1)
532
#define MOD_0F51                (MOD_0F2B_PREFIX_3 + 1)
533
#define MOD_0F71_REG_2          (MOD_0F51 + 1)
534
#define MOD_0F71_REG_4          (MOD_0F71_REG_2 + 1)
535
#define MOD_0F71_REG_6          (MOD_0F71_REG_4 + 1)
536
#define MOD_0F72_REG_2          (MOD_0F71_REG_6 + 1)
537
#define MOD_0F72_REG_4          (MOD_0F72_REG_2 + 1)
538
#define MOD_0F72_REG_6          (MOD_0F72_REG_4 + 1)
539
#define MOD_0F73_REG_2          (MOD_0F72_REG_6 + 1)
540
#define MOD_0F73_REG_3          (MOD_0F73_REG_2 + 1)
541
#define MOD_0F73_REG_6          (MOD_0F73_REG_3 + 1)
542
#define MOD_0F73_REG_7          (MOD_0F73_REG_6 + 1)
543
#define MOD_0FAE_REG_0          (MOD_0F73_REG_7 + 1)
544
#define MOD_0FAE_REG_1          (MOD_0FAE_REG_0 + 1)
545
#define MOD_0FAE_REG_2          (MOD_0FAE_REG_1 + 1)
546
#define MOD_0FAE_REG_3          (MOD_0FAE_REG_2 + 1)
547
#define MOD_0FAE_REG_4          (MOD_0FAE_REG_3 + 1)
548
#define MOD_0FAE_REG_5          (MOD_0FAE_REG_4 + 1)
549
#define MOD_0FAE_REG_6          (MOD_0FAE_REG_5 + 1)
550
#define MOD_0FAE_REG_7          (MOD_0FAE_REG_6 + 1)
551
#define MOD_0FB2                (MOD_0FAE_REG_7 + 1)
552
#define MOD_0FB4                (MOD_0FB2 + 1)
553
#define MOD_0FB5                (MOD_0FB4 + 1)
554
#define MOD_0FC7_REG_6          (MOD_0FB5 + 1)
555
#define MOD_0FC7_REG_7          (MOD_0FC7_REG_6 + 1)
556
#define MOD_0FD7                (MOD_0FC7_REG_7 + 1)
557
#define MOD_0FE7_PREFIX_2       (MOD_0FD7 + 1)
558
#define MOD_0FF0_PREFIX_3       (MOD_0FE7_PREFIX_2 + 1)
559
#define MOD_0F382A_PREFIX_2     (MOD_0FF0_PREFIX_3 + 1)
560
#define MOD_62_32BIT            (MOD_0F382A_PREFIX_2 + 1)
561
#define MOD_C4_32BIT            (MOD_62_32BIT + 1)
562
#define MOD_C5_32BIT            (MOD_C4_32BIT + 1)
563
 
564
#define RM_0F01_REG_0           0
565
#define RM_0F01_REG_1           (RM_0F01_REG_0 + 1)
566
#define RM_0F01_REG_2           (RM_0F01_REG_1 + 1)
567
#define RM_0F01_REG_3           (RM_0F01_REG_2 + 1)
568
#define RM_0F01_REG_7           (RM_0F01_REG_3 + 1)
569
#define RM_0FAE_REG_5           (RM_0F01_REG_7 + 1)
570
#define RM_0FAE_REG_6           (RM_0FAE_REG_5 + 1)
571
#define RM_0FAE_REG_7           (RM_0FAE_REG_6 + 1)
572
 
573
#define PREFIX_90               0
574
#define PREFIX_0F10             (PREFIX_90 + 1)
575
#define PREFIX_0F11             (PREFIX_0F10 + 1)
576
#define PREFIX_0F12             (PREFIX_0F11 + 1)
577
#define PREFIX_0F16             (PREFIX_0F12 + 1)
578
#define PREFIX_0F2A             (PREFIX_0F16 + 1)
579
#define PREFIX_0F2B             (PREFIX_0F2A + 1)
580
#define PREFIX_0F2C             (PREFIX_0F2B + 1)
581
#define PREFIX_0F2D             (PREFIX_0F2C + 1)
582
#define PREFIX_0F2E             (PREFIX_0F2D + 1)
583
#define PREFIX_0F2F             (PREFIX_0F2E + 1)
584
#define PREFIX_0F51             (PREFIX_0F2F + 1)
585
#define PREFIX_0F52             (PREFIX_0F51 + 1)
586
#define PREFIX_0F53             (PREFIX_0F52 + 1)
587
#define PREFIX_0F58             (PREFIX_0F53 + 1)
588
#define PREFIX_0F59             (PREFIX_0F58 + 1)
589
#define PREFIX_0F5A             (PREFIX_0F59 + 1)
590
#define PREFIX_0F5B             (PREFIX_0F5A + 1)
591
#define PREFIX_0F5C             (PREFIX_0F5B + 1)
592
#define PREFIX_0F5D             (PREFIX_0F5C + 1)
593
#define PREFIX_0F5E             (PREFIX_0F5D + 1)
594
#define PREFIX_0F5F             (PREFIX_0F5E + 1)
595
#define PREFIX_0F60             (PREFIX_0F5F + 1)
596
#define PREFIX_0F61             (PREFIX_0F60 + 1)
597
#define PREFIX_0F62             (PREFIX_0F61 + 1)
598
#define PREFIX_0F6C             (PREFIX_0F62 + 1)
599
#define PREFIX_0F6D             (PREFIX_0F6C + 1)
600
#define PREFIX_0F6F             (PREFIX_0F6D + 1)
601
#define PREFIX_0F70             (PREFIX_0F6F + 1)
602
#define PREFIX_0F73_REG_3       (PREFIX_0F70 + 1)
603
#define PREFIX_0F73_REG_7       (PREFIX_0F73_REG_3 + 1)
604
#define PREFIX_0F78             (PREFIX_0F73_REG_7 + 1)
605
#define PREFIX_0F79             (PREFIX_0F78 + 1)
606
#define PREFIX_0F7C             (PREFIX_0F79 + 1)
607
#define PREFIX_0F7D             (PREFIX_0F7C + 1)
608
#define PREFIX_0F7E             (PREFIX_0F7D + 1)
609
#define PREFIX_0F7F             (PREFIX_0F7E + 1)
610
#define PREFIX_0FB8             (PREFIX_0F7F + 1)
611
#define PREFIX_0FBD             (PREFIX_0FB8 + 1)
612
#define PREFIX_0FC2             (PREFIX_0FBD + 1)
613
#define PREFIX_0FC3             (PREFIX_0FC2 + 1)
614
#define PREFIX_0FC7_REG_6       (PREFIX_0FC3 + 1)
615
#define PREFIX_0FD0             (PREFIX_0FC7_REG_6 + 1)
616
#define PREFIX_0FD6             (PREFIX_0FD0 + 1)
617
#define PREFIX_0FE6             (PREFIX_0FD6 + 1)
618
#define PREFIX_0FE7             (PREFIX_0FE6 + 1)
619
#define PREFIX_0FF0             (PREFIX_0FE7 + 1)
620
#define PREFIX_0FF7             (PREFIX_0FF0 + 1)
621
#define PREFIX_0F3810           (PREFIX_0FF7 + 1)
622
#define PREFIX_0F3814           (PREFIX_0F3810 + 1)
623
#define PREFIX_0F3815           (PREFIX_0F3814 + 1)
624
#define PREFIX_0F3817           (PREFIX_0F3815 + 1)
625
#define PREFIX_0F3820           (PREFIX_0F3817 + 1)
626
#define PREFIX_0F3821           (PREFIX_0F3820 + 1)
627
#define PREFIX_0F3822           (PREFIX_0F3821 + 1)
628
#define PREFIX_0F3823           (PREFIX_0F3822 + 1)
629
#define PREFIX_0F3824           (PREFIX_0F3823 + 1)
630
#define PREFIX_0F3825           (PREFIX_0F3824 + 1)
631
#define PREFIX_0F3828           (PREFIX_0F3825 + 1)
632
#define PREFIX_0F3829           (PREFIX_0F3828 + 1)
633
#define PREFIX_0F382A           (PREFIX_0F3829 + 1)
634
#define PREFIX_0F382B           (PREFIX_0F382A + 1)
635
#define PREFIX_0F3830           (PREFIX_0F382B + 1)
636
#define PREFIX_0F3831           (PREFIX_0F3830 + 1)
637
#define PREFIX_0F3832           (PREFIX_0F3831 + 1)
638
#define PREFIX_0F3833           (PREFIX_0F3832 + 1)
639
#define PREFIX_0F3834           (PREFIX_0F3833 + 1)
640
#define PREFIX_0F3835           (PREFIX_0F3834 + 1)
641
#define PREFIX_0F3837           (PREFIX_0F3835 + 1)
642
#define PREFIX_0F3838           (PREFIX_0F3837 + 1)
643
#define PREFIX_0F3839           (PREFIX_0F3838 + 1)
644
#define PREFIX_0F383A           (PREFIX_0F3839 + 1)
645
#define PREFIX_0F383B           (PREFIX_0F383A + 1)
646
#define PREFIX_0F383C           (PREFIX_0F383B + 1)
647
#define PREFIX_0F383D           (PREFIX_0F383C + 1)
648
#define PREFIX_0F383E           (PREFIX_0F383D + 1)
649
#define PREFIX_0F383F           (PREFIX_0F383E + 1)
650
#define PREFIX_0F3840           (PREFIX_0F383F + 1)
651
#define PREFIX_0F3841           (PREFIX_0F3840 + 1)
652
#define PREFIX_0F38F0           (PREFIX_0F3841 + 1)
653
#define PREFIX_0F38F1           (PREFIX_0F38F0 + 1)
654
#define PREFIX_0F3A08           (PREFIX_0F38F1 + 1)
655
#define PREFIX_0F3A09           (PREFIX_0F3A08 + 1)
656
#define PREFIX_0F3A0A           (PREFIX_0F3A09 + 1)
657
#define PREFIX_0F3A0B           (PREFIX_0F3A0A + 1)
658
#define PREFIX_0F3A0C           (PREFIX_0F3A0B + 1)
659
#define PREFIX_0F3A0D           (PREFIX_0F3A0C + 1)
660
#define PREFIX_0F3A0E           (PREFIX_0F3A0D + 1)
661
#define PREFIX_0F3A14           (PREFIX_0F3A0E + 1)
662
#define PREFIX_0F3A15           (PREFIX_0F3A14 + 1)
663
#define PREFIX_0F3A16           (PREFIX_0F3A15 + 1)
664
#define PREFIX_0F3A17           (PREFIX_0F3A16 + 1)
665
#define PREFIX_0F3A20           (PREFIX_0F3A17 + 1)
666
#define PREFIX_0F3A21           (PREFIX_0F3A20 + 1)
667
#define PREFIX_0F3A22           (PREFIX_0F3A21 + 1)
668
#define PREFIX_0F3A40           (PREFIX_0F3A22 + 1)
669
#define PREFIX_0F3A41           (PREFIX_0F3A40 + 1)
670
#define PREFIX_0F3A42           (PREFIX_0F3A41 + 1)
671
#define PREFIX_0F3A60           (PREFIX_0F3A42 + 1)
672
#define PREFIX_0F3A61           (PREFIX_0F3A60 + 1)
673
#define PREFIX_0F3A62           (PREFIX_0F3A61 + 1)
674
#define PREFIX_0F3A63           (PREFIX_0F3A62 + 1)
675
 
676
#define X86_64_06               0
677
#define X86_64_07               (X86_64_06 + 1)
678
#define X86_64_0D               (X86_64_07 + 1)
679
#define X86_64_16               (X86_64_0D + 1)
680
#define X86_64_17               (X86_64_16 + 1)
681
#define X86_64_1E               (X86_64_17 + 1)
682
#define X86_64_1F               (X86_64_1E + 1)
683
#define X86_64_27               (X86_64_1F + 1)
684
#define X86_64_2F               (X86_64_27 + 1)
685
#define X86_64_37               (X86_64_2F + 1)
686
#define X86_64_3F               (X86_64_37 + 1)
687
#define X86_64_60               (X86_64_3F + 1)
688
#define X86_64_61               (X86_64_60 + 1)
689
#define X86_64_62               (X86_64_61 + 1)
690
#define X86_64_63               (X86_64_62 + 1)
691
#define X86_64_6D               (X86_64_63 + 1)
692
#define X86_64_6F               (X86_64_6D + 1)
693
#define X86_64_9A               (X86_64_6F + 1)
694
#define X86_64_C4               (X86_64_9A + 1)
695
#define X86_64_C5               (X86_64_C4 + 1)
696
#define X86_64_CE               (X86_64_C5 + 1)
697
#define X86_64_D4               (X86_64_CE + 1)
698
#define X86_64_D5               (X86_64_D4 + 1)
699
#define X86_64_EA               (X86_64_D5 + 1)
700
#define X86_64_0F01_REG_0       (X86_64_EA + 1)
701
#define X86_64_0F01_REG_1       (X86_64_0F01_REG_0 + 1)
702
#define X86_64_0F01_REG_2       (X86_64_0F01_REG_1 + 1)
703
#define X86_64_0F01_REG_3       (X86_64_0F01_REG_2 + 1)
704
 
705
#define THREE_BYTE_0F24         0
706
#define THREE_BYTE_0F25         (THREE_BYTE_0F24 + 1)
707
#define THREE_BYTE_0F38         (THREE_BYTE_0F25 + 1)
708
#define THREE_BYTE_0F3A         (THREE_BYTE_0F38 + 1)
709
#define THREE_BYTE_0F7A         (THREE_BYTE_0F3A + 1)
710
#define THREE_BYTE_0F7B         (THREE_BYTE_0F7A + 1)
711
 
712
typedef void (*op_rtn) (int bytemode, int sizeflag);
713
 
714
struct dis386 {
715
  const char *name;
716
  struct
717
    {
718
      op_rtn rtn;
719
      int bytemode;
720
    } op[MAX_OPERANDS];
721
};
722
 
723
/* Upper case letters in the instruction names here are macros.
724
   'A' => print 'b' if no register operands or suffix_always is true
725
   'B' => print 'b' if suffix_always is true
726
   'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
727
          size prefix
728
   'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
729
          suffix_always is true
730
   'E' => print 'e' if 32-bit form of jcxz
731
   'F' => print 'w' or 'l' depending on address size prefix (loop insns)
732
   'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
733
   'H' => print ",pt" or ",pn" branch hint
734
   'I' => honor following macro letter even in Intel mode (implemented only
735
          for some of the macro letters)
736
   'J' => print 'l'
737
   'K' => print 'd' or 'q' if rex prefix is present.
738
   'L' => print 'l' if suffix_always is true
739
   'M' => print 'r' if intel_mnemonic is false.
740
   'N' => print 'n' if instruction has no wait "prefix"
741
   'O' => print 'd' or 'o' (or 'q' in Intel mode)
742
   'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
743
          or suffix_always is true.  print 'q' if rex prefix is present.
744
   'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
745
          is true
746
   'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
747
   'S' => print 'w', 'l' or 'q' if suffix_always is true
748
   'T' => print 'q' in 64bit mode and behave as 'P' otherwise
749
   'U' => print 'q' in 64bit mode and behave as 'Q' otherwise
750
   'V' => print 'q' in 64bit mode and behave as 'S' otherwise
751
   'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
752
   'X' => print 's', 'd' depending on data16 prefix (for XMM)
753
   'Y' => 'q' if instruction has an REX 64bit overwrite prefix and
754
          suffix_always is true.
755
   'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
756
   '!' => change condition from true to false or from false to true.
757
   '%' => add 1 upper case letter to the macro.
758
 
759
   2 upper case letter macros:
760
   'LQ' => print 'l' ('d' in Intel mode) or 'q' for memory operand
761
           or suffix_always is true
762
 
763
   Many of the above letters print nothing in Intel mode.  See "putop"
764
   for the details.
765
 
766
   Braces '{' and '}', and vertical bars '|', indicate alternative
767
   mnemonic strings for AT&T and Intel.  */
768
 
769
static const struct dis386 dis386[] = {
770
  /* 00 */
771
  { "addB",             { Eb, Gb } },
772
  { "addS",             { Ev, Gv } },
773
  { "addB",             { Gb, Eb } },
774
  { "addS",             { Gv, Ev } },
775
  { "addB",             { AL, Ib } },
776
  { "addS",             { eAX, Iv } },
777
  { X86_64_TABLE (X86_64_06) },
778
  { X86_64_TABLE (X86_64_07) },
779
  /* 08 */
780
  { "orB",              { Eb, Gb } },
781
  { "orS",              { Ev, Gv } },
782
  { "orB",              { Gb, Eb } },
783
  { "orS",              { Gv, Ev } },
784
  { "orB",              { AL, Ib } },
785
  { "orS",              { eAX, Iv } },
786
  { X86_64_TABLE (X86_64_0D) },
787
  { "(bad)",            { XX } },       /* 0x0f extended opcode escape */
788
  /* 10 */
789
  { "adcB",             { Eb, Gb } },
790
  { "adcS",             { Ev, Gv } },
791
  { "adcB",             { Gb, Eb } },
792
  { "adcS",             { Gv, Ev } },
793
  { "adcB",             { AL, Ib } },
794
  { "adcS",             { eAX, Iv } },
795
  { X86_64_TABLE (X86_64_16) },
796
  { X86_64_TABLE (X86_64_17) },
797
  /* 18 */
798
  { "sbbB",             { Eb, Gb } },
799
  { "sbbS",             { Ev, Gv } },
800
  { "sbbB",             { Gb, Eb } },
801
  { "sbbS",             { Gv, Ev } },
802
  { "sbbB",             { AL, Ib } },
803
  { "sbbS",             { eAX, Iv } },
804
  { X86_64_TABLE (X86_64_1E) },
805
  { X86_64_TABLE (X86_64_1F) },
806
  /* 20 */
807
  { "andB",             { Eb, Gb } },
808
  { "andS",             { Ev, Gv } },
809
  { "andB",             { Gb, Eb } },
810
  { "andS",             { Gv, Ev } },
811
  { "andB",             { AL, Ib } },
812
  { "andS",             { eAX, Iv } },
813
  { "(bad)",            { XX } },       /* SEG ES prefix */
814
  { X86_64_TABLE (X86_64_27) },
815
  /* 28 */
816
  { "subB",             { Eb, Gb } },
817
  { "subS",             { Ev, Gv } },
818
  { "subB",             { Gb, Eb } },
819
  { "subS",             { Gv, Ev } },
820
  { "subB",             { AL, Ib } },
821
  { "subS",             { eAX, Iv } },
822
  { "(bad)",            { XX } },       /* SEG CS prefix */
823
  { X86_64_TABLE (X86_64_2F) },
824
  /* 30 */
825
  { "xorB",             { Eb, Gb } },
826
  { "xorS",             { Ev, Gv } },
827
  { "xorB",             { Gb, Eb } },
828
  { "xorS",             { Gv, Ev } },
829
  { "xorB",             { AL, Ib } },
830
  { "xorS",             { eAX, Iv } },
831
  { "(bad)",            { XX } },       /* SEG SS prefix */
832
  { X86_64_TABLE (X86_64_37) },
833
  /* 38 */
834
  { "cmpB",             { Eb, Gb } },
835
  { "cmpS",             { Ev, Gv } },
836
  { "cmpB",             { Gb, Eb } },
837
  { "cmpS",             { Gv, Ev } },
838
  { "cmpB",             { AL, Ib } },
839
  { "cmpS",             { eAX, Iv } },
840
  { "(bad)",            { XX } },       /* SEG DS prefix */
841
  { X86_64_TABLE (X86_64_3F) },
842
  /* 40 */
843
  { "inc{S|}",          { RMeAX } },
844
  { "inc{S|}",          { RMeCX } },
845
  { "inc{S|}",          { RMeDX } },
846
  { "inc{S|}",          { RMeBX } },
847
  { "inc{S|}",          { RMeSP } },
848
  { "inc{S|}",          { RMeBP } },
849
  { "inc{S|}",          { RMeSI } },
850
  { "inc{S|}",          { RMeDI } },
851
  /* 48 */
852
  { "dec{S|}",          { RMeAX } },
853
  { "dec{S|}",          { RMeCX } },
854
  { "dec{S|}",          { RMeDX } },
855
  { "dec{S|}",          { RMeBX } },
856
  { "dec{S|}",          { RMeSP } },
857
  { "dec{S|}",          { RMeBP } },
858
  { "dec{S|}",          { RMeSI } },
859
  { "dec{S|}",          { RMeDI } },
860
  /* 50 */
861
  { "pushV",            { RMrAX } },
862
  { "pushV",            { RMrCX } },
863
  { "pushV",            { RMrDX } },
864
  { "pushV",            { RMrBX } },
865
  { "pushV",            { RMrSP } },
866
  { "pushV",            { RMrBP } },
867
  { "pushV",            { RMrSI } },
868
  { "pushV",            { RMrDI } },
869
  /* 58 */
870
  { "popV",             { RMrAX } },
871
  { "popV",             { RMrCX } },
872
  { "popV",             { RMrDX } },
873
  { "popV",             { RMrBX } },
874
  { "popV",             { RMrSP } },
875
  { "popV",             { RMrBP } },
876
  { "popV",             { RMrSI } },
877
  { "popV",             { RMrDI } },
878
  /* 60 */
879
  { X86_64_TABLE (X86_64_60) },
880
  { X86_64_TABLE (X86_64_61) },
881
  { X86_64_TABLE (X86_64_62) },
882
  { X86_64_TABLE (X86_64_63) },
883
  { "(bad)",            { XX } },       /* seg fs */
884
  { "(bad)",            { XX } },       /* seg gs */
885
  { "(bad)",            { XX } },       /* op size prefix */
886
  { "(bad)",            { XX } },       /* adr size prefix */
887
  /* 68 */
888
  { "pushT",            { Iq } },
889
  { "imulS",            { Gv, Ev, Iv } },
890
  { "pushT",            { sIb } },
891
  { "imulS",            { Gv, Ev, sIb } },
892
  { "ins{b|}",          { Ybr, indirDX } },
893
  { X86_64_TABLE (X86_64_6D) },
894
  { "outs{b|}",         { indirDXr, Xb } },
895
  { X86_64_TABLE (X86_64_6F) },
896
  /* 70 */
897
  { "joH",              { Jb, XX, cond_jump_flag } },
898
  { "jnoH",             { Jb, XX, cond_jump_flag } },
899
  { "jbH",              { Jb, XX, cond_jump_flag } },
900
  { "jaeH",             { Jb, XX, cond_jump_flag } },
901
  { "jeH",              { Jb, XX, cond_jump_flag } },
902
  { "jneH",             { Jb, XX, cond_jump_flag } },
903
  { "jbeH",             { Jb, XX, cond_jump_flag } },
904
  { "jaH",              { Jb, XX, cond_jump_flag } },
905
  /* 78 */
906
  { "jsH",              { Jb, XX, cond_jump_flag } },
907
  { "jnsH",             { Jb, XX, cond_jump_flag } },
908
  { "jpH",              { Jb, XX, cond_jump_flag } },
909
  { "jnpH",             { Jb, XX, cond_jump_flag } },
910
  { "jlH",              { Jb, XX, cond_jump_flag } },
911
  { "jgeH",             { Jb, XX, cond_jump_flag } },
912
  { "jleH",             { Jb, XX, cond_jump_flag } },
913
  { "jgH",              { Jb, XX, cond_jump_flag } },
914
  /* 80 */
915
  { REG_TABLE (REG_80) },
916
  { REG_TABLE (REG_81) },
917
  { "(bad)",            { XX } },
918
  { REG_TABLE (REG_82) },
919
  { "testB",            { Eb, Gb } },
920
  { "testS",            { Ev, Gv } },
921
  { "xchgB",            { Eb, Gb } },
922
  { "xchgS",            { Ev, Gv } },
923
  /* 88 */
924
  { "movB",             { Eb, Gb } },
925
  { "movS",             { Ev, Gv } },
926
  { "movB",             { Gb, Eb } },
927
  { "movS",             { Gv, Ev } },
928
  { "movD",             { Sv, Sw } },
929
  { MOD_TABLE (MOD_8D) },
930
  { "movD",             { Sw, Sv } },
931
  { REG_TABLE (REG_8F) },
932
  /* 90 */
933
  { PREFIX_TABLE (PREFIX_90) },
934
  { "xchgS",            { RMeCX, eAX } },
935
  { "xchgS",            { RMeDX, eAX } },
936
  { "xchgS",            { RMeBX, eAX } },
937
  { "xchgS",            { RMeSP, eAX } },
938
  { "xchgS",            { RMeBP, eAX } },
939
  { "xchgS",            { RMeSI, eAX } },
940
  { "xchgS",            { RMeDI, eAX } },
941
  /* 98 */
942
  { "cW{t|}R",          { XX } },
943
  { "cR{t|}O",          { XX } },
944
  { X86_64_TABLE (X86_64_9A) },
945
  { "(bad)",            { XX } },       /* fwait */
946
  { "pushfT",           { XX } },
947
  { "popfT",            { XX } },
948
  { "sahf",             { XX } },
949
  { "lahf",             { XX } },
950
  /* a0 */
951
  { "movB",             { AL, Ob } },
952
  { "movS",             { eAX, Ov } },
953
  { "movB",             { Ob, AL } },
954
  { "movS",             { Ov, eAX } },
955
  { "movs{b|}",         { Ybr, Xb } },
956
  { "movs{R|}",         { Yvr, Xv } },
957
  { "cmps{b|}",         { Xb, Yb } },
958
  { "cmps{R|}",         { Xv, Yv } },
959
  /* a8 */
960
  { "testB",            { AL, Ib } },
961
  { "testS",            { eAX, Iv } },
962
  { "stosB",            { Ybr, AL } },
963
  { "stosS",            { Yvr, eAX } },
964
  { "lodsB",            { ALr, Xb } },
965
  { "lodsS",            { eAXr, Xv } },
966
  { "scasB",            { AL, Yb } },
967
  { "scasS",            { eAX, Yv } },
968
  /* b0 */
969
  { "movB",             { RMAL, Ib } },
970
  { "movB",             { RMCL, Ib } },
971
  { "movB",             { RMDL, Ib } },
972
  { "movB",             { RMBL, Ib } },
973
  { "movB",             { RMAH, Ib } },
974
  { "movB",             { RMCH, Ib } },
975
  { "movB",             { RMDH, Ib } },
976
  { "movB",             { RMBH, Ib } },
977
  /* b8 */
978
  { "movS",             { RMeAX, Iv64 } },
979
  { "movS",             { RMeCX, Iv64 } },
980
  { "movS",             { RMeDX, Iv64 } },
981
  { "movS",             { RMeBX, Iv64 } },
982
  { "movS",             { RMeSP, Iv64 } },
983
  { "movS",             { RMeBP, Iv64 } },
984
  { "movS",             { RMeSI, Iv64 } },
985
  { "movS",             { RMeDI, Iv64 } },
986
  /* c0 */
987
  { REG_TABLE (REG_C0) },
988
  { REG_TABLE (REG_C1) },
989
  { "retT",             { Iw } },
990
  { "retT",             { XX } },
991
  { X86_64_TABLE (X86_64_C4) },
992
  { X86_64_TABLE (X86_64_C5) },
993
  { REG_TABLE (REG_C6) },
994
  { REG_TABLE (REG_C7) },
995
  /* c8 */
996
  { "enterT",           { Iw, Ib } },
997
  { "leaveT",           { XX } },
998
  { "lretP",            { Iw } },
999
  { "lretP",            { XX } },
1000
  { "int3",             { XX } },
1001
  { "int",              { Ib } },
1002
  { X86_64_TABLE (X86_64_CE) },
1003
  { "iretP",            { XX } },
1004
  /* d0 */
1005
  { REG_TABLE (REG_D0) },
1006
  { REG_TABLE (REG_D1) },
1007
  { REG_TABLE (REG_D2) },
1008
  { REG_TABLE (REG_D3) },
1009
  { X86_64_TABLE (X86_64_D4) },
1010
  { X86_64_TABLE (X86_64_D5) },
1011
  { "(bad)",            { XX } },
1012
  { "xlat",             { DSBX } },
1013
  /* d8 */
1014
  { FLOAT },
1015
  { FLOAT },
1016
  { FLOAT },
1017
  { FLOAT },
1018
  { FLOAT },
1019
  { FLOAT },
1020
  { FLOAT },
1021
  { FLOAT },
1022
  /* e0 */
1023
  { "loopneFH",         { Jb, XX, loop_jcxz_flag } },
1024
  { "loopeFH",          { Jb, XX, loop_jcxz_flag } },
1025
  { "loopFH",           { Jb, XX, loop_jcxz_flag } },
1026
  { "jEcxzH",           { Jb, XX, loop_jcxz_flag } },
1027
  { "inB",              { AL, Ib } },
1028
  { "inG",              { zAX, Ib } },
1029
  { "outB",             { Ib, AL } },
1030
  { "outG",             { Ib, zAX } },
1031
  /* e8 */
1032
  { "callT",            { Jv } },
1033
  { "jmpT",             { Jv } },
1034
  { X86_64_TABLE (X86_64_EA) },
1035
  { "jmp",              { Jb } },
1036
  { "inB",              { AL, indirDX } },
1037
  { "inG",              { zAX, indirDX } },
1038
  { "outB",             { indirDX, AL } },
1039
  { "outG",             { indirDX, zAX } },
1040
  /* f0 */
1041
  { "(bad)",            { XX } },       /* lock prefix */
1042
  { "icebp",            { XX } },
1043
  { "(bad)",            { XX } },       /* repne */
1044
  { "(bad)",            { XX } },       /* repz */
1045
  { "hlt",              { XX } },
1046
  { "cmc",              { XX } },
1047
  { REG_TABLE (REG_F6) },
1048
  { REG_TABLE (REG_F7) },
1049
  /* f8 */
1050
  { "clc",              { XX } },
1051
  { "stc",              { XX } },
1052
  { "cli",              { XX } },
1053
  { "sti",              { XX } },
1054
  { "cld",              { XX } },
1055
  { "std",              { XX } },
1056
  { REG_TABLE (REG_FE) },
1057
  { REG_TABLE (REG_FF) },
1058
};
1059
 
1060
static const struct dis386 dis386_twobyte[] = {
1061
  /* 00 */
1062
  { REG_TABLE (REG_0F00 ) },
1063
  { REG_TABLE (REG_0F01 ) },
1064
  { "larS",             { Gv, Ew } },
1065
  { "lslS",             { Gv, Ew } },
1066
  { "(bad)",            { XX } },
1067
  { "syscall",          { XX } },
1068
  { "clts",             { XX } },
1069
  { "sysretP",          { XX } },
1070
  /* 08 */
1071
  { "invd",             { XX } },
1072
  { "wbinvd",           { XX } },
1073
  { "(bad)",            { XX } },
1074
  { "ud2a",             { XX } },
1075
  { "(bad)",            { XX } },
1076
  { REG_TABLE (REG_0F0D) },
1077
  { "femms",            { XX } },
1078
  { "",                 { MX, EM, OPSUF } }, /* See OP_3DNowSuffix.  */
1079
  /* 10 */
1080
  { PREFIX_TABLE (PREFIX_0F10) },
1081
  { PREFIX_TABLE (PREFIX_0F11) },
1082
  { PREFIX_TABLE (PREFIX_0F12) },
1083
  { MOD_TABLE (MOD_0F13) },
1084
  { "unpcklpX",         { XM, EXx } },
1085
  { "unpckhpX",         { XM, EXx } },
1086
  { PREFIX_TABLE (PREFIX_0F16) },
1087
  { MOD_TABLE (MOD_0F17) },
1088
  /* 18 */
1089
  { REG_TABLE (REG_0F18) },
1090
  { "nopQ",             { Ev } },
1091
  { "nopQ",             { Ev } },
1092
  { "nopQ",             { Ev } },
1093
  { "nopQ",             { Ev } },
1094
  { "nopQ",             { Ev } },
1095
  { "nopQ",             { Ev } },
1096
  { "nopQ",             { Ev } },
1097
  /* 20 */
1098
  { MOD_TABLE (MOD_0F20) },
1099
  { MOD_TABLE (MOD_0F21) },
1100
  { MOD_TABLE (MOD_0F22) },
1101
  { MOD_TABLE (MOD_0F23) },
1102
  { MOD_TABLE (MOD_0F24) },
1103
  { THREE_BYTE_TABLE (THREE_BYTE_0F25) },
1104
  { MOD_TABLE (MOD_0F26) },
1105
  { "(bad)",            { XX } },
1106
  /* 28 */
1107
  { "movapX",           { XM, EXx } },
1108
  { "movapX",           { EXx, XM } },
1109
  { PREFIX_TABLE (PREFIX_0F2A) },
1110
  { PREFIX_TABLE (PREFIX_0F2B) },
1111
  { PREFIX_TABLE (PREFIX_0F2C) },
1112
  { PREFIX_TABLE (PREFIX_0F2D) },
1113
  { PREFIX_TABLE (PREFIX_0F2E) },
1114
  { PREFIX_TABLE (PREFIX_0F2F) },
1115
  /* 30 */
1116
  { "wrmsr",            { XX } },
1117
  { "rdtsc",            { XX } },
1118
  { "rdmsr",            { XX } },
1119
  { "rdpmc",            { XX } },
1120
  { "sysenter",         { XX } },
1121
  { "sysexit",          { XX } },
1122
  { "(bad)",            { XX } },
1123
  { "getsec",           { XX } },
1124
  /* 38 */
1125
  { THREE_BYTE_TABLE (THREE_BYTE_0F38) },
1126
  { "(bad)",            { XX } },
1127
  { THREE_BYTE_TABLE (THREE_BYTE_0F3A) },
1128
  { "(bad)",            { XX } },
1129
  { "(bad)",            { XX } },
1130
  { "(bad)",            { XX } },
1131
  { "(bad)",            { XX } },
1132
  { "(bad)",            { XX } },
1133
  /* 40 */
1134
  { "cmovo",            { Gv, Ev } },
1135
  { "cmovno",           { Gv, Ev } },
1136
  { "cmovb",            { Gv, Ev } },
1137
  { "cmovae",           { Gv, Ev } },
1138
  { "cmove",            { Gv, Ev } },
1139
  { "cmovne",           { Gv, Ev } },
1140
  { "cmovbe",           { Gv, Ev } },
1141
  { "cmova",            { Gv, Ev } },
1142
  /* 48 */
1143
  { "cmovs",            { Gv, Ev } },
1144
  { "cmovns",           { Gv, Ev } },
1145
  { "cmovp",            { Gv, Ev } },
1146
  { "cmovnp",           { Gv, Ev } },
1147
  { "cmovl",            { Gv, Ev } },
1148
  { "cmovge",           { Gv, Ev } },
1149
  { "cmovle",           { Gv, Ev } },
1150
  { "cmovg",            { Gv, Ev } },
1151
  /* 50 */
1152
  { MOD_TABLE (MOD_0F51) },
1153
  { PREFIX_TABLE (PREFIX_0F51) },
1154
  { PREFIX_TABLE (PREFIX_0F52) },
1155
  { PREFIX_TABLE (PREFIX_0F53) },
1156
  { "andpX",            { XM, EXx } },
1157
  { "andnpX",           { XM, EXx } },
1158
  { "orpX",             { XM, EXx } },
1159
  { "xorpX",            { XM, EXx } },
1160
  /* 58 */
1161
  { PREFIX_TABLE (PREFIX_0F58) },
1162
  { PREFIX_TABLE (PREFIX_0F59) },
1163
  { PREFIX_TABLE (PREFIX_0F5A) },
1164
  { PREFIX_TABLE (PREFIX_0F5B) },
1165
  { PREFIX_TABLE (PREFIX_0F5C) },
1166
  { PREFIX_TABLE (PREFIX_0F5D) },
1167
  { PREFIX_TABLE (PREFIX_0F5E) },
1168
  { PREFIX_TABLE (PREFIX_0F5F) },
1169
  /* 60 */
1170
  { PREFIX_TABLE (PREFIX_0F60) },
1171
  { PREFIX_TABLE (PREFIX_0F61) },
1172
  { PREFIX_TABLE (PREFIX_0F62) },
1173
  { "packsswb",         { MX, EM } },
1174
  { "pcmpgtb",          { MX, EM } },
1175
  { "pcmpgtw",          { MX, EM } },
1176
  { "pcmpgtd",          { MX, EM } },
1177
  { "packuswb",         { MX, EM } },
1178
  /* 68 */
1179
  { "punpckhbw",        { MX, EM } },
1180
  { "punpckhwd",        { MX, EM } },
1181
  { "punpckhdq",        { MX, EM } },
1182
  { "packssdw",         { MX, EM } },
1183
  { PREFIX_TABLE (PREFIX_0F6C) },
1184
  { PREFIX_TABLE (PREFIX_0F6D) },
1185
  { "movK",             { MX, Edq } },
1186
  { PREFIX_TABLE (PREFIX_0F6F) },
1187
  /* 70 */
1188
  { PREFIX_TABLE (PREFIX_0F70) },
1189
  { REG_TABLE (REG_0F71) },
1190
  { REG_TABLE (REG_0F72) },
1191
  { REG_TABLE (REG_0F73) },
1192
  { "pcmpeqb",          { MX, EM } },
1193
  { "pcmpeqw",          { MX, EM } },
1194
  { "pcmpeqd",          { MX, EM } },
1195
  { "emms",             { XX } },
1196
  /* 78 */
1197
  { PREFIX_TABLE (PREFIX_0F78) },
1198
  { PREFIX_TABLE (PREFIX_0F79) },
1199
  { THREE_BYTE_TABLE (THREE_BYTE_0F7A) },
1200
  { THREE_BYTE_TABLE (THREE_BYTE_0F7B) },
1201
  { PREFIX_TABLE (PREFIX_0F7C) },
1202
  { PREFIX_TABLE (PREFIX_0F7D) },
1203
  { PREFIX_TABLE (PREFIX_0F7E) },
1204
  { PREFIX_TABLE (PREFIX_0F7F) },
1205
  /* 80 */
1206
  { "joH",              { Jv, XX, cond_jump_flag } },
1207
  { "jnoH",             { Jv, XX, cond_jump_flag } },
1208
  { "jbH",              { Jv, XX, cond_jump_flag } },
1209
  { "jaeH",             { Jv, XX, cond_jump_flag } },
1210
  { "jeH",              { Jv, XX, cond_jump_flag } },
1211
  { "jneH",             { Jv, XX, cond_jump_flag } },
1212
  { "jbeH",             { Jv, XX, cond_jump_flag } },
1213
  { "jaH",              { Jv, XX, cond_jump_flag } },
1214
  /* 88 */
1215
  { "jsH",              { Jv, XX, cond_jump_flag } },
1216
  { "jnsH",             { Jv, XX, cond_jump_flag } },
1217
  { "jpH",              { Jv, XX, cond_jump_flag } },
1218
  { "jnpH",             { Jv, XX, cond_jump_flag } },
1219
  { "jlH",              { Jv, XX, cond_jump_flag } },
1220
  { "jgeH",             { Jv, XX, cond_jump_flag } },
1221
  { "jleH",             { Jv, XX, cond_jump_flag } },
1222
  { "jgH",              { Jv, XX, cond_jump_flag } },
1223
  /* 90 */
1224
  { "seto",             { Eb } },
1225
  { "setno",            { Eb } },
1226
  { "setb",             { Eb } },
1227
  { "setae",            { Eb } },
1228
  { "sete",             { Eb } },
1229
  { "setne",            { Eb } },
1230
  { "setbe",            { Eb } },
1231
  { "seta",             { Eb } },
1232
  /* 98 */
1233
  { "sets",             { Eb } },
1234
  { "setns",            { Eb } },
1235
  { "setp",             { Eb } },
1236
  { "setnp",            { Eb } },
1237
  { "setl",             { Eb } },
1238
  { "setge",            { Eb } },
1239
  { "setle",            { Eb } },
1240
  { "setg",             { Eb } },
1241
  /* a0 */
1242
  { "pushT",            { fs } },
1243
  { "popT",             { fs } },
1244
  { "cpuid",            { XX } },
1245
  { "btS",              { Ev, Gv } },
1246
  { "shldS",            { Ev, Gv, Ib } },
1247
  { "shldS",            { Ev, Gv, CL } },
1248
  { REG_TABLE (REG_0FA6) },
1249
  { REG_TABLE (REG_0FA7) },
1250
  /* a8 */
1251
  { "pushT",            { gs } },
1252
  { "popT",             { gs } },
1253
  { "rsm",              { XX } },
1254
  { "btsS",             { Ev, Gv } },
1255
  { "shrdS",            { Ev, Gv, Ib } },
1256
  { "shrdS",            { Ev, Gv, CL } },
1257
  { REG_TABLE (REG_0FAE) },
1258
  { "imulS",            { Gv, Ev } },
1259
  /* b0 */
1260
  { "cmpxchgB",         { Eb, Gb } },
1261
  { "cmpxchgS",         { Ev, Gv } },
1262
  { MOD_TABLE (MOD_0FB2) },
1263
  { "btrS",             { Ev, Gv } },
1264
  { MOD_TABLE (MOD_0FB4) },
1265
  { MOD_TABLE (MOD_0FB5) },
1266
  { "movz{bR|x}",       { Gv, Eb } },
1267
  { "movz{wR|x}",       { Gv, Ew } }, /* yes, there really is movzww ! */
1268
  /* b8 */
1269
  { PREFIX_TABLE (PREFIX_0FB8) },
1270
  { "ud2b",             { XX } },
1271
  { REG_TABLE (REG_0FBA) },
1272
  { "btcS",             { Ev, Gv } },
1273
  { "bsfS",             { Gv, Ev } },
1274
  { PREFIX_TABLE (PREFIX_0FBD) },
1275
  { "movs{bR|x}",       { Gv, Eb } },
1276
  { "movs{wR|x}",       { Gv, Ew } }, /* yes, there really is movsww ! */
1277
  /* c0 */
1278
  { "xaddB",            { Eb, Gb } },
1279
  { "xaddS",            { Ev, Gv } },
1280
  { PREFIX_TABLE (PREFIX_0FC2) },
1281
  { PREFIX_TABLE (PREFIX_0FC3) },
1282
  { "pinsrw",           { MX, Edqw, Ib } },
1283
  { "pextrw",           { Gdq, MS, Ib } },
1284
  { "shufpX",           { XM, EXx, Ib } },
1285
  { REG_TABLE (REG_0FC7) },
1286
  /* c8 */
1287
  { "bswap",            { RMeAX } },
1288
  { "bswap",            { RMeCX } },
1289
  { "bswap",            { RMeDX } },
1290
  { "bswap",            { RMeBX } },
1291
  { "bswap",            { RMeSP } },
1292
  { "bswap",            { RMeBP } },
1293
  { "bswap",            { RMeSI } },
1294
  { "bswap",            { RMeDI } },
1295
  /* d0 */
1296
  { PREFIX_TABLE (PREFIX_0FD0) },
1297
  { "psrlw",            { MX, EM } },
1298
  { "psrld",            { MX, EM } },
1299
  { "psrlq",            { MX, EM } },
1300
  { "paddq",            { MX, EM } },
1301
  { "pmullw",           { MX, EM } },
1302
  { PREFIX_TABLE (PREFIX_0FD6) },
1303
  { MOD_TABLE (MOD_0FD7) },
1304
  /* d8 */
1305
  { "psubusb",          { MX, EM } },
1306
  { "psubusw",          { MX, EM } },
1307
  { "pminub",           { MX, EM } },
1308
  { "pand",             { MX, EM } },
1309
  { "paddusb",          { MX, EM } },
1310
  { "paddusw",          { MX, EM } },
1311
  { "pmaxub",           { MX, EM } },
1312
  { "pandn",            { MX, EM } },
1313
  /* e0 */
1314
  { "pavgb",            { MX, EM } },
1315
  { "psraw",            { MX, EM } },
1316
  { "psrad",            { MX, EM } },
1317
  { "pavgw",            { MX, EM } },
1318
  { "pmulhuw",          { MX, EM } },
1319
  { "pmulhw",           { MX, EM } },
1320
  { PREFIX_TABLE (PREFIX_0FE6) },
1321
  { PREFIX_TABLE (PREFIX_0FE7) },
1322
  /* e8 */
1323
  { "psubsb",           { MX, EM } },
1324
  { "psubsw",           { MX, EM } },
1325
  { "pminsw",           { MX, EM } },
1326
  { "por",              { MX, EM } },
1327
  { "paddsb",           { MX, EM } },
1328
  { "paddsw",           { MX, EM } },
1329
  { "pmaxsw",           { MX, EM } },
1330
  { "pxor",             { MX, EM } },
1331
  /* f0 */
1332
  { PREFIX_TABLE (PREFIX_0FF0) },
1333
  { "psllw",            { MX, EM } },
1334
  { "pslld",            { MX, EM } },
1335
  { "psllq",            { MX, EM } },
1336
  { "pmuludq",          { MX, EM } },
1337
  { "pmaddwd",          { MX, EM } },
1338
  { "psadbw",           { MX, EM } },
1339
  { PREFIX_TABLE (PREFIX_0FF7) },
1340
  /* f8 */
1341
  { "psubb",            { MX, EM } },
1342
  { "psubw",            { MX, EM } },
1343
  { "psubd",            { MX, EM } },
1344
  { "psubq",            { MX, EM } },
1345
  { "paddb",            { MX, EM } },
1346
  { "paddw",            { MX, EM } },
1347
  { "paddd",            { MX, EM } },
1348
  { "(bad)",            { XX } },
1349
};
1350
 
1351
static const unsigned char onebyte_has_modrm[256] = {
1352
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1353
  /*       -------------------------------        */
1354
  /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
1355
  /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
1356
  /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
1357
  /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
1358
  /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
1359
  /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
1360
  /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
1361
  /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
1362
  /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
1363
  /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
1364
  /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
1365
  /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
1366
  /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
1367
  /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
1368
  /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
1369
  /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1  /* f0 */
1370
  /*       -------------------------------        */
1371
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1372
};
1373
 
1374
static const unsigned char twobyte_has_modrm[256] = {
1375
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1376
  /*       -------------------------------        */
1377
  /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
1378
  /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
1379
  /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
1380
  /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
1381
  /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
1382
  /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
1383
  /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
1384
  /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
1385
  /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
1386
  /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
1387
  /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
1388
  /* b0 */ 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, /* bf */
1389
  /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
1390
  /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
1391
  /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
1392
  /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0  /* ff */
1393
  /*       -------------------------------        */
1394
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1395
};
1396
 
1397
static char obuf[100];
1398
static char *obufp;
1399
static char scratchbuf[100];
1400
static unsigned char *start_codep;
1401
static unsigned char *insn_codep;
1402
static unsigned char *codep;
1403
static const char *lock_prefix;
1404
static const char *data_prefix;
1405
static const char *addr_prefix;
1406
static const char *repz_prefix;
1407
static const char *repnz_prefix;
1408
static disassemble_info *the_info;
1409
static struct
1410
  {
1411
    int mod;
1412
    int reg;
1413
    int rm;
1414
  }
1415
modrm;
1416
static unsigned char need_modrm;
1417
 
1418
/* If we are accessing mod/rm/reg without need_modrm set, then the
1419
   values are stale.  Hitting this abort likely indicates that you
1420
   need to update onebyte_has_modrm or twobyte_has_modrm.  */
1421
#define MODRM_CHECK  if (!need_modrm) abort ()
1422
 
1423
static const char **names64;
1424
static const char **names32;
1425
static const char **names16;
1426
static const char **names8;
1427
static const char **names8rex;
1428
static const char **names_seg;
1429
static const char *index64;
1430
static const char *index32;
1431
static const char **index16;
1432
 
1433
static const char *intel_names64[] = {
1434
  "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
1435
  "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
1436
};
1437
static const char *intel_names32[] = {
1438
  "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
1439
  "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
1440
};
1441
static const char *intel_names16[] = {
1442
  "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
1443
  "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
1444
};
1445
static const char *intel_names8[] = {
1446
  "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
1447
};
1448
static const char *intel_names8rex[] = {
1449
  "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
1450
  "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
1451
};
1452
static const char *intel_names_seg[] = {
1453
  "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
1454
};
1455
static const char *intel_index64 = "riz";
1456
static const char *intel_index32 = "eiz";
1457
static const char *intel_index16[] = {
1458
  "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
1459
};
1460
 
1461
static const char *att_names64[] = {
1462
  "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
1463
  "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
1464
};
1465
static const char *att_names32[] = {
1466
  "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
1467
  "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
1468
};
1469
static const char *att_names16[] = {
1470
  "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
1471
  "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
1472
};
1473
static const char *att_names8[] = {
1474
  "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
1475
};
1476
static const char *att_names8rex[] = {
1477
  "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
1478
  "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
1479
};
1480
static const char *att_names_seg[] = {
1481
  "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
1482
};
1483
static const char *att_index64 = "%riz";
1484
static const char *att_index32 = "%eiz";
1485
static const char *att_index16[] = {
1486
  "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
1487
};
1488
 
1489
static const struct dis386 reg_table[][8] = {
1490
  /* REG_80 */
1491
  {
1492
    { "addA",   { Eb, Ib } },
1493
    { "orA",    { Eb, Ib } },
1494
    { "adcA",   { Eb, Ib } },
1495
    { "sbbA",   { Eb, Ib } },
1496
    { "andA",   { Eb, Ib } },
1497
    { "subA",   { Eb, Ib } },
1498
    { "xorA",   { Eb, Ib } },
1499
    { "cmpA",   { Eb, Ib } },
1500
  },
1501
  /* REG_81 */
1502
  {
1503
    { "addQ",   { Ev, Iv } },
1504
    { "orQ",    { Ev, Iv } },
1505
    { "adcQ",   { Ev, Iv } },
1506
    { "sbbQ",   { Ev, Iv } },
1507
    { "andQ",   { Ev, Iv } },
1508
    { "subQ",   { Ev, Iv } },
1509
    { "xorQ",   { Ev, Iv } },
1510
    { "cmpQ",   { Ev, Iv } },
1511
  },
1512
  /* REG_82 */
1513
  {
1514
    { "addQ",   { Ev, sIb } },
1515
    { "orQ",    { Ev, sIb } },
1516
    { "adcQ",   { Ev, sIb } },
1517
    { "sbbQ",   { Ev, sIb } },
1518
    { "andQ",   { Ev, sIb } },
1519
    { "subQ",   { Ev, sIb } },
1520
    { "xorQ",   { Ev, sIb } },
1521
    { "cmpQ",   { Ev, sIb } },
1522
  },
1523
  /* REG_8F */
1524
  {
1525
    { "popU",   { stackEv } },
1526
    { "(bad)",  { XX } },
1527
    { "(bad)",  { XX } },
1528
    { "(bad)",  { XX } },
1529
    { "(bad)",  { XX } },
1530
    { "(bad)",  { XX } },
1531
    { "(bad)",  { XX } },
1532
    { "(bad)",  { XX } },
1533
  },
1534
  /* REG_C0 */
1535
  {
1536
    { "rolA",   { Eb, Ib } },
1537
    { "rorA",   { Eb, Ib } },
1538
    { "rclA",   { Eb, Ib } },
1539
    { "rcrA",   { Eb, Ib } },
1540
    { "shlA",   { Eb, Ib } },
1541
    { "shrA",   { Eb, Ib } },
1542
    { "(bad)",  { XX } },
1543
    { "sarA",   { Eb, Ib } },
1544
  },
1545
  /* REG_C1 */
1546
  {
1547
    { "rolQ",   { Ev, Ib } },
1548
    { "rorQ",   { Ev, Ib } },
1549
    { "rclQ",   { Ev, Ib } },
1550
    { "rcrQ",   { Ev, Ib } },
1551
    { "shlQ",   { Ev, Ib } },
1552
    { "shrQ",   { Ev, Ib } },
1553
    { "(bad)",  { XX } },
1554
    { "sarQ",   { Ev, Ib } },
1555
  },
1556
  /* REG_C6 */
1557
  {
1558
    { "movA",   { Eb, Ib } },
1559
    { "(bad)",  { XX } },
1560
    { "(bad)",  { XX } },
1561
    { "(bad)",  { XX } },
1562
    { "(bad)",  { XX } },
1563
    { "(bad)",  { XX } },
1564
    { "(bad)",  { XX } },
1565
    { "(bad)",  { XX } },
1566
  },
1567
  /* REG_C7 */
1568
  {
1569
    { "movQ",   { Ev, Iv } },
1570
    { "(bad)",  { XX } },
1571
    { "(bad)",  { XX } },
1572
    { "(bad)",  { XX } },
1573
    { "(bad)",  { XX } },
1574
    { "(bad)",  { XX } },
1575
    { "(bad)",  { XX } },
1576
    { "(bad)",  { XX } },
1577
  },
1578
  /* REG_D0 */
1579
  {
1580
    { "rolA",   { Eb, I1 } },
1581
    { "rorA",   { Eb, I1 } },
1582
    { "rclA",   { Eb, I1 } },
1583
    { "rcrA",   { Eb, I1 } },
1584
    { "shlA",   { Eb, I1 } },
1585
    { "shrA",   { Eb, I1 } },
1586
    { "(bad)",  { XX } },
1587
    { "sarA",   { Eb, I1 } },
1588
  },
1589
  /* REG_D1 */
1590
  {
1591
    { "rolQ",   { Ev, I1 } },
1592
    { "rorQ",   { Ev, I1 } },
1593
    { "rclQ",   { Ev, I1 } },
1594
    { "rcrQ",   { Ev, I1 } },
1595
    { "shlQ",   { Ev, I1 } },
1596
    { "shrQ",   { Ev, I1 } },
1597
    { "(bad)",  { XX } },
1598
    { "sarQ",   { Ev, I1 } },
1599
  },
1600
  /* REG_D2 */
1601
  {
1602
    { "rolA",   { Eb, CL } },
1603
    { "rorA",   { Eb, CL } },
1604
    { "rclA",   { Eb, CL } },
1605
    { "rcrA",   { Eb, CL } },
1606
    { "shlA",   { Eb, CL } },
1607
    { "shrA",   { Eb, CL } },
1608
    { "(bad)",  { XX } },
1609
    { "sarA",   { Eb, CL } },
1610
  },
1611
  /* REG_D3 */
1612
  {
1613
    { "rolQ",   { Ev, CL } },
1614
    { "rorQ",   { Ev, CL } },
1615
    { "rclQ",   { Ev, CL } },
1616
    { "rcrQ",   { Ev, CL } },
1617
    { "shlQ",   { Ev, CL } },
1618
    { "shrQ",   { Ev, CL } },
1619
    { "(bad)",  { XX } },
1620
    { "sarQ",   { Ev, CL } },
1621
  },
1622
  /* REG_F6 */
1623
  {
1624
    { "testA",  { Eb, Ib } },
1625
    { "(bad)",  { XX } },
1626
    { "notA",   { Eb } },
1627
    { "negA",   { Eb } },
1628
    { "mulA",   { Eb } },       /* Don't print the implicit %al register,  */
1629
    { "imulA",  { Eb } },       /* to distinguish these opcodes from other */
1630
    { "divA",   { Eb } },       /* mul/imul opcodes.  Do the same for div  */
1631
    { "idivA",  { Eb } },       /* and idiv for consistency.               */
1632
  },
1633
  /* REG_F7 */
1634
  {
1635
    { "testQ",  { Ev, Iv } },
1636
    { "(bad)",  { XX } },
1637
    { "notQ",   { Ev } },
1638
    { "negQ",   { Ev } },
1639
    { "mulQ",   { Ev } },       /* Don't print the implicit register.  */
1640
    { "imulQ",  { Ev } },
1641
    { "divQ",   { Ev } },
1642
    { "idivQ",  { Ev } },
1643
  },
1644
  /* REG_FE */
1645
  {
1646
    { "incA",   { Eb } },
1647
    { "decA",   { Eb } },
1648
    { "(bad)",  { XX } },
1649
    { "(bad)",  { XX } },
1650
    { "(bad)",  { XX } },
1651
    { "(bad)",  { XX } },
1652
    { "(bad)",  { XX } },
1653
    { "(bad)",  { XX } },
1654
  },
1655
  /* REG_FF */
1656
  {
1657
    { "incQ",   { Ev } },
1658
    { "decQ",   { Ev } },
1659
    { "callT",  { indirEv } },
1660
    { "JcallT", { indirEp } },
1661
    { "jmpT",   { indirEv } },
1662
    { "JjmpT",  { indirEp } },
1663
    { "pushU",  { stackEv } },
1664
    { "(bad)",  { XX } },
1665
  },
1666
  /* REG_0F00 */
1667
  {
1668
    { "sldtD",  { Sv } },
1669
    { "strD",   { Sv } },
1670
    { "lldt",   { Ew } },
1671
    { "ltr",    { Ew } },
1672
    { "verr",   { Ew } },
1673
    { "verw",   { Ew } },
1674
    { "(bad)",  { XX } },
1675
    { "(bad)",  { XX } },
1676
  },
1677
  /* REG_0F01 */
1678
  {
1679
    { MOD_TABLE (MOD_0F01_REG_0) },
1680
    { MOD_TABLE (MOD_0F01_REG_1) },
1681
    { MOD_TABLE (MOD_0F01_REG_2) },
1682
    { MOD_TABLE (MOD_0F01_REG_3) },
1683
    { "smswD",  { Sv } },
1684
    { "(bad)",  { XX } },
1685
    { "lmsw",   { Ew } },
1686
    { MOD_TABLE (MOD_0F01_REG_7) },
1687
  },
1688
  /* REG_0F0D */
1689
  {
1690
    { "prefetch",       { Eb } },
1691
    { "prefetchw",      { Eb } },
1692
    { "(bad)",          { XX } },
1693
    { "(bad)",          { XX } },
1694
    { "(bad)",          { XX } },
1695
    { "(bad)",          { XX } },
1696
    { "(bad)",          { XX } },
1697
    { "(bad)",          { XX } },
1698
  },
1699
  /* REG_0F18 */
1700
  {
1701
    { MOD_TABLE (MOD_0F18_REG_0) },
1702
    { MOD_TABLE (MOD_0F18_REG_1) },
1703
    { MOD_TABLE (MOD_0F18_REG_2) },
1704
    { MOD_TABLE (MOD_0F18_REG_3) },
1705
    { "(bad)",  { XX } },
1706
    { "(bad)",  { XX } },
1707
    { "(bad)",  { XX } },
1708
    { "(bad)",  { XX } },
1709
  },
1710
  /* REG_0F71 */
1711
  {
1712
    { "(bad)",  { XX } },
1713
    { "(bad)",  { XX } },
1714
    { MOD_TABLE (MOD_0F71_REG_2) },
1715
    { "(bad)",  { XX } },
1716
    { MOD_TABLE (MOD_0F71_REG_4) },
1717
    { "(bad)",  { XX } },
1718
    { MOD_TABLE (MOD_0F71_REG_6) },
1719
    { "(bad)",  { XX } },
1720
  },
1721
  /* REG_0F72 */
1722
  {
1723
    { "(bad)",  { XX } },
1724
    { "(bad)",  { XX } },
1725
    { MOD_TABLE (MOD_0F72_REG_2) },
1726
    { "(bad)",  { XX } },
1727
    { MOD_TABLE (MOD_0F72_REG_4) },
1728
    { "(bad)",  { XX } },
1729
    { MOD_TABLE (MOD_0F72_REG_6) },
1730
    { "(bad)",  { XX } },
1731
  },
1732
  /* REG_0F73 */
1733
  {
1734
    { "(bad)",  { XX } },
1735
    { "(bad)",  { XX } },
1736
    { MOD_TABLE (MOD_0F73_REG_2) },
1737
    { MOD_TABLE (MOD_0F73_REG_3) },
1738
    { "(bad)",  { XX } },
1739
    { "(bad)",  { XX } },
1740
    { MOD_TABLE (MOD_0F73_REG_6) },
1741
    { MOD_TABLE (MOD_0F73_REG_7) },
1742
  },
1743
  /* REG_0FA6 */
1744
  {
1745
    { "montmul",        { { OP_0f07, 0 } } },
1746
    { "xsha1",          { { OP_0f07, 0 } } },
1747
    { "xsha256",        { { OP_0f07, 0 } } },
1748
    { "(bad)",          { { OP_0f07, 0 } } },
1749
    { "(bad)",          { { OP_0f07, 0 } } },
1750
    { "(bad)",          { { OP_0f07, 0 } } },
1751
    { "(bad)",          { { OP_0f07, 0 } } },
1752
    { "(bad)",          { { OP_0f07, 0 } } },
1753
  },
1754
  /* REG_0FA7 */
1755
  {
1756
    { "xstore-rng",     { { OP_0f07, 0 } } },
1757
    { "xcrypt-ecb",     { { OP_0f07, 0 } } },
1758
    { "xcrypt-cbc",     { { OP_0f07, 0 } } },
1759
    { "xcrypt-ctr",     { { OP_0f07, 0 } } },
1760
    { "xcrypt-cfb",     { { OP_0f07, 0 } } },
1761
    { "xcrypt-ofb",     { { OP_0f07, 0 } } },
1762
    { "(bad)",          { { OP_0f07, 0 } } },
1763
    { "(bad)",          { { OP_0f07, 0 } } },
1764
  },
1765
  /* REG_0FAE */
1766
  {
1767
    { MOD_TABLE (MOD_0FAE_REG_0) },
1768
    { MOD_TABLE (MOD_0FAE_REG_1) },
1769
    { MOD_TABLE (MOD_0FAE_REG_2) },
1770
    { MOD_TABLE (MOD_0FAE_REG_3) },
1771
    { MOD_TABLE (MOD_0FAE_REG_4) },
1772
    { MOD_TABLE (MOD_0FAE_REG_5) },
1773
    { MOD_TABLE (MOD_0FAE_REG_6) },
1774
    { MOD_TABLE (MOD_0FAE_REG_7) },
1775
  },
1776
  /* REG_0FBA */
1777
  {
1778
    { "(bad)",  { XX } },
1779
    { "(bad)",  { XX } },
1780
    { "(bad)",  { XX } },
1781
    { "(bad)",  { XX } },
1782
    { "btQ",    { Ev, Ib } },
1783
    { "btsQ",   { Ev, Ib } },
1784
    { "btrQ",   { Ev, Ib } },
1785
    { "btcQ",   { Ev, Ib } },
1786
  },
1787
  /* REG_0FC7 */
1788
  {
1789
    { "(bad)",  { XX } },
1790
    { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } } },
1791
    { "(bad)",  { XX } },
1792
    { "(bad)",  { XX } },
1793
    { "(bad)",  { XX } },
1794
    { "(bad)",  { XX } },
1795
    { MOD_TABLE (MOD_0FC7_REG_6) },
1796
    { MOD_TABLE (MOD_0FC7_REG_7) },
1797
  },
1798
};
1799
 
1800
static const struct dis386 prefix_table[][4] = {
1801
  /* PREFIX_90 */
1802
  {
1803
    { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
1804
    { "pause", { XX } },
1805
    { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
1806
    { "(bad)", { XX } },
1807
  },
1808
 
1809
  /* PREFIX_0F10 */
1810
  {
1811
    { "movups", { XM, EXx } },
1812
    { "movss",  { XM, EXd } },
1813
    { "movupd", { XM, EXx } },
1814
    { "movsd",  { XM, EXq } },
1815
  },
1816
 
1817
  /* PREFIX_0F11 */
1818
  {
1819
    { "movups", { EXx, XM } },
1820
    { "movss",  { EXd, XM } },
1821
    { "movupd", { EXx, XM } },
1822
    { "movsd",  { EXq, XM } },
1823
  },
1824
 
1825
  /* PREFIX_0F12 */
1826
  {
1827
    { MOD_TABLE (MOD_0F12_PREFIX_0) },
1828
    { "movsldup", { XM, EXx } },
1829
    { "movlpd", { XM, EXq } },
1830
    { "movddup", { XM, EXq } },
1831
  },
1832
 
1833
  /* PREFIX_0F16 */
1834
  {
1835
    { MOD_TABLE (MOD_0F16_PREFIX_0) },
1836
    { "movshdup", { XM, EXx } },
1837
    { "movhpd", { XM, EXq } },
1838
    { "(bad)",  { XX } },
1839
  },
1840
 
1841
  /* PREFIX_0F2A */
1842
  {
1843
    { "cvtpi2ps", { XM, EMCq } },
1844
    { "cvtsi2ss%LQ", { XM, Ev } },
1845
    { "cvtpi2pd", { XM, EMCq } },
1846
    { "cvtsi2sd%LQ", { XM, Ev } },
1847
  },
1848
 
1849
  /* PREFIX_0F2B */
1850
  {
1851
    { MOD_TABLE (MOD_0F2B_PREFIX_0) },
1852
    { MOD_TABLE (MOD_0F2B_PREFIX_1) },
1853
    { MOD_TABLE (MOD_0F2B_PREFIX_2) },
1854
    { MOD_TABLE (MOD_0F2B_PREFIX_3) },
1855
  },
1856
 
1857
  /* PREFIX_0F2C */
1858
  {
1859
    { "cvttps2pi", { MXC, EXq } },
1860
    { "cvttss2siY", { Gv, EXd } },
1861
    { "cvttpd2pi", { MXC, EXx } },
1862
    { "cvttsd2siY", { Gv, EXq } },
1863
  },
1864
 
1865
  /* PREFIX_0F2D */
1866
  {
1867
    { "cvtps2pi", { MXC, EXq } },
1868
    { "cvtss2siY", { Gv, EXd } },
1869
    { "cvtpd2pi", { MXC, EXx } },
1870
    { "cvtsd2siY", { Gv, EXq } },
1871
  },
1872
 
1873
  /* PREFIX_0F2E */
1874
  {
1875
    { "ucomiss",{ XM, EXd } },
1876
    { "(bad)",  { XX } },
1877
    { "ucomisd",{ XM, EXq } },
1878
    { "(bad)",  { XX } },
1879
  },
1880
 
1881
  /* PREFIX_0F2F */
1882
  {
1883
    { "comiss", { XM, EXd } },
1884
    { "(bad)",  { XX } },
1885
    { "comisd", { XM, EXq } },
1886
    { "(bad)",  { XX } },
1887
  },
1888
 
1889
  /* PREFIX_0F51 */
1890
  {
1891
    { "sqrtps", { XM, EXx } },
1892
    { "sqrtss", { XM, EXd } },
1893
    { "sqrtpd", { XM, EXx } },
1894
    { "sqrtsd", { XM, EXq } },
1895
  },
1896
 
1897
  /* PREFIX_0F52 */
1898
  {
1899
    { "rsqrtps",{ XM, EXx } },
1900
    { "rsqrtss",{ XM, EXd } },
1901
    { "(bad)",  { XX } },
1902
    { "(bad)",  { XX } },
1903
  },
1904
 
1905
  /* PREFIX_0F53 */
1906
  {
1907
    { "rcpps",  { XM, EXx } },
1908
    { "rcpss",  { XM, EXd } },
1909
    { "(bad)",  { XX } },
1910
    { "(bad)",  { XX } },
1911
  },
1912
 
1913
  /* PREFIX_0F58 */
1914
  {
1915
    { "addps", { XM, EXx } },
1916
    { "addss", { XM, EXd } },
1917
    { "addpd", { XM, EXx } },
1918
    { "addsd", { XM, EXq } },
1919
  },
1920
 
1921
  /* PREFIX_0F59 */
1922
  {
1923
    { "mulps",  { XM, EXx } },
1924
    { "mulss",  { XM, EXd } },
1925
    { "mulpd",  { XM, EXx } },
1926
    { "mulsd",  { XM, EXq } },
1927
  },
1928
 
1929
  /* PREFIX_0F5A */
1930
  {
1931
    { "cvtps2pd", { XM, EXq } },
1932
    { "cvtss2sd", { XM, EXd } },
1933
    { "cvtpd2ps", { XM, EXx } },
1934
    { "cvtsd2ss", { XM, EXq } },
1935
  },
1936
 
1937
  /* PREFIX_0F5B */
1938
  {
1939
    { "cvtdq2ps", { XM, EXx } },
1940
    { "cvttps2dq", { XM, EXx } },
1941
    { "cvtps2dq", { XM, EXx } },
1942
    { "(bad)",  { XX } },
1943
  },
1944
 
1945
  /* PREFIX_0F5C */
1946
  {
1947
    { "subps",  { XM, EXx } },
1948
    { "subss",  { XM, EXd } },
1949
    { "subpd",  { XM, EXx } },
1950
    { "subsd",  { XM, EXq } },
1951
  },
1952
 
1953
  /* PREFIX_0F5D */
1954
  {
1955
    { "minps",  { XM, EXx } },
1956
    { "minss",  { XM, EXd } },
1957
    { "minpd",  { XM, EXx } },
1958
    { "minsd",  { XM, EXq } },
1959
  },
1960
 
1961
  /* PREFIX_0F5E */
1962
  {
1963
    { "divps",  { XM, EXx } },
1964
    { "divss",  { XM, EXd } },
1965
    { "divpd",  { XM, EXx } },
1966
    { "divsd",  { XM, EXq } },
1967
  },
1968
 
1969
  /* PREFIX_0F5F */
1970
  {
1971
    { "maxps",  { XM, EXx } },
1972
    { "maxss",  { XM, EXd } },
1973
    { "maxpd",  { XM, EXx } },
1974
    { "maxsd",  { XM, EXq } },
1975
  },
1976
 
1977
  /* PREFIX_0F60 */
1978
  {
1979
    { "punpcklbw",{ MX, EMd } },
1980
    { "(bad)",  { XX } },
1981
    { "punpcklbw",{ MX, EMx } },
1982
    { "(bad)",  { XX } },
1983
  },
1984
 
1985
  /* PREFIX_0F61 */
1986
  {
1987
    { "punpcklwd",{ MX, EMd } },
1988
    { "(bad)",  { XX } },
1989
    { "punpcklwd",{ MX, EMx } },
1990
    { "(bad)",  { XX } },
1991
  },
1992
 
1993
  /* PREFIX_0F62 */
1994
  {
1995
    { "punpckldq",{ MX, EMd } },
1996
    { "(bad)",  { XX } },
1997
    { "punpckldq",{ MX, EMx } },
1998
    { "(bad)",  { XX } },
1999
  },
2000
 
2001
  /* PREFIX_0F6C */
2002
  {
2003
    { "(bad)",  { XX } },
2004
    { "(bad)",  { XX } },
2005
    { "punpcklqdq", { XM, EXx } },
2006
    { "(bad)",  { XX } },
2007
  },
2008
 
2009
  /* PREFIX_0F6D */
2010
  {
2011
    { "(bad)",  { XX } },
2012
    { "(bad)",  { XX } },
2013
    { "punpckhqdq", { XM, EXx } },
2014
    { "(bad)",  { XX } },
2015
  },
2016
 
2017
  /* PREFIX_0F6F */
2018
  {
2019
    { "movq",   { MX, EM } },
2020
    { "movdqu", { XM, EXx } },
2021
    { "movdqa", { XM, EXx } },
2022
    { "(bad)",  { XX } },
2023
  },
2024
 
2025
  /* PREFIX_0F70 */
2026
  {
2027
    { "pshufw", { MX, EM, Ib } },
2028
    { "pshufhw",{ XM, EXx, Ib } },
2029
    { "pshufd", { XM, EXx, Ib } },
2030
    { "pshuflw",{ XM, EXx, Ib } },
2031
  },
2032
 
2033
  /* PREFIX_0F73_REG_3 */
2034
  {
2035
    { "(bad)",  { XX } },
2036
    { "(bad)",  { XX } },
2037
    { "psrldq", { XS, Ib } },
2038
    { "(bad)",  { XX } },
2039
  },
2040
 
2041
  /* PREFIX_0F73_REG_7 */
2042
  {
2043
    { "(bad)",  { XX } },
2044
    { "(bad)",  { XX } },
2045
    { "pslldq", { XS, Ib } },
2046
    { "(bad)",  { XX } },
2047
  },
2048
 
2049
  /* PREFIX_0F78 */
2050
  {
2051
    {"vmread",  { Em, Gm } },
2052
    {"(bad)",   { XX } },
2053
    {"extrq",   { XS, Ib, Ib } },
2054
    {"insertq", { XM, XS, Ib, Ib } },
2055
  },
2056
 
2057
  /* PREFIX_0F79 */
2058
  {
2059
    {"vmwrite", { Gm, Em } },
2060
    {"(bad)",   { XX } },
2061
    {"extrq",   { XM, XS } },
2062
    {"insertq", { XM, XS } },
2063
  },
2064
 
2065
  /* PREFIX_0F7C */
2066
  {
2067
    { "(bad)",  { XX } },
2068
    { "(bad)",  { XX } },
2069
    { "haddpd", { XM, EXx } },
2070
    { "haddps", { XM, EXx } },
2071
  },
2072
 
2073
  /* PREFIX_0F7D */
2074
  {
2075
    { "(bad)",  { XX } },
2076
    { "(bad)",  { XX } },
2077
    { "hsubpd", { XM, EXx } },
2078
    { "hsubps", { XM, EXx } },
2079
  },
2080
 
2081
  /* PREFIX_0F7E */
2082
  {
2083
    { "movK",   { Edq, MX } },
2084
    { "movq",   { XM, EXq } },
2085
    { "movK",   { Edq, XM } },
2086
    { "(bad)",  { XX } },
2087
  },
2088
 
2089
  /* PREFIX_0F7F */
2090
  {
2091
    { "movq",   { EM, MX } },
2092
    { "movdqu", { EXx, XM } },
2093
    { "movdqa", { EXx, XM } },
2094
    { "(bad)",  { XX } },
2095
  },
2096
 
2097
  /* PREFIX_0FB8 */
2098
  {
2099
    { "(bad)", { XX } },
2100
    { "popcntS", { Gv, Ev } },
2101
    { "(bad)", { XX } },
2102
    { "(bad)", { XX } },
2103
  },
2104
 
2105
  /* PREFIX_0FBD */
2106
  {
2107
    { "bsrS",   { Gv, Ev } },
2108
    { "lzcntS", { Gv, Ev } },
2109
    { "bsrS",   { Gv, Ev } },
2110
    { "(bad)",  { XX } },
2111
  },
2112
 
2113
  /* PREFIX_0FC2 */
2114
  {
2115
    { "cmpps",  { XM, EXx, CMP } },
2116
    { "cmpss",  { XM, EXd, CMP } },
2117
    { "cmppd",  { XM, EXx, CMP } },
2118
    { "cmpsd",  { XM, EXq, CMP } },
2119
  },
2120
 
2121
  /* PREFIX_0FC3 */
2122
  {
2123
    { "movntiS", { Ma, Gv } },
2124
    { "(bad)",  { XX } },
2125
    { "(bad)",  { XX } },
2126
    { "(bad)",  { XX } },
2127
  },
2128
 
2129
  /* PREFIX_0FC7_REG_6 */
2130
  {
2131
    { "vmptrld",{ Mq } },
2132
    { "vmxon",  { Mq } },
2133
    { "vmclear",{ Mq } },
2134
    { "(bad)",  { XX } },
2135
  },
2136
 
2137
  /* PREFIX_0FD0 */
2138
  {
2139
    { "(bad)",  { XX } },
2140
    { "(bad)",  { XX } },
2141
    { "addsubpd", { XM, EXx } },
2142
    { "addsubps", { XM, EXx } },
2143
  },
2144
 
2145
  /* PREFIX_0FD6 */
2146
  {
2147
    { "(bad)",  { XX } },
2148
    { "movq2dq",{ XM, MS } },
2149
    { "movq",   { EXq, XM } },
2150
    { "movdq2q",{ MX, XS } },
2151
  },
2152
 
2153
  /* PREFIX_0FE6 */
2154
  {
2155
    { "(bad)",  { XX } },
2156
    { "cvtdq2pd", { XM, EXq } },
2157
    { "cvttpd2dq", { XM, EXx } },
2158
    { "cvtpd2dq", { XM, EXx } },
2159
  },
2160
 
2161
  /* PREFIX_0FE7 */
2162
  {
2163
    { "movntq", { Mq, MX } },
2164
    { "(bad)",  { XX } },
2165
    { MOD_TABLE (MOD_0FE7_PREFIX_2) },
2166
    { "(bad)",  { XX } },
2167
  },
2168
 
2169
  /* PREFIX_0FF0 */
2170
  {
2171
    { "(bad)",  { XX } },
2172
    { "(bad)",  { XX } },
2173
    { "(bad)",  { XX } },
2174
    { MOD_TABLE (MOD_0FF0_PREFIX_3) },
2175
  },
2176
 
2177
  /* PREFIX_0FF7 */
2178
  {
2179
    { "maskmovq", { MX, MS } },
2180
    { "(bad)",  { XX } },
2181
    { "maskmovdqu", { XM, XS } },
2182
    { "(bad)",  { XX } },
2183
  },
2184
 
2185
  /* PREFIX_0F3810 */
2186
  {
2187
    { "(bad)",  { XX } },
2188
    { "(bad)",  { XX } },
2189
    { "pblendvb", { XM, EXx, XMM0 } },
2190
    { "(bad)",  { XX } },
2191
  },
2192
 
2193
  /* PREFIX_0F3814 */
2194
  {
2195
    { "(bad)",  { XX } },
2196
    { "(bad)",  { XX } },
2197
    { "blendvps", { XM, EXx, XMM0 } },
2198
    { "(bad)",  { XX } },
2199
  },
2200
 
2201
  /* PREFIX_0F3815 */
2202
  {
2203
    { "(bad)",  { XX } },
2204
    { "(bad)",  { XX } },
2205
    { "blendvpd", { XM, EXx, XMM0 } },
2206
    { "(bad)",  { XX } },
2207
  },
2208
 
2209
  /* PREFIX_0F3817 */
2210
  {
2211
    { "(bad)",  { XX } },
2212
    { "(bad)",  { XX } },
2213
    { "ptest",  { XM, EXx } },
2214
    { "(bad)",  { XX } },
2215
  },
2216
 
2217
  /* PREFIX_0F3820 */
2218
  {
2219
    { "(bad)",  { XX } },
2220
    { "(bad)",  { XX } },
2221
    { "pmovsxbw", { XM, EXq } },
2222
    { "(bad)",  { XX } },
2223
  },
2224
 
2225
  /* PREFIX_0F3821 */
2226
  {
2227
    { "(bad)",  { XX } },
2228
    { "(bad)",  { XX } },
2229
    { "pmovsxbd", { XM, EXd } },
2230
    { "(bad)",  { XX } },
2231
  },
2232
 
2233
  /* PREFIX_0F3822 */
2234
  {
2235
    { "(bad)",  { XX } },
2236
    { "(bad)",  { XX } },
2237
    { "pmovsxbq", { XM, EXw } },
2238
    { "(bad)",  { XX } },
2239
  },
2240
 
2241
  /* PREFIX_0F3823 */
2242
  {
2243
    { "(bad)",  { XX } },
2244
    { "(bad)",  { XX } },
2245
    { "pmovsxwd", { XM, EXq } },
2246
    { "(bad)",  { XX } },
2247
  },
2248
 
2249
  /* PREFIX_0F3824 */
2250
  {
2251
    { "(bad)",  { XX } },
2252
    { "(bad)",  { XX } },
2253
    { "pmovsxwq", { XM, EXd } },
2254
    { "(bad)",  { XX } },
2255
  },
2256
 
2257
  /* PREFIX_0F3825 */
2258
  {
2259
    { "(bad)",  { XX } },
2260
    { "(bad)",  { XX } },
2261
    { "pmovsxdq", { XM, EXq } },
2262
    { "(bad)",  { XX } },
2263
  },
2264
 
2265
  /* PREFIX_0F3828 */
2266
  {
2267
    { "(bad)",  { XX } },
2268
    { "(bad)",  { XX } },
2269
    { "pmuldq", { XM, EXx } },
2270
    { "(bad)",  { XX } },
2271
  },
2272
 
2273
  /* PREFIX_0F3829 */
2274
  {
2275
    { "(bad)",  { XX } },
2276
    { "(bad)",  { XX } },
2277
    { "pcmpeqq", { XM, EXx } },
2278
    { "(bad)",  { XX } },
2279
  },
2280
 
2281
  /* PREFIX_0F382A */
2282
  {
2283
    { "(bad)",  { XX } },
2284
    { "(bad)",  { XX } },
2285
    { MOD_TABLE (MOD_0F382A_PREFIX_2) },
2286
    { "(bad)",  { XX } },
2287
  },
2288
 
2289
  /* PREFIX_0F382B */
2290
  {
2291
    { "(bad)",  { XX } },
2292
    { "(bad)",  { XX } },
2293
    { "packusdw", { XM, EXx } },
2294
    { "(bad)",  { XX } },
2295
  },
2296
 
2297
  /* PREFIX_0F3830 */
2298
  {
2299
    { "(bad)",  { XX } },
2300
    { "(bad)",  { XX } },
2301
    { "pmovzxbw", { XM, EXq } },
2302
    { "(bad)",  { XX } },
2303
  },
2304
 
2305
  /* PREFIX_0F3831 */
2306
  {
2307
    { "(bad)",  { XX } },
2308
    { "(bad)",  { XX } },
2309
    { "pmovzxbd", { XM, EXd } },
2310
    { "(bad)",  { XX } },
2311
  },
2312
 
2313
  /* PREFIX_0F3832 */
2314
  {
2315
    { "(bad)",  { XX } },
2316
    { "(bad)",  { XX } },
2317
    { "pmovzxbq", { XM, EXw } },
2318
    { "(bad)",  { XX } },
2319
  },
2320
 
2321
  /* PREFIX_0F3833 */
2322
  {
2323
    { "(bad)",  { XX } },
2324
    { "(bad)",  { XX } },
2325
    { "pmovzxwd", { XM, EXq } },
2326
    { "(bad)",  { XX } },
2327
  },
2328
 
2329
  /* PREFIX_0F3834 */
2330
  {
2331
    { "(bad)",  { XX } },
2332
    { "(bad)",  { XX } },
2333
    { "pmovzxwq", { XM, EXd } },
2334
    { "(bad)",  { XX } },
2335
  },
2336
 
2337
  /* PREFIX_0F3835 */
2338
  {
2339
    { "(bad)",  { XX } },
2340
    { "(bad)",  { XX } },
2341
    { "pmovzxdq", { XM, EXq } },
2342
    { "(bad)",  { XX } },
2343
  },
2344
 
2345
  /* PREFIX_0F3837 */
2346
  {
2347
    { "(bad)",  { XX } },
2348
    { "(bad)",  { XX } },
2349
    { "pcmpgtq", { XM, EXx } },
2350
    { "(bad)",  { XX } },
2351
  },
2352
 
2353
  /* PREFIX_0F3838 */
2354
  {
2355
    { "(bad)",  { XX } },
2356
    { "(bad)",  { XX } },
2357
    { "pminsb", { XM, EXx } },
2358
    { "(bad)",  { XX } },
2359
  },
2360
 
2361
  /* PREFIX_0F3839 */
2362
  {
2363
    { "(bad)",  { XX } },
2364
    { "(bad)",  { XX } },
2365
    { "pminsd", { XM, EXx } },
2366
    { "(bad)",  { XX } },
2367
  },
2368
 
2369
  /* PREFIX_0F383A */
2370
  {
2371
    { "(bad)",  { XX } },
2372
    { "(bad)",  { XX } },
2373
    { "pminuw", { XM, EXx } },
2374
    { "(bad)",  { XX } },
2375
  },
2376
 
2377
  /* PREFIX_0F383B */
2378
  {
2379
    { "(bad)",  { XX } },
2380
    { "(bad)",  { XX } },
2381
    { "pminud", { XM, EXx } },
2382
    { "(bad)",  { XX } },
2383
  },
2384
 
2385
  /* PREFIX_0F383C */
2386
  {
2387
    { "(bad)",  { XX } },
2388
    { "(bad)",  { XX } },
2389
    { "pmaxsb", { XM, EXx } },
2390
    { "(bad)",  { XX } },
2391
  },
2392
 
2393
  /* PREFIX_0F383D */
2394
  {
2395
    { "(bad)",  { XX } },
2396
    { "(bad)",  { XX } },
2397
    { "pmaxsd", { XM, EXx } },
2398
    { "(bad)",  { XX } },
2399
  },
2400
 
2401
  /* PREFIX_0F383E */
2402
  {
2403
    { "(bad)",  { XX } },
2404
    { "(bad)",  { XX } },
2405
    { "pmaxuw", { XM, EXx } },
2406
    { "(bad)",  { XX } },
2407
  },
2408
 
2409
  /* PREFIX_0F383F */
2410
  {
2411
    { "(bad)",  { XX } },
2412
    { "(bad)",  { XX } },
2413
    { "pmaxud", { XM, EXx } },
2414
    { "(bad)",  { XX } },
2415
  },
2416
 
2417
  /* PREFIX_0F3840 */
2418
  {
2419
    { "(bad)",  { XX } },
2420
    { "(bad)",  { XX } },
2421
    { "pmulld", { XM, EXx } },
2422
    { "(bad)",  { XX } },
2423
  },
2424
 
2425
  /* PREFIX_0F3841 */
2426
  {
2427
    { "(bad)",  { XX } },
2428
    { "(bad)",  { XX } },
2429
    { "phminposuw", { XM, EXx } },
2430
    { "(bad)",  { XX } },
2431
  },
2432
 
2433
  /* PREFIX_0F38F0 */
2434
  {
2435
    { "(bad)",  { XX } },
2436
    { "(bad)",  { XX } },
2437
    { "(bad)",  { XX } },
2438
    { "crc32",  { Gdq, { CRC32_Fixup, b_mode } } },
2439
  },
2440
 
2441
  /* PREFIX_0F38F1 */
2442
  {
2443
    { "(bad)",  { XX } },
2444
    { "(bad)",  { XX } },
2445
    { "(bad)",  { XX } },
2446
    { "crc32",  { Gdq, { CRC32_Fixup, v_mode } } },
2447
  },
2448
 
2449
  /* PREFIX_0F3A08 */
2450
  {
2451
    { "(bad)",  { XX } },
2452
    { "(bad)",  { XX } },
2453
    { "roundps", { XM, EXx, Ib } },
2454
    { "(bad)",  { XX } },
2455
  },
2456
 
2457
  /* PREFIX_0F3A09 */
2458
  {
2459
    { "(bad)",  { XX } },
2460
    { "(bad)",  { XX } },
2461
    { "roundpd", { XM, EXx, Ib } },
2462
    { "(bad)",  { XX } },
2463
  },
2464
 
2465
  /* PREFIX_0F3A0A */
2466
  {
2467
    { "(bad)",  { XX } },
2468
    { "(bad)",  { XX } },
2469
    { "roundss", { XM, EXd, Ib } },
2470
    { "(bad)",  { XX } },
2471
  },
2472
 
2473
  /* PREFIX_0F3A0B */
2474
  {
2475
    { "(bad)",  { XX } },
2476
    { "(bad)",  { XX } },
2477
    { "roundsd", { XM, EXq, Ib } },
2478
    { "(bad)",  { XX } },
2479
  },
2480
 
2481
  /* PREFIX_0F3A0C */
2482
  {
2483
    { "(bad)",  { XX } },
2484
    { "(bad)",  { XX } },
2485
    { "blendps", { XM, EXx, Ib } },
2486
    { "(bad)",  { XX } },
2487
  },
2488
 
2489
  /* PREFIX_0F3A0D */
2490
  {
2491
    { "(bad)",  { XX } },
2492
    { "(bad)",  { XX } },
2493
    { "blendpd", { XM, EXx, Ib } },
2494
    { "(bad)",  { XX } },
2495
  },
2496
 
2497
  /* PREFIX_0F3A0E */
2498
  {
2499
    { "(bad)",  { XX } },
2500
    { "(bad)",  { XX } },
2501
    { "pblendw", { XM, EXx, Ib } },
2502
    { "(bad)",  { XX } },
2503
  },
2504
 
2505
  /* PREFIX_0F3A14 */
2506
  {
2507
    { "(bad)",  { XX } },
2508
    { "(bad)",  { XX } },
2509
    { "pextrb", { Edqb, XM, Ib } },
2510
    { "(bad)",  { XX } },
2511
  },
2512
 
2513
  /* PREFIX_0F3A15 */
2514
  {
2515
    { "(bad)",  { XX } },
2516
    { "(bad)",  { XX } },
2517
    { "pextrw", { Edqw, XM, Ib } },
2518
    { "(bad)",  { XX } },
2519
  },
2520
 
2521
  /* PREFIX_0F3A16 */
2522
  {
2523
    { "(bad)",  { XX } },
2524
    { "(bad)",  { XX } },
2525
    { "pextrK", { Edq, XM, Ib } },
2526
    { "(bad)",  { XX } },
2527
  },
2528
 
2529
  /* PREFIX_0F3A17 */
2530
  {
2531
    { "(bad)",  { XX } },
2532
    { "(bad)",  { XX } },
2533
    { "extractps", { Edqd, XM, Ib } },
2534
    { "(bad)",  { XX } },
2535
  },
2536
 
2537
  /* PREFIX_0F3A20 */
2538
  {
2539
    { "(bad)",  { XX } },
2540
    { "(bad)",  { XX } },
2541
    { "pinsrb", { XM, Edqb, Ib } },
2542
    { "(bad)",  { XX } },
2543
  },
2544
 
2545
  /* PREFIX_0F3A21 */
2546
  {
2547
    { "(bad)",  { XX } },
2548
    { "(bad)",  { XX } },
2549
    { "insertps", { XM, EXd, Ib } },
2550
    { "(bad)",  { XX } },
2551
  },
2552
 
2553
  /* PREFIX_0F3A22 */
2554
  {
2555
    { "(bad)",  { XX } },
2556
    { "(bad)",  { XX } },
2557
    { "pinsrK", { XM, Edq, Ib } },
2558
    { "(bad)",  { XX } },
2559
  },
2560
 
2561
  /* PREFIX_0F3A40 */
2562
  {
2563
    { "(bad)",  { XX } },
2564
    { "(bad)",  { XX } },
2565
    { "dpps",   { XM, EXx, Ib } },
2566
    { "(bad)",  { XX } },
2567
  },
2568
 
2569
  /* PREFIX_0F3A41 */
2570
  {
2571
    { "(bad)",  { XX } },
2572
    { "(bad)",  { XX } },
2573
    { "dppd",   { XM, EXx, Ib } },
2574
    { "(bad)",  { XX } },
2575
  },
2576
 
2577
  /* PREFIX_0F3A42 */
2578
  {
2579
    { "(bad)",  { XX } },
2580
    { "(bad)",  { XX } },
2581
    { "mpsadbw", { XM, EXx, Ib } },
2582
    { "(bad)",  { XX } },
2583
  },
2584
 
2585
  /* PREFIX_0F3A60 */
2586
  {
2587
    { "(bad)",  { XX } },
2588
    { "(bad)",  { XX } },
2589
    { "pcmpestrm", { XM, EXx, Ib } },
2590
    { "(bad)",  { XX } },
2591
  },
2592
 
2593
  /* PREFIX_0F3A61 */
2594
  {
2595
    { "(bad)",  { XX } },
2596
    { "(bad)",  { XX } },
2597
    { "pcmpestri", { XM, EXx, Ib } },
2598
    { "(bad)",  { XX } },
2599
  },
2600
 
2601
  /* PREFIX_0F3A62 */
2602
  {
2603
    { "(bad)",  { XX } },
2604
    { "(bad)",  { XX } },
2605
    { "pcmpistrm", { XM, EXx, Ib } },
2606
    { "(bad)",  { XX } },
2607
  },
2608
 
2609
  /* PREFIX_0F3A63 */
2610
  {
2611
    { "(bad)",  { XX } },
2612
    { "(bad)",  { XX } },
2613
    { "pcmpistri", { XM, EXx, Ib } },
2614
    { "(bad)",  { XX } },
2615
  },
2616
};
2617
 
2618
static const struct dis386 x86_64_table[][2] = {
2619
  /* X86_64_06 */
2620
  {
2621
    { "push{T|}", { es } },
2622
    { "(bad)", { XX } },
2623
  },
2624
 
2625
  /* X86_64_07 */
2626
  {
2627
    { "pop{T|}", { es } },
2628
    { "(bad)", { XX } },
2629
  },
2630
 
2631
  /* X86_64_0D */
2632
  {
2633
    { "push{T|}", { cs } },
2634
    { "(bad)", { XX } },
2635
  },
2636
 
2637
  /* X86_64_16 */
2638
  {
2639
    { "push{T|}", { ss } },
2640
    { "(bad)", { XX } },
2641
  },
2642
 
2643
  /* X86_64_17 */
2644
  {
2645
    { "pop{T|}", { ss } },
2646
    { "(bad)", { XX } },
2647
  },
2648
 
2649
  /* X86_64_1E */
2650
  {
2651
    { "push{T|}", { ds } },
2652
    { "(bad)", { XX } },
2653
  },
2654
 
2655
  /* X86_64_1F */
2656
  {
2657
    { "pop{T|}", { ds } },
2658
    { "(bad)", { XX } },
2659
  },
2660
 
2661
  /* X86_64_27 */
2662
  {
2663
    { "daa", { XX } },
2664
    { "(bad)", { XX } },
2665
  },
2666
 
2667
  /* X86_64_2F */
2668
  {
2669
    { "das", { XX } },
2670
    { "(bad)", { XX } },
2671
  },
2672
 
2673
  /* X86_64_37 */
2674
  {
2675
    { "aaa", { XX } },
2676
    { "(bad)", { XX } },
2677
  },
2678
 
2679
  /* X86_64_3F */
2680
  {
2681
    { "aas", { XX } },
2682
    { "(bad)", { XX } },
2683
  },
2684
 
2685
  /* X86_64_60 */
2686
  {
2687
    { "pusha{P|}", { XX } },
2688
    { "(bad)", { XX } },
2689
  },
2690
 
2691
  /* X86_64_61 */
2692
  {
2693
    { "popa{P|}", { XX } },
2694
    { "(bad)", { XX } },
2695
  },
2696
 
2697
  /* X86_64_62 */
2698
  {
2699
    { MOD_TABLE (MOD_62_32BIT) },
2700
    { "(bad)", { XX } },
2701
  },
2702
 
2703
  /* X86_64_63 */
2704
  {
2705
    { "arpl", { Ew, Gw } },
2706
    { "movs{lq|xd}", { Gv, Ed } },
2707
  },
2708
 
2709
  /* X86_64_6D */
2710
  {
2711
    { "ins{R|}", { Yzr, indirDX } },
2712
    { "ins{G|}", { Yzr, indirDX } },
2713
  },
2714
 
2715
  /* X86_64_6F */
2716
  {
2717
    { "outs{R|}", { indirDXr, Xz } },
2718
    { "outs{G|}", { indirDXr, Xz } },
2719
  },
2720
 
2721
  /* X86_64_9A */
2722
  {
2723
    { "Jcall{T|}", { Ap } },
2724
    { "(bad)", { XX } },
2725
  },
2726
 
2727
  /* X86_64_C4 */
2728
  {
2729
    { MOD_TABLE (MOD_C4_32BIT) },
2730
    { "(bad)", { XX } },
2731
  },
2732
 
2733
  /* X86_64_C5 */
2734
  {
2735
    { MOD_TABLE (MOD_C5_32BIT) },
2736
    { "(bad)", { XX } },
2737
  },
2738
 
2739
  /* X86_64_CE */
2740
  {
2741
    { "into", { XX } },
2742
    { "(bad)", { XX } },
2743
  },
2744
 
2745
  /* X86_64_D4 */
2746
  {
2747
    { "aam", { sIb } },
2748
    { "(bad)", { XX } },
2749
  },
2750
 
2751
  /* X86_64_D5 */
2752
  {
2753
    { "aad", { sIb } },
2754
    { "(bad)", { XX } },
2755
  },
2756
 
2757
  /* X86_64_EA */
2758
  {
2759
    { "Jjmp{T|}", { Ap } },
2760
    { "(bad)", { XX } },
2761
  },
2762
 
2763
  /* X86_64_0F01_REG_0 */
2764
  {
2765
    { "sgdt{Q|IQ}", { M } },
2766
    { "sgdt", { M } },
2767
  },
2768
 
2769
  /* X86_64_0F01_REG_1 */
2770
  {
2771
    { "sidt{Q|IQ}", { M } },
2772
    { "sidt", { M } },
2773
  },
2774
 
2775
  /* X86_64_0F01_REG_2 */
2776
  {
2777
    { "lgdt{Q|Q}", { M } },
2778
    { "lgdt", { M } },
2779
  },
2780
 
2781
  /* X86_64_0F01_REG_3 */
2782
  {
2783
    { "lidt{Q|Q}", { M } },
2784
    { "lidt", { M } },
2785
  },
2786
};
2787
 
2788
static const struct dis386 three_byte_table[][256] = {
2789
  /* THREE_BYTE_0F24 */
2790
  {
2791
    /* 00 */
2792
    { "fmaddps",        { { OP_DREX4, q_mode } } },
2793
    { "fmaddpd",        { { OP_DREX4, q_mode } } },
2794
    { "fmaddss",        { { OP_DREX4, w_mode } } },
2795
    { "fmaddsd",        { { OP_DREX4, d_mode } } },
2796
    { "fmaddps",        { { OP_DREX4, DREX_OC1 + q_mode } } },
2797
    { "fmaddpd",        { { OP_DREX4, DREX_OC1 + q_mode } } },
2798
    { "fmaddss",        { { OP_DREX4, DREX_OC1 + w_mode } } },
2799
    { "fmaddsd",        { { OP_DREX4, DREX_OC1 + d_mode } } },
2800
    /* 08 */
2801
    { "fmsubps",        { { OP_DREX4, q_mode } } },
2802
    { "fmsubpd",        { { OP_DREX4, q_mode } } },
2803
    { "fmsubss",        { { OP_DREX4, w_mode } } },
2804
    { "fmsubsd",        { { OP_DREX4, d_mode } } },
2805
    { "fmsubps",        { { OP_DREX4, DREX_OC1 + q_mode } } },
2806
    { "fmsubpd",        { { OP_DREX4, DREX_OC1 + q_mode } } },
2807
    { "fmsubss",        { { OP_DREX4, DREX_OC1 + w_mode } } },
2808
    { "fmsubsd",        { { OP_DREX4, DREX_OC1 + d_mode } } },
2809
    /* 10 */
2810
    { "fnmaddps",       { { OP_DREX4, q_mode } } },
2811
    { "fnmaddpd",       { { OP_DREX4, q_mode } } },
2812
    { "fnmaddss",       { { OP_DREX4, w_mode } } },
2813
    { "fnmaddsd",       { { OP_DREX4, d_mode } } },
2814
    { "fnmaddps",       { { OP_DREX4, DREX_OC1 + q_mode } } },
2815
    { "fnmaddpd",       { { OP_DREX4, DREX_OC1 + q_mode } } },
2816
    { "fnmaddss",       { { OP_DREX4, DREX_OC1 + w_mode } } },
2817
    { "fnmaddsd",       { { OP_DREX4, DREX_OC1 + d_mode } } },
2818
    /* 18 */
2819
    { "fnmsubps",       { { OP_DREX4, q_mode } } },
2820
    { "fnmsubpd",       { { OP_DREX4, q_mode } } },
2821
    { "fnmsubss",       { { OP_DREX4, w_mode } } },
2822
    { "fnmsubsd",       { { OP_DREX4, d_mode } } },
2823
    { "fnmsubps",       { { OP_DREX4, DREX_OC1 + q_mode } } },
2824
    { "fnmsubpd",       { { OP_DREX4, DREX_OC1 + q_mode } } },
2825
    { "fnmsubss",       { { OP_DREX4, DREX_OC1 + w_mode } } },
2826
    { "fnmsubsd",       { { OP_DREX4, DREX_OC1 + d_mode } } },
2827
    /* 20 */
2828
    { "permps",         { { OP_DREX4, q_mode } } },
2829
    { "permpd",         { { OP_DREX4, q_mode } } },
2830
    { "pcmov",          { { OP_DREX4, q_mode } } },
2831
    { "pperm",          { { OP_DREX4, q_mode } } },
2832
    { "permps",         { { OP_DREX4, DREX_OC1 + q_mode } } },
2833
    { "permpd",         { { OP_DREX4, DREX_OC1 + q_mode } } },
2834
    { "pcmov",          { { OP_DREX4, DREX_OC1 + w_mode } } },
2835
    { "pperm",          { { OP_DREX4, DREX_OC1 + d_mode } } },
2836
    /* 28 */
2837
    { "(bad)",          { XX } },
2838
    { "(bad)",          { XX } },
2839
    { "(bad)",          { XX } },
2840
    { "(bad)",          { XX } },
2841
    { "(bad)",          { XX } },
2842
    { "(bad)",          { XX } },
2843
    { "(bad)",          { XX } },
2844
    { "(bad)",          { XX } },
2845
    /* 30 */
2846
    { "(bad)",          { XX } },
2847
    { "(bad)",          { XX } },
2848
    { "(bad)",          { XX } },
2849
    { "(bad)",          { XX } },
2850
    { "(bad)",          { XX } },
2851
    { "(bad)",          { XX } },
2852
    { "(bad)",          { XX } },
2853
    { "(bad)",          { XX } },
2854
    /* 38 */
2855
    { "(bad)",          { XX } },
2856
    { "(bad)",          { XX } },
2857
    { "(bad)",          { XX } },
2858
    { "(bad)",          { XX } },
2859
    { "(bad)",          { XX } },
2860
    { "(bad)",          { XX } },
2861
    { "(bad)",          { XX } },
2862
    { "(bad)",          { XX } },
2863
    /* 40 */
2864
    { "protb",          { { OP_DREX3, q_mode } } },
2865
    { "protw",          { { OP_DREX3, q_mode } } },
2866
    { "protd",          { { OP_DREX3, q_mode } } },
2867
    { "protq",          { { OP_DREX3, q_mode } } },
2868
    { "pshlb",          { { OP_DREX3, q_mode } } },
2869
    { "pshlw",          { { OP_DREX3, q_mode } } },
2870
    { "pshld",          { { OP_DREX3, q_mode } } },
2871
    { "pshlq",          { { OP_DREX3, q_mode } } },
2872
    /* 48 */
2873
    { "pshab",          { { OP_DREX3, q_mode } } },
2874
    { "pshaw",          { { OP_DREX3, q_mode } } },
2875
    { "pshad",          { { OP_DREX3, q_mode } } },
2876
    { "pshaq",          { { OP_DREX3, q_mode } } },
2877
    { "(bad)",          { XX } },
2878
    { "(bad)",          { XX } },
2879
    { "(bad)",          { XX } },
2880
    { "(bad)",          { XX } },
2881
    /* 50 */
2882
    { "(bad)",          { XX } },
2883
    { "(bad)",          { XX } },
2884
    { "(bad)",          { XX } },
2885
    { "(bad)",          { XX } },
2886
    { "(bad)",          { XX } },
2887
    { "(bad)",          { XX } },
2888
    { "(bad)",          { XX } },
2889
    { "(bad)",          { XX } },
2890
    /* 58 */
2891
    { "(bad)",          { XX } },
2892
    { "(bad)",          { XX } },
2893
    { "(bad)",          { XX } },
2894
    { "(bad)",          { XX } },
2895
    { "(bad)",          { XX } },
2896
    { "(bad)",          { XX } },
2897
    { "(bad)",          { XX } },
2898
    { "(bad)",          { XX } },
2899
    /* 60 */
2900
    { "(bad)",          { XX } },
2901
    { "(bad)",          { XX } },
2902
    { "(bad)",          { XX } },
2903
    { "(bad)",          { XX } },
2904
    { "(bad)",          { XX } },
2905
    { "(bad)",          { XX } },
2906
    { "(bad)",          { XX } },
2907
    { "(bad)",          { XX } },
2908
    /* 68 */
2909
    { "(bad)",          { XX } },
2910
    { "(bad)",          { XX } },
2911
    { "(bad)",          { XX } },
2912
    { "(bad)",          { XX } },
2913
    { "(bad)",          { XX } },
2914
    { "(bad)",          { XX } },
2915
    { "(bad)",          { XX } },
2916
    { "(bad)",          { XX } },
2917
    /* 70 */
2918
    { "(bad)",          { XX } },
2919
    { "(bad)",          { XX } },
2920
    { "(bad)",          { XX } },
2921
    { "(bad)",          { XX } },
2922
    { "(bad)",          { XX } },
2923
    { "(bad)",          { XX } },
2924
    { "(bad)",          { XX } },
2925
    { "(bad)",          { XX } },
2926
    /* 78 */
2927
    { "(bad)",          { XX } },
2928
    { "(bad)",          { XX } },
2929
    { "(bad)",          { XX } },
2930
    { "(bad)",          { XX } },
2931
    { "(bad)",          { XX } },
2932
    { "(bad)",          { XX } },
2933
    { "(bad)",          { XX } },
2934
    { "(bad)",          { XX } },
2935
    /* 80 */
2936
    { "(bad)",          { XX } },
2937
    { "(bad)",          { XX } },
2938
    { "(bad)",          { XX } },
2939
    { "(bad)",          { XX } },
2940
    { "(bad)",          { XX } },
2941
    { "pmacssww",       { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
2942
    { "pmacsswd",       { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
2943
    { "pmacssdql",      { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
2944
    /* 88 */
2945
    { "(bad)",          { XX } },
2946
    { "(bad)",          { XX } },
2947
    { "(bad)",          { XX } },
2948
    { "(bad)",          { XX } },
2949
    { "(bad)",          { XX } },
2950
    { "(bad)",          { XX } },
2951
    { "pmacssdd",       { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
2952
    { "pmacssdqh",      { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
2953
    /* 90 */
2954
    { "(bad)",          { XX } },
2955
    { "(bad)",          { XX } },
2956
    { "(bad)",          { XX } },
2957
    { "(bad)",          { XX } },
2958
    { "(bad)",          { XX } },
2959
    { "pmacsww",        { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
2960
    { "pmacswd",        { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
2961
    { "pmacsdql",       { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
2962
    /* 98 */
2963
    { "(bad)",          { XX } },
2964
    { "(bad)",          { XX } },
2965
    { "(bad)",          { XX } },
2966
    { "(bad)",          { XX } },
2967
    { "(bad)",          { XX } },
2968
    { "(bad)",          { XX } },
2969
    { "pmacsdd",        { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
2970
    { "pmacsdqh",       { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
2971
    /* a0 */
2972
    { "(bad)",          { XX } },
2973
    { "(bad)",          { XX } },
2974
    { "(bad)",          { XX } },
2975
    { "(bad)",          { XX } },
2976
    { "(bad)",          { XX } },
2977
    { "(bad)",          { XX } },
2978
    { "pmadcsswd",      { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
2979
    { "(bad)",          { XX } },
2980
    /* a8 */
2981
    { "(bad)",          { XX } },
2982
    { "(bad)",          { XX } },
2983
    { "(bad)",          { XX } },
2984
    { "(bad)",          { XX } },
2985
    { "(bad)",          { XX } },
2986
    { "(bad)",          { XX } },
2987
    { "(bad)",          { XX } },
2988
    { "(bad)",          { XX } },
2989
    /* b0 */
2990
    { "(bad)",          { XX } },
2991
    { "(bad)",          { XX } },
2992
    { "(bad)",          { XX } },
2993
    { "(bad)",          { XX } },
2994
    { "(bad)",          { XX } },
2995
    { "(bad)",          { XX } },
2996
    { "pmadcswd",       { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
2997
    { "(bad)",          { XX } },
2998
    /* b8 */
2999
    { "(bad)",          { XX } },
3000
    { "(bad)",          { XX } },
3001
    { "(bad)",          { XX } },
3002
    { "(bad)",          { XX } },
3003
    { "(bad)",          { XX } },
3004
    { "(bad)",          { XX } },
3005
    { "(bad)",          { XX } },
3006
    { "(bad)",          { XX } },
3007
    /* c0 */
3008
    { "(bad)",          { XX } },
3009
    { "(bad)",          { XX } },
3010
    { "(bad)",          { XX } },
3011
    { "(bad)",          { XX } },
3012
    { "(bad)",          { XX } },
3013
    { "(bad)",          { XX } },
3014
    { "(bad)",          { XX } },
3015
    { "(bad)",          { XX } },
3016
    /* c8 */
3017
    { "(bad)",          { XX } },
3018
    { "(bad)",          { XX } },
3019
    { "(bad)",          { XX } },
3020
    { "(bad)",          { XX } },
3021
    { "(bad)",          { XX } },
3022
    { "(bad)",          { XX } },
3023
    { "(bad)",          { XX } },
3024
    { "(bad)",          { XX } },
3025
    /* d0 */
3026
    { "(bad)",          { XX } },
3027
    { "(bad)",          { XX } },
3028
    { "(bad)",          { XX } },
3029
    { "(bad)",          { XX } },
3030
    { "(bad)",          { XX } },
3031
    { "(bad)",          { XX } },
3032
    { "(bad)",          { XX } },
3033
    { "(bad)",          { XX } },
3034
    /* d8 */
3035
    { "(bad)",          { XX } },
3036
    { "(bad)",          { XX } },
3037
    { "(bad)",          { XX } },
3038
    { "(bad)",          { XX } },
3039
    { "(bad)",          { XX } },
3040
    { "(bad)",          { XX } },
3041
    { "(bad)",          { XX } },
3042
    { "(bad)",          { XX } },
3043
    /* e0 */
3044
    { "(bad)",          { XX } },
3045
    { "(bad)",          { XX } },
3046
    { "(bad)",          { XX } },
3047
    { "(bad)",          { XX } },
3048
    { "(bad)",          { XX } },
3049
    { "(bad)",          { XX } },
3050
    { "(bad)",          { XX } },
3051
    { "(bad)",          { XX } },
3052
    /* e8 */
3053
    { "(bad)",          { XX } },
3054
    { "(bad)",          { XX } },
3055
    { "(bad)",          { XX } },
3056
    { "(bad)",          { XX } },
3057
    { "(bad)",          { XX } },
3058
    { "(bad)",          { XX } },
3059
    { "(bad)",          { XX } },
3060
    { "(bad)",          { XX } },
3061
    /* f0 */
3062
    { "(bad)",          { XX } },
3063
    { "(bad)",          { XX } },
3064
    { "(bad)",          { XX } },
3065
    { "(bad)",          { XX } },
3066
    { "(bad)",          { XX } },
3067
    { "(bad)",          { XX } },
3068
    { "(bad)",          { XX } },
3069
    { "(bad)",          { XX } },
3070
    /* f8 */
3071
    { "(bad)",          { XX } },
3072
    { "(bad)",          { XX } },
3073
    { "(bad)",          { XX } },
3074
    { "(bad)",          { XX } },
3075
    { "(bad)",          { XX } },
3076
    { "(bad)",          { XX } },
3077
    { "(bad)",          { XX } },
3078
    { "(bad)",          { XX } },
3079
  },
3080
  /* THREE_BYTE_0F25 */
3081
  {
3082
    /* 00 */
3083
    { "(bad)",          { XX } },
3084
    { "(bad)",          { XX } },
3085
    { "(bad)",          { XX } },
3086
    { "(bad)",          { XX } },
3087
    { "(bad)",          { XX } },
3088
    { "(bad)",          { XX } },
3089
    { "(bad)",          { XX } },
3090
    { "(bad)",          { XX } },
3091
    /* 08 */
3092
    { "(bad)",          { XX } },
3093
    { "(bad)",          { XX } },
3094
    { "(bad)",          { XX } },
3095
    { "(bad)",          { XX } },
3096
    { "(bad)",          { XX } },
3097
    { "(bad)",          { XX } },
3098
    { "(bad)",          { XX } },
3099
    { "(bad)",          { XX } },
3100
    /* 10 */
3101
    { "(bad)",          { XX } },
3102
    { "(bad)",          { XX } },
3103
    { "(bad)",          { XX } },
3104
    { "(bad)",          { XX } },
3105
    { "(bad)",          { XX } },
3106
    { "(bad)",          { XX } },
3107
    { "(bad)",          { XX } },
3108
    { "(bad)",          { XX } },
3109
    /* 18 */
3110
    { "(bad)",          { XX } },
3111
    { "(bad)",          { XX } },
3112
    { "(bad)",          { XX } },
3113
    { "(bad)",          { XX } },
3114
    { "(bad)",          { XX } },
3115
    { "(bad)",          { XX } },
3116
    { "(bad)",          { XX } },
3117
    { "(bad)",          { XX } },
3118
    /* 20 */
3119
    { "(bad)",          { XX } },
3120
    { "(bad)",          { XX } },
3121
    { "(bad)",          { XX } },
3122
    { "(bad)",          { XX } },
3123
    { "(bad)",          { XX } },
3124
    { "(bad)",          { XX } },
3125
    { "(bad)",          { XX } },
3126
    { "(bad)",          { XX } },
3127
    /* 28 */
3128
    { "(bad)",          { XX } },
3129
    { "(bad)",          { XX } },
3130
    { "(bad)",          { XX } },
3131
    { "(bad)",          { XX } },
3132
    { "comps",          { { OP_DREX3, q_mode }, { OP_DREX_FCMP, b_mode } } },
3133
    { "compd",          { { OP_DREX3, q_mode }, { OP_DREX_FCMP, b_mode } } },
3134
    { "comss",          { { OP_DREX3, w_mode }, { OP_DREX_FCMP, b_mode } } },
3135
    { "comsd",          { { OP_DREX3, d_mode }, { OP_DREX_FCMP, b_mode } } },
3136
    /* 30 */
3137
    { "(bad)",          { XX } },
3138
    { "(bad)",          { XX } },
3139
    { "(bad)",          { XX } },
3140
    { "(bad)",          { XX } },
3141
    { "(bad)",          { XX } },
3142
    { "(bad)",          { XX } },
3143
    { "(bad)",          { XX } },
3144
    { "(bad)",          { XX } },
3145
    /* 38 */
3146
    { "(bad)",          { XX } },
3147
    { "(bad)",          { XX } },
3148
    { "(bad)",          { XX } },
3149
    { "(bad)",          { XX } },
3150
    { "(bad)",          { XX } },
3151
    { "(bad)",          { XX } },
3152
    { "(bad)",          { XX } },
3153
    { "(bad)",          { XX } },
3154
    /* 40 */
3155
    { "(bad)",          { XX } },
3156
    { "(bad)",          { XX } },
3157
    { "(bad)",          { XX } },
3158
    { "(bad)",          { XX } },
3159
    { "(bad)",          { XX } },
3160
    { "(bad)",          { XX } },
3161
    { "(bad)",          { XX } },
3162
    { "(bad)",          { XX } },
3163
    /* 48 */
3164
    { "(bad)",          { XX } },
3165
    { "(bad)",          { XX } },
3166
    { "(bad)",          { XX } },
3167
    { "(bad)",          { XX } },
3168
    { "pcomb",          { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
3169
    { "pcomw",          { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
3170
    { "pcomd",          { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
3171
    { "pcomq",          { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
3172
    /* 50 */
3173
    { "(bad)",          { XX } },
3174
    { "(bad)",          { XX } },
3175
    { "(bad)",          { XX } },
3176
    { "(bad)",          { XX } },
3177
    { "(bad)",          { XX } },
3178
    { "(bad)",          { XX } },
3179
    { "(bad)",          { XX } },
3180
    { "(bad)",          { XX } },
3181
    /* 58 */
3182
    { "(bad)",          { XX } },
3183
    { "(bad)",          { XX } },
3184
    { "(bad)",          { XX } },
3185
    { "(bad)",          { XX } },
3186
    { "(bad)",          { XX } },
3187
    { "(bad)",          { XX } },
3188
    { "(bad)",          { XX } },
3189
    { "(bad)",          { XX } },
3190
    /* 60 */
3191
    { "(bad)",          { XX } },
3192
    { "(bad)",          { XX } },
3193
    { "(bad)",          { XX } },
3194
    { "(bad)",          { XX } },
3195
    { "(bad)",          { XX } },
3196
    { "(bad)",          { XX } },
3197
    { "(bad)",          { XX } },
3198
    { "(bad)",          { XX } },
3199
    /* 68 */
3200
    { "(bad)",          { XX } },
3201
    { "(bad)",          { XX } },
3202
    { "(bad)",          { XX } },
3203
    { "(bad)",          { XX } },
3204
    { "pcomub",         { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
3205
    { "pcomuw",         { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
3206
    { "pcomud",         { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
3207
    { "pcomuq",         { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
3208
    /* 70 */
3209
    { "(bad)",          { XX } },
3210
    { "(bad)",          { XX } },
3211
    { "(bad)",          { XX } },
3212
    { "(bad)",          { XX } },
3213
    { "(bad)",          { XX } },
3214
    { "(bad)",          { XX } },
3215
    { "(bad)",          { XX } },
3216
    { "(bad)",          { XX } },
3217
    /* 78 */
3218
    { "(bad)",          { XX } },
3219
    { "(bad)",          { XX } },
3220
    { "(bad)",          { XX } },
3221
    { "(bad)",          { XX } },
3222
    { "(bad)",          { XX } },
3223
    { "(bad)",          { XX } },
3224
    { "(bad)",          { XX } },
3225
    { "(bad)",          { XX } },
3226
    /* 80 */
3227
    { "(bad)",          { XX } },
3228
    { "(bad)",          { XX } },
3229
    { "(bad)",          { XX } },
3230
    { "(bad)",          { XX } },
3231
    { "(bad)",          { XX } },
3232
    { "(bad)",          { XX } },
3233
    { "(bad)",          { XX } },
3234
    { "(bad)",          { XX } },
3235
    /* 88 */
3236
    { "(bad)",          { XX } },
3237
    { "(bad)",          { XX } },
3238
    { "(bad)",          { XX } },
3239
    { "(bad)",          { XX } },
3240
    { "(bad)",          { XX } },
3241
    { "(bad)",          { XX } },
3242
    { "(bad)",          { XX } },
3243
    { "(bad)",          { XX } },
3244
    /* 90 */
3245
    { "(bad)",          { XX } },
3246
    { "(bad)",          { XX } },
3247
    { "(bad)",          { XX } },
3248
    { "(bad)",          { XX } },
3249
    { "(bad)",          { XX } },
3250
    { "(bad)",          { XX } },
3251
    { "(bad)",          { XX } },
3252
    { "(bad)",          { XX } },
3253
    /* 98 */
3254
    { "(bad)",          { XX } },
3255
    { "(bad)",          { XX } },
3256
    { "(bad)",          { XX } },
3257
    { "(bad)",          { XX } },
3258
    { "(bad)",          { XX } },
3259
    { "(bad)",          { XX } },
3260
    { "(bad)",          { XX } },
3261
    { "(bad)",          { XX } },
3262
    /* a0 */
3263
    { "(bad)",          { XX } },
3264
    { "(bad)",          { XX } },
3265
    { "(bad)",          { XX } },
3266
    { "(bad)",          { XX } },
3267
    { "(bad)",          { XX } },
3268
    { "(bad)",          { XX } },
3269
    { "(bad)",          { XX } },
3270
    { "(bad)",          { XX } },
3271
    /* a8 */
3272
    { "(bad)",          { XX } },
3273
    { "(bad)",          { XX } },
3274
    { "(bad)",          { XX } },
3275
    { "(bad)",          { XX } },
3276
    { "(bad)",          { XX } },
3277
    { "(bad)",          { XX } },
3278
    { "(bad)",          { XX } },
3279
    { "(bad)",          { XX } },
3280
    /* b0 */
3281
    { "(bad)",          { XX } },
3282
    { "(bad)",          { XX } },
3283
    { "(bad)",          { XX } },
3284
    { "(bad)",          { XX } },
3285
    { "(bad)",          { XX } },
3286
    { "(bad)",          { XX } },
3287
    { "(bad)",          { XX } },
3288
    { "(bad)",          { XX } },
3289
    /* b8 */
3290
    { "(bad)",          { XX } },
3291
    { "(bad)",          { XX } },
3292
    { "(bad)",          { XX } },
3293
    { "(bad)",          { XX } },
3294
    { "(bad)",          { XX } },
3295
    { "(bad)",          { XX } },
3296
    { "(bad)",          { XX } },
3297
    { "(bad)",          { XX } },
3298
    /* c0 */
3299
    { "(bad)",          { XX } },
3300
    { "(bad)",          { XX } },
3301
    { "(bad)",          { XX } },
3302
    { "(bad)",          { XX } },
3303
    { "(bad)",          { XX } },
3304
    { "(bad)",          { XX } },
3305
    { "(bad)",          { XX } },
3306
    { "(bad)",          { XX } },
3307
    /* c8 */
3308
    { "(bad)",          { XX } },
3309
    { "(bad)",          { XX } },
3310
    { "(bad)",          { XX } },
3311
    { "(bad)",          { XX } },
3312
    { "(bad)",          { XX } },
3313
    { "(bad)",          { XX } },
3314
    { "(bad)",          { XX } },
3315
    { "(bad)",          { XX } },
3316
    /* d0 */
3317
    { "(bad)",          { XX } },
3318
    { "(bad)",          { XX } },
3319
    { "(bad)",          { XX } },
3320
    { "(bad)",          { XX } },
3321
    { "(bad)",          { XX } },
3322
    { "(bad)",          { XX } },
3323
    { "(bad)",          { XX } },
3324
    { "(bad)",          { XX } },
3325
    /* d8 */
3326
    { "(bad)",          { XX } },
3327
    { "(bad)",          { XX } },
3328
    { "(bad)",          { XX } },
3329
    { "(bad)",          { XX } },
3330
    { "(bad)",          { XX } },
3331
    { "(bad)",          { XX } },
3332
    { "(bad)",          { XX } },
3333
    { "(bad)",          { XX } },
3334
    /* e0 */
3335
    { "(bad)",          { XX } },
3336
    { "(bad)",          { XX } },
3337
    { "(bad)",          { XX } },
3338
    { "(bad)",          { XX } },
3339
    { "(bad)",          { XX } },
3340
    { "(bad)",          { XX } },
3341
    { "(bad)",          { XX } },
3342
    { "(bad)",          { XX } },
3343
    /* e8 */
3344
    { "(bad)",          { XX } },
3345
    { "(bad)",          { XX } },
3346
    { "(bad)",          { XX } },
3347
    { "(bad)",          { XX } },
3348
    { "(bad)",          { XX } },
3349
    { "(bad)",          { XX } },
3350
    { "(bad)",          { XX } },
3351
    { "(bad)",          { XX } },
3352
    /* f0 */
3353
    { "(bad)",          { XX } },
3354
    { "(bad)",          { XX } },
3355
    { "(bad)",          { XX } },
3356
    { "(bad)",          { XX } },
3357
    { "(bad)",          { XX } },
3358
    { "(bad)",          { XX } },
3359
    { "(bad)",          { XX } },
3360
    { "(bad)",          { XX } },
3361
    /* f8 */
3362
    { "(bad)",          { XX } },
3363
    { "(bad)",          { XX } },
3364
    { "(bad)",          { XX } },
3365
    { "(bad)",          { XX } },
3366
    { "(bad)",          { XX } },
3367
    { "(bad)",          { XX } },
3368
    { "(bad)",          { XX } },
3369
    { "(bad)",          { XX } },
3370
  },
3371
  /* THREE_BYTE_0F38 */
3372
  {
3373
    /* 00 */
3374
    { "pshufb",         { MX, EM } },
3375
    { "phaddw",         { MX, EM } },
3376
    { "phaddd",         { MX, EM } },
3377
    { "phaddsw",        { MX, EM } },
3378
    { "pmaddubsw",      { MX, EM } },
3379
    { "phsubw",         { MX, EM } },
3380
    { "phsubd",         { MX, EM } },
3381
    { "phsubsw",        { MX, EM } },
3382
    /* 08 */
3383
    { "psignb",         { MX, EM } },
3384
    { "psignw",         { MX, EM } },
3385
    { "psignd",         { MX, EM } },
3386
    { "pmulhrsw",       { MX, EM } },
3387
    { "(bad)",          { XX } },
3388
    { "(bad)",          { XX } },
3389
    { "(bad)",          { XX } },
3390
    { "(bad)",          { XX } },
3391
    /* 10 */
3392
    { PREFIX_TABLE (PREFIX_0F3810) },
3393
    { "(bad)",          { XX } },
3394
    { "(bad)",          { XX } },
3395
    { "(bad)",          { XX } },
3396
    { PREFIX_TABLE (PREFIX_0F3814) },
3397
    { PREFIX_TABLE (PREFIX_0F3815) },
3398
    { "(bad)",          { XX } },
3399
    { PREFIX_TABLE (PREFIX_0F3817) },
3400
    /* 18 */
3401
    { "(bad)",          { XX } },
3402
    { "(bad)",          { XX } },
3403
    { "(bad)",          { XX } },
3404
    { "(bad)",          { XX } },
3405
    { "pabsb",          { MX, EM } },
3406
    { "pabsw",          { MX, EM } },
3407
    { "pabsd",          { MX, EM } },
3408
    { "(bad)",          { XX } },
3409
    /* 20 */
3410
    { PREFIX_TABLE (PREFIX_0F3820) },
3411
    { PREFIX_TABLE (PREFIX_0F3821) },
3412
    { PREFIX_TABLE (PREFIX_0F3822) },
3413
    { PREFIX_TABLE (PREFIX_0F3823) },
3414
    { PREFIX_TABLE (PREFIX_0F3824) },
3415
    { PREFIX_TABLE (PREFIX_0F3825) },
3416
    { "(bad)",          { XX } },
3417
    { "(bad)",          { XX } },
3418
    /* 28 */
3419
    { PREFIX_TABLE (PREFIX_0F3828) },
3420
    { PREFIX_TABLE (PREFIX_0F3829) },
3421
    { PREFIX_TABLE (PREFIX_0F382A) },
3422
    { PREFIX_TABLE (PREFIX_0F382B) },
3423
    { "(bad)",          { XX } },
3424
    { "(bad)",          { XX } },
3425
    { "(bad)",          { XX } },
3426
    { "(bad)",          { XX } },
3427
    /* 30 */
3428
    { PREFIX_TABLE (PREFIX_0F3830) },
3429
    { PREFIX_TABLE (PREFIX_0F3831) },
3430
    { PREFIX_TABLE (PREFIX_0F3832) },
3431
    { PREFIX_TABLE (PREFIX_0F3833) },
3432
    { PREFIX_TABLE (PREFIX_0F3834) },
3433
    { PREFIX_TABLE (PREFIX_0F3835) },
3434
    { "(bad)",          { XX } },
3435
    { PREFIX_TABLE (PREFIX_0F3837) },
3436
    /* 38 */
3437
    { PREFIX_TABLE (PREFIX_0F3838) },
3438
    { PREFIX_TABLE (PREFIX_0F3839) },
3439
    { PREFIX_TABLE (PREFIX_0F383A) },
3440
    { PREFIX_TABLE (PREFIX_0F383B) },
3441
    { PREFIX_TABLE (PREFIX_0F383C) },
3442
    { PREFIX_TABLE (PREFIX_0F383D) },
3443
    { PREFIX_TABLE (PREFIX_0F383E) },
3444
    { PREFIX_TABLE (PREFIX_0F383F) },
3445
    /* 40 */
3446
    { PREFIX_TABLE (PREFIX_0F3840) },
3447
    { PREFIX_TABLE (PREFIX_0F3841) },
3448
    { "(bad)",          { XX } },
3449
    { "(bad)",          { XX } },
3450
    { "(bad)",          { XX } },
3451
    { "(bad)",          { XX } },
3452
    { "(bad)",          { XX } },
3453
    { "(bad)",          { XX } },
3454
    /* 48 */
3455
    { "(bad)",          { XX } },
3456
    { "(bad)",          { XX } },
3457
    { "(bad)",          { XX } },
3458
    { "(bad)",          { XX } },
3459
    { "(bad)",          { XX } },
3460
    { "(bad)",          { XX } },
3461
    { "(bad)",          { XX } },
3462
    { "(bad)",          { XX } },
3463
    /* 50 */
3464
    { "(bad)",          { XX } },
3465
    { "(bad)",          { XX } },
3466
    { "(bad)",          { XX } },
3467
    { "(bad)",          { XX } },
3468
    { "(bad)",          { XX } },
3469
    { "(bad)",          { XX } },
3470
    { "(bad)",          { XX } },
3471
    { "(bad)",          { XX } },
3472
    /* 58 */
3473
    { "(bad)",          { XX } },
3474
    { "(bad)",          { XX } },
3475
    { "(bad)",          { XX } },
3476
    { "(bad)",          { XX } },
3477
    { "(bad)",          { XX } },
3478
    { "(bad)",          { XX } },
3479
    { "(bad)",          { XX } },
3480
    { "(bad)",          { XX } },
3481
    /* 60 */
3482
    { "(bad)",          { XX } },
3483
    { "(bad)",          { XX } },
3484
    { "(bad)",          { XX } },
3485
    { "(bad)",          { XX } },
3486
    { "(bad)",          { XX } },
3487
    { "(bad)",          { XX } },
3488
    { "(bad)",          { XX } },
3489
    { "(bad)",          { XX } },
3490
    /* 68 */
3491
    { "(bad)",          { XX } },
3492
    { "(bad)",          { XX } },
3493
    { "(bad)",          { XX } },
3494
    { "(bad)",          { XX } },
3495
    { "(bad)",          { XX } },
3496
    { "(bad)",          { XX } },
3497
    { "(bad)",          { XX } },
3498
    { "(bad)",          { XX } },
3499
    /* 70 */
3500
    { "(bad)",          { XX } },
3501
    { "(bad)",          { XX } },
3502
    { "(bad)",          { XX } },
3503
    { "(bad)",          { XX } },
3504
    { "(bad)",          { XX } },
3505
    { "(bad)",          { XX } },
3506
    { "(bad)",          { XX } },
3507
    { "(bad)",          { XX } },
3508
    /* 78 */
3509
    { "(bad)",          { XX } },
3510
    { "(bad)",          { XX } },
3511
    { "(bad)",          { XX } },
3512
    { "(bad)",          { XX } },
3513
    { "(bad)",          { XX } },
3514
    { "(bad)",          { XX } },
3515
    { "(bad)",          { XX } },
3516
    { "(bad)",          { XX } },
3517
    /* 80 */
3518
    { "(bad)",          { XX } },
3519
    { "(bad)",          { XX } },
3520
    { "(bad)",          { XX } },
3521
    { "(bad)",          { XX } },
3522
    { "(bad)",          { XX } },
3523
    { "(bad)",          { XX } },
3524
    { "(bad)",          { XX } },
3525
    { "(bad)",          { XX } },
3526
    /* 88 */
3527
    { "(bad)",          { XX } },
3528
    { "(bad)",          { XX } },
3529
    { "(bad)",          { XX } },
3530
    { "(bad)",          { XX } },
3531
    { "(bad)",          { XX } },
3532
    { "(bad)",          { XX } },
3533
    { "(bad)",          { XX } },
3534
    { "(bad)",          { XX } },
3535
    /* 90 */
3536
    { "(bad)",          { XX } },
3537
    { "(bad)",          { XX } },
3538
    { "(bad)",          { XX } },
3539
    { "(bad)",          { XX } },
3540
    { "(bad)",          { XX } },
3541
    { "(bad)",          { XX } },
3542
    { "(bad)",          { XX } },
3543
    { "(bad)",          { XX } },
3544
    /* 98 */
3545
    { "(bad)",          { XX } },
3546
    { "(bad)",          { XX } },
3547
    { "(bad)",          { XX } },
3548
    { "(bad)",          { XX } },
3549
    { "(bad)",          { XX } },
3550
    { "(bad)",          { XX } },
3551
    { "(bad)",          { XX } },
3552
    { "(bad)",          { XX } },
3553
    /* a0 */
3554
    { "(bad)",          { XX } },
3555
    { "(bad)",          { XX } },
3556
    { "(bad)",          { XX } },
3557
    { "(bad)",          { XX } },
3558
    { "(bad)",          { XX } },
3559
    { "(bad)",          { XX } },
3560
    { "(bad)",          { XX } },
3561
    { "(bad)",          { XX } },
3562
    /* a8 */
3563
    { "(bad)",          { XX } },
3564
    { "(bad)",          { XX } },
3565
    { "(bad)",          { XX } },
3566
    { "(bad)",          { XX } },
3567
    { "(bad)",          { XX } },
3568
    { "(bad)",          { XX } },
3569
    { "(bad)",          { XX } },
3570
    { "(bad)",          { XX } },
3571
    /* b0 */
3572
    { "(bad)",          { XX } },
3573
    { "(bad)",          { XX } },
3574
    { "(bad)",          { XX } },
3575
    { "(bad)",          { XX } },
3576
    { "(bad)",          { XX } },
3577
    { "(bad)",          { XX } },
3578
    { "(bad)",          { XX } },
3579
    { "(bad)",          { XX } },
3580
    /* b8 */
3581
    { "(bad)",          { XX } },
3582
    { "(bad)",          { XX } },
3583
    { "(bad)",          { XX } },
3584
    { "(bad)",          { XX } },
3585
    { "(bad)",          { XX } },
3586
    { "(bad)",          { XX } },
3587
    { "(bad)",          { XX } },
3588
    { "(bad)",          { XX } },
3589
    /* c0 */
3590
    { "(bad)",          { XX } },
3591
    { "(bad)",          { XX } },
3592
    { "(bad)",          { XX } },
3593
    { "(bad)",          { XX } },
3594
    { "(bad)",          { XX } },
3595
    { "(bad)",          { XX } },
3596
    { "(bad)",          { XX } },
3597
    { "(bad)",          { XX } },
3598
    /* c8 */
3599
    { "(bad)",          { XX } },
3600
    { "(bad)",          { XX } },
3601
    { "(bad)",          { XX } },
3602
    { "(bad)",          { XX } },
3603
    { "(bad)",          { XX } },
3604
    { "(bad)",          { XX } },
3605
    { "(bad)",          { XX } },
3606
    { "(bad)",          { XX } },
3607
    /* d0 */
3608
    { "(bad)",          { XX } },
3609
    { "(bad)",          { XX } },
3610
    { "(bad)",          { XX } },
3611
    { "(bad)",          { XX } },
3612
    { "(bad)",          { XX } },
3613
    { "(bad)",          { XX } },
3614
    { "(bad)",          { XX } },
3615
    { "(bad)",          { XX } },
3616
    /* d8 */
3617
    { "(bad)",          { XX } },
3618
    { "(bad)",          { XX } },
3619
    { "(bad)",          { XX } },
3620
    { "(bad)",          { XX } },
3621
    { "(bad)",          { XX } },
3622
    { "(bad)",          { XX } },
3623
    { "(bad)",          { XX } },
3624
    { "(bad)",          { XX } },
3625
    /* e0 */
3626
    { "(bad)",          { XX } },
3627
    { "(bad)",          { XX } },
3628
    { "(bad)",          { XX } },
3629
    { "(bad)",          { XX } },
3630
    { "(bad)",          { XX } },
3631
    { "(bad)",          { XX } },
3632
    { "(bad)",          { XX } },
3633
    { "(bad)",          { XX } },
3634
    /* e8 */
3635
    { "(bad)",          { XX } },
3636
    { "(bad)",          { XX } },
3637
    { "(bad)",          { XX } },
3638
    { "(bad)",          { XX } },
3639
    { "(bad)",          { XX } },
3640
    { "(bad)",          { XX } },
3641
    { "(bad)",          { XX } },
3642
    { "(bad)",          { XX } },
3643
    /* f0 */
3644
    { PREFIX_TABLE (PREFIX_0F38F0) },
3645
    { PREFIX_TABLE (PREFIX_0F38F1) },
3646
    { "(bad)",          { XX } },
3647
    { "(bad)",          { XX } },
3648
    { "(bad)",          { XX } },
3649
    { "(bad)",          { XX } },
3650
    { "(bad)",          { XX } },
3651
    { "(bad)",          { XX } },
3652
    /* f8 */
3653
    { "(bad)",          { XX } },
3654
    { "(bad)",          { XX } },
3655
    { "(bad)",          { XX } },
3656
    { "(bad)",          { XX } },
3657
    { "(bad)",          { XX } },
3658
    { "(bad)",          { XX } },
3659
    { "(bad)",          { XX } },
3660
    { "(bad)",          { XX } },
3661
  },
3662
  /* THREE_BYTE_0F3A */
3663
  {
3664
    /* 00 */
3665
    { "(bad)",          { XX } },
3666
    { "(bad)",          { XX } },
3667
    { "(bad)",          { XX } },
3668
    { "(bad)",          { XX } },
3669
    { "(bad)",          { XX } },
3670
    { "(bad)",          { XX } },
3671
    { "(bad)",          { XX } },
3672
    { "(bad)",          { XX } },
3673
    /* 08 */
3674
    { PREFIX_TABLE (PREFIX_0F3A08) },
3675
    { PREFIX_TABLE (PREFIX_0F3A09) },
3676
    { PREFIX_TABLE (PREFIX_0F3A0A) },
3677
    { PREFIX_TABLE (PREFIX_0F3A0B) },
3678
    { PREFIX_TABLE (PREFIX_0F3A0C) },
3679
    { PREFIX_TABLE (PREFIX_0F3A0D) },
3680
    { PREFIX_TABLE (PREFIX_0F3A0E) },
3681
    { "palignr",        { MX, EM, Ib } },
3682
    /* 10 */
3683
    { "(bad)",          { XX } },
3684
    { "(bad)",          { XX } },
3685
    { "(bad)",          { XX } },
3686
    { "(bad)",          { XX } },
3687
    { PREFIX_TABLE (PREFIX_0F3A14) },
3688
    { PREFIX_TABLE (PREFIX_0F3A15) },
3689
    { PREFIX_TABLE (PREFIX_0F3A16) },
3690
    { PREFIX_TABLE (PREFIX_0F3A17) },
3691
    /* 18 */
3692
    { "(bad)",          { XX } },
3693
    { "(bad)",          { XX } },
3694
    { "(bad)",          { XX } },
3695
    { "(bad)",          { XX } },
3696
    { "(bad)",          { XX } },
3697
    { "(bad)",          { XX } },
3698
    { "(bad)",          { XX } },
3699
    { "(bad)",          { XX } },
3700
    /* 20 */
3701
    { PREFIX_TABLE (PREFIX_0F3A20) },
3702
    { PREFIX_TABLE (PREFIX_0F3A21) },
3703
    { PREFIX_TABLE (PREFIX_0F3A22) },
3704
    { "(bad)",          { XX } },
3705
    { "(bad)",          { XX } },
3706
    { "(bad)",          { XX } },
3707
    { "(bad)",          { XX } },
3708
    { "(bad)",          { XX } },
3709
    /* 28 */
3710
    { "(bad)",          { XX } },
3711
    { "(bad)",          { XX } },
3712
    { "(bad)",          { XX } },
3713
    { "(bad)",          { XX } },
3714
    { "(bad)",          { XX } },
3715
    { "(bad)",          { XX } },
3716
    { "(bad)",          { XX } },
3717
    { "(bad)",          { XX } },
3718
    /* 30 */
3719
    { "(bad)",          { XX } },
3720
    { "(bad)",          { XX } },
3721
    { "(bad)",          { XX } },
3722
    { "(bad)",          { XX } },
3723
    { "(bad)",          { XX } },
3724
    { "(bad)",          { XX } },
3725
    { "(bad)",          { XX } },
3726
    { "(bad)",          { XX } },
3727
    /* 38 */
3728
    { "(bad)",          { XX } },
3729
    { "(bad)",          { XX } },
3730
    { "(bad)",          { XX } },
3731
    { "(bad)",          { XX } },
3732
    { "(bad)",          { XX } },
3733
    { "(bad)",          { XX } },
3734
    { "(bad)",          { XX } },
3735
    { "(bad)",          { XX } },
3736
    /* 40 */
3737
    { PREFIX_TABLE (PREFIX_0F3A40) },
3738
    { PREFIX_TABLE (PREFIX_0F3A41) },
3739
    { PREFIX_TABLE (PREFIX_0F3A42) },
3740
    { "(bad)",          { XX } },
3741
    { "(bad)",          { XX } },
3742
    { "(bad)",          { XX } },
3743
    { "(bad)",          { XX } },
3744
    { "(bad)",          { XX } },
3745
    /* 48 */
3746
    { "(bad)",          { XX } },
3747
    { "(bad)",          { XX } },
3748
    { "(bad)",          { XX } },
3749
    { "(bad)",          { XX } },
3750
    { "(bad)",          { XX } },
3751
    { "(bad)",          { XX } },
3752
    { "(bad)",          { XX } },
3753
    { "(bad)",          { XX } },
3754
    /* 50 */
3755
    { "(bad)",          { XX } },
3756
    { "(bad)",          { XX } },
3757
    { "(bad)",          { XX } },
3758
    { "(bad)",          { XX } },
3759
    { "(bad)",          { XX } },
3760
    { "(bad)",          { XX } },
3761
    { "(bad)",          { XX } },
3762
    { "(bad)",          { XX } },
3763
    /* 58 */
3764
    { "(bad)",          { XX } },
3765
    { "(bad)",          { XX } },
3766
    { "(bad)",          { XX } },
3767
    { "(bad)",          { XX } },
3768
    { "(bad)",          { XX } },
3769
    { "(bad)",          { XX } },
3770
    { "(bad)",          { XX } },
3771
    { "(bad)",          { XX } },
3772
    /* 60 */
3773
    { PREFIX_TABLE (PREFIX_0F3A60) },
3774
    { PREFIX_TABLE (PREFIX_0F3A61) },
3775
    { PREFIX_TABLE (PREFIX_0F3A62) },
3776
    { PREFIX_TABLE (PREFIX_0F3A63) },
3777
    { "(bad)",          { XX } },
3778
    { "(bad)",          { XX } },
3779
    { "(bad)",          { XX } },
3780
    { "(bad)",          { XX } },
3781
    /* 68 */
3782
    { "(bad)",          { XX } },
3783
    { "(bad)",          { XX } },
3784
    { "(bad)",          { XX } },
3785
    { "(bad)",          { XX } },
3786
    { "(bad)",          { XX } },
3787
    { "(bad)",          { XX } },
3788
    { "(bad)",          { XX } },
3789
    { "(bad)",          { XX } },
3790
    /* 70 */
3791
    { "(bad)",          { XX } },
3792
    { "(bad)",          { XX } },
3793
    { "(bad)",          { XX } },
3794
    { "(bad)",          { XX } },
3795
    { "(bad)",          { XX } },
3796
    { "(bad)",          { XX } },
3797
    { "(bad)",          { XX } },
3798
    { "(bad)",          { XX } },
3799
    /* 78 */
3800
    { "(bad)",          { XX } },
3801
    { "(bad)",          { XX } },
3802
    { "(bad)",          { XX } },
3803
    { "(bad)",          { XX } },
3804
    { "(bad)",          { XX } },
3805
    { "(bad)",          { XX } },
3806
    { "(bad)",          { XX } },
3807
    { "(bad)",          { XX } },
3808
    /* 80 */
3809
    { "(bad)",          { XX } },
3810
    { "(bad)",          { XX } },
3811
    { "(bad)",          { XX } },
3812
    { "(bad)",          { XX } },
3813
    { "(bad)",          { XX } },
3814
    { "(bad)",          { XX } },
3815
    { "(bad)",          { XX } },
3816
    { "(bad)",          { XX } },
3817
    /* 88 */
3818
    { "(bad)",          { XX } },
3819
    { "(bad)",          { XX } },
3820
    { "(bad)",          { XX } },
3821
    { "(bad)",          { XX } },
3822
    { "(bad)",          { XX } },
3823
    { "(bad)",          { XX } },
3824
    { "(bad)",          { XX } },
3825
    { "(bad)",          { XX } },
3826
    /* 90 */
3827
    { "(bad)",          { XX } },
3828
    { "(bad)",          { XX } },
3829
    { "(bad)",          { XX } },
3830
    { "(bad)",          { XX } },
3831
    { "(bad)",          { XX } },
3832
    { "(bad)",          { XX } },
3833
    { "(bad)",          { XX } },
3834
    { "(bad)",          { XX } },
3835
    /* 98 */
3836
    { "(bad)",          { XX } },
3837
    { "(bad)",          { XX } },
3838
    { "(bad)",          { XX } },
3839
    { "(bad)",          { XX } },
3840
    { "(bad)",          { XX } },
3841
    { "(bad)",          { XX } },
3842
    { "(bad)",          { XX } },
3843
    { "(bad)",          { XX } },
3844
    /* a0 */
3845
    { "(bad)",          { XX } },
3846
    { "(bad)",          { XX } },
3847
    { "(bad)",          { XX } },
3848
    { "(bad)",          { XX } },
3849
    { "(bad)",          { XX } },
3850
    { "(bad)",          { XX } },
3851
    { "(bad)",          { XX } },
3852
    { "(bad)",          { XX } },
3853
    /* a8 */
3854
    { "(bad)",          { XX } },
3855
    { "(bad)",          { XX } },
3856
    { "(bad)",          { XX } },
3857
    { "(bad)",          { XX } },
3858
    { "(bad)",          { XX } },
3859
    { "(bad)",          { XX } },
3860
    { "(bad)",          { XX } },
3861
    { "(bad)",          { XX } },
3862
    /* b0 */
3863
    { "(bad)",          { XX } },
3864
    { "(bad)",          { XX } },
3865
    { "(bad)",          { XX } },
3866
    { "(bad)",          { XX } },
3867
    { "(bad)",          { XX } },
3868
    { "(bad)",          { XX } },
3869
    { "(bad)",          { XX } },
3870
    { "(bad)",          { XX } },
3871
    /* b8 */
3872
    { "(bad)",          { XX } },
3873
    { "(bad)",          { XX } },
3874
    { "(bad)",          { XX } },
3875
    { "(bad)",          { XX } },
3876
    { "(bad)",          { XX } },
3877
    { "(bad)",          { XX } },
3878
    { "(bad)",          { XX } },
3879
    { "(bad)",          { XX } },
3880
    /* c0 */
3881
    { "(bad)",          { XX } },
3882
    { "(bad)",          { XX } },
3883
    { "(bad)",          { XX } },
3884
    { "(bad)",          { XX } },
3885
    { "(bad)",          { XX } },
3886
    { "(bad)",          { XX } },
3887
    { "(bad)",          { XX } },
3888
    { "(bad)",          { XX } },
3889
    /* c8 */
3890
    { "(bad)",          { XX } },
3891
    { "(bad)",          { XX } },
3892
    { "(bad)",          { XX } },
3893
    { "(bad)",          { XX } },
3894
    { "(bad)",          { XX } },
3895
    { "(bad)",          { XX } },
3896
    { "(bad)",          { XX } },
3897
    { "(bad)",          { XX } },
3898
    /* d0 */
3899
    { "(bad)",          { XX } },
3900
    { "(bad)",          { XX } },
3901
    { "(bad)",          { XX } },
3902
    { "(bad)",          { XX } },
3903
    { "(bad)",          { XX } },
3904
    { "(bad)",          { XX } },
3905
    { "(bad)",          { XX } },
3906
    { "(bad)",          { XX } },
3907
    /* d8 */
3908
    { "(bad)",          { XX } },
3909
    { "(bad)",          { XX } },
3910
    { "(bad)",          { XX } },
3911
    { "(bad)",          { XX } },
3912
    { "(bad)",          { XX } },
3913
    { "(bad)",          { XX } },
3914
    { "(bad)",          { XX } },
3915
    { "(bad)",          { XX } },
3916
    /* e0 */
3917
    { "(bad)",          { XX } },
3918
    { "(bad)",          { XX } },
3919
    { "(bad)",          { XX } },
3920
    { "(bad)",          { XX } },
3921
    { "(bad)",          { XX } },
3922
    { "(bad)",          { XX } },
3923
    { "(bad)",          { XX } },
3924
    { "(bad)",          { XX } },
3925
    /* e8 */
3926
    { "(bad)",          { XX } },
3927
    { "(bad)",          { XX } },
3928
    { "(bad)",          { XX } },
3929
    { "(bad)",          { XX } },
3930
    { "(bad)",          { XX } },
3931
    { "(bad)",          { XX } },
3932
    { "(bad)",          { XX } },
3933
    { "(bad)",          { XX } },
3934
    /* f0 */
3935
    { "(bad)",          { XX } },
3936
    { "(bad)",          { XX } },
3937
    { "(bad)",          { XX } },
3938
    { "(bad)",          { XX } },
3939
    { "(bad)",          { XX } },
3940
    { "(bad)",          { XX } },
3941
    { "(bad)",          { XX } },
3942
    { "(bad)",          { XX } },
3943
    /* f8 */
3944
    { "(bad)",          { XX } },
3945
    { "(bad)",          { XX } },
3946
    { "(bad)",          { XX } },
3947
    { "(bad)",          { XX } },
3948
    { "(bad)",          { XX } },
3949
    { "(bad)",          { XX } },
3950
    { "(bad)",          { XX } },
3951
    { "(bad)",          { XX } },
3952
  },
3953
  /* THREE_BYTE_0F7A */
3954
  {
3955
    /* 00 */
3956
    { "(bad)",          { XX } },
3957
    { "(bad)",          { XX } },
3958
    { "(bad)",          { XX } },
3959
    { "(bad)",          { XX } },
3960
    { "(bad)",          { XX } },
3961
    { "(bad)",          { XX } },
3962
    { "(bad)",          { XX } },
3963
    { "(bad)",          { XX } },
3964
    /* 08 */
3965
    { "(bad)",          { XX } },
3966
    { "(bad)",          { XX } },
3967
    { "(bad)",          { XX } },
3968
    { "(bad)",          { XX } },
3969
    { "(bad)",          { XX } },
3970
    { "(bad)",          { XX } },
3971
    { "(bad)",          { XX } },
3972
    { "(bad)",          { XX } },
3973
    /* 10 */
3974
    { "frczps",         { XM, EXq } },
3975
    { "frczpd",         { XM, EXq } },
3976
    { "frczss",         { XM, EXq } },
3977
    { "frczsd",         { XM, EXq } },
3978
    { "(bad)",          { XX } },
3979
    { "(bad)",          { XX } },
3980
    { "(bad)",          { XX } },
3981
    { "(bad)",          { XX } },
3982
    /* 18 */
3983
    { "(bad)",          { XX } },
3984
    { "(bad)",          { XX } },
3985
    { "(bad)",          { XX } },
3986
    { "(bad)",          { XX } },
3987
    { "(bad)",          { XX } },
3988
    { "(bad)",          { XX } },
3989
    { "(bad)",          { XX } },
3990
    { "(bad)",          { XX } },
3991
    /* 20 */
3992
    { "ptest",          { XX } },
3993
    { "(bad)",          { XX } },
3994
    { "(bad)",          { XX } },
3995
    { "(bad)",          { XX } },
3996
    { "(bad)",          { XX } },
3997
    { "(bad)",          { XX } },
3998
    { "(bad)",          { XX } },
3999
    { "(bad)",          { XX } },
4000
    /* 28 */
4001
    { "(bad)",          { XX } },
4002
    { "(bad)",          { XX } },
4003
    { "(bad)",          { XX } },
4004
    { "(bad)",          { XX } },
4005
    { "(bad)",          { XX } },
4006
    { "(bad)",          { XX } },
4007
    { "(bad)",          { XX } },
4008
    { "(bad)",          { XX } },
4009
    /* 30 */
4010
    { "cvtph2ps",       { XM, EXd } },
4011
    { "cvtps2ph",       { EXd, XM } },
4012
    { "(bad)",          { XX } },
4013
    { "(bad)",          { XX } },
4014
    { "(bad)",          { XX } },
4015
    { "(bad)",          { XX } },
4016
    { "(bad)",          { XX } },
4017
    { "(bad)",          { XX } },
4018
    /* 38 */
4019
    { "(bad)",          { XX } },
4020
    { "(bad)",          { XX } },
4021
    { "(bad)",          { XX } },
4022
    { "(bad)",          { XX } },
4023
    { "(bad)",          { XX } },
4024
    { "(bad)",          { XX } },
4025
    { "(bad)",          { XX } },
4026
    { "(bad)",          { XX } },
4027
    /* 40 */
4028
    { "(bad)",          { XX } },
4029
    { "phaddbw",        { XM, EXq } },
4030
    { "phaddbd",        { XM, EXq } },
4031
    { "phaddbq",        { XM, EXq } },
4032
    { "(bad)",          { XX } },
4033
    { "(bad)",          { XX } },
4034
    { "phaddwd",        { XM, EXq } },
4035
    { "phaddwq",        { XM, EXq } },
4036
    /* 48 */
4037
    { "(bad)",          { XX } },
4038
    { "(bad)",          { XX } },
4039
    { "(bad)",          { XX } },
4040
    { "phadddq",        { XM, EXq } },
4041
    { "(bad)",          { XX } },
4042
    { "(bad)",          { XX } },
4043
    { "(bad)",          { XX } },
4044
    { "(bad)",          { XX } },
4045
    /* 50 */
4046
    { "(bad)",          { XX } },
4047
    { "phaddubw",       { XM, EXq } },
4048
    { "phaddubd",       { XM, EXq } },
4049
    { "phaddubq",       { XM, EXq } },
4050
    { "(bad)",          { XX } },
4051
    { "(bad)",          { XX } },
4052
    { "phadduwd",       { XM, EXq } },
4053
    { "phadduwq",       { XM, EXq } },
4054
    /* 58 */
4055
    { "(bad)",          { XX } },
4056
    { "(bad)",          { XX } },
4057
    { "(bad)",          { XX } },
4058
    { "phaddudq",       { XM, EXq } },
4059
    { "(bad)",          { XX } },
4060
    { "(bad)",          { XX } },
4061
    { "(bad)",          { XX } },
4062
    { "(bad)",          { XX } },
4063
    /* 60 */
4064
    { "(bad)",          { XX } },
4065
    { "phsubbw",        { XM, EXq } },
4066
    { "phsubbd",        { XM, EXq } },
4067
    { "phsubbq",        { XM, EXq } },
4068
    { "(bad)",          { XX } },
4069
    { "(bad)",          { XX } },
4070
    { "(bad)",          { XX } },
4071
    { "(bad)",          { XX } },
4072
    /* 68 */
4073
    { "(bad)",          { XX } },
4074
    { "(bad)",          { XX } },
4075
    { "(bad)",          { XX } },
4076
    { "(bad)",          { XX } },
4077
    { "(bad)",          { XX } },
4078
    { "(bad)",          { XX } },
4079
    { "(bad)",          { XX } },
4080
    { "(bad)",          { XX } },
4081
    /* 70 */
4082
    { "(bad)",          { XX } },
4083
    { "(bad)",          { XX } },
4084
    { "(bad)",          { XX } },
4085
    { "(bad)",          { XX } },
4086
    { "(bad)",          { XX } },
4087
    { "(bad)",          { XX } },
4088
    { "(bad)",          { XX } },
4089
    { "(bad)",          { XX } },
4090
    /* 78 */
4091
    { "(bad)",          { XX } },
4092
    { "(bad)",          { XX } },
4093
    { "(bad)",          { XX } },
4094
    { "(bad)",          { XX } },
4095
    { "(bad)",          { XX } },
4096
    { "(bad)",          { XX } },
4097
    { "(bad)",          { XX } },
4098
    { "(bad)",          { XX } },
4099
    /* 80 */
4100
    { "(bad)",          { XX } },
4101
    { "(bad)",          { XX } },
4102
    { "(bad)",          { XX } },
4103
    { "(bad)",          { XX } },
4104
    { "(bad)",          { XX } },
4105
    { "(bad)",          { XX } },
4106
    { "(bad)",          { XX } },
4107
    { "(bad)",          { XX } },
4108
    /* 88 */
4109
    { "(bad)",          { XX } },
4110
    { "(bad)",          { XX } },
4111
    { "(bad)",          { XX } },
4112
    { "(bad)",          { XX } },
4113
    { "(bad)",          { XX } },
4114
    { "(bad)",          { XX } },
4115
    { "(bad)",          { XX } },
4116
    { "(bad)",          { XX } },
4117
    /* 90 */
4118
    { "(bad)",          { XX } },
4119
    { "(bad)",          { XX } },
4120
    { "(bad)",          { XX } },
4121
    { "(bad)",          { XX } },
4122
    { "(bad)",          { XX } },
4123
    { "(bad)",          { XX } },
4124
    { "(bad)",          { XX } },
4125
    { "(bad)",          { XX } },
4126
    /* 98 */
4127
    { "(bad)",          { XX } },
4128
    { "(bad)",          { XX } },
4129
    { "(bad)",          { XX } },
4130
    { "(bad)",          { XX } },
4131
    { "(bad)",          { XX } },
4132
    { "(bad)",          { XX } },
4133
    { "(bad)",          { XX } },
4134
    { "(bad)",          { XX } },
4135
    /* a0 */
4136
    { "(bad)",          { XX } },
4137
    { "(bad)",          { XX } },
4138
    { "(bad)",          { XX } },
4139
    { "(bad)",          { XX } },
4140
    { "(bad)",          { XX } },
4141
    { "(bad)",          { XX } },
4142
    { "(bad)",          { XX } },
4143
    { "(bad)",          { XX } },
4144
    /* a8 */
4145
    { "(bad)",          { XX } },
4146
    { "(bad)",          { XX } },
4147
    { "(bad)",          { XX } },
4148
    { "(bad)",          { XX } },
4149
    { "(bad)",          { XX } },
4150
    { "(bad)",          { XX } },
4151
    { "(bad)",          { XX } },
4152
    { "(bad)",          { XX } },
4153
    /* b0 */
4154
    { "(bad)",          { XX } },
4155
    { "(bad)",          { XX } },
4156
    { "(bad)",          { XX } },
4157
    { "(bad)",          { XX } },
4158
    { "(bad)",          { XX } },
4159
    { "(bad)",          { XX } },
4160
    { "(bad)",          { XX } },
4161
    { "(bad)",          { XX } },
4162
    /* b8 */
4163
    { "(bad)",          { XX } },
4164
    { "(bad)",          { XX } },
4165
    { "(bad)",          { XX } },
4166
    { "(bad)",          { XX } },
4167
    { "(bad)",          { XX } },
4168
    { "(bad)",          { XX } },
4169
    { "(bad)",          { XX } },
4170
    { "(bad)",          { XX } },
4171
    /* c0 */
4172
    { "(bad)",          { XX } },
4173
    { "(bad)",          { XX } },
4174
    { "(bad)",          { XX } },
4175
    { "(bad)",          { XX } },
4176
    { "(bad)",          { XX } },
4177
    { "(bad)",          { XX } },
4178
    { "(bad)",          { XX } },
4179
    { "(bad)",          { XX } },
4180
    /* c8 */
4181
    { "(bad)",          { XX } },
4182
    { "(bad)",          { XX } },
4183
    { "(bad)",          { XX } },
4184
    { "(bad)",          { XX } },
4185
    { "(bad)",          { XX } },
4186
    { "(bad)",          { XX } },
4187
    { "(bad)",          { XX } },
4188
    { "(bad)",          { XX } },
4189
    /* d0 */
4190
    { "(bad)",          { XX } },
4191
    { "(bad)",          { XX } },
4192
    { "(bad)",          { XX } },
4193
    { "(bad)",          { XX } },
4194
    { "(bad)",          { XX } },
4195
    { "(bad)",          { XX } },
4196
    { "(bad)",          { XX } },
4197
    { "(bad)",          { XX } },
4198
    /* d8 */
4199
    { "(bad)",          { XX } },
4200
    { "(bad)",          { XX } },
4201
    { "(bad)",          { XX } },
4202
    { "(bad)",          { XX } },
4203
    { "(bad)",          { XX } },
4204
    { "(bad)",          { XX } },
4205
    { "(bad)",          { XX } },
4206
    { "(bad)",          { XX } },
4207
    /* e0 */
4208
    { "(bad)",          { XX } },
4209
    { "(bad)",          { XX } },
4210
    { "(bad)",          { XX } },
4211
    { "(bad)",          { XX } },
4212
    { "(bad)",          { XX } },
4213
    { "(bad)",          { XX } },
4214
    { "(bad)",          { XX } },
4215
    { "(bad)",          { XX } },
4216
    /* e8 */
4217
    { "(bad)",          { XX } },
4218
    { "(bad)",          { XX } },
4219
    { "(bad)",          { XX } },
4220
    { "(bad)",          { XX } },
4221
    { "(bad)",          { XX } },
4222
    { "(bad)",          { XX } },
4223
    { "(bad)",          { XX } },
4224
    { "(bad)",          { XX } },
4225
    /* f0 */
4226
    { "(bad)",          { XX } },
4227
    { "(bad)",          { XX } },
4228
    { "(bad)",          { XX } },
4229
    { "(bad)",          { XX } },
4230
    { "(bad)",          { XX } },
4231
    { "(bad)",          { XX } },
4232
    { "(bad)",          { XX } },
4233
    { "(bad)",          { XX } },
4234
    /* f8 */
4235
    { "(bad)",          { XX } },
4236
    { "(bad)",          { XX } },
4237
    { "(bad)",          { XX } },
4238
    { "(bad)",          { XX } },
4239
    { "(bad)",          { XX } },
4240
    { "(bad)",          { XX } },
4241
    { "(bad)",          { XX } },
4242
    { "(bad)",          { XX } },
4243
  },
4244
  /* THREE_BYTE_0F7B */
4245
  {
4246
    /* 00 */
4247
    { "(bad)",          { XX } },
4248
    { "(bad)",          { XX } },
4249
    { "(bad)",          { XX } },
4250
    { "(bad)",          { XX } },
4251
    { "(bad)",          { XX } },
4252
    { "(bad)",          { XX } },
4253
    { "(bad)",          { XX } },
4254
    { "(bad)",          { XX } },
4255
    /* 08 */
4256
    { "(bad)",          { XX } },
4257
    { "(bad)",          { XX } },
4258
    { "(bad)",          { XX } },
4259
    { "(bad)",          { XX } },
4260
    { "(bad)",          { XX } },
4261
    { "(bad)",          { XX } },
4262
    { "(bad)",          { XX } },
4263
    { "(bad)",          { XX } },
4264
    /* 10 */
4265
    { "(bad)",          { XX } },
4266
    { "(bad)",          { XX } },
4267
    { "(bad)",          { XX } },
4268
    { "(bad)",          { XX } },
4269
    { "(bad)",          { XX } },
4270
    { "(bad)",          { XX } },
4271
    { "(bad)",          { XX } },
4272
    { "(bad)",          { XX } },
4273
    /* 18 */
4274
    { "(bad)",          { XX } },
4275
    { "(bad)",          { XX } },
4276
    { "(bad)",          { XX } },
4277
    { "(bad)",          { XX } },
4278
    { "(bad)",          { XX } },
4279
    { "(bad)",          { XX } },
4280
    { "(bad)",          { XX } },
4281
    { "(bad)",          { XX } },
4282
    /* 20 */
4283
    { "(bad)",          { XX } },
4284
    { "(bad)",          { XX } },
4285
    { "(bad)",          { XX } },
4286
    { "(bad)",          { XX } },
4287
    { "(bad)",          { XX } },
4288
    { "(bad)",          { XX } },
4289
    { "(bad)",          { XX } },
4290
    { "(bad)",          { XX } },
4291
    /* 28 */
4292
    { "(bad)",          { XX } },
4293
    { "(bad)",          { XX } },
4294
    { "(bad)",          { XX } },
4295
    { "(bad)",          { XX } },
4296
    { "(bad)",          { XX } },
4297
    { "(bad)",          { XX } },
4298
    { "(bad)",          { XX } },
4299
    { "(bad)",          { XX } },
4300
    /* 30 */
4301
    { "(bad)",          { XX } },
4302
    { "(bad)",          { XX } },
4303
    { "(bad)",          { XX } },
4304
    { "(bad)",          { XX } },
4305
    { "(bad)",          { XX } },
4306
    { "(bad)",          { XX } },
4307
    { "(bad)",          { XX } },
4308
    { "(bad)",          { XX } },
4309
    /* 38 */
4310
    { "(bad)",          { XX } },
4311
    { "(bad)",          { XX } },
4312
    { "(bad)",          { XX } },
4313
    { "(bad)",          { XX } },
4314
    { "(bad)",          { XX } },
4315
    { "(bad)",          { XX } },
4316
    { "(bad)",          { XX } },
4317
    { "(bad)",          { XX } },
4318
    /* 40 */
4319
    { "protb",          { XM, EXq, Ib } },
4320
    { "protw",          { XM, EXq, Ib } },
4321
    { "protd",          { XM, EXq, Ib } },
4322
    { "protq",          { XM, EXq, Ib } },
4323
    { "pshlb",          { XM, EXq, Ib } },
4324
    { "pshlw",          { XM, EXq, Ib } },
4325
    { "pshld",          { XM, EXq, Ib } },
4326
    { "pshlq",          { XM, EXq, Ib } },
4327
    /* 48 */
4328
    { "pshab",          { XM, EXq, Ib } },
4329
    { "pshaw",          { XM, EXq, Ib } },
4330
    { "pshad",          { XM, EXq, Ib } },
4331
    { "pshaq",          { XM, EXq, Ib } },
4332
    { "(bad)",          { XX } },
4333
    { "(bad)",          { XX } },
4334
    { "(bad)",          { XX } },
4335
    { "(bad)",          { XX } },
4336
    /* 50 */
4337
    { "(bad)",          { XX } },
4338
    { "(bad)",          { XX } },
4339
    { "(bad)",          { XX } },
4340
    { "(bad)",          { XX } },
4341
    { "(bad)",          { XX } },
4342
    { "(bad)",          { XX } },
4343
    { "(bad)",          { XX } },
4344
    { "(bad)",          { XX } },
4345
    /* 58 */
4346
    { "(bad)",          { XX } },
4347
    { "(bad)",          { XX } },
4348
    { "(bad)",          { XX } },
4349
    { "(bad)",          { XX } },
4350
    { "(bad)",          { XX } },
4351
    { "(bad)",          { XX } },
4352
    { "(bad)",          { XX } },
4353
    { "(bad)",          { XX } },
4354
    /* 60 */
4355
    { "(bad)",          { XX } },
4356
    { "(bad)",          { XX } },
4357
    { "(bad)",          { XX } },
4358
    { "(bad)",          { XX } },
4359
    { "(bad)",          { XX } },
4360
    { "(bad)",          { XX } },
4361
    { "(bad)",          { XX } },
4362
    { "(bad)",          { XX } },
4363
    /* 68 */
4364
    { "(bad)",          { XX } },
4365
    { "(bad)",          { XX } },
4366
    { "(bad)",          { XX } },
4367
    { "(bad)",          { XX } },
4368
    { "(bad)",          { XX } },
4369
    { "(bad)",          { XX } },
4370
    { "(bad)",          { XX } },
4371
    { "(bad)",          { XX } },
4372
    /* 70 */
4373
    { "(bad)",          { XX } },
4374
    { "(bad)",          { XX } },
4375
    { "(bad)",          { XX } },
4376
    { "(bad)",          { XX } },
4377
    { "(bad)",          { XX } },
4378
    { "(bad)",          { XX } },
4379
    { "(bad)",          { XX } },
4380
    { "(bad)",          { XX } },
4381
    /* 78 */
4382
    { "(bad)",          { XX } },
4383
    { "(bad)",          { XX } },
4384
    { "(bad)",          { XX } },
4385
    { "(bad)",          { XX } },
4386
    { "(bad)",          { XX } },
4387
    { "(bad)",          { XX } },
4388
    { "(bad)",          { XX } },
4389
    { "(bad)",          { XX } },
4390
    /* 80 */
4391
    { "(bad)",          { XX } },
4392
    { "(bad)",          { XX } },
4393
    { "(bad)",          { XX } },
4394
    { "(bad)",          { XX } },
4395
    { "(bad)",          { XX } },
4396
    { "(bad)",          { XX } },
4397
    { "(bad)",          { XX } },
4398
    { "(bad)",          { XX } },
4399
    /* 88 */
4400
    { "(bad)",          { XX } },
4401
    { "(bad)",          { XX } },
4402
    { "(bad)",          { XX } },
4403
    { "(bad)",          { XX } },
4404
    { "(bad)",          { XX } },
4405
    { "(bad)",          { XX } },
4406
    { "(bad)",          { XX } },
4407
    { "(bad)",          { XX } },
4408
    /* 90 */
4409
    { "(bad)",          { XX } },
4410
    { "(bad)",          { XX } },
4411
    { "(bad)",          { XX } },
4412
    { "(bad)",          { XX } },
4413
    { "(bad)",          { XX } },
4414
    { "(bad)",          { XX } },
4415
    { "(bad)",          { XX } },
4416
    { "(bad)",          { XX } },
4417
    /* 98 */
4418
    { "(bad)",          { XX } },
4419
    { "(bad)",          { XX } },
4420
    { "(bad)",          { XX } },
4421
    { "(bad)",          { XX } },
4422
    { "(bad)",          { XX } },
4423
    { "(bad)",          { XX } },
4424
    { "(bad)",          { XX } },
4425
    { "(bad)",          { XX } },
4426
    /* a0 */
4427
    { "(bad)",          { XX } },
4428
    { "(bad)",          { XX } },
4429
    { "(bad)",          { XX } },
4430
    { "(bad)",          { XX } },
4431
    { "(bad)",          { XX } },
4432
    { "(bad)",          { XX } },
4433
    { "(bad)",          { XX } },
4434
    { "(bad)",          { XX } },
4435
    /* a8 */
4436
    { "(bad)",          { XX } },
4437
    { "(bad)",          { XX } },
4438
    { "(bad)",          { XX } },
4439
    { "(bad)",          { XX } },
4440
    { "(bad)",          { XX } },
4441
    { "(bad)",          { XX } },
4442
    { "(bad)",          { XX } },
4443
    { "(bad)",          { XX } },
4444
    /* b0 */
4445
    { "(bad)",          { XX } },
4446
    { "(bad)",          { XX } },
4447
    { "(bad)",          { XX } },
4448
    { "(bad)",          { XX } },
4449
    { "(bad)",          { XX } },
4450
    { "(bad)",          { XX } },
4451
    { "(bad)",          { XX } },
4452
    { "(bad)",          { XX } },
4453
    /* b8 */
4454
    { "(bad)",          { XX } },
4455
    { "(bad)",          { XX } },
4456
    { "(bad)",          { XX } },
4457
    { "(bad)",          { XX } },
4458
    { "(bad)",          { XX } },
4459
    { "(bad)",          { XX } },
4460
    { "(bad)",          { XX } },
4461
    { "(bad)",          { XX } },
4462
    /* c0 */
4463
    { "(bad)",          { XX } },
4464
    { "(bad)",          { XX } },
4465
    { "(bad)",          { XX } },
4466
    { "(bad)",          { XX } },
4467
    { "(bad)",          { XX } },
4468
    { "(bad)",          { XX } },
4469
    { "(bad)",          { XX } },
4470
    { "(bad)",          { XX } },
4471
    /* c8 */
4472
    { "(bad)",          { XX } },
4473
    { "(bad)",          { XX } },
4474
    { "(bad)",          { XX } },
4475
    { "(bad)",          { XX } },
4476
    { "(bad)",          { XX } },
4477
    { "(bad)",          { XX } },
4478
    { "(bad)",          { XX } },
4479
    { "(bad)",          { XX } },
4480
    /* d0 */
4481
    { "(bad)",          { XX } },
4482
    { "(bad)",          { XX } },
4483
    { "(bad)",          { XX } },
4484
    { "(bad)",          { XX } },
4485
    { "(bad)",          { XX } },
4486
    { "(bad)",          { XX } },
4487
    { "(bad)",          { XX } },
4488
    { "(bad)",          { XX } },
4489
    /* d8 */
4490
    { "(bad)",          { XX } },
4491
    { "(bad)",          { XX } },
4492
    { "(bad)",          { XX } },
4493
    { "(bad)",          { XX } },
4494
    { "(bad)",          { XX } },
4495
    { "(bad)",          { XX } },
4496
    { "(bad)",          { XX } },
4497
    { "(bad)",          { XX } },
4498
    /* e0 */
4499
    { "(bad)",          { XX } },
4500
    { "(bad)",          { XX } },
4501
    { "(bad)",          { XX } },
4502
    { "(bad)",          { XX } },
4503
    { "(bad)",          { XX } },
4504
    { "(bad)",          { XX } },
4505
    { "(bad)",          { XX } },
4506
    { "(bad)",          { XX } },
4507
    /* e8 */
4508
    { "(bad)",          { XX } },
4509
    { "(bad)",          { XX } },
4510
    { "(bad)",          { XX } },
4511
    { "(bad)",          { XX } },
4512
    { "(bad)",          { XX } },
4513
    { "(bad)",          { XX } },
4514
    { "(bad)",          { XX } },
4515
    { "(bad)",          { XX } },
4516
    /* f0 */
4517
    { "(bad)",          { XX } },
4518
    { "(bad)",          { XX } },
4519
    { "(bad)",          { XX } },
4520
    { "(bad)",          { XX } },
4521
    { "(bad)",          { XX } },
4522
    { "(bad)",          { XX } },
4523
    { "(bad)",          { XX } },
4524
    { "(bad)",          { XX } },
4525
    /* f8 */
4526
    { "(bad)",          { XX } },
4527
    { "(bad)",          { XX } },
4528
    { "(bad)",          { XX } },
4529
    { "(bad)",          { XX } },
4530
    { "(bad)",          { XX } },
4531
    { "(bad)",          { XX } },
4532
    { "(bad)",          { XX } },
4533
    { "(bad)",          { XX } },
4534
  }
4535
};
4536
 
4537
static const struct dis386 mod_table[][2] = {
4538
  {
4539
    /* MOD_8D */
4540
    { "leaS",           { Gv, M } },
4541
    { "(bad)",          { XX } },
4542
  },
4543
  {
4544
    /* MOD_0F01_REG_0 */
4545
    { X86_64_TABLE (X86_64_0F01_REG_0) },
4546
    { RM_TABLE (RM_0F01_REG_0) },
4547
  },
4548
  {
4549
    /* MOD_0F01_REG_1 */
4550
    { X86_64_TABLE (X86_64_0F01_REG_1) },
4551
    { RM_TABLE (RM_0F01_REG_1) },
4552
  },
4553
  {
4554
    /* MOD_0F01_REG_2 */
4555
    { X86_64_TABLE (X86_64_0F01_REG_2) },
4556
    { RM_TABLE (RM_0F01_REG_2) },
4557
  },
4558
  {
4559
    /* MOD_0F01_REG_3 */
4560
    { X86_64_TABLE (X86_64_0F01_REG_3) },
4561
    { RM_TABLE (RM_0F01_REG_3) },
4562
  },
4563
  {
4564
    /* MOD_0F01_REG_7 */
4565
    { "invlpg",         { Mb } },
4566
    { RM_TABLE (RM_0F01_REG_7) },
4567
  },
4568
  {
4569
    /* MOD_0F12_PREFIX_0 */
4570
    { "movlps",         { XM, EXq } },
4571
    { "movhlps",        { XM, EXq } },
4572
  },
4573
  {
4574
    /* MOD_0F13 */
4575
    { "movlpX",         { EXq, XM } },
4576
    { "(bad)",          { XX } },
4577
  },
4578
  {
4579
    /* MOD_0F16_PREFIX_0 */
4580
    { "movhps",         { XM, EXq } },
4581
    { "movlhps",        { XM, EXq } },
4582
  },
4583
  {
4584
    /* MOD_0F17 */
4585
    { "movhpX",         { EXq, XM } },
4586
    { "(bad)",          { XX } },
4587
  },
4588
  {
4589
    /* MOD_0F18_REG_0 */
4590
    { "prefetchnta",    { Mb } },
4591
    { "(bad)",          { XX } },
4592
  },
4593
  {
4594
    /* MOD_0F18_REG_1 */
4595
    { "prefetcht0",     { Mb } },
4596
    { "(bad)",          { XX } },
4597
  },
4598
  {
4599
    /* MOD_0F18_REG_2 */
4600
    { "prefetcht1",     { Mb } },
4601
    { "(bad)",          { XX } },
4602
  },
4603
  {
4604
    /* MOD_0F18_REG_3 */
4605
    { "prefetcht2",     { Mb } },
4606
    { "(bad)",          { XX } },
4607
  },
4608
  {
4609
    /* MOD_0F20 */
4610
    { "(bad)",          { XX } },
4611
    { "movZ",           { Rm, Cm } },
4612
  },
4613
  {
4614
    /* MOD_0F21 */
4615
    { "(bad)",          { XX } },
4616
    { "movZ",           { Rm, Dm } },
4617
  },
4618
  {
4619
    /* MOD_0F22 */
4620
    { "(bad)",          { XX } },
4621
    { "movZ",           { Cm, Rm } },
4622
  },
4623
  {
4624
    /* MOD_0F23 */
4625
    { "(bad)",          { XX } },
4626
    { "movZ",           { Dm, Rm } },
4627
  },
4628
  {
4629
    /* MOD_0F24 */
4630
    { THREE_BYTE_TABLE (THREE_BYTE_0F24) },
4631
    { "movL",           { Rd, Td } },
4632
  },
4633
  {
4634
    /* MOD_0F26 */
4635
    { "(bad)",          { XX } },
4636
    { "movL",           { Td, Rd } },
4637
  },
4638
  {
4639
    /* MOD_0F2B_PREFIX_0 */
4640
    {"movntps",         { Mx, XM } },
4641
    { "(bad)",          { XX } },
4642
  },
4643
  {
4644
    /* MOD_0F2B_PREFIX_1 */
4645
    {"movntss",         { Md, XM } },
4646
    { "(bad)",          { XX } },
4647
  },
4648
  {
4649
    /* MOD_0F2B_PREFIX_2 */
4650
    {"movntpd",         { Mx, XM } },
4651
    { "(bad)",          { XX } },
4652
  },
4653
  {
4654
    /* MOD_0F2B_PREFIX_3 */
4655
    {"movntsd",         { Mq, XM } },
4656
    { "(bad)",          { XX } },
4657
  },
4658
  {
4659
    /* MOD_0F51 */
4660
    { "(bad)",          { XX } },
4661
    { "movmskpX",       { Gdq, XS } },
4662
  },
4663
  {
4664
    /* MOD_0F71_REG_2 */
4665
    { "(bad)",          { XX } },
4666
    { "psrlw",          { MS, Ib } },
4667
  },
4668
  {
4669
    /* MOD_0F71_REG_4 */
4670
    { "(bad)",          { XX } },
4671
    { "psraw",          { MS, Ib } },
4672
  },
4673
  {
4674
    /* MOD_0F71_REG_6 */
4675
    { "(bad)",          { XX } },
4676
    { "psllw",          { MS, Ib } },
4677
  },
4678
  {
4679
    /* MOD_0F72_REG_2 */
4680
    { "(bad)",          { XX } },
4681
    { "psrld",          { MS, Ib } },
4682
  },
4683
  {
4684
    /* MOD_0F72_REG_4 */
4685
    { "(bad)",          { XX } },
4686
    { "psrad",          { MS, Ib } },
4687
  },
4688
  {
4689
    /* MOD_0F72_REG_6 */
4690
    { "(bad)",          { XX } },
4691
    { "pslld",          { MS, Ib } },
4692
  },
4693
  {
4694
    /* MOD_0F73_REG_2 */
4695
    { "(bad)",          { XX } },
4696
    { "psrlq",          { MS, Ib } },
4697
  },
4698
  {
4699
    /* MOD_0F73_REG_3 */
4700
    { "(bad)",          { XX } },
4701
    { PREFIX_TABLE (PREFIX_0F73_REG_3) },
4702
  },
4703
  {
4704
    /* MOD_0F73_REG_6 */
4705
    { "(bad)",          { XX } },
4706
    { "psllq",          { MS, Ib } },
4707
  },
4708
  {
4709
    /* MOD_0F73_REG_7 */
4710
    { "(bad)",          { XX } },
4711
    { PREFIX_TABLE (PREFIX_0F73_REG_7) },
4712
  },
4713
  {
4714
    /* MOD_0FAE_REG_0 */
4715
    { "fxsave",         { M } },
4716
    { "(bad)",          { XX } },
4717
  },
4718
  {
4719
    /* MOD_0FAE_REG_1 */
4720
    { "fxrstor",        { M } },
4721
    { "(bad)",          { XX } },
4722
  },
4723
  {
4724
    /* MOD_0FAE_REG_2 */
4725
    { "ldmxcsr",        { Md } },
4726
    { "(bad)",          { XX } },
4727
  },
4728
  {
4729
    /* MOD_0FAE_REG_3 */
4730
    { "stmxcsr",        { Md } },
4731
    { "(bad)",          { XX } },
4732
  },
4733
  {
4734
    /* MOD_0FAE_REG_4 */
4735
    { "xsave",          { M } },
4736
    { "(bad)",          { XX } },
4737
  },
4738
  {
4739
    /* MOD_0FAE_REG_5 */
4740
    { "xrstor",         { M } },
4741
    { RM_TABLE (RM_0FAE_REG_5) },
4742
  },
4743
  {
4744
    /* MOD_0FAE_REG_6 */
4745
    { "(bad)",          { XX } },
4746
    { RM_TABLE (RM_0FAE_REG_6) },
4747
  },
4748
  {
4749
    /* MOD_0FAE_REG_7 */
4750
    { "clflush",        { Mb } },
4751
    { RM_TABLE (RM_0FAE_REG_7) },
4752
  },
4753
  {
4754
    /* MOD_0FB2 */
4755
    { "lssS",           { Gv, Mp } },
4756
    { "(bad)",          { XX } },
4757
  },
4758
  {
4759
    /* MOD_0FB4 */
4760
    { "lfsS",           { Gv, Mp } },
4761
    { "(bad)",          { XX } },
4762
  },
4763
  {
4764
    /* MOD_0FB5 */
4765
    { "lgsS",           { Gv, Mp } },
4766
    { "(bad)",          { XX } },
4767
  },
4768
  {
4769
    /* MOD_0FC7_REG_6 */
4770
    { PREFIX_TABLE (PREFIX_0FC7_REG_6) },
4771
    { "(bad)",          { XX } },
4772
  },
4773
  {
4774
    /* MOD_0FC7_REG_7 */
4775
    { "vmptrst",        { Mq } },
4776
    { "(bad)",          { XX } },
4777
  },
4778
  {
4779
    /* MOD_0FD7 */
4780
    { "(bad)",          { XX } },
4781
    { "pmovmskb",       { Gdq, MS } },
4782
  },
4783
  {
4784
    /* MOD_0FE7_PREFIX_2 */
4785
    { "movntdq",        { Mx, XM } },
4786
    { "(bad)",          { XX } },
4787
  },
4788
  {
4789
    /* MOD_0FF0_PREFIX_3 */
4790
    { "lddqu",          { XM, M } },
4791
    { "(bad)",          { XX } },
4792
  },
4793
  {
4794
    /* MOD_0F382A_PREFIX_2 */
4795
    { "movntdqa",       { XM, Mx } },
4796
    { "(bad)",          { XX } },
4797
  },
4798
  {
4799
    /* MOD_62_32BIT */
4800
    { "bound{S|}",      { Gv, Ma } },
4801
    { "(bad)",          { XX } },
4802
  },
4803
  {
4804
    /* MOD_C4_32BIT */
4805
    { "lesS",           { Gv, Mp } },
4806
    { "(bad)",          { XX } },
4807
  },
4808
  {
4809
    /* MOD_C5_32BIT */
4810
    { "ldsS",           { Gv, Mp } },
4811
    { "(bad)",          { XX } },
4812
  },
4813
};
4814
 
4815
static const struct dis386 rm_table[][8] = {
4816
  {
4817
    /* RM_0F01_REG_0 */
4818
    { "(bad)",          { XX } },
4819
    { "vmcall",         { Skip_MODRM } },
4820
    { "vmlaunch",       { Skip_MODRM } },
4821
    { "vmresume",       { Skip_MODRM } },
4822
    { "vmxoff",         { Skip_MODRM } },
4823
    { "(bad)",          { XX } },
4824
    { "(bad)",          { XX } },
4825
    { "(bad)",          { XX } },
4826
  },
4827
  {
4828
    /* RM_0F01_REG_1 */
4829
    { "monitor",        { { OP_Monitor, 0 } } },
4830
    { "mwait",          { { OP_Mwait, 0 } } },
4831
    { "(bad)",          { XX } },
4832
    { "(bad)",          { XX } },
4833
    { "(bad)",          { XX } },
4834
    { "(bad)",          { XX } },
4835
    { "(bad)",          { XX } },
4836
    { "(bad)",          { XX } },
4837
  },
4838
  {
4839
    /* RM_0F01_REG_2 */
4840
    { "xgetbv",         { Skip_MODRM } },
4841
    { "xsetbv",         { Skip_MODRM } },
4842
    { "(bad)",          { XX } },
4843
    { "(bad)",          { XX } },
4844
    { "(bad)",          { XX } },
4845
    { "(bad)",          { XX } },
4846
    { "(bad)",          { XX } },
4847
    { "(bad)",          { XX } },
4848
  },
4849
  {
4850
    /* RM_0F01_REG_3 */
4851
    { "vmrun",          { Skip_MODRM } },
4852
    { "vmmcall",        { Skip_MODRM } },
4853
    { "vmload",         { Skip_MODRM } },
4854
    { "vmsave",         { Skip_MODRM } },
4855
    { "stgi",           { Skip_MODRM } },
4856
    { "clgi",           { Skip_MODRM } },
4857
    { "skinit",         { Skip_MODRM } },
4858
    { "invlpga",        { Skip_MODRM } },
4859
  },
4860
  {
4861
    /* RM_0F01_REG_7 */
4862
    { "swapgs",         { Skip_MODRM } },
4863
    { "rdtscp",         { Skip_MODRM } },
4864
    { "(bad)",          { XX } },
4865
    { "(bad)",          { XX } },
4866
    { "(bad)",          { XX } },
4867
    { "(bad)",          { XX } },
4868
    { "(bad)",          { XX } },
4869
    { "(bad)",          { XX } },
4870
  },
4871
  {
4872
    /* RM_0FAE_REG_5 */
4873
    { "lfence",         { Skip_MODRM } },
4874
    { "(bad)",          { XX } },
4875
    { "(bad)",          { XX } },
4876
    { "(bad)",          { XX } },
4877
    { "(bad)",          { XX } },
4878
    { "(bad)",          { XX } },
4879
    { "(bad)",          { XX } },
4880
    { "(bad)",          { XX } },
4881
  },
4882
  {
4883
    /* RM_0FAE_REG_6 */
4884
    { "mfence",         { Skip_MODRM } },
4885
    { "(bad)",          { XX } },
4886
    { "(bad)",          { XX } },
4887
    { "(bad)",          { XX } },
4888
    { "(bad)",          { XX } },
4889
    { "(bad)",          { XX } },
4890
    { "(bad)",          { XX } },
4891
    { "(bad)",          { XX } },
4892
  },
4893
  {
4894
    /* RM_0FAE_REG_7 */
4895
    { "sfence",         { Skip_MODRM } },
4896
    { "(bad)",          { XX } },
4897
    { "(bad)",          { XX } },
4898
    { "(bad)",          { XX } },
4899
    { "(bad)",          { XX } },
4900
    { "(bad)",          { XX } },
4901
    { "(bad)",          { XX } },
4902
    { "(bad)",          { XX } },
4903
  },
4904
};
4905
 
4906
#define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
4907
 
4908
static void
4909
ckprefix (void)
4910
{
4911
  int newrex;
4912
  rex = 0;
4913
  prefixes = 0;
4914
  used_prefixes = 0;
4915
  rex_used = 0;
4916
  while (1)
4917
    {
4918
      FETCH_DATA (the_info, codep + 1);
4919
      newrex = 0;
4920
      switch (*codep)
4921
        {
4922
        /* REX prefixes family.  */
4923
        case 0x40:
4924
        case 0x41:
4925
        case 0x42:
4926
        case 0x43:
4927
        case 0x44:
4928
        case 0x45:
4929
        case 0x46:
4930
        case 0x47:
4931
        case 0x48:
4932
        case 0x49:
4933
        case 0x4a:
4934
        case 0x4b:
4935
        case 0x4c:
4936
        case 0x4d:
4937
        case 0x4e:
4938
        case 0x4f:
4939
            if (address_mode == mode_64bit)
4940
              newrex = *codep;
4941
            else
4942
              return;
4943
          break;
4944
        case 0xf3:
4945
          prefixes |= PREFIX_REPZ;
4946
          break;
4947
        case 0xf2:
4948
          prefixes |= PREFIX_REPNZ;
4949
          break;
4950
        case 0xf0:
4951
          prefixes |= PREFIX_LOCK;
4952
          break;
4953
        case 0x2e:
4954
          prefixes |= PREFIX_CS;
4955
          break;
4956
        case 0x36:
4957
          prefixes |= PREFIX_SS;
4958
          break;
4959
        case 0x3e:
4960
          prefixes |= PREFIX_DS;
4961
          break;
4962
        case 0x26:
4963
          prefixes |= PREFIX_ES;
4964
          break;
4965
        case 0x64:
4966
          prefixes |= PREFIX_FS;
4967
          break;
4968
        case 0x65:
4969
          prefixes |= PREFIX_GS;
4970
          break;
4971
        case 0x66:
4972
          prefixes |= PREFIX_DATA;
4973
          break;
4974
        case 0x67:
4975
          prefixes |= PREFIX_ADDR;
4976
          break;
4977
        case FWAIT_OPCODE:
4978
          /* fwait is really an instruction.  If there are prefixes
4979
             before the fwait, they belong to the fwait, *not* to the
4980
             following instruction.  */
4981
          if (prefixes || rex)
4982
            {
4983
              prefixes |= PREFIX_FWAIT;
4984
              codep++;
4985
              return;
4986
            }
4987
          prefixes = PREFIX_FWAIT;
4988
          break;
4989
        default:
4990
          return;
4991
        }
4992
      /* Rex is ignored when followed by another prefix.  */
4993
      if (rex)
4994
        {
4995
          rex_used = rex;
4996
          return;
4997
        }
4998
      rex = newrex;
4999
      codep++;
5000
    }
5001
}
5002
 
5003
/* Return the name of the prefix byte PREF, or NULL if PREF is not a
5004
   prefix byte.  */
5005
 
5006
static const char *
5007
prefix_name (int pref, int sizeflag)
5008
{
5009
  static const char *rexes [16] =
5010
    {
5011
      "rex",            /* 0x40 */
5012
      "rex.B",          /* 0x41 */
5013
      "rex.X",          /* 0x42 */
5014
      "rex.XB",         /* 0x43 */
5015
      "rex.R",          /* 0x44 */
5016
      "rex.RB",         /* 0x45 */
5017
      "rex.RX",         /* 0x46 */
5018
      "rex.RXB",        /* 0x47 */
5019
      "rex.W",          /* 0x48 */
5020
      "rex.WB",         /* 0x49 */
5021
      "rex.WX",         /* 0x4a */
5022
      "rex.WXB",        /* 0x4b */
5023
      "rex.WR",         /* 0x4c */
5024
      "rex.WRB",        /* 0x4d */
5025
      "rex.WRX",        /* 0x4e */
5026
      "rex.WRXB",       /* 0x4f */
5027
    };
5028
 
5029
  switch (pref)
5030
    {
5031
    /* REX prefixes family.  */
5032
    case 0x40:
5033
    case 0x41:
5034
    case 0x42:
5035
    case 0x43:
5036
    case 0x44:
5037
    case 0x45:
5038
    case 0x46:
5039
    case 0x47:
5040
    case 0x48:
5041
    case 0x49:
5042
    case 0x4a:
5043
    case 0x4b:
5044
    case 0x4c:
5045
    case 0x4d:
5046
    case 0x4e:
5047
    case 0x4f:
5048
      return rexes [pref - 0x40];
5049
    case 0xf3:
5050
      return "repz";
5051
    case 0xf2:
5052
      return "repnz";
5053
    case 0xf0:
5054
      return "lock";
5055
    case 0x2e:
5056
      return "cs";
5057
    case 0x36:
5058
      return "ss";
5059
    case 0x3e:
5060
      return "ds";
5061
    case 0x26:
5062
      return "es";
5063
    case 0x64:
5064
      return "fs";
5065
    case 0x65:
5066
      return "gs";
5067
    case 0x66:
5068
      return (sizeflag & DFLAG) ? "data16" : "data32";
5069
    case 0x67:
5070
      if (address_mode == mode_64bit)
5071
        return (sizeflag & AFLAG) ? "addr32" : "addr64";
5072
      else
5073
        return (sizeflag & AFLAG) ? "addr16" : "addr32";
5074
    case FWAIT_OPCODE:
5075
      return "fwait";
5076
    default:
5077
      return NULL;
5078
    }
5079
}
5080
 
5081
static char op_out[MAX_OPERANDS][100];
5082
static int op_ad, op_index[MAX_OPERANDS];
5083
static int two_source_ops;
5084
static bfd_vma op_address[MAX_OPERANDS];
5085
static bfd_vma op_riprel[MAX_OPERANDS];
5086
static bfd_vma start_pc;
5087
 
5088
/*
5089
 *   On the 386's of 1988, the maximum length of an instruction is 15 bytes.
5090
 *   (see topic "Redundant prefixes" in the "Differences from 8086"
5091
 *   section of the "Virtual 8086 Mode" chapter.)
5092
 * 'pc' should be the address of this instruction, it will
5093
 *   be used to print the target address if this is a relative jump or call
5094
 * The function returns the length of this instruction in bytes.
5095
 */
5096
 
5097
static char intel_syntax;
5098
static char intel_mnemonic = !SYSV386_COMPAT;
5099
static char open_char;
5100
static char close_char;
5101
static char separator_char;
5102
static char scale_char;
5103
 
5104
/* Here for backwards compatibility.  When gdb stops using
5105
   print_insn_i386_att and print_insn_i386_intel these functions can
5106
   disappear, and print_insn_i386 be merged into print_insn.  */
5107
int
5108
print_insn_i386_att (bfd_vma pc, disassemble_info *info)
5109
{
5110
  intel_syntax = 0;
5111
 
5112
  return print_insn (pc, info);
5113
}
5114
 
5115
int
5116
print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
5117
{
5118
  intel_syntax = 1;
5119
 
5120
  return print_insn (pc, info);
5121
}
5122
 
5123
int
5124
print_insn_i386 (bfd_vma pc, disassemble_info *info)
5125
{
5126
  intel_syntax = -1;
5127
 
5128
  return print_insn (pc, info);
5129
}
5130
 
5131
void
5132
print_i386_disassembler_options (FILE *stream)
5133
{
5134
  fprintf (stream, _("\n\
5135
The following i386/x86-64 specific disassembler options are supported for use\n\
5136
with the -M switch (multiple options should be separated by commas):\n"));
5137
 
5138
  fprintf (stream, _("  x86-64      Disassemble in 64bit mode\n"));
5139
  fprintf (stream, _("  i386        Disassemble in 32bit mode\n"));
5140
  fprintf (stream, _("  i8086       Disassemble in 16bit mode\n"));
5141
  fprintf (stream, _("  att         Display instruction in AT&T syntax\n"));
5142
  fprintf (stream, _("  intel       Display instruction in Intel syntax\n"));
5143
  fprintf (stream, _("  att-mnemonic\n"
5144
                     "              Display instruction in AT&T mnemonic\n"));
5145
  fprintf (stream, _("  intel-mnemonic\n"
5146
                     "              Display instruction in Intel mnemonic\n"));
5147
  fprintf (stream, _("  addr64      Assume 64bit address size\n"));
5148
  fprintf (stream, _("  addr32      Assume 32bit address size\n"));
5149
  fprintf (stream, _("  addr16      Assume 16bit address size\n"));
5150
  fprintf (stream, _("  data32      Assume 32bit data size\n"));
5151
  fprintf (stream, _("  data16      Assume 16bit data size\n"));
5152
  fprintf (stream, _("  suffix      Always display instruction suffix in AT&T syntax\n"));
5153
}
5154
 
5155
/* Get a pointer to struct dis386 with a valid name.  */
5156
 
5157
static const struct dis386 *
5158
get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
5159
{
5160
  int index;
5161
 
5162
  if (dp->name != NULL)
5163
    return dp;
5164
 
5165
  switch (dp->op[0].bytemode)
5166
    {
5167
    case USE_REG_TABLE:
5168
      dp = &reg_table[dp->op[1].bytemode][modrm.reg];
5169
      break;
5170
 
5171
    case USE_MOD_TABLE:
5172
      index = modrm.mod == 0x3 ? 1 : 0;
5173
      dp = &mod_table[dp->op[1].bytemode][index];
5174
      break;
5175
 
5176
    case USE_RM_TABLE:
5177
      dp = &rm_table[dp->op[1].bytemode][modrm.rm];
5178
      break;
5179
 
5180
    case USE_PREFIX_TABLE:
5181
      index = 0;
5182
      used_prefixes |= (prefixes & PREFIX_REPZ);
5183
      if (prefixes & PREFIX_REPZ)
5184
        {
5185
          index = 1;
5186
          repz_prefix = NULL;
5187
        }
5188
      else
5189
        {
5190
          /* We should check PREFIX_REPNZ and PREFIX_REPZ before
5191
             PREFIX_DATA.  */
5192
          used_prefixes |= (prefixes & PREFIX_REPNZ);
5193
          if (prefixes & PREFIX_REPNZ)
5194
            {
5195
              index = 3;
5196
              repnz_prefix = NULL;
5197
            }
5198
          else
5199
            {
5200
              used_prefixes |= (prefixes & PREFIX_DATA);
5201
              if (prefixes & PREFIX_DATA)
5202
                {
5203
                  index = 2;
5204
                  data_prefix = NULL;
5205
                }
5206
            }
5207
        }
5208
      dp = &prefix_table[dp->op[1].bytemode][index];
5209
      break;
5210
 
5211
    case USE_X86_64_TABLE:
5212
      index = address_mode == mode_64bit ? 1 : 0;
5213
      dp = &x86_64_table[dp->op[1].bytemode][index];
5214
      break;
5215
 
5216
    case USE_3BYTE_TABLE:
5217
      FETCH_DATA (info, codep + 2);
5218
      index = *codep++;
5219
      dp = &three_byte_table[dp->op[1].bytemode][index];
5220
      modrm.mod = (*codep >> 6) & 3;
5221
      modrm.reg = (*codep >> 3) & 7;
5222
      modrm.rm = *codep & 7;
5223
      break;
5224
 
5225
    default:
5226
      oappend (INTERNAL_DISASSEMBLER_ERROR);
5227
      return NULL;
5228
    }
5229
 
5230
  if (dp->name != NULL)
5231
    return dp;
5232
  else
5233
    return get_valid_dis386 (dp, info);
5234
}
5235
 
5236
static int
5237
print_insn (bfd_vma pc, disassemble_info *info)
5238
{
5239
  const struct dis386 *dp;
5240
  int i;
5241
  char *op_txt[MAX_OPERANDS];
5242
  int needcomma;
5243
  int sizeflag;
5244
  const char *p;
5245
  struct dis_private priv;
5246
  unsigned char op;
5247
  char prefix_obuf[32];
5248
  char *prefix_obufp;
5249
 
5250
  if (info->mach == bfd_mach_x86_64_intel_syntax
5251
      || info->mach == bfd_mach_x86_64)
5252
    address_mode = mode_64bit;
5253
  else
5254
    address_mode = mode_32bit;
5255
 
5256
  if (intel_syntax == (char) -1)
5257
    intel_syntax = (info->mach == bfd_mach_i386_i386_intel_syntax
5258
                    || info->mach == bfd_mach_x86_64_intel_syntax);
5259
 
5260
  if (info->mach == bfd_mach_i386_i386
5261
      || info->mach == bfd_mach_x86_64
5262
      || info->mach == bfd_mach_i386_i386_intel_syntax
5263
      || info->mach == bfd_mach_x86_64_intel_syntax)
5264
    priv.orig_sizeflag = AFLAG | DFLAG;
5265
  else if (info->mach == bfd_mach_i386_i8086)
5266
    priv.orig_sizeflag = 0;
5267
  else
5268
    abort ();
5269
 
5270
  for (p = info->disassembler_options; p != NULL; )
5271
    {
5272
      if (CONST_STRNEQ (p, "x86-64"))
5273
        {
5274
          address_mode = mode_64bit;
5275
          priv.orig_sizeflag = AFLAG | DFLAG;
5276
        }
5277
      else if (CONST_STRNEQ (p, "i386"))
5278
        {
5279
          address_mode = mode_32bit;
5280
          priv.orig_sizeflag = AFLAG | DFLAG;
5281
        }
5282
      else if (CONST_STRNEQ (p, "i8086"))
5283
        {
5284
          address_mode = mode_16bit;
5285
          priv.orig_sizeflag = 0;
5286
        }
5287
      else if (CONST_STRNEQ (p, "intel"))
5288
        {
5289
          intel_syntax = 1;
5290
          if (CONST_STRNEQ (p + 5, "-mnemonic"))
5291
            intel_mnemonic = 1;
5292
        }
5293
      else if (CONST_STRNEQ (p, "att"))
5294
        {
5295
          intel_syntax = 0;
5296
          if (CONST_STRNEQ (p + 3, "-mnemonic"))
5297
            intel_mnemonic = 0;
5298
        }
5299
      else if (CONST_STRNEQ (p, "addr"))
5300
        {
5301
          if (address_mode == mode_64bit)
5302
            {
5303
              if (p[4] == '3' && p[5] == '2')
5304
                priv.orig_sizeflag &= ~AFLAG;
5305
              else if (p[4] == '6' && p[5] == '4')
5306
                priv.orig_sizeflag |= AFLAG;
5307
            }
5308
          else
5309
            {
5310
              if (p[4] == '1' && p[5] == '6')
5311
                priv.orig_sizeflag &= ~AFLAG;
5312
              else if (p[4] == '3' && p[5] == '2')
5313
                priv.orig_sizeflag |= AFLAG;
5314
            }
5315
        }
5316
      else if (CONST_STRNEQ (p, "data"))
5317
        {
5318
          if (p[4] == '1' && p[5] == '6')
5319
            priv.orig_sizeflag &= ~DFLAG;
5320
          else if (p[4] == '3' && p[5] == '2')
5321
            priv.orig_sizeflag |= DFLAG;
5322
        }
5323
      else if (CONST_STRNEQ (p, "suffix"))
5324
        priv.orig_sizeflag |= SUFFIX_ALWAYS;
5325
 
5326
      p = strchr (p, ',');
5327
      if (p != NULL)
5328
        p++;
5329
    }
5330
 
5331
  if (intel_syntax)
5332
    {
5333
      names64 = intel_names64;
5334
      names32 = intel_names32;
5335
      names16 = intel_names16;
5336
      names8 = intel_names8;
5337
      names8rex = intel_names8rex;
5338
      names_seg = intel_names_seg;
5339
      index64 = intel_index64;
5340
      index32 = intel_index32;
5341
      index16 = intel_index16;
5342
      open_char = '[';
5343
      close_char = ']';
5344
      separator_char = '+';
5345
      scale_char = '*';
5346
    }
5347
  else
5348
    {
5349
      names64 = att_names64;
5350
      names32 = att_names32;
5351
      names16 = att_names16;
5352
      names8 = att_names8;
5353
      names8rex = att_names8rex;
5354
      names_seg = att_names_seg;
5355
      index64 = att_index64;
5356
      index32 = att_index32;
5357
      index16 = att_index16;
5358
      open_char = '(';
5359
      close_char =  ')';
5360
      separator_char = ',';
5361
      scale_char = ',';
5362
    }
5363
 
5364
  /* The output looks better if we put 7 bytes on a line, since that
5365
     puts most long word instructions on a single line.  */
5366
  info->bytes_per_line = 7;
5367
 
5368
  info->private_data = &priv;
5369
  priv.max_fetched = priv.the_buffer;
5370
  priv.insn_start = pc;
5371
 
5372
  obuf[0] = 0;
5373
  for (i = 0; i < MAX_OPERANDS; ++i)
5374
    {
5375
      op_out[i][0] = 0;
5376
      op_index[i] = -1;
5377
    }
5378
 
5379
  the_info = info;
5380
  start_pc = pc;
5381
  start_codep = priv.the_buffer;
5382
  codep = priv.the_buffer;
5383
 
5384
  if (setjmp (priv.bailout) != 0)
5385
    {
5386
      const char *name;
5387
 
5388
      /* Getting here means we tried for data but didn't get it.  That
5389
         means we have an incomplete instruction of some sort.  Just
5390
         print the first byte as a prefix or a .byte pseudo-op.  */
5391
      if (codep > priv.the_buffer)
5392
        {
5393
          name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
5394
          if (name != NULL)
5395
            (*info->fprintf_func) (info->stream, "%s", name);
5396
          else
5397
            {
5398
              /* Just print the first byte as a .byte instruction.  */
5399
              (*info->fprintf_func) (info->stream, ".byte 0x%x",
5400
                                     (unsigned int) priv.the_buffer[0]);
5401
            }
5402
 
5403
          return 1;
5404
        }
5405
 
5406
      return -1;
5407
    }
5408
 
5409
  obufp = obuf;
5410
  ckprefix ();
5411
 
5412
  insn_codep = codep;
5413
  sizeflag = priv.orig_sizeflag;
5414
 
5415
  FETCH_DATA (info, codep + 1);
5416
  two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
5417
 
5418
  if (((prefixes & PREFIX_FWAIT)
5419
       && ((*codep < 0xd8) || (*codep > 0xdf)))
5420
      || (rex && rex_used))
5421
    {
5422
      const char *name;
5423
 
5424
      /* fwait not followed by floating point instruction, or rex followed
5425
         by other prefixes.  Print the first prefix.  */
5426
      name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
5427
      if (name == NULL)
5428
        name = INTERNAL_DISASSEMBLER_ERROR;
5429
      (*info->fprintf_func) (info->stream, "%s", name);
5430
      return 1;
5431
    }
5432
 
5433
  op = 0;
5434
  if (*codep == 0x0f)
5435
    {
5436
      unsigned char threebyte;
5437
      FETCH_DATA (info, codep + 2);
5438
      threebyte = *++codep;
5439
      dp = &dis386_twobyte[threebyte];
5440
      need_modrm = twobyte_has_modrm[*codep];
5441
      codep++;
5442
    }
5443
  else
5444
    {
5445
      dp = &dis386[*codep];
5446
      need_modrm = onebyte_has_modrm[*codep];
5447
      codep++;
5448
    }
5449
 
5450
  if ((prefixes & PREFIX_REPZ))
5451
    {
5452
      repz_prefix = "repz ";
5453
      used_prefixes |= PREFIX_REPZ;
5454
    }
5455
  else
5456
    repz_prefix = NULL;
5457
 
5458
  if ((prefixes & PREFIX_REPNZ))
5459
    {
5460
      repnz_prefix = "repnz ";
5461
      used_prefixes |= PREFIX_REPNZ;
5462
    }
5463
  else
5464
    repnz_prefix = NULL;
5465
 
5466
  if ((prefixes & PREFIX_LOCK))
5467
    {
5468
      lock_prefix = "lock ";
5469
      used_prefixes |= PREFIX_LOCK;
5470
    }
5471
  else
5472
    lock_prefix = NULL;
5473
 
5474
  addr_prefix = NULL;
5475
  if (prefixes & PREFIX_ADDR)
5476
    {
5477
      sizeflag ^= AFLAG;
5478
      if (dp->op[2].bytemode != loop_jcxz_mode || intel_syntax)
5479
        {
5480
          if ((sizeflag & AFLAG) || address_mode == mode_64bit)
5481
            addr_prefix = "addr32 ";
5482
          else
5483
            addr_prefix = "addr16 ";
5484
          used_prefixes |= PREFIX_ADDR;
5485
        }
5486
    }
5487
 
5488
  data_prefix = NULL;
5489
  if ((prefixes & PREFIX_DATA))
5490
    {
5491
      sizeflag ^= DFLAG;
5492
      if (dp->op[2].bytemode == cond_jump_mode
5493
          && dp->op[0].bytemode == v_mode
5494
          && !intel_syntax)
5495
        {
5496
          if (sizeflag & DFLAG)
5497
            data_prefix = "data32 ";
5498
          else
5499
            data_prefix = "data16 ";
5500
          used_prefixes |= PREFIX_DATA;
5501
        }
5502
    }
5503
 
5504
  if (need_modrm)
5505
    {
5506
      FETCH_DATA (info, codep + 1);
5507
      modrm.mod = (*codep >> 6) & 3;
5508
      modrm.reg = (*codep >> 3) & 7;
5509
      modrm.rm = *codep & 7;
5510
    }
5511
 
5512
  if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
5513
    {
5514
      dofloat (sizeflag);
5515
    }
5516
  else
5517
    {
5518
      dp = get_valid_dis386 (dp, info);
5519
      if (dp != NULL && putop (dp->name, sizeflag) == 0)
5520
        {
5521
          for (i = 0; i < MAX_OPERANDS; ++i)
5522
            {
5523
              obufp = op_out[i];
5524
              op_ad = MAX_OPERANDS - 1 - i;
5525
              if (dp->op[i].rtn)
5526
                (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
5527
            }
5528
        }
5529
    }
5530
 
5531
  /* See if any prefixes were not used.  If so, print the first one
5532
     separately.  If we don't do this, we'll wind up printing an
5533
     instruction stream which does not precisely correspond to the
5534
     bytes we are disassembling.  */
5535
  if ((prefixes & ~used_prefixes) != 0)
5536
    {
5537
      const char *name;
5538
 
5539
      name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
5540
      if (name == NULL)
5541
        name = INTERNAL_DISASSEMBLER_ERROR;
5542
      (*info->fprintf_func) (info->stream, "%s", name);
5543
      return 1;
5544
    }
5545
  if (rex & ~rex_used)
5546
    {
5547
      const char *name;
5548
      name = prefix_name (rex | 0x40, priv.orig_sizeflag);
5549
      if (name == NULL)
5550
        name = INTERNAL_DISASSEMBLER_ERROR;
5551
      (*info->fprintf_func) (info->stream, "%s ", name);
5552
    }
5553
 
5554
  prefix_obuf[0] = 0;
5555
  prefix_obufp = prefix_obuf;
5556
  if (lock_prefix)
5557
    prefix_obufp = stpcpy (prefix_obufp, lock_prefix);
5558
  if (repz_prefix)
5559
    prefix_obufp = stpcpy (prefix_obufp, repz_prefix);
5560
  if (repnz_prefix)
5561
    prefix_obufp = stpcpy (prefix_obufp, repnz_prefix);
5562
  if (addr_prefix)
5563
    prefix_obufp = stpcpy (prefix_obufp, addr_prefix);
5564
  if (data_prefix)
5565
    prefix_obufp = stpcpy (prefix_obufp, data_prefix);
5566
 
5567
  if (prefix_obuf[0] != 0)
5568
    (*info->fprintf_func) (info->stream, "%s", prefix_obuf);
5569
 
5570
  obufp = obuf + strlen (obuf);
5571
  for (i = strlen (obuf) + strlen (prefix_obuf); i < 6; i++)
5572
    oappend (" ");
5573
  oappend (" ");
5574
  (*info->fprintf_func) (info->stream, "%s", obuf);
5575
 
5576
  /* The enter and bound instructions are printed with operands in the same
5577
     order as the intel book; everything else is printed in reverse order.  */
5578
  if (intel_syntax || two_source_ops)
5579
    {
5580
      bfd_vma riprel;
5581
 
5582
      for (i = 0; i < MAX_OPERANDS; ++i)
5583
        op_txt[i] = op_out[i];
5584
 
5585
      for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
5586
        {
5587
          op_ad = op_index[i];
5588
          op_index[i] = op_index[MAX_OPERANDS - 1 - i];
5589
          op_index[MAX_OPERANDS - 1 - i] = op_ad;
5590
          riprel = op_riprel[i];
5591
          op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
5592
          op_riprel[MAX_OPERANDS - 1 - i] = riprel;
5593
        }
5594
    }
5595
  else
5596
    {
5597
      for (i = 0; i < MAX_OPERANDS; ++i)
5598
        op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
5599
    }
5600
 
5601
  needcomma = 0;
5602
  for (i = 0; i < MAX_OPERANDS; ++i)
5603
    if (*op_txt[i])
5604
      {
5605
        if (needcomma)
5606
          (*info->fprintf_func) (info->stream, ",");
5607
        if (op_index[i] != -1 && !op_riprel[i])
5608
          (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
5609
        else
5610
          (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
5611
        needcomma = 1;
5612
      }
5613
 
5614
  for (i = 0; i < MAX_OPERANDS; i++)
5615
    if (op_index[i] != -1 && op_riprel[i])
5616
      {
5617
        (*info->fprintf_func) (info->stream, "        # ");
5618
        (*info->print_address_func) ((bfd_vma) (start_pc + codep - start_codep
5619
                                                + op_address[op_index[i]]), info);
5620
        break;
5621
      }
5622
  return codep - priv.the_buffer;
5623
}
5624
 
5625
static const char *float_mem[] = {
5626
  /* d8 */
5627
  "fadd{s|}",
5628
  "fmul{s|}",
5629
  "fcom{s|}",
5630
  "fcomp{s|}",
5631
  "fsub{s|}",
5632
  "fsubr{s|}",
5633
  "fdiv{s|}",
5634
  "fdivr{s|}",
5635
  /* d9 */
5636
  "fld{s|}",
5637
  "(bad)",
5638
  "fst{s|}",
5639
  "fstp{s|}",
5640
  "fldenvIC",
5641
  "fldcw",
5642
  "fNstenvIC",
5643
  "fNstcw",
5644
  /* da */
5645
  "fiadd{l|}",
5646
  "fimul{l|}",
5647
  "ficom{l|}",
5648
  "ficomp{l|}",
5649
  "fisub{l|}",
5650
  "fisubr{l|}",
5651
  "fidiv{l|}",
5652
  "fidivr{l|}",
5653
  /* db */
5654
  "fild{l|}",
5655
  "fisttp{l|}",
5656
  "fist{l|}",
5657
  "fistp{l|}",
5658
  "(bad)",
5659
  "fld{t||t|}",
5660
  "(bad)",
5661
  "fstp{t||t|}",
5662
  /* dc */
5663
  "fadd{l|}",
5664
  "fmul{l|}",
5665
  "fcom{l|}",
5666
  "fcomp{l|}",
5667
  "fsub{l|}",
5668
  "fsubr{l|}",
5669
  "fdiv{l|}",
5670
  "fdivr{l|}",
5671
  /* dd */
5672
  "fld{l|}",
5673
  "fisttp{ll|}",
5674
  "fst{l||}",
5675
  "fstp{l|}",
5676
  "frstorIC",
5677
  "(bad)",
5678
  "fNsaveIC",
5679
  "fNstsw",
5680
  /* de */
5681
  "fiadd",
5682
  "fimul",
5683
  "ficom",
5684
  "ficomp",
5685
  "fisub",
5686
  "fisubr",
5687
  "fidiv",
5688
  "fidivr",
5689
  /* df */
5690
  "fild",
5691
  "fisttp",
5692
  "fist",
5693
  "fistp",
5694
  "fbld",
5695
  "fild{ll|}",
5696
  "fbstp",
5697
  "fistp{ll|}",
5698
};
5699
 
5700
static const unsigned char float_mem_mode[] = {
5701
  /* d8 */
5702
  d_mode,
5703
  d_mode,
5704
  d_mode,
5705
  d_mode,
5706
  d_mode,
5707
  d_mode,
5708
  d_mode,
5709
  d_mode,
5710
  /* d9 */
5711
  d_mode,
5712
  0,
5713
  d_mode,
5714
  d_mode,
5715
  0,
5716
  w_mode,
5717
  0,
5718
  w_mode,
5719
  /* da */
5720
  d_mode,
5721
  d_mode,
5722
  d_mode,
5723
  d_mode,
5724
  d_mode,
5725
  d_mode,
5726
  d_mode,
5727
  d_mode,
5728
  /* db */
5729
  d_mode,
5730
  d_mode,
5731
  d_mode,
5732
  d_mode,
5733
  0,
5734
  t_mode,
5735
  0,
5736
  t_mode,
5737
  /* dc */
5738
  q_mode,
5739
  q_mode,
5740
  q_mode,
5741
  q_mode,
5742
  q_mode,
5743
  q_mode,
5744
  q_mode,
5745
  q_mode,
5746
  /* dd */
5747
  q_mode,
5748
  q_mode,
5749
  q_mode,
5750
  q_mode,
5751
  0,
5752
  0,
5753
  0,
5754
  w_mode,
5755
  /* de */
5756
  w_mode,
5757
  w_mode,
5758
  w_mode,
5759
  w_mode,
5760
  w_mode,
5761
  w_mode,
5762
  w_mode,
5763
  w_mode,
5764
  /* df */
5765
  w_mode,
5766
  w_mode,
5767
  w_mode,
5768
  w_mode,
5769
  t_mode,
5770
  q_mode,
5771
  t_mode,
5772
  q_mode
5773
};
5774
 
5775
#define ST { OP_ST, 0 }
5776
#define STi { OP_STi, 0 }
5777
 
5778
#define FGRPd9_2 NULL, { { NULL, 0 } }
5779
#define FGRPd9_4 NULL, { { NULL, 1 } }
5780
#define FGRPd9_5 NULL, { { NULL, 2 } }
5781
#define FGRPd9_6 NULL, { { NULL, 3 } }
5782
#define FGRPd9_7 NULL, { { NULL, 4 } }
5783
#define FGRPda_5 NULL, { { NULL, 5 } }
5784
#define FGRPdb_4 NULL, { { NULL, 6 } }
5785
#define FGRPde_3 NULL, { { NULL, 7 } }
5786
#define FGRPdf_4 NULL, { { NULL, 8 } }
5787
 
5788
static const struct dis386 float_reg[][8] = {
5789
  /* d8 */
5790
  {
5791
    { "fadd",   { ST, STi } },
5792
    { "fmul",   { ST, STi } },
5793
    { "fcom",   { STi } },
5794
    { "fcomp",  { STi } },
5795
    { "fsub",   { ST, STi } },
5796
    { "fsubr",  { ST, STi } },
5797
    { "fdiv",   { ST, STi } },
5798
    { "fdivr",  { ST, STi } },
5799
  },
5800
  /* d9 */
5801
  {
5802
    { "fld",    { STi } },
5803
    { "fxch",   { STi } },
5804
    { FGRPd9_2 },
5805
    { "(bad)",  { XX } },
5806
    { FGRPd9_4 },
5807
    { FGRPd9_5 },
5808
    { FGRPd9_6 },
5809
    { FGRPd9_7 },
5810
  },
5811
  /* da */
5812
  {
5813
    { "fcmovb", { ST, STi } },
5814
    { "fcmove", { ST, STi } },
5815
    { "fcmovbe",{ ST, STi } },
5816
    { "fcmovu", { ST, STi } },
5817
    { "(bad)",  { XX } },
5818
    { FGRPda_5 },
5819
    { "(bad)",  { XX } },
5820
    { "(bad)",  { XX } },
5821
  },
5822
  /* db */
5823
  {
5824
    { "fcmovnb",{ ST, STi } },
5825
    { "fcmovne",{ ST, STi } },
5826
    { "fcmovnbe",{ ST, STi } },
5827
    { "fcmovnu",{ ST, STi } },
5828
    { FGRPdb_4 },
5829
    { "fucomi", { ST, STi } },
5830
    { "fcomi",  { ST, STi } },
5831
    { "(bad)",  { XX } },
5832
  },
5833
  /* dc */
5834
  {
5835
    { "fadd",   { STi, ST } },
5836
    { "fmul",   { STi, ST } },
5837
    { "(bad)",  { XX } },
5838
    { "(bad)",  { XX } },
5839
    { "fsub!M", { STi, ST } },
5840
    { "fsubM",  { STi, ST } },
5841
    { "fdiv!M", { STi, ST } },
5842
    { "fdivM",  { STi, ST } },
5843
  },
5844
  /* dd */
5845
  {
5846
    { "ffree",  { STi } },
5847
    { "(bad)",  { XX } },
5848
    { "fst",    { STi } },
5849
    { "fstp",   { STi } },
5850
    { "fucom",  { STi } },
5851
    { "fucomp", { STi } },
5852
    { "(bad)",  { XX } },
5853
    { "(bad)",  { XX } },
5854
  },
5855
  /* de */
5856
  {
5857
    { "faddp",  { STi, ST } },
5858
    { "fmulp",  { STi, ST } },
5859
    { "(bad)",  { XX } },
5860
    { FGRPde_3 },
5861
    { "fsub!Mp", { STi, ST } },
5862
    { "fsubMp", { STi, ST } },
5863
    { "fdiv!Mp", { STi, ST } },
5864
    { "fdivMp", { STi, ST } },
5865
  },
5866
  /* df */
5867
  {
5868
    { "ffreep", { STi } },
5869
    { "(bad)",  { XX } },
5870
    { "(bad)",  { XX } },
5871
    { "(bad)",  { XX } },
5872
    { FGRPdf_4 },
5873
    { "fucomip", { ST, STi } },
5874
    { "fcomip", { ST, STi } },
5875
    { "(bad)",  { XX } },
5876
  },
5877
};
5878
 
5879
static char *fgrps[][8] = {
5880
  /* d9_2  0 */
5881
  {
5882
    "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
5883
  },
5884
 
5885
  /* d9_4  1 */
5886
  {
5887
    "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
5888
  },
5889
 
5890
  /* d9_5  2 */
5891
  {
5892
    "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
5893
  },
5894
 
5895
  /* d9_6  3 */
5896
  {
5897
    "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
5898
  },
5899
 
5900
  /* d9_7  4 */
5901
  {
5902
    "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
5903
  },
5904
 
5905
  /* da_5  5 */
5906
  {
5907
    "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
5908
  },
5909
 
5910
  /* db_4  6 */
5911
  {
5912
    "feni(287 only)","fdisi(287 only)","fNclex","fNinit",
5913
    "fNsetpm(287 only)","(bad)","(bad)","(bad)",
5914
  },
5915
 
5916
  /* de_3  7 */
5917
  {
5918
    "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
5919
  },
5920
 
5921
  /* df_4  8 */
5922
  {
5923
    "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
5924
  },
5925
};
5926
 
5927
static void
5928
OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
5929
               int sizeflag ATTRIBUTE_UNUSED)
5930
{
5931
  /* Skip mod/rm byte.  */
5932
  MODRM_CHECK;
5933
  codep++;
5934
}
5935
 
5936
static void
5937
dofloat (int sizeflag)
5938
{
5939
  const struct dis386 *dp;
5940
  unsigned char floatop;
5941
 
5942
  floatop = codep[-1];
5943
 
5944
  if (modrm.mod != 3)
5945
    {
5946
      int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
5947
 
5948
      putop (float_mem[fp_indx], sizeflag);
5949
      obufp = op_out[0];
5950
      op_ad = 2;
5951
      OP_E (float_mem_mode[fp_indx], sizeflag);
5952
      return;
5953
    }
5954
  /* Skip mod/rm byte.  */
5955
  MODRM_CHECK;
5956
  codep++;
5957
 
5958
  dp = &float_reg[floatop - 0xd8][modrm.reg];
5959
  if (dp->name == NULL)
5960
    {
5961
      putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
5962
 
5963
      /* Instruction fnstsw is only one with strange arg.  */
5964
      if (floatop == 0xdf && codep[-1] == 0xe0)
5965
        strcpy (op_out[0], names16[0]);
5966
    }
5967
  else
5968
    {
5969
      putop (dp->name, sizeflag);
5970
 
5971
      obufp = op_out[0];
5972
      op_ad = 2;
5973
      if (dp->op[0].rtn)
5974
        (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
5975
 
5976
      obufp = op_out[1];
5977
      op_ad = 1;
5978
      if (dp->op[1].rtn)
5979
        (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
5980
    }
5981
}
5982
 
5983
static void
5984
OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
5985
{
5986
  oappend ("%st" + intel_syntax);
5987
}
5988
 
5989
static void
5990
OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
5991
{
5992
  sprintf (scratchbuf, "%%st(%d)", modrm.rm);
5993
  oappend (scratchbuf + intel_syntax);
5994
}
5995
 
5996
/* Capital letters in template are macros.  */
5997
static int
5998
putop (const char *template, int sizeflag)
5999
{
6000
  const char *p;
6001
  int alt = 0;
6002
  int cond = 1;
6003
  unsigned int l = 0, len = 1;
6004
  char last[4];
6005
 
6006
#define SAVE_LAST(c)                    \
6007
  if (l < len && l < sizeof (last))     \
6008
    last[l++] = c;                      \
6009
  else                                  \
6010
    abort ();
6011
 
6012
  for (p = template; *p; p++)
6013
    {
6014
      switch (*p)
6015
        {
6016
        default:
6017
          *obufp++ = *p;
6018
          break;
6019
        case '%':
6020
          len++;
6021
          break;
6022
        case '!':
6023
          cond = 0;
6024
          break;
6025
        case '{':
6026
          alt = 0;
6027
          if (intel_syntax)
6028
            {
6029
              while (*++p != '|')
6030
                if (*p == '}' || *p == '\0')
6031
                  abort ();
6032
            }
6033
          /* Fall through.  */
6034
        case 'I':
6035
          alt = 1;
6036
          continue;
6037
        case '|':
6038
          while (*++p != '}')
6039
            {
6040
              if (*p == '\0')
6041
                abort ();
6042
            }
6043
          break;
6044
        case '}':
6045
          break;
6046
        case 'A':
6047
          if (intel_syntax)
6048
            break;
6049
          if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
6050
            *obufp++ = 'b';
6051
          break;
6052
        case 'B':
6053
          if (intel_syntax)
6054
            break;
6055
          if (sizeflag & SUFFIX_ALWAYS)
6056
            *obufp++ = 'b';
6057
          break;
6058
        case 'C':
6059
          if (intel_syntax && !alt)
6060
            break;
6061
          if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
6062
            {
6063
              if (sizeflag & DFLAG)
6064
                *obufp++ = intel_syntax ? 'd' : 'l';
6065
              else
6066
                *obufp++ = intel_syntax ? 'w' : 's';
6067
              used_prefixes |= (prefixes & PREFIX_DATA);
6068
            }
6069
          break;
6070
        case 'D':
6071
          if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
6072
            break;
6073
          USED_REX (REX_W);
6074
          if (modrm.mod == 3)
6075
            {
6076
              if (rex & REX_W)
6077
                *obufp++ = 'q';
6078
              else if (sizeflag & DFLAG)
6079
                *obufp++ = intel_syntax ? 'd' : 'l';
6080
              else
6081
                *obufp++ = 'w';
6082
              used_prefixes |= (prefixes & PREFIX_DATA);
6083
            }
6084
          else
6085
            *obufp++ = 'w';
6086
          break;
6087
        case 'E':               /* For jcxz/jecxz */
6088
          if (address_mode == mode_64bit)
6089
            {
6090
              if (sizeflag & AFLAG)
6091
                *obufp++ = 'r';
6092
              else
6093
                *obufp++ = 'e';
6094
            }
6095
          else
6096
            if (sizeflag & AFLAG)
6097
              *obufp++ = 'e';
6098
          used_prefixes |= (prefixes & PREFIX_ADDR);
6099
          break;
6100
        case 'F':
6101
          if (intel_syntax)
6102
            break;
6103
          if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
6104
            {
6105
              if (sizeflag & AFLAG)
6106
                *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
6107
              else
6108
                *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
6109
              used_prefixes |= (prefixes & PREFIX_ADDR);
6110
            }
6111
          break;
6112
        case 'G':
6113
          if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
6114
            break;
6115
          if ((rex & REX_W) || (sizeflag & DFLAG))
6116
            *obufp++ = 'l';
6117
          else
6118
            *obufp++ = 'w';
6119
          if (!(rex & REX_W))
6120
            used_prefixes |= (prefixes & PREFIX_DATA);
6121
          break;
6122
        case 'H':
6123
          if (intel_syntax)
6124
            break;
6125
          if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
6126
              || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
6127
            {
6128
              used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
6129
              *obufp++ = ',';
6130
              *obufp++ = 'p';
6131
              if (prefixes & PREFIX_DS)
6132
                *obufp++ = 't';
6133
              else
6134
                *obufp++ = 'n';
6135
            }
6136
          break;
6137
        case 'J':
6138
          if (intel_syntax)
6139
            break;
6140
          *obufp++ = 'l';
6141
          break;
6142
        case 'K':
6143
          USED_REX (REX_W);
6144
          if (rex & REX_W)
6145
            *obufp++ = 'q';
6146
          else
6147
            *obufp++ = 'd';
6148
          break;
6149
        case 'Z':
6150
          if (intel_syntax)
6151
            break;
6152
          if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
6153
            {
6154
              *obufp++ = 'q';
6155
              break;
6156
            }
6157
          /* Fall through.  */
6158
          goto case_L;
6159
        case 'L':
6160
          if (l != 0 || len != 1)
6161
            {
6162
              SAVE_LAST (*p);
6163
              break;
6164
            }
6165
case_L:
6166
          if (intel_syntax)
6167
            break;
6168
          if (sizeflag & SUFFIX_ALWAYS)
6169
            *obufp++ = 'l';
6170
          break;
6171
        case 'M':
6172
          if (intel_mnemonic != cond)
6173
            *obufp++ = 'r';
6174
          break;
6175
        case 'N':
6176
          if ((prefixes & PREFIX_FWAIT) == 0)
6177
            *obufp++ = 'n';
6178
          else
6179
            used_prefixes |= PREFIX_FWAIT;
6180
          break;
6181
        case 'O':
6182
          USED_REX (REX_W);
6183
          if (rex & REX_W)
6184
            *obufp++ = 'o';
6185
          else if (intel_syntax && (sizeflag & DFLAG))
6186
            *obufp++ = 'q';
6187
          else
6188
            *obufp++ = 'd';
6189
          if (!(rex & REX_W))
6190
            used_prefixes |= (prefixes & PREFIX_DATA);
6191
          break;
6192
        case 'T':
6193
          if (intel_syntax)
6194
            break;
6195
          if (address_mode == mode_64bit && (sizeflag & DFLAG))
6196
            {
6197
              *obufp++ = 'q';
6198
              break;
6199
            }
6200
          /* Fall through.  */
6201
        case 'P':
6202
          if (intel_syntax)
6203
            break;
6204
          if ((prefixes & PREFIX_DATA)
6205
              || (rex & REX_W)
6206
              || (sizeflag & SUFFIX_ALWAYS))
6207
            {
6208
              USED_REX (REX_W);
6209
              if (rex & REX_W)
6210
                *obufp++ = 'q';
6211
              else
6212
                {
6213
                   if (sizeflag & DFLAG)
6214
                      *obufp++ = 'l';
6215
                   else
6216
                     *obufp++ = 'w';
6217
                }
6218
              used_prefixes |= (prefixes & PREFIX_DATA);
6219
            }
6220
          break;
6221
        case 'U':
6222
          if (intel_syntax)
6223
            break;
6224
          if (address_mode == mode_64bit && (sizeflag & DFLAG))
6225
            {
6226
              if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
6227
                *obufp++ = 'q';
6228
              break;
6229
            }
6230
          /* Fall through.  */
6231
          goto case_Q;
6232
        case 'Q':
6233
          if (l == 0 && len == 1)
6234
            {
6235
case_Q:
6236
              if (intel_syntax && !alt)
6237
                break;
6238
              USED_REX (REX_W);
6239
              if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
6240
                {
6241
                  if (rex & REX_W)
6242
                    *obufp++ = 'q';
6243
                  else
6244
                    {
6245
                      if (sizeflag & DFLAG)
6246
                        *obufp++ = intel_syntax ? 'd' : 'l';
6247
                      else
6248
                        *obufp++ = 'w';
6249
                    }
6250
                  used_prefixes |= (prefixes & PREFIX_DATA);
6251
                }
6252
            }
6253
          else
6254
            {
6255
              if (l != 1 || len != 2 || last[0] != 'L')
6256
                {
6257
                  SAVE_LAST (*p);
6258
                  break;
6259
                }
6260
              if (intel_syntax
6261
                  || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
6262
                break;
6263
              if ((rex & REX_W))
6264
                {
6265
                  USED_REX (REX_W);
6266
                  *obufp++ = 'q';
6267
                }
6268
              else
6269
                *obufp++ = 'l';
6270
            }
6271
          break;
6272
        case 'R':
6273
          USED_REX (REX_W);
6274
          if (rex & REX_W)
6275
            *obufp++ = 'q';
6276
          else if (sizeflag & DFLAG)
6277
            {
6278
              if (intel_syntax)
6279
                  *obufp++ = 'd';
6280
              else
6281
                  *obufp++ = 'l';
6282
            }
6283
          else
6284
            *obufp++ = 'w';
6285
          if (intel_syntax && !p[1]
6286
              && ((rex & REX_W) || (sizeflag & DFLAG)))
6287
            *obufp++ = 'e';
6288
          if (!(rex & REX_W))
6289
            used_prefixes |= (prefixes & PREFIX_DATA);
6290
          break;
6291
        case 'V':
6292
          if (intel_syntax)
6293
            break;
6294
          if (address_mode == mode_64bit && (sizeflag & DFLAG))
6295
            {
6296
              if (sizeflag & SUFFIX_ALWAYS)
6297
                *obufp++ = 'q';
6298
              break;
6299
            }
6300
          /* Fall through.  */
6301
        case 'S':
6302
          if (intel_syntax)
6303
            break;
6304
          if (sizeflag & SUFFIX_ALWAYS)
6305
            {
6306
              if (rex & REX_W)
6307
                *obufp++ = 'q';
6308
              else
6309
                {
6310
                  if (sizeflag & DFLAG)
6311
                    *obufp++ = 'l';
6312
                  else
6313
                    *obufp++ = 'w';
6314
                  used_prefixes |= (prefixes & PREFIX_DATA);
6315
                }
6316
            }
6317
          break;
6318
        case 'X':
6319
          if (prefixes & PREFIX_DATA)
6320
            *obufp++ = 'd';
6321
          else
6322
            *obufp++ = 's';
6323
          used_prefixes |= (prefixes & PREFIX_DATA);
6324
          break;
6325
        case 'Y':
6326
          if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
6327
            break;
6328
          if (rex & REX_W)
6329
            {
6330
              USED_REX (REX_W);
6331
              *obufp++ = 'q';
6332
            }
6333
          break;
6334
          /* implicit operand size 'l' for i386 or 'q' for x86-64 */
6335
        case 'W':
6336
          /* operand size flag for cwtl, cbtw */
6337
          USED_REX (REX_W);
6338
          if (rex & REX_W)
6339
            {
6340
              if (intel_syntax)
6341
                *obufp++ = 'd';
6342
              else
6343
                *obufp++ = 'l';
6344
            }
6345
          else if (sizeflag & DFLAG)
6346
            *obufp++ = 'w';
6347
          else
6348
            *obufp++ = 'b';
6349
          if (!(rex & REX_W))
6350
            used_prefixes |= (prefixes & PREFIX_DATA);
6351
          break;
6352
        }
6353
      alt = 0;
6354
    }
6355
  *obufp = 0;
6356
  return 0;
6357
}
6358
 
6359
static void
6360
oappend (const char *s)
6361
{
6362
  strcpy (obufp, s);
6363
  obufp += strlen (s);
6364
}
6365
 
6366
static void
6367
append_seg (void)
6368
{
6369
  if (prefixes & PREFIX_CS)
6370
    {
6371
      used_prefixes |= PREFIX_CS;
6372
      oappend ("%cs:" + intel_syntax);
6373
    }
6374
  if (prefixes & PREFIX_DS)
6375
    {
6376
      used_prefixes |= PREFIX_DS;
6377
      oappend ("%ds:" + intel_syntax);
6378
    }
6379
  if (prefixes & PREFIX_SS)
6380
    {
6381
      used_prefixes |= PREFIX_SS;
6382
      oappend ("%ss:" + intel_syntax);
6383
    }
6384
  if (prefixes & PREFIX_ES)
6385
    {
6386
      used_prefixes |= PREFIX_ES;
6387
      oappend ("%es:" + intel_syntax);
6388
    }
6389
  if (prefixes & PREFIX_FS)
6390
    {
6391
      used_prefixes |= PREFIX_FS;
6392
      oappend ("%fs:" + intel_syntax);
6393
    }
6394
  if (prefixes & PREFIX_GS)
6395
    {
6396
      used_prefixes |= PREFIX_GS;
6397
      oappend ("%gs:" + intel_syntax);
6398
    }
6399
}
6400
 
6401
static void
6402
OP_indirE (int bytemode, int sizeflag)
6403
{
6404
  if (!intel_syntax)
6405
    oappend ("*");
6406
  OP_E (bytemode, sizeflag);
6407
}
6408
 
6409
static void
6410
print_operand_value (char *buf, int hex, bfd_vma disp)
6411
{
6412
  if (address_mode == mode_64bit)
6413
    {
6414
      if (hex)
6415
        {
6416
          char tmp[30];
6417
          int i;
6418
          buf[0] = '0';
6419
          buf[1] = 'x';
6420
          sprintf_vma (tmp, disp);
6421
          for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
6422
          strcpy (buf + 2, tmp + i);
6423
        }
6424
      else
6425
        {
6426
          bfd_signed_vma v = disp;
6427
          char tmp[30];
6428
          int i;
6429
          if (v < 0)
6430
            {
6431
              *(buf++) = '-';
6432
              v = -disp;
6433
              /* Check for possible overflow on 0x8000000000000000.  */
6434
              if (v < 0)
6435
                {
6436
                  strcpy (buf, "9223372036854775808");
6437
                  return;
6438
                }
6439
            }
6440
          if (!v)
6441
            {
6442
              strcpy (buf, "0");
6443
              return;
6444
            }
6445
 
6446
          i = 0;
6447
          tmp[29] = 0;
6448
          while (v)
6449
            {
6450
              tmp[28 - i] = (v % 10) + '0';
6451
              v /= 10;
6452
              i++;
6453
            }
6454
          strcpy (buf, tmp + 29 - i);
6455
        }
6456
    }
6457
  else
6458
    {
6459
      if (hex)
6460
        sprintf (buf, "0x%x", (unsigned int) disp);
6461
      else
6462
        sprintf (buf, "%d", (int) disp);
6463
    }
6464
}
6465
 
6466
/* Put DISP in BUF as signed hex number.  */
6467
 
6468
static void
6469
print_displacement (char *buf, bfd_vma disp)
6470
{
6471
  bfd_signed_vma val = disp;
6472
  char tmp[30];
6473
  int i, j = 0;
6474
 
6475
  if (val < 0)
6476
    {
6477
      buf[j++] = '-';
6478
      val = -disp;
6479
 
6480
      /* Check for possible overflow.  */
6481
      if (val < 0)
6482
        {
6483
          switch (address_mode)
6484
            {
6485
            case mode_64bit:
6486
              strcpy (buf + j, "0x8000000000000000");
6487
              break;
6488
            case mode_32bit:
6489
              strcpy (buf + j, "0x80000000");
6490
              break;
6491
            case mode_16bit:
6492
              strcpy (buf + j, "0x8000");
6493
              break;
6494
            }
6495
          return;
6496
        }
6497
    }
6498
 
6499
  buf[j++] = '0';
6500
  buf[j++] = 'x';
6501
 
6502
  sprintf_vma (tmp, val);
6503
  for (i = 0; tmp[i] == '0'; i++)
6504
    continue;
6505
  if (tmp[i] == '\0')
6506
    i--;
6507
  strcpy (buf + j, tmp + i);
6508
}
6509
 
6510
static void
6511
intel_operand_size (int bytemode, int sizeflag)
6512
{
6513
  switch (bytemode)
6514
    {
6515
    case b_mode:
6516
    case dqb_mode:
6517
      oappend ("BYTE PTR ");
6518
      break;
6519
    case w_mode:
6520
    case dqw_mode:
6521
      oappend ("WORD PTR ");
6522
      break;
6523
    case stack_v_mode:
6524
      if (address_mode == mode_64bit && (sizeflag & DFLAG))
6525
        {
6526
          oappend ("QWORD PTR ");
6527
          used_prefixes |= (prefixes & PREFIX_DATA);
6528
          break;
6529
        }
6530
      /* FALLTHRU */
6531
    case v_mode:
6532
    case dq_mode:
6533
      USED_REX (REX_W);
6534
      if (rex & REX_W)
6535
        oappend ("QWORD PTR ");
6536
      else if ((sizeflag & DFLAG) || bytemode == dq_mode)
6537
        oappend ("DWORD PTR ");
6538
      else
6539
        oappend ("WORD PTR ");
6540
      used_prefixes |= (prefixes & PREFIX_DATA);
6541
      break;
6542
    case z_mode:
6543
      if ((rex & REX_W) || (sizeflag & DFLAG))
6544
        *obufp++ = 'D';
6545
      oappend ("WORD PTR ");
6546
      if (!(rex & REX_W))
6547
        used_prefixes |= (prefixes & PREFIX_DATA);
6548
      break;
6549
    case a_mode:
6550
      if (sizeflag & DFLAG)
6551
        oappend ("QWORD PTR ");
6552
      else
6553
        oappend ("DWORD PTR ");
6554
      used_prefixes |= (prefixes & PREFIX_DATA);
6555
      break;
6556
    case d_mode:
6557
    case dqd_mode:
6558
      oappend ("DWORD PTR ");
6559
      break;
6560
    case q_mode:
6561
      oappend ("QWORD PTR ");
6562
      break;
6563
    case m_mode:
6564
      if (address_mode == mode_64bit)
6565
        oappend ("QWORD PTR ");
6566
      else
6567
        oappend ("DWORD PTR ");
6568
      break;
6569
    case f_mode:
6570
      if (sizeflag & DFLAG)
6571
        oappend ("FWORD PTR ");
6572
      else
6573
        oappend ("DWORD PTR ");
6574
      used_prefixes |= (prefixes & PREFIX_DATA);
6575
      break;
6576
    case t_mode:
6577
      oappend ("TBYTE PTR ");
6578
      break;
6579
    case x_mode:
6580
      oappend ("XMMWORD PTR ");
6581
      break;
6582
    case o_mode:
6583
      oappend ("OWORD PTR ");
6584
      break;
6585
    default:
6586
      break;
6587
    }
6588
}
6589
 
6590
static void
6591
OP_E_extended (int bytemode, int sizeflag, int has_drex)
6592
{
6593
  bfd_vma disp;
6594
  int add = 0;
6595
  int riprel = 0;
6596
  USED_REX (REX_B);
6597
  if (rex & REX_B)
6598
    add += 8;
6599
 
6600
  /* Skip mod/rm byte.  */
6601
  MODRM_CHECK;
6602
  codep++;
6603
 
6604
  if (modrm.mod == 3)
6605
    {
6606
      switch (bytemode)
6607
        {
6608
        case b_mode:
6609
          USED_REX (0);
6610
          if (rex)
6611
            oappend (names8rex[modrm.rm + add]);
6612
          else
6613
            oappend (names8[modrm.rm + add]);
6614
          break;
6615
        case w_mode:
6616
          oappend (names16[modrm.rm + add]);
6617
          break;
6618
        case d_mode:
6619
          oappend (names32[modrm.rm + add]);
6620
          break;
6621
        case q_mode:
6622
          oappend (names64[modrm.rm + add]);
6623
          break;
6624
        case m_mode:
6625
          if (address_mode == mode_64bit)
6626
            oappend (names64[modrm.rm + add]);
6627
          else
6628
            oappend (names32[modrm.rm + add]);
6629
          break;
6630
        case stack_v_mode:
6631
          if (address_mode == mode_64bit && (sizeflag & DFLAG))
6632
            {
6633
              oappend (names64[modrm.rm + add]);
6634
              used_prefixes |= (prefixes & PREFIX_DATA);
6635
              break;
6636
            }
6637
          bytemode = v_mode;
6638
          /* FALLTHRU */
6639
        case v_mode:
6640
        case dq_mode:
6641
        case dqb_mode:
6642
        case dqd_mode:
6643
        case dqw_mode:
6644
          USED_REX (REX_W);
6645
          if (rex & REX_W)
6646
            oappend (names64[modrm.rm + add]);
6647
          else if ((sizeflag & DFLAG) || bytemode != v_mode)
6648
            oappend (names32[modrm.rm + add]);
6649
          else
6650
            oappend (names16[modrm.rm + add]);
6651
          used_prefixes |= (prefixes & PREFIX_DATA);
6652
          break;
6653
        case 0:
6654
          break;
6655
        default:
6656
          oappend (INTERNAL_DISASSEMBLER_ERROR);
6657
          break;
6658
        }
6659
      return;
6660
    }
6661
 
6662
  disp = 0;
6663
  if (intel_syntax)
6664
    intel_operand_size (bytemode, sizeflag);
6665
  append_seg ();
6666
 
6667
  if ((sizeflag & AFLAG) || address_mode == mode_64bit)
6668
    {
6669
      /* 32/64 bit address mode */
6670
      int havedisp;
6671
      int havesib;
6672
      int havebase;
6673
      int haveindex;
6674
      int needindex;
6675
      int base, rbase;
6676
      int index = 0;
6677
      int scale = 0;
6678
 
6679
      havesib = 0;
6680
      havebase = 1;
6681
      haveindex = 0;
6682
      base = modrm.rm;
6683
 
6684
      if (base == 4)
6685
        {
6686
          havesib = 1;
6687
          FETCH_DATA (the_info, codep + 1);
6688
          index = (*codep >> 3) & 7;
6689
          scale = (*codep >> 6) & 3;
6690
          base = *codep & 7;
6691
          USED_REX (REX_X);
6692
          if (rex & REX_X)
6693
            index += 8;
6694
          haveindex = index != 4;
6695
          codep++;
6696
        }
6697
      rbase = base + add;
6698
 
6699
      /* If we have a DREX byte, skip it now
6700
         (it has already been handled) */
6701
      if (has_drex)
6702
        {
6703
          FETCH_DATA (the_info, codep + 1);
6704
          codep++;
6705
        }
6706
 
6707
      switch (modrm.mod)
6708
        {
6709
        case 0:
6710
          if (base == 5)
6711
            {
6712
              havebase = 0;
6713
              if (address_mode == mode_64bit && !havesib)
6714
                riprel = 1;
6715
              disp = get32s ();
6716
            }
6717
          break;
6718
        case 1:
6719
          FETCH_DATA (the_info, codep + 1);
6720
          disp = *codep++;
6721
          if ((disp & 0x80) != 0)
6722
            disp -= 0x100;
6723
          break;
6724
        case 2:
6725
          disp = get32s ();
6726
          break;
6727
        }
6728
 
6729
      /* In 32bit mode, we need index register to tell [offset] from
6730
         [eiz*1 + offset].  */
6731
      needindex = (havesib
6732
                   && !havebase
6733
                   && !haveindex
6734
                   && address_mode == mode_32bit);
6735
      havedisp = (havebase
6736
                  || needindex
6737
                  || (havesib && (haveindex || scale != 0)));
6738
 
6739
      if (!intel_syntax)
6740
        if (modrm.mod != 0 || base == 5)
6741
          {
6742
            if (havedisp || riprel)
6743
              print_displacement (scratchbuf, disp);
6744
            else
6745
              print_operand_value (scratchbuf, 1, disp);
6746
            oappend (scratchbuf);
6747
            if (riprel)
6748
              {
6749
                set_op (disp, 1);
6750
                oappend (sizeflag & AFLAG ? "(%rip)" : "(%eip)");
6751
              }
6752
          }
6753
 
6754
      if (havebase || haveindex || riprel)
6755
        used_prefixes |= PREFIX_ADDR;
6756
 
6757
      if (havedisp || (intel_syntax && riprel))
6758
        {
6759
          *obufp++ = open_char;
6760
          if (intel_syntax && riprel)
6761
            {
6762
              set_op (disp, 1);
6763
              oappend (sizeflag & AFLAG ? "rip" : "eip");
6764
            }
6765
          *obufp = '\0';
6766
          if (havebase)
6767
            oappend (address_mode == mode_64bit && (sizeflag & AFLAG)
6768
                     ? names64[rbase] : names32[rbase]);
6769
          if (havesib)
6770
            {
6771
              /* ESP/RSP won't allow index.  If base isn't ESP/RSP,
6772
                 print index to tell base + index from base.  */
6773
              if (scale != 0
6774
                  || needindex
6775
                  || haveindex
6776
                  || (havebase && base != ESP_REG_NUM))
6777
                {
6778
                  if (!intel_syntax || havebase)
6779
                    {
6780
                      *obufp++ = separator_char;
6781
                      *obufp = '\0';
6782
                    }
6783
                  if (haveindex)
6784
                    oappend (address_mode == mode_64bit
6785
                             && (sizeflag & AFLAG)
6786
                             ? names64[index] : names32[index]);
6787
                  else
6788
                    oappend (address_mode == mode_64bit
6789
                             && (sizeflag & AFLAG)
6790
                             ? index64 : index32);
6791
 
6792
                  *obufp++ = scale_char;
6793
                  *obufp = '\0';
6794
                  sprintf (scratchbuf, "%d", 1 << scale);
6795
                  oappend (scratchbuf);
6796
                }
6797
            }
6798
          if (intel_syntax
6799
              && (disp || modrm.mod != 0 || base == 5))
6800
            {
6801
              if (!havedisp || (bfd_signed_vma) disp >= 0)
6802
                {
6803
                  *obufp++ = '+';
6804
                  *obufp = '\0';
6805
                }
6806
              else if (modrm.mod != 1)
6807
                {
6808
                  *obufp++ = '-';
6809
                  *obufp = '\0';
6810
                  disp = - (bfd_signed_vma) disp;
6811
                }
6812
 
6813
              if (havedisp)
6814
                print_displacement (scratchbuf, disp);
6815
              else
6816
                print_operand_value (scratchbuf, 1, disp);
6817
              oappend (scratchbuf);
6818
            }
6819
 
6820
          *obufp++ = close_char;
6821
          *obufp = '\0';
6822
        }
6823
      else if (intel_syntax)
6824
        {
6825
          if (modrm.mod != 0 || base == 5)
6826
            {
6827
              if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
6828
                              | PREFIX_ES | PREFIX_FS | PREFIX_GS))
6829
                ;
6830
              else
6831
                {
6832
                  oappend (names_seg[ds_reg - es_reg]);
6833
                  oappend (":");
6834
                }
6835
              print_operand_value (scratchbuf, 1, disp);
6836
              oappend (scratchbuf);
6837
            }
6838
        }
6839
    }
6840
  else
6841
    { /* 16 bit address mode */
6842
      switch (modrm.mod)
6843
        {
6844
        case 0:
6845
          if (modrm.rm == 6)
6846
            {
6847
              disp = get16 ();
6848
              if ((disp & 0x8000) != 0)
6849
                disp -= 0x10000;
6850
            }
6851
          break;
6852
        case 1:
6853
          FETCH_DATA (the_info, codep + 1);
6854
          disp = *codep++;
6855
          if ((disp & 0x80) != 0)
6856
            disp -= 0x100;
6857
          break;
6858
        case 2:
6859
          disp = get16 ();
6860
          if ((disp & 0x8000) != 0)
6861
            disp -= 0x10000;
6862
          break;
6863
        }
6864
 
6865
      if (!intel_syntax)
6866
        if (modrm.mod != 0 || modrm.rm == 6)
6867
          {
6868
            print_displacement (scratchbuf, disp);
6869
            oappend (scratchbuf);
6870
          }
6871
 
6872
      if (modrm.mod != 0 || modrm.rm != 6)
6873
        {
6874
          *obufp++ = open_char;
6875
          *obufp = '\0';
6876
          oappend (index16[modrm.rm]);
6877
          if (intel_syntax
6878
              && (disp || modrm.mod != 0 || modrm.rm == 6))
6879
            {
6880
              if ((bfd_signed_vma) disp >= 0)
6881
                {
6882
                  *obufp++ = '+';
6883
                  *obufp = '\0';
6884
                }
6885
              else if (modrm.mod != 1)
6886
                {
6887
                  *obufp++ = '-';
6888
                  *obufp = '\0';
6889
                  disp = - (bfd_signed_vma) disp;
6890
                }
6891
 
6892
              print_displacement (scratchbuf, disp);
6893
              oappend (scratchbuf);
6894
            }
6895
 
6896
          *obufp++ = close_char;
6897
          *obufp = '\0';
6898
        }
6899
      else if (intel_syntax)
6900
        {
6901
          if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
6902
                          | PREFIX_ES | PREFIX_FS | PREFIX_GS))
6903
            ;
6904
          else
6905
            {
6906
              oappend (names_seg[ds_reg - es_reg]);
6907
              oappend (":");
6908
            }
6909
          print_operand_value (scratchbuf, 1, disp & 0xffff);
6910
          oappend (scratchbuf);
6911
        }
6912
    }
6913
}
6914
 
6915
static void
6916
OP_E (int bytemode, int sizeflag)
6917
{
6918
  OP_E_extended (bytemode, sizeflag, 0);
6919
}
6920
 
6921
 
6922
static void
6923
OP_G (int bytemode, int sizeflag)
6924
{
6925
  int add = 0;
6926
  USED_REX (REX_R);
6927
  if (rex & REX_R)
6928
    add += 8;
6929
  switch (bytemode)
6930
    {
6931
    case b_mode:
6932
      USED_REX (0);
6933
      if (rex)
6934
        oappend (names8rex[modrm.reg + add]);
6935
      else
6936
        oappend (names8[modrm.reg + add]);
6937
      break;
6938
    case w_mode:
6939
      oappend (names16[modrm.reg + add]);
6940
      break;
6941
    case d_mode:
6942
      oappend (names32[modrm.reg + add]);
6943
      break;
6944
    case q_mode:
6945
      oappend (names64[modrm.reg + add]);
6946
      break;
6947
    case v_mode:
6948
    case dq_mode:
6949
    case dqb_mode:
6950
    case dqd_mode:
6951
    case dqw_mode:
6952
      USED_REX (REX_W);
6953
      if (rex & REX_W)
6954
        oappend (names64[modrm.reg + add]);
6955
      else if ((sizeflag & DFLAG) || bytemode != v_mode)
6956
        oappend (names32[modrm.reg + add]);
6957
      else
6958
        oappend (names16[modrm.reg + add]);
6959
      used_prefixes |= (prefixes & PREFIX_DATA);
6960
      break;
6961
    case m_mode:
6962
      if (address_mode == mode_64bit)
6963
        oappend (names64[modrm.reg + add]);
6964
      else
6965
        oappend (names32[modrm.reg + add]);
6966
      break;
6967
    default:
6968
      oappend (INTERNAL_DISASSEMBLER_ERROR);
6969
      break;
6970
    }
6971
}
6972
 
6973
static bfd_vma
6974
get64 (void)
6975
{
6976
  bfd_vma x;
6977
#ifdef BFD64
6978
  unsigned int a;
6979
  unsigned int b;
6980
 
6981
  FETCH_DATA (the_info, codep + 8);
6982
  a = *codep++ & 0xff;
6983
  a |= (*codep++ & 0xff) << 8;
6984
  a |= (*codep++ & 0xff) << 16;
6985
  a |= (*codep++ & 0xff) << 24;
6986
  b = *codep++ & 0xff;
6987
  b |= (*codep++ & 0xff) << 8;
6988
  b |= (*codep++ & 0xff) << 16;
6989
  b |= (*codep++ & 0xff) << 24;
6990
  x = a + ((bfd_vma) b << 32);
6991
#else
6992
  abort ();
6993
  x = 0;
6994
#endif
6995
  return x;
6996
}
6997
 
6998
static bfd_signed_vma
6999
get32 (void)
7000
{
7001
  bfd_signed_vma x = 0;
7002
 
7003
  FETCH_DATA (the_info, codep + 4);
7004
  x = *codep++ & (bfd_signed_vma) 0xff;
7005
  x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
7006
  x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
7007
  x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
7008
  return x;
7009
}
7010
 
7011
static bfd_signed_vma
7012
get32s (void)
7013
{
7014
  bfd_signed_vma x = 0;
7015
 
7016
  FETCH_DATA (the_info, codep + 4);
7017
  x = *codep++ & (bfd_signed_vma) 0xff;
7018
  x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
7019
  x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
7020
  x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
7021
 
7022
  x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
7023
 
7024
  return x;
7025
}
7026
 
7027
static int
7028
get16 (void)
7029
{
7030
  int x = 0;
7031
 
7032
  FETCH_DATA (the_info, codep + 2);
7033
  x = *codep++ & 0xff;
7034
  x |= (*codep++ & 0xff) << 8;
7035
  return x;
7036
}
7037
 
7038
static void
7039
set_op (bfd_vma op, int riprel)
7040
{
7041
  op_index[op_ad] = op_ad;
7042
  if (address_mode == mode_64bit)
7043
    {
7044
      op_address[op_ad] = op;
7045
      op_riprel[op_ad] = riprel;
7046
    }
7047
  else
7048
    {
7049
      /* Mask to get a 32-bit address.  */
7050
      op_address[op_ad] = op & 0xffffffff;
7051
      op_riprel[op_ad] = riprel & 0xffffffff;
7052
    }
7053
}
7054
 
7055
static void
7056
OP_REG (int code, int sizeflag)
7057
{
7058
  const char *s;
7059
  int add;
7060
  USED_REX (REX_B);
7061
  if (rex & REX_B)
7062
    add = 8;
7063
  else
7064
    add = 0;
7065
 
7066
  switch (code)
7067
    {
7068
    case ax_reg: case cx_reg: case dx_reg: case bx_reg:
7069
    case sp_reg: case bp_reg: case si_reg: case di_reg:
7070
      s = names16[code - ax_reg + add];
7071
      break;
7072
    case es_reg: case ss_reg: case cs_reg:
7073
    case ds_reg: case fs_reg: case gs_reg:
7074
      s = names_seg[code - es_reg + add];
7075
      break;
7076
    case al_reg: case ah_reg: case cl_reg: case ch_reg:
7077
    case dl_reg: case dh_reg: case bl_reg: case bh_reg:
7078
      USED_REX (0);
7079
      if (rex)
7080
        s = names8rex[code - al_reg + add];
7081
      else
7082
        s = names8[code - al_reg];
7083
      break;
7084
    case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
7085
    case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
7086
      if (address_mode == mode_64bit && (sizeflag & DFLAG))
7087
        {
7088
          s = names64[code - rAX_reg + add];
7089
          break;
7090
        }
7091
      code += eAX_reg - rAX_reg;
7092
      /* Fall through.  */
7093
    case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
7094
    case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
7095
      USED_REX (REX_W);
7096
      if (rex & REX_W)
7097
        s = names64[code - eAX_reg + add];
7098
      else if (sizeflag & DFLAG)
7099
        s = names32[code - eAX_reg + add];
7100
      else
7101
        s = names16[code - eAX_reg + add];
7102
      used_prefixes |= (prefixes & PREFIX_DATA);
7103
      break;
7104
    default:
7105
      s = INTERNAL_DISASSEMBLER_ERROR;
7106
      break;
7107
    }
7108
  oappend (s);
7109
}
7110
 
7111
static void
7112
OP_IMREG (int code, int sizeflag)
7113
{
7114
  const char *s;
7115
 
7116
  switch (code)
7117
    {
7118
    case indir_dx_reg:
7119
      if (intel_syntax)
7120
        s = "dx";
7121
      else
7122
        s = "(%dx)";
7123
      break;
7124
    case ax_reg: case cx_reg: case dx_reg: case bx_reg:
7125
    case sp_reg: case bp_reg: case si_reg: case di_reg:
7126
      s = names16[code - ax_reg];
7127
      break;
7128
    case es_reg: case ss_reg: case cs_reg:
7129
    case ds_reg: case fs_reg: case gs_reg:
7130
      s = names_seg[code - es_reg];
7131
      break;
7132
    case al_reg: case ah_reg: case cl_reg: case ch_reg:
7133
    case dl_reg: case dh_reg: case bl_reg: case bh_reg:
7134
      USED_REX (0);
7135
      if (rex)
7136
        s = names8rex[code - al_reg];
7137
      else
7138
        s = names8[code - al_reg];
7139
      break;
7140
    case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
7141
    case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
7142
      USED_REX (REX_W);
7143
      if (rex & REX_W)
7144
        s = names64[code - eAX_reg];
7145
      else if (sizeflag & DFLAG)
7146
        s = names32[code - eAX_reg];
7147
      else
7148
        s = names16[code - eAX_reg];
7149
      used_prefixes |= (prefixes & PREFIX_DATA);
7150
      break;
7151
    case z_mode_ax_reg:
7152
      if ((rex & REX_W) || (sizeflag & DFLAG))
7153
        s = *names32;
7154
      else
7155
        s = *names16;
7156
      if (!(rex & REX_W))
7157
        used_prefixes |= (prefixes & PREFIX_DATA);
7158
      break;
7159
    default:
7160
      s = INTERNAL_DISASSEMBLER_ERROR;
7161
      break;
7162
    }
7163
  oappend (s);
7164
}
7165
 
7166
static void
7167
OP_I (int bytemode, int sizeflag)
7168
{
7169
  bfd_signed_vma op;
7170
  bfd_signed_vma mask = -1;
7171
 
7172
  switch (bytemode)
7173
    {
7174
    case b_mode:
7175
      FETCH_DATA (the_info, codep + 1);
7176
      op = *codep++;
7177
      mask = 0xff;
7178
      break;
7179
    case q_mode:
7180
      if (address_mode == mode_64bit)
7181
        {
7182
          op = get32s ();
7183
          break;
7184
        }
7185
      /* Fall through.  */
7186
    case v_mode:
7187
      USED_REX (REX_W);
7188
      if (rex & REX_W)
7189
        op = get32s ();
7190
      else if (sizeflag & DFLAG)
7191
        {
7192
          op = get32 ();
7193
          mask = 0xffffffff;
7194
        }
7195
      else
7196
        {
7197
          op = get16 ();
7198
          mask = 0xfffff;
7199
        }
7200
      used_prefixes |= (prefixes & PREFIX_DATA);
7201
      break;
7202
    case w_mode:
7203
      mask = 0xfffff;
7204
      op = get16 ();
7205
      break;
7206
    case const_1_mode:
7207
      if (intel_syntax)
7208
        oappend ("1");
7209
      return;
7210
    default:
7211
      oappend (INTERNAL_DISASSEMBLER_ERROR);
7212
      return;
7213
    }
7214
 
7215
  op &= mask;
7216
  scratchbuf[0] = '$';
7217
  print_operand_value (scratchbuf + 1, 1, op);
7218
  oappend (scratchbuf + intel_syntax);
7219
  scratchbuf[0] = '\0';
7220
}
7221
 
7222
static void
7223
OP_I64 (int bytemode, int sizeflag)
7224
{
7225
  bfd_signed_vma op;
7226
  bfd_signed_vma mask = -1;
7227
 
7228
  if (address_mode != mode_64bit)
7229
    {
7230
      OP_I (bytemode, sizeflag);
7231
      return;
7232
    }
7233
 
7234
  switch (bytemode)
7235
    {
7236
    case b_mode:
7237
      FETCH_DATA (the_info, codep + 1);
7238
      op = *codep++;
7239
      mask = 0xff;
7240
      break;
7241
    case v_mode:
7242
      USED_REX (REX_W);
7243
      if (rex & REX_W)
7244
        op = get64 ();
7245
      else if (sizeflag & DFLAG)
7246
        {
7247
          op = get32 ();
7248
          mask = 0xffffffff;
7249
        }
7250
      else
7251
        {
7252
          op = get16 ();
7253
          mask = 0xfffff;
7254
        }
7255
      used_prefixes |= (prefixes & PREFIX_DATA);
7256
      break;
7257
    case w_mode:
7258
      mask = 0xfffff;
7259
      op = get16 ();
7260
      break;
7261
    default:
7262
      oappend (INTERNAL_DISASSEMBLER_ERROR);
7263
      return;
7264
    }
7265
 
7266
  op &= mask;
7267
  scratchbuf[0] = '$';
7268
  print_operand_value (scratchbuf + 1, 1, op);
7269
  oappend (scratchbuf + intel_syntax);
7270
  scratchbuf[0] = '\0';
7271
}
7272
 
7273
static void
7274
OP_sI (int bytemode, int sizeflag)
7275
{
7276
  bfd_signed_vma op;
7277
  bfd_signed_vma mask = -1;
7278
 
7279
  switch (bytemode)
7280
    {
7281
    case b_mode:
7282
      FETCH_DATA (the_info, codep + 1);
7283
      op = *codep++;
7284
      if ((op & 0x80) != 0)
7285
        op -= 0x100;
7286
      mask = 0xffffffff;
7287
      break;
7288
    case v_mode:
7289
      USED_REX (REX_W);
7290
      if (rex & REX_W)
7291
        op = get32s ();
7292
      else if (sizeflag & DFLAG)
7293
        {
7294
          op = get32s ();
7295
          mask = 0xffffffff;
7296
        }
7297
      else
7298
        {
7299
          mask = 0xffffffff;
7300
          op = get16 ();
7301
          if ((op & 0x8000) != 0)
7302
            op -= 0x10000;
7303
        }
7304
      used_prefixes |= (prefixes & PREFIX_DATA);
7305
      break;
7306
    case w_mode:
7307
      op = get16 ();
7308
      mask = 0xffffffff;
7309
      if ((op & 0x8000) != 0)
7310
        op -= 0x10000;
7311
      break;
7312
    default:
7313
      oappend (INTERNAL_DISASSEMBLER_ERROR);
7314
      return;
7315
    }
7316
 
7317
  scratchbuf[0] = '$';
7318
  print_operand_value (scratchbuf + 1, 1, op);
7319
  oappend (scratchbuf + intel_syntax);
7320
}
7321
 
7322
static void
7323
OP_J (int bytemode, int sizeflag)
7324
{
7325
  bfd_vma disp;
7326
  bfd_vma mask = -1;
7327
  bfd_vma segment = 0;
7328
 
7329
  switch (bytemode)
7330
    {
7331
    case b_mode:
7332
      FETCH_DATA (the_info, codep + 1);
7333
      disp = *codep++;
7334
      if ((disp & 0x80) != 0)
7335
        disp -= 0x100;
7336
      break;
7337
    case v_mode:
7338
      if ((sizeflag & DFLAG) || (rex & REX_W))
7339
        disp = get32s ();
7340
      else
7341
        {
7342
          disp = get16 ();
7343
          if ((disp & 0x8000) != 0)
7344
            disp -= 0x10000;
7345
          /* In 16bit mode, address is wrapped around at 64k within
7346
             the same segment.  Otherwise, a data16 prefix on a jump
7347
             instruction means that the pc is masked to 16 bits after
7348
             the displacement is added!  */
7349
          mask = 0xffff;
7350
          if ((prefixes & PREFIX_DATA) == 0)
7351
            segment = ((start_pc + codep - start_codep)
7352
                       & ~((bfd_vma) 0xffff));
7353
        }
7354
      used_prefixes |= (prefixes & PREFIX_DATA);
7355
      break;
7356
    default:
7357
      oappend (INTERNAL_DISASSEMBLER_ERROR);
7358
      return;
7359
    }
7360
  disp = ((start_pc + codep - start_codep + disp) & mask) | segment;
7361
  set_op (disp, 0);
7362
  print_operand_value (scratchbuf, 1, disp);
7363
  oappend (scratchbuf);
7364
}
7365
 
7366
static void
7367
OP_SEG (int bytemode, int sizeflag)
7368
{
7369
  if (bytemode == w_mode)
7370
    oappend (names_seg[modrm.reg]);
7371
  else
7372
    OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
7373
}
7374
 
7375
static void
7376
OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
7377
{
7378
  int seg, offset;
7379
 
7380
  if (sizeflag & DFLAG)
7381
    {
7382
      offset = get32 ();
7383
      seg = get16 ();
7384
    }
7385
  else
7386
    {
7387
      offset = get16 ();
7388
      seg = get16 ();
7389
    }
7390
  used_prefixes |= (prefixes & PREFIX_DATA);
7391
  if (intel_syntax)
7392
    sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
7393
  else
7394
    sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
7395
  oappend (scratchbuf);
7396
}
7397
 
7398
static void
7399
OP_OFF (int bytemode, int sizeflag)
7400
{
7401
  bfd_vma off;
7402
 
7403
  if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
7404
    intel_operand_size (bytemode, sizeflag);
7405
  append_seg ();
7406
 
7407
  if ((sizeflag & AFLAG) || address_mode == mode_64bit)
7408
    off = get32 ();
7409
  else
7410
    off = get16 ();
7411
 
7412
  if (intel_syntax)
7413
    {
7414
      if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
7415
                        | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
7416
        {
7417
          oappend (names_seg[ds_reg - es_reg]);
7418
          oappend (":");
7419
        }
7420
    }
7421
  print_operand_value (scratchbuf, 1, off);
7422
  oappend (scratchbuf);
7423
}
7424
 
7425
static void
7426
OP_OFF64 (int bytemode, int sizeflag)
7427
{
7428
  bfd_vma off;
7429
 
7430
  if (address_mode != mode_64bit
7431
      || (prefixes & PREFIX_ADDR))
7432
    {
7433
      OP_OFF (bytemode, sizeflag);
7434
      return;
7435
    }
7436
 
7437
  if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
7438
    intel_operand_size (bytemode, sizeflag);
7439
  append_seg ();
7440
 
7441
  off = get64 ();
7442
 
7443
  if (intel_syntax)
7444
    {
7445
      if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
7446
                        | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
7447
        {
7448
          oappend (names_seg[ds_reg - es_reg]);
7449
          oappend (":");
7450
        }
7451
    }
7452
  print_operand_value (scratchbuf, 1, off);
7453
  oappend (scratchbuf);
7454
}
7455
 
7456
static void
7457
ptr_reg (int code, int sizeflag)
7458
{
7459
  const char *s;
7460
 
7461
  *obufp++ = open_char;
7462
  used_prefixes |= (prefixes & PREFIX_ADDR);
7463
  if (address_mode == mode_64bit)
7464
    {
7465
      if (!(sizeflag & AFLAG))
7466
        s = names32[code - eAX_reg];
7467
      else
7468
        s = names64[code - eAX_reg];
7469
    }
7470
  else if (sizeflag & AFLAG)
7471
    s = names32[code - eAX_reg];
7472
  else
7473
    s = names16[code - eAX_reg];
7474
  oappend (s);
7475
  *obufp++ = close_char;
7476
  *obufp = 0;
7477
}
7478
 
7479
static void
7480
OP_ESreg (int code, int sizeflag)
7481
{
7482
  if (intel_syntax)
7483
    {
7484
      switch (codep[-1])
7485
        {
7486
        case 0x6d:      /* insw/insl */
7487
          intel_operand_size (z_mode, sizeflag);
7488
          break;
7489
        case 0xa5:      /* movsw/movsl/movsq */
7490
        case 0xa7:      /* cmpsw/cmpsl/cmpsq */
7491
        case 0xab:      /* stosw/stosl */
7492
        case 0xaf:      /* scasw/scasl */
7493
          intel_operand_size (v_mode, sizeflag);
7494
          break;
7495
        default:
7496
          intel_operand_size (b_mode, sizeflag);
7497
        }
7498
    }
7499
  oappend ("%es:" + intel_syntax);
7500
  ptr_reg (code, sizeflag);
7501
}
7502
 
7503
static void
7504
OP_DSreg (int code, int sizeflag)
7505
{
7506
  if (intel_syntax)
7507
    {
7508
      switch (codep[-1])
7509
        {
7510
        case 0x6f:      /* outsw/outsl */
7511
          intel_operand_size (z_mode, sizeflag);
7512
          break;
7513
        case 0xa5:      /* movsw/movsl/movsq */
7514
        case 0xa7:      /* cmpsw/cmpsl/cmpsq */
7515
        case 0xad:      /* lodsw/lodsl/lodsq */
7516
          intel_operand_size (v_mode, sizeflag);
7517
          break;
7518
        default:
7519
          intel_operand_size (b_mode, sizeflag);
7520
        }
7521
    }
7522
  if ((prefixes
7523
       & (PREFIX_CS
7524
          | PREFIX_DS
7525
          | PREFIX_SS
7526
          | PREFIX_ES
7527
          | PREFIX_FS
7528
          | PREFIX_GS)) == 0)
7529
    prefixes |= PREFIX_DS;
7530
  append_seg ();
7531
  ptr_reg (code, sizeflag);
7532
}
7533
 
7534
static void
7535
OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
7536
{
7537
  int add;
7538
  if (rex & REX_R)
7539
    {
7540
      USED_REX (REX_R);
7541
      add = 8;
7542
    }
7543
  else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
7544
    {
7545
      lock_prefix = NULL;
7546
      used_prefixes |= PREFIX_LOCK;
7547
      add = 8;
7548
    }
7549
  else
7550
    add = 0;
7551
  sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
7552
  oappend (scratchbuf + intel_syntax);
7553
}
7554
 
7555
static void
7556
OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
7557
{
7558
  int add;
7559
  USED_REX (REX_R);
7560
  if (rex & REX_R)
7561
    add = 8;
7562
  else
7563
    add = 0;
7564
  if (intel_syntax)
7565
    sprintf (scratchbuf, "db%d", modrm.reg + add);
7566
  else
7567
    sprintf (scratchbuf, "%%db%d", modrm.reg + add);
7568
  oappend (scratchbuf);
7569
}
7570
 
7571
static void
7572
OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
7573
{
7574
  sprintf (scratchbuf, "%%tr%d", modrm.reg);
7575
  oappend (scratchbuf + intel_syntax);
7576
}
7577
 
7578
static void
7579
OP_R (int bytemode, int sizeflag)
7580
{
7581
  if (modrm.mod == 3)
7582
    OP_E (bytemode, sizeflag);
7583
  else
7584
    BadOp ();
7585
}
7586
 
7587
static void
7588
OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
7589
{
7590
  used_prefixes |= (prefixes & PREFIX_DATA);
7591
  if (prefixes & PREFIX_DATA)
7592
    {
7593
      int add;
7594
      USED_REX (REX_R);
7595
      if (rex & REX_R)
7596
        add = 8;
7597
      else
7598
        add = 0;
7599
      sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
7600
    }
7601
  else
7602
    sprintf (scratchbuf, "%%mm%d", modrm.reg);
7603
  oappend (scratchbuf + intel_syntax);
7604
}
7605
 
7606
static void
7607
OP_XMM (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
7608
{
7609
  int add;
7610
  USED_REX (REX_R);
7611
  if (rex & REX_R)
7612
    add = 8;
7613
  else
7614
    add = 0;
7615
  sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
7616
  oappend (scratchbuf + intel_syntax);
7617
}
7618
 
7619
static void
7620
OP_EM (int bytemode, int sizeflag)
7621
{
7622
  if (modrm.mod != 3)
7623
    {
7624
      if (intel_syntax && bytemode == v_mode)
7625
        {
7626
          bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
7627
          used_prefixes |= (prefixes & PREFIX_DATA);
7628
        }
7629
      OP_E (bytemode, sizeflag);
7630
      return;
7631
    }
7632
 
7633
  /* Skip mod/rm byte.  */
7634
  MODRM_CHECK;
7635
  codep++;
7636
  used_prefixes |= (prefixes & PREFIX_DATA);
7637
  if (prefixes & PREFIX_DATA)
7638
    {
7639
      int add;
7640
 
7641
      USED_REX (REX_B);
7642
      if (rex & REX_B)
7643
        add = 8;
7644
      else
7645
        add = 0;
7646
      sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
7647
    }
7648
  else
7649
    sprintf (scratchbuf, "%%mm%d", modrm.rm);
7650
  oappend (scratchbuf + intel_syntax);
7651
}
7652
 
7653
/* cvt* are the only instructions in sse2 which have
7654
   both SSE and MMX operands and also have 0x66 prefix
7655
   in their opcode. 0x66 was originally used to differentiate
7656
   between SSE and MMX instruction(operands). So we have to handle the
7657
   cvt* separately using OP_EMC and OP_MXC */
7658
static void
7659
OP_EMC (int bytemode, int sizeflag)
7660
{
7661
  if (modrm.mod != 3)
7662
    {
7663
      if (intel_syntax && bytemode == v_mode)
7664
        {
7665
          bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
7666
          used_prefixes |= (prefixes & PREFIX_DATA);
7667
        }
7668
      OP_E (bytemode, sizeflag);
7669
      return;
7670
    }
7671
 
7672
  /* Skip mod/rm byte.  */
7673
  MODRM_CHECK;
7674
  codep++;
7675
  used_prefixes |= (prefixes & PREFIX_DATA);
7676
  sprintf (scratchbuf, "%%mm%d", modrm.rm);
7677
  oappend (scratchbuf + intel_syntax);
7678
}
7679
 
7680
static void
7681
OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
7682
{
7683
  used_prefixes |= (prefixes & PREFIX_DATA);
7684
  sprintf (scratchbuf, "%%mm%d", modrm.reg);
7685
  oappend (scratchbuf + intel_syntax);
7686
}
7687
 
7688
static void
7689
OP_EX (int bytemode, int sizeflag)
7690
{
7691
  int add;
7692
  if (modrm.mod != 3)
7693
    {
7694
      OP_E (bytemode, sizeflag);
7695
      return;
7696
    }
7697
  USED_REX (REX_B);
7698
  if (rex & REX_B)
7699
    add = 8;
7700
  else
7701
    add = 0;
7702
 
7703
  /* Skip mod/rm byte.  */
7704
  MODRM_CHECK;
7705
  codep++;
7706
  sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
7707
  oappend (scratchbuf + intel_syntax);
7708
}
7709
 
7710
static void
7711
OP_MS (int bytemode, int sizeflag)
7712
{
7713
  if (modrm.mod == 3)
7714
    OP_EM (bytemode, sizeflag);
7715
  else
7716
    BadOp ();
7717
}
7718
 
7719
static void
7720
OP_XS (int bytemode, int sizeflag)
7721
{
7722
  if (modrm.mod == 3)
7723
    OP_EX (bytemode, sizeflag);
7724
  else
7725
    BadOp ();
7726
}
7727
 
7728
static void
7729
OP_M (int bytemode, int sizeflag)
7730
{
7731
  if (modrm.mod == 3)
7732
    /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
7733
    BadOp ();
7734
  else
7735
    OP_E (bytemode, sizeflag);
7736
}
7737
 
7738
static void
7739
OP_0f07 (int bytemode, int sizeflag)
7740
{
7741
  if (modrm.mod != 3 || modrm.rm != 0)
7742
    BadOp ();
7743
  else
7744
    OP_E (bytemode, sizeflag);
7745
}
7746
 
7747
/* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
7748
   32bit mode and "xchg %rax,%rax" in 64bit mode.  */
7749
 
7750
static void
7751
NOP_Fixup1 (int bytemode, int sizeflag)
7752
{
7753
  if ((prefixes & PREFIX_DATA) != 0
7754
      || (rex != 0
7755
          && rex != 0x48
7756
          && address_mode == mode_64bit))
7757
    OP_REG (bytemode, sizeflag);
7758
  else
7759
    strcpy (obuf, "nop");
7760
}
7761
 
7762
static void
7763
NOP_Fixup2 (int bytemode, int sizeflag)
7764
{
7765
  if ((prefixes & PREFIX_DATA) != 0
7766
      || (rex != 0
7767
          && rex != 0x48
7768
          && address_mode == mode_64bit))
7769
    OP_IMREG (bytemode, sizeflag);
7770
}
7771
 
7772
static const char *const Suffix3DNow[] = {
7773
/* 00 */        NULL,           NULL,           NULL,           NULL,
7774
/* 04 */        NULL,           NULL,           NULL,           NULL,
7775
/* 08 */        NULL,           NULL,           NULL,           NULL,
7776
/* 0C */        "pi2fw",        "pi2fd",        NULL,           NULL,
7777
/* 10 */        NULL,           NULL,           NULL,           NULL,
7778
/* 14 */        NULL,           NULL,           NULL,           NULL,
7779
/* 18 */        NULL,           NULL,           NULL,           NULL,
7780
/* 1C */        "pf2iw",        "pf2id",        NULL,           NULL,
7781
/* 20 */        NULL,           NULL,           NULL,           NULL,
7782
/* 24 */        NULL,           NULL,           NULL,           NULL,
7783
/* 28 */        NULL,           NULL,           NULL,           NULL,
7784
/* 2C */        NULL,           NULL,           NULL,           NULL,
7785
/* 30 */        NULL,           NULL,           NULL,           NULL,
7786
/* 34 */        NULL,           NULL,           NULL,           NULL,
7787
/* 38 */        NULL,           NULL,           NULL,           NULL,
7788
/* 3C */        NULL,           NULL,           NULL,           NULL,
7789
/* 40 */        NULL,           NULL,           NULL,           NULL,
7790
/* 44 */        NULL,           NULL,           NULL,           NULL,
7791
/* 48 */        NULL,           NULL,           NULL,           NULL,
7792
/* 4C */        NULL,           NULL,           NULL,           NULL,
7793
/* 50 */        NULL,           NULL,           NULL,           NULL,
7794
/* 54 */        NULL,           NULL,           NULL,           NULL,
7795
/* 58 */        NULL,           NULL,           NULL,           NULL,
7796
/* 5C */        NULL,           NULL,           NULL,           NULL,
7797
/* 60 */        NULL,           NULL,           NULL,           NULL,
7798
/* 64 */        NULL,           NULL,           NULL,           NULL,
7799
/* 68 */        NULL,           NULL,           NULL,           NULL,
7800
/* 6C */        NULL,           NULL,           NULL,           NULL,
7801
/* 70 */        NULL,           NULL,           NULL,           NULL,
7802
/* 74 */        NULL,           NULL,           NULL,           NULL,
7803
/* 78 */        NULL,           NULL,           NULL,           NULL,
7804
/* 7C */        NULL,           NULL,           NULL,           NULL,
7805
/* 80 */        NULL,           NULL,           NULL,           NULL,
7806
/* 84 */        NULL,           NULL,           NULL,           NULL,
7807
/* 88 */        NULL,           NULL,           "pfnacc",       NULL,
7808
/* 8C */        NULL,           NULL,           "pfpnacc",      NULL,
7809
/* 90 */        "pfcmpge",      NULL,           NULL,           NULL,
7810
/* 94 */        "pfmin",        NULL,           "pfrcp",        "pfrsqrt",
7811
/* 98 */        NULL,           NULL,           "pfsub",        NULL,
7812
/* 9C */        NULL,           NULL,           "pfadd",        NULL,
7813
/* A0 */        "pfcmpgt",      NULL,           NULL,           NULL,
7814
/* A4 */        "pfmax",        NULL,           "pfrcpit1",     "pfrsqit1",
7815
/* A8 */        NULL,           NULL,           "pfsubr",       NULL,
7816
/* AC */        NULL,           NULL,           "pfacc",        NULL,
7817
/* B0 */        "pfcmpeq",      NULL,           NULL,           NULL,
7818
/* B4 */        "pfmul",        NULL,           "pfrcpit2",     "pmulhrw",
7819
/* B8 */        NULL,           NULL,           NULL,           "pswapd",
7820
/* BC */        NULL,           NULL,           NULL,           "pavgusb",
7821
/* C0 */        NULL,           NULL,           NULL,           NULL,
7822
/* C4 */        NULL,           NULL,           NULL,           NULL,
7823
/* C8 */        NULL,           NULL,           NULL,           NULL,
7824
/* CC */        NULL,           NULL,           NULL,           NULL,
7825
/* D0 */        NULL,           NULL,           NULL,           NULL,
7826
/* D4 */        NULL,           NULL,           NULL,           NULL,
7827
/* D8 */        NULL,           NULL,           NULL,           NULL,
7828
/* DC */        NULL,           NULL,           NULL,           NULL,
7829
/* E0 */        NULL,           NULL,           NULL,           NULL,
7830
/* E4 */        NULL,           NULL,           NULL,           NULL,
7831
/* E8 */        NULL,           NULL,           NULL,           NULL,
7832
/* EC */        NULL,           NULL,           NULL,           NULL,
7833
/* F0 */        NULL,           NULL,           NULL,           NULL,
7834
/* F4 */        NULL,           NULL,           NULL,           NULL,
7835
/* F8 */        NULL,           NULL,           NULL,           NULL,
7836
/* FC */        NULL,           NULL,           NULL,           NULL,
7837
};
7838
 
7839
static void
7840
OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
7841
{
7842
  const char *mnemonic;
7843
 
7844
  FETCH_DATA (the_info, codep + 1);
7845
  /* AMD 3DNow! instructions are specified by an opcode suffix in the
7846
     place where an 8-bit immediate would normally go.  ie. the last
7847
     byte of the instruction.  */
7848
  obufp = obuf + strlen (obuf);
7849
  mnemonic = Suffix3DNow[*codep++ & 0xff];
7850
  if (mnemonic)
7851
    oappend (mnemonic);
7852
  else
7853
    {
7854
      /* Since a variable sized modrm/sib chunk is between the start
7855
         of the opcode (0x0f0f) and the opcode suffix, we need to do
7856
         all the modrm processing first, and don't know until now that
7857
         we have a bad opcode.  This necessitates some cleaning up.  */
7858
      op_out[0][0] = '\0';
7859
      op_out[1][0] = '\0';
7860
      BadOp ();
7861
    }
7862
}
7863
 
7864
static const char *simd_cmp_op[] = {
7865
  "eq",
7866
  "lt",
7867
  "le",
7868
  "unord",
7869
  "neq",
7870
  "nlt",
7871
  "nle",
7872
  "ord"
7873
};
7874
 
7875
static void
7876
CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
7877
{
7878
  unsigned int cmp_type;
7879
 
7880
  FETCH_DATA (the_info, codep + 1);
7881
  cmp_type = *codep++ & 0xff;
7882
  if (cmp_type < 8)
7883
    {
7884
      char suffix [3];
7885
      char *p = obuf + strlen (obuf) - 2;
7886
      suffix[0] = p[0];
7887
      suffix[1] = p[1];
7888
      suffix[2] = '\0';
7889
      sprintf (p, "%s%s", simd_cmp_op[cmp_type], suffix);
7890
    }
7891
  else
7892
    {
7893
      /* We have a reserved extension byte.  Output it directly.  */
7894
      scratchbuf[0] = '$';
7895
      print_operand_value (scratchbuf + 1, 1, cmp_type);
7896
      oappend (scratchbuf + intel_syntax);
7897
      scratchbuf[0] = '\0';
7898
    }
7899
}
7900
 
7901
static void
7902
OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
7903
          int sizeflag ATTRIBUTE_UNUSED)
7904
{
7905
  /* mwait %eax,%ecx  */
7906
  if (!intel_syntax)
7907
    {
7908
      const char **names = (address_mode == mode_64bit
7909
                            ? names64 : names32);
7910
      strcpy (op_out[0], names[0]);
7911
      strcpy (op_out[1], names[1]);
7912
      two_source_ops = 1;
7913
    }
7914
  /* Skip mod/rm byte.  */
7915
  MODRM_CHECK;
7916
  codep++;
7917
}
7918
 
7919
static void
7920
OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
7921
            int sizeflag ATTRIBUTE_UNUSED)
7922
{
7923
  /* monitor %eax,%ecx,%edx"  */
7924
  if (!intel_syntax)
7925
    {
7926
      const char **op1_names;
7927
      const char **names = (address_mode == mode_64bit
7928
                            ? names64 : names32);
7929
 
7930
      if (!(prefixes & PREFIX_ADDR))
7931
        op1_names = (address_mode == mode_16bit
7932
                     ? names16 : names);
7933
      else
7934
        {
7935
          /* Remove "addr16/addr32".  */
7936
          addr_prefix = NULL;
7937
          op1_names = (address_mode != mode_32bit
7938
                       ? names32 : names16);
7939
          used_prefixes |= PREFIX_ADDR;
7940
        }
7941
      strcpy (op_out[0], op1_names[0]);
7942
      strcpy (op_out[1], names[1]);
7943
      strcpy (op_out[2], names[2]);
7944
      two_source_ops = 1;
7945
    }
7946
  /* Skip mod/rm byte.  */
7947
  MODRM_CHECK;
7948
  codep++;
7949
}
7950
 
7951
static void
7952
BadOp (void)
7953
{
7954
  /* Throw away prefixes and 1st. opcode byte.  */
7955
  codep = insn_codep + 1;
7956
  oappend ("(bad)");
7957
}
7958
 
7959
static void
7960
REP_Fixup (int bytemode, int sizeflag)
7961
{
7962
  /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
7963
     lods and stos.  */
7964
  if (prefixes & PREFIX_REPZ)
7965
    repz_prefix = "rep ";
7966
 
7967
  switch (bytemode)
7968
    {
7969
    case al_reg:
7970
    case eAX_reg:
7971
    case indir_dx_reg:
7972
      OP_IMREG (bytemode, sizeflag);
7973
      break;
7974
    case eDI_reg:
7975
      OP_ESreg (bytemode, sizeflag);
7976
      break;
7977
    case eSI_reg:
7978
      OP_DSreg (bytemode, sizeflag);
7979
      break;
7980
    default:
7981
      abort ();
7982
      break;
7983
    }
7984
}
7985
 
7986
static void
7987
CMPXCHG8B_Fixup (int bytemode, int sizeflag)
7988
{
7989
  USED_REX (REX_W);
7990
  if (rex & REX_W)
7991
    {
7992
      /* Change cmpxchg8b to cmpxchg16b.  */
7993
      char *p = obuf + strlen (obuf) - 2;
7994
      strcpy (p, "16b");
7995
      bytemode = o_mode;
7996
    }
7997
  OP_M (bytemode, sizeflag);
7998
}
7999
 
8000
static void
8001
XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
8002
{
8003
  sprintf (scratchbuf, "%%xmm%d", reg);
8004
  oappend (scratchbuf + intel_syntax);
8005
}
8006
 
8007
static void
8008
CRC32_Fixup (int bytemode, int sizeflag)
8009
{
8010
  /* Add proper suffix to "crc32".  */
8011
  char *p = obuf + strlen (obuf);
8012
 
8013
  switch (bytemode)
8014
    {
8015
    case b_mode:
8016
      if (intel_syntax)
8017
        break;
8018
 
8019
      *p++ = 'b';
8020
      break;
8021
    case v_mode:
8022
      if (intel_syntax)
8023
        break;
8024
 
8025
      USED_REX (REX_W);
8026
      if (rex & REX_W)
8027
        *p++ = 'q';
8028
      else if (sizeflag & DFLAG)
8029
        *p++ = 'l';
8030
      else
8031
        *p++ = 'w';
8032
      used_prefixes |= (prefixes & PREFIX_DATA);
8033
      break;
8034
    default:
8035
      oappend (INTERNAL_DISASSEMBLER_ERROR);
8036
      break;
8037
    }
8038
  *p = '\0';
8039
 
8040
  if (modrm.mod == 3)
8041
    {
8042
      int add;
8043
 
8044
      /* Skip mod/rm byte.  */
8045
      MODRM_CHECK;
8046
      codep++;
8047
 
8048
      USED_REX (REX_B);
8049
      add = (rex & REX_B) ? 8 : 0;
8050
      if (bytemode == b_mode)
8051
        {
8052
          USED_REX (0);
8053
          if (rex)
8054
            oappend (names8rex[modrm.rm + add]);
8055
          else
8056
            oappend (names8[modrm.rm + add]);
8057
        }
8058
      else
8059
        {
8060
          USED_REX (REX_W);
8061
          if (rex & REX_W)
8062
            oappend (names64[modrm.rm + add]);
8063
          else if ((prefixes & PREFIX_DATA))
8064
            oappend (names16[modrm.rm + add]);
8065
          else
8066
            oappend (names32[modrm.rm + add]);
8067
        }
8068
    }
8069
  else
8070
    OP_E (bytemode, sizeflag);
8071
}
8072
 
8073
/* Print a DREX argument as either a register or memory operation.  */
8074
static void
8075
print_drex_arg (unsigned int reg, int bytemode, int sizeflag)
8076
{
8077
  if (reg == DREX_REG_UNKNOWN)
8078
    BadOp ();
8079
 
8080
  else if (reg != DREX_REG_MEMORY)
8081
    {
8082
      sprintf (scratchbuf, "%%xmm%d", reg);
8083
      oappend (scratchbuf + intel_syntax);
8084
    }
8085
 
8086
  else
8087
    OP_E_extended (bytemode, sizeflag, 1);
8088
}
8089
 
8090
/* SSE5 instructions that have 4 arguments are encoded as:
8091
   0f 24 <sub-opcode> <modrm> <optional-sib> <drex> <offset>.
8092
 
8093
   The <sub-opcode> byte has 1 bit (0x4) that is combined with 1 bit in
8094
   the DREX field (0x8) to determine how the arguments are laid out.
8095
   The destination register must be the same register as one of the
8096
   inputs, and it is encoded in the DREX byte.  No REX prefix is used
8097
   for these instructions, since the DREX field contains the 3 extension
8098
   bits provided by the REX prefix.
8099
 
8100
   The bytemode argument adds 2 extra bits for passing extra information:
8101
        DREX_OC1        -- Set the OC1 bit to indicate dest == 1st arg
8102
        DREX_NO_OC0     -- OC0 in DREX is invalid
8103
        (but pretend it is set).  */
8104
 
8105
static void
8106
OP_DREX4 (int flag_bytemode, int sizeflag)
8107
{
8108
  unsigned int drex_byte;
8109
  unsigned int regs[4];
8110
  unsigned int modrm_regmem;
8111
  unsigned int modrm_reg;
8112
  unsigned int drex_reg;
8113
  int bytemode;
8114
  int rex_save = rex;
8115
  int rex_used_save = rex_used;
8116
  int has_sib = 0;
8117
  int oc1 = (flag_bytemode & DREX_OC1) ? 2 : 0;
8118
  int oc0;
8119
  int i;
8120
 
8121
  bytemode = flag_bytemode & ~ DREX_MASK;
8122
 
8123
  for (i = 0; i < 4; i++)
8124
    regs[i] = DREX_REG_UNKNOWN;
8125
 
8126
  /* Determine if we have a SIB byte in addition to MODRM before the
8127
     DREX byte.  */
8128
  if (((sizeflag & AFLAG) || address_mode == mode_64bit)
8129
      && (modrm.mod != 3)
8130
      && (modrm.rm == 4))
8131
    has_sib = 1;
8132
 
8133
  /* Get the DREX byte.  */
8134
  FETCH_DATA (the_info, codep + 2 + has_sib);
8135
  drex_byte = codep[has_sib+1];
8136
  drex_reg = DREX_XMM (drex_byte);
8137
  modrm_reg = modrm.reg + ((drex_byte & REX_R) ? 8 : 0);
8138
 
8139
  /* Is OC0 legal?  If not, hardwire oc0 == 1.  */
8140
  if (flag_bytemode & DREX_NO_OC0)
8141
    {
8142
      oc0 = 1;
8143
      if (DREX_OC0 (drex_byte))
8144
        BadOp ();
8145
    }
8146
  else
8147
    oc0 = DREX_OC0 (drex_byte);
8148
 
8149
  if (modrm.mod == 3)
8150
    {
8151
      /* regmem == register  */
8152
      modrm_regmem = modrm.rm + ((drex_byte & REX_B) ? 8 : 0);
8153
      rex = rex_used = 0;
8154
      /* skip modrm/drex since we don't call OP_E_extended  */
8155
      codep += 2;
8156
    }
8157
  else
8158
    {
8159
      /* regmem == memory, fill in appropriate REX bits  */
8160
      modrm_regmem = DREX_REG_MEMORY;
8161
      rex = drex_byte & (REX_B | REX_X | REX_R);
8162
      if (rex)
8163
        rex |= REX_OPCODE;
8164
      rex_used = rex;
8165
    }
8166
 
8167
  /* Based on the OC1/OC0 bits, lay out the arguments in the correct
8168
     order.  */
8169
  switch (oc0 + oc1)
8170
    {
8171
    default:
8172
      BadOp ();
8173
      return;
8174
 
8175
    case 0:
8176
      regs[0] = modrm_regmem;
8177
      regs[1] = modrm_reg;
8178
      regs[2] = drex_reg;
8179
      regs[3] = drex_reg;
8180
      break;
8181
 
8182
    case 1:
8183
      regs[0] = modrm_reg;
8184
      regs[1] = modrm_regmem;
8185
      regs[2] = drex_reg;
8186
      regs[3] = drex_reg;
8187
      break;
8188
 
8189
    case 2:
8190
      regs[0] = drex_reg;
8191
      regs[1] = modrm_regmem;
8192
      regs[2] = modrm_reg;
8193
      regs[3] = drex_reg;
8194
      break;
8195
 
8196
    case 3:
8197
      regs[0] = drex_reg;
8198
      regs[1] = modrm_reg;
8199
      regs[2] = modrm_regmem;
8200
      regs[3] = drex_reg;
8201
      break;
8202
    }
8203
 
8204
  /* Print out the arguments.  */
8205
  for (i = 0; i < 4; i++)
8206
    {
8207
      int j = (intel_syntax) ? 3 - i : i;
8208
      if (i > 0)
8209
        {
8210
          *obufp++ = ',';
8211
          *obufp = '\0';
8212
        }
8213
 
8214
      print_drex_arg (regs[j], bytemode, sizeflag);
8215
    }
8216
 
8217
  rex = rex_save;
8218
  rex_used = rex_used_save;
8219
}
8220
 
8221
/* SSE5 instructions that have 3 arguments, and are encoded as:
8222
   0f 24 <sub-opcode> <modrm> <optional-sib> <drex> <offset>    (or)
8223
   0f 25 <sub-opcode> <modrm> <optional-sib> <drex> <offset> <cmp-byte>
8224
 
8225
   The DREX field has 1 bit (0x8) to determine how the arguments are
8226
   laid out. The destination register is encoded in the DREX byte.
8227
   No REX prefix is used for these instructions, since the DREX field
8228
   contains the 3 extension bits provided by the REX prefix.  */
8229
 
8230
static void
8231
OP_DREX3 (int flag_bytemode, int sizeflag)
8232
{
8233
  unsigned int drex_byte;
8234
  unsigned int regs[3];
8235
  unsigned int modrm_regmem;
8236
  unsigned int modrm_reg;
8237
  unsigned int drex_reg;
8238
  int bytemode;
8239
  int rex_save = rex;
8240
  int rex_used_save = rex_used;
8241
  int has_sib = 0;
8242
  int oc0;
8243
  int i;
8244
 
8245
  bytemode = flag_bytemode & ~ DREX_MASK;
8246
 
8247
  for (i = 0; i < 3; i++)
8248
    regs[i] = DREX_REG_UNKNOWN;
8249
 
8250
  /* Determine if we have a SIB byte in addition to MODRM before the
8251
     DREX byte.  */
8252
  if (((sizeflag & AFLAG) || address_mode == mode_64bit)
8253
      && (modrm.mod != 3)
8254
      && (modrm.rm == 4))
8255
    has_sib = 1;
8256
 
8257
  /* Get the DREX byte.  */
8258
  FETCH_DATA (the_info, codep + 2 + has_sib);
8259
  drex_byte = codep[has_sib+1];
8260
  drex_reg = DREX_XMM (drex_byte);
8261
  modrm_reg = modrm.reg + ((drex_byte & REX_R) ? 8 : 0);
8262
 
8263
  /* Is OC0 legal?  If not, hardwire oc0 == 0 */
8264
  oc0 = DREX_OC0 (drex_byte);
8265
  if ((flag_bytemode & DREX_NO_OC0) && oc0)
8266
    BadOp ();
8267
 
8268
  if (modrm.mod == 3)
8269
    {
8270
      /* regmem == register */
8271
      modrm_regmem = modrm.rm + ((drex_byte & REX_B) ? 8 : 0);
8272
      rex = rex_used = 0;
8273
      /* skip modrm/drex since we don't call OP_E_extended.  */
8274
      codep += 2;
8275
    }
8276
  else
8277
    {
8278
      /* regmem == memory, fill in appropriate REX bits.  */
8279
      modrm_regmem = DREX_REG_MEMORY;
8280
      rex = drex_byte & (REX_B | REX_X | REX_R);
8281
      if (rex)
8282
        rex |= REX_OPCODE;
8283
      rex_used = rex;
8284
    }
8285
 
8286
  /* Based on the OC1/OC0 bits, lay out the arguments in the correct
8287
     order.  */
8288
  switch (oc0)
8289
    {
8290
    default:
8291
      BadOp ();
8292
      return;
8293
 
8294
    case 0:
8295
      regs[0] = modrm_regmem;
8296
      regs[1] = modrm_reg;
8297
      regs[2] = drex_reg;
8298
      break;
8299
 
8300
    case 1:
8301
      regs[0] = modrm_reg;
8302
      regs[1] = modrm_regmem;
8303
      regs[2] = drex_reg;
8304
      break;
8305
    }
8306
 
8307
  /* Print out the arguments.  */
8308
  for (i = 0; i < 3; i++)
8309
    {
8310
      int j = (intel_syntax) ? 2 - i : i;
8311
      if (i > 0)
8312
        {
8313
          *obufp++ = ',';
8314
          *obufp = '\0';
8315
        }
8316
 
8317
      print_drex_arg (regs[j], bytemode, sizeflag);
8318
    }
8319
 
8320
  rex = rex_save;
8321
  rex_used = rex_used_save;
8322
}
8323
 
8324
/* Emit a floating point comparison for comp<xx> instructions.  */
8325
 
8326
static void
8327
OP_DREX_FCMP (int bytemode ATTRIBUTE_UNUSED,
8328
              int sizeflag ATTRIBUTE_UNUSED)
8329
{
8330
  unsigned char byte;
8331
 
8332
  static const char *const cmp_test[] = {
8333
    "eq",
8334
    "lt",
8335
    "le",
8336
    "unord",
8337
    "ne",
8338
    "nlt",
8339
    "nle",
8340
    "ord",
8341
    "ueq",
8342
    "ult",
8343
    "ule",
8344
    "false",
8345
    "une",
8346
    "unlt",
8347
    "unle",
8348
    "true"
8349
  };
8350
 
8351
  FETCH_DATA (the_info, codep + 1);
8352
  byte = *codep & 0xff;
8353
 
8354
  if (byte >= ARRAY_SIZE (cmp_test)
8355
      || obuf[0] != 'c'
8356
      || obuf[1] != 'o'
8357
      || obuf[2] != 'm')
8358
    {
8359
      /* The instruction isn't one we know about, so just append the
8360
         extension byte as a numeric value.  */
8361
      OP_I (b_mode, 0);
8362
    }
8363
 
8364
  else
8365
    {
8366
      sprintf (scratchbuf, "com%s%s", cmp_test[byte], obuf+3);
8367
      strcpy (obuf, scratchbuf);
8368
      codep++;
8369
    }
8370
}
8371
 
8372
/* Emit an integer point comparison for pcom<xx> instructions,
8373
   rewriting the instruction to have the test inside of it.  */
8374
 
8375
static void
8376
OP_DREX_ICMP (int bytemode ATTRIBUTE_UNUSED,
8377
              int sizeflag ATTRIBUTE_UNUSED)
8378
{
8379
  unsigned char byte;
8380
 
8381
  static const char *const cmp_test[] = {
8382
    "lt",
8383
    "le",
8384
    "gt",
8385
    "ge",
8386
    "eq",
8387
    "ne",
8388
    "false",
8389
    "true"
8390
  };
8391
 
8392
  FETCH_DATA (the_info, codep + 1);
8393
  byte = *codep & 0xff;
8394
 
8395
  if (byte >= ARRAY_SIZE (cmp_test)
8396
      || obuf[0] != 'p'
8397
      || obuf[1] != 'c'
8398
      || obuf[2] != 'o'
8399
      || obuf[3] != 'm')
8400
    {
8401
      /* The instruction isn't one we know about, so just print the
8402
         comparison test byte as a numeric value.  */
8403
      OP_I (b_mode, 0);
8404
    }
8405
 
8406
  else
8407
    {
8408
      sprintf (scratchbuf, "pcom%s%s", cmp_test[byte], obuf+4);
8409
      strcpy (obuf, scratchbuf);
8410
      codep++;
8411
    }
8412
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.