Statistics
| Branch: | Revision:

root / i386-dis.c @ 7ed208c4

History | View | Annotate | Download (159.1 kB)

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

6
   This file is part of GDB.
7

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

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

18
   You should have received a copy of the GNU General Public License
19
   along with this program; if not, see <http://www.gnu.org/licenses/>. */
20

    
21
/* 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu)
22
   July 1988
23
    modified by John Hassey (hassey@dg-rtp.dg.com)
24
    x86-64 support added by Jan Hubicka (jh@suse.cz)
25
    VIA PadLock support by Michal Ludvig (mludvig@suse.cz).  */
26

    
27
/* The main tables describing the instructions is essentially a copy
28
   of the "Opcode Map" chapter (Appendix A) of the Intel 80386
29
   Programmers Manual.  Usually, there is a capital letter, followed
30
   by a small letter.  The capital letter tell the addressing mode,
31
   and the small letter tells about the operand size.  Refer to
32
   the Intel manual for details.  */
33

    
34
#include <stdlib.h>
35
#include "dis-asm.h"
36
/* include/opcode/i386.h r1.78 */
37

    
38
/* opcode/i386.h -- Intel 80386 opcode macros
39
   Copyright 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
40
   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
41
   Free Software Foundation, Inc.
42

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

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

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

55
   You should have received a copy of the GNU General Public License
56
   along with this program; if not, see <http://www.gnu.org/licenses/>.  */
57

    
58
/* The SystemV/386 SVR3.2 assembler, and probably all AT&T derived
59
   ix86 Unix assemblers, generate floating point instructions with
60
   reversed source and destination registers in certain cases.
61
   Unfortunately, gcc and possibly many other programs use this
62
   reversed syntax, so we're stuck with it.
63

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

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

72
   The affected opcode map is dceX, dcfX, deeX, defX.  */
73

    
74
#ifndef SYSV386_COMPAT
75
/* Set non-zero for broken, compatible instructions.  Set to zero for
76
   non-broken opcodes at your peril.  gcc generates SystemV/386
77
   compatible instructions.  */
78
#define SYSV386_COMPAT 1
79
#endif
80
#ifndef OLDGCC_COMPAT
81
/* Set non-zero to cater for old (<= 2.8.1) versions of gcc that could
82
   generate nonsense fsubp, fsubrp, fdivp and fdivrp with operands
83
   reversed.  */
84
#define OLDGCC_COMPAT SYSV386_COMPAT
85
#endif
86

    
87
#define MOV_AX_DISP32 0xa0
88
#define POP_SEG_SHORT 0x07
89
#define JUMP_PC_RELATIVE 0xeb
90
#define INT_OPCODE  0xcd
91
#define INT3_OPCODE 0xcc
92
/* The opcode for the fwait instruction, which disassembler treats as a
93
   prefix when it can.  */
94
#define FWAIT_OPCODE 0x9b
95
#define ADDR_PREFIX_OPCODE 0x67
96
#define DATA_PREFIX_OPCODE 0x66
97
#define LOCK_PREFIX_OPCODE 0xf0
98
#define CS_PREFIX_OPCODE 0x2e
99
#define DS_PREFIX_OPCODE 0x3e
100
#define ES_PREFIX_OPCODE 0x26
101
#define FS_PREFIX_OPCODE 0x64
102
#define GS_PREFIX_OPCODE 0x65
103
#define SS_PREFIX_OPCODE 0x36
104
#define REPNE_PREFIX_OPCODE 0xf2
105
#define REPE_PREFIX_OPCODE  0xf3
106

    
107
#define TWO_BYTE_OPCODE_ESCAPE 0x0f
108
#define NOP_OPCODE (char) 0x90
109

    
110
/* register numbers */
111
#define EBP_REG_NUM 5
112
#define ESP_REG_NUM 4
113

    
114
/* modrm_byte.regmem for twobyte escape */
115
#define ESCAPE_TO_TWO_BYTE_ADDRESSING ESP_REG_NUM
116
/* index_base_byte.index for no index register addressing */
117
#define NO_INDEX_REGISTER ESP_REG_NUM
118
/* index_base_byte.base for no base register addressing */
119
#define NO_BASE_REGISTER EBP_REG_NUM
120
#define NO_BASE_REGISTER_16 6
121

    
122
/* modrm.mode = REGMEM_FIELD_HAS_REG when a register is in there */
123
#define REGMEM_FIELD_HAS_REG 0x3/* always = 0x3 */
124
#define REGMEM_FIELD_HAS_MEM (~REGMEM_FIELD_HAS_REG)
125

    
126
/* x86-64 extension prefix.  */
127
#define REX_OPCODE        0x40
128

    
129
/* Indicates 64 bit operand size.  */
130
#define REX_W        8
131
/* High extension to reg field of modrm byte.  */
132
#define REX_R        4
133
/* High extension to SIB index field.  */
134
#define REX_X        2
135
/* High extension to base field of modrm or SIB, or reg field of opcode.  */
136
#define REX_B        1
137

    
138
/* max operands per insn */
139
#define MAX_OPERANDS 4
140

    
141
/* max immediates per insn (lcall, ljmp, insertq, extrq) */
142
#define MAX_IMMEDIATE_OPERANDS 2
143

    
144
/* max memory refs per insn (string ops) */
145
#define MAX_MEMORY_OPERANDS 2
146

    
147
/* max size of insn mnemonics.  */
148
#define MAX_MNEM_SIZE 16
149

    
150
/* max size of register name in insn mnemonics.  */
151
#define MAX_REG_NAME_SIZE 8
152

    
153
/* opcodes/i386-dis.c r1.126 */
154
#include "qemu-common.h"
155

    
156
#include <setjmp.h>
157

    
158
static int fetch_data (struct disassemble_info *, bfd_byte *);
159
static void ckprefix (void);
160
static const char *prefix_name (int, int);
161
static int print_insn (bfd_vma, disassemble_info *);
162
static void dofloat (int);
163
static void OP_ST (int, int);
164
static void OP_STi (int, int);
165
static int putop (const char *, int);
166
static void oappend (const char *);
167
static void append_seg (void);
168
static void OP_indirE (int, int);
169
static void print_operand_value (char *buf, size_t bufsize, int hex, bfd_vma disp);
170
static void print_displacement (char *, bfd_vma);
171
static void OP_E (int, int);
172
static void OP_G (int, int);
173
static bfd_vma get64 (void);
174
static bfd_signed_vma get32 (void);
175
static bfd_signed_vma get32s (void);
176
static int get16 (void);
177
static void set_op (bfd_vma, int);
178
static void OP_REG (int, int);
179
static void OP_IMREG (int, int);
180
static void OP_I (int, int);
181
static void OP_I64 (int, int);
182
static void OP_sI (int, int);
183
static void OP_J (int, int);
184
static void OP_SEG (int, int);
185
static void OP_DIR (int, int);
186
static void OP_OFF (int, int);
187
static void OP_OFF64 (int, int);
188
static void ptr_reg (int, int);
189
static void OP_ESreg (int, int);
190
static void OP_DSreg (int, int);
191
static void OP_C (int, int);
192
static void OP_D (int, int);
193
static void OP_T (int, int);
194
static void OP_R (int, int);
195
static void OP_MMX (int, int);
196
static void OP_XMM (int, int);
197
static void OP_EM (int, int);
198
static void OP_EX (int, int);
199
static void OP_EMC (int,int);
200
static void OP_MXC (int,int);
201
static void OP_MS (int, int);
202
static void OP_XS (int, int);
203
static void OP_M (int, int);
204
static void OP_VMX (int, int);
205
static void OP_0fae (int, int);
206
static void OP_0f07 (int, int);
207
static void NOP_Fixup1 (int, int);
208
static void NOP_Fixup2 (int, int);
209
static void OP_3DNowSuffix (int, int);
210
static void OP_SIMD_Suffix (int, int);
211
static void SIMD_Fixup (int, int);
212
static void PNI_Fixup (int, int);
213
static void SVME_Fixup (int, int);
214
static void INVLPG_Fixup (int, int);
215
static void BadOp (void);
216
static void VMX_Fixup (int, int);
217
static void REP_Fixup (int, int);
218
static void CMPXCHG8B_Fixup (int, int);
219
static void XMM_Fixup (int, int);
220
static void CRC32_Fixup (int, int);
221

    
222
struct dis_private {
223
  /* Points to first byte not fetched.  */
224
  bfd_byte *max_fetched;
225
  bfd_byte the_buffer[MAX_MNEM_SIZE];
226
  bfd_vma insn_start;
227
  int orig_sizeflag;
228
  jmp_buf bailout;
229
};
230

    
231
enum address_mode
232
{
233
  mode_16bit,
234
  mode_32bit,
235
  mode_64bit
236
};
237

    
238
static enum address_mode address_mode;
239

    
240
/* Flags for the prefixes for the current instruction.  See below.  */
241
static int prefixes;
242

    
243
/* REX prefix the current instruction.  See below.  */
244
static int rex;
245
/* Bits of REX we've already used.  */
246
static int rex_used;
247
/* Mark parts used in the REX prefix.  When we are testing for
248
   empty prefix (for 8bit register REX extension), just mask it
249
   out.  Otherwise test for REX bit is excuse for existence of REX
250
   only in case value is nonzero.  */
251
#define USED_REX(value)                                        \
252
  {                                                        \
253
    if (value)                                                \
254
      {                                                        \
255
        if ((rex & value))                                \
256
          rex_used |= (value) | REX_OPCODE;                \
257
      }                                                        \
258
    else                                                \
259
      rex_used |= REX_OPCODE;                                \
260
  }
261

    
262
/* Flags for prefixes which we somehow handled when printing the
263
   current instruction.  */
264
static int used_prefixes;
265

    
266
/* Flags stored in PREFIXES.  */
267
#define PREFIX_REPZ 1
268
#define PREFIX_REPNZ 2
269
#define PREFIX_LOCK 4
270
#define PREFIX_CS 8
271
#define PREFIX_SS 0x10
272
#define PREFIX_DS 0x20
273
#define PREFIX_ES 0x40
274
#define PREFIX_FS 0x80
275
#define PREFIX_GS 0x100
276
#define PREFIX_DATA 0x200
277
#define PREFIX_ADDR 0x400
278
#define PREFIX_FWAIT 0x800
279

    
280
/* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
281
   to ADDR (exclusive) are valid.  Returns 1 for success, longjmps
282
   on error.  */
283
#define FETCH_DATA(info, addr) \
284
  ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
285
   ? 1 : fetch_data ((info), (addr)))
286

    
287
static int
288
fetch_data (struct disassemble_info *info, bfd_byte *addr)
289
{
290
  int status;
291
  struct dis_private *priv = (struct dis_private *) info->private_data;
292
  bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
293

    
294
  if (addr <= priv->the_buffer + MAX_MNEM_SIZE)
295
    status = (*info->read_memory_func) (start,
296
                                        priv->max_fetched,
297
                                        addr - priv->max_fetched,
298
                                        info);
299
  else
300
    status = -1;
301
  if (status != 0)
302
    {
303
      /* If we did manage to read at least one byte, then
304
         print_insn_i386 will do something sensible.  Otherwise, print
305
         an error.  We do that here because this is where we know
306
         STATUS.  */
307
      if (priv->max_fetched == priv->the_buffer)
308
        (*info->memory_error_func) (status, start, info);
309
      longjmp (priv->bailout, 1);
310
    }
311
  else
312
    priv->max_fetched = addr;
313
  return 1;
314
}
315

    
316
#define XX { NULL, 0 }
317

    
318
#define Eb { OP_E, b_mode }
319
#define Ev { OP_E, v_mode }
320
#define Ed { OP_E, d_mode }
321
#define Edq { OP_E, dq_mode }
322
#define Edqw { OP_E, dqw_mode }
323
#define Edqb { OP_E, dqb_mode }
324
#define Edqd { OP_E, dqd_mode }
325
#define indirEv { OP_indirE, stack_v_mode }
326
#define indirEp { OP_indirE, f_mode }
327
#define stackEv { OP_E, stack_v_mode }
328
#define Em { OP_E, m_mode }
329
#define Ew { OP_E, w_mode }
330
#define M { OP_M, 0 }                /* lea, lgdt, etc. */
331
#define Ma { OP_M, v_mode }
332
#define Mp { OP_M, f_mode }                /* 32 or 48 bit memory operand for LDS, LES etc */
333
#define Mq { OP_M, q_mode }
334
#define Gb { OP_G, b_mode }
335
#define Gv { OP_G, v_mode }
336
#define Gd { OP_G, d_mode }
337
#define Gdq { OP_G, dq_mode }
338
#define Gm { OP_G, m_mode }
339
#define Gw { OP_G, w_mode }
340
#define Rd { OP_R, d_mode }
341
#define Rm { OP_R, m_mode }
342
#define Ib { OP_I, b_mode }
343
#define sIb { OP_sI, b_mode }        /* sign extened byte */
344
#define Iv { OP_I, v_mode }
345
#define Iq { OP_I, q_mode }
346
#define Iv64 { OP_I64, v_mode }
347
#define Iw { OP_I, w_mode }
348
#define I1 { OP_I, const_1_mode }
349
#define Jb { OP_J, b_mode }
350
#define Jv { OP_J, v_mode }
351
#define Cm { OP_C, m_mode }
352
#define Dm { OP_D, m_mode }
353
#define Td { OP_T, d_mode }
354

    
355
#define RMeAX { OP_REG, eAX_reg }
356
#define RMeBX { OP_REG, eBX_reg }
357
#define RMeCX { OP_REG, eCX_reg }
358
#define RMeDX { OP_REG, eDX_reg }
359
#define RMeSP { OP_REG, eSP_reg }
360
#define RMeBP { OP_REG, eBP_reg }
361
#define RMeSI { OP_REG, eSI_reg }
362
#define RMeDI { OP_REG, eDI_reg }
363
#define RMrAX { OP_REG, rAX_reg }
364
#define RMrBX { OP_REG, rBX_reg }
365
#define RMrCX { OP_REG, rCX_reg }
366
#define RMrDX { OP_REG, rDX_reg }
367
#define RMrSP { OP_REG, rSP_reg }
368
#define RMrBP { OP_REG, rBP_reg }
369
#define RMrSI { OP_REG, rSI_reg }
370
#define RMrDI { OP_REG, rDI_reg }
371
#define RMAL { OP_REG, al_reg }
372
#define RMAL { OP_REG, al_reg }
373
#define RMCL { OP_REG, cl_reg }
374
#define RMDL { OP_REG, dl_reg }
375
#define RMBL { OP_REG, bl_reg }
376
#define RMAH { OP_REG, ah_reg }
377
#define RMCH { OP_REG, ch_reg }
378
#define RMDH { OP_REG, dh_reg }
379
#define RMBH { OP_REG, bh_reg }
380
#define RMAX { OP_REG, ax_reg }
381
#define RMDX { OP_REG, dx_reg }
382

    
383
#define eAX { OP_IMREG, eAX_reg }
384
#define eBX { OP_IMREG, eBX_reg }
385
#define eCX { OP_IMREG, eCX_reg }
386
#define eDX { OP_IMREG, eDX_reg }
387
#define eSP { OP_IMREG, eSP_reg }
388
#define eBP { OP_IMREG, eBP_reg }
389
#define eSI { OP_IMREG, eSI_reg }
390
#define eDI { OP_IMREG, eDI_reg }
391
#define AL { OP_IMREG, al_reg }
392
#define CL { OP_IMREG, cl_reg }
393
#define DL { OP_IMREG, dl_reg }
394
#define BL { OP_IMREG, bl_reg }
395
#define AH { OP_IMREG, ah_reg }
396
#define CH { OP_IMREG, ch_reg }
397
#define DH { OP_IMREG, dh_reg }
398
#define BH { OP_IMREG, bh_reg }
399
#define AX { OP_IMREG, ax_reg }
400
#define DX { OP_IMREG, dx_reg }
401
#define zAX { OP_IMREG, z_mode_ax_reg }
402
#define indirDX { OP_IMREG, indir_dx_reg }
403

    
404
#define Sw { OP_SEG, w_mode }
405
#define Sv { OP_SEG, v_mode }
406
#define Ap { OP_DIR, 0 }
407
#define Ob { OP_OFF64, b_mode }
408
#define Ov { OP_OFF64, v_mode }
409
#define Xb { OP_DSreg, eSI_reg }
410
#define Xv { OP_DSreg, eSI_reg }
411
#define Xz { OP_DSreg, eSI_reg }
412
#define Yb { OP_ESreg, eDI_reg }
413
#define Yv { OP_ESreg, eDI_reg }
414
#define DSBX { OP_DSreg, eBX_reg }
415

    
416
#define es { OP_REG, es_reg }
417
#define ss { OP_REG, ss_reg }
418
#define cs { OP_REG, cs_reg }
419
#define ds { OP_REG, ds_reg }
420
#define fs { OP_REG, fs_reg }
421
#define gs { OP_REG, gs_reg }
422

    
423
#define MX { OP_MMX, 0 }
424
#define XM { OP_XMM, 0 }
425
#define EM { OP_EM, v_mode }
426
#define EMd { OP_EM, d_mode }
427
#define EMq { OP_EM, q_mode }
428
#define EXd { OP_EX, d_mode }
429
#define EXq { OP_EX, q_mode }
430
#define EXx { OP_EX, x_mode }
431
#define MS { OP_MS, v_mode }
432
#define XS { OP_XS, v_mode }
433
#define EMC { OP_EMC, v_mode }
434
#define MXC { OP_MXC, 0 }
435
#define VM { OP_VMX, q_mode }
436
#define OPSUF { OP_3DNowSuffix, 0 }
437
#define OPSIMD { OP_SIMD_Suffix, 0 }
438
#define XMM0 { XMM_Fixup, 0 }
439

    
440
/* Used handle "rep" prefix for string instructions.  */
441
#define Xbr { REP_Fixup, eSI_reg }
442
#define Xvr { REP_Fixup, eSI_reg }
443
#define Ybr { REP_Fixup, eDI_reg }
444
#define Yvr { REP_Fixup, eDI_reg }
445
#define Yzr { REP_Fixup, eDI_reg }
446
#define indirDXr { REP_Fixup, indir_dx_reg }
447
#define ALr { REP_Fixup, al_reg }
448
#define eAXr { REP_Fixup, eAX_reg }
449

    
450
#define cond_jump_flag { NULL, cond_jump_mode }
451
#define loop_jcxz_flag { NULL, loop_jcxz_mode }
452

    
453
/* bits in sizeflag */
454
#define SUFFIX_ALWAYS 4
455
#define AFLAG 2
456
#define DFLAG 1
457

    
458
#define b_mode 1  /* byte operand */
459
#define v_mode 2  /* operand size depends on prefixes */
460
#define w_mode 3  /* word operand */
461
#define d_mode 4  /* double word operand  */
462
#define q_mode 5  /* quad word operand */
463
#define t_mode 6  /* ten-byte operand */
464
#define x_mode 7  /* 16-byte XMM operand */
465
#define m_mode 8  /* d_mode in 32bit, q_mode in 64bit mode.  */
466
#define cond_jump_mode 9
467
#define loop_jcxz_mode 10
468
#define dq_mode 11 /* operand size depends on REX prefixes.  */
469
#define dqw_mode 12 /* registers like dq_mode, memory like w_mode.  */
470
#define f_mode 13 /* 4- or 6-byte pointer operand */
471
#define const_1_mode 14
472
#define stack_v_mode 15 /* v_mode for stack-related opcodes.  */
473
#define z_mode 16 /* non-quad operand size depends on prefixes */
474
#define o_mode 17  /* 16-byte operand */
475
#define dqb_mode 18 /* registers like dq_mode, memory like b_mode.  */
476
#define dqd_mode 19 /* registers like dq_mode, memory like d_mode.  */
477

    
478
#define es_reg 100
479
#define cs_reg 101
480
#define ss_reg 102
481
#define ds_reg 103
482
#define fs_reg 104
483
#define gs_reg 105
484

    
485
#define eAX_reg 108
486
#define eCX_reg 109
487
#define eDX_reg 110
488
#define eBX_reg 111
489
#define eSP_reg 112
490
#define eBP_reg 113
491
#define eSI_reg 114
492
#define eDI_reg 115
493

    
494
#define al_reg 116
495
#define cl_reg 117
496
#define dl_reg 118
497
#define bl_reg 119
498
#define ah_reg 120
499
#define ch_reg 121
500
#define dh_reg 122
501
#define bh_reg 123
502

    
503
#define ax_reg 124
504
#define cx_reg 125
505
#define dx_reg 126
506
#define bx_reg 127
507
#define sp_reg 128
508
#define bp_reg 129
509
#define si_reg 130
510
#define di_reg 131
511

    
512
#define rAX_reg 132
513
#define rCX_reg 133
514
#define rDX_reg 134
515
#define rBX_reg 135
516
#define rSP_reg 136
517
#define rBP_reg 137
518
#define rSI_reg 138
519
#define rDI_reg 139
520

    
521
#define z_mode_ax_reg 149
522
#define indir_dx_reg 150
523

    
524
#define FLOATCODE 1
525
#define USE_GROUPS 2
526
#define USE_PREFIX_USER_TABLE 3
527
#define X86_64_SPECIAL 4
528
#define IS_3BYTE_OPCODE 5
529

    
530
#define FLOAT          NULL, { { NULL, FLOATCODE } }
531

    
532
#define GRP1a          NULL, { { NULL, USE_GROUPS }, { NULL,  0 } }
533
#define GRP1b          NULL, { { NULL, USE_GROUPS }, { NULL,  1 } }
534
#define GRP1S          NULL, { { NULL, USE_GROUPS }, { NULL,  2 } }
535
#define GRP1Ss          NULL, { { NULL, USE_GROUPS }, { NULL,  3 } }
536
#define GRP2b          NULL, { { NULL, USE_GROUPS }, { NULL,  4 } }
537
#define GRP2S          NULL, { { NULL, USE_GROUPS }, { NULL,  5 } }
538
#define GRP2b_one NULL, { { NULL, USE_GROUPS }, { NULL,  6 } }
539
#define GRP2S_one NULL, { { NULL, USE_GROUPS }, { NULL,  7 } }
540
#define GRP2b_cl  NULL, { { NULL, USE_GROUPS }, { NULL,  8 } }
541
#define GRP2S_cl  NULL, { { NULL, USE_GROUPS }, { NULL,  9 } }
542
#define GRP3b          NULL, { { NULL, USE_GROUPS }, { NULL, 10 } }
543
#define GRP3S          NULL, { { NULL, USE_GROUPS }, { NULL, 11 } }
544
#define GRP4          NULL, { { NULL, USE_GROUPS }, { NULL, 12 } }
545
#define GRP5          NULL, { { NULL, USE_GROUPS }, { NULL, 13 } }
546
#define GRP6          NULL, { { NULL, USE_GROUPS }, { NULL, 14 } }
547
#define GRP7          NULL, { { NULL, USE_GROUPS }, { NULL, 15 } }
548
#define GRP8          NULL, { { NULL, USE_GROUPS }, { NULL, 16 } }
549
#define GRP9          NULL, { { NULL, USE_GROUPS }, { NULL, 17 } }
550
#define GRP11_C6  NULL, { { NULL, USE_GROUPS }, { NULL, 18 } }
551
#define GRP11_C7  NULL, { { NULL, USE_GROUPS }, { NULL, 19 } }
552
#define GRP12          NULL, { { NULL, USE_GROUPS }, { NULL, 20 } }
553
#define GRP13          NULL, { { NULL, USE_GROUPS }, { NULL, 21 } }
554
#define GRP14          NULL, { { NULL, USE_GROUPS }, { NULL, 22 } }
555
#define GRP15          NULL, { { NULL, USE_GROUPS }, { NULL, 23 } }
556
#define GRP16          NULL, { { NULL, USE_GROUPS }, { NULL, 24 } }
557
#define GRPAMD          NULL, { { NULL, USE_GROUPS }, { NULL, 25 } }
558
#define GRPPADLCK1 NULL, { { NULL, USE_GROUPS }, { NULL, 26 } }
559
#define GRPPADLCK2 NULL, { { NULL, USE_GROUPS }, { NULL, 27 } }
560

    
561
#define PREGRP0   NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL,  0 } }
562
#define PREGRP1   NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL,  1 } }
563
#define PREGRP2   NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL,  2 } }
564
#define PREGRP3   NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL,  3 } }
565
#define PREGRP4   NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL,  4 } }
566
#define PREGRP5   NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL,  5 } }
567
#define PREGRP6   NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL,  6 } }
568
#define PREGRP7   NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL,  7 } }
569
#define PREGRP8   NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL,  8 } }
570
#define PREGRP9   NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL,  9 } }
571
#define PREGRP10  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 10 } }
572
#define PREGRP11  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 11 } }
573
#define PREGRP12  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 12 } }
574
#define PREGRP13  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 13 } }
575
#define PREGRP14  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 14 } }
576
#define PREGRP15  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 15 } }
577
#define PREGRP16  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 16 } }
578
#define PREGRP17  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 17 } }
579
#define PREGRP18  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 18 } }
580
#define PREGRP19  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 19 } }
581
#define PREGRP20  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 20 } }
582
#define PREGRP21  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 21 } }
583
#define PREGRP22  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 22 } }
584
#define PREGRP23  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 23 } }
585
#define PREGRP24  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 24 } }
586
#define PREGRP25  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 25 } }
587
#define PREGRP26  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 26 } }
588
#define PREGRP27  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 27 } }
589
#define PREGRP28  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 28 } }
590
#define PREGRP29  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 29 } }
591
#define PREGRP30  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 30 } }
592
#define PREGRP31  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 31 } }
593
#define PREGRP32  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 32 } }
594
#define PREGRP33  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 33 } }
595
#define PREGRP34  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 34 } }
596
#define PREGRP35  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 35 } }
597
#define PREGRP36  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 36 } }
598
#define PREGRP37  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 37 } }
599
#define PREGRP38  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 38 } }
600
#define PREGRP39  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 39 } }
601
#define PREGRP40  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 40 } }
602
#define PREGRP41  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 41 } }
603
#define PREGRP42  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 42 } }
604
#define PREGRP43  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 43 } }
605
#define PREGRP44  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 44 } }
606
#define PREGRP45  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 45 } }
607
#define PREGRP46  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 46 } }
608
#define PREGRP47  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 47 } }
609
#define PREGRP48  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 48 } }
610
#define PREGRP49  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 49 } }
611
#define PREGRP50  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 50 } }
612
#define PREGRP51  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 51 } }
613
#define PREGRP52  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 52 } }
614
#define PREGRP53  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 53 } }
615
#define PREGRP54  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 54 } }
616
#define PREGRP55  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 55 } }
617
#define PREGRP56  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 56 } }
618
#define PREGRP57  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 57 } }
619
#define PREGRP58  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 58 } }
620
#define PREGRP59  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 59 } }
621
#define PREGRP60  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 60 } }
622
#define PREGRP61  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 61 } }
623
#define PREGRP62  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 62 } }
624
#define PREGRP63  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 63 } }
625
#define PREGRP64  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 64 } }
626
#define PREGRP65  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 65 } }
627
#define PREGRP66  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 66 } }
628
#define PREGRP67  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 67 } }
629
#define PREGRP68  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 68 } }
630
#define PREGRP69  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 69 } }
631
#define PREGRP70  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 70 } }
632
#define PREGRP71  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 71 } }
633
#define PREGRP72  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 72 } }
634
#define PREGRP73  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 73 } }
635
#define PREGRP74  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 74 } }
636
#define PREGRP75  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 75 } }
637
#define PREGRP76  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 76 } }
638
#define PREGRP77  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 77 } }
639
#define PREGRP78  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 78 } }
640
#define PREGRP79  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 79 } }
641
#define PREGRP80  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 80 } }
642
#define PREGRP81  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 81 } }
643
#define PREGRP82  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 82 } }
644
#define PREGRP83  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 83 } }
645
#define PREGRP84  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 84 } }
646
#define PREGRP85  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 85 } }
647
#define PREGRP86  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 86 } }
648
#define PREGRP87  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 87 } }
649
#define PREGRP88  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 88 } }
650
#define PREGRP89  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 89 } }
651
#define PREGRP90  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 90 } }
652
#define PREGRP91  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 91 } }
653
#define PREGRP92  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 92 } }
654
#define PREGRP93  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 93 } }
655
#define PREGRP94  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 94 } }
656
#define PREGRP95  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 95 } }
657
#define PREGRP96  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 96 } }
658
#define PREGRP97  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 97 } }
659

    
660

    
661
#define X86_64_0  NULL, { { NULL, X86_64_SPECIAL }, { NULL, 0 } }
662
#define X86_64_1  NULL, { { NULL, X86_64_SPECIAL }, { NULL, 1 } }
663
#define X86_64_2  NULL, { { NULL, X86_64_SPECIAL }, { NULL, 2 } }
664
#define X86_64_3  NULL, { { NULL, X86_64_SPECIAL }, { NULL, 3 } }
665

    
666
#define THREE_BYTE_0 NULL, { { NULL, IS_3BYTE_OPCODE }, { NULL, 0 } }
667
#define THREE_BYTE_1 NULL, { { NULL, IS_3BYTE_OPCODE }, { NULL, 1 } }
668

    
669
typedef void (*op_rtn) (int bytemode, int sizeflag);
670

    
671
struct dis386 {
672
  const char *name;
673
  struct
674
    {
675
      op_rtn rtn;
676
      int bytemode;
677
    } op[MAX_OPERANDS];
678
};
679

    
680
/* Upper case letters in the instruction names here are macros.
681
   'A' => print 'b' if no register operands or suffix_always is true
682
   'B' => print 'b' if suffix_always is true
683
   'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
684
   .      size prefix
685
   'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
686
   .      suffix_always is true
687
   'E' => print 'e' if 32-bit form of jcxz
688
   'F' => print 'w' or 'l' depending on address size prefix (loop insns)
689
   'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
690
   'H' => print ",pt" or ",pn" branch hint
691
   'I' => honor following macro letter even in Intel mode (implemented only
692
   .      for some of the macro letters)
693
   'J' => print 'l'
694
   'K' => print 'd' or 'q' if rex prefix is present.
695
   'L' => print 'l' if suffix_always is true
696
   'N' => print 'n' if instruction has no wait "prefix"
697
   'O' => print 'd' or 'o' (or 'q' in Intel mode)
698
   'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
699
   .      or suffix_always is true.  print 'q' if rex prefix is present.
700
   'Q' => print 'w', 'l' or 'q' if no register operands or suffix_always
701
   .      is true
702
   'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
703
   'S' => print 'w', 'l' or 'q' if suffix_always is true
704
   'T' => print 'q' in 64bit mode and behave as 'P' otherwise
705
   'U' => print 'q' in 64bit mode and behave as 'Q' otherwise
706
   'V' => print 'q' in 64bit mode and behave as 'S' otherwise
707
   'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
708
   'X' => print 's', 'd' depending on data16 prefix (for XMM)
709
   'Y' => 'q' if instruction has an REX 64bit overwrite prefix
710
   'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
711

712
   Many of the above letters print nothing in Intel mode.  See "putop"
713
   for the details.
714

715
   Braces '{' and '}', and vertical bars '|', indicate alternative
716
   mnemonic strings for AT&T, Intel, X86_64 AT&T, and X86_64 Intel
717
   modes.  In cases where there are only two alternatives, the X86_64
718
   instruction is reserved, and "(bad)" is printed.
719
*/
720

    
721
static const struct dis386 dis386[] = {
722
  /* 00 */
723
  { "addB",                { Eb, Gb } },
724
  { "addS",                { Ev, Gv } },
725
  { "addB",                { Gb, Eb } },
726
  { "addS",                { Gv, Ev } },
727
  { "addB",                { AL, Ib } },
728
  { "addS",                { eAX, Iv } },
729
  { "push{T|}",                { es } },
730
  { "pop{T|}",                { es } },
731
  /* 08 */
732
  { "orB",                { Eb, Gb } },
733
  { "orS",                { Ev, Gv } },
734
  { "orB",                { Gb, Eb } },
735
  { "orS",                { Gv, Ev } },
736
  { "orB",                { AL, Ib } },
737
  { "orS",                { eAX, Iv } },
738
  { "push{T|}",                { cs } },
739
  { "(bad)",                { XX } },        /* 0x0f extended opcode escape */
740
  /* 10 */
741
  { "adcB",                { Eb, Gb } },
742
  { "adcS",                { Ev, Gv } },
743
  { "adcB",                { Gb, Eb } },
744
  { "adcS",                { Gv, Ev } },
745
  { "adcB",                { AL, Ib } },
746
  { "adcS",                { eAX, Iv } },
747
  { "push{T|}",                { ss } },
748
  { "pop{T|}",                { ss } },
749
  /* 18 */
750
  { "sbbB",                { Eb, Gb } },
751
  { "sbbS",                { Ev, Gv } },
752
  { "sbbB",                { Gb, Eb } },
753
  { "sbbS",                { Gv, Ev } },
754
  { "sbbB",                { AL, Ib } },
755
  { "sbbS",                { eAX, Iv } },
756
  { "push{T|}",                { ds } },
757
  { "pop{T|}",                { ds } },
758
  /* 20 */
759
  { "andB",                { Eb, Gb } },
760
  { "andS",                { Ev, Gv } },
761
  { "andB",                { Gb, Eb } },
762
  { "andS",                { Gv, Ev } },
763
  { "andB",                { AL, Ib } },
764
  { "andS",                { eAX, Iv } },
765
  { "(bad)",                { XX } },        /* SEG ES prefix */
766
  { "daa{|}",                { XX } },
767
  /* 28 */
768
  { "subB",                { Eb, Gb } },
769
  { "subS",                { Ev, Gv } },
770
  { "subB",                { Gb, Eb } },
771
  { "subS",                { Gv, Ev } },
772
  { "subB",                { AL, Ib } },
773
  { "subS",                { eAX, Iv } },
774
  { "(bad)",                { XX } },        /* SEG CS prefix */
775
  { "das{|}",                { XX } },
776
  /* 30 */
777
  { "xorB",                { Eb, Gb } },
778
  { "xorS",                { Ev, Gv } },
779
  { "xorB",                { Gb, Eb } },
780
  { "xorS",                { Gv, Ev } },
781
  { "xorB",                { AL, Ib } },
782
  { "xorS",                { eAX, Iv } },
783
  { "(bad)",                { XX } },        /* SEG SS prefix */
784
  { "aaa{|}",                { XX } },
785
  /* 38 */
786
  { "cmpB",                { Eb, Gb } },
787
  { "cmpS",                { Ev, Gv } },
788
  { "cmpB",                { Gb, Eb } },
789
  { "cmpS",                { Gv, Ev } },
790
  { "cmpB",                { AL, Ib } },
791
  { "cmpS",                { eAX, Iv } },
792
  { "(bad)",                { XX } },        /* SEG DS prefix */
793
  { "aas{|}",                { XX } },
794
  /* 40 */
795
  { "inc{S|}",                { RMeAX } },
796
  { "inc{S|}",                { RMeCX } },
797
  { "inc{S|}",                { RMeDX } },
798
  { "inc{S|}",                { RMeBX } },
799
  { "inc{S|}",                { RMeSP } },
800
  { "inc{S|}",                { RMeBP } },
801
  { "inc{S|}",                { RMeSI } },
802
  { "inc{S|}",                { RMeDI } },
803
  /* 48 */
804
  { "dec{S|}",                { RMeAX } },
805
  { "dec{S|}",                { RMeCX } },
806
  { "dec{S|}",                { RMeDX } },
807
  { "dec{S|}",                { RMeBX } },
808
  { "dec{S|}",                { RMeSP } },
809
  { "dec{S|}",                { RMeBP } },
810
  { "dec{S|}",                { RMeSI } },
811
  { "dec{S|}",                { RMeDI } },
812
  /* 50 */
813
  { "pushV",                { RMrAX } },
814
  { "pushV",                { RMrCX } },
815
  { "pushV",                { RMrDX } },
816
  { "pushV",                { RMrBX } },
817
  { "pushV",                { RMrSP } },
818
  { "pushV",                { RMrBP } },
819
  { "pushV",                { RMrSI } },
820
  { "pushV",                { RMrDI } },
821
  /* 58 */
822
  { "popV",                { RMrAX } },
823
  { "popV",                { RMrCX } },
824
  { "popV",                { RMrDX } },
825
  { "popV",                { RMrBX } },
826
  { "popV",                { RMrSP } },
827
  { "popV",                { RMrBP } },
828
  { "popV",                { RMrSI } },
829
  { "popV",                { RMrDI } },
830
  /* 60 */
831
  { X86_64_0 },
832
  { X86_64_1 },
833
  { X86_64_2 },
834
  { X86_64_3 },
835
  { "(bad)",                { XX } },        /* seg fs */
836
  { "(bad)",                { XX } },        /* seg gs */
837
  { "(bad)",                { XX } },        /* op size prefix */
838
  { "(bad)",                { XX } },        /* adr size prefix */
839
  /* 68 */
840
  { "pushT",                { Iq } },
841
  { "imulS",                { Gv, Ev, Iv } },
842
  { "pushT",                { sIb } },
843
  { "imulS",                { Gv, Ev, sIb } },
844
  { "ins{b||b|}",        { Ybr, indirDX } },
845
  { "ins{R||G|}",        { Yzr, indirDX } },
846
  { "outs{b||b|}",        { indirDXr, Xb } },
847
  { "outs{R||G|}",        { indirDXr, Xz } },
848
  /* 70 */
849
  { "joH",                { Jb, XX, cond_jump_flag } },
850
  { "jnoH",                { Jb, XX, cond_jump_flag } },
851
  { "jbH",                { Jb, XX, cond_jump_flag } },
852
  { "jaeH",                { Jb, XX, cond_jump_flag } },
853
  { "jeH",                { Jb, XX, cond_jump_flag } },
854
  { "jneH",                { Jb, XX, cond_jump_flag } },
855
  { "jbeH",                { Jb, XX, cond_jump_flag } },
856
  { "jaH",                { Jb, XX, cond_jump_flag } },
857
  /* 78 */
858
  { "jsH",                { Jb, XX, cond_jump_flag } },
859
  { "jnsH",                { Jb, XX, cond_jump_flag } },
860
  { "jpH",                { Jb, XX, cond_jump_flag } },
861
  { "jnpH",                { Jb, XX, cond_jump_flag } },
862
  { "jlH",                { Jb, XX, cond_jump_flag } },
863
  { "jgeH",                { Jb, XX, cond_jump_flag } },
864
  { "jleH",                { Jb, XX, cond_jump_flag } },
865
  { "jgH",                { Jb, XX, cond_jump_flag } },
866
  /* 80 */
867
  { GRP1b },
868
  { GRP1S },
869
  { "(bad)",                { XX } },
870
  { GRP1Ss },
871
  { "testB",                { Eb, Gb } },
872
  { "testS",                { Ev, Gv } },
873
  { "xchgB",                { Eb, Gb } },
874
  { "xchgS",                { Ev, Gv } },
875
  /* 88 */
876
  { "movB",                { Eb, Gb } },
877
  { "movS",                { Ev, Gv } },
878
  { "movB",                { Gb, Eb } },
879
  { "movS",                { Gv, Ev } },
880
  { "movD",                { Sv, Sw } },
881
  { "leaS",                { Gv, M } },
882
  { "movD",                { Sw, Sv } },
883
  { GRP1a },
884
  /* 90 */
885
  { PREGRP38 },
886
  { "xchgS",                { RMeCX, eAX } },
887
  { "xchgS",                { RMeDX, eAX } },
888
  { "xchgS",                { RMeBX, eAX } },
889
  { "xchgS",                { RMeSP, eAX } },
890
  { "xchgS",                { RMeBP, eAX } },
891
  { "xchgS",                { RMeSI, eAX } },
892
  { "xchgS",                { RMeDI, eAX } },
893
  /* 98 */
894
  { "cW{t||t|}R",        { XX } },
895
  { "cR{t||t|}O",        { XX } },
896
  { "Jcall{T|}",        { Ap } },
897
  { "(bad)",                { XX } },        /* fwait */
898
  { "pushfT",                { XX } },
899
  { "popfT",                { XX } },
900
  { "sahf{|}",                { XX } },
901
  { "lahf{|}",                { XX } },
902
  /* a0 */
903
  { "movB",                { AL, Ob } },
904
  { "movS",                { eAX, Ov } },
905
  { "movB",                { Ob, AL } },
906
  { "movS",                { Ov, eAX } },
907
  { "movs{b||b|}",        { Ybr, Xb } },
908
  { "movs{R||R|}",        { Yvr, Xv } },
909
  { "cmps{b||b|}",        { Xb, Yb } },
910
  { "cmps{R||R|}",        { Xv, Yv } },
911
  /* a8 */
912
  { "testB",                { AL, Ib } },
913
  { "testS",                { eAX, Iv } },
914
  { "stosB",                { Ybr, AL } },
915
  { "stosS",                { Yvr, eAX } },
916
  { "lodsB",                { ALr, Xb } },
917
  { "lodsS",                { eAXr, Xv } },
918
  { "scasB",                { AL, Yb } },
919
  { "scasS",                { eAX, Yv } },
920
  /* b0 */
921
  { "movB",                { RMAL, Ib } },
922
  { "movB",                { RMCL, Ib } },
923
  { "movB",                { RMDL, Ib } },
924
  { "movB",                { RMBL, Ib } },
925
  { "movB",                { RMAH, Ib } },
926
  { "movB",                { RMCH, Ib } },
927
  { "movB",                { RMDH, Ib } },
928
  { "movB",                { RMBH, Ib } },
929
  /* b8 */
930
  { "movS",                { RMeAX, Iv64 } },
931
  { "movS",                { RMeCX, Iv64 } },
932
  { "movS",                { RMeDX, Iv64 } },
933
  { "movS",                { RMeBX, Iv64 } },
934
  { "movS",                { RMeSP, Iv64 } },
935
  { "movS",                { RMeBP, Iv64 } },
936
  { "movS",                { RMeSI, Iv64 } },
937
  { "movS",                { RMeDI, Iv64 } },
938
  /* c0 */
939
  { GRP2b },
940
  { GRP2S },
941
  { "retT",                { Iw } },
942
  { "retT",                { XX } },
943
  { "les{S|}",                { Gv, Mp } },
944
  { "ldsS",                { Gv, Mp } },
945
  { GRP11_C6 },
946
  { GRP11_C7 },
947
  /* c8 */
948
  { "enterT",                { Iw, Ib } },
949
  { "leaveT",                { XX } },
950
  { "lretP",                { Iw } },
951
  { "lretP",                { XX } },
952
  { "int3",                { XX } },
953
  { "int",                { Ib } },
954
  { "into{|}",                { XX } },
955
  { "iretP",                { XX } },
956
  /* d0 */
957
  { GRP2b_one },
958
  { GRP2S_one },
959
  { GRP2b_cl },
960
  { GRP2S_cl },
961
  { "aam{|}",                { sIb } },
962
  { "aad{|}",                { sIb } },
963
  { "(bad)",                { XX } },
964
  { "xlat",                { DSBX } },
965
  /* d8 */
966
  { FLOAT },
967
  { FLOAT },
968
  { FLOAT },
969
  { FLOAT },
970
  { FLOAT },
971
  { FLOAT },
972
  { FLOAT },
973
  { FLOAT },
974
  /* e0 */
975
  { "loopneFH",                { Jb, XX, loop_jcxz_flag } },
976
  { "loopeFH",                { Jb, XX, loop_jcxz_flag } },
977
  { "loopFH",                { Jb, XX, loop_jcxz_flag } },
978
  { "jEcxzH",                { Jb, XX, loop_jcxz_flag } },
979
  { "inB",                { AL, Ib } },
980
  { "inG",                { zAX, Ib } },
981
  { "outB",                { Ib, AL } },
982
  { "outG",                { Ib, zAX } },
983
  /* e8 */
984
  { "callT",                { Jv } },
985
  { "jmpT",                { Jv } },
986
  { "Jjmp{T|}",                { Ap } },
987
  { "jmp",                { Jb } },
988
  { "inB",                { AL, indirDX } },
989
  { "inG",                { zAX, indirDX } },
990
  { "outB",                { indirDX, AL } },
991
  { "outG",                { indirDX, zAX } },
992
  /* f0 */
993
  { "(bad)",                { XX } },        /* lock prefix */
994
  { "icebp",                { XX } },
995
  { "(bad)",                { XX } },        /* repne */
996
  { "(bad)",                { XX } },        /* repz */
997
  { "hlt",                { XX } },
998
  { "cmc",                { XX } },
999
  { GRP3b },
1000
  { GRP3S },
1001
  /* f8 */
1002
  { "clc",                { XX } },
1003
  { "stc",                { XX } },
1004
  { "cli",                { XX } },
1005
  { "sti",                { XX } },
1006
  { "cld",                { XX } },
1007
  { "std",                { XX } },
1008
  { GRP4 },
1009
  { GRP5 },
1010
};
1011

    
1012
static const struct dis386 dis386_twobyte[] = {
1013
  /* 00 */
1014
  { GRP6 },
1015
  { GRP7 },
1016
  { "larS",                { Gv, Ew } },
1017
  { "lslS",                { Gv, Ew } },
1018
  { "(bad)",                { XX } },
1019
  { "syscall",                { XX } },
1020
  { "clts",                { XX } },
1021
  { "sysretP",                { XX } },
1022
  /* 08 */
1023
  { "invd",                { XX } },
1024
  { "wbinvd",                { XX } },
1025
  { "(bad)",                { XX } },
1026
  { "ud2a",                { XX } },
1027
  { "(bad)",                { XX } },
1028
  { GRPAMD },
1029
  { "femms",                { XX } },
1030
  { "",                        { MX, EM, OPSUF } }, /* See OP_3DNowSuffix.  */
1031
  /* 10 */
1032
  { PREGRP8 },
1033
  { PREGRP9 },
1034
  { PREGRP30 },
1035
  { "movlpX",                { EXq, XM, { SIMD_Fixup, 'h' } } },
1036
  { "unpcklpX",                { XM, EXq } },
1037
  { "unpckhpX",                { XM, EXq } },
1038
  { PREGRP31 },
1039
  { "movhpX",                { EXq, XM, { SIMD_Fixup, 'l' } } },
1040
  /* 18 */
1041
  { GRP16 },
1042
  { "(bad)",                { XX } },
1043
  { "(bad)",                { XX } },
1044
  { "(bad)",                { XX } },
1045
  { "(bad)",                { XX } },
1046
  { "(bad)",                { XX } },
1047
  { "(bad)",                { XX } },
1048
  { "nopQ",                { Ev } },
1049
  /* 20 */
1050
  { "movZ",                { Rm, Cm } },
1051
  { "movZ",                { Rm, Dm } },
1052
  { "movZ",                { Cm, Rm } },
1053
  { "movZ",                { Dm, Rm } },
1054
  { "movL",                { Rd, Td } },
1055
  { "(bad)",                { XX } },
1056
  { "movL",                { Td, Rd } },
1057
  { "(bad)",                { XX } },
1058
  /* 28 */
1059
  { "movapX",                { XM, EXx } },
1060
  { "movapX",                { EXx,  XM } },
1061
  { PREGRP2 },
1062
  { PREGRP33 },
1063
  { PREGRP4 },
1064
  { PREGRP3 },
1065
  { PREGRP93 },
1066
  { PREGRP94 },
1067
  /* 30 */
1068
  { "wrmsr",                { XX } },
1069
  { "rdtsc",                { XX } },
1070
  { "rdmsr",                { XX } },
1071
  { "rdpmc",                { XX } },
1072
  { "sysenter",                { XX } },
1073
  { "sysexit",                { XX } },
1074
  { "(bad)",                { XX } },
1075
  { "(bad)",                { XX } },
1076
  /* 38 */
1077
  { THREE_BYTE_0 },
1078
  { "(bad)",                { XX } },
1079
  { THREE_BYTE_1 },
1080
  { "(bad)",                { XX } },
1081
  { "(bad)",                { XX } },
1082
  { "(bad)",                { XX } },
1083
  { "(bad)",                { XX } },
1084
  { "(bad)",                { XX } },
1085
  /* 40 */
1086
  { "cmovo",                { Gv, Ev } },
1087
  { "cmovno",                { Gv, Ev } },
1088
  { "cmovb",                { Gv, Ev } },
1089
  { "cmovae",                { Gv, Ev } },
1090
  { "cmove",                { Gv, Ev } },
1091
  { "cmovne",                { Gv, Ev } },
1092
  { "cmovbe",                { Gv, Ev } },
1093
  { "cmova",                { Gv, Ev } },
1094
  /* 48 */
1095
  { "cmovs",                { Gv, Ev } },
1096
  { "cmovns",                { Gv, Ev } },
1097
  { "cmovp",                { Gv, Ev } },
1098
  { "cmovnp",                { Gv, Ev } },
1099
  { "cmovl",                { Gv, Ev } },
1100
  { "cmovge",                { Gv, Ev } },
1101
  { "cmovle",                { Gv, Ev } },
1102
  { "cmovg",                { Gv, Ev } },
1103
  /* 50 */
1104
  { "movmskpX",                { Gdq, XS } },
1105
  { PREGRP13 },
1106
  { PREGRP12 },
1107
  { PREGRP11 },
1108
  { "andpX",                { XM, EXx } },
1109
  { "andnpX",                { XM, EXx } },
1110
  { "orpX",                { XM, EXx } },
1111
  { "xorpX",                { XM, EXx } },
1112
  /* 58 */
1113
  { PREGRP0 },
1114
  { PREGRP10 },
1115
  { PREGRP17 },
1116
  { PREGRP16 },
1117
  { PREGRP14 },
1118
  { PREGRP7 },
1119
  { PREGRP5 },
1120
  { PREGRP6 },
1121
  /* 60 */
1122
  { PREGRP95 },
1123
  { PREGRP96 },
1124
  { PREGRP97 },
1125
  { "packsswb",                { MX, EM } },
1126
  { "pcmpgtb",                { MX, EM } },
1127
  { "pcmpgtw",                { MX, EM } },
1128
  { "pcmpgtd",                { MX, EM } },
1129
  { "packuswb",                { MX, EM } },
1130
  /* 68 */
1131
  { "punpckhbw",        { MX, EM } },
1132
  { "punpckhwd",        { MX, EM } },
1133
  { "punpckhdq",        { MX, EM } },
1134
  { "packssdw",                { MX, EM } },
1135
  { PREGRP26 },
1136
  { PREGRP24 },
1137
  { "movd",                { MX, Edq } },
1138
  { PREGRP19 },
1139
  /* 70 */
1140
  { PREGRP22 },
1141
  { GRP12 },
1142
  { GRP13 },
1143
  { GRP14 },
1144
  { "pcmpeqb",                { MX, EM } },
1145
  { "pcmpeqw",                { MX, EM } },
1146
  { "pcmpeqd",                { MX, EM } },
1147
  { "emms",                { XX } },
1148
  /* 78 */
1149
  { PREGRP34 },
1150
  { PREGRP35 },
1151
  { "(bad)",                { XX } },
1152
  { "(bad)",                { XX } },
1153
  { PREGRP28 },
1154
  { PREGRP29 },
1155
  { PREGRP23 },
1156
  { PREGRP20 },
1157
  /* 80 */
1158
  { "joH",                { Jv, XX, cond_jump_flag } },
1159
  { "jnoH",                { Jv, XX, cond_jump_flag } },
1160
  { "jbH",                { Jv, XX, cond_jump_flag } },
1161
  { "jaeH",                { Jv, XX, cond_jump_flag } },
1162
  { "jeH",                { Jv, XX, cond_jump_flag } },
1163
  { "jneH",                { Jv, XX, cond_jump_flag } },
1164
  { "jbeH",                { Jv, XX, cond_jump_flag } },
1165
  { "jaH",                { Jv, XX, cond_jump_flag } },
1166
  /* 88 */
1167
  { "jsH",                { Jv, XX, cond_jump_flag } },
1168
  { "jnsH",                { Jv, XX, cond_jump_flag } },
1169
  { "jpH",                { Jv, XX, cond_jump_flag } },
1170
  { "jnpH",                { Jv, XX, cond_jump_flag } },
1171
  { "jlH",                { Jv, XX, cond_jump_flag } },
1172
  { "jgeH",                { Jv, XX, cond_jump_flag } },
1173
  { "jleH",                { Jv, XX, cond_jump_flag } },
1174
  { "jgH",                { Jv, XX, cond_jump_flag } },
1175
  /* 90 */
1176
  { "seto",                { Eb } },
1177
  { "setno",                { Eb } },
1178
  { "setb",                { Eb } },
1179
  { "setae",                { Eb } },
1180
  { "sete",                { Eb } },
1181
  { "setne",                { Eb } },
1182
  { "setbe",                { Eb } },
1183
  { "seta",                { Eb } },
1184
  /* 98 */
1185
  { "sets",                { Eb } },
1186
  { "setns",                { Eb } },
1187
  { "setp",                { Eb } },
1188
  { "setnp",                { Eb } },
1189
  { "setl",                { Eb } },
1190
  { "setge",                { Eb } },
1191
  { "setle",                { Eb } },
1192
  { "setg",                { Eb } },
1193
  /* a0 */
1194
  { "pushT",                { fs } },
1195
  { "popT",                { fs } },
1196
  { "cpuid",                { XX } },
1197
  { "btS",                { Ev, Gv } },
1198
  { "shldS",                { Ev, Gv, Ib } },
1199
  { "shldS",                { Ev, Gv, CL } },
1200
  { GRPPADLCK2 },
1201
  { GRPPADLCK1 },
1202
  /* a8 */
1203
  { "pushT",                { gs } },
1204
  { "popT",                { gs } },
1205
  { "rsm",                { XX } },
1206
  { "btsS",                { Ev, Gv } },
1207
  { "shrdS",                { Ev, Gv, Ib } },
1208
  { "shrdS",                { Ev, Gv, CL } },
1209
  { GRP15 },
1210
  { "imulS",                { Gv, Ev } },
1211
  /* b0 */
1212
  { "cmpxchgB",                { Eb, Gb } },
1213
  { "cmpxchgS",                { Ev, Gv } },
1214
  { "lssS",                { Gv, Mp } },
1215
  { "btrS",                { Ev, Gv } },
1216
  { "lfsS",                { Gv, Mp } },
1217
  { "lgsS",                { Gv, Mp } },
1218
  { "movz{bR|x|bR|x}",        { Gv, Eb } },
1219
  { "movz{wR|x|wR|x}",        { Gv, Ew } }, /* yes, there really is movzww ! */
1220
  /* b8 */
1221
  { PREGRP37 },
1222
  { "ud2b",                { XX } },
1223
  { GRP8 },
1224
  { "btcS",                { Ev, Gv } },
1225
  { "bsfS",                { Gv, Ev } },
1226
  { PREGRP36 },
1227
  { "movs{bR|x|bR|x}",        { Gv, Eb } },
1228
  { "movs{wR|x|wR|x}",        { Gv, Ew } }, /* yes, there really is movsww ! */
1229
  /* c0 */
1230
  { "xaddB",                { Eb, Gb } },
1231
  { "xaddS",                { Ev, Gv } },
1232
  { PREGRP1 },
1233
  { "movntiS",                { Ev, Gv } },
1234
  { "pinsrw",                { MX, Edqw, Ib } },
1235
  { "pextrw",                { Gdq, MS, Ib } },
1236
  { "shufpX",                { XM, EXx, Ib } },
1237
  { GRP9 },
1238
  /* c8 */
1239
  { "bswap",                { RMeAX } },
1240
  { "bswap",                { RMeCX } },
1241
  { "bswap",                { RMeDX } },
1242
  { "bswap",                { RMeBX } },
1243
  { "bswap",                { RMeSP } },
1244
  { "bswap",                { RMeBP } },
1245
  { "bswap",                { RMeSI } },
1246
  { "bswap",                { RMeDI } },
1247
  /* d0 */
1248
  { PREGRP27 },
1249
  { "psrlw",                { MX, EM } },
1250
  { "psrld",                { MX, EM } },
1251
  { "psrlq",                { MX, EM } },
1252
  { "paddq",                { MX, EM } },
1253
  { "pmullw",                { MX, EM } },
1254
  { PREGRP21 },
1255
  { "pmovmskb",                { Gdq, MS } },
1256
  /* d8 */
1257
  { "psubusb",                { MX, EM } },
1258
  { "psubusw",                { MX, EM } },
1259
  { "pminub",                { MX, EM } },
1260
  { "pand",                { MX, EM } },
1261
  { "paddusb",                { MX, EM } },
1262
  { "paddusw",                { MX, EM } },
1263
  { "pmaxub",                { MX, EM } },
1264
  { "pandn",                { MX, EM } },
1265
  /* e0 */
1266
  { "pavgb",                { MX, EM } },
1267
  { "psraw",                { MX, EM } },
1268
  { "psrad",                { MX, EM } },
1269
  { "pavgw",                { MX, EM } },
1270
  { "pmulhuw",                { MX, EM } },
1271
  { "pmulhw",                { MX, EM } },
1272
  { PREGRP15 },
1273
  { PREGRP25 },
1274
  /* e8 */
1275
  { "psubsb",                { MX, EM } },
1276
  { "psubsw",                { MX, EM } },
1277
  { "pminsw",                { MX, EM } },
1278
  { "por",                { MX, EM } },
1279
  { "paddsb",                { MX, EM } },
1280
  { "paddsw",                { MX, EM } },
1281
  { "pmaxsw",                { MX, EM } },
1282
  { "pxor",                { MX, EM } },
1283
  /* f0 */
1284
  { PREGRP32 },
1285
  { "psllw",                { MX, EM } },
1286
  { "pslld",                { MX, EM } },
1287
  { "psllq",                { MX, EM } },
1288
  { "pmuludq",                { MX, EM } },
1289
  { "pmaddwd",                { MX, EM } },
1290
  { "psadbw",                { MX, EM } },
1291
  { PREGRP18 },
1292
  /* f8 */
1293
  { "psubb",                { MX, EM } },
1294
  { "psubw",                { MX, EM } },
1295
  { "psubd",                { MX, EM } },
1296
  { "psubq",                { MX, EM } },
1297
  { "paddb",                { MX, EM } },
1298
  { "paddw",                { MX, EM } },
1299
  { "paddd",                { MX, EM } },
1300
  { "(bad)",                { XX } },
1301
};
1302

    
1303
static const unsigned char onebyte_has_modrm[256] = {
1304
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1305
  /*       -------------------------------        */
1306
  /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
1307
  /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
1308
  /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
1309
  /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
1310
  /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
1311
  /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
1312
  /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
1313
  /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
1314
  /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
1315
  /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
1316
  /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
1317
  /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
1318
  /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
1319
  /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
1320
  /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
1321
  /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1  /* f0 */
1322
  /*       -------------------------------        */
1323
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1324
};
1325

    
1326
static const unsigned char twobyte_has_modrm[256] = {
1327
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1328
  /*       -------------------------------        */
1329
  /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
1330
  /* 10 */ 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1, /* 1f */
1331
  /* 20 */ 1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1, /* 2f */
1332
  /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
1333
  /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
1334
  /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
1335
  /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
1336
  /* 70 */ 1,1,1,1,1,1,1,0,1,1,0,0,1,1,1,1, /* 7f */
1337
  /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
1338
  /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
1339
  /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
1340
  /* b0 */ 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, /* bf */
1341
  /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
1342
  /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
1343
  /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
1344
  /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0  /* ff */
1345
  /*       -------------------------------        */
1346
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1347
};
1348

    
1349
static const unsigned char twobyte_uses_DATA_prefix[256] = {
1350
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1351
  /*       -------------------------------        */
1352
  /* 00 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0f */
1353
  /* 10 */ 1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0, /* 1f */
1354
  /* 20 */ 0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0, /* 2f */
1355
  /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
1356
  /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 4f */
1357
  /* 50 */ 0,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* 5f */
1358
  /* 60 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1, /* 6f */
1359
  /* 70 */ 1,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1, /* 7f */
1360
  /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
1361
  /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 9f */
1362
  /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* af */
1363
  /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* bf */
1364
  /* c0 */ 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, /* cf */
1365
  /* d0 */ 1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, /* df */
1366
  /* e0 */ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, /* ef */
1367
  /* f0 */ 1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0  /* ff */
1368
  /*       -------------------------------        */
1369
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1370
};
1371

    
1372
static const unsigned char twobyte_uses_REPNZ_prefix[256] = {
1373
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1374
  /*       -------------------------------        */
1375
  /* 00 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0f */
1376
  /* 10 */ 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 1f */
1377
  /* 20 */ 0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0, /* 2f */
1378
  /* 30 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 3f */
1379
  /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 4f */
1380
  /* 50 */ 0,1,0,0,0,0,0,0,1,1,1,0,1,1,1,1, /* 5f */
1381
  /* 60 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 6f */
1382
  /* 70 */ 1,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0, /* 7f */
1383
  /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
1384
  /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 9f */
1385
  /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* af */
1386
  /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* bf */
1387
  /* c0 */ 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, /* cf */
1388
  /* d0 */ 1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, /* df */
1389
  /* e0 */ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, /* ef */
1390
  /* f0 */ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ff */
1391
  /*       -------------------------------        */
1392
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1393
};
1394

    
1395
static const unsigned char twobyte_uses_REPZ_prefix[256] = {
1396
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1397
  /*       -------------------------------        */
1398
  /* 00 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0f */
1399
  /* 10 */ 1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0, /* 1f */
1400
  /* 20 */ 0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0, /* 2f */
1401
  /* 30 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 3f */
1402
  /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 4f */
1403
  /* 50 */ 0,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* 5f */
1404
  /* 60 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, /* 6f */
1405
  /* 70 */ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, /* 7f */
1406
  /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
1407
  /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 9f */
1408
  /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* af */
1409
  /* b0 */ 0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0, /* bf */
1410
  /* c0 */ 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, /* cf */
1411
  /* d0 */ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, /* df */
1412
  /* e0 */ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, /* ef */
1413
  /* f0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ff */
1414
  /*       -------------------------------        */
1415
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1416
};
1417

    
1418
/* This is used to determine if opcode 0f 38 XX uses DATA prefix.  */
1419
static const unsigned char threebyte_0x38_uses_DATA_prefix[256] = {
1420
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1421
  /*       -------------------------------        */
1422
  /* 00 */ 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0, /* 0f */
1423
  /* 10 */ 1,0,0,0,1,1,0,1,0,0,0,0,1,1,1,0, /* 1f */
1424
  /* 20 */ 1,1,1,1,1,1,0,0,1,1,1,1,0,0,0,0, /* 2f */
1425
  /* 30 */ 1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1, /* 3f */
1426
  /* 40 */ 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 4f */
1427
  /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 5f */
1428
  /* 60 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 6f */
1429
  /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 7f */
1430
  /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
1431
  /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 9f */
1432
  /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* af */
1433
  /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* bf */
1434
  /* c0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* cf */
1435
  /* d0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* df */
1436
  /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ef */
1437
  /* f0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ff */
1438
  /*       -------------------------------        */
1439
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1440
};
1441

    
1442
/* This is used to determine if opcode 0f 38 XX uses REPNZ prefix.  */
1443
static const unsigned char threebyte_0x38_uses_REPNZ_prefix[256] = {
1444
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1445
  /*       -------------------------------        */
1446
  /* 00 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0f */
1447
  /* 10 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 1f */
1448
  /* 20 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 2f */
1449
  /* 30 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 3f */
1450
  /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 4f */
1451
  /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 5f */
1452
  /* 60 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 6f */
1453
  /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 7f */
1454
  /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
1455
  /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 9f */
1456
  /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* af */
1457
  /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* bf */
1458
  /* c0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* cf */
1459
  /* d0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* df */
1460
  /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ef */
1461
  /* f0 */ 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ff */
1462
  /*       -------------------------------        */
1463
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1464
};
1465

    
1466
/* This is used to determine if opcode 0f 38 XX uses REPZ prefix.  */
1467
static const unsigned char threebyte_0x38_uses_REPZ_prefix[256] = {
1468
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1469
  /*       -------------------------------        */
1470
  /* 00 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0f */
1471
  /* 10 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 1f */
1472
  /* 20 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 2f */
1473
  /* 30 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 3f */
1474
  /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 4f */
1475
  /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 5f */
1476
  /* 60 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 6f */
1477
  /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 7f */
1478
  /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
1479
  /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 9f */
1480
  /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* af */
1481
  /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* bf */
1482
  /* c0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* cf */
1483
  /* d0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* df */
1484
  /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ef */
1485
  /* f0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ff */
1486
  /*       -------------------------------        */
1487
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1488
};
1489

    
1490
/* This is used to determine if opcode 0f 3a XX uses DATA prefix.  */
1491
static const unsigned char threebyte_0x3a_uses_DATA_prefix[256] = {
1492
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1493
  /*       -------------------------------        */
1494
  /* 00 */ 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1, /* 0f */
1495
  /* 10 */ 0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* 1f */
1496
  /* 20 */ 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 2f */
1497
  /* 30 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 3f */
1498
  /* 40 */ 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 4f */
1499
  /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 5f */
1500
  /* 60 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, /* 6f */
1501
  /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 7f */
1502
  /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
1503
  /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 9f */
1504
  /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* af */
1505
  /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* bf */
1506
  /* c0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* cf */
1507
  /* d0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* df */
1508
  /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ef */
1509
  /* f0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ff */
1510
  /*       -------------------------------        */
1511
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1512
};
1513

    
1514
/* This is used to determine if opcode 0f 3a XX uses REPNZ prefix.  */
1515
static const unsigned char threebyte_0x3a_uses_REPNZ_prefix[256] = {
1516
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1517
  /*       -------------------------------        */
1518
  /* 00 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0f */
1519
  /* 10 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 1f */
1520
  /* 20 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 2f */
1521
  /* 30 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 3f */
1522
  /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 4f */
1523
  /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 5f */
1524
  /* 60 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 6f */
1525
  /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 7f */
1526
  /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
1527
  /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 9f */
1528
  /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* af */
1529
  /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* bf */
1530
  /* c0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* cf */
1531
  /* d0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* df */
1532
  /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ef */
1533
  /* f0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ff */
1534
  /*       -------------------------------        */
1535
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1536
};
1537

    
1538
/* This is used to determine if opcode 0f 3a XX uses REPZ prefix.  */
1539
static const unsigned char threebyte_0x3a_uses_REPZ_prefix[256] = {
1540
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1541
  /*       -------------------------------        */
1542
  /* 00 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0f */
1543
  /* 10 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 1f */
1544
  /* 20 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 2f */
1545
  /* 30 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 3f */
1546
  /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 4f */
1547
  /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 5f */
1548
  /* 60 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 6f */
1549
  /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 7f */
1550
  /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
1551
  /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 9f */
1552
  /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* af */
1553
  /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* bf */
1554
  /* c0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* cf */
1555
  /* d0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* df */
1556
  /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ef */
1557
  /* f0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ff */
1558
  /*       -------------------------------        */
1559
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1560
};
1561

    
1562
static char obuf[100];
1563
static char *obufp;
1564
static char scratchbuf[100];
1565
static unsigned char *start_codep;
1566
static unsigned char *insn_codep;
1567
static unsigned char *codep;
1568
static disassemble_info *the_info;
1569
static struct
1570
  {
1571
    int mod;
1572
    int reg;
1573
    int rm;
1574
  }
1575
modrm;
1576
static unsigned char need_modrm;
1577

    
1578
/* If we are accessing mod/rm/reg without need_modrm set, then the
1579
   values are stale.  Hitting this abort likely indicates that you
1580
   need to update onebyte_has_modrm or twobyte_has_modrm.  */
1581
#define MODRM_CHECK  if (!need_modrm) abort ()
1582

    
1583
static const char * const *names64;
1584
static const char * const *names32;
1585
static const char * const *names16;
1586
static const char * const *names8;
1587
static const char * const *names8rex;
1588
static const char * const *names_seg;
1589
static const char * const *index16;
1590

    
1591
static const char * const intel_names64[] = {
1592
  "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
1593
  "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
1594
};
1595
static const char * const intel_names32[] = {
1596
  "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
1597
  "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
1598
};
1599
static const char * const intel_names16[] = {
1600
  "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
1601
  "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
1602
};
1603
static const char * const intel_names8[] = {
1604
  "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
1605
};
1606
static const char * const intel_names8rex[] = {
1607
  "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
1608
  "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
1609
};
1610
static const char * const intel_names_seg[] = {
1611
  "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
1612
};
1613
static const char * const intel_index16[] = {
1614
  "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
1615
};
1616

    
1617
static const char * const att_names64[] = {
1618
  "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
1619
  "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
1620
};
1621
static const char * const att_names32[] = {
1622
  "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
1623
  "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
1624
};
1625
static const char * const att_names16[] = {
1626
  "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
1627
  "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
1628
};
1629
static const char * const att_names8[] = {
1630
  "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
1631
};
1632
static const char * const att_names8rex[] = {
1633
  "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
1634
  "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
1635
};
1636
static const char * const att_names_seg[] = {
1637
  "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
1638
};
1639
static const char * const att_index16[] = {
1640
  "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
1641
};
1642

    
1643
static const struct dis386 grps[][8] = {
1644
  /* GRP1a */
1645
  {
1646
    { "popU",        { stackEv } },
1647
    { "(bad)",        { XX } },
1648
    { "(bad)",        { XX } },
1649
    { "(bad)",        { XX } },
1650
    { "(bad)",        { XX } },
1651
    { "(bad)",        { XX } },
1652
    { "(bad)",        { XX } },
1653
    { "(bad)",        { XX } },
1654
  },
1655
  /* GRP1b */
1656
  {
1657
    { "addA",        { Eb, Ib } },
1658
    { "orA",        { Eb, Ib } },
1659
    { "adcA",        { Eb, Ib } },
1660
    { "sbbA",        { Eb, Ib } },
1661
    { "andA",        { Eb, Ib } },
1662
    { "subA",        { Eb, Ib } },
1663
    { "xorA",        { Eb, Ib } },
1664
    { "cmpA",        { Eb, Ib } },
1665
  },
1666
  /* GRP1S */
1667
  {
1668
    { "addQ",        { Ev, Iv } },
1669
    { "orQ",        { Ev, Iv } },
1670
    { "adcQ",        { Ev, Iv } },
1671
    { "sbbQ",        { Ev, Iv } },
1672
    { "andQ",        { Ev, Iv } },
1673
    { "subQ",        { Ev, Iv } },
1674
    { "xorQ",        { Ev, Iv } },
1675
    { "cmpQ",        { Ev, Iv } },
1676
  },
1677
  /* GRP1Ss */
1678
  {
1679
    { "addQ",        { Ev, sIb } },
1680
    { "orQ",        { Ev, sIb } },
1681
    { "adcQ",        { Ev, sIb } },
1682
    { "sbbQ",        { Ev, sIb } },
1683
    { "andQ",        { Ev, sIb } },
1684
    { "subQ",        { Ev, sIb } },
1685
    { "xorQ",        { Ev, sIb } },
1686
    { "cmpQ",        { Ev, sIb } },
1687
  },
1688
  /* GRP2b */
1689
  {
1690
    { "rolA",        { Eb, Ib } },
1691
    { "rorA",        { Eb, Ib } },
1692
    { "rclA",        { Eb, Ib } },
1693
    { "rcrA",        { Eb, Ib } },
1694
    { "shlA",        { Eb, Ib } },
1695
    { "shrA",        { Eb, Ib } },
1696
    { "(bad)",        { XX } },
1697
    { "sarA",        { Eb, Ib } },
1698
  },
1699
  /* GRP2S */
1700
  {
1701
    { "rolQ",        { Ev, Ib } },
1702
    { "rorQ",        { Ev, Ib } },
1703
    { "rclQ",        { Ev, Ib } },
1704
    { "rcrQ",        { Ev, Ib } },
1705
    { "shlQ",        { Ev, Ib } },
1706
    { "shrQ",        { Ev, Ib } },
1707
    { "(bad)",        { XX } },
1708
    { "sarQ",        { Ev, Ib } },
1709
  },
1710
  /* GRP2b_one */
1711
  {
1712
    { "rolA",        { Eb, I1 } },
1713
    { "rorA",        { Eb, I1 } },
1714
    { "rclA",        { Eb, I1 } },
1715
    { "rcrA",        { Eb, I1 } },
1716
    { "shlA",        { Eb, I1 } },
1717
    { "shrA",        { Eb, I1 } },
1718
    { "(bad)",        { XX } },
1719
    { "sarA",        { Eb, I1 } },
1720
  },
1721
  /* GRP2S_one */
1722
  {
1723
    { "rolQ",        { Ev, I1 } },
1724
    { "rorQ",        { Ev, I1 } },
1725
    { "rclQ",        { Ev, I1 } },
1726
    { "rcrQ",        { Ev, I1 } },
1727
    { "shlQ",        { Ev, I1 } },
1728
    { "shrQ",        { Ev, I1 } },
1729
    { "(bad)",        { XX } },
1730
    { "sarQ",        { Ev, I1 } },
1731
  },
1732
  /* GRP2b_cl */
1733
  {
1734
    { "rolA",        { Eb, CL } },
1735
    { "rorA",        { Eb, CL } },
1736
    { "rclA",        { Eb, CL } },
1737
    { "rcrA",        { Eb, CL } },
1738
    { "shlA",        { Eb, CL } },
1739
    { "shrA",        { Eb, CL } },
1740
    { "(bad)",        { XX } },
1741
    { "sarA",        { Eb, CL } },
1742
  },
1743
  /* GRP2S_cl */
1744
  {
1745
    { "rolQ",        { Ev, CL } },
1746
    { "rorQ",        { Ev, CL } },
1747
    { "rclQ",        { Ev, CL } },
1748
    { "rcrQ",        { Ev, CL } },
1749
    { "shlQ",        { Ev, CL } },
1750
    { "shrQ",        { Ev, CL } },
1751
    { "(bad)",        { XX } },
1752
    { "sarQ",        { Ev, CL } },
1753
  },
1754
  /* GRP3b */
1755
  {
1756
    { "testA",        { Eb, Ib } },
1757
    { "(bad)",        { Eb } },
1758
    { "notA",        { Eb } },
1759
    { "negA",        { Eb } },
1760
    { "mulA",        { Eb } },        /* Don't print the implicit %al register,  */
1761
    { "imulA",        { Eb } },        /* to distinguish these opcodes from other */
1762
    { "divA",        { Eb } },        /* mul/imul opcodes.  Do the same for div  */
1763
    { "idivA",        { Eb } },        /* and idiv for consistency.                   */
1764
  },
1765
  /* GRP3S */
1766
  {
1767
    { "testQ",        { Ev, Iv } },
1768
    { "(bad)",        { XX } },
1769
    { "notQ",        { Ev } },
1770
    { "negQ",        { Ev } },
1771
    { "mulQ",        { Ev } },        /* Don't print the implicit register.  */
1772
    { "imulQ",        { Ev } },
1773
    { "divQ",        { Ev } },
1774
    { "idivQ",        { Ev } },
1775
  },
1776
  /* GRP4 */
1777
  {
1778
    { "incA",        { Eb } },
1779
    { "decA",        { Eb } },
1780
    { "(bad)",        { XX } },
1781
    { "(bad)",        { XX } },
1782
    { "(bad)",        { XX } },
1783
    { "(bad)",        { XX } },
1784
    { "(bad)",        { XX } },
1785
    { "(bad)",        { XX } },
1786
  },
1787
  /* GRP5 */
1788
  {
1789
    { "incQ",        { Ev } },
1790
    { "decQ",        { Ev } },
1791
    { "callT",        { indirEv } },
1792
    { "JcallT",        { indirEp } },
1793
    { "jmpT",        { indirEv } },
1794
    { "JjmpT",        { indirEp } },
1795
    { "pushU",        { stackEv } },
1796
    { "(bad)",        { XX } },
1797
  },
1798
  /* GRP6 */
1799
  {
1800
    { "sldtD",        { Sv } },
1801
    { "strD",        { Sv } },
1802
    { "lldt",        { Ew } },
1803
    { "ltr",        { Ew } },
1804
    { "verr",        { Ew } },
1805
    { "verw",        { Ew } },
1806
    { "(bad)",        { XX } },
1807
    { "(bad)",        { XX } },
1808
  },
1809
  /* GRP7 */
1810
  {
1811
    { "sgdt{Q|IQ||}", { { VMX_Fixup, 0 } } },
1812
    { "sidt{Q|IQ||}", { { PNI_Fixup, 0 } } },
1813
    { "lgdt{Q|Q||}",         { M } },
1814
    { "lidt{Q|Q||}",         { { SVME_Fixup, 0 } } },
1815
    { "smswD",        { Sv } },
1816
    { "(bad)",        { XX } },
1817
    { "lmsw",        { Ew } },
1818
    { "invlpg",        { { INVLPG_Fixup, w_mode } } },
1819
  },
1820
  /* GRP8 */
1821
  {
1822
    { "(bad)",        { XX } },
1823
    { "(bad)",        { XX } },
1824
    { "(bad)",        { XX } },
1825
    { "(bad)",        { XX } },
1826
    { "btQ",        { Ev, Ib } },
1827
    { "btsQ",        { Ev, Ib } },
1828
    { "btrQ",        { Ev, Ib } },
1829
    { "btcQ",        { Ev, Ib } },
1830
  },
1831
  /* GRP9 */
1832
  {
1833
    { "(bad)",        { XX } },
1834
    { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } } },
1835
    { "(bad)",        { XX } },
1836
    { "(bad)",        { XX } },
1837
    { "(bad)",        { XX } },
1838
    { "(bad)",        { XX } },
1839
    { "",        { VM } },                /* See OP_VMX.  */
1840
    { "vmptrst", { Mq } },
1841
  },
1842
  /* GRP11_C6 */
1843
  {
1844
    { "movA",        { Eb, Ib } },
1845
    { "(bad)",        { XX } },
1846
    { "(bad)",        { XX } },
1847
    { "(bad)",        { XX } },
1848
    { "(bad)",        { XX } },
1849
    { "(bad)",        { XX } },
1850
    { "(bad)",        { XX } },
1851
    { "(bad)",        { XX } },
1852
  },
1853
  /* GRP11_C7 */
1854
  {
1855
    { "movQ",        { Ev, Iv } },
1856
    { "(bad)",        { XX } },
1857
    { "(bad)",        { XX } },
1858
    { "(bad)",        { XX } },
1859
    { "(bad)",        { XX } },
1860
    { "(bad)",        { XX } },
1861
    { "(bad)",        { XX } },
1862
    { "(bad)",  { XX } },
1863
  },
1864
  /* GRP12 */
1865
  {
1866
    { "(bad)",        { XX } },
1867
    { "(bad)",        { XX } },
1868
    { "psrlw",        { MS, Ib } },
1869
    { "(bad)",        { XX } },
1870
    { "psraw",        { MS, Ib } },
1871
    { "(bad)",        { XX } },
1872
    { "psllw",        { MS, Ib } },
1873
    { "(bad)",        { XX } },
1874
  },
1875
  /* GRP13 */
1876
  {
1877
    { "(bad)",        { XX } },
1878
    { "(bad)",        { XX } },
1879
    { "psrld",        { MS, Ib } },
1880
    { "(bad)",        { XX } },
1881
    { "psrad",        { MS, Ib } },
1882
    { "(bad)",        { XX } },
1883
    { "pslld",        { MS, Ib } },
1884
    { "(bad)",        { XX } },
1885
  },
1886
  /* GRP14 */
1887
  {
1888
    { "(bad)",        { XX } },
1889
    { "(bad)",        { XX } },
1890
    { "psrlq",        { MS, Ib } },
1891
    { "psrldq",        { MS, Ib } },
1892
    { "(bad)",        { XX } },
1893
    { "(bad)",        { XX } },
1894
    { "psllq",        { MS, Ib } },
1895
    { "pslldq",        { MS, Ib } },
1896
  },
1897
  /* GRP15 */
1898
  {
1899
    { "fxsave",                { Ev } },
1900
    { "fxrstor",        { Ev } },
1901
    { "ldmxcsr",        { Ev } },
1902
    { "stmxcsr",        { Ev } },
1903
    { "(bad)",                { XX } },
1904
    { "lfence",                { { OP_0fae, 0 } } },
1905
    { "mfence",                { { OP_0fae, 0 } } },
1906
    { "clflush",        { { OP_0fae, 0 } } },
1907
  },
1908
  /* GRP16 */
1909
  {
1910
    { "prefetchnta",        { Ev } },
1911
    { "prefetcht0",        { Ev } },
1912
    { "prefetcht1",        { Ev } },
1913
    { "prefetcht2",        { Ev } },
1914
    { "(bad)",                { XX } },
1915
    { "(bad)",                { XX } },
1916
    { "(bad)",                { XX } },
1917
    { "(bad)",                { XX } },
1918
  },
1919
  /* GRPAMD */
1920
  {
1921
    { "prefetch",        { Eb } },
1922
    { "prefetchw",        { Eb } },
1923
    { "(bad)",                { XX } },
1924
    { "(bad)",                { XX } },
1925
    { "(bad)",                { XX } },
1926
    { "(bad)",                { XX } },
1927
    { "(bad)",                { XX } },
1928
    { "(bad)",                { XX } },
1929
  },
1930
  /* GRPPADLCK1 */
1931
  {
1932
    { "xstore-rng",        { { OP_0f07, 0 } } },
1933
    { "xcrypt-ecb",        { { OP_0f07, 0 } } },
1934
    { "xcrypt-cbc",        { { OP_0f07, 0 } } },
1935
    { "xcrypt-ctr",        { { OP_0f07, 0 } } },
1936
    { "xcrypt-cfb",        { { OP_0f07, 0 } } },
1937
    { "xcrypt-ofb",        { { OP_0f07, 0 } } },
1938
    { "(bad)",                { { OP_0f07, 0 } } },
1939
    { "(bad)",                { { OP_0f07, 0 } } },
1940
  },
1941
  /* GRPPADLCK2 */
1942
  {
1943
    { "montmul",        { { OP_0f07, 0 } } },
1944
    { "xsha1",                { { OP_0f07, 0 } } },
1945
    { "xsha256",        { { OP_0f07, 0 } } },
1946
    { "(bad)",                { { OP_0f07, 0 } } },
1947
    { "(bad)",                { { OP_0f07, 0 } } },
1948
    { "(bad)",                { { OP_0f07, 0 } } },
1949
    { "(bad)",                { { OP_0f07, 0 } } },
1950
    { "(bad)",                { { OP_0f07, 0 } } },
1951
  }
1952
};
1953

    
1954
static const struct dis386 prefix_user_table[][4] = {
1955
  /* PREGRP0 */
1956
  {
1957
    { "addps", { XM, EXx } },
1958
    { "addss", { XM, EXd } },
1959
    { "addpd", { XM, EXx } },
1960
    { "addsd", { XM, EXq } },
1961
  },
1962
  /* PREGRP1 */
1963
  {
1964
    { "", { XM, EXx, OPSIMD } },        /* See OP_SIMD_SUFFIX.  */
1965
    { "", { XM, EXx, OPSIMD } },
1966
    { "", { XM, EXx, OPSIMD } },
1967
    { "", { XM, EXx, OPSIMD } },
1968
  },
1969
  /* PREGRP2 */
1970
  {
1971
    { "cvtpi2ps", { XM, EMC } },
1972
    { "cvtsi2ssY", { XM, Ev } },
1973
    { "cvtpi2pd", { XM, EMC } },
1974
    { "cvtsi2sdY", { XM, Ev } },
1975
  },
1976
  /* PREGRP3 */
1977
  {
1978
    { "cvtps2pi", { MXC, EXx } },
1979
    { "cvtss2siY", { Gv, EXx } },
1980
    { "cvtpd2pi", { MXC, EXx } },
1981
    { "cvtsd2siY", { Gv, EXx } },
1982
  },
1983
  /* PREGRP4 */
1984
  {
1985
    { "cvttps2pi", { MXC, EXx } },
1986
    { "cvttss2siY", { Gv, EXx } },
1987
    { "cvttpd2pi", { MXC, EXx } },
1988
    { "cvttsd2siY", { Gv, EXx } },
1989
  },
1990
  /* PREGRP5 */
1991
  {
1992
    { "divps",        { XM, EXx } },
1993
    { "divss",        { XM, EXx } },
1994
    { "divpd",        { XM, EXx } },
1995
    { "divsd",        { XM, EXx } },
1996
  },
1997
  /* PREGRP6 */
1998
  {
1999
    { "maxps",        { XM, EXx } },
2000
    { "maxss",        { XM, EXx } },
2001
    { "maxpd",        { XM, EXx } },
2002
    { "maxsd",        { XM, EXx } },
2003
  },
2004
  /* PREGRP7 */
2005
  {
2006
    { "minps",        { XM, EXx } },
2007
    { "minss",        { XM, EXx } },
2008
    { "minpd",        { XM, EXx } },
2009
    { "minsd",        { XM, EXx } },
2010
  },
2011
  /* PREGRP8 */
2012
  {
2013
    { "movups",        { XM, EXx } },
2014
    { "movss",        { XM, EXx } },
2015
    { "movupd",        { XM, EXx } },
2016
    { "movsd",        { XM, EXx } },
2017
  },
2018
  /* PREGRP9 */
2019
  {
2020
    { "movups",        { EXx,  XM } },
2021
    { "movss",        { EXx,  XM } },
2022
    { "movupd",        { EXx,  XM } },
2023
    { "movsd",        { EXx,  XM } },
2024
  },
2025
  /* PREGRP10 */
2026
  {
2027
    { "mulps",        { XM, EXx } },
2028
    { "mulss",        { XM, EXx } },
2029
    { "mulpd",        { XM, EXx } },
2030
    { "mulsd",        { XM, EXx } },
2031
  },
2032
  /* PREGRP11 */
2033
  {
2034
    { "rcpps",        { XM, EXx } },
2035
    { "rcpss",        { XM, EXx } },
2036
    { "(bad)",        { XM, EXx } },
2037
    { "(bad)",        { XM, EXx } },
2038
  },
2039
  /* PREGRP12 */
2040
  {
2041
    { "rsqrtps",{ XM, EXx } },
2042
    { "rsqrtss",{ XM, EXx } },
2043
    { "(bad)",        { XM, EXx } },
2044
    { "(bad)",        { XM, EXx } },
2045
  },
2046
  /* PREGRP13 */
2047
  {
2048
    { "sqrtps", { XM, EXx } },
2049
    { "sqrtss", { XM, EXx } },
2050
    { "sqrtpd", { XM, EXx } },
2051
    { "sqrtsd",        { XM, EXx } },
2052
  },
2053
  /* PREGRP14 */
2054
  {
2055
    { "subps",        { XM, EXx } },
2056
    { "subss",        { XM, EXx } },
2057
    { "subpd",        { XM, EXx } },
2058
    { "subsd",        { XM, EXx } },
2059
  },
2060
  /* PREGRP15 */
2061
  {
2062
    { "(bad)",        { XM, EXx } },
2063
    { "cvtdq2pd", { XM, EXq } },
2064
    { "cvttpd2dq", { XM, EXx } },
2065
    { "cvtpd2dq", { XM, EXx } },
2066
  },
2067
  /* PREGRP16 */
2068
  {
2069
    { "cvtdq2ps", { XM, EXx } },
2070
    { "cvttps2dq", { XM, EXx } },
2071
    { "cvtps2dq", { XM, EXx } },
2072
    { "(bad)",        { XM, EXx } },
2073
  },
2074
  /* PREGRP17 */
2075
  {
2076
    { "cvtps2pd", { XM, EXq } },
2077
    { "cvtss2sd", { XM, EXx } },
2078
    { "cvtpd2ps", { XM, EXx } },
2079
    { "cvtsd2ss", { XM, EXx } },
2080
  },
2081
  /* PREGRP18 */
2082
  {
2083
    { "maskmovq", { MX, MS } },
2084
    { "(bad)",        { XM, EXx } },
2085
    { "maskmovdqu", { XM, XS } },
2086
    { "(bad)",        { XM, EXx } },
2087
  },
2088
  /* PREGRP19 */
2089
  {
2090
    { "movq",        { MX, EM } },
2091
    { "movdqu",        { XM, EXx } },
2092
    { "movdqa",        { XM, EXx } },
2093
    { "(bad)",        { XM, EXx } },
2094
  },
2095
  /* PREGRP20 */
2096
  {
2097
    { "movq",        { EM, MX } },
2098
    { "movdqu",        { EXx,  XM } },
2099
    { "movdqa",        { EXx,  XM } },
2100
    { "(bad)",        { EXx,  XM } },
2101
  },
2102
  /* PREGRP21 */
2103
  {
2104
    { "(bad)",        { EXx,  XM } },
2105
    { "movq2dq",{ XM, MS } },
2106
    { "movq",        { EXx,  XM } },
2107
    { "movdq2q",{ MX, XS } },
2108
  },
2109
  /* PREGRP22 */
2110
  {
2111
    { "pshufw",        { MX, EM, Ib } },
2112
    { "pshufhw",{ XM, EXx, Ib } },
2113
    { "pshufd",        { XM, EXx, Ib } },
2114
    { "pshuflw",{ XM, EXx, Ib } },
2115
  },
2116
  /* PREGRP23 */
2117
  {
2118
    { "movd",        { Edq, MX } },
2119
    { "movq",        { XM, EXx } },
2120
    { "movd",        { Edq, XM } },
2121
    { "(bad)",        { Ed, XM } },
2122
  },
2123
  /* PREGRP24 */
2124
  {
2125
    { "(bad)",        { MX, EXx } },
2126
    { "(bad)",        { XM, EXx } },
2127
    { "punpckhqdq", { XM, EXx } },
2128
    { "(bad)",        { XM, EXx } },
2129
  },
2130
  /* PREGRP25 */
2131
  {
2132
    { "movntq",        { EM, MX } },
2133
    { "(bad)",        { EM, XM } },
2134
    { "movntdq",{ EM, XM } },
2135
    { "(bad)",        { EM, XM } },
2136
  },
2137
  /* PREGRP26 */
2138
  {
2139
    { "(bad)",        { MX, EXx } },
2140
    { "(bad)",        { XM, EXx } },
2141
    { "punpcklqdq", { XM, EXx } },
2142
    { "(bad)",        { XM, EXx } },
2143
  },
2144
  /* PREGRP27 */
2145
  {
2146
    { "(bad)",        { MX, EXx } },
2147
    { "(bad)",        { XM, EXx } },
2148
    { "addsubpd", { XM, EXx } },
2149
    { "addsubps", { XM, EXx } },
2150
  },
2151
  /* PREGRP28 */
2152
  {
2153
    { "(bad)",        { MX, EXx } },
2154
    { "(bad)",        { XM, EXx } },
2155
    { "haddpd",        { XM, EXx } },
2156
    { "haddps",        { XM, EXx } },
2157
  },
2158
  /* PREGRP29 */
2159
  {
2160
    { "(bad)",        { MX, EXx } },
2161
    { "(bad)",        { XM, EXx } },
2162
    { "hsubpd",        { XM, EXx } },
2163
    { "hsubps",        { XM, EXx } },
2164
  },
2165
  /* PREGRP30 */
2166
  {
2167
    { "movlpX",        { XM, EXq, { SIMD_Fixup, 'h' } } }, /* really only 2 operands */
2168
    { "movsldup", { XM, EXx } },
2169
    { "movlpd",        { XM, EXq } },
2170
    { "movddup", { XM, EXq } },
2171
  },
2172
  /* PREGRP31 */
2173
  {
2174
    { "movhpX",        { XM, EXq, { SIMD_Fixup, 'l' } } },
2175
    { "movshdup", { XM, EXx } },
2176
    { "movhpd",        { XM, EXq } },
2177
    { "(bad)",        { XM, EXq } },
2178
  },
2179
  /* PREGRP32 */
2180
  {
2181
    { "(bad)",        { XM, EXx } },
2182
    { "(bad)",        { XM, EXx } },
2183
    { "(bad)",        { XM, EXx } },
2184
    { "lddqu",        { XM, M } },
2185
  },
2186
  /* PREGRP33 */
2187
  {
2188
    {"movntps", { Ev, XM } },
2189
    {"movntss", { Ev, XM } },
2190
    {"movntpd", { Ev, XM } },
2191
    {"movntsd", { Ev, XM } },
2192
  },
2193

    
2194
  /* PREGRP34 */
2195
  {
2196
    {"vmread",        { Em, Gm } },
2197
    {"(bad)",        { XX } },
2198
    {"extrq",        { XS, Ib, Ib } },
2199
    {"insertq",        { XM, XS, Ib, Ib } },
2200
  },
2201

    
2202
 /* PREGRP35 */
2203
  {
2204
    {"vmwrite",        { Gm, Em } },
2205
    {"(bad)",        { XX } },
2206
    {"extrq",        { XM, XS } },
2207
    {"insertq",        { XM, XS } },
2208
  },
2209

    
2210
  /* PREGRP36 */
2211
  {
2212
    { "bsrS",        { Gv, Ev } },
2213
    { "lzcntS",        { Gv, Ev } },
2214
    { "bsrS",        { Gv, Ev } },
2215
    { "(bad)",        { XX } },
2216
  },
2217

    
2218
  /* PREGRP37 */
2219
  {
2220
    { "(bad)", { XX } },
2221
    { "popcntS", { Gv, Ev } },
2222
    { "(bad)", { XX } },
2223
    { "(bad)", { XX } },
2224
  },
2225

    
2226
  /* PREGRP38 */
2227
  {
2228
    { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
2229
    { "pause", { XX } },
2230
    { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
2231
    { "(bad)", { XX } },
2232
  },
2233

    
2234
  /* PREGRP39 */
2235
  {
2236
    { "(bad)",        { XX } },
2237
    { "(bad)",        { XX } },
2238
    { "pblendvb", {XM, EXx, XMM0 } },
2239
    { "(bad)",        { XX } },
2240
  },
2241

    
2242
  /* PREGRP40 */
2243
  {
2244
    { "(bad)",        { XX } },
2245
    { "(bad)",        { XX } },
2246
    { "blendvps", {XM, EXx, XMM0 } },
2247
    { "(bad)",        { XX } },
2248
  },
2249

    
2250
  /* PREGRP41 */
2251
  {
2252
    { "(bad)",        { XX } },
2253
    { "(bad)",        { XX } },
2254
    { "blendvpd", { XM, EXx, XMM0 } },
2255
    { "(bad)",        { XX } },
2256
  },
2257

    
2258
  /* PREGRP42 */
2259
  {
2260
    { "(bad)",        { XX } },
2261
    { "(bad)",        { XX } },
2262
    { "ptest",  { XM, EXx } },
2263
    { "(bad)",        { XX } },
2264
  },
2265

    
2266
  /* PREGRP43 */
2267
  {
2268
    { "(bad)",        { XX } },
2269
    { "(bad)",        { XX } },
2270
    { "pmovsxbw", { XM, EXx } },
2271
    { "(bad)",        { XX } },
2272
  },
2273

    
2274
  /* PREGRP44 */
2275
  {
2276
    { "(bad)",        { XX } },
2277
    { "(bad)",        { XX } },
2278
    { "pmovsxbd", { XM, EXx } },
2279
    { "(bad)",        { XX } },
2280
  },
2281

    
2282
  /* PREGRP45 */
2283
  {
2284
    { "(bad)",        { XX } },
2285
    { "(bad)",        { XX } },
2286
    { "pmovsxbq", { XM, EXx } },
2287
    { "(bad)",        { XX } },
2288
  },
2289

    
2290
  /* PREGRP46 */
2291
  {
2292
    { "(bad)",        { XX } },
2293
    { "(bad)",        { XX } },
2294
    { "pmovsxwd", { XM, EXx } },
2295
    { "(bad)",        { XX } },
2296
  },
2297

    
2298
  /* PREGRP47 */
2299
  {
2300
    { "(bad)",        { XX } },
2301
    { "(bad)",        { XX } },
2302
    { "pmovsxwq", { XM, EXx } },
2303
    { "(bad)",        { XX } },
2304
  },
2305

    
2306
  /* PREGRP48 */
2307
  {
2308
    { "(bad)",        { XX } },
2309
    { "(bad)",        { XX } },
2310
    { "pmovsxdq", { XM, EXx } },
2311
    { "(bad)",        { XX } },
2312
  },
2313

    
2314
  /* PREGRP49 */
2315
  {
2316
    { "(bad)",        { XX } },
2317
    { "(bad)",        { XX } },
2318
    { "pmuldq", { XM, EXx } },
2319
    { "(bad)",        { XX } },
2320
  },
2321

    
2322
  /* PREGRP50 */
2323
  {
2324
    { "(bad)",        { XX } },
2325
    { "(bad)",        { XX } },
2326
    { "pcmpeqq", { XM, EXx } },
2327
    { "(bad)",        { XX } },
2328
  },
2329

    
2330
  /* PREGRP51 */
2331
  {
2332
    { "(bad)",        { XX } },
2333
    { "(bad)",        { XX } },
2334
    { "movntdqa", { XM, EM } },
2335
    { "(bad)",        { XX } },
2336
  },
2337

    
2338
  /* PREGRP52 */
2339
  {
2340
    { "(bad)",        { XX } },
2341
    { "(bad)",        { XX } },
2342
    { "packusdw", { XM, EXx } },
2343
    { "(bad)",        { XX } },
2344
  },
2345

    
2346
  /* PREGRP53 */
2347
  {
2348
    { "(bad)",        { XX } },
2349
    { "(bad)",        { XX } },
2350
    { "pmovzxbw", { XM, EXx } },
2351
    { "(bad)",        { XX } },
2352
  },
2353

    
2354
  /* PREGRP54 */
2355
  {
2356
    { "(bad)",        { XX } },
2357
    { "(bad)",        { XX } },
2358
    { "pmovzxbd", { XM, EXx } },
2359
    { "(bad)",        { XX } },
2360
  },
2361

    
2362
  /* PREGRP55 */
2363
  {
2364
    { "(bad)",        { XX } },
2365
    { "(bad)",        { XX } },
2366
    { "pmovzxbq", { XM, EXx } },
2367
    { "(bad)",        { XX } },
2368
  },
2369

    
2370
  /* PREGRP56 */
2371
  {
2372
    { "(bad)",        { XX } },
2373
    { "(bad)",        { XX } },
2374
    { "pmovzxwd", { XM, EXx } },
2375
    { "(bad)",        { XX } },
2376
  },
2377

    
2378
  /* PREGRP57 */
2379
  {
2380
    { "(bad)",        { XX } },
2381
    { "(bad)",        { XX } },
2382
    { "pmovzxwq", { XM, EXx } },
2383
    { "(bad)",        { XX } },
2384
  },
2385

    
2386
  /* PREGRP58 */
2387
  {
2388
    { "(bad)",        { XX } },
2389
    { "(bad)",        { XX } },
2390
    { "pmovzxdq", { XM, EXx } },
2391
    { "(bad)",        { XX } },
2392
  },
2393

    
2394
  /* PREGRP59 */
2395
  {
2396
    { "(bad)",        { XX } },
2397
    { "(bad)",        { XX } },
2398
    { "pminsb",        { XM, EXx } },
2399
    { "(bad)",        { XX } },
2400
  },
2401

    
2402
  /* PREGRP60 */
2403
  {
2404
    { "(bad)",        { XX } },
2405
    { "(bad)",        { XX } },
2406
    { "pminsd",        { XM, EXx } },
2407
    { "(bad)",        { XX } },
2408
  },
2409

    
2410
  /* PREGRP61 */
2411
  {
2412
    { "(bad)",        { XX } },
2413
    { "(bad)",        { XX } },
2414
    { "pminuw",        { XM, EXx } },
2415
    { "(bad)",        { XX } },
2416
  },
2417

    
2418
  /* PREGRP62 */
2419
  {
2420
    { "(bad)",        { XX } },
2421
    { "(bad)",        { XX } },
2422
    { "pminud",        { XM, EXx } },
2423
    { "(bad)",        { XX } },
2424
  },
2425

    
2426
  /* PREGRP63 */
2427
  {
2428
    { "(bad)",        { XX } },
2429
    { "(bad)",        { XX } },
2430
    { "pmaxsb",        { XM, EXx } },
2431
    { "(bad)",        { XX } },
2432
  },
2433

    
2434
  /* PREGRP64 */
2435
  {
2436
    { "(bad)",        { XX } },
2437
    { "(bad)",        { XX } },
2438
    { "pmaxsd",        { XM, EXx } },
2439
    { "(bad)",        { XX } },
2440
  },
2441

    
2442
  /* PREGRP65 */
2443
  {
2444
    { "(bad)",        { XX } },
2445
    { "(bad)",        { XX } },
2446
    { "pmaxuw", { XM, EXx } },
2447
    { "(bad)",        { XX } },
2448
  },
2449

    
2450
  /* PREGRP66 */
2451
  {
2452
    { "(bad)",        { XX } },
2453
    { "(bad)",        { XX } },
2454
    { "pmaxud", { XM, EXx } },
2455
    { "(bad)",        { XX } },
2456
  },
2457

    
2458
  /* PREGRP67 */
2459
  {
2460
    { "(bad)",        { XX } },
2461
    { "(bad)",        { XX } },
2462
    { "pmulld", { XM, EXx } },
2463
    { "(bad)",        { XX } },
2464
  },
2465

    
2466
  /* PREGRP68 */
2467
  {
2468
    { "(bad)",        { XX } },
2469
    { "(bad)",        { XX } },
2470
    { "phminposuw", { XM, EXx } },
2471
    { "(bad)",        { XX } },
2472
  },
2473

    
2474
  /* PREGRP69 */
2475
  {
2476
    { "(bad)",        { XX } },
2477
    { "(bad)",        { XX } },
2478
    { "roundps", { XM, EXx, Ib } },
2479
    { "(bad)",        { XX } },
2480
  },
2481

    
2482
  /* PREGRP70 */
2483
  {
2484
    { "(bad)",        { XX } },
2485
    { "(bad)",        { XX } },
2486
    { "roundpd", { XM, EXx, Ib } },
2487
    { "(bad)",        { XX } },
2488
  },
2489

    
2490
  /* PREGRP71 */
2491
  {
2492
    { "(bad)",        { XX } },
2493
    { "(bad)",        { XX } },
2494
    { "roundss", { XM, EXx, Ib } },
2495
    { "(bad)",        { XX } },
2496
  },
2497

    
2498
  /* PREGRP72 */
2499
  {
2500
    { "(bad)",        { XX } },
2501
    { "(bad)",        { XX } },
2502
    { "roundsd", { XM, EXx, Ib } },
2503
    { "(bad)",        { XX } },
2504
  },
2505

    
2506
  /* PREGRP73 */
2507
  {
2508
    { "(bad)",        { XX } },
2509
    { "(bad)",        { XX } },
2510
    { "blendps", { XM, EXx, Ib } },
2511
    { "(bad)",        { XX } },
2512
  },
2513

    
2514
  /* PREGRP74 */
2515
  {
2516
    { "(bad)",        { XX } },
2517
    { "(bad)",        { XX } },
2518
    { "blendpd", { XM, EXx, Ib } },
2519
    { "(bad)",        { XX } },
2520
  },
2521

    
2522
  /* PREGRP75 */
2523
  {
2524
    { "(bad)",        { XX } },
2525
    { "(bad)",        { XX } },
2526
    { "pblendw", { XM, EXx, Ib } },
2527
    { "(bad)",        { XX } },
2528
  },
2529

    
2530
  /* PREGRP76 */
2531
  {
2532
    { "(bad)",        { XX } },
2533
    { "(bad)",        { XX } },
2534
    { "pextrb",        { Edqb, XM, Ib } },
2535
    { "(bad)",        { XX } },
2536
  },
2537

    
2538
  /* PREGRP77 */
2539
  {
2540
    { "(bad)",        { XX } },
2541
    { "(bad)",        { XX } },
2542
    { "pextrw",        { Edqw, XM, Ib } },
2543
    { "(bad)",        { XX } },
2544
  },
2545

    
2546
  /* PREGRP78 */
2547
  {
2548
    { "(bad)",        { XX } },
2549
    { "(bad)",        { XX } },
2550
    { "pextrK",        { Edq, XM, Ib } },
2551
    { "(bad)",        { XX } },
2552
  },
2553

    
2554
  /* PREGRP79 */
2555
  {
2556
    { "(bad)",        { XX } },
2557
    { "(bad)",        { XX } },
2558
    { "extractps", { Edqd, XM, Ib } },
2559
    { "(bad)",        { XX } },
2560
  },
2561

    
2562
  /* PREGRP80 */
2563
  {
2564
    { "(bad)",        { XX } },
2565
    { "(bad)",        { XX } },
2566
    { "pinsrb",        { XM, Edqb, Ib } },
2567
    { "(bad)",        { XX } },
2568
  },
2569

    
2570
  /* PREGRP81 */
2571
  {
2572
    { "(bad)",        { XX } },
2573
    { "(bad)",        { XX } },
2574
    { "insertps", { XM, EXx, Ib } },
2575
    { "(bad)",        { XX } },
2576
  },
2577

    
2578
  /* PREGRP82 */
2579
  {
2580
    { "(bad)",        { XX } },
2581
    { "(bad)",        { XX } },
2582
    { "pinsrK",        { XM, Edq, Ib } },
2583
    { "(bad)",        { XX } },
2584
  },
2585

    
2586
  /* PREGRP83 */
2587
  {
2588
    { "(bad)",        { XX } },
2589
    { "(bad)",        { XX } },
2590
    { "dpps",        { XM, EXx, Ib } },
2591
    { "(bad)",        { XX } },
2592
  },
2593

    
2594
  /* PREGRP84 */
2595
  {
2596
    { "(bad)",        { XX } },
2597
    { "(bad)",        { XX } },
2598
    { "dppd",        { XM, EXx, Ib } },
2599
    { "(bad)",        { XX } },
2600
  },
2601

    
2602
  /* PREGRP85 */
2603
  {
2604
    { "(bad)",        { XX } },
2605
    { "(bad)",        { XX } },
2606
    { "mpsadbw", { XM, EXx, Ib } },
2607
    { "(bad)",        { XX } },
2608
  },
2609

    
2610
  /* PREGRP86 */
2611
  {
2612
    { "(bad)",        { XX } },
2613
    { "(bad)",        { XX } },
2614
    { "pcmpgtq", { XM, EXx } },
2615
    { "(bad)",        { XX } },
2616
  },
2617

    
2618
  /* PREGRP87 */
2619
  {
2620
    { "(bad)",        { XX } },
2621
    { "(bad)",        { XX } },
2622
    { "(bad)",        { XX } },
2623
    { "crc32",        { Gdq, { CRC32_Fixup, b_mode } } },
2624
  },
2625

    
2626
  /* PREGRP88 */
2627
  {
2628
    { "(bad)",        { XX } },
2629
    { "(bad)",        { XX } },
2630
    { "(bad)",        { XX } },
2631
    { "crc32",        { Gdq, { CRC32_Fixup, v_mode } } },
2632
  },
2633

    
2634
  /* PREGRP89 */
2635
  {
2636
    { "(bad)",        { XX } },
2637
    { "(bad)",        { XX } },
2638
    { "pcmpestrm", { XM, EXx, Ib } },
2639
    { "(bad)",        { XX } },
2640
  },
2641

    
2642
  /* PREGRP90 */
2643
  {
2644
    { "(bad)",        { XX } },
2645
    { "(bad)",        { XX } },
2646
    { "pcmpestri", { XM, EXx, Ib } },
2647
    { "(bad)",        { XX } },
2648
  },
2649

    
2650
  /* PREGRP91 */
2651
  {
2652
    { "(bad)",        { XX } },
2653
    { "(bad)",        { XX } },
2654
    { "pcmpistrm", { XM, EXx, Ib } },
2655
    { "(bad)",        { XX } },
2656
  },
2657

    
2658
  /* PREGRP92 */
2659
  {
2660
    { "(bad)",        { XX } },
2661
    { "(bad)",        { XX } },
2662
    { "pcmpistri", { XM, EXx, Ib } },
2663
    { "(bad)",        { XX } },
2664
  },
2665

    
2666
  /* PREGRP93 */
2667
  {
2668
    { "ucomiss",{ XM, EXd } },
2669
    { "(bad)",        { XX } },
2670
    { "ucomisd",{ XM, EXq } },
2671
    { "(bad)",        { XX } },
2672
  },
2673

    
2674
  /* PREGRP94 */
2675
  {
2676
    { "comiss",        { XM, EXd } },
2677
    { "(bad)",        { XX } },
2678
    { "comisd",        { XM, EXq } },
2679
    { "(bad)",        { XX } },
2680
  },
2681

    
2682
  /* PREGRP95 */
2683
  {
2684
    { "punpcklbw",{ MX, EMd } },
2685
    { "(bad)",        { XX } },
2686
    { "punpcklbw",{ MX, EMq } },
2687
    { "(bad)",        { XX } },
2688
  },
2689

    
2690
  /* PREGRP96 */
2691
  {
2692
    { "punpcklwd",{ MX, EMd } },
2693
    { "(bad)",        { XX } },
2694
    { "punpcklwd",{ MX, EMq } },
2695
    { "(bad)",        { XX } },
2696
  },
2697

    
2698
  /* PREGRP97 */
2699
  {
2700
    { "punpckldq",{ MX, EMd } },
2701
    { "(bad)",        { XX } },
2702
    { "punpckldq",{ MX, EMq } },
2703
    { "(bad)",        { XX } },
2704
  },
2705
};
2706

    
2707
static const struct dis386 x86_64_table[][2] = {
2708
  {
2709
    { "pusha{P|}", { XX } },
2710
    { "(bad)", { XX } },
2711
  },
2712
  {
2713
    { "popa{P|}", { XX } },
2714
    { "(bad)", { XX } },
2715
  },
2716
  {
2717
    { "bound{S|}", { Gv, Ma } },
2718
    { "(bad)", { XX } },
2719
  },
2720
  {
2721
    { "arpl", { Ew, Gw } },
2722
    { "movs{||lq|xd}", { Gv, Ed } },
2723
  },
2724
};
2725

    
2726
static const struct dis386 three_byte_table[][256] = {
2727
  /* THREE_BYTE_0 */
2728
  {
2729
    /* 00 */
2730
    { "pshufb", { MX, EM } },
2731
    { "phaddw", { MX, EM } },
2732
    { "phaddd",        { MX, EM } },
2733
    { "phaddsw", { MX, EM } },
2734
    { "pmaddubsw", { MX, EM } },
2735
    { "phsubw", { MX, EM } },
2736
    { "phsubd", { MX, EM } },
2737
    { "phsubsw", { MX, EM } },
2738
    /* 08 */
2739
    { "psignb", { MX, EM } },
2740
    { "psignw", { MX, EM } },
2741
    { "psignd", { MX, EM } },
2742
    { "pmulhrsw", { MX, EM } },
2743
    { "(bad)", { XX } },
2744
    { "(bad)", { XX } },
2745
    { "(bad)", { XX } },
2746
    { "(bad)", { XX } },
2747
    /* 10 */
2748
    { PREGRP39 },
2749
    { "(bad)", { XX } },
2750
    { "(bad)", { XX } },
2751
    { "(bad)", { XX } },
2752
    { PREGRP40 },
2753
    { PREGRP41 },
2754
    { "(bad)", { XX } },
2755
    { PREGRP42 },
2756
    /* 18 */
2757
    { "(bad)", { XX } },
2758
    { "(bad)", { XX } },
2759
    { "(bad)", { XX } },
2760
    { "(bad)", { XX } },
2761
    { "pabsb", { MX, EM } },
2762
    { "pabsw", { MX, EM } },
2763
    { "pabsd", { MX, EM } },
2764
    { "(bad)", { XX } },
2765
    /* 20 */
2766
    { PREGRP43 },
2767
    { PREGRP44 },
2768
    { PREGRP45 },
2769
    { PREGRP46 },
2770
    { PREGRP47 },
2771
    { PREGRP48 },
2772
    { "(bad)", { XX } },
2773
    { "(bad)", { XX } },
2774
    /* 28 */
2775
    { PREGRP49 },
2776
    { PREGRP50 },
2777
    { PREGRP51 },
2778
    { PREGRP52 },
2779
    { "(bad)", { XX } },
2780
    { "(bad)", { XX } },
2781
    { "(bad)", { XX } },
2782
    { "(bad)", { XX } },
2783
    /* 30 */
2784
    { PREGRP53 },
2785
    { PREGRP54 },
2786
    { PREGRP55 },
2787
    { PREGRP56 },
2788
    { PREGRP57 },
2789
    { PREGRP58 },
2790
    { "(bad)", { XX } },
2791
    { PREGRP86 },
2792
    /* 38 */
2793
    { PREGRP59 },
2794
    { PREGRP60 },
2795
    { PREGRP61 },
2796
    { PREGRP62 },
2797
    { PREGRP63 },
2798
    { PREGRP64 },
2799
    { PREGRP65 },
2800
    { PREGRP66 },
2801
    /* 40 */
2802
    { PREGRP67 },
2803
    { PREGRP68 },
2804
    { "(bad)", { XX } },
2805
    { "(bad)", { XX } },
2806
    { "(bad)", { XX } },
2807
    { "(bad)", { XX } },
2808
    { "(bad)", { XX } },
2809
    { "(bad)", { XX } },
2810
    /* 48 */
2811
    { "(bad)", { XX } },
2812
    { "(bad)", { XX } },
2813
    { "(bad)", { XX } },
2814
    { "(bad)", { XX } },
2815
    { "(bad)", { XX } },
2816
    { "(bad)", { XX } },
2817
    { "(bad)", { XX } },
2818
    { "(bad)", { XX } },
2819
    /* 50 */
2820
    { "(bad)", { XX } },
2821
    { "(bad)", { XX } },
2822
    { "(bad)", { XX } },
2823
    { "(bad)", { XX } },
2824
    { "(bad)", { XX } },
2825
    { "(bad)", { XX } },
2826
    { "(bad)", { XX } },
2827
    { "(bad)", { XX } },
2828
    /* 58 */
2829
    { "(bad)", { XX } },
2830
    { "(bad)", { XX } },
2831
    { "(bad)", { XX } },
2832
    { "(bad)", { XX } },
2833
    { "(bad)", { XX } },
2834
    { "(bad)", { XX } },
2835
    { "(bad)", { XX } },
2836
    { "(bad)", { XX } },
2837
    /* 60 */
2838
    { "(bad)", { XX } },
2839
    { "(bad)", { XX } },
2840
    { "(bad)", { XX } },
2841
    { "(bad)", { XX } },
2842
    { "(bad)", { XX } },
2843
    { "(bad)", { XX } },
2844
    { "(bad)", { XX } },
2845
    { "(bad)", { XX } },
2846
    /* 68 */
2847
    { "(bad)", { XX } },
2848
    { "(bad)", { XX } },
2849
    { "(bad)", { XX } },
2850
    { "(bad)", { XX } },
2851
    { "(bad)", { XX } },
2852
    { "(bad)", { XX } },
2853
    { "(bad)", { XX } },
2854
    { "(bad)", { XX } },
2855
    /* 70 */
2856
    { "(bad)", { XX } },
2857
    { "(bad)", { XX } },
2858
    { "(bad)", { XX } },
2859
    { "(bad)", { XX } },
2860
    { "(bad)", { XX } },
2861
    { "(bad)", { XX } },
2862
    { "(bad)", { XX } },
2863
    { "(bad)", { XX } },
2864
    /* 78 */
2865
    { "(bad)", { XX } },
2866
    { "(bad)", { XX } },
2867
    { "(bad)", { XX } },
2868
    { "(bad)", { XX } },
2869
    { "(bad)", { XX } },
2870
    { "(bad)", { XX } },
2871
    { "(bad)", { XX } },
2872
    { "(bad)", { XX } },
2873
    /* 80 */
2874
    { "(bad)", { XX } },
2875
    { "(bad)", { XX } },
2876
    { "(bad)", { XX } },
2877
    { "(bad)", { XX } },
2878
    { "(bad)", { XX } },
2879
    { "(bad)", { XX } },
2880
    { "(bad)", { XX } },
2881
    { "(bad)", { XX } },
2882
    /* 88 */
2883
    { "(bad)", { XX } },
2884
    { "(bad)", { XX } },
2885
    { "(bad)", { XX } },
2886
    { "(bad)", { XX } },
2887
    { "(bad)", { XX } },
2888
    { "(bad)", { XX } },
2889
    { "(bad)", { XX } },
2890
    { "(bad)", { XX } },
2891
    /* 90 */
2892
    { "(bad)", { XX } },
2893
    { "(bad)", { XX } },
2894
    { "(bad)", { XX } },
2895
    { "(bad)", { XX } },
2896
    { "(bad)", { XX } },
2897
    { "(bad)", { XX } },
2898
    { "(bad)", { XX } },
2899
    { "(bad)", { XX } },
2900
    /* 98 */
2901
    { "(bad)", { XX } },
2902
    { "(bad)", { XX } },
2903
    { "(bad)", { XX } },
2904
    { "(bad)", { XX } },
2905
    { "(bad)", { XX } },
2906
    { "(bad)", { XX } },
2907
    { "(bad)", { XX } },
2908
    { "(bad)", { XX } },
2909
    /* a0 */
2910
    { "(bad)", { XX } },
2911
    { "(bad)", { XX } },
2912
    { "(bad)", { XX } },
2913
    { "(bad)", { XX } },
2914
    { "(bad)", { XX } },
2915
    { "(bad)", { XX } },
2916
    { "(bad)", { XX } },
2917
    { "(bad)", { XX } },
2918
    /* a8 */
2919
    { "(bad)", { XX } },
2920
    { "(bad)", { XX } },
2921
    { "(bad)", { XX } },
2922
    { "(bad)", { XX } },
2923
    { "(bad)", { XX } },
2924
    { "(bad)", { XX } },
2925
    { "(bad)", { XX } },
2926
    { "(bad)", { XX } },
2927
    /* b0 */
2928
    { "(bad)", { XX } },
2929
    { "(bad)", { XX } },
2930
    { "(bad)", { XX } },
2931
    { "(bad)", { XX } },
2932
    { "(bad)", { XX } },
2933
    { "(bad)", { XX } },
2934
    { "(bad)", { XX } },
2935
    { "(bad)", { XX } },
2936
    /* b8 */
2937
    { "(bad)", { XX } },
2938
    { "(bad)", { XX } },
2939
    { "(bad)", { XX } },
2940
    { "(bad)", { XX } },
2941
    { "(bad)", { XX } },
2942
    { "(bad)", { XX } },
2943
    { "(bad)", { XX } },
2944
    { "(bad)", { XX } },
2945
    /* c0 */
2946
    { "(bad)", { XX } },
2947
    { "(bad)", { XX } },
2948
    { "(bad)", { XX } },
2949
    { "(bad)", { XX } },
2950
    { "(bad)", { XX } },
2951
    { "(bad)", { XX } },
2952
    { "(bad)", { XX } },
2953
    { "(bad)", { XX } },
2954
    /* c8 */
2955
    { "(bad)", { XX } },
2956
    { "(bad)", { XX } },
2957
    { "(bad)", { XX } },
2958
    { "(bad)", { XX } },
2959
    { "(bad)", { XX } },
2960
    { "(bad)", { XX } },
2961
    { "(bad)", { XX } },
2962
    { "(bad)", { XX } },
2963
    /* d0 */
2964
    { "(bad)", { XX } },
2965
    { "(bad)", { XX } },
2966
    { "(bad)", { XX } },
2967
    { "(bad)", { XX } },
2968
    { "(bad)", { XX } },
2969
    { "(bad)", { XX } },
2970
    { "(bad)", { XX } },
2971
    { "(bad)", { XX } },
2972
    /* d8 */
2973
    { "(bad)", { XX } },
2974
    { "(bad)", { XX } },
2975
    { "(bad)", { XX } },
2976
    { "(bad)", { XX } },
2977
    { "(bad)", { XX } },
2978
    { "(bad)", { XX } },
2979
    { "(bad)", { XX } },
2980
    { "(bad)", { XX } },
2981
    /* e0 */
2982
    { "(bad)", { XX } },
2983
    { "(bad)", { XX } },
2984
    { "(bad)", { XX } },
2985
    { "(bad)", { XX } },
2986
    { "(bad)", { XX } },
2987
    { "(bad)", { XX } },
2988
    { "(bad)", { XX } },
2989
    { "(bad)", { XX } },
2990
    /* e8 */
2991
    { "(bad)", { XX } },
2992
    { "(bad)", { XX } },
2993
    { "(bad)", { XX } },
2994
    { "(bad)", { XX } },
2995
    { "(bad)", { XX } },
2996
    { "(bad)", { XX } },
2997
    { "(bad)", { XX } },
2998
    { "(bad)", { XX } },
2999
    /* f0 */
3000
    { PREGRP87 },
3001
    { PREGRP88 },
3002
    { "(bad)", { XX } },
3003
    { "(bad)", { XX } },
3004
    { "(bad)", { XX } },
3005
    { "(bad)", { XX } },
3006
    { "(bad)", { XX } },
3007
    { "(bad)", { XX } },
3008
    /* f8 */
3009
    { "(bad)", { XX } },
3010
    { "(bad)", { XX } },
3011
    { "(bad)", { XX } },
3012
    { "(bad)", { XX } },
3013
    { "(bad)", { XX } },
3014
    { "(bad)", { XX } },
3015
    { "(bad)", { XX } },
3016
    { "(bad)", { XX } },
3017
  },
3018
  /* THREE_BYTE_1 */
3019
  {
3020
    /* 00 */
3021
    { "(bad)", { XX } },
3022
    { "(bad)", { XX } },
3023
    { "(bad)", { XX } },
3024
    { "(bad)", { XX } },
3025
    { "(bad)", { XX } },
3026
    { "(bad)", { XX } },
3027
    { "(bad)", { XX } },
3028
    { "(bad)", { XX } },
3029
    /* 08 */
3030
    { PREGRP69 },
3031
    { PREGRP70 },
3032
    { PREGRP71 },
3033
    { PREGRP72 },
3034
    { PREGRP73 },
3035
    { PREGRP74 },
3036
    { PREGRP75 },
3037
    { "palignr", { MX, EM, Ib } },
3038
    /* 10 */
3039
    { "(bad)", { XX } },
3040
    { "(bad)", { XX } },
3041
    { "(bad)", { XX } },
3042
    { "(bad)", { XX } },
3043
    { PREGRP76 },
3044
    { PREGRP77 },
3045
    { PREGRP78 },
3046
    { PREGRP79 },
3047
    /* 18 */
3048
    { "(bad)", { XX } },
3049
    { "(bad)", { XX } },
3050
    { "(bad)", { XX } },
3051
    { "(bad)", { XX } },
3052
    { "(bad)", { XX } },
3053
    { "(bad)", { XX } },
3054
    { "(bad)", { XX } },
3055
    { "(bad)", { XX } },
3056
    /* 20 */
3057
    { PREGRP80 },
3058
    { PREGRP81 },
3059
    { PREGRP82 },
3060
    { "(bad)", { XX } },
3061
    { "(bad)", { XX } },
3062
    { "(bad)", { XX } },
3063
    { "(bad)", { XX } },
3064
    { "(bad)", { XX } },
3065
    /* 28 */
3066
    { "(bad)", { XX } },
3067
    { "(bad)", { XX } },
3068
    { "(bad)", { XX } },
3069
    { "(bad)", { XX } },
3070
    { "(bad)", { XX } },
3071
    { "(bad)", { XX } },
3072
    { "(bad)", { XX } },
3073
    { "(bad)", { XX } },
3074
    /* 30 */
3075
    { "(bad)", { XX } },
3076
    { "(bad)", { XX } },
3077
    { "(bad)", { XX } },
3078
    { "(bad)", { XX } },
3079
    { "(bad)", { XX } },
3080
    { "(bad)", { XX } },
3081
    { "(bad)", { XX } },
3082
    { "(bad)", { XX } },
3083
    /* 38 */
3084
    { "(bad)", { XX } },
3085
    { "(bad)", { XX } },
3086
    { "(bad)", { XX } },
3087
    { "(bad)", { XX } },
3088
    { "(bad)", { XX } },
3089
    { "(bad)", { XX } },
3090
    { "(bad)", { XX } },
3091
    { "(bad)", { XX } },
3092
    /* 40 */
3093
    { PREGRP83 },
3094
    { PREGRP84 },
3095
    { PREGRP85 },
3096
    { "(bad)", { XX } },
3097
    { "(bad)", { XX } },
3098
    { "(bad)", { XX } },
3099
    { "(bad)", { XX } },
3100
    { "(bad)", { XX } },
3101
    /* 48 */
3102
    { "(bad)", { XX } },
3103
    { "(bad)", { XX } },
3104
    { "(bad)", { XX } },
3105
    { "(bad)", { XX } },
3106
    { "(bad)", { XX } },
3107
    { "(bad)", { XX } },
3108
    { "(bad)", { XX } },
3109
    { "(bad)", { XX } },
3110
    /* 50 */
3111
    { "(bad)", { XX } },
3112
    { "(bad)", { XX } },
3113
    { "(bad)", { XX } },
3114
    { "(bad)", { XX } },
3115
    { "(bad)", { XX } },
3116
    { "(bad)", { XX } },
3117
    { "(bad)", { XX } },
3118
    { "(bad)", { XX } },
3119
    /* 58 */
3120
    { "(bad)", { XX } },
3121
    { "(bad)", { XX } },
3122
    { "(bad)", { XX } },
3123
    { "(bad)", { XX } },
3124
    { "(bad)", { XX } },
3125
    { "(bad)", { XX } },
3126
    { "(bad)", { XX } },
3127
    { "(bad)", { XX } },
3128
    /* 60 */
3129
    { PREGRP89 },
3130
    { PREGRP90 },
3131
    { PREGRP91 },
3132
    { PREGRP92 },
3133
    { "(bad)", { XX } },
3134
    { "(bad)", { XX } },
3135
    { "(bad)", { XX } },
3136
    { "(bad)", { XX } },
3137
    /* 68 */
3138
    { "(bad)", { XX } },
3139
    { "(bad)", { XX } },
3140
    { "(bad)", { XX } },
3141
    { "(bad)", { XX } },
3142
    { "(bad)", { XX } },
3143
    { "(bad)", { XX } },
3144
    { "(bad)", { XX } },
3145
    { "(bad)", { XX } },
3146
    /* 70 */
3147
    { "(bad)", { XX } },
3148
    { "(bad)", { XX } },
3149
    { "(bad)", { XX } },
3150
    { "(bad)", { XX } },
3151
    { "(bad)", { XX } },
3152
    { "(bad)", { XX } },
3153
    { "(bad)", { XX } },
3154
    { "(bad)", { XX } },
3155
    /* 78 */
3156
    { "(bad)", { XX } },
3157
    { "(bad)", { XX } },
3158
    { "(bad)", { XX } },
3159
    { "(bad)", { XX } },
3160
    { "(bad)", { XX } },
3161
    { "(bad)", { XX } },
3162
    { "(bad)", { XX } },
3163
    { "(bad)", { XX } },
3164
    /* 80 */
3165
    { "(bad)", { XX } },
3166
    { "(bad)", { XX } },
3167
    { "(bad)", { XX } },
3168
    { "(bad)", { XX } },
3169
    { "(bad)", { XX } },
3170
    { "(bad)", { XX } },
3171
    { "(bad)", { XX } },
3172
    { "(bad)", { XX } },
3173
    /* 88 */
3174
    { "(bad)", { XX } },
3175
    { "(bad)", { XX } },
3176
    { "(bad)", { XX } },
3177
    { "(bad)", { XX } },
3178
    { "(bad)", { XX } },
3179
    { "(bad)", { XX } },
3180
    { "(bad)", { XX } },
3181
    { "(bad)", { XX } },
3182
    /* 90 */
3183
    { "(bad)", { XX } },
3184
    { "(bad)", { XX } },
3185
    { "(bad)", { XX } },
3186
    { "(bad)", { XX } },
3187
    { "(bad)", { XX } },
3188
    { "(bad)", { XX } },
3189
    { "(bad)", { XX } },
3190
    { "(bad)", { XX } },
3191
    /* 98 */
3192
    { "(bad)", { XX } },
3193
    { "(bad)", { XX } },
3194
    { "(bad)", { XX } },
3195
    { "(bad)", { XX } },
3196
    { "(bad)", { XX } },
3197
    { "(bad)", { XX } },
3198
    { "(bad)", { XX } },
3199
    { "(bad)", { XX } },
3200
    /* a0 */
3201
    { "(bad)", { XX } },
3202
    { "(bad)", { XX } },
3203
    { "(bad)", { XX } },
3204
    { "(bad)", { XX } },
3205
    { "(bad)", { XX } },
3206
    { "(bad)", { XX } },
3207
    { "(bad)", { XX } },
3208
    { "(bad)", { XX } },
3209
    /* a8 */
3210
    { "(bad)", { XX } },
3211
    { "(bad)", { XX } },
3212
    { "(bad)", { XX } },
3213
    { "(bad)", { XX } },
3214
    { "(bad)", { XX } },
3215
    { "(bad)", { XX } },
3216
    { "(bad)", { XX } },
3217
    { "(bad)", { XX } },
3218
    /* b0 */
3219
    { "(bad)", { XX } },
3220
    { "(bad)", { XX } },
3221
    { "(bad)", { XX } },
3222
    { "(bad)", { XX } },
3223
    { "(bad)", { XX } },
3224
    { "(bad)", { XX } },
3225
    { "(bad)", { XX } },
3226
    { "(bad)", { XX } },
3227
    /* b8 */
3228
    { "(bad)", { XX } },
3229
    { "(bad)", { XX } },
3230
    { "(bad)", { XX } },
3231
    { "(bad)", { XX } },
3232
    { "(bad)", { XX } },
3233
    { "(bad)", { XX } },
3234
    { "(bad)", { XX } },
3235
    { "(bad)", { XX } },
3236
    /* c0 */
3237
    { "(bad)", { XX } },
3238
    { "(bad)", { XX } },
3239
    { "(bad)", { XX } },
3240
    { "(bad)", { XX } },
3241
    { "(bad)", { XX } },
3242
    { "(bad)", { XX } },
3243
    { "(bad)", { XX } },
3244
    { "(bad)", { XX } },
3245
    /* c8 */
3246
    { "(bad)", { XX } },
3247
    { "(bad)", { XX } },
3248
    { "(bad)", { XX } },
3249
    { "(bad)", { XX } },
3250
    { "(bad)", { XX } },
3251
    { "(bad)", { XX } },
3252
    { "(bad)", { XX } },
3253
    { "(bad)", { XX } },
3254
    /* d0 */
3255
    { "(bad)", { XX } },
3256
    { "(bad)", { XX } },
3257
    { "(bad)", { XX } },
3258
    { "(bad)", { XX } },
3259
    { "(bad)", { XX } },
3260
    { "(bad)", { XX } },
3261
    { "(bad)", { XX } },
3262
    { "(bad)", { XX } },
3263
    /* d8 */
3264
    { "(bad)", { XX } },
3265
    { "(bad)", { XX } },
3266
    { "(bad)", { XX } },
3267
    { "(bad)", { XX } },
3268
    { "(bad)", { XX } },
3269
    { "(bad)", { XX } },
3270
    { "(bad)", { XX } },
3271
    { "(bad)", { XX } },
3272
    /* e0 */
3273
    { "(bad)", { XX } },
3274
    { "(bad)", { XX } },
3275
    { "(bad)", { XX } },
3276
    { "(bad)", { XX } },
3277
    { "(bad)", { XX } },
3278
    { "(bad)", { XX } },
3279
    { "(bad)", { XX } },
3280
    { "(bad)", { XX } },
3281
    /* e8 */
3282
    { "(bad)", { XX } },
3283
    { "(bad)", { XX } },
3284
    { "(bad)", { XX } },
3285
    { "(bad)", { XX } },
3286
    { "(bad)", { XX } },
3287
    { "(bad)", { XX } },
3288
    { "(bad)", { XX } },
3289
    { "(bad)", { XX } },
3290
    /* f0 */
3291
    { "(bad)", { XX } },
3292
    { "(bad)", { XX } },
3293
    { "(bad)", { XX } },
3294
    { "(bad)", { XX } },
3295
    { "(bad)", { XX } },
3296
    { "(bad)", { XX } },
3297
    { "(bad)", { XX } },
3298
    { "(bad)", { XX } },
3299
    /* f8 */
3300
    { "(bad)", { XX } },
3301
    { "(bad)", { XX } },
3302
    { "(bad)", { XX } },
3303
    { "(bad)", { XX } },
3304
    { "(bad)", { XX } },
3305
    { "(bad)", { XX } },
3306
    { "(bad)", { XX } },
3307
    { "(bad)", { XX } },
3308
  }
3309
};
3310

    
3311
#define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
3312

    
3313
static void
3314
ckprefix (void)
3315
{
3316
  int newrex;
3317
  rex = 0;
3318
  prefixes = 0;
3319
  used_prefixes = 0;
3320
  rex_used = 0;
3321
  while (1)
3322
    {
3323
      FETCH_DATA (the_info, codep + 1);
3324
      newrex = 0;
3325
      switch (*codep)
3326
        {
3327
        /* REX prefixes family.  */
3328
        case 0x40:
3329
        case 0x41:
3330
        case 0x42:
3331
        case 0x43:
3332
        case 0x44:
3333
        case 0x45:
3334
        case 0x46:
3335
        case 0x47:
3336
        case 0x48:
3337
        case 0x49:
3338
        case 0x4a:
3339
        case 0x4b:
3340
        case 0x4c:
3341
        case 0x4d:
3342
        case 0x4e:
3343
        case 0x4f:
3344
            if (address_mode == mode_64bit)
3345
              newrex = *codep;
3346
            else
3347
              return;
3348
          break;
3349
        case 0xf3:
3350
          prefixes |= PREFIX_REPZ;
3351
          break;
3352
        case 0xf2:
3353
          prefixes |= PREFIX_REPNZ;
3354
          break;
3355
        case 0xf0:
3356
          prefixes |= PREFIX_LOCK;
3357
          break;
3358
        case 0x2e:
3359
          prefixes |= PREFIX_CS;
3360
          break;
3361
        case 0x36:
3362
          prefixes |= PREFIX_SS;
3363
          break;
3364
        case 0x3e:
3365
          prefixes |= PREFIX_DS;
3366
          break;
3367
        case 0x26:
3368
          prefixes |= PREFIX_ES;
3369
          break;
3370
        case 0x64:
3371
          prefixes |= PREFIX_FS;
3372
          break;
3373
        case 0x65:
3374
          prefixes |= PREFIX_GS;
3375
          break;
3376
        case 0x66:
3377
          prefixes |= PREFIX_DATA;
3378
          break;
3379
        case 0x67:
3380
          prefixes |= PREFIX_ADDR;
3381
          break;
3382
        case FWAIT_OPCODE:
3383
          /* fwait is really an instruction.  If there are prefixes
3384
             before the fwait, they belong to the fwait, *not* to the
3385
             following instruction.  */
3386
          if (prefixes || rex)
3387
            {
3388
              prefixes |= PREFIX_FWAIT;
3389
              codep++;
3390
              return;
3391
            }
3392
          prefixes = PREFIX_FWAIT;
3393
          break;
3394
        default:
3395
          return;
3396
        }
3397
      /* Rex is ignored when followed by another prefix.  */
3398
      if (rex)
3399
        {
3400
          rex_used = rex;
3401
          return;
3402
        }
3403
      rex = newrex;
3404
      codep++;
3405
    }
3406
}
3407

    
3408
/* Return the name of the prefix byte PREF, or NULL if PREF is not a
3409
   prefix byte.  */
3410

    
3411
static const char *
3412
prefix_name (int pref, int sizeflag)
3413
{
3414
  static const char * const rexes [16] =
3415
    {
3416
      "rex",                /* 0x40 */
3417
      "rex.B",                /* 0x41 */
3418
      "rex.X",                /* 0x42 */
3419
      "rex.XB",                /* 0x43 */
3420
      "rex.R",                /* 0x44 */
3421
      "rex.RB",                /* 0x45 */
3422
      "rex.RX",                /* 0x46 */
3423
      "rex.RXB",        /* 0x47 */
3424
      "rex.W",                /* 0x48 */
3425
      "rex.WB",                /* 0x49 */
3426
      "rex.WX",                /* 0x4a */
3427
      "rex.WXB",        /* 0x4b */
3428
      "rex.WR",                /* 0x4c */
3429
      "rex.WRB",        /* 0x4d */
3430
      "rex.WRX",        /* 0x4e */
3431
      "rex.WRXB",        /* 0x4f */
3432
    };
3433

    
3434
  switch (pref)
3435
    {
3436
    /* REX prefixes family.  */
3437
    case 0x40:
3438
    case 0x41:
3439
    case 0x42:
3440
    case 0x43:
3441
    case 0x44:
3442
    case 0x45:
3443
    case 0x46:
3444
    case 0x47:
3445
    case 0x48:
3446
    case 0x49:
3447
    case 0x4a:
3448
    case 0x4b:
3449
    case 0x4c:
3450
    case 0x4d:
3451
    case 0x4e:
3452
    case 0x4f:
3453
      return rexes [pref - 0x40];
3454
    case 0xf3:
3455
      return "repz";
3456
    case 0xf2:
3457
      return "repnz";
3458
    case 0xf0:
3459
      return "lock";
3460
    case 0x2e:
3461
      return "cs";
3462
    case 0x36:
3463
      return "ss";
3464
    case 0x3e:
3465
      return "ds";
3466
    case 0x26:
3467
      return "es";
3468
    case 0x64:
3469
      return "fs";
3470
    case 0x65:
3471
      return "gs";
3472
    case 0x66:
3473
      return (sizeflag & DFLAG) ? "data16" : "data32";
3474
    case 0x67:
3475
      if (address_mode == mode_64bit)
3476
        return (sizeflag & AFLAG) ? "addr32" : "addr64";
3477
      else
3478
        return (sizeflag & AFLAG) ? "addr16" : "addr32";
3479
    case FWAIT_OPCODE:
3480
      return "fwait";
3481
    default:
3482
      return NULL;
3483
    }
3484
}
3485

    
3486
static char op_out[MAX_OPERANDS][100];
3487
static int op_ad, op_index[MAX_OPERANDS];
3488
static int two_source_ops;
3489
static bfd_vma op_address[MAX_OPERANDS];
3490
static bfd_vma op_riprel[MAX_OPERANDS];
3491
static bfd_vma start_pc;
3492

    
3493
/*
3494
 *   On the 386's of 1988, the maximum length of an instruction is 15 bytes.
3495
 *   (see topic "Redundant prefixes" in the "Differences from 8086"
3496
 *   section of the "Virtual 8086 Mode" chapter.)
3497
 * 'pc' should be the address of this instruction, it will
3498
 *   be used to print the target address if this is a relative jump or call
3499
 * The function returns the length of this instruction in bytes.
3500
 */
3501

    
3502
static char intel_syntax;
3503
static char open_char;
3504
static char close_char;
3505
static char separator_char;
3506
static char scale_char;
3507

    
3508
int
3509
print_insn_i386 (bfd_vma pc, disassemble_info *info)
3510
{
3511
  intel_syntax = -1;
3512

    
3513
  return print_insn (pc, info);
3514
}
3515

    
3516
static int
3517
print_insn (bfd_vma pc, disassemble_info *info)
3518
{
3519
  const struct dis386 *dp;
3520
  int i;
3521
  char *op_txt[MAX_OPERANDS];
3522
  int needcomma;
3523
  unsigned char uses_DATA_prefix, uses_LOCK_prefix;
3524
  unsigned char uses_REPNZ_prefix, uses_REPZ_prefix;
3525
  int sizeflag;
3526
  const char *p;
3527
  struct dis_private priv;
3528
  unsigned char op;
3529

    
3530
  if (info->mach == bfd_mach_x86_64_intel_syntax
3531
      || info->mach == bfd_mach_x86_64)
3532
    address_mode = mode_64bit;
3533
  else
3534
    address_mode = mode_32bit;
3535

    
3536
  if (intel_syntax == (char) -1)
3537
    intel_syntax = (info->mach == bfd_mach_i386_i386_intel_syntax
3538
                    || info->mach == bfd_mach_x86_64_intel_syntax);
3539

    
3540
  if (info->mach == bfd_mach_i386_i386
3541
      || info->mach == bfd_mach_x86_64
3542
      || info->mach == bfd_mach_i386_i386_intel_syntax
3543
      || info->mach == bfd_mach_x86_64_intel_syntax)
3544
    priv.orig_sizeflag = AFLAG | DFLAG;
3545
  else if (info->mach == bfd_mach_i386_i8086)
3546
    priv.orig_sizeflag = 0;
3547
  else
3548
    abort ();
3549

    
3550
  for (p = info->disassembler_options; p != NULL; )
3551
    {
3552
      if (strncmp (p, "x86-64", 6) == 0)
3553
        {
3554
          address_mode = mode_64bit;
3555
          priv.orig_sizeflag = AFLAG | DFLAG;
3556
        }
3557
      else if (strncmp (p, "i386", 4) == 0)
3558
        {
3559
          address_mode = mode_32bit;
3560
          priv.orig_sizeflag = AFLAG | DFLAG;
3561
        }
3562
      else if (strncmp (p, "i8086", 5) == 0)
3563
        {
3564
          address_mode = mode_16bit;
3565
          priv.orig_sizeflag = 0;
3566
        }
3567
      else if (strncmp (p, "intel", 5) == 0)
3568
        {
3569
          intel_syntax = 1;
3570
        }
3571
      else if (strncmp (p, "att", 3) == 0)
3572
        {
3573
          intel_syntax = 0;
3574
        }
3575
      else if (strncmp (p, "addr", 4) == 0)
3576
        {
3577
          if (address_mode == mode_64bit)
3578
            {
3579
              if (p[4] == '3' && p[5] == '2')
3580
                priv.orig_sizeflag &= ~AFLAG;
3581
              else if (p[4] == '6' && p[5] == '4')
3582
                priv.orig_sizeflag |= AFLAG;
3583
            }
3584
          else
3585
            {
3586
              if (p[4] == '1' && p[5] == '6')
3587
                priv.orig_sizeflag &= ~AFLAG;
3588
              else if (p[4] == '3' && p[5] == '2')
3589
                priv.orig_sizeflag |= AFLAG;
3590
            }
3591
        }
3592
      else if (strncmp (p, "data", 4) == 0)
3593
        {
3594
          if (p[4] == '1' && p[5] == '6')
3595
            priv.orig_sizeflag &= ~DFLAG;
3596
          else if (p[4] == '3' && p[5] == '2')
3597
            priv.orig_sizeflag |= DFLAG;
3598
        }
3599
      else if (strncmp (p, "suffix", 6) == 0)
3600
        priv.orig_sizeflag |= SUFFIX_ALWAYS;
3601

    
3602
      p = strchr (p, ',');
3603
      if (p != NULL)
3604
        p++;
3605
    }
3606

    
3607
  if (intel_syntax)
3608
    {
3609
      names64 = intel_names64;
3610
      names32 = intel_names32;
3611
      names16 = intel_names16;
3612
      names8 = intel_names8;
3613
      names8rex = intel_names8rex;
3614
      names_seg = intel_names_seg;
3615
      index16 = intel_index16;
3616
      open_char = '[';
3617
      close_char = ']';
3618
      separator_char = '+';
3619
      scale_char = '*';
3620
    }
3621
  else
3622
    {
3623
      names64 = att_names64;
3624
      names32 = att_names32;
3625
      names16 = att_names16;
3626
      names8 = att_names8;
3627
      names8rex = att_names8rex;
3628
      names_seg = att_names_seg;
3629
      index16 = att_index16;
3630
      open_char = '(';
3631
      close_char =  ')';
3632
      separator_char = ',';
3633
      scale_char = ',';
3634
    }
3635

    
3636
  /* The output looks better if we put 7 bytes on a line, since that
3637
     puts most long word instructions on a single line.  */
3638
  info->bytes_per_line = 7;
3639

    
3640
  info->private_data = &priv;
3641
  priv.max_fetched = priv.the_buffer;
3642
  priv.insn_start = pc;
3643

    
3644
  obuf[0] = 0;
3645
  for (i = 0; i < MAX_OPERANDS; ++i)
3646
    {
3647
      op_out[i][0] = 0;
3648
      op_index[i] = -1;
3649
    }
3650

    
3651
  the_info = info;
3652
  start_pc = pc;
3653
  start_codep = priv.the_buffer;
3654
  codep = priv.the_buffer;
3655

    
3656
  if (setjmp (priv.bailout) != 0)
3657
    {
3658
      const char *name;
3659

    
3660
      /* Getting here means we tried for data but didn't get it.  That
3661
         means we have an incomplete instruction of some sort.  Just
3662
         print the first byte as a prefix or a .byte pseudo-op.  */
3663
      if (codep > priv.the_buffer)
3664
        {
3665
          name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
3666
          if (name != NULL)
3667
            (*info->fprintf_func) (info->stream, "%s", name);
3668
          else
3669
            {
3670
              /* Just print the first byte as a .byte instruction.  */
3671
              (*info->fprintf_func) (info->stream, ".byte 0x%x",
3672
                                     (unsigned int) priv.the_buffer[0]);
3673
            }
3674

    
3675
          return 1;
3676
        }
3677

    
3678
      return -1;
3679
    }
3680

    
3681
  obufp = obuf;
3682
  ckprefix ();
3683

    
3684
  insn_codep = codep;
3685
  sizeflag = priv.orig_sizeflag;
3686

    
3687
  FETCH_DATA (info, codep + 1);
3688
  two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
3689

    
3690
  if (((prefixes & PREFIX_FWAIT)
3691
       && ((*codep < 0xd8) || (*codep > 0xdf)))
3692
      || (rex && rex_used))
3693
    {
3694
      const char *name;
3695

    
3696
      /* fwait not followed by floating point instruction, or rex followed
3697
         by other prefixes.  Print the first prefix.  */
3698
      name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
3699
      if (name == NULL)
3700
        name = INTERNAL_DISASSEMBLER_ERROR;
3701
      (*info->fprintf_func) (info->stream, "%s", name);
3702
      return 1;
3703
    }
3704

    
3705
  op = 0;
3706
  if (*codep == 0x0f)
3707
    {
3708
      unsigned char threebyte;
3709
      FETCH_DATA (info, codep + 2);
3710
      threebyte = *++codep;
3711
      dp = &dis386_twobyte[threebyte];
3712
      need_modrm = twobyte_has_modrm[*codep];
3713
      uses_DATA_prefix = twobyte_uses_DATA_prefix[*codep];
3714
      uses_REPNZ_prefix = twobyte_uses_REPNZ_prefix[*codep];
3715
      uses_REPZ_prefix = twobyte_uses_REPZ_prefix[*codep];
3716
      uses_LOCK_prefix = (*codep & ~0x02) == 0x20;
3717
      codep++;
3718
      if (dp->name == NULL && dp->op[0].bytemode == IS_3BYTE_OPCODE)
3719
        {
3720
          FETCH_DATA (info, codep + 2);
3721
          op = *codep++;
3722
          switch (threebyte)
3723
            {
3724
            case 0x38:
3725
              uses_DATA_prefix = threebyte_0x38_uses_DATA_prefix[op];
3726
              uses_REPNZ_prefix = threebyte_0x38_uses_REPNZ_prefix[op];
3727
              uses_REPZ_prefix = threebyte_0x38_uses_REPZ_prefix[op];
3728
              break;
3729
            case 0x3a:
3730
              uses_DATA_prefix = threebyte_0x3a_uses_DATA_prefix[op];
3731
              uses_REPNZ_prefix = threebyte_0x3a_uses_REPNZ_prefix[op];
3732
              uses_REPZ_prefix = threebyte_0x3a_uses_REPZ_prefix[op];
3733
              break;
3734
            default:
3735
              break;
3736
            }
3737
        }
3738
    }
3739
  else
3740
    {
3741
      dp = &dis386[*codep];
3742
      need_modrm = onebyte_has_modrm[*codep];
3743
      uses_DATA_prefix = 0;
3744
      uses_REPNZ_prefix = 0;
3745
      /* pause is 0xf3 0x90.  */
3746
      uses_REPZ_prefix = *codep == 0x90;
3747
      uses_LOCK_prefix = 0;
3748
      codep++;
3749
    }
3750

    
3751
  if (!uses_REPZ_prefix && (prefixes & PREFIX_REPZ))
3752
    {
3753
      oappend ("repz ");
3754
      used_prefixes |= PREFIX_REPZ;
3755
    }
3756
  if (!uses_REPNZ_prefix && (prefixes & PREFIX_REPNZ))
3757
    {
3758
      oappend ("repnz ");
3759
      used_prefixes |= PREFIX_REPNZ;
3760
    }
3761

    
3762
  if (!uses_LOCK_prefix && (prefixes & PREFIX_LOCK))
3763
    {
3764
      oappend ("lock ");
3765
      used_prefixes |= PREFIX_LOCK;
3766
    }
3767

    
3768
  if (prefixes & PREFIX_ADDR)
3769
    {
3770
      sizeflag ^= AFLAG;
3771
      if (dp->op[2].bytemode != loop_jcxz_mode || intel_syntax)
3772
        {
3773
          if ((sizeflag & AFLAG) || address_mode == mode_64bit)
3774
            oappend ("addr32 ");
3775
          else
3776
            oappend ("addr16 ");
3777
          used_prefixes |= PREFIX_ADDR;
3778
        }
3779
    }
3780

    
3781
  if (!uses_DATA_prefix && (prefixes & PREFIX_DATA))
3782
    {
3783
      sizeflag ^= DFLAG;
3784
      if (dp->op[2].bytemode == cond_jump_mode
3785
          && dp->op[0].bytemode == v_mode
3786
          && !intel_syntax)
3787
        {
3788
          if (sizeflag & DFLAG)
3789
            oappend ("data32 ");
3790
          else
3791
            oappend ("data16 ");
3792
          used_prefixes |= PREFIX_DATA;
3793
        }
3794
    }
3795

    
3796
  if (dp->name == NULL && dp->op[0].bytemode == IS_3BYTE_OPCODE)
3797
    {
3798
      dp = &three_byte_table[dp->op[1].bytemode][op];
3799
      modrm.mod = (*codep >> 6) & 3;
3800
      modrm.reg = (*codep >> 3) & 7;
3801
      modrm.rm = *codep & 7;
3802
    }
3803
  else if (need_modrm)
3804
    {
3805
      FETCH_DATA (info, codep + 1);
3806
      modrm.mod = (*codep >> 6) & 3;
3807
      modrm.reg = (*codep >> 3) & 7;
3808
      modrm.rm = *codep & 7;
3809
    }
3810

    
3811
  if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
3812
    {
3813
      dofloat (sizeflag);
3814
    }
3815
  else
3816
    {
3817
      int index;
3818
      if (dp->name == NULL)
3819
        {
3820
          switch (dp->op[0].bytemode)
3821
            {
3822
            case USE_GROUPS:
3823
              dp = &grps[dp->op[1].bytemode][modrm.reg];
3824
              break;
3825

    
3826
            case USE_PREFIX_USER_TABLE:
3827
              index = 0;
3828
              used_prefixes |= (prefixes & PREFIX_REPZ);
3829
              if (prefixes & PREFIX_REPZ)
3830
                index = 1;
3831
              else
3832
                {
3833
                  /* We should check PREFIX_REPNZ and PREFIX_REPZ
3834
                     before PREFIX_DATA.  */
3835
                  used_prefixes |= (prefixes & PREFIX_REPNZ);
3836
                  if (prefixes & PREFIX_REPNZ)
3837
                    index = 3;
3838
                  else
3839
                    {
3840
                      used_prefixes |= (prefixes & PREFIX_DATA);
3841
                      if (prefixes & PREFIX_DATA)
3842
                        index = 2;
3843
                    }
3844
                }
3845
              dp = &prefix_user_table[dp->op[1].bytemode][index];
3846
              break;
3847

    
3848
            case X86_64_SPECIAL:
3849
              index = address_mode == mode_64bit ? 1 : 0;
3850
              dp = &x86_64_table[dp->op[1].bytemode][index];
3851
              break;
3852

    
3853
            default:
3854
              oappend (INTERNAL_DISASSEMBLER_ERROR);
3855
              break;
3856
            }
3857
        }
3858

    
3859
      if (putop (dp->name, sizeflag) == 0)
3860
        {
3861
          for (i = 0; i < MAX_OPERANDS; ++i)
3862
            {
3863
              obufp = op_out[i];
3864
              op_ad = MAX_OPERANDS - 1 - i;
3865
              if (dp->op[i].rtn)
3866
                (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
3867
            }
3868
        }
3869
    }
3870

    
3871
  /* See if any prefixes were not used.  If so, print the first one
3872
     separately.  If we don't do this, we'll wind up printing an
3873
     instruction stream which does not precisely correspond to the
3874
     bytes we are disassembling.  */
3875
  if ((prefixes & ~used_prefixes) != 0)
3876
    {
3877
      const char *name;
3878

    
3879
      name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
3880
      if (name == NULL)
3881
        name = INTERNAL_DISASSEMBLER_ERROR;
3882
      (*info->fprintf_func) (info->stream, "%s", name);
3883
      return 1;
3884
    }
3885
  if (rex & ~rex_used)
3886
    {
3887
      const char *name;
3888
      name = prefix_name (rex | 0x40, priv.orig_sizeflag);
3889
      if (name == NULL)
3890
        name = INTERNAL_DISASSEMBLER_ERROR;
3891
      (*info->fprintf_func) (info->stream, "%s ", name);
3892
    }
3893

    
3894
  obufp = obuf + strlen (obuf);
3895
  for (i = strlen (obuf); i < 6; i++)
3896
    oappend (" ");
3897
  oappend (" ");
3898
  (*info->fprintf_func) (info->stream, "%s", obuf);
3899

    
3900
  /* The enter and bound instructions are printed with operands in the same
3901
     order as the intel book; everything else is printed in reverse order.  */
3902
  if (intel_syntax || two_source_ops)
3903
    {
3904
      bfd_vma riprel;
3905

    
3906
      for (i = 0; i < MAX_OPERANDS; ++i)
3907
        op_txt[i] = op_out[i];
3908

    
3909
      for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
3910
        {
3911
          op_ad = op_index[i];
3912
          op_index[i] = op_index[MAX_OPERANDS - 1 - i];
3913
          op_index[MAX_OPERANDS - 1 - i] = op_ad;
3914
          riprel = op_riprel[i];
3915
          op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
3916
          op_riprel[MAX_OPERANDS - 1 - i] = riprel;
3917
        }
3918
    }
3919
  else
3920
    {
3921
      for (i = 0; i < MAX_OPERANDS; ++i)
3922
        op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
3923
    }
3924

    
3925
  needcomma = 0;
3926
  for (i = 0; i < MAX_OPERANDS; ++i)
3927
    if (*op_txt[i])
3928
      {
3929
        if (needcomma)
3930
          (*info->fprintf_func) (info->stream, ",");
3931
        if (op_index[i] != -1 && !op_riprel[i])
3932
          (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
3933
        else
3934
          (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
3935
        needcomma = 1;
3936
      }
3937

    
3938
  for (i = 0; i < MAX_OPERANDS; i++)
3939
    if (op_index[i] != -1 && op_riprel[i])
3940
      {
3941
        (*info->fprintf_func) (info->stream, "        # ");
3942
        (*info->print_address_func) ((bfd_vma) (start_pc + codep - start_codep
3943
                                                + op_address[op_index[i]]), info);
3944
        break;
3945
      }
3946
  return codep - priv.the_buffer;
3947
}
3948

    
3949
static const char *float_mem[] = {
3950
  /* d8 */
3951
  "fadd{s||s|}",
3952
  "fmul{s||s|}",
3953
  "fcom{s||s|}",
3954
  "fcomp{s||s|}",
3955
  "fsub{s||s|}",
3956
  "fsubr{s||s|}",
3957
  "fdiv{s||s|}",
3958
  "fdivr{s||s|}",
3959
  /* d9 */
3960
  "fld{s||s|}",
3961
  "(bad)",
3962
  "fst{s||s|}",
3963
  "fstp{s||s|}",
3964
  "fldenvIC",
3965
  "fldcw",
3966
  "fNstenvIC",
3967
  "fNstcw",
3968
  /* da */
3969
  "fiadd{l||l|}",
3970
  "fimul{l||l|}",
3971
  "ficom{l||l|}",
3972
  "ficomp{l||l|}",
3973
  "fisub{l||l|}",
3974
  "fisubr{l||l|}",
3975
  "fidiv{l||l|}",
3976
  "fidivr{l||l|}",
3977
  /* db */
3978
  "fild{l||l|}",
3979
  "fisttp{l||l|}",
3980
  "fist{l||l|}",
3981
  "fistp{l||l|}",
3982
  "(bad)",
3983
  "fld{t||t|}",
3984
  "(bad)",
3985
  "fstp{t||t|}",
3986
  /* dc */
3987
  "fadd{l||l|}",
3988
  "fmul{l||l|}",
3989
  "fcom{l||l|}",
3990
  "fcomp{l||l|}",
3991
  "fsub{l||l|}",
3992
  "fsubr{l||l|}",
3993
  "fdiv{l||l|}",
3994
  "fdivr{l||l|}",
3995
  /* dd */
3996
  "fld{l||l|}",
3997
  "fisttp{ll||ll|}",
3998
  "fst{l||l|}",
3999
  "fstp{l||l|}",
4000
  "frstorIC",
4001
  "(bad)",
4002
  "fNsaveIC",
4003
  "fNstsw",
4004
  /* de */
4005
  "fiadd",
4006
  "fimul",
4007
  "ficom",
4008
  "ficomp",
4009
  "fisub",
4010
  "fisubr",
4011
  "fidiv",
4012
  "fidivr",
4013
  /* df */
4014
  "fild",
4015
  "fisttp",
4016
  "fist",
4017
  "fistp",
4018
  "fbld",
4019
  "fild{ll||ll|}",
4020
  "fbstp",
4021
  "fistp{ll||ll|}",
4022
};
4023

    
4024
static const unsigned char float_mem_mode[] = {
4025
  /* d8 */
4026
  d_mode,
4027
  d_mode,
4028
  d_mode,
4029
  d_mode,
4030
  d_mode,
4031
  d_mode,
4032
  d_mode,
4033
  d_mode,
4034
  /* d9 */
4035
  d_mode,
4036
  0,
4037
  d_mode,
4038
  d_mode,
4039
  0,
4040
  w_mode,
4041
  0,
4042
  w_mode,
4043
  /* da */
4044
  d_mode,
4045
  d_mode,
4046
  d_mode,
4047
  d_mode,
4048
  d_mode,
4049
  d_mode,
4050
  d_mode,
4051
  d_mode,
4052
  /* db */
4053
  d_mode,
4054
  d_mode,
4055
  d_mode,
4056
  d_mode,
4057
  0,
4058
  t_mode,
4059
  0,
4060
  t_mode,
4061
  /* dc */
4062
  q_mode,
4063
  q_mode,
4064
  q_mode,
4065
  q_mode,
4066
  q_mode,
4067
  q_mode,
4068
  q_mode,
4069
  q_mode,
4070
  /* dd */
4071
  q_mode,
4072
  q_mode,
4073
  q_mode,
4074
  q_mode,
4075
  0,
4076
  0,
4077
  0,
4078
  w_mode,
4079
  /* de */
4080
  w_mode,
4081
  w_mode,
4082
  w_mode,
4083
  w_mode,
4084
  w_mode,
4085
  w_mode,
4086
  w_mode,
4087
  w_mode,
4088
  /* df */
4089
  w_mode,
4090
  w_mode,
4091
  w_mode,
4092
  w_mode,
4093
  t_mode,
4094
  q_mode,
4095
  t_mode,
4096
  q_mode
4097
};
4098

    
4099
#define ST { OP_ST, 0 }
4100
#define STi { OP_STi, 0 }
4101

    
4102
#define FGRPd9_2 NULL, { { NULL, 0 } }
4103
#define FGRPd9_4 NULL, { { NULL, 1 } }
4104
#define FGRPd9_5 NULL, { { NULL, 2 } }
4105
#define FGRPd9_6 NULL, { { NULL, 3 } }
4106
#define FGRPd9_7 NULL, { { NULL, 4 } }
4107
#define FGRPda_5 NULL, { { NULL, 5 } }
4108
#define FGRPdb_4 NULL, { { NULL, 6 } }
4109
#define FGRPde_3 NULL, { { NULL, 7 } }
4110
#define FGRPdf_4 NULL, { { NULL, 8 } }
4111

    
4112
static const struct dis386 float_reg[][8] = {
4113
  /* d8 */
4114
  {
4115
    { "fadd",        { ST, STi } },
4116
    { "fmul",        { ST, STi } },
4117
    { "fcom",        { STi } },
4118
    { "fcomp",        { STi } },
4119
    { "fsub",        { ST, STi } },
4120
    { "fsubr",        { ST, STi } },
4121
    { "fdiv",        { ST, STi } },
4122
    { "fdivr",        { ST, STi } },
4123
  },
4124
  /* d9 */
4125
  {
4126
    { "fld",        { STi } },
4127
    { "fxch",        { STi } },
4128
    { FGRPd9_2 },
4129
    { "(bad)",        { XX } },
4130
    { FGRPd9_4 },
4131
    { FGRPd9_5 },
4132
    { FGRPd9_6 },
4133
    { FGRPd9_7 },
4134
  },
4135
  /* da */
4136
  {
4137
    { "fcmovb",        { ST, STi } },
4138
    { "fcmove",        { ST, STi } },
4139
    { "fcmovbe",{ ST, STi } },
4140
    { "fcmovu",        { ST, STi } },
4141
    { "(bad)",        { XX } },
4142
    { FGRPda_5 },
4143
    { "(bad)",        { XX } },
4144
    { "(bad)",        { XX } },
4145
  },
4146
  /* db */
4147
  {
4148
    { "fcmovnb",{ ST, STi } },
4149
    { "fcmovne",{ ST, STi } },
4150
    { "fcmovnbe",{ ST, STi } },
4151
    { "fcmovnu",{ ST, STi } },
4152
    { FGRPdb_4 },
4153
    { "fucomi",        { ST, STi } },
4154
    { "fcomi",        { ST, STi } },
4155
    { "(bad)",        { XX } },
4156
  },
4157
  /* dc */
4158
  {
4159
    { "fadd",        { STi, ST } },
4160
    { "fmul",        { STi, ST } },
4161
    { "(bad)",        { XX } },
4162
    { "(bad)",        { XX } },
4163
#if SYSV386_COMPAT
4164
    { "fsub",        { STi, ST } },
4165
    { "fsubr",        { STi, ST } },
4166
    { "fdiv",        { STi, ST } },
4167
    { "fdivr",        { STi, ST } },
4168
#else
4169
    { "fsubr",        { STi, ST } },
4170
    { "fsub",        { STi, ST } },
4171
    { "fdivr",        { STi, ST } },
4172
    { "fdiv",        { STi, ST } },
4173
#endif
4174
  },
4175
  /* dd */
4176
  {
4177
    { "ffree",        { STi } },
4178
    { "(bad)",        { XX } },
4179
    { "fst",        { STi } },
4180
    { "fstp",        { STi } },
4181
    { "fucom",        { STi } },
4182
    { "fucomp",        { STi } },
4183
    { "(bad)",        { XX } },
4184
    { "(bad)",        { XX } },
4185
  },
4186
  /* de */
4187
  {
4188
    { "faddp",        { STi, ST } },
4189
    { "fmulp",        { STi, ST } },
4190
    { "(bad)",        { XX } },
4191
    { FGRPde_3 },
4192
#if SYSV386_COMPAT
4193
    { "fsubp",        { STi, ST } },
4194
    { "fsubrp",        { STi, ST } },
4195
    { "fdivp",        { STi, ST } },
4196
    { "fdivrp",        { STi, ST } },
4197
#else
4198
    { "fsubrp",        { STi, ST } },
4199
    { "fsubp",        { STi, ST } },
4200
    { "fdivrp",        { STi, ST } },
4201
    { "fdivp",        { STi, ST } },
4202
#endif
4203
  },
4204
  /* df */
4205
  {
4206
    { "ffreep",        { STi } },
4207
    { "(bad)",        { XX } },
4208
    { "(bad)",        { XX } },
4209
    { "(bad)",        { XX } },
4210
    { FGRPdf_4 },
4211
    { "fucomip", { ST, STi } },
4212
    { "fcomip", { ST, STi } },
4213
    { "(bad)",        { XX } },
4214
  },
4215
};
4216

    
4217
static const char *fgrps[][8] = {
4218
  /* d9_2  0 */
4219
  {
4220
    "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
4221
  },
4222

    
4223
  /* d9_4  1 */
4224
  {
4225
    "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
4226
  },
4227

    
4228
  /* d9_5  2 */
4229
  {
4230
    "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
4231
  },
4232

    
4233
  /* d9_6  3 */
4234
  {
4235
    "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
4236
  },
4237

    
4238
  /* d9_7  4 */
4239
  {
4240
    "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
4241
  },
4242

    
4243
  /* da_5  5 */
4244
  {
4245
    "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
4246
  },
4247

    
4248
  /* db_4  6 */
4249
  {
4250
    "feni(287 only)","fdisi(287 only)","fNclex","fNinit",
4251
    "fNsetpm(287 only)","(bad)","(bad)","(bad)",
4252
  },
4253

    
4254
  /* de_3  7 */
4255
  {
4256
    "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
4257
  },
4258

    
4259
  /* df_4  8 */
4260
  {
4261
    "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
4262
  },
4263
};
4264

    
4265
static void
4266
dofloat (int sizeflag)
4267
{
4268
  const struct dis386 *dp;
4269
  unsigned char floatop;
4270

    
4271
  floatop = codep[-1];
4272

    
4273
  if (modrm.mod != 3)
4274
    {
4275
      int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
4276

    
4277
      putop (float_mem[fp_indx], sizeflag);
4278
      obufp = op_out[0];
4279
      op_ad = 2;
4280
      OP_E (float_mem_mode[fp_indx], sizeflag);
4281
      return;
4282
    }
4283
  /* Skip mod/rm byte.  */
4284
  MODRM_CHECK;
4285
  codep++;
4286

    
4287
  dp = &float_reg[floatop - 0xd8][modrm.reg];
4288
  if (dp->name == NULL)
4289
    {
4290
      putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
4291

    
4292
      /* Instruction fnstsw is only one with strange arg.  */
4293
      if (floatop == 0xdf && codep[-1] == 0xe0)
4294
        pstrcpy (op_out[0], sizeof(op_out[0]), names16[0]);
4295
    }
4296
  else
4297
    {
4298
      putop (dp->name, sizeflag);
4299

    
4300
      obufp = op_out[0];
4301
      op_ad = 2;
4302
      if (dp->op[0].rtn)
4303
        (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
4304

    
4305
      obufp = op_out[1];
4306
      op_ad = 1;
4307
      if (dp->op[1].rtn)
4308
        (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
4309
    }
4310
}
4311

    
4312
static void
4313
OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
4314
{
4315
  oappend ("%st" + intel_syntax);
4316
}
4317

    
4318
static void
4319
OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
4320
{
4321
  snprintf (scratchbuf, sizeof(scratchbuf), "%%st(%d)", modrm.rm);
4322
  oappend (scratchbuf + intel_syntax);
4323
}
4324

    
4325
/* Capital letters in template are macros.  */
4326
static int
4327
putop (const char *template, int sizeflag)
4328
{
4329
  const char *p;
4330
  int alt = 0;
4331

    
4332
  for (p = template; *p; p++)
4333
    {
4334
      switch (*p)
4335
        {
4336
        default:
4337
          *obufp++ = *p;
4338
          break;
4339
        case '{':
4340
          alt = 0;
4341
          if (intel_syntax)
4342
            alt += 1;
4343
          if (address_mode == mode_64bit)
4344
            alt += 2;
4345
          while (alt != 0)
4346
            {
4347
              while (*++p != '|')
4348
                {
4349
                  if (*p == '}')
4350
                    {
4351
                      /* Alternative not valid.  */
4352
                      pstrcpy (obuf, sizeof(obuf), "(bad)");
4353
                      obufp = obuf + 5;
4354
                      return 1;
4355
                    }
4356
                  else if (*p == '\0')
4357
                    abort ();
4358
                }
4359
              alt--;
4360
            }
4361
          /* Fall through.  */
4362
        case 'I':
4363
          alt = 1;
4364
          continue;
4365
        case '|':
4366
          while (*++p != '}')
4367
            {
4368
              if (*p == '\0')
4369
                abort ();
4370
            }
4371
          break;
4372
        case '}':
4373
          break;
4374
        case 'A':
4375
          if (intel_syntax)
4376
            break;
4377
          if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
4378
            *obufp++ = 'b';
4379
          break;
4380
        case 'B':
4381
          if (intel_syntax)
4382
            break;
4383
          if (sizeflag & SUFFIX_ALWAYS)
4384
            *obufp++ = 'b';
4385
          break;
4386
        case 'C':
4387
          if (intel_syntax && !alt)
4388
            break;
4389
          if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
4390
            {
4391
              if (sizeflag & DFLAG)
4392
                *obufp++ = intel_syntax ? 'd' : 'l';
4393
              else
4394
                *obufp++ = intel_syntax ? 'w' : 's';
4395
              used_prefixes |= (prefixes & PREFIX_DATA);
4396
            }
4397
          break;
4398
        case 'D':
4399
          if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
4400
            break;
4401
          USED_REX (REX_W);
4402
          if (modrm.mod == 3)
4403
            {
4404
              if (rex & REX_W)
4405
                *obufp++ = 'q';
4406
              else if (sizeflag & DFLAG)
4407
                *obufp++ = intel_syntax ? 'd' : 'l';
4408
              else
4409
                *obufp++ = 'w';
4410
              used_prefixes |= (prefixes & PREFIX_DATA);
4411
            }
4412
          else
4413
            *obufp++ = 'w';
4414
          break;
4415
        case 'E':                /* For jcxz/jecxz */
4416
          if (address_mode == mode_64bit)
4417
            {
4418
              if (sizeflag & AFLAG)
4419
                *obufp++ = 'r';
4420
              else
4421
                *obufp++ = 'e';
4422
            }
4423
          else
4424
            if (sizeflag & AFLAG)
4425
              *obufp++ = 'e';
4426
          used_prefixes |= (prefixes & PREFIX_ADDR);
4427
          break;
4428
        case 'F':
4429
          if (intel_syntax)
4430
            break;
4431
          if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
4432
            {
4433
              if (sizeflag & AFLAG)
4434
                *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
4435
              else
4436
                *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
4437
              used_prefixes |= (prefixes & PREFIX_ADDR);
4438
            }
4439
          break;
4440
        case 'G':
4441
          if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
4442
            break;
4443
          if ((rex & REX_W) || (sizeflag & DFLAG))
4444
            *obufp++ = 'l';
4445
          else
4446
            *obufp++ = 'w';
4447
          if (!(rex & REX_W))
4448
            used_prefixes |= (prefixes & PREFIX_DATA);
4449
          break;
4450
        case 'H':
4451
          if (intel_syntax)
4452
            break;
4453
          if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
4454
              || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
4455
            {
4456
              used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
4457
              *obufp++ = ',';
4458
              *obufp++ = 'p';
4459
              if (prefixes & PREFIX_DS)
4460
                *obufp++ = 't';
4461
              else
4462
                *obufp++ = 'n';
4463
            }
4464
          break;
4465
        case 'J':
4466
          if (intel_syntax)
4467
            break;
4468
          *obufp++ = 'l';
4469
          break;
4470
        case 'K':
4471
          USED_REX (REX_W);
4472
          if (rex & REX_W)
4473
            *obufp++ = 'q';
4474
          else
4475
            *obufp++ = 'd';
4476
          break;
4477
        case 'Z':
4478
          if (intel_syntax)
4479
            break;
4480
          if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
4481
            {
4482
              *obufp++ = 'q';
4483
              break;
4484
            }
4485
          /* Fall through.  */
4486
        case 'L':
4487
          if (intel_syntax)
4488
            break;
4489
          if (sizeflag & SUFFIX_ALWAYS)
4490
            *obufp++ = 'l';
4491
          break;
4492
        case 'N':
4493
          if ((prefixes & PREFIX_FWAIT) == 0)
4494
            *obufp++ = 'n';
4495
          else
4496
            used_prefixes |= PREFIX_FWAIT;
4497
          break;
4498
        case 'O':
4499
          USED_REX (REX_W);
4500
          if (rex & REX_W)
4501
            *obufp++ = 'o';
4502
          else if (intel_syntax && (sizeflag & DFLAG))
4503
            *obufp++ = 'q';
4504
          else
4505
            *obufp++ = 'd';
4506
          if (!(rex & REX_W))
4507
            used_prefixes |= (prefixes & PREFIX_DATA);
4508
          break;
4509
        case 'T':
4510
          if (intel_syntax)
4511
            break;
4512
          if (address_mode == mode_64bit && (sizeflag & DFLAG))
4513
            {
4514
              *obufp++ = 'q';
4515
              break;
4516
            }
4517
          /* Fall through.  */
4518
        case 'P':
4519
          if (intel_syntax)
4520
            break;
4521
          if ((prefixes & PREFIX_DATA)
4522
              || (rex & REX_W)
4523
              || (sizeflag & SUFFIX_ALWAYS))
4524
            {
4525
              USED_REX (REX_W);
4526
              if (rex & REX_W)
4527
                *obufp++ = 'q';
4528
              else
4529
                {
4530
                   if (sizeflag & DFLAG)
4531
                      *obufp++ = 'l';
4532
                   else
4533
                     *obufp++ = 'w';
4534
                }
4535
              used_prefixes |= (prefixes & PREFIX_DATA);
4536
            }
4537
          break;
4538
        case 'U':
4539
          if (intel_syntax)
4540
            break;
4541
          if (address_mode == mode_64bit && (sizeflag & DFLAG))
4542
            {
4543
              if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
4544
                *obufp++ = 'q';
4545
              break;
4546
            }
4547
          /* Fall through.  */
4548
        case 'Q':
4549
          if (intel_syntax && !alt)
4550
            break;
4551
          USED_REX (REX_W);
4552
          if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
4553
            {
4554
              if (rex & REX_W)
4555
                *obufp++ = 'q';
4556
              else
4557
                {
4558
                  if (sizeflag & DFLAG)
4559
                    *obufp++ = intel_syntax ? 'd' : 'l';
4560
                  else
4561
                    *obufp++ = 'w';
4562
                }
4563
              used_prefixes |= (prefixes & PREFIX_DATA);
4564
            }
4565
          break;
4566
        case 'R':
4567
          USED_REX (REX_W);
4568
          if (rex & REX_W)
4569
            *obufp++ = 'q';
4570
          else if (sizeflag & DFLAG)
4571
            {
4572
              if (intel_syntax)
4573
                  *obufp++ = 'd';
4574
              else
4575
                  *obufp++ = 'l';
4576
            }
4577
          else
4578
            *obufp++ = 'w';
4579
          if (intel_syntax && !p[1]
4580
              && ((rex & REX_W) || (sizeflag & DFLAG)))
4581
            *obufp++ = 'e';
4582
          if (!(rex & REX_W))
4583
            used_prefixes |= (prefixes & PREFIX_DATA);
4584
          break;
4585
        case 'V':
4586
          if (intel_syntax)
4587
            break;
4588
          if (address_mode == mode_64bit && (sizeflag & DFLAG))
4589
            {
4590
              if (sizeflag & SUFFIX_ALWAYS)
4591
                *obufp++ = 'q';
4592
              break;
4593
            }
4594
          /* Fall through.  */
4595
        case 'S':
4596
          if (intel_syntax)
4597
            break;
4598
          if (sizeflag & SUFFIX_ALWAYS)
4599
            {
4600
              if (rex & REX_W)
4601
                *obufp++ = 'q';
4602
              else
4603
                {
4604
                  if (sizeflag & DFLAG)
4605
                    *obufp++ = 'l';
4606
                  else
4607
                    *obufp++ = 'w';
4608
                  used_prefixes |= (prefixes & PREFIX_DATA);
4609
                }
4610
            }
4611
          break;
4612
        case 'X':
4613
          if (prefixes & PREFIX_DATA)
4614
            *obufp++ = 'd';
4615
          else
4616
            *obufp++ = 's';
4617
          used_prefixes |= (prefixes & PREFIX_DATA);
4618
          break;
4619
        case 'Y':
4620
          if (intel_syntax)
4621
            break;
4622
          if (rex & REX_W)
4623
            {
4624
              USED_REX (REX_W);
4625
              *obufp++ = 'q';
4626
            }
4627
          break;
4628
          /* implicit operand size 'l' for i386 or 'q' for x86-64 */
4629
        case 'W':
4630
          /* operand size flag for cwtl, cbtw */
4631
          USED_REX (REX_W);
4632
          if (rex & REX_W)
4633
            {
4634
              if (intel_syntax)
4635
                *obufp++ = 'd';
4636
              else
4637
                *obufp++ = 'l';
4638
            }
4639
          else if (sizeflag & DFLAG)
4640
            *obufp++ = 'w';
4641
          else
4642
            *obufp++ = 'b';
4643
          if (!(rex & REX_W))
4644
            used_prefixes |= (prefixes & PREFIX_DATA);
4645
          break;
4646
        }
4647
      alt = 0;
4648
    }
4649
  *obufp = 0;
4650
  return 0;
4651
}
4652

    
4653
static void
4654
oappend (const char *s)
4655
{
4656
  strcpy (obufp, s);
4657
  obufp += strlen (s);
4658
}
4659

    
4660
static void
4661
append_seg (void)
4662
{
4663
  if (prefixes & PREFIX_CS)
4664
    {
4665
      used_prefixes |= PREFIX_CS;
4666
      oappend ("%cs:" + intel_syntax);
4667
    }
4668
  if (prefixes & PREFIX_DS)
4669
    {
4670
      used_prefixes |= PREFIX_DS;
4671
      oappend ("%ds:" + intel_syntax);
4672
    }
4673
  if (prefixes & PREFIX_SS)
4674
    {
4675
      used_prefixes |= PREFIX_SS;
4676
      oappend ("%ss:" + intel_syntax);
4677
    }
4678
  if (prefixes & PREFIX_ES)
4679
    {
4680
      used_prefixes |= PREFIX_ES;
4681
      oappend ("%es:" + intel_syntax);
4682
    }
4683
  if (prefixes & PREFIX_FS)
4684
    {
4685
      used_prefixes |= PREFIX_FS;
4686
      oappend ("%fs:" + intel_syntax);
4687
    }
4688
  if (prefixes & PREFIX_GS)
4689
    {
4690
      used_prefixes |= PREFIX_GS;
4691
      oappend ("%gs:" + intel_syntax);
4692
    }
4693
}
4694

    
4695
static void
4696
OP_indirE (int bytemode, int sizeflag)
4697
{
4698
  if (!intel_syntax)
4699
    oappend ("*");
4700
  OP_E (bytemode, sizeflag);
4701
}
4702

    
4703
static void
4704
print_operand_value (char *buf, size_t bufsize, int hex, bfd_vma disp)
4705
{
4706
  if (address_mode == mode_64bit)
4707
    {
4708
      if (hex)
4709
        {
4710
          char tmp[30];
4711
          int i;
4712
          buf[0] = '0';
4713
          buf[1] = 'x';
4714
          snprintf_vma (tmp, sizeof(tmp), disp);
4715
          for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
4716
          pstrcpy (buf + 2, bufsize - 2, tmp + i);
4717
        }
4718
      else
4719
        {
4720
          bfd_signed_vma v = disp;
4721
          char tmp[30];
4722
          int i;
4723
          if (v < 0)
4724
            {
4725
              *(buf++) = '-';
4726
              v = -disp;
4727
              /* Check for possible overflow on 0x8000000000000000.  */
4728
              if (v < 0)
4729
                {
4730
                  pstrcpy (buf, bufsize, "9223372036854775808");
4731
                  return;
4732
                }
4733
            }
4734
          if (!v)
4735
            {
4736
                pstrcpy (buf, bufsize, "0");
4737
              return;
4738
            }
4739

    
4740
          i = 0;
4741
          tmp[29] = 0;
4742
          while (v)
4743
            {
4744
              tmp[28 - i] = (v % 10) + '0';
4745
              v /= 10;
4746
              i++;
4747
            }
4748
          pstrcpy (buf, bufsize, tmp + 29 - i);
4749
        }
4750
    }
4751
  else
4752
    {
4753
      if (hex)
4754
        snprintf (buf, bufsize, "0x%x", (unsigned int) disp);
4755
      else
4756
        snprintf (buf, bufsize, "%d", (int) disp);
4757
    }
4758
}
4759

    
4760
/* Put DISP in BUF as signed hex number.  */
4761

    
4762
static void
4763
print_displacement (char *buf, bfd_vma disp)
4764
{
4765
  bfd_signed_vma val = disp;
4766
  char tmp[30];
4767
  int i, j = 0;
4768

    
4769
  if (val < 0)
4770
    {
4771
      buf[j++] = '-';
4772
      val = -disp;
4773

    
4774
      /* Check for possible overflow.  */
4775
      if (val < 0)
4776
        {
4777
          switch (address_mode)
4778
            {
4779
            case mode_64bit:
4780
              strcpy (buf + j, "0x8000000000000000");
4781
              break;
4782
            case mode_32bit:
4783
              strcpy (buf + j, "0x80000000");
4784
              break;
4785
            case mode_16bit:
4786
              strcpy (buf + j, "0x8000");
4787
              break;
4788
            }
4789
          return;
4790
        }
4791
    }
4792

    
4793
  buf[j++] = '0';
4794
  buf[j++] = 'x';
4795

    
4796
  snprintf_vma (tmp, sizeof(tmp), val);
4797
  for (i = 0; tmp[i] == '0'; i++)
4798
    continue;
4799
  if (tmp[i] == '\0')
4800
    i--;
4801
  strcpy (buf + j, tmp + i);
4802
}
4803

    
4804
static void
4805
intel_operand_size (int bytemode, int sizeflag)
4806
{
4807
  switch (bytemode)
4808
    {
4809
    case b_mode:
4810
    case dqb_mode:
4811
      oappend ("BYTE PTR ");
4812
      break;
4813
    case w_mode:
4814
    case dqw_mode:
4815
      oappend ("WORD PTR ");
4816
      break;
4817
    case stack_v_mode:
4818
      if (address_mode == mode_64bit && (sizeflag & DFLAG))
4819
        {
4820
          oappend ("QWORD PTR ");
4821
          used_prefixes |= (prefixes & PREFIX_DATA);
4822
          break;
4823
        }
4824
      /* FALLTHRU */
4825
    case v_mode:
4826
    case dq_mode:
4827
      USED_REX (REX_W);
4828
      if (rex & REX_W)
4829
        oappend ("QWORD PTR ");
4830
      else if ((sizeflag & DFLAG) || bytemode == dq_mode)
4831
        oappend ("DWORD PTR ");
4832
      else
4833
        oappend ("WORD PTR ");
4834
      used_prefixes |= (prefixes & PREFIX_DATA);
4835
      break;
4836
    case z_mode:
4837
      if ((rex & REX_W) || (sizeflag & DFLAG))
4838
        *obufp++ = 'D';
4839
      oappend ("WORD PTR ");
4840
      if (!(rex & REX_W))
4841
        used_prefixes |= (prefixes & PREFIX_DATA);
4842
      break;
4843
    case d_mode:
4844
    case dqd_mode:
4845
      oappend ("DWORD PTR ");
4846
      break;
4847
    case q_mode:
4848
      oappend ("QWORD PTR ");
4849
      break;
4850
    case m_mode:
4851
      if (address_mode == mode_64bit)
4852
        oappend ("QWORD PTR ");
4853
      else
4854
        oappend ("DWORD PTR ");
4855
      break;
4856
    case f_mode:
4857
      if (sizeflag & DFLAG)
4858
        oappend ("FWORD PTR ");
4859
      else
4860
        oappend ("DWORD PTR ");
4861
      used_prefixes |= (prefixes & PREFIX_DATA);
4862
      break;
4863
    case t_mode:
4864
      oappend ("TBYTE PTR ");
4865
      break;
4866
    case x_mode:
4867
      oappend ("XMMWORD PTR ");
4868
      break;
4869
    case o_mode:
4870
      oappend ("OWORD PTR ");
4871
      break;
4872
    default:
4873
      break;
4874
    }
4875
}
4876

    
4877
static void
4878
OP_E (int bytemode, int sizeflag)
4879
{
4880
  bfd_vma disp;
4881
  int add = 0;
4882
  int riprel = 0;
4883
  USED_REX (REX_B);
4884
  if (rex & REX_B)
4885
    add += 8;
4886

    
4887
  /* Skip mod/rm byte.  */
4888
  MODRM_CHECK;
4889
  codep++;
4890

    
4891
  if (modrm.mod == 3)
4892
    {
4893
      switch (bytemode)
4894
        {
4895
        case b_mode:
4896
          USED_REX (0);
4897
          if (rex)
4898
            oappend (names8rex[modrm.rm + add]);
4899
          else
4900
            oappend (names8[modrm.rm + add]);
4901
          break;
4902
        case w_mode:
4903
          oappend (names16[modrm.rm + add]);
4904
          break;
4905
        case d_mode:
4906
          oappend (names32[modrm.rm + add]);
4907
          break;
4908
        case q_mode:
4909
          oappend (names64[modrm.rm + add]);
4910
          break;
4911
        case m_mode:
4912
          if (address_mode == mode_64bit)
4913
            oappend (names64[modrm.rm + add]);
4914
          else
4915
            oappend (names32[modrm.rm + add]);
4916
          break;
4917
        case stack_v_mode:
4918
          if (address_mode == mode_64bit && (sizeflag & DFLAG))
4919
            {
4920
              oappend (names64[modrm.rm + add]);
4921
              used_prefixes |= (prefixes & PREFIX_DATA);
4922
              break;
4923
            }
4924
          bytemode = v_mode;
4925
          /* FALLTHRU */
4926
        case v_mode:
4927
        case dq_mode:
4928
        case dqb_mode:
4929
        case dqd_mode:
4930
        case dqw_mode:
4931
          USED_REX (REX_W);
4932
          if (rex & REX_W)
4933
            oappend (names64[modrm.rm + add]);
4934
          else if ((sizeflag & DFLAG) || bytemode != v_mode)
4935
            oappend (names32[modrm.rm + add]);
4936
          else
4937
            oappend (names16[modrm.rm + add]);
4938
          used_prefixes |= (prefixes & PREFIX_DATA);
4939
          break;
4940
        case 0:
4941
          break;
4942
        default:
4943
          oappend (INTERNAL_DISASSEMBLER_ERROR);
4944
          break;
4945
        }
4946
      return;
4947
    }
4948

    
4949
  disp = 0;
4950
  if (intel_syntax)
4951
    intel_operand_size (bytemode, sizeflag);
4952
  append_seg ();
4953

    
4954
  if ((sizeflag & AFLAG) || address_mode == mode_64bit)
4955
    {
4956
      /* 32/64 bit address mode */
4957
      int havedisp;
4958
      int havesib;
4959
      int havebase;
4960
      int base;
4961
      int index = 0;
4962
      int scale = 0;
4963

    
4964
      havesib = 0;
4965
      havebase = 1;
4966
      base = modrm.rm;
4967

    
4968
      if (base == 4)
4969
        {
4970
          havesib = 1;
4971
          FETCH_DATA (the_info, codep + 1);
4972
          index = (*codep >> 3) & 7;
4973
          if (address_mode == mode_64bit || index != 0x4)
4974
            /* When INDEX == 0x4 in 32 bit mode, SCALE is ignored.  */
4975
            scale = (*codep >> 6) & 3;
4976
          base = *codep & 7;
4977
          USED_REX (REX_X);
4978
          if (rex & REX_X)
4979
            index += 8;
4980
          codep++;
4981
        }
4982
      base += add;
4983

    
4984
      switch (modrm.mod)
4985
        {
4986
        case 0:
4987
          if ((base & 7) == 5)
4988
            {
4989
              havebase = 0;
4990
              if (address_mode == mode_64bit && !havesib)
4991
                riprel = 1;
4992
              disp = get32s ();
4993
            }
4994
          break;
4995
        case 1:
4996
          FETCH_DATA (the_info, codep + 1);
4997
          disp = *codep++;
4998
          if ((disp & 0x80) != 0)
4999
            disp -= 0x100;
5000
          break;
5001
        case 2:
5002
          disp = get32s ();
5003
          break;
5004
        }
5005

    
5006
      havedisp = havebase || (havesib && (index != 4 || scale != 0));
5007

    
5008
      if (!intel_syntax)
5009
        if (modrm.mod != 0 || (base & 7) == 5)
5010
          {
5011
            if (havedisp || riprel)
5012
              print_displacement (scratchbuf, disp);
5013
            else
5014
              print_operand_value (scratchbuf, sizeof(scratchbuf), 1, disp);
5015
            oappend (scratchbuf);
5016
            if (riprel)
5017
              {
5018
                set_op (disp, 1);
5019
                oappend ("(%rip)");
5020
              }
5021
          }
5022

    
5023
      if (havedisp || (intel_syntax && riprel))
5024
        {
5025
          *obufp++ = open_char;
5026
          if (intel_syntax && riprel)
5027
            {
5028
              set_op (disp, 1);
5029
              oappend ("rip");
5030
            }
5031
          *obufp = '\0';
5032
          if (havebase)
5033
            oappend (address_mode == mode_64bit && (sizeflag & AFLAG)
5034
                     ? names64[base] : names32[base]);
5035
          if (havesib)
5036
            {
5037
              if (index != 4)
5038
                {
5039
                  if (!intel_syntax || havebase)
5040
                    {
5041
                      *obufp++ = separator_char;
5042
                      *obufp = '\0';
5043
                    }
5044
                  oappend (address_mode == mode_64bit && (sizeflag & AFLAG)
5045
                           ? names64[index] : names32[index]);
5046
                }
5047
              if (scale != 0 || (!intel_syntax && index != 4))
5048
                {
5049
                  *obufp++ = scale_char;
5050
                  *obufp = '\0';
5051
                  snprintf (scratchbuf, sizeof(scratchbuf), "%d", 1 << scale);
5052
                  oappend (scratchbuf);
5053
                }
5054
            }
5055
          if (intel_syntax
5056
              && (disp || modrm.mod != 0 || (base & 7) == 5))
5057
            {
5058
              if ((bfd_signed_vma) disp >= 0)
5059
                {
5060
                  *obufp++ = '+';
5061
                  *obufp = '\0';
5062
                }
5063
              else if (modrm.mod != 1)
5064
                {
5065
                  *obufp++ = '-';
5066
                  *obufp = '\0';
5067
                  disp = - (bfd_signed_vma) disp;
5068
                }
5069

    
5070
              print_displacement (scratchbuf, disp);
5071
              oappend (scratchbuf);
5072
            }
5073

    
5074
          *obufp++ = close_char;
5075
          *obufp = '\0';
5076
        }
5077
      else if (intel_syntax)
5078
        {
5079
          if (modrm.mod != 0 || (base & 7) == 5)
5080
            {
5081
              if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
5082
                              | PREFIX_ES | PREFIX_FS | PREFIX_GS))
5083
                ;
5084
              else
5085
                {
5086
                  oappend (names_seg[ds_reg - es_reg]);
5087
                  oappend (":");
5088
                }
5089
              print_operand_value (scratchbuf, sizeof(scratchbuf), 1, disp);
5090
              oappend (scratchbuf);
5091
            }
5092
        }
5093
    }
5094
  else
5095
    { /* 16 bit address mode */
5096
      switch (modrm.mod)
5097
        {
5098
        case 0:
5099
          if (modrm.rm == 6)
5100
            {
5101
              disp = get16 ();
5102
              if ((disp & 0x8000) != 0)
5103
                disp -= 0x10000;
5104
            }
5105
          break;
5106
        case 1:
5107
          FETCH_DATA (the_info, codep + 1);
5108
          disp = *codep++;
5109
          if ((disp & 0x80) != 0)
5110
            disp -= 0x100;
5111
          break;
5112
        case 2:
5113
          disp = get16 ();
5114
          if ((disp & 0x8000) != 0)
5115
            disp -= 0x10000;
5116
          break;
5117
        }
5118

    
5119
      if (!intel_syntax)
5120
        if (modrm.mod != 0 || modrm.rm == 6)
5121
          {
5122
            print_displacement (scratchbuf, disp);
5123
            oappend (scratchbuf);
5124
          }
5125

    
5126
      if (modrm.mod != 0 || modrm.rm != 6)
5127
        {
5128
          *obufp++ = open_char;
5129
          *obufp = '\0';
5130
          oappend (index16[modrm.rm]);
5131
          if (intel_syntax
5132
              && (disp || modrm.mod != 0 || modrm.rm == 6))
5133
            {
5134
              if ((bfd_signed_vma) disp >= 0)
5135
                {
5136
                  *obufp++ = '+';
5137
                  *obufp = '\0';
5138
                }
5139
              else if (modrm.mod != 1)
5140
                {
5141
                  *obufp++ = '-';
5142
                  *obufp = '\0';
5143
                  disp = - (bfd_signed_vma) disp;
5144
                }
5145

    
5146
              print_displacement (scratchbuf, disp);
5147
              oappend (scratchbuf);
5148
            }
5149

    
5150
          *obufp++ = close_char;
5151
          *obufp = '\0';
5152
        }
5153
      else if (intel_syntax)
5154
        {
5155
          if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
5156
                          | PREFIX_ES | PREFIX_FS | PREFIX_GS))
5157
            ;
5158
          else
5159
            {
5160
              oappend (names_seg[ds_reg - es_reg]);
5161
              oappend (":");
5162
            }
5163
          print_operand_value (scratchbuf, sizeof(scratchbuf), 1,
5164
                               disp & 0xffff);
5165
          oappend (scratchbuf);
5166
        }
5167
    }
5168
}
5169

    
5170
static void
5171
OP_G (int bytemode, int sizeflag)
5172
{
5173
  int add = 0;
5174
  USED_REX (REX_R);
5175
  if (rex & REX_R)
5176
    add += 8;
5177
  switch (bytemode)
5178
    {
5179
    case b_mode:
5180
      USED_REX (0);
5181
      if (rex)
5182
        oappend (names8rex[modrm.reg + add]);
5183
      else
5184
        oappend (names8[modrm.reg + add]);
5185
      break;
5186
    case w_mode:
5187
      oappend (names16[modrm.reg + add]);
5188
      break;
5189
    case d_mode:
5190
      oappend (names32[modrm.reg + add]);
5191
      break;
5192
    case q_mode:
5193
      oappend (names64[modrm.reg + add]);
5194
      break;
5195
    case v_mode:
5196
    case dq_mode:
5197
    case dqb_mode:
5198
    case dqd_mode:
5199
    case dqw_mode:
5200
      USED_REX (REX_W);
5201
      if (rex & REX_W)
5202
        oappend (names64[modrm.reg + add]);
5203
      else if ((sizeflag & DFLAG) || bytemode != v_mode)
5204
        oappend (names32[modrm.reg + add]);
5205
      else
5206
        oappend (names16[modrm.reg + add]);
5207
      used_prefixes |= (prefixes & PREFIX_DATA);
5208
      break;
5209
    case m_mode:
5210
      if (address_mode == mode_64bit)
5211
        oappend (names64[modrm.reg + add]);
5212
      else
5213
        oappend (names32[modrm.reg + add]);
5214
      break;
5215
    default:
5216
      oappend (INTERNAL_DISASSEMBLER_ERROR);
5217
      break;
5218
    }
5219
}
5220

    
5221
static bfd_vma
5222
get64 (void)
5223
{
5224
  bfd_vma x;
5225
#ifdef BFD64
5226
  unsigned int a;
5227
  unsigned int b;
5228

    
5229
  FETCH_DATA (the_info, codep + 8);
5230
  a = *codep++ & 0xff;
5231
  a |= (*codep++ & 0xff) << 8;
5232
  a |= (*codep++ & 0xff) << 16;
5233
  a |= (*codep++ & 0xff) << 24;
5234
  b = *codep++ & 0xff;
5235
  b |= (*codep++ & 0xff) << 8;
5236
  b |= (*codep++ & 0xff) << 16;
5237
  b |= (*codep++ & 0xff) << 24;
5238
  x = a + ((bfd_vma) b << 32);
5239
#else
5240
  abort ();
5241
  x = 0;
5242
#endif
5243
  return x;
5244
}
5245

    
5246
static bfd_signed_vma
5247
get32 (void)
5248
{
5249
  bfd_signed_vma x = 0;
5250

    
5251
  FETCH_DATA (the_info, codep + 4);
5252
  x = *codep++ & (bfd_signed_vma) 0xff;
5253
  x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
5254
  x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
5255
  x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
5256
  return x;
5257
}
5258

    
5259
static bfd_signed_vma
5260
get32s (void)
5261
{
5262
  bfd_signed_vma x = 0;
5263

    
5264
  FETCH_DATA (the_info, codep + 4);
5265
  x = *codep++ & (bfd_signed_vma) 0xff;
5266
  x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
5267
  x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
5268
  x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
5269

    
5270
  x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
5271

    
5272
  return x;
5273
}
5274

    
5275
static int
5276
get16 (void)
5277
{
5278
  int x = 0;
5279

    
5280
  FETCH_DATA (the_info, codep + 2);
5281
  x = *codep++ & 0xff;
5282
  x |= (*codep++ & 0xff) << 8;
5283
  return x;
5284
}
5285

    
5286
static void
5287
set_op (bfd_vma op, int riprel)
5288
{
5289
  op_index[op_ad] = op_ad;
5290
  if (address_mode == mode_64bit)
5291
    {
5292
      op_address[op_ad] = op;
5293
      op_riprel[op_ad] = riprel;
5294
    }
5295
  else
5296
    {
5297
      /* Mask to get a 32-bit address.  */
5298
      op_address[op_ad] = op & 0xffffffff;
5299
      op_riprel[op_ad] = riprel & 0xffffffff;
5300
    }
5301
}
5302

    
5303
static void
5304
OP_REG (int code, int sizeflag)
5305
{
5306
  const char *s;
5307
  int add = 0;
5308
  USED_REX (REX_B);
5309
  if (rex & REX_B)
5310
    add = 8;
5311

    
5312
  switch (code)
5313
    {
5314
    case ax_reg: case cx_reg: case dx_reg: case bx_reg:
5315
    case sp_reg: case bp_reg: case si_reg: case di_reg:
5316
      s = names16[code - ax_reg + add];
5317
      break;
5318
    case es_reg: case ss_reg: case cs_reg:
5319
    case ds_reg: case fs_reg: case gs_reg:
5320
      s = names_seg[code - es_reg + add];
5321
      break;
5322
    case al_reg: case ah_reg: case cl_reg: case ch_reg:
5323
    case dl_reg: case dh_reg: case bl_reg: case bh_reg:
5324
      USED_REX (0);
5325
      if (rex)
5326
        s = names8rex[code - al_reg + add];
5327
      else
5328
        s = names8[code - al_reg];
5329
      break;
5330
    case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
5331
    case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
5332
      if (address_mode == mode_64bit && (sizeflag & DFLAG))
5333
        {
5334
          s = names64[code - rAX_reg + add];
5335
          break;
5336
        }
5337
      code += eAX_reg - rAX_reg;
5338
      /* Fall through.  */
5339
    case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
5340
    case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
5341
      USED_REX (REX_W);
5342
      if (rex & REX_W)
5343
        s = names64[code - eAX_reg + add];
5344
      else if (sizeflag & DFLAG)
5345
        s = names32[code - eAX_reg + add];
5346
      else
5347
        s = names16[code - eAX_reg + add];
5348
      used_prefixes |= (prefixes & PREFIX_DATA);
5349
      break;
5350
    default:
5351
      s = INTERNAL_DISASSEMBLER_ERROR;
5352
      break;
5353
    }
5354
  oappend (s);
5355
}
5356

    
5357
static void
5358
OP_IMREG (int code, int sizeflag)
5359
{
5360
  const char *s;
5361

    
5362
  switch (code)
5363
    {
5364
    case indir_dx_reg:
5365
      if (intel_syntax)
5366
        s = "dx";
5367
      else
5368
        s = "(%dx)";
5369
      break;
5370
    case ax_reg: case cx_reg: case dx_reg: case bx_reg:
5371
    case sp_reg: case bp_reg: case si_reg: case di_reg:
5372
      s = names16[code - ax_reg];
5373
      break;
5374
    case es_reg: case ss_reg: case cs_reg:
5375
    case ds_reg: case fs_reg: case gs_reg:
5376
      s = names_seg[code - es_reg];
5377
      break;
5378
    case al_reg: case ah_reg: case cl_reg: case ch_reg:
5379
    case dl_reg: case dh_reg: case bl_reg: case bh_reg:
5380
      USED_REX (0);
5381
      if (rex)
5382
        s = names8rex[code - al_reg];
5383
      else
5384
        s = names8[code - al_reg];
5385
      break;
5386
    case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
5387
    case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
5388
      USED_REX (REX_W);
5389
      if (rex & REX_W)
5390
        s = names64[code - eAX_reg];
5391
      else if (sizeflag & DFLAG)
5392
        s = names32[code - eAX_reg];
5393
      else
5394
        s = names16[code - eAX_reg];
5395
      used_prefixes |= (prefixes & PREFIX_DATA);
5396
      break;
5397
    case z_mode_ax_reg:
5398
      if ((rex & REX_W) || (sizeflag & DFLAG))
5399
        s = *names32;
5400
      else
5401
        s = *names16;
5402
      if (!(rex & REX_W))
5403
        used_prefixes |= (prefixes & PREFIX_DATA);
5404
      break;
5405
    default:
5406
      s = INTERNAL_DISASSEMBLER_ERROR;
5407
      break;
5408
    }
5409
  oappend (s);
5410
}
5411

    
5412
static void
5413
OP_I (int bytemode, int sizeflag)
5414
{
5415
  bfd_signed_vma op;
5416
  bfd_signed_vma mask = -1;
5417

    
5418
  switch (bytemode)
5419
    {
5420
    case b_mode:
5421
      FETCH_DATA (the_info, codep + 1);
5422
      op = *codep++;
5423
      mask = 0xff;
5424
      break;
5425
    case q_mode:
5426
      if (address_mode == mode_64bit)
5427
        {
5428
          op = get32s ();
5429
          break;
5430
        }
5431
      /* Fall through.  */
5432
    case v_mode:
5433
      USED_REX (REX_W);
5434
      if (rex & REX_W)
5435
        op = get32s ();
5436
      else if (sizeflag & DFLAG)
5437
        {
5438
          op = get32 ();
5439
          mask = 0xffffffff;
5440
        }
5441
      else
5442
        {
5443
          op = get16 ();
5444
          mask = 0xfffff;
5445
        }
5446
      used_prefixes |= (prefixes & PREFIX_DATA);
5447
      break;
5448
    case w_mode:
5449
      mask = 0xfffff;
5450
      op = get16 ();
5451
      break;
5452
    case const_1_mode:
5453
      if (intel_syntax)
5454
        oappend ("1");
5455
      return;
5456
    default:
5457
      oappend (INTERNAL_DISASSEMBLER_ERROR);
5458
      return;
5459
    }
5460

    
5461
  op &= mask;
5462
  scratchbuf[0] = '$';
5463
  print_operand_value (scratchbuf + 1, sizeof(scratchbuf) - 1, 1, op);
5464
  oappend (scratchbuf + intel_syntax);
5465
  scratchbuf[0] = '\0';
5466
}
5467

    
5468
static void
5469
OP_I64 (int bytemode, int sizeflag)
5470
{
5471
  bfd_signed_vma op;
5472
  bfd_signed_vma mask = -1;
5473

    
5474
  if (address_mode != mode_64bit)
5475
    {
5476
      OP_I (bytemode, sizeflag);
5477
      return;
5478
    }
5479

    
5480
  switch (bytemode)
5481
    {
5482
    case b_mode:
5483
      FETCH_DATA (the_info, codep + 1);
5484
      op = *codep++;
5485
      mask = 0xff;
5486
      break;
5487
    case v_mode:
5488
      USED_REX (REX_W);
5489
      if (rex & REX_W)
5490
        op = get64 ();
5491
      else if (sizeflag & DFLAG)
5492
        {
5493
          op = get32 ();
5494
          mask = 0xffffffff;
5495
        }
5496
      else
5497
        {
5498
          op = get16 ();
5499
          mask = 0xfffff;
5500
        }
5501
      used_prefixes |= (prefixes & PREFIX_DATA);
5502
      break;
5503
    case w_mode:
5504
      mask = 0xfffff;
5505
      op = get16 ();
5506
      break;
5507
    default:
5508
      oappend (INTERNAL_DISASSEMBLER_ERROR);
5509
      return;
5510
    }
5511

    
5512
  op &= mask;
5513
  scratchbuf[0] = '$';
5514
  print_operand_value (scratchbuf + 1, sizeof(scratchbuf) - 1, 1, op);
5515
  oappend (scratchbuf + intel_syntax);
5516
  scratchbuf[0] = '\0';
5517
}
5518

    
5519
static void
5520
OP_sI (int bytemode, int sizeflag)
5521
{
5522
  bfd_signed_vma op;
5523
  bfd_signed_vma mask = -1;
5524

    
5525
  switch (bytemode)
5526
    {
5527
    case b_mode:
5528
      FETCH_DATA (the_info, codep + 1);
5529
      op = *codep++;
5530
      if ((op & 0x80) != 0)
5531
        op -= 0x100;
5532
      mask = 0xffffffff;
5533
      break;
5534
    case v_mode:
5535
      USED_REX (REX_W);
5536
      if (rex & REX_W)
5537
        op = get32s ();
5538
      else if (sizeflag & DFLAG)
5539
        {
5540
          op = get32s ();
5541
          mask = 0xffffffff;
5542
        }
5543
      else
5544
        {
5545
          mask = 0xffffffff;
5546
          op = get16 ();
5547
          if ((op & 0x8000) != 0)
5548
            op -= 0x10000;
5549
        }
5550
      used_prefixes |= (prefixes & PREFIX_DATA);
5551
      break;
5552
    case w_mode:
5553
      op = get16 ();
5554
      mask = 0xffffffff;
5555
      if ((op & 0x8000) != 0)
5556
        op -= 0x10000;
5557
      break;
5558
    default:
5559
      oappend (INTERNAL_DISASSEMBLER_ERROR);
5560
      return;
5561
    }
5562

    
5563
  scratchbuf[0] = '$';
5564
  print_operand_value (scratchbuf + 1, sizeof(scratchbuf) - 1, 1, op);
5565
  oappend (scratchbuf + intel_syntax);
5566
}
5567

    
5568
static void
5569
OP_J (int bytemode, int sizeflag)
5570
{
5571
  bfd_vma disp;
5572
  bfd_vma mask = -1;
5573
  bfd_vma segment = 0;
5574

    
5575
  switch (bytemode)
5576
    {
5577
    case b_mode:
5578
      FETCH_DATA (the_info, codep + 1);
5579
      disp = *codep++;
5580
      if ((disp & 0x80) != 0)
5581
        disp -= 0x100;
5582
      break;
5583
    case v_mode:
5584
      if ((sizeflag & DFLAG) || (rex & REX_W))
5585
        disp = get32s ();
5586
      else
5587
        {
5588
          disp = get16 ();
5589
          if ((disp & 0x8000) != 0)
5590
            disp -= 0x10000;
5591
          /* In 16bit mode, address is wrapped around at 64k within
5592
             the same segment.  Otherwise, a data16 prefix on a jump
5593
             instruction means that the pc is masked to 16 bits after
5594
             the displacement is added!  */
5595
          mask = 0xffff;
5596
          if ((prefixes & PREFIX_DATA) == 0)
5597
            segment = ((start_pc + codep - start_codep)
5598
                       & ~((bfd_vma) 0xffff));
5599
        }
5600
      used_prefixes |= (prefixes & PREFIX_DATA);
5601
      break;
5602
    default:
5603
      oappend (INTERNAL_DISASSEMBLER_ERROR);
5604
      return;
5605
    }
5606
  disp = ((start_pc + codep - start_codep + disp) & mask) | segment;
5607
  set_op (disp, 0);
5608
  print_operand_value (scratchbuf, sizeof(scratchbuf), 1, disp);
5609
  oappend (scratchbuf);
5610
}
5611

    
5612
static void
5613
OP_SEG (int bytemode, int sizeflag)
5614
{
5615
  if (bytemode == w_mode)
5616
    oappend (names_seg[modrm.reg]);
5617
  else
5618
    OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
5619
}
5620

    
5621
static void
5622
OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
5623
{
5624
  int seg, offset;
5625

    
5626
  if (sizeflag & DFLAG)
5627
    {
5628
      offset = get32 ();
5629
      seg = get16 ();
5630
    }
5631
  else
5632
    {
5633
      offset = get16 ();
5634
      seg = get16 ();
5635
    }
5636
  used_prefixes |= (prefixes & PREFIX_DATA);
5637
  if (intel_syntax)
5638
    snprintf (scratchbuf, sizeof(scratchbuf), "0x%x:0x%x", seg, offset);
5639
  else
5640
    snprintf (scratchbuf, sizeof(scratchbuf), "$0x%x,$0x%x", seg, offset);
5641
  oappend (scratchbuf);
5642
}
5643

    
5644
static void
5645
OP_OFF (int bytemode, int sizeflag)
5646
{
5647
  bfd_vma off;
5648

    
5649
  if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
5650
    intel_operand_size (bytemode, sizeflag);
5651
  append_seg ();
5652

    
5653
  if ((sizeflag & AFLAG) || address_mode == mode_64bit)
5654
    off = get32 ();
5655
  else
5656
    off = get16 ();
5657

    
5658
  if (intel_syntax)
5659
    {
5660
      if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
5661
                        | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
5662
        {
5663
          oappend (names_seg[ds_reg - es_reg]);
5664
          oappend (":");
5665
        }
5666
    }
5667
  print_operand_value (scratchbuf, sizeof(scratchbuf), 1, off);
5668
  oappend (scratchbuf);
5669
}
5670

    
5671
static void
5672
OP_OFF64 (int bytemode, int sizeflag)
5673
{
5674
  bfd_vma off;
5675

    
5676
  if (address_mode != mode_64bit
5677
      || (prefixes & PREFIX_ADDR))
5678
    {
5679
      OP_OFF (bytemode, sizeflag);
5680
      return;
5681
    }
5682

    
5683
  if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
5684
    intel_operand_size (bytemode, sizeflag);
5685
  append_seg ();
5686

    
5687
  off = get64 ();
5688

    
5689
  if (intel_syntax)
5690
    {
5691
      if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
5692
                        | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
5693
        {
5694
          oappend (names_seg[ds_reg - es_reg]);
5695
          oappend (":");
5696
        }
5697
    }
5698
  print_operand_value (scratchbuf, sizeof(scratchbuf), 1, off);
5699
  oappend (scratchbuf);
5700
}
5701

    
5702
static void
5703
ptr_reg (int code, int sizeflag)
5704
{
5705
  const char *s;
5706

    
5707
  *obufp++ = open_char;
5708
  used_prefixes |= (prefixes & PREFIX_ADDR);
5709
  if (address_mode == mode_64bit)
5710
    {
5711
      if (!(sizeflag & AFLAG))
5712
        s = names32[code - eAX_reg];
5713
      else
5714
        s = names64[code - eAX_reg];
5715
    }
5716
  else if (sizeflag & AFLAG)
5717
    s = names32[code - eAX_reg];
5718
  else
5719
    s = names16[code - eAX_reg];
5720
  oappend (s);
5721
  *obufp++ = close_char;
5722
  *obufp = 0;
5723
}
5724

    
5725
static void
5726
OP_ESreg (int code, int sizeflag)
5727
{
5728
  if (intel_syntax)
5729
    {
5730
      switch (codep[-1])
5731
        {
5732
        case 0x6d:        /* insw/insl */
5733
          intel_operand_size (z_mode, sizeflag);
5734
          break;
5735
        case 0xa5:        /* movsw/movsl/movsq */
5736
        case 0xa7:        /* cmpsw/cmpsl/cmpsq */
5737
        case 0xab:        /* stosw/stosl */
5738
        case 0xaf:        /* scasw/scasl */
5739
          intel_operand_size (v_mode, sizeflag);
5740
          break;
5741
        default:
5742
          intel_operand_size (b_mode, sizeflag);
5743
        }
5744
    }
5745
  oappend ("%es:" + intel_syntax);
5746
  ptr_reg (code, sizeflag);
5747
}
5748

    
5749
static void
5750
OP_DSreg (int code, int sizeflag)
5751
{
5752
  if (intel_syntax)
5753
    {
5754
      switch (codep[-1])
5755
        {
5756
        case 0x6f:        /* outsw/outsl */
5757
          intel_operand_size (z_mode, sizeflag);
5758
          break;
5759
        case 0xa5:        /* movsw/movsl/movsq */
5760
        case 0xa7:        /* cmpsw/cmpsl/cmpsq */
5761
        case 0xad:        /* lodsw/lodsl/lodsq */
5762
          intel_operand_size (v_mode, sizeflag);
5763
          break;
5764
        default:
5765
          intel_operand_size (b_mode, sizeflag);
5766
        }
5767
    }
5768
  if ((prefixes
5769
       & (PREFIX_CS
5770
          | PREFIX_DS
5771
          | PREFIX_SS
5772
          | PREFIX_ES
5773
          | PREFIX_FS
5774
          | PREFIX_GS)) == 0)
5775
    prefixes |= PREFIX_DS;
5776
  append_seg ();
5777
  ptr_reg (code, sizeflag);
5778
}
5779

    
5780
static void
5781
OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
5782
{
5783
  int add = 0;
5784
  if (rex & REX_R)
5785
    {
5786
      USED_REX (REX_R);
5787
      add = 8;
5788
    }
5789
  else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
5790
    {
5791
      used_prefixes |= PREFIX_LOCK;
5792
      add = 8;
5793
    }
5794
  snprintf (scratchbuf, sizeof(scratchbuf), "%%cr%d", modrm.reg + add);
5795
  oappend (scratchbuf + intel_syntax);
5796
}
5797

    
5798
static void
5799
OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
5800
{
5801
  int add = 0;
5802
  USED_REX (REX_R);
5803
  if (rex & REX_R)
5804
    add = 8;
5805
  if (intel_syntax)
5806
    snprintf (scratchbuf, sizeof(scratchbuf), "db%d", modrm.reg + add);
5807
  else
5808
    snprintf (scratchbuf, sizeof(scratchbuf), "%%db%d", modrm.reg + add);
5809
  oappend (scratchbuf);
5810
}
5811

    
5812
static void
5813
OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
5814
{
5815
  snprintf (scratchbuf, sizeof(scratchbuf), "%%tr%d", modrm.reg);
5816
  oappend (scratchbuf + intel_syntax);
5817
}
5818

    
5819
static void
5820
OP_R (int bytemode, int sizeflag)
5821
{
5822
  if (modrm.mod == 3)
5823
    OP_E (bytemode, sizeflag);
5824
  else
5825
    BadOp ();
5826
}
5827

    
5828
static void
5829
OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
5830
{
5831
  used_prefixes |= (prefixes & PREFIX_DATA);
5832
  if (prefixes & PREFIX_DATA)
5833
    {
5834
      int add = 0;
5835
      USED_REX (REX_R);
5836
      if (rex & REX_R)
5837
        add = 8;
5838
      snprintf (scratchbuf, sizeof(scratchbuf), "%%xmm%d", modrm.reg + add);
5839
    }
5840
  else
5841
    snprintf (scratchbuf, sizeof(scratchbuf), "%%mm%d", modrm.reg);
5842
  oappend (scratchbuf + intel_syntax);
5843
}
5844

    
5845
static void
5846
OP_XMM (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
5847
{
5848
  int add = 0;
5849
  USED_REX (REX_R);
5850
  if (rex & REX_R)
5851
    add = 8;
5852
  snprintf (scratchbuf, sizeof(scratchbuf), "%%xmm%d", modrm.reg + add);
5853
  oappend (scratchbuf + intel_syntax);
5854
}
5855

    
5856
static void
5857
OP_EM (int bytemode, int sizeflag)
5858
{
5859
  if (modrm.mod != 3)
5860
    {
5861
      if (intel_syntax && bytemode == v_mode)
5862
        {
5863
          bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
5864
          used_prefixes |= (prefixes & PREFIX_DATA);
5865
         }
5866
      OP_E (bytemode, sizeflag);
5867
      return;
5868
    }
5869

    
5870
  /* Skip mod/rm byte.  */
5871
  MODRM_CHECK;
5872
  codep++;
5873
  used_prefixes |= (prefixes & PREFIX_DATA);
5874
  if (prefixes & PREFIX_DATA)
5875
    {
5876
      int add = 0;
5877

    
5878
      USED_REX (REX_B);
5879
      if (rex & REX_B)
5880
        add = 8;
5881
      snprintf (scratchbuf, sizeof(scratchbuf), "%%xmm%d", modrm.rm + add);
5882
    }
5883
  else
5884
    snprintf (scratchbuf, sizeof(scratchbuf), "%%mm%d", modrm.rm);
5885
  oappend (scratchbuf + intel_syntax);
5886
}
5887

    
5888
/* cvt* are the only instructions in sse2 which have
5889
   both SSE and MMX operands and also have 0x66 prefix
5890
   in their opcode. 0x66 was originally used to differentiate
5891
   between SSE and MMX instruction(operands). So we have to handle the
5892
   cvt* separately using OP_EMC and OP_MXC */
5893
static void
5894
OP_EMC (int bytemode, int sizeflag)
5895
{
5896
  if (modrm.mod != 3)
5897
    {
5898
      if (intel_syntax && bytemode == v_mode)
5899
        {
5900
          bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
5901
          used_prefixes |= (prefixes & PREFIX_DATA);
5902
         }
5903
      OP_E (bytemode, sizeflag);
5904
      return;
5905
    }
5906

    
5907
  /* Skip mod/rm byte.  */
5908
  MODRM_CHECK;
5909
  codep++;
5910
  used_prefixes |= (prefixes & PREFIX_DATA);
5911
  snprintf (scratchbuf, sizeof(scratchbuf), "%%mm%d", modrm.rm);
5912
  oappend (scratchbuf + intel_syntax);
5913
}
5914

    
5915
static void
5916
OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
5917
{
5918
  used_prefixes |= (prefixes & PREFIX_DATA);
5919
  snprintf (scratchbuf, sizeof(scratchbuf), "%%mm%d", modrm.reg);
5920
  oappend (scratchbuf + intel_syntax);
5921
}
5922

    
5923
static void
5924
OP_EX (int bytemode, int sizeflag)
5925
{
5926
  int add = 0;
5927
  if (modrm.mod != 3)
5928
    {
5929
      OP_E (bytemode, sizeflag);
5930
      return;
5931
    }
5932
  USED_REX (REX_B);
5933
  if (rex & REX_B)
5934
    add = 8;
5935

    
5936
  /* Skip mod/rm byte.  */
5937
  MODRM_CHECK;
5938
  codep++;
5939
  snprintf (scratchbuf, sizeof(scratchbuf), "%%xmm%d", modrm.rm + add);
5940
  oappend (scratchbuf + intel_syntax);
5941
}
5942

    
5943
static void
5944
OP_MS (int bytemode, int sizeflag)
5945
{
5946
  if (modrm.mod == 3)
5947
    OP_EM (bytemode, sizeflag);
5948
  else
5949
    BadOp ();
5950
}
5951

    
5952
static void
5953
OP_XS (int bytemode, int sizeflag)
5954
{
5955
  if (modrm.mod == 3)
5956
    OP_EX (bytemode, sizeflag);
5957
  else
5958
    BadOp ();
5959
}
5960

    
5961
static void
5962
OP_M (int bytemode, int sizeflag)
5963
{
5964
  if (modrm.mod == 3)
5965
    /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
5966
    BadOp ();
5967
  else
5968
    OP_E (bytemode, sizeflag);
5969
}
5970

    
5971
static void
5972
OP_0f07 (int bytemode, int sizeflag)
5973
{
5974
  if (modrm.mod != 3 || modrm.rm != 0)
5975
    BadOp ();
5976
  else
5977
    OP_E (bytemode, sizeflag);
5978
}
5979

    
5980
static void
5981
OP_0fae (int bytemode, int sizeflag)
5982
{
5983
  if (modrm.mod == 3)
5984
    {
5985
      if (modrm.reg == 7)
5986
        strcpy (obuf + strlen (obuf) - sizeof ("clflush") + 1, "sfence");
5987

    
5988
      if (modrm.reg < 5 || modrm.rm != 0)
5989
        {
5990
          BadOp ();        /* bad sfence, mfence, or lfence */
5991
          return;
5992
        }
5993
    }
5994
  else if (modrm.reg != 7)
5995
    {
5996
      BadOp ();                /* bad clflush */
5997
      return;
5998
    }
5999

    
6000
  OP_E (bytemode, sizeflag);
6001
}
6002

    
6003
/* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
6004
   32bit mode and "xchg %rax,%rax" in 64bit mode.  */
6005

    
6006
static void
6007
NOP_Fixup1 (int bytemode, int sizeflag)
6008
{
6009
  if ((prefixes & PREFIX_DATA) != 0
6010
      || (rex != 0
6011
          && rex != 0x48
6012
          && address_mode == mode_64bit))
6013
    OP_REG (bytemode, sizeflag);
6014
  else
6015
    strcpy (obuf, "nop");
6016
}
6017

    
6018
static void
6019
NOP_Fixup2 (int bytemode, int sizeflag)
6020
{
6021
  if ((prefixes & PREFIX_DATA) != 0
6022
      || (rex != 0
6023
          && rex != 0x48
6024
          && address_mode == mode_64bit))
6025
    OP_IMREG (bytemode, sizeflag);
6026
}
6027

    
6028
static const char *Suffix3DNow[] = {
6029
/* 00 */        NULL,                NULL,                NULL,                NULL,
6030
/* 04 */        NULL,                NULL,                NULL,                NULL,
6031
/* 08 */        NULL,                NULL,                NULL,                NULL,
6032
/* 0C */        "pi2fw",        "pi2fd",        NULL,                NULL,
6033
/* 10 */        NULL,                NULL,                NULL,                NULL,
6034
/* 14 */        NULL,                NULL,                NULL,                NULL,
6035
/* 18 */        NULL,                NULL,                NULL,                NULL,
6036
/* 1C */        "pf2iw",        "pf2id",        NULL,                NULL,
6037
/* 20 */        NULL,                NULL,                NULL,                NULL,
6038
/* 24 */        NULL,                NULL,                NULL,                NULL,
6039
/* 28 */        NULL,                NULL,                NULL,                NULL,
6040
/* 2C */        NULL,                NULL,                NULL,                NULL,
6041
/* 30 */        NULL,                NULL,                NULL,                NULL,
6042
/* 34 */        NULL,                NULL,                NULL,                NULL,
6043
/* 38 */        NULL,                NULL,                NULL,                NULL,
6044
/* 3C */        NULL,                NULL,                NULL,                NULL,
6045
/* 40 */        NULL,                NULL,                NULL,                NULL,
6046
/* 44 */        NULL,                NULL,                NULL,                NULL,
6047
/* 48 */        NULL,                NULL,                NULL,                NULL,
6048
/* 4C */        NULL,                NULL,                NULL,                NULL,
6049
/* 50 */        NULL,                NULL,                NULL,                NULL,
6050
/* 54 */        NULL,                NULL,                NULL,                NULL,
6051
/* 58 */        NULL,                NULL,                NULL,                NULL,
6052
/* 5C */        NULL,                NULL,                NULL,                NULL,
6053
/* 60 */        NULL,                NULL,                NULL,                NULL,
6054
/* 64 */        NULL,                NULL,                NULL,                NULL,
6055
/* 68 */        NULL,                NULL,                NULL,                NULL,
6056
/* 6C */        NULL,                NULL,                NULL,                NULL,
6057
/* 70 */        NULL,                NULL,                NULL,                NULL,
6058
/* 74 */        NULL,                NULL,                NULL,                NULL,
6059
/* 78 */        NULL,                NULL,                NULL,                NULL,
6060
/* 7C */        NULL,                NULL,                NULL,                NULL,
6061
/* 80 */        NULL,                NULL,                NULL,                NULL,
6062
/* 84 */        NULL,                NULL,                NULL,                NULL,
6063
/* 88 */        NULL,                NULL,                "pfnacc",        NULL,
6064
/* 8C */        NULL,                NULL,                "pfpnacc",        NULL,
6065
/* 90 */        "pfcmpge",        NULL,                NULL,                NULL,
6066
/* 94 */        "pfmin",        NULL,                "pfrcp",        "pfrsqrt",
6067
/* 98 */        NULL,                NULL,                "pfsub",        NULL,
6068
/* 9C */        NULL,                NULL,                "pfadd",        NULL,
6069
/* A0 */        "pfcmpgt",        NULL,                NULL,                NULL,
6070
/* A4 */        "pfmax",        NULL,                "pfrcpit1",        "pfrsqit1",
6071
/* A8 */        NULL,                NULL,                "pfsubr",        NULL,
6072
/* AC */        NULL,                NULL,                "pfacc",        NULL,
6073
/* B0 */        "pfcmpeq",        NULL,                NULL,                NULL,
6074
/* B4 */        "pfmul",        NULL,                "pfrcpit2",        "pmulhrw",
6075
/* B8 */        NULL,                NULL,                NULL,                "pswapd",
6076
/* BC */        NULL,                NULL,                NULL,                "pavgusb",
6077
/* C0 */        NULL,                NULL,                NULL,                NULL,
6078
/* C4 */        NULL,                NULL,                NULL,                NULL,
6079
/* C8 */        NULL,                NULL,                NULL,                NULL,
6080
/* CC */        NULL,                NULL,                NULL,                NULL,
6081
/* D0 */        NULL,                NULL,                NULL,                NULL,
6082
/* D4 */        NULL,                NULL,                NULL,                NULL,
6083
/* D8 */        NULL,                NULL,                NULL,                NULL,
6084
/* DC */        NULL,                NULL,                NULL,                NULL,
6085
/* E0 */        NULL,                NULL,                NULL,                NULL,
6086
/* E4 */        NULL,                NULL,                NULL,                NULL,
6087
/* E8 */        NULL,                NULL,                NULL,                NULL,
6088
/* EC */        NULL,                NULL,                NULL,                NULL,
6089
/* F0 */        NULL,                NULL,                NULL,                NULL,
6090
/* F4 */        NULL,                NULL,                NULL,                NULL,
6091
/* F8 */        NULL,                NULL,                NULL,                NULL,
6092
/* FC */        NULL,                NULL,                NULL,                NULL,
6093
};
6094

    
6095
static void
6096
OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
6097
{
6098
  const char *mnemonic;
6099

    
6100
  FETCH_DATA (the_info, codep + 1);
6101
  /* AMD 3DNow! instructions are specified by an opcode suffix in the
6102
     place where an 8-bit immediate would normally go.  ie. the last
6103
     byte of the instruction.  */
6104
  obufp = obuf + strlen (obuf);
6105
  mnemonic = Suffix3DNow[*codep++ & 0xff];
6106
  if (mnemonic)
6107
    oappend (mnemonic);
6108
  else
6109
    {
6110
      /* Since a variable sized modrm/sib chunk is between the start
6111
         of the opcode (0x0f0f) and the opcode suffix, we need to do
6112
         all the modrm processing first, and don't know until now that
6113
         we have a bad opcode.  This necessitates some cleaning up.  */
6114
      op_out[0][0] = '\0';
6115
      op_out[1][0] = '\0';
6116
      BadOp ();
6117
    }
6118
}
6119

    
6120
static const char *simd_cmp_op[] = {
6121
  "eq",
6122
  "lt",
6123
  "le",
6124
  "unord",
6125
  "neq",
6126
  "nlt",
6127
  "nle",
6128
  "ord"
6129
};
6130

    
6131
static void
6132
OP_SIMD_Suffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
6133
{
6134
  unsigned int cmp_type;
6135

    
6136
  FETCH_DATA (the_info, codep + 1);
6137
  obufp = obuf + strlen (obuf);
6138
  cmp_type = *codep++ & 0xff;
6139
  if (cmp_type < 8)
6140
    {
6141
      char suffix1 = 'p', suffix2 = 's';
6142
      used_prefixes |= (prefixes & PREFIX_REPZ);
6143
      if (prefixes & PREFIX_REPZ)
6144
        suffix1 = 's';
6145
      else
6146
        {
6147
          used_prefixes |= (prefixes & PREFIX_DATA);
6148
          if (prefixes & PREFIX_DATA)
6149
            suffix2 = 'd';
6150
          else
6151
            {
6152
              used_prefixes |= (prefixes & PREFIX_REPNZ);
6153
              if (prefixes & PREFIX_REPNZ)
6154
                suffix1 = 's', suffix2 = 'd';
6155
            }
6156
        }
6157
      snprintf (scratchbuf, sizeof(scratchbuf), "cmp%s%c%c",
6158
                simd_cmp_op[cmp_type], suffix1, suffix2);
6159
      used_prefixes |= (prefixes & PREFIX_REPZ);
6160
      oappend (scratchbuf);
6161
    }
6162
  else
6163
    {
6164
      /* We have a bad extension byte.  Clean up.  */
6165
      op_out[0][0] = '\0';
6166
      op_out[1][0] = '\0';
6167
      BadOp ();
6168
    }
6169
}
6170

    
6171
static void
6172
SIMD_Fixup (int extrachar, int sizeflag ATTRIBUTE_UNUSED)
6173
{
6174
  /* Change movlps/movhps to movhlps/movlhps for 2 register operand
6175
     forms of these instructions.  */
6176
  if (modrm.mod == 3)
6177
    {
6178
      char *p = obuf + strlen (obuf);
6179
      *(p + 1) = '\0';
6180
      *p       = *(p - 1);
6181
      *(p - 1) = *(p - 2);
6182
      *(p - 2) = *(p - 3);
6183
      *(p - 3) = extrachar;
6184
    }
6185
}
6186

    
6187
static void
6188
PNI_Fixup (int extrachar ATTRIBUTE_UNUSED, int sizeflag)
6189
{
6190
  if (modrm.mod == 3 && modrm.reg == 1 && modrm.rm <= 1)
6191
    {
6192
      /* Override "sidt".  */
6193
      size_t olen = strlen (obuf);
6194
      char *p = obuf + olen - 4;
6195
      const char * const *names = (address_mode == mode_64bit
6196
                            ? names64 : names32);
6197

    
6198
      /* We might have a suffix when disassembling with -Msuffix.  */
6199
      if (*p == 'i')
6200
        --p;
6201

    
6202
      /* Remove "addr16/addr32" if we aren't in Intel mode.  */
6203
      if (!intel_syntax
6204
          && (prefixes & PREFIX_ADDR)
6205
          && olen >= (4 + 7)
6206
          && *(p - 1) == ' '
6207
          && strncmp (p - 7, "addr", 4) == 0
6208
          && (strncmp (p - 3, "16", 2) == 0
6209
              || strncmp (p - 3, "32", 2) == 0))
6210
        p -= 7;
6211

    
6212
      if (modrm.rm)
6213
        {
6214
          /* mwait %eax,%ecx  */
6215
          strcpy (p, "mwait");
6216
          if (!intel_syntax)
6217
            strcpy (op_out[0], names[0]);
6218
        }
6219
      else
6220
        {
6221
          /* monitor %eax,%ecx,%edx"  */
6222
          strcpy (p, "monitor");
6223
          if (!intel_syntax)
6224
            {
6225
              const char * const *op1_names;
6226
              if (!(prefixes & PREFIX_ADDR))
6227
                op1_names = (address_mode == mode_16bit
6228
                             ? names16 : names);
6229
              else
6230
                {
6231
                  op1_names = (address_mode != mode_32bit
6232
                               ? names32 : names16);
6233
                  used_prefixes |= PREFIX_ADDR;
6234
                }
6235
              strcpy (op_out[0], op1_names[0]);
6236
              strcpy (op_out[2], names[2]);
6237
            }
6238
        }
6239
      if (!intel_syntax)
6240
        {
6241
          strcpy (op_out[1], names[1]);
6242
          two_source_ops = 1;
6243
        }
6244

    
6245
      codep++;
6246
    }
6247
  else
6248
    OP_M (0, sizeflag);
6249
}
6250

    
6251
static void
6252
SVME_Fixup (int bytemode, int sizeflag)
6253
{
6254
  const char *alt;
6255
  char *p;
6256

    
6257
  switch (*codep)
6258
    {
6259
    case 0xd8:
6260
      alt = "vmrun";
6261
      break;
6262
    case 0xd9:
6263
      alt = "vmmcall";
6264
      break;
6265
    case 0xda:
6266
      alt = "vmload";
6267
      break;
6268
    case 0xdb:
6269
      alt = "vmsave";
6270
      break;
6271
    case 0xdc:
6272
      alt = "stgi";
6273
      break;
6274
    case 0xdd:
6275
      alt = "clgi";
6276
      break;
6277
    case 0xde:
6278
      alt = "skinit";
6279
      break;
6280
    case 0xdf:
6281
      alt = "invlpga";
6282
      break;
6283
    default:
6284
      OP_M (bytemode, sizeflag);
6285
      return;
6286
    }
6287
  /* Override "lidt".  */
6288
  p = obuf + strlen (obuf) - 4;
6289
  /* We might have a suffix.  */
6290
  if (*p == 'i')
6291
    --p;
6292
  strcpy (p, alt);
6293
  if (!(prefixes & PREFIX_ADDR))
6294
    {
6295
      ++codep;
6296
      return;
6297
    }
6298
  used_prefixes |= PREFIX_ADDR;
6299
  switch (*codep++)
6300
    {
6301
    case 0xdf:
6302
      strcpy (op_out[1], names32[1]);
6303
      two_source_ops = 1;
6304
          /* Fall through.  */
6305
    case 0xd8:
6306
    case 0xda:
6307
    case 0xdb:
6308
      *obufp++ = open_char;
6309
      if (address_mode == mode_64bit || (sizeflag & AFLAG))
6310
        alt = names32[0];
6311
      else
6312
        alt = names16[0];
6313
      strcpy (obufp, alt);
6314
      obufp += strlen (alt);
6315
      *obufp++ = close_char;
6316
      *obufp = '\0';
6317
      break;
6318
    }
6319
}
6320

    
6321
static void
6322
INVLPG_Fixup (int bytemode, int sizeflag)
6323
{
6324
  const char *alt;
6325

    
6326
  switch (*codep)
6327
    {
6328
    case 0xf8:
6329
      alt = "swapgs";
6330
      break;
6331
    case 0xf9:
6332
      alt = "rdtscp";
6333
      break;
6334
    default:
6335
      OP_M (bytemode, sizeflag);
6336
      return;
6337
    }
6338
  /* Override "invlpg".  */
6339
  strcpy (obuf + strlen (obuf) - 6, alt);
6340
  codep++;
6341
}
6342

    
6343
static void
6344
BadOp (void)
6345
{
6346
  /* Throw away prefixes and 1st. opcode byte.  */
6347
  codep = insn_codep + 1;
6348
  oappend ("(bad)");
6349
}
6350

    
6351
static void
6352
VMX_Fixup (int extrachar ATTRIBUTE_UNUSED, int sizeflag)
6353
{
6354
  if (modrm.mod == 3
6355
      && modrm.reg == 0
6356
      && modrm.rm >=1
6357
      && modrm.rm <= 4)
6358
    {
6359
      /* Override "sgdt".  */
6360
      char *p = obuf + strlen (obuf) - 4;
6361

    
6362
      /* We might have a suffix when disassembling with -Msuffix.  */
6363
      if (*p == 'g')
6364
        --p;
6365

    
6366
      switch (modrm.rm)
6367
        {
6368
        case 1:
6369
          strcpy (p, "vmcall");
6370
          break;
6371
        case 2:
6372
          strcpy (p, "vmlaunch");
6373
          break;
6374
        case 3:
6375
          strcpy (p, "vmresume");
6376
          break;
6377
        case 4:
6378
          strcpy (p, "vmxoff");
6379
          break;
6380
        }
6381

    
6382
      codep++;
6383
    }
6384
  else
6385
    OP_E (0, sizeflag);
6386
}
6387

    
6388
static void
6389
OP_VMX (int bytemode, int sizeflag)
6390
{
6391
  used_prefixes |= (prefixes & (PREFIX_DATA | PREFIX_REPZ));
6392
  if (prefixes & PREFIX_DATA)
6393
    strcpy (obuf, "vmclear");
6394
  else if (prefixes & PREFIX_REPZ)
6395
    strcpy (obuf, "vmxon");
6396
  else
6397
    strcpy (obuf, "vmptrld");
6398
  OP_E (bytemode, sizeflag);
6399
}
6400

    
6401
static void
6402
REP_Fixup (int bytemode, int sizeflag)
6403
{
6404
  /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
6405
     lods and stos.  */
6406
  size_t ilen = 0;
6407

    
6408
  if (prefixes & PREFIX_REPZ)
6409
    switch (*insn_codep)
6410
      {
6411
      case 0x6e:        /* outsb */
6412
      case 0x6f:        /* outsw/outsl */
6413
      case 0xa4:        /* movsb */
6414
      case 0xa5:        /* movsw/movsl/movsq */
6415
        if (!intel_syntax)
6416
          ilen = 5;
6417
        else
6418
          ilen = 4;
6419
        break;
6420
      case 0xaa:        /* stosb */
6421
      case 0xab:        /* stosw/stosl/stosq */
6422
      case 0xac:        /* lodsb */
6423
      case 0xad:        /* lodsw/lodsl/lodsq */
6424
        if (!intel_syntax && (sizeflag & SUFFIX_ALWAYS))
6425
          ilen = 5;
6426
        else
6427
          ilen = 4;
6428
        break;
6429
      case 0x6c:        /* insb */
6430
      case 0x6d:        /* insl/insw */
6431
        if (!intel_syntax)
6432
          ilen = 4;
6433
        else
6434
          ilen = 3;
6435
        break;
6436
      default:
6437
        abort ();
6438
        break;
6439
      }
6440

    
6441
  if (ilen != 0)
6442
    {
6443
      size_t olen;
6444
      char *p;
6445

    
6446
      olen = strlen (obuf);
6447
      p = obuf + olen - ilen - 1 - 4;
6448
      /* Handle "repz [addr16|addr32]".  */
6449
      if ((prefixes & PREFIX_ADDR))
6450
        p -= 1 + 6;
6451

    
6452
      memmove (p + 3, p + 4, olen - (p + 3 - obuf));
6453
    }
6454

    
6455
  switch (bytemode)
6456
    {
6457
    case al_reg:
6458
    case eAX_reg:
6459
    case indir_dx_reg:
6460
      OP_IMREG (bytemode, sizeflag);
6461
      break;
6462
    case eDI_reg:
6463
      OP_ESreg (bytemode, sizeflag);
6464
      break;
6465
    case eSI_reg:
6466
      OP_DSreg (bytemode, sizeflag);
6467
      break;
6468
    default:
6469
      abort ();
6470
      break;
6471
    }
6472
}
6473

    
6474
static void
6475
CMPXCHG8B_Fixup (int bytemode, int sizeflag)
6476
{
6477
  USED_REX (REX_W);
6478
  if (rex & REX_W)
6479
    {
6480
      /* Change cmpxchg8b to cmpxchg16b.  */
6481
      char *p = obuf + strlen (obuf) - 2;
6482
      strcpy (p, "16b");
6483
      bytemode = o_mode;
6484
    }
6485
  OP_M (bytemode, sizeflag);
6486
}
6487

    
6488
static void
6489
XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
6490
{
6491
  snprintf (scratchbuf, sizeof(scratchbuf), "%%xmm%d", reg);
6492
  oappend (scratchbuf + intel_syntax);
6493
}
6494

    
6495
static void
6496
CRC32_Fixup (int bytemode, int sizeflag)
6497
{
6498
  /* Add proper suffix to "crc32".  */
6499
  char *p = obuf + strlen (obuf);
6500

    
6501
  switch (bytemode)
6502
    {
6503
    case b_mode:
6504
      if (intel_syntax)
6505
        break;
6506

    
6507
      *p++ = 'b';
6508
      break;
6509
    case v_mode:
6510
      if (intel_syntax)
6511
        break;
6512

    
6513
      USED_REX (REX_W);
6514
      if (rex & REX_W)
6515
        *p++ = 'q';
6516
      else if (sizeflag & DFLAG)
6517
        *p++ = 'l';
6518
      else
6519
        *p++ = 'w';
6520
      used_prefixes |= (prefixes & PREFIX_DATA);
6521
      break;
6522
    default:
6523
      oappend (INTERNAL_DISASSEMBLER_ERROR);
6524
      break;
6525
    }
6526
  *p = '\0';
6527

    
6528
  if (modrm.mod == 3)
6529
    {
6530
      int add;
6531

    
6532
      /* Skip mod/rm byte.  */
6533
      MODRM_CHECK;
6534
      codep++;
6535

    
6536
      USED_REX (REX_B);
6537
      add = (rex & REX_B) ? 8 : 0;
6538
      if (bytemode == b_mode)
6539
        {
6540
          USED_REX (0);
6541
          if (rex)
6542
            oappend (names8rex[modrm.rm + add]);
6543
          else
6544
            oappend (names8[modrm.rm + add]);
6545
        }
6546
      else
6547
        {
6548
          USED_REX (REX_W);
6549
          if (rex & REX_W)
6550
            oappend (names64[modrm.rm + add]);
6551
          else if ((prefixes & PREFIX_DATA))
6552
            oappend (names16[modrm.rm + add]);
6553
          else
6554
            oappend (names32[modrm.rm + add]);
6555
        }
6556
    }
6557
  else
6558
    OP_E (bytemode, sizeflag);
6559
}