OpenCores
URL https://opencores.org/ocsvn/scarts/scarts/trunk

Subversion Repositories scarts

[/] [scarts/] [trunk/] [toolchain/] [scarts-binutils/] [binutils-2.19.1/] [opcodes/] [i386-dis.c] - Blame information for rev 7

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

Line No. Rev Author Line
1 6 jlechner
/* Print i386 instructions for GDB, the GNU debugger.
2
   Copyright 1988, 1989, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3
   2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
4
   Free Software Foundation, Inc.
5
 
6
   This file is part of the GNU opcodes library.
7
 
8
   This library 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 3, or (at your option)
11
   any later version.
12
 
13
   It is distributed in the hope that it will be useful, but WITHOUT
14
   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15
   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
16
   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, write to the Free Software
20
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21
   MA 02110-1301, USA.  */
22
 
23
 
24
/* 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu)
25
   July 1988
26
    modified by John Hassey (hassey@dg-rtp.dg.com)
27
    x86-64 support added by Jan Hubicka (jh@suse.cz)
28
    VIA PadLock support by Michal Ludvig (mludvig@suse.cz).  */
29
 
30
/* The main tables describing the instructions is essentially a copy
31
   of the "Opcode Map" chapter (Appendix A) of the Intel 80386
32
   Programmers Manual.  Usually, there is a capital letter, followed
33
   by a small letter.  The capital letter tell the addressing mode,
34
   and the small letter tells about the operand size.  Refer to
35
   the Intel manual for details.  */
36
 
37
#include "sysdep.h"
38
#include "dis-asm.h"
39
#include "opintl.h"
40
#include "opcode/i386.h"
41
#include "libiberty.h"
42
 
43
#include <setjmp.h>
44
 
45
static int fetch_data (struct disassemble_info *, bfd_byte *);
46
static void ckprefix (void);
47
static const char *prefix_name (int, int);
48
static int print_insn (bfd_vma, disassemble_info *);
49
static void dofloat (int);
50
static void OP_ST (int, int);
51
static void OP_STi (int, int);
52
static int putop (const char *, int);
53
static void oappend (const char *);
54
static void append_seg (void);
55
static void OP_indirE (int, int);
56
static void print_operand_value (char *, int, bfd_vma);
57
static void OP_E_register (int, int);
58
static void OP_E_memory (int, int, int);
59
static void OP_E_extended (int, int, int);
60
static void print_displacement (char *, bfd_vma);
61
static void OP_E (int, int);
62
static void OP_G (int, int);
63
static bfd_vma get64 (void);
64
static bfd_signed_vma get32 (void);
65
static bfd_signed_vma get32s (void);
66
static int get16 (void);
67
static void set_op (bfd_vma, int);
68
static void OP_Skip_MODRM (int, int);
69
static void OP_REG (int, int);
70
static void OP_IMREG (int, int);
71
static void OP_I (int, int);
72
static void OP_I64 (int, int);
73
static void OP_sI (int, int);
74
static void OP_J (int, int);
75
static void OP_SEG (int, int);
76
static void OP_DIR (int, int);
77
static void OP_OFF (int, int);
78
static void OP_OFF64 (int, int);
79
static void ptr_reg (int, int);
80
static void OP_ESreg (int, int);
81
static void OP_DSreg (int, int);
82
static void OP_C (int, int);
83
static void OP_D (int, int);
84
static void OP_T (int, int);
85
static void OP_R (int, int);
86
static void OP_MMX (int, int);
87
static void OP_XMM (int, int);
88
static void OP_EM (int, int);
89
static void OP_EX (int, int);
90
static void OP_EMC (int,int);
91
static void OP_MXC (int,int);
92
static void OP_MS (int, int);
93
static void OP_XS (int, int);
94
static void OP_M (int, int);
95
static void OP_VEX (int, int);
96
static void OP_VEX_FMA (int, int);
97
static void OP_EX_Vex (int, int);
98
static void OP_EX_VexW (int, int);
99
static void OP_EX_VexImmW (int, int);
100
static void OP_XMM_Vex (int, int);
101
static void OP_XMM_VexW (int, int);
102
static void OP_REG_VexI4 (int, int);
103
static void PCLMUL_Fixup (int, int);
104
static void VEXI4_Fixup (int, int);
105
static void VZERO_Fixup (int, int);
106
static void VCMP_Fixup (int, int);
107
static void VPERMIL2_Fixup (int, int);
108
static void OP_0f07 (int, int);
109
static void OP_Monitor (int, int);
110
static void OP_Mwait (int, int);
111
static void NOP_Fixup1 (int, int);
112
static void NOP_Fixup2 (int, int);
113
static void OP_3DNowSuffix (int, int);
114
static void CMP_Fixup (int, int);
115
static void BadOp (void);
116
static void REP_Fixup (int, int);
117
static void CMPXCHG8B_Fixup (int, int);
118
static void XMM_Fixup (int, int);
119
static void CRC32_Fixup (int, int);
120
static void print_drex_arg (unsigned int, int, int);
121
static void OP_DREX4 (int, int);
122
static void OP_DREX3 (int, int);
123
static void OP_DREX_ICMP (int, int);
124
static void OP_DREX_FCMP (int, int);
125
static void MOVBE_Fixup (int, int);
126
 
127
struct dis_private {
128
  /* Points to first byte not fetched.  */
129
  bfd_byte *max_fetched;
130
  bfd_byte the_buffer[MAX_MNEM_SIZE];
131
  bfd_vma insn_start;
132
  int orig_sizeflag;
133
  jmp_buf bailout;
134
};
135
 
136
enum address_mode
137
{
138
  mode_16bit,
139
  mode_32bit,
140
  mode_64bit
141
};
142
 
143
enum address_mode address_mode;
144
 
145
/* Flags for the prefixes for the current instruction.  See below.  */
146
static int prefixes;
147
 
148
/* REX prefix the current instruction.  See below.  */
149
static int rex;
150
/* Bits of REX we've already used.  */
151
static int rex_used;
152
/* Original REX prefix.  */
153
static int rex_original;
154
/* REX bits in original REX prefix ignored.  It may not be the same
155
   as rex_original since some bits may not be ignored.  */
156
static int rex_ignored;
157
/* Mark parts used in the REX prefix.  When we are testing for
158
   empty prefix (for 8bit register REX extension), just mask it
159
   out.  Otherwise test for REX bit is excuse for existence of REX
160
   only in case value is nonzero.  */
161
#define USED_REX(value)                                 \
162
  {                                                     \
163
    if (value)                                          \
164
      {                                                 \
165
        if ((rex & value))                              \
166
          rex_used |= (value) | REX_OPCODE;             \
167
      }                                                 \
168
    else                                                \
169
      rex_used |= REX_OPCODE;                           \
170
  }
171
 
172
/* Special 'registers' for DREX handling */
173
#define DREX_REG_UNKNOWN        1000    /* not initialized */
174
#define DREX_REG_MEMORY         1001    /* use MODRM/SIB/OFFSET memory */
175
 
176
/* The DREX byte has the following fields:
177
   Bits 7-4 -- DREX.Dest, xmm destination register
178
   Bit 3    -- DREX.OC0, operand config bit defines operand order
179
   Bit 2    -- DREX.R, equivalent to REX_R bit, to extend ModRM register
180
   Bit 1    -- DREX.X, equivalent to REX_X bit, to extend SIB index field
181
   Bit 0    -- DREX.W, equivalent to REX_B bit, to extend ModRM r/m field,
182
               SIB base field, or opcode reg field.  */
183
#define DREX_XMM(drex) ((drex >> 4) & 0xf)
184
#define DREX_OC0(drex) ((drex >> 3) & 0x1)
185
 
186
/* Flags for prefixes which we somehow handled when printing the
187
   current instruction.  */
188
static int used_prefixes;
189
 
190
/* Flags stored in PREFIXES.  */
191
#define PREFIX_REPZ 1
192
#define PREFIX_REPNZ 2
193
#define PREFIX_LOCK 4
194
#define PREFIX_CS 8
195
#define PREFIX_SS 0x10
196
#define PREFIX_DS 0x20
197
#define PREFIX_ES 0x40
198
#define PREFIX_FS 0x80
199
#define PREFIX_GS 0x100
200
#define PREFIX_DATA 0x200
201
#define PREFIX_ADDR 0x400
202
#define PREFIX_FWAIT 0x800
203
 
204
/* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
205
   to ADDR (exclusive) are valid.  Returns 1 for success, longjmps
206
   on error.  */
207
#define FETCH_DATA(info, addr) \
208
  ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
209
   ? 1 : fetch_data ((info), (addr)))
210
 
211
static int
212
fetch_data (struct disassemble_info *info, bfd_byte *addr)
213
{
214
  int status;
215
  struct dis_private *priv = (struct dis_private *) info->private_data;
216
  bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
217
 
218
  if (addr <= priv->the_buffer + MAX_MNEM_SIZE)
219
    status = (*info->read_memory_func) (start,
220
                                        priv->max_fetched,
221
                                        addr - priv->max_fetched,
222
                                        info);
223
  else
224
    status = -1;
225
  if (status != 0)
226
    {
227
      /* If we did manage to read at least one byte, then
228
         print_insn_i386 will do something sensible.  Otherwise, print
229
         an error.  We do that here because this is where we know
230
         STATUS.  */
231
      if (priv->max_fetched == priv->the_buffer)
232
        (*info->memory_error_func) (status, start, info);
233
      longjmp (priv->bailout, 1);
234
    }
235
  else
236
    priv->max_fetched = addr;
237
  return 1;
238
}
239
 
240
#define XX { NULL, 0 }
241
 
242
#define Eb { OP_E, b_mode }
243
#define Ev { OP_E, v_mode }
244
#define Ed { OP_E, d_mode }
245
#define Edq { OP_E, dq_mode }
246
#define Edqw { OP_E, dqw_mode }
247
#define Edqb { OP_E, dqb_mode }
248
#define Edqd { OP_E, dqd_mode }
249
#define Eq { OP_E, q_mode }
250
#define indirEv { OP_indirE, stack_v_mode }
251
#define indirEp { OP_indirE, f_mode }
252
#define stackEv { OP_E, stack_v_mode }
253
#define Em { OP_E, m_mode }
254
#define Ew { OP_E, w_mode }
255
#define M { OP_M, 0 }           /* lea, lgdt, etc. */
256
#define Ma { OP_M, a_mode }
257
#define Mb { OP_M, b_mode }
258
#define Md { OP_M, d_mode }
259
#define Mo { OP_M, o_mode }
260
#define Mp { OP_M, f_mode }             /* 32 or 48 bit memory operand for LDS, LES etc */
261
#define Mq { OP_M, q_mode }
262
#define Mx { OP_M, x_mode }
263
#define Mxmm { OP_M, xmm_mode }
264
#define Gb { OP_G, b_mode }
265
#define Gv { OP_G, v_mode }
266
#define Gd { OP_G, d_mode }
267
#define Gdq { OP_G, dq_mode }
268
#define Gm { OP_G, m_mode }
269
#define Gw { OP_G, w_mode }
270
#define Rd { OP_R, d_mode }
271
#define Rm { OP_R, m_mode }
272
#define Ib { OP_I, b_mode }
273
#define sIb { OP_sI, b_mode }   /* sign extened byte */
274
#define Iv { OP_I, v_mode }
275
#define Iq { OP_I, q_mode }
276
#define Iv64 { OP_I64, v_mode }
277
#define Iw { OP_I, w_mode }
278
#define I1 { OP_I, const_1_mode }
279
#define Jb { OP_J, b_mode }
280
#define Jv { OP_J, v_mode }
281
#define Cm { OP_C, m_mode }
282
#define Dm { OP_D, m_mode }
283
#define Td { OP_T, d_mode }
284
#define Skip_MODRM { OP_Skip_MODRM, 0 }
285
 
286
#define RMeAX { OP_REG, eAX_reg }
287
#define RMeBX { OP_REG, eBX_reg }
288
#define RMeCX { OP_REG, eCX_reg }
289
#define RMeDX { OP_REG, eDX_reg }
290
#define RMeSP { OP_REG, eSP_reg }
291
#define RMeBP { OP_REG, eBP_reg }
292
#define RMeSI { OP_REG, eSI_reg }
293
#define RMeDI { OP_REG, eDI_reg }
294
#define RMrAX { OP_REG, rAX_reg }
295
#define RMrBX { OP_REG, rBX_reg }
296
#define RMrCX { OP_REG, rCX_reg }
297
#define RMrDX { OP_REG, rDX_reg }
298
#define RMrSP { OP_REG, rSP_reg }
299
#define RMrBP { OP_REG, rBP_reg }
300
#define RMrSI { OP_REG, rSI_reg }
301
#define RMrDI { OP_REG, rDI_reg }
302
#define RMAL { OP_REG, al_reg }
303
#define RMAL { OP_REG, al_reg }
304
#define RMCL { OP_REG, cl_reg }
305
#define RMDL { OP_REG, dl_reg }
306
#define RMBL { OP_REG, bl_reg }
307
#define RMAH { OP_REG, ah_reg }
308
#define RMCH { OP_REG, ch_reg }
309
#define RMDH { OP_REG, dh_reg }
310
#define RMBH { OP_REG, bh_reg }
311
#define RMAX { OP_REG, ax_reg }
312
#define RMDX { OP_REG, dx_reg }
313
 
314
#define eAX { OP_IMREG, eAX_reg }
315
#define eBX { OP_IMREG, eBX_reg }
316
#define eCX { OP_IMREG, eCX_reg }
317
#define eDX { OP_IMREG, eDX_reg }
318
#define eSP { OP_IMREG, eSP_reg }
319
#define eBP { OP_IMREG, eBP_reg }
320
#define eSI { OP_IMREG, eSI_reg }
321
#define eDI { OP_IMREG, eDI_reg }
322
#define AL { OP_IMREG, al_reg }
323
#define CL { OP_IMREG, cl_reg }
324
#define DL { OP_IMREG, dl_reg }
325
#define BL { OP_IMREG, bl_reg }
326
#define AH { OP_IMREG, ah_reg }
327
#define CH { OP_IMREG, ch_reg }
328
#define DH { OP_IMREG, dh_reg }
329
#define BH { OP_IMREG, bh_reg }
330
#define AX { OP_IMREG, ax_reg }
331
#define DX { OP_IMREG, dx_reg }
332
#define zAX { OP_IMREG, z_mode_ax_reg }
333
#define indirDX { OP_IMREG, indir_dx_reg }
334
 
335
#define Sw { OP_SEG, w_mode }
336
#define Sv { OP_SEG, v_mode }
337
#define Ap { OP_DIR, 0 }
338
#define Ob { OP_OFF64, b_mode }
339
#define Ov { OP_OFF64, v_mode }
340
#define Xb { OP_DSreg, eSI_reg }
341
#define Xv { OP_DSreg, eSI_reg }
342
#define Xz { OP_DSreg, eSI_reg }
343
#define Yb { OP_ESreg, eDI_reg }
344
#define Yv { OP_ESreg, eDI_reg }
345
#define DSBX { OP_DSreg, eBX_reg }
346
 
347
#define es { OP_REG, es_reg }
348
#define ss { OP_REG, ss_reg }
349
#define cs { OP_REG, cs_reg }
350
#define ds { OP_REG, ds_reg }
351
#define fs { OP_REG, fs_reg }
352
#define gs { OP_REG, gs_reg }
353
 
354
#define MX { OP_MMX, 0 }
355
#define XM { OP_XMM, 0 }
356
#define XMM { OP_XMM, xmm_mode }
357
#define EM { OP_EM, v_mode }
358
#define EMd { OP_EM, d_mode }
359
#define EMx { OP_EM, x_mode }
360
#define EXw { OP_EX, w_mode }
361
#define EXd { OP_EX, d_mode }
362
#define EXq { OP_EX, q_mode }
363
#define EXx { OP_EX, x_mode }
364
#define EXxmm { OP_EX, xmm_mode }
365
#define EXxmmq { OP_EX, xmmq_mode }
366
#define EXymmq { OP_EX, ymmq_mode }
367
#define MS { OP_MS, v_mode }
368
#define XS { OP_XS, v_mode }
369
#define EMCq { OP_EMC, q_mode }
370
#define MXC { OP_MXC, 0 }
371
#define OPSUF { OP_3DNowSuffix, 0 }
372
#define CMP { CMP_Fixup, 0 }
373
#define XMM0 { XMM_Fixup, 0 }
374
 
375
#define Vex { OP_VEX, vex_mode }
376
#define Vex128 { OP_VEX, vex128_mode }
377
#define Vex256 { OP_VEX, vex256_mode }
378
#define VexI4 { VEXI4_Fixup, 0}
379
#define VexFMA { OP_VEX_FMA, vex_mode }
380
#define Vex128FMA { OP_VEX_FMA, vex128_mode }
381
#define EXdVex { OP_EX_Vex, d_mode }
382
#define EXqVex { OP_EX_Vex, q_mode }
383
#define EXVexW { OP_EX_VexW, x_mode }
384
#define EXdVexW { OP_EX_VexW, d_mode }
385
#define EXqVexW { OP_EX_VexW, q_mode }
386
#define EXVexImmW { OP_EX_VexImmW, x_mode }
387
#define XMVex { OP_XMM_Vex, 0 }
388
#define XMVexW { OP_XMM_VexW, 0 }
389
#define XMVexI4 { OP_REG_VexI4, x_mode }
390
#define PCLMUL { PCLMUL_Fixup, 0 }
391
#define VZERO { VZERO_Fixup, 0 }
392
#define VCMP { VCMP_Fixup, 0 }
393
#define VPERMIL2 { VPERMIL2_Fixup, 0 }
394
 
395
/* Used handle "rep" prefix for string instructions.  */
396
#define Xbr { REP_Fixup, eSI_reg }
397
#define Xvr { REP_Fixup, eSI_reg }
398
#define Ybr { REP_Fixup, eDI_reg }
399
#define Yvr { REP_Fixup, eDI_reg }
400
#define Yzr { REP_Fixup, eDI_reg }
401
#define indirDXr { REP_Fixup, indir_dx_reg }
402
#define ALr { REP_Fixup, al_reg }
403
#define eAXr { REP_Fixup, eAX_reg }
404
 
405
#define cond_jump_flag { NULL, cond_jump_mode }
406
#define loop_jcxz_flag { NULL, loop_jcxz_mode }
407
 
408
/* bits in sizeflag */
409
#define SUFFIX_ALWAYS 4
410
#define AFLAG 2
411
#define DFLAG 1
412
 
413
/* byte operand */
414
#define b_mode                  1
415
/* operand size depends on prefixes */
416
#define v_mode                  (b_mode + 1)
417
/* word operand */
418
#define w_mode                  (v_mode + 1)
419
/* double word operand  */
420
#define d_mode                  (w_mode + 1)
421
/* quad word operand */
422
#define q_mode                  (d_mode + 1)
423
/* ten-byte operand */
424
#define t_mode                  (q_mode + 1)
425
/* 16-byte XMM or 32-byte YMM operand */
426
#define x_mode                  (t_mode + 1)
427
/* 16-byte XMM operand */
428
#define xmm_mode                (x_mode + 1)
429
/* 16-byte XMM or quad word operand */
430
#define xmmq_mode               (xmm_mode + 1)
431
/* 32-byte YMM or quad word operand */
432
#define ymmq_mode               (xmmq_mode + 1)
433
/* d_mode in 32bit, q_mode in 64bit mode.  */
434
#define m_mode                  (ymmq_mode + 1)
435
/* pair of v_mode operands */
436
#define a_mode                  (m_mode + 1)
437
#define cond_jump_mode          (a_mode + 1)
438
#define loop_jcxz_mode          (cond_jump_mode + 1)
439
/* operand size depends on REX prefixes.  */
440
#define dq_mode                 (loop_jcxz_mode + 1)
441
/* registers like dq_mode, memory like w_mode.  */
442
#define dqw_mode                (dq_mode + 1)
443
/* 4- or 6-byte pointer operand */
444
#define f_mode                  (dqw_mode + 1)
445
#define const_1_mode            (f_mode + 1)
446
/* v_mode for stack-related opcodes.  */
447
#define stack_v_mode            (const_1_mode + 1)
448
/* non-quad operand size depends on prefixes */
449
#define z_mode                  (stack_v_mode + 1)
450
/* 16-byte operand */
451
#define o_mode                  (z_mode + 1)
452
/* registers like dq_mode, memory like b_mode.  */
453
#define dqb_mode                (o_mode + 1)
454
/* registers like dq_mode, memory like d_mode.  */
455
#define dqd_mode                (dqb_mode + 1)
456
/* normal vex mode */
457
#define vex_mode                (dqd_mode + 1)
458
/* 128bit vex mode */
459
#define vex128_mode             (vex_mode + 1)
460
/* 256bit vex mode */
461
#define vex256_mode             (vex128_mode + 1)
462
 
463
#define es_reg                  (vex256_mode + 1)
464
#define cs_reg                  (es_reg + 1)
465
#define ss_reg                  (cs_reg + 1)
466
#define ds_reg                  (ss_reg + 1)
467
#define fs_reg                  (ds_reg + 1)
468
#define gs_reg                  (fs_reg + 1)
469
 
470
#define eAX_reg                 (gs_reg + 1)
471
#define eCX_reg                 (eAX_reg + 1)
472
#define eDX_reg                 (eCX_reg + 1)
473
#define eBX_reg                 (eDX_reg + 1)
474
#define eSP_reg                 (eBX_reg + 1)
475
#define eBP_reg                 (eSP_reg + 1)
476
#define eSI_reg                 (eBP_reg + 1)
477
#define eDI_reg                 (eSI_reg + 1)
478
 
479
#define al_reg                  (eDI_reg + 1)
480
#define cl_reg                  (al_reg + 1)
481
#define dl_reg                  (cl_reg + 1)
482
#define bl_reg                  (dl_reg + 1)
483
#define ah_reg                  (bl_reg + 1)
484
#define ch_reg                  (ah_reg + 1)
485
#define dh_reg                  (ch_reg + 1)
486
#define bh_reg                  (dh_reg + 1)
487
 
488
#define ax_reg                  (bh_reg + 1)
489
#define cx_reg                  (ax_reg + 1)
490
#define dx_reg                  (cx_reg + 1)
491
#define bx_reg                  (dx_reg + 1)
492
#define sp_reg                  (bx_reg + 1)
493
#define bp_reg                  (sp_reg + 1)
494
#define si_reg                  (bp_reg + 1)
495
#define di_reg                  (si_reg + 1)
496
 
497
#define rAX_reg                 (di_reg + 1)
498
#define rCX_reg                 (rAX_reg + 1)
499
#define rDX_reg                 (rCX_reg + 1)
500
#define rBX_reg                 (rDX_reg + 1)
501
#define rSP_reg                 (rBX_reg + 1)
502
#define rBP_reg                 (rSP_reg + 1)
503
#define rSI_reg                 (rBP_reg + 1)
504
#define rDI_reg                 (rSI_reg + 1)
505
 
506
#define z_mode_ax_reg           (rDI_reg + 1)
507
#define indir_dx_reg            (z_mode_ax_reg + 1)
508
 
509
#define MAX_BYTEMODE    indir_dx_reg
510
 
511
/* Flags that are OR'ed into the bytemode field to pass extra
512
   information.  */
513
#define DREX_OC1                0x10000 /* OC1 bit set */
514
#define DREX_NO_OC0             0x20000 /* OC0 bit not used */
515
#define DREX_MASK               0x40000 /* mask to delete */
516
 
517
#if MAX_BYTEMODE >= DREX_OC1
518
#error MAX_BYTEMODE must be less than DREX_OC1
519
#endif
520
 
521
#define FLOATCODE               1
522
#define USE_REG_TABLE           (FLOATCODE + 1)
523
#define USE_MOD_TABLE           (USE_REG_TABLE + 1)
524
#define USE_RM_TABLE            (USE_MOD_TABLE + 1)
525
#define USE_PREFIX_TABLE        (USE_RM_TABLE + 1)
526
#define USE_X86_64_TABLE        (USE_PREFIX_TABLE + 1)
527
#define USE_3BYTE_TABLE         (USE_X86_64_TABLE + 1)
528
#define USE_VEX_C4_TABLE        (USE_3BYTE_TABLE + 1)
529
#define USE_VEX_C5_TABLE        (USE_VEX_C4_TABLE + 1)
530
#define USE_VEX_LEN_TABLE       (USE_VEX_C5_TABLE + 1)
531
 
532
#define FLOAT                   NULL, { { NULL, FLOATCODE } }
533
 
534
#define DIS386(T, I)            NULL, { { NULL, (T)}, { NULL,  (I) } }
535
#define REG_TABLE(I)            DIS386 (USE_REG_TABLE, (I))
536
#define MOD_TABLE(I)            DIS386 (USE_MOD_TABLE, (I))
537
#define RM_TABLE(I)             DIS386 (USE_RM_TABLE, (I))
538
#define PREFIX_TABLE(I)         DIS386 (USE_PREFIX_TABLE, (I))
539
#define X86_64_TABLE(I)         DIS386 (USE_X86_64_TABLE, (I))
540
#define THREE_BYTE_TABLE(I)     DIS386 (USE_3BYTE_TABLE, (I))
541
#define VEX_C4_TABLE(I)         DIS386 (USE_VEX_C4_TABLE, (I))
542
#define VEX_C5_TABLE(I)         DIS386 (USE_VEX_C5_TABLE, (I))
543
#define VEX_LEN_TABLE(I)        DIS386 (USE_VEX_LEN_TABLE, (I))
544
 
545
#define REG_80                  0
546
#define REG_81                  (REG_80 + 1)
547
#define REG_82                  (REG_81 + 1)
548
#define REG_8F                  (REG_82 + 1)
549
#define REG_C0                  (REG_8F + 1)
550
#define REG_C1                  (REG_C0 + 1)
551
#define REG_C6                  (REG_C1 + 1)
552
#define REG_C7                  (REG_C6 + 1)
553
#define REG_D0                  (REG_C7 + 1)
554
#define REG_D1                  (REG_D0 + 1)
555
#define REG_D2                  (REG_D1 + 1)
556
#define REG_D3                  (REG_D2 + 1)
557
#define REG_F6                  (REG_D3 + 1)
558
#define REG_F7                  (REG_F6 + 1)
559
#define REG_FE                  (REG_F7 + 1)
560
#define REG_FF                  (REG_FE + 1)
561
#define REG_0F00                (REG_FF + 1)
562
#define REG_0F01                (REG_0F00 + 1)
563
#define REG_0F0D                (REG_0F01 + 1)
564
#define REG_0F18                (REG_0F0D + 1)
565
#define REG_0F71                (REG_0F18 + 1)
566
#define REG_0F72                (REG_0F71 + 1)
567
#define REG_0F73                (REG_0F72 + 1)
568
#define REG_0FA6                (REG_0F73 + 1)
569
#define REG_0FA7                (REG_0FA6 + 1)
570
#define REG_0FAE                (REG_0FA7 + 1)
571
#define REG_0FBA                (REG_0FAE + 1)
572
#define REG_0FC7                (REG_0FBA + 1)
573
#define REG_VEX_71              (REG_0FC7 + 1)
574
#define REG_VEX_72              (REG_VEX_71 + 1)
575
#define REG_VEX_73              (REG_VEX_72 + 1)
576
#define REG_VEX_AE              (REG_VEX_73 + 1)
577
 
578
#define MOD_8D                  0
579
#define MOD_0F01_REG_0          (MOD_8D + 1)
580
#define MOD_0F01_REG_1          (MOD_0F01_REG_0 + 1)
581
#define MOD_0F01_REG_2          (MOD_0F01_REG_1 + 1)
582
#define MOD_0F01_REG_3          (MOD_0F01_REG_2 + 1)
583
#define MOD_0F01_REG_7          (MOD_0F01_REG_3 + 1)
584
#define MOD_0F12_PREFIX_0       (MOD_0F01_REG_7 + 1)
585
#define MOD_0F13                (MOD_0F12_PREFIX_0 + 1)
586
#define MOD_0F16_PREFIX_0       (MOD_0F13 + 1)
587
#define MOD_0F17                (MOD_0F16_PREFIX_0 + 1)
588
#define MOD_0F18_REG_0          (MOD_0F17 + 1)
589
#define MOD_0F18_REG_1          (MOD_0F18_REG_0 + 1)
590
#define MOD_0F18_REG_2          (MOD_0F18_REG_1 + 1)
591
#define MOD_0F18_REG_3          (MOD_0F18_REG_2 + 1)
592
#define MOD_0F20                (MOD_0F18_REG_3 + 1)
593
#define MOD_0F21                (MOD_0F20 + 1)
594
#define MOD_0F22                (MOD_0F21 + 1)
595
#define MOD_0F23                (MOD_0F22 + 1)
596
#define MOD_0F24                (MOD_0F23 + 1)
597
#define MOD_0F26                (MOD_0F24 + 1)
598
#define MOD_0F2B_PREFIX_0       (MOD_0F26 + 1)
599
#define MOD_0F2B_PREFIX_1       (MOD_0F2B_PREFIX_0 + 1)
600
#define MOD_0F2B_PREFIX_2       (MOD_0F2B_PREFIX_1 + 1)
601
#define MOD_0F2B_PREFIX_3       (MOD_0F2B_PREFIX_2 + 1)
602
#define MOD_0F51                (MOD_0F2B_PREFIX_3 + 1)
603
#define MOD_0F71_REG_2          (MOD_0F51 + 1)
604
#define MOD_0F71_REG_4          (MOD_0F71_REG_2 + 1)
605
#define MOD_0F71_REG_6          (MOD_0F71_REG_4 + 1)
606
#define MOD_0F72_REG_2          (MOD_0F71_REG_6 + 1)
607
#define MOD_0F72_REG_4          (MOD_0F72_REG_2 + 1)
608
#define MOD_0F72_REG_6          (MOD_0F72_REG_4 + 1)
609
#define MOD_0F73_REG_2          (MOD_0F72_REG_6 + 1)
610
#define MOD_0F73_REG_3          (MOD_0F73_REG_2 + 1)
611
#define MOD_0F73_REG_6          (MOD_0F73_REG_3 + 1)
612
#define MOD_0F73_REG_7          (MOD_0F73_REG_6 + 1)
613
#define MOD_0FAE_REG_0          (MOD_0F73_REG_7 + 1)
614
#define MOD_0FAE_REG_1          (MOD_0FAE_REG_0 + 1)
615
#define MOD_0FAE_REG_2          (MOD_0FAE_REG_1 + 1)
616
#define MOD_0FAE_REG_3          (MOD_0FAE_REG_2 + 1)
617
#define MOD_0FAE_REG_4          (MOD_0FAE_REG_3 + 1)
618
#define MOD_0FAE_REG_5          (MOD_0FAE_REG_4 + 1)
619
#define MOD_0FAE_REG_6          (MOD_0FAE_REG_5 + 1)
620
#define MOD_0FAE_REG_7          (MOD_0FAE_REG_6 + 1)
621
#define MOD_0FB2                (MOD_0FAE_REG_7 + 1)
622
#define MOD_0FB4                (MOD_0FB2 + 1)
623
#define MOD_0FB5                (MOD_0FB4 + 1)
624
#define MOD_0FC7_REG_6          (MOD_0FB5 + 1)
625
#define MOD_0FC7_REG_7          (MOD_0FC7_REG_6 + 1)
626
#define MOD_0FD7                (MOD_0FC7_REG_7 + 1)
627
#define MOD_0FE7_PREFIX_2       (MOD_0FD7 + 1)
628
#define MOD_0FF0_PREFIX_3       (MOD_0FE7_PREFIX_2 + 1)
629
#define MOD_0F382A_PREFIX_2     (MOD_0FF0_PREFIX_3 + 1)
630
#define MOD_62_32BIT            (MOD_0F382A_PREFIX_2 + 1)
631
#define MOD_C4_32BIT            (MOD_62_32BIT + 1)
632
#define MOD_C5_32BIT            (MOD_C4_32BIT + 1)
633
#define MOD_VEX_12_PREFIX_0     (MOD_C5_32BIT + 1)
634
#define MOD_VEX_13              (MOD_VEX_12_PREFIX_0 + 1)
635
#define MOD_VEX_16_PREFIX_0     (MOD_VEX_13 + 1)
636
#define MOD_VEX_17              (MOD_VEX_16_PREFIX_0 + 1)
637
#define MOD_VEX_2B              (MOD_VEX_17 + 1)
638
#define MOD_VEX_51              (MOD_VEX_2B + 1)
639
#define MOD_VEX_71_REG_2        (MOD_VEX_51 + 1)
640
#define MOD_VEX_71_REG_4        (MOD_VEX_71_REG_2 + 1)
641
#define MOD_VEX_71_REG_6        (MOD_VEX_71_REG_4 + 1)
642
#define MOD_VEX_72_REG_2        (MOD_VEX_71_REG_6 + 1)
643
#define MOD_VEX_72_REG_4        (MOD_VEX_72_REG_2 + 1)
644
#define MOD_VEX_72_REG_6        (MOD_VEX_72_REG_4 + 1)
645
#define MOD_VEX_73_REG_2        (MOD_VEX_72_REG_6 + 1)
646
#define MOD_VEX_73_REG_3        (MOD_VEX_73_REG_2 + 1)
647
#define MOD_VEX_73_REG_6        (MOD_VEX_73_REG_3 + 1)
648
#define MOD_VEX_73_REG_7        (MOD_VEX_73_REG_6 + 1)
649
#define MOD_VEX_AE_REG_2        (MOD_VEX_73_REG_7 + 1)
650
#define MOD_VEX_AE_REG_3        (MOD_VEX_AE_REG_2 + 1)
651
#define MOD_VEX_D7_PREFIX_2     (MOD_VEX_AE_REG_3 + 1)
652
#define MOD_VEX_E7_PREFIX_2     (MOD_VEX_D7_PREFIX_2 + 1)
653
#define MOD_VEX_F0_PREFIX_3     (MOD_VEX_E7_PREFIX_2 + 1)
654
#define MOD_VEX_3818_PREFIX_2   (MOD_VEX_F0_PREFIX_3 + 1)
655
#define MOD_VEX_3819_PREFIX_2   (MOD_VEX_3818_PREFIX_2 + 1)
656
#define MOD_VEX_381A_PREFIX_2   (MOD_VEX_3819_PREFIX_2 + 1)
657
#define MOD_VEX_382A_PREFIX_2   (MOD_VEX_381A_PREFIX_2 + 1)
658
#define MOD_VEX_382C_PREFIX_2   (MOD_VEX_382A_PREFIX_2 + 1)
659
#define MOD_VEX_382D_PREFIX_2   (MOD_VEX_382C_PREFIX_2 + 1)
660
#define MOD_VEX_382E_PREFIX_2   (MOD_VEX_382D_PREFIX_2 + 1)
661
#define MOD_VEX_382F_PREFIX_2   (MOD_VEX_382E_PREFIX_2 + 1)
662
 
663
#define RM_0F01_REG_0           0
664
#define RM_0F01_REG_1           (RM_0F01_REG_0 + 1)
665
#define RM_0F01_REG_2           (RM_0F01_REG_1 + 1)
666
#define RM_0F01_REG_3           (RM_0F01_REG_2 + 1)
667
#define RM_0F01_REG_7           (RM_0F01_REG_3 + 1)
668
#define RM_0FAE_REG_5           (RM_0F01_REG_7 + 1)
669
#define RM_0FAE_REG_6           (RM_0FAE_REG_5 + 1)
670
#define RM_0FAE_REG_7           (RM_0FAE_REG_6 + 1)
671
 
672
#define PREFIX_90               0
673
#define PREFIX_0F10             (PREFIX_90 + 1)
674
#define PREFIX_0F11             (PREFIX_0F10 + 1)
675
#define PREFIX_0F12             (PREFIX_0F11 + 1)
676
#define PREFIX_0F16             (PREFIX_0F12 + 1)
677
#define PREFIX_0F2A             (PREFIX_0F16 + 1)
678
#define PREFIX_0F2B             (PREFIX_0F2A + 1)
679
#define PREFIX_0F2C             (PREFIX_0F2B + 1)
680
#define PREFIX_0F2D             (PREFIX_0F2C + 1)
681
#define PREFIX_0F2E             (PREFIX_0F2D + 1)
682
#define PREFIX_0F2F             (PREFIX_0F2E + 1)
683
#define PREFIX_0F51             (PREFIX_0F2F + 1)
684
#define PREFIX_0F52             (PREFIX_0F51 + 1)
685
#define PREFIX_0F53             (PREFIX_0F52 + 1)
686
#define PREFIX_0F58             (PREFIX_0F53 + 1)
687
#define PREFIX_0F59             (PREFIX_0F58 + 1)
688
#define PREFIX_0F5A             (PREFIX_0F59 + 1)
689
#define PREFIX_0F5B             (PREFIX_0F5A + 1)
690
#define PREFIX_0F5C             (PREFIX_0F5B + 1)
691
#define PREFIX_0F5D             (PREFIX_0F5C + 1)
692
#define PREFIX_0F5E             (PREFIX_0F5D + 1)
693
#define PREFIX_0F5F             (PREFIX_0F5E + 1)
694
#define PREFIX_0F60             (PREFIX_0F5F + 1)
695
#define PREFIX_0F61             (PREFIX_0F60 + 1)
696
#define PREFIX_0F62             (PREFIX_0F61 + 1)
697
#define PREFIX_0F6C             (PREFIX_0F62 + 1)
698
#define PREFIX_0F6D             (PREFIX_0F6C + 1)
699
#define PREFIX_0F6F             (PREFIX_0F6D + 1)
700
#define PREFIX_0F70             (PREFIX_0F6F + 1)
701
#define PREFIX_0F73_REG_3       (PREFIX_0F70 + 1)
702
#define PREFIX_0F73_REG_7       (PREFIX_0F73_REG_3 + 1)
703
#define PREFIX_0F78             (PREFIX_0F73_REG_7 + 1)
704
#define PREFIX_0F79             (PREFIX_0F78 + 1)
705
#define PREFIX_0F7C             (PREFIX_0F79 + 1)
706
#define PREFIX_0F7D             (PREFIX_0F7C + 1)
707
#define PREFIX_0F7E             (PREFIX_0F7D + 1)
708
#define PREFIX_0F7F             (PREFIX_0F7E + 1)
709
#define PREFIX_0FB8             (PREFIX_0F7F + 1)
710
#define PREFIX_0FBD             (PREFIX_0FB8 + 1)
711
#define PREFIX_0FC2             (PREFIX_0FBD + 1)
712
#define PREFIX_0FC3             (PREFIX_0FC2 + 1)
713
#define PREFIX_0FC7_REG_6       (PREFIX_0FC3 + 1)
714
#define PREFIX_0FD0             (PREFIX_0FC7_REG_6 + 1)
715
#define PREFIX_0FD6             (PREFIX_0FD0 + 1)
716
#define PREFIX_0FE6             (PREFIX_0FD6 + 1)
717
#define PREFIX_0FE7             (PREFIX_0FE6 + 1)
718
#define PREFIX_0FF0             (PREFIX_0FE7 + 1)
719
#define PREFIX_0FF7             (PREFIX_0FF0 + 1)
720
#define PREFIX_0F3810           (PREFIX_0FF7 + 1)
721
#define PREFIX_0F3814           (PREFIX_0F3810 + 1)
722
#define PREFIX_0F3815           (PREFIX_0F3814 + 1)
723
#define PREFIX_0F3817           (PREFIX_0F3815 + 1)
724
#define PREFIX_0F3820           (PREFIX_0F3817 + 1)
725
#define PREFIX_0F3821           (PREFIX_0F3820 + 1)
726
#define PREFIX_0F3822           (PREFIX_0F3821 + 1)
727
#define PREFIX_0F3823           (PREFIX_0F3822 + 1)
728
#define PREFIX_0F3824           (PREFIX_0F3823 + 1)
729
#define PREFIX_0F3825           (PREFIX_0F3824 + 1)
730
#define PREFIX_0F3828           (PREFIX_0F3825 + 1)
731
#define PREFIX_0F3829           (PREFIX_0F3828 + 1)
732
#define PREFIX_0F382A           (PREFIX_0F3829 + 1)
733
#define PREFIX_0F382B           (PREFIX_0F382A + 1)
734
#define PREFIX_0F3830           (PREFIX_0F382B + 1)
735
#define PREFIX_0F3831           (PREFIX_0F3830 + 1)
736
#define PREFIX_0F3832           (PREFIX_0F3831 + 1)
737
#define PREFIX_0F3833           (PREFIX_0F3832 + 1)
738
#define PREFIX_0F3834           (PREFIX_0F3833 + 1)
739
#define PREFIX_0F3835           (PREFIX_0F3834 + 1)
740
#define PREFIX_0F3837           (PREFIX_0F3835 + 1)
741
#define PREFIX_0F3838           (PREFIX_0F3837 + 1)
742
#define PREFIX_0F3839           (PREFIX_0F3838 + 1)
743
#define PREFIX_0F383A           (PREFIX_0F3839 + 1)
744
#define PREFIX_0F383B           (PREFIX_0F383A + 1)
745
#define PREFIX_0F383C           (PREFIX_0F383B + 1)
746
#define PREFIX_0F383D           (PREFIX_0F383C + 1)
747
#define PREFIX_0F383E           (PREFIX_0F383D + 1)
748
#define PREFIX_0F383F           (PREFIX_0F383E + 1)
749
#define PREFIX_0F3840           (PREFIX_0F383F + 1)
750
#define PREFIX_0F3841           (PREFIX_0F3840 + 1)
751
#define PREFIX_0F3880           (PREFIX_0F3841 + 1)
752
#define PREFIX_0F3881           (PREFIX_0F3880 + 1)
753
#define PREFIX_0F38DB           (PREFIX_0F3881 + 1)
754
#define PREFIX_0F38DC           (PREFIX_0F38DB + 1)
755
#define PREFIX_0F38DD           (PREFIX_0F38DC + 1)
756
#define PREFIX_0F38DE           (PREFIX_0F38DD + 1)
757
#define PREFIX_0F38DF           (PREFIX_0F38DE + 1)
758
#define PREFIX_0F38F0           (PREFIX_0F38DF + 1)
759
#define PREFIX_0F38F1           (PREFIX_0F38F0 + 1)
760
#define PREFIX_0F3A08           (PREFIX_0F38F1 + 1)
761
#define PREFIX_0F3A09           (PREFIX_0F3A08 + 1)
762
#define PREFIX_0F3A0A           (PREFIX_0F3A09 + 1)
763
#define PREFIX_0F3A0B           (PREFIX_0F3A0A + 1)
764
#define PREFIX_0F3A0C           (PREFIX_0F3A0B + 1)
765
#define PREFIX_0F3A0D           (PREFIX_0F3A0C + 1)
766
#define PREFIX_0F3A0E           (PREFIX_0F3A0D + 1)
767
#define PREFIX_0F3A14           (PREFIX_0F3A0E + 1)
768
#define PREFIX_0F3A15           (PREFIX_0F3A14 + 1)
769
#define PREFIX_0F3A16           (PREFIX_0F3A15 + 1)
770
#define PREFIX_0F3A17           (PREFIX_0F3A16 + 1)
771
#define PREFIX_0F3A20           (PREFIX_0F3A17 + 1)
772
#define PREFIX_0F3A21           (PREFIX_0F3A20 + 1)
773
#define PREFIX_0F3A22           (PREFIX_0F3A21 + 1)
774
#define PREFIX_0F3A40           (PREFIX_0F3A22 + 1)
775
#define PREFIX_0F3A41           (PREFIX_0F3A40 + 1)
776
#define PREFIX_0F3A42           (PREFIX_0F3A41 + 1)
777
#define PREFIX_0F3A44           (PREFIX_0F3A42 + 1)
778
#define PREFIX_0F3A60           (PREFIX_0F3A44 + 1)
779
#define PREFIX_0F3A61           (PREFIX_0F3A60 + 1)
780
#define PREFIX_0F3A62           (PREFIX_0F3A61 + 1)
781
#define PREFIX_0F3A63           (PREFIX_0F3A62 + 1)
782
#define PREFIX_0F3ADF           (PREFIX_0F3A63 + 1)
783
#define PREFIX_VEX_10           (PREFIX_0F3ADF + 1)
784
#define PREFIX_VEX_11           (PREFIX_VEX_10 + 1)
785
#define PREFIX_VEX_12           (PREFIX_VEX_11 + 1)
786
#define PREFIX_VEX_16           (PREFIX_VEX_12 + 1)
787
#define PREFIX_VEX_2A           (PREFIX_VEX_16 + 1)
788
#define PREFIX_VEX_2C           (PREFIX_VEX_2A + 1)
789
#define PREFIX_VEX_2D           (PREFIX_VEX_2C + 1)
790
#define PREFIX_VEX_2E           (PREFIX_VEX_2D + 1)
791
#define PREFIX_VEX_2F           (PREFIX_VEX_2E + 1)
792
#define PREFIX_VEX_51           (PREFIX_VEX_2F + 1)
793
#define PREFIX_VEX_52           (PREFIX_VEX_51 + 1)
794
#define PREFIX_VEX_53           (PREFIX_VEX_52 + 1)
795
#define PREFIX_VEX_58           (PREFIX_VEX_53 + 1)
796
#define PREFIX_VEX_59           (PREFIX_VEX_58 + 1)
797
#define PREFIX_VEX_5A           (PREFIX_VEX_59 + 1)
798
#define PREFIX_VEX_5B           (PREFIX_VEX_5A + 1)
799
#define PREFIX_VEX_5C           (PREFIX_VEX_5B + 1)
800
#define PREFIX_VEX_5D           (PREFIX_VEX_5C + 1)
801
#define PREFIX_VEX_5E           (PREFIX_VEX_5D + 1)
802
#define PREFIX_VEX_5F           (PREFIX_VEX_5E + 1)
803
#define PREFIX_VEX_60           (PREFIX_VEX_5F + 1)
804
#define PREFIX_VEX_61           (PREFIX_VEX_60 + 1)
805
#define PREFIX_VEX_62           (PREFIX_VEX_61 + 1)
806
#define PREFIX_VEX_63           (PREFIX_VEX_62 + 1)
807
#define PREFIX_VEX_64           (PREFIX_VEX_63 + 1)
808
#define PREFIX_VEX_65           (PREFIX_VEX_64 + 1)
809
#define PREFIX_VEX_66           (PREFIX_VEX_65 + 1)
810
#define PREFIX_VEX_67           (PREFIX_VEX_66 + 1)
811
#define PREFIX_VEX_68           (PREFIX_VEX_67 + 1)
812
#define PREFIX_VEX_69           (PREFIX_VEX_68 + 1)
813
#define PREFIX_VEX_6A           (PREFIX_VEX_69 + 1)
814
#define PREFIX_VEX_6B           (PREFIX_VEX_6A + 1)
815
#define PREFIX_VEX_6C           (PREFIX_VEX_6B + 1)
816
#define PREFIX_VEX_6D           (PREFIX_VEX_6C + 1)
817
#define PREFIX_VEX_6E           (PREFIX_VEX_6D + 1)
818
#define PREFIX_VEX_6F           (PREFIX_VEX_6E + 1)
819
#define PREFIX_VEX_70           (PREFIX_VEX_6F + 1)
820
#define PREFIX_VEX_71_REG_2     (PREFIX_VEX_70 + 1)
821
#define PREFIX_VEX_71_REG_4     (PREFIX_VEX_71_REG_2 + 1)
822
#define PREFIX_VEX_71_REG_6     (PREFIX_VEX_71_REG_4 + 1)
823
#define PREFIX_VEX_72_REG_2     (PREFIX_VEX_71_REG_6 + 1)
824
#define PREFIX_VEX_72_REG_4     (PREFIX_VEX_72_REG_2 + 1)
825
#define PREFIX_VEX_72_REG_6     (PREFIX_VEX_72_REG_4 + 1)
826
#define PREFIX_VEX_73_REG_2     (PREFIX_VEX_72_REG_6 + 1)
827
#define PREFIX_VEX_73_REG_3     (PREFIX_VEX_73_REG_2 + 1)
828
#define PREFIX_VEX_73_REG_6     (PREFIX_VEX_73_REG_3 + 1)
829
#define PREFIX_VEX_73_REG_7     (PREFIX_VEX_73_REG_6 + 1)
830
#define PREFIX_VEX_74           (PREFIX_VEX_73_REG_7 + 1)
831
#define PREFIX_VEX_75           (PREFIX_VEX_74 + 1)
832
#define PREFIX_VEX_76           (PREFIX_VEX_75 + 1)
833
#define PREFIX_VEX_77           (PREFIX_VEX_76 + 1)
834
#define PREFIX_VEX_7C           (PREFIX_VEX_77 + 1)
835
#define PREFIX_VEX_7D           (PREFIX_VEX_7C + 1)
836
#define PREFIX_VEX_7E           (PREFIX_VEX_7D + 1)
837
#define PREFIX_VEX_7F           (PREFIX_VEX_7E + 1)
838
#define PREFIX_VEX_C2           (PREFIX_VEX_7F + 1)
839
#define PREFIX_VEX_C4           (PREFIX_VEX_C2 + 1)
840
#define PREFIX_VEX_C5           (PREFIX_VEX_C4 + 1)
841
#define PREFIX_VEX_D0           (PREFIX_VEX_C5 + 1)
842
#define PREFIX_VEX_D1           (PREFIX_VEX_D0 + 1)
843
#define PREFIX_VEX_D2           (PREFIX_VEX_D1 + 1)
844
#define PREFIX_VEX_D3           (PREFIX_VEX_D2 + 1)
845
#define PREFIX_VEX_D4           (PREFIX_VEX_D3 + 1)
846
#define PREFIX_VEX_D5           (PREFIX_VEX_D4 + 1)
847
#define PREFIX_VEX_D6           (PREFIX_VEX_D5 + 1)
848
#define PREFIX_VEX_D7           (PREFIX_VEX_D6 + 1)
849
#define PREFIX_VEX_D8           (PREFIX_VEX_D7 + 1)
850
#define PREFIX_VEX_D9           (PREFIX_VEX_D8 + 1)
851
#define PREFIX_VEX_DA           (PREFIX_VEX_D9 + 1)
852
#define PREFIX_VEX_DB           (PREFIX_VEX_DA + 1)
853
#define PREFIX_VEX_DC           (PREFIX_VEX_DB + 1)
854
#define PREFIX_VEX_DD           (PREFIX_VEX_DC + 1)
855
#define PREFIX_VEX_DE           (PREFIX_VEX_DD + 1)
856
#define PREFIX_VEX_DF           (PREFIX_VEX_DE + 1)
857
#define PREFIX_VEX_E0           (PREFIX_VEX_DF + 1)
858
#define PREFIX_VEX_E1           (PREFIX_VEX_E0 + 1)
859
#define PREFIX_VEX_E2           (PREFIX_VEX_E1 + 1)
860
#define PREFIX_VEX_E3           (PREFIX_VEX_E2 + 1)
861
#define PREFIX_VEX_E4           (PREFIX_VEX_E3 + 1)
862
#define PREFIX_VEX_E5           (PREFIX_VEX_E4 + 1)
863
#define PREFIX_VEX_E6           (PREFIX_VEX_E5 + 1)
864
#define PREFIX_VEX_E7           (PREFIX_VEX_E6 + 1)
865
#define PREFIX_VEX_E8           (PREFIX_VEX_E7 + 1)
866
#define PREFIX_VEX_E9           (PREFIX_VEX_E8 + 1)
867
#define PREFIX_VEX_EA           (PREFIX_VEX_E9 + 1)
868
#define PREFIX_VEX_EB           (PREFIX_VEX_EA + 1)
869
#define PREFIX_VEX_EC           (PREFIX_VEX_EB + 1)
870
#define PREFIX_VEX_ED           (PREFIX_VEX_EC + 1)
871
#define PREFIX_VEX_EE           (PREFIX_VEX_ED + 1)
872
#define PREFIX_VEX_EF           (PREFIX_VEX_EE + 1)
873
#define PREFIX_VEX_F0           (PREFIX_VEX_EF + 1)
874
#define PREFIX_VEX_F1           (PREFIX_VEX_F0 + 1)
875
#define PREFIX_VEX_F2           (PREFIX_VEX_F1 + 1)
876
#define PREFIX_VEX_F3           (PREFIX_VEX_F2 + 1)
877
#define PREFIX_VEX_F4           (PREFIX_VEX_F3 + 1)
878
#define PREFIX_VEX_F5           (PREFIX_VEX_F4 + 1)
879
#define PREFIX_VEX_F6           (PREFIX_VEX_F5 + 1)
880
#define PREFIX_VEX_F7           (PREFIX_VEX_F6 + 1)
881
#define PREFIX_VEX_F8           (PREFIX_VEX_F7 + 1)
882
#define PREFIX_VEX_F9           (PREFIX_VEX_F8 + 1)
883
#define PREFIX_VEX_FA           (PREFIX_VEX_F9 + 1)
884
#define PREFIX_VEX_FB           (PREFIX_VEX_FA + 1)
885
#define PREFIX_VEX_FC           (PREFIX_VEX_FB + 1)
886
#define PREFIX_VEX_FD           (PREFIX_VEX_FC + 1)
887
#define PREFIX_VEX_FE           (PREFIX_VEX_FD + 1)
888
#define PREFIX_VEX_3800         (PREFIX_VEX_FE + 1)
889
#define PREFIX_VEX_3801         (PREFIX_VEX_3800 + 1)
890
#define PREFIX_VEX_3802         (PREFIX_VEX_3801 + 1)
891
#define PREFIX_VEX_3803         (PREFIX_VEX_3802 + 1)
892
#define PREFIX_VEX_3804         (PREFIX_VEX_3803 + 1)
893
#define PREFIX_VEX_3805         (PREFIX_VEX_3804 + 1)
894
#define PREFIX_VEX_3806         (PREFIX_VEX_3805 + 1)
895
#define PREFIX_VEX_3807         (PREFIX_VEX_3806 + 1)
896
#define PREFIX_VEX_3808         (PREFIX_VEX_3807 + 1)
897
#define PREFIX_VEX_3809         (PREFIX_VEX_3808 + 1)
898
#define PREFIX_VEX_380A         (PREFIX_VEX_3809 + 1)
899
#define PREFIX_VEX_380B         (PREFIX_VEX_380A + 1)
900
#define PREFIX_VEX_380C         (PREFIX_VEX_380B + 1)
901
#define PREFIX_VEX_380D         (PREFIX_VEX_380C + 1)
902
#define PREFIX_VEX_380E         (PREFIX_VEX_380D + 1)
903
#define PREFIX_VEX_380F         (PREFIX_VEX_380E + 1)
904
#define PREFIX_VEX_3817         (PREFIX_VEX_380F + 1)
905
#define PREFIX_VEX_3818         (PREFIX_VEX_3817 + 1)
906
#define PREFIX_VEX_3819         (PREFIX_VEX_3818 + 1)
907
#define PREFIX_VEX_381A         (PREFIX_VEX_3819 + 1)
908
#define PREFIX_VEX_381C         (PREFIX_VEX_381A + 1)
909
#define PREFIX_VEX_381D         (PREFIX_VEX_381C + 1)
910
#define PREFIX_VEX_381E         (PREFIX_VEX_381D + 1)
911
#define PREFIX_VEX_3820         (PREFIX_VEX_381E + 1)
912
#define PREFIX_VEX_3821         (PREFIX_VEX_3820 + 1)
913
#define PREFIX_VEX_3822         (PREFIX_VEX_3821 + 1)
914
#define PREFIX_VEX_3823         (PREFIX_VEX_3822 + 1)
915
#define PREFIX_VEX_3824         (PREFIX_VEX_3823 + 1)
916
#define PREFIX_VEX_3825         (PREFIX_VEX_3824 + 1)
917
#define PREFIX_VEX_3828         (PREFIX_VEX_3825 + 1)
918
#define PREFIX_VEX_3829         (PREFIX_VEX_3828 + 1)
919
#define PREFIX_VEX_382A         (PREFIX_VEX_3829 + 1)
920
#define PREFIX_VEX_382B         (PREFIX_VEX_382A + 1)
921
#define PREFIX_VEX_382C         (PREFIX_VEX_382B + 1)
922
#define PREFIX_VEX_382D         (PREFIX_VEX_382C + 1)
923
#define PREFIX_VEX_382E         (PREFIX_VEX_382D + 1)
924
#define PREFIX_VEX_382F         (PREFIX_VEX_382E + 1)
925
#define PREFIX_VEX_3830         (PREFIX_VEX_382F + 1)
926
#define PREFIX_VEX_3831         (PREFIX_VEX_3830 + 1)
927
#define PREFIX_VEX_3832         (PREFIX_VEX_3831 + 1)
928
#define PREFIX_VEX_3833         (PREFIX_VEX_3832 + 1)
929
#define PREFIX_VEX_3834         (PREFIX_VEX_3833 + 1)
930
#define PREFIX_VEX_3835         (PREFIX_VEX_3834 + 1)
931
#define PREFIX_VEX_3837         (PREFIX_VEX_3835 + 1)
932
#define PREFIX_VEX_3838         (PREFIX_VEX_3837 + 1)
933
#define PREFIX_VEX_3839         (PREFIX_VEX_3838 + 1)
934
#define PREFIX_VEX_383A         (PREFIX_VEX_3839 + 1)
935
#define PREFIX_VEX_383B         (PREFIX_VEX_383A + 1)
936
#define PREFIX_VEX_383C         (PREFIX_VEX_383B + 1)
937
#define PREFIX_VEX_383D         (PREFIX_VEX_383C + 1)
938
#define PREFIX_VEX_383E         (PREFIX_VEX_383D + 1)
939
#define PREFIX_VEX_383F         (PREFIX_VEX_383E + 1)
940
#define PREFIX_VEX_3840         (PREFIX_VEX_383F + 1)
941
#define PREFIX_VEX_3841         (PREFIX_VEX_3840 + 1)
942
#define PREFIX_VEX_38DB         (PREFIX_VEX_3841 + 1)
943
#define PREFIX_VEX_38DC         (PREFIX_VEX_38DB + 1)
944
#define PREFIX_VEX_38DD         (PREFIX_VEX_38DC + 1)
945
#define PREFIX_VEX_38DE         (PREFIX_VEX_38DD + 1)
946
#define PREFIX_VEX_38DF         (PREFIX_VEX_38DE + 1)
947
#define PREFIX_VEX_3A04         (PREFIX_VEX_38DF + 1)
948
#define PREFIX_VEX_3A05         (PREFIX_VEX_3A04 + 1)
949
#define PREFIX_VEX_3A06         (PREFIX_VEX_3A05 + 1)
950
#define PREFIX_VEX_3A08         (PREFIX_VEX_3A06 + 1)
951
#define PREFIX_VEX_3A09         (PREFIX_VEX_3A08 + 1)
952
#define PREFIX_VEX_3A0A         (PREFIX_VEX_3A09 + 1)
953
#define PREFIX_VEX_3A0B         (PREFIX_VEX_3A0A + 1)
954
#define PREFIX_VEX_3A0C         (PREFIX_VEX_3A0B + 1)
955
#define PREFIX_VEX_3A0D         (PREFIX_VEX_3A0C + 1)
956
#define PREFIX_VEX_3A0E         (PREFIX_VEX_3A0D + 1)
957
#define PREFIX_VEX_3A0F         (PREFIX_VEX_3A0E + 1)
958
#define PREFIX_VEX_3A14         (PREFIX_VEX_3A0F + 1)
959
#define PREFIX_VEX_3A15         (PREFIX_VEX_3A14 + 1)
960
#define PREFIX_VEX_3A16         (PREFIX_VEX_3A15 + 1)
961
#define PREFIX_VEX_3A17         (PREFIX_VEX_3A16 + 1)
962
#define PREFIX_VEX_3A18         (PREFIX_VEX_3A17 + 1)
963
#define PREFIX_VEX_3A19         (PREFIX_VEX_3A18 + 1)
964
#define PREFIX_VEX_3A20         (PREFIX_VEX_3A19 + 1)
965
#define PREFIX_VEX_3A21         (PREFIX_VEX_3A20 + 1)
966
#define PREFIX_VEX_3A22         (PREFIX_VEX_3A21 + 1)
967
#define PREFIX_VEX_3A40         (PREFIX_VEX_3A22 + 1)
968
#define PREFIX_VEX_3A41         (PREFIX_VEX_3A40 + 1)
969
#define PREFIX_VEX_3A42         (PREFIX_VEX_3A41 + 1)
970
#define PREFIX_VEX_3A48         (PREFIX_VEX_3A42 + 1)
971
#define PREFIX_VEX_3A49         (PREFIX_VEX_3A48 + 1)
972
#define PREFIX_VEX_3A4A         (PREFIX_VEX_3A49 + 1)
973
#define PREFIX_VEX_3A4B         (PREFIX_VEX_3A4A + 1)
974
#define PREFIX_VEX_3A4C         (PREFIX_VEX_3A4B + 1)
975
#define PREFIX_VEX_3A5C         (PREFIX_VEX_3A4C + 1)
976
#define PREFIX_VEX_3A5D         (PREFIX_VEX_3A5C + 1)
977
#define PREFIX_VEX_3A5E         (PREFIX_VEX_3A5D + 1)
978
#define PREFIX_VEX_3A5F         (PREFIX_VEX_3A5E + 1)
979
#define PREFIX_VEX_3A60         (PREFIX_VEX_3A5F + 1)
980
#define PREFIX_VEX_3A61         (PREFIX_VEX_3A60 + 1)
981
#define PREFIX_VEX_3A62         (PREFIX_VEX_3A61 + 1)
982
#define PREFIX_VEX_3A63         (PREFIX_VEX_3A62 + 1)
983
#define PREFIX_VEX_3A68         (PREFIX_VEX_3A63 + 1)
984
#define PREFIX_VEX_3A69         (PREFIX_VEX_3A68 + 1)
985
#define PREFIX_VEX_3A6A         (PREFIX_VEX_3A69 + 1)
986
#define PREFIX_VEX_3A6B         (PREFIX_VEX_3A6A + 1)
987
#define PREFIX_VEX_3A6C         (PREFIX_VEX_3A6B + 1)
988
#define PREFIX_VEX_3A6D         (PREFIX_VEX_3A6C + 1)
989
#define PREFIX_VEX_3A6E         (PREFIX_VEX_3A6D + 1)
990
#define PREFIX_VEX_3A6F         (PREFIX_VEX_3A6E + 1)
991
#define PREFIX_VEX_3A78         (PREFIX_VEX_3A6F + 1)
992
#define PREFIX_VEX_3A79         (PREFIX_VEX_3A78 + 1)
993
#define PREFIX_VEX_3A7A         (PREFIX_VEX_3A79 + 1)
994
#define PREFIX_VEX_3A7B         (PREFIX_VEX_3A7A + 1)
995
#define PREFIX_VEX_3A7C         (PREFIX_VEX_3A7B + 1)
996
#define PREFIX_VEX_3A7D         (PREFIX_VEX_3A7C + 1)
997
#define PREFIX_VEX_3A7E         (PREFIX_VEX_3A7D + 1)
998
#define PREFIX_VEX_3A7F         (PREFIX_VEX_3A7E + 1)
999
#define PREFIX_VEX_3ADF         (PREFIX_VEX_3A7F + 1)
1000
 
1001
#define X86_64_06               0
1002
#define X86_64_07               (X86_64_06 + 1)
1003
#define X86_64_0D               (X86_64_07 + 1)
1004
#define X86_64_16               (X86_64_0D + 1)
1005
#define X86_64_17               (X86_64_16 + 1)
1006
#define X86_64_1E               (X86_64_17 + 1)
1007
#define X86_64_1F               (X86_64_1E + 1)
1008
#define X86_64_27               (X86_64_1F + 1)
1009
#define X86_64_2F               (X86_64_27 + 1)
1010
#define X86_64_37               (X86_64_2F + 1)
1011
#define X86_64_3F               (X86_64_37 + 1)
1012
#define X86_64_60               (X86_64_3F + 1)
1013
#define X86_64_61               (X86_64_60 + 1)
1014
#define X86_64_62               (X86_64_61 + 1)
1015
#define X86_64_63               (X86_64_62 + 1)
1016
#define X86_64_6D               (X86_64_63 + 1)
1017
#define X86_64_6F               (X86_64_6D + 1)
1018
#define X86_64_9A               (X86_64_6F + 1)
1019
#define X86_64_C4               (X86_64_9A + 1)
1020
#define X86_64_C5               (X86_64_C4 + 1)
1021
#define X86_64_CE               (X86_64_C5 + 1)
1022
#define X86_64_D4               (X86_64_CE + 1)
1023
#define X86_64_D5               (X86_64_D4 + 1)
1024
#define X86_64_EA               (X86_64_D5 + 1)
1025
#define X86_64_0F01_REG_0       (X86_64_EA + 1)
1026
#define X86_64_0F01_REG_1       (X86_64_0F01_REG_0 + 1)
1027
#define X86_64_0F01_REG_2       (X86_64_0F01_REG_1 + 1)
1028
#define X86_64_0F01_REG_3       (X86_64_0F01_REG_2 + 1)
1029
 
1030
#define THREE_BYTE_0F24         0
1031
#define THREE_BYTE_0F25         (THREE_BYTE_0F24 + 1)
1032
#define THREE_BYTE_0F38         (THREE_BYTE_0F25 + 1)
1033
#define THREE_BYTE_0F3A         (THREE_BYTE_0F38 + 1)
1034
#define THREE_BYTE_0F7A         (THREE_BYTE_0F3A + 1)
1035
#define THREE_BYTE_0F7B         (THREE_BYTE_0F7A + 1)
1036
 
1037
#define VEX_0F                  0
1038
#define VEX_0F38                (VEX_0F + 1)
1039
#define VEX_0F3A                (VEX_0F38 + 1)
1040
 
1041
#define VEX_LEN_10_P_1  0
1042
#define VEX_LEN_10_P_3  (VEX_LEN_10_P_1 + 1)
1043
#define VEX_LEN_11_P_1  (VEX_LEN_10_P_3 + 1)
1044
#define VEX_LEN_11_P_3  (VEX_LEN_11_P_1 + 1)
1045
#define VEX_LEN_12_P_0_M_0      (VEX_LEN_11_P_3 + 1)
1046
#define VEX_LEN_12_P_0_M_1      (VEX_LEN_12_P_0_M_0 + 1)
1047
#define VEX_LEN_12_P_2  (VEX_LEN_12_P_0_M_1 + 1)
1048
#define VEX_LEN_13_M_0  (VEX_LEN_12_P_2 + 1)
1049
#define VEX_LEN_16_P_0_M_0      (VEX_LEN_13_M_0 + 1)
1050
#define VEX_LEN_16_P_0_M_1      (VEX_LEN_16_P_0_M_0 + 1)
1051
#define VEX_LEN_16_P_2  (VEX_LEN_16_P_0_M_1 + 1)
1052
#define VEX_LEN_17_M_0  (VEX_LEN_16_P_2 + 1)
1053
#define VEX_LEN_2A_P_1  (VEX_LEN_17_M_0 + 1)
1054
#define VEX_LEN_2A_P_3  (VEX_LEN_2A_P_1 + 1)
1055
#define VEX_LEN_2B_M_0  (VEX_LEN_2A_P_3 + 1)
1056
#define VEX_LEN_2C_P_1  (VEX_LEN_2B_M_0 + 1)
1057
#define VEX_LEN_2C_P_3  (VEX_LEN_2C_P_1 + 1)
1058
#define VEX_LEN_2D_P_1  (VEX_LEN_2C_P_3 + 1)
1059
#define VEX_LEN_2D_P_3  (VEX_LEN_2D_P_1 + 1)
1060
#define VEX_LEN_2E_P_0  (VEX_LEN_2D_P_3 + 1)
1061
#define VEX_LEN_2E_P_2  (VEX_LEN_2E_P_0 + 1)
1062
#define VEX_LEN_2F_P_0  (VEX_LEN_2E_P_2 + 1)
1063
#define VEX_LEN_2F_P_2  (VEX_LEN_2F_P_0 + 1)
1064
#define VEX_LEN_51_P_1  (VEX_LEN_2F_P_2 + 1)
1065
#define VEX_LEN_51_P_3  (VEX_LEN_51_P_1 + 1)
1066
#define VEX_LEN_52_P_1  (VEX_LEN_51_P_3 + 1)
1067
#define VEX_LEN_53_P_1  (VEX_LEN_52_P_1 + 1)
1068
#define VEX_LEN_58_P_1  (VEX_LEN_53_P_1 + 1)
1069
#define VEX_LEN_58_P_3  (VEX_LEN_58_P_1 + 1)
1070
#define VEX_LEN_59_P_1  (VEX_LEN_58_P_3 + 1)
1071
#define VEX_LEN_59_P_3  (VEX_LEN_59_P_1 + 1)
1072
#define VEX_LEN_5A_P_1  (VEX_LEN_59_P_3 + 1)
1073
#define VEX_LEN_5A_P_3  (VEX_LEN_5A_P_1 + 1)
1074
#define VEX_LEN_5C_P_1  (VEX_LEN_5A_P_3 + 1)
1075
#define VEX_LEN_5C_P_3  (VEX_LEN_5C_P_1 + 1)
1076
#define VEX_LEN_5D_P_1  (VEX_LEN_5C_P_3 + 1)
1077
#define VEX_LEN_5D_P_3  (VEX_LEN_5D_P_1 + 1)
1078
#define VEX_LEN_5E_P_1  (VEX_LEN_5D_P_3 + 1)
1079
#define VEX_LEN_5E_P_3  (VEX_LEN_5E_P_1 + 1)
1080
#define VEX_LEN_5F_P_1  (VEX_LEN_5E_P_3 + 1)
1081
#define VEX_LEN_5F_P_3  (VEX_LEN_5F_P_1 + 1)
1082
#define VEX_LEN_60_P_2  (VEX_LEN_5F_P_3 + 1)
1083
#define VEX_LEN_61_P_2  (VEX_LEN_60_P_2 + 1)
1084
#define VEX_LEN_62_P_2  (VEX_LEN_61_P_2 + 1)
1085
#define VEX_LEN_63_P_2  (VEX_LEN_62_P_2 + 1)
1086
#define VEX_LEN_64_P_2  (VEX_LEN_63_P_2 + 1)
1087
#define VEX_LEN_65_P_2  (VEX_LEN_64_P_2 + 1)
1088
#define VEX_LEN_66_P_2  (VEX_LEN_65_P_2 + 1)
1089
#define VEX_LEN_67_P_2  (VEX_LEN_66_P_2 + 1)
1090
#define VEX_LEN_68_P_2  (VEX_LEN_67_P_2 + 1)
1091
#define VEX_LEN_69_P_2  (VEX_LEN_68_P_2 + 1)
1092
#define VEX_LEN_6A_P_2  (VEX_LEN_69_P_2 + 1)
1093
#define VEX_LEN_6B_P_2  (VEX_LEN_6A_P_2 + 1)
1094
#define VEX_LEN_6C_P_2  (VEX_LEN_6B_P_2 + 1)
1095
#define VEX_LEN_6D_P_2  (VEX_LEN_6C_P_2 + 1)
1096
#define VEX_LEN_6E_P_2  (VEX_LEN_6D_P_2 + 1)
1097
#define VEX_LEN_70_P_1  (VEX_LEN_6E_P_2 + 1)
1098
#define VEX_LEN_70_P_2  (VEX_LEN_70_P_1 + 1)
1099
#define VEX_LEN_70_P_3  (VEX_LEN_70_P_2 + 1)
1100
#define VEX_LEN_71_R_2_P_2      (VEX_LEN_70_P_3 + 1)
1101
#define VEX_LEN_71_R_4_P_2      (VEX_LEN_71_R_2_P_2 + 1)
1102
#define VEX_LEN_71_R_6_P_2      (VEX_LEN_71_R_4_P_2 + 1)
1103
#define VEX_LEN_72_R_2_P_2      (VEX_LEN_71_R_6_P_2 + 1)
1104
#define VEX_LEN_72_R_4_P_2      (VEX_LEN_72_R_2_P_2 + 1)
1105
#define VEX_LEN_72_R_6_P_2      (VEX_LEN_72_R_4_P_2 + 1)
1106
#define VEX_LEN_73_R_2_P_2      (VEX_LEN_72_R_6_P_2 + 1)
1107
#define VEX_LEN_73_R_3_P_2      (VEX_LEN_73_R_2_P_2 + 1)
1108
#define VEX_LEN_73_R_6_P_2      (VEX_LEN_73_R_3_P_2 + 1)
1109
#define VEX_LEN_73_R_7_P_2      (VEX_LEN_73_R_6_P_2 + 1)
1110
#define VEX_LEN_74_P_2  (VEX_LEN_73_R_7_P_2 + 1)
1111
#define VEX_LEN_75_P_2  (VEX_LEN_74_P_2 + 1)
1112
#define VEX_LEN_76_P_2  (VEX_LEN_75_P_2 + 1)
1113
#define VEX_LEN_7E_P_1  (VEX_LEN_76_P_2 + 1)
1114
#define VEX_LEN_7E_P_2  (VEX_LEN_7E_P_1 + 1)
1115
#define VEX_LEN_AE_R_2_M_0      (VEX_LEN_7E_P_2 + 1)
1116
#define VEX_LEN_AE_R_3_M_0      (VEX_LEN_AE_R_2_M_0 + 1)
1117
#define VEX_LEN_C2_P_1  (VEX_LEN_AE_R_3_M_0 + 1)
1118
#define VEX_LEN_C2_P_3  (VEX_LEN_C2_P_1 + 1)
1119
#define VEX_LEN_C4_P_2  (VEX_LEN_C2_P_3 + 1)
1120
#define VEX_LEN_C5_P_2  (VEX_LEN_C4_P_2 + 1)
1121
#define VEX_LEN_D1_P_2  (VEX_LEN_C5_P_2 + 1)
1122
#define VEX_LEN_D2_P_2  (VEX_LEN_D1_P_2 + 1)
1123
#define VEX_LEN_D3_P_2  (VEX_LEN_D2_P_2 + 1)
1124
#define VEX_LEN_D4_P_2  (VEX_LEN_D3_P_2 + 1)
1125
#define VEX_LEN_D5_P_2  (VEX_LEN_D4_P_2 + 1)
1126
#define VEX_LEN_D6_P_2  (VEX_LEN_D5_P_2 + 1)
1127
#define VEX_LEN_D7_P_2_M_1      (VEX_LEN_D6_P_2 + 1)
1128
#define VEX_LEN_D8_P_2  (VEX_LEN_D7_P_2_M_1 + 1)
1129
#define VEX_LEN_D9_P_2  (VEX_LEN_D8_P_2 + 1)
1130
#define VEX_LEN_DA_P_2  (VEX_LEN_D9_P_2 + 1)
1131
#define VEX_LEN_DB_P_2  (VEX_LEN_DA_P_2 + 1)
1132
#define VEX_LEN_DC_P_2  (VEX_LEN_DB_P_2 + 1)
1133
#define VEX_LEN_DD_P_2  (VEX_LEN_DC_P_2 + 1)
1134
#define VEX_LEN_DE_P_2  (VEX_LEN_DD_P_2 + 1)
1135
#define VEX_LEN_DF_P_2  (VEX_LEN_DE_P_2 + 1)
1136
#define VEX_LEN_E0_P_2  (VEX_LEN_DF_P_2 + 1)
1137
#define VEX_LEN_E1_P_2  (VEX_LEN_E0_P_2 + 1)
1138
#define VEX_LEN_E2_P_2  (VEX_LEN_E1_P_2 + 1)
1139
#define VEX_LEN_E3_P_2  (VEX_LEN_E2_P_2 + 1)
1140
#define VEX_LEN_E4_P_2  (VEX_LEN_E3_P_2 + 1)
1141
#define VEX_LEN_E5_P_2  (VEX_LEN_E4_P_2 + 1)
1142
#define VEX_LEN_E7_P_2_M_0      (VEX_LEN_E5_P_2 + 1)
1143
#define VEX_LEN_E8_P_2  (VEX_LEN_E7_P_2_M_0 + 1)
1144
#define VEX_LEN_E9_P_2  (VEX_LEN_E8_P_2 + 1)
1145
#define VEX_LEN_EA_P_2  (VEX_LEN_E9_P_2 + 1)
1146
#define VEX_LEN_EB_P_2  (VEX_LEN_EA_P_2 + 1)
1147
#define VEX_LEN_EC_P_2  (VEX_LEN_EB_P_2 + 1)
1148
#define VEX_LEN_ED_P_2  (VEX_LEN_EC_P_2 + 1)
1149
#define VEX_LEN_EE_P_2  (VEX_LEN_ED_P_2 + 1)
1150
#define VEX_LEN_EF_P_2  (VEX_LEN_EE_P_2 + 1)
1151
#define VEX_LEN_F1_P_2  (VEX_LEN_EF_P_2 + 1)
1152
#define VEX_LEN_F2_P_2  (VEX_LEN_F1_P_2 + 1)
1153
#define VEX_LEN_F3_P_2  (VEX_LEN_F2_P_2 + 1)
1154
#define VEX_LEN_F4_P_2  (VEX_LEN_F3_P_2 + 1)
1155
#define VEX_LEN_F5_P_2  (VEX_LEN_F4_P_2 + 1)
1156
#define VEX_LEN_F6_P_2  (VEX_LEN_F5_P_2 + 1)
1157
#define VEX_LEN_F7_P_2  (VEX_LEN_F6_P_2 + 1)
1158
#define VEX_LEN_F8_P_2  (VEX_LEN_F7_P_2 + 1)
1159
#define VEX_LEN_F9_P_2  (VEX_LEN_F8_P_2 + 1)
1160
#define VEX_LEN_FA_P_2  (VEX_LEN_F9_P_2 + 1)
1161
#define VEX_LEN_FB_P_2  (VEX_LEN_FA_P_2 + 1)
1162
#define VEX_LEN_FC_P_2  (VEX_LEN_FB_P_2 + 1)
1163
#define VEX_LEN_FD_P_2  (VEX_LEN_FC_P_2 + 1)
1164
#define VEX_LEN_FE_P_2  (VEX_LEN_FD_P_2 + 1)
1165
#define VEX_LEN_3800_P_2        (VEX_LEN_FE_P_2 + 1)
1166
#define VEX_LEN_3801_P_2        (VEX_LEN_3800_P_2 + 1)
1167
#define VEX_LEN_3802_P_2        (VEX_LEN_3801_P_2 + 1)
1168
#define VEX_LEN_3803_P_2        (VEX_LEN_3802_P_2 + 1)
1169
#define VEX_LEN_3804_P_2        (VEX_LEN_3803_P_2 + 1)
1170
#define VEX_LEN_3805_P_2        (VEX_LEN_3804_P_2 + 1)
1171
#define VEX_LEN_3806_P_2        (VEX_LEN_3805_P_2 + 1)
1172
#define VEX_LEN_3807_P_2        (VEX_LEN_3806_P_2 + 1)
1173
#define VEX_LEN_3808_P_2        (VEX_LEN_3807_P_2 + 1)
1174
#define VEX_LEN_3809_P_2        (VEX_LEN_3808_P_2 + 1)
1175
#define VEX_LEN_380A_P_2        (VEX_LEN_3809_P_2 + 1)
1176
#define VEX_LEN_380B_P_2        (VEX_LEN_380A_P_2 + 1)
1177
#define VEX_LEN_3819_P_2_M_0    (VEX_LEN_380B_P_2 + 1)
1178
#define VEX_LEN_381A_P_2_M_0    (VEX_LEN_3819_P_2_M_0 + 1)
1179
#define VEX_LEN_381C_P_2        (VEX_LEN_381A_P_2_M_0 + 1)
1180
#define VEX_LEN_381D_P_2        (VEX_LEN_381C_P_2 + 1)
1181
#define VEX_LEN_381E_P_2        (VEX_LEN_381D_P_2 + 1)
1182
#define VEX_LEN_3820_P_2        (VEX_LEN_381E_P_2 + 1)
1183
#define VEX_LEN_3821_P_2        (VEX_LEN_3820_P_2 + 1)
1184
#define VEX_LEN_3822_P_2        (VEX_LEN_3821_P_2 + 1)
1185
#define VEX_LEN_3823_P_2        (VEX_LEN_3822_P_2 + 1)
1186
#define VEX_LEN_3824_P_2        (VEX_LEN_3823_P_2 + 1)
1187
#define VEX_LEN_3825_P_2        (VEX_LEN_3824_P_2 + 1)
1188
#define VEX_LEN_3828_P_2        (VEX_LEN_3825_P_2 + 1)
1189
#define VEX_LEN_3829_P_2        (VEX_LEN_3828_P_2 + 1)
1190
#define VEX_LEN_382A_P_2_M_0    (VEX_LEN_3829_P_2 + 1)
1191
#define VEX_LEN_382B_P_2        (VEX_LEN_382A_P_2_M_0 + 1)
1192
#define VEX_LEN_3830_P_2        (VEX_LEN_382B_P_2 + 1)
1193
#define VEX_LEN_3831_P_2        (VEX_LEN_3830_P_2 + 1)
1194
#define VEX_LEN_3832_P_2        (VEX_LEN_3831_P_2 + 1)
1195
#define VEX_LEN_3833_P_2        (VEX_LEN_3832_P_2 + 1)
1196
#define VEX_LEN_3834_P_2        (VEX_LEN_3833_P_2 + 1)
1197
#define VEX_LEN_3835_P_2        (VEX_LEN_3834_P_2 + 1)
1198
#define VEX_LEN_3837_P_2        (VEX_LEN_3835_P_2 + 1)
1199
#define VEX_LEN_3838_P_2        (VEX_LEN_3837_P_2 + 1)
1200
#define VEX_LEN_3839_P_2        (VEX_LEN_3838_P_2 + 1)
1201
#define VEX_LEN_383A_P_2        (VEX_LEN_3839_P_2 + 1)
1202
#define VEX_LEN_383B_P_2        (VEX_LEN_383A_P_2 + 1)
1203
#define VEX_LEN_383C_P_2        (VEX_LEN_383B_P_2 + 1)
1204
#define VEX_LEN_383D_P_2        (VEX_LEN_383C_P_2 + 1)
1205
#define VEX_LEN_383E_P_2        (VEX_LEN_383D_P_2 + 1)
1206
#define VEX_LEN_383F_P_2        (VEX_LEN_383E_P_2 + 1)
1207
#define VEX_LEN_3840_P_2        (VEX_LEN_383F_P_2 + 1)
1208
#define VEX_LEN_3841_P_2        (VEX_LEN_3840_P_2 + 1)
1209
#define VEX_LEN_38DB_P_2        (VEX_LEN_3841_P_2 + 1)
1210
#define VEX_LEN_38DC_P_2        (VEX_LEN_38DB_P_2 + 1)
1211
#define VEX_LEN_38DD_P_2        (VEX_LEN_38DC_P_2 + 1)
1212
#define VEX_LEN_38DE_P_2        (VEX_LEN_38DD_P_2 + 1)
1213
#define VEX_LEN_38DF_P_2        (VEX_LEN_38DE_P_2 + 1)
1214
#define VEX_LEN_3A06_P_2        (VEX_LEN_38DF_P_2 + 1)
1215
#define VEX_LEN_3A0A_P_2        (VEX_LEN_3A06_P_2 + 1)
1216
#define VEX_LEN_3A0B_P_2        (VEX_LEN_3A0A_P_2 + 1)
1217
#define VEX_LEN_3A0E_P_2        (VEX_LEN_3A0B_P_2 + 1)
1218
#define VEX_LEN_3A0F_P_2        (VEX_LEN_3A0E_P_2 + 1)
1219
#define VEX_LEN_3A14_P_2        (VEX_LEN_3A0F_P_2 + 1)
1220
#define VEX_LEN_3A15_P_2        (VEX_LEN_3A14_P_2 + 1)
1221
#define VEX_LEN_3A16_P_2        (VEX_LEN_3A15_P_2 + 1)
1222
#define VEX_LEN_3A17_P_2        (VEX_LEN_3A16_P_2 + 1)
1223
#define VEX_LEN_3A18_P_2        (VEX_LEN_3A17_P_2 + 1)
1224
#define VEX_LEN_3A19_P_2        (VEX_LEN_3A18_P_2 + 1)
1225
#define VEX_LEN_3A20_P_2        (VEX_LEN_3A19_P_2 + 1)
1226
#define VEX_LEN_3A21_P_2        (VEX_LEN_3A20_P_2 + 1)
1227
#define VEX_LEN_3A22_P_2        (VEX_LEN_3A21_P_2 + 1)
1228
#define VEX_LEN_3A41_P_2        (VEX_LEN_3A22_P_2 + 1)
1229
#define VEX_LEN_3A42_P_2        (VEX_LEN_3A41_P_2 + 1)
1230
#define VEX_LEN_3A4C_P_2        (VEX_LEN_3A42_P_2 + 1)
1231
#define VEX_LEN_3A60_P_2        (VEX_LEN_3A4C_P_2 + 1)
1232
#define VEX_LEN_3A61_P_2        (VEX_LEN_3A60_P_2 + 1)
1233
#define VEX_LEN_3A62_P_2        (VEX_LEN_3A61_P_2 + 1)
1234
#define VEX_LEN_3A63_P_2        (VEX_LEN_3A62_P_2 + 1)
1235
#define VEX_LEN_3A6A_P_2        (VEX_LEN_3A63_P_2 + 1)
1236
#define VEX_LEN_3A6B_P_2        (VEX_LEN_3A6A_P_2 + 1)
1237
#define VEX_LEN_3A6E_P_2        (VEX_LEN_3A6B_P_2 + 1)
1238
#define VEX_LEN_3A6F_P_2        (VEX_LEN_3A6E_P_2 + 1)
1239
#define VEX_LEN_3A7A_P_2        (VEX_LEN_3A6F_P_2 + 1)
1240
#define VEX_LEN_3A7B_P_2        (VEX_LEN_3A7A_P_2 + 1)
1241
#define VEX_LEN_3A7E_P_2        (VEX_LEN_3A7B_P_2 + 1)
1242
#define VEX_LEN_3A7F_P_2        (VEX_LEN_3A7E_P_2 + 1)
1243
#define VEX_LEN_3ADF_P_2        (VEX_LEN_3A7F_P_2 + 1)
1244
 
1245
typedef void (*op_rtn) (int bytemode, int sizeflag);
1246
 
1247
struct dis386 {
1248
  const char *name;
1249
  struct
1250
    {
1251
      op_rtn rtn;
1252
      int bytemode;
1253
    } op[MAX_OPERANDS];
1254
};
1255
 
1256
/* Upper case letters in the instruction names here are macros.
1257
   'A' => print 'b' if no register operands or suffix_always is true
1258
   'B' => print 'b' if suffix_always is true
1259
   'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
1260
          size prefix
1261
   'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
1262
          suffix_always is true
1263
   'E' => print 'e' if 32-bit form of jcxz
1264
   'F' => print 'w' or 'l' depending on address size prefix (loop insns)
1265
   'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
1266
   'H' => print ",pt" or ",pn" branch hint
1267
   'I' => honor following macro letter even in Intel mode (implemented only
1268
          for some of the macro letters)
1269
   'J' => print 'l'
1270
   'K' => print 'd' or 'q' if rex prefix is present.
1271
   'L' => print 'l' if suffix_always is true
1272
   'M' => print 'r' if intel_mnemonic is false.
1273
   'N' => print 'n' if instruction has no wait "prefix"
1274
   'O' => print 'd' or 'o' (or 'q' in Intel mode)
1275
   'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
1276
          or suffix_always is true.  print 'q' if rex prefix is present.
1277
   'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
1278
          is true
1279
   'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
1280
   'S' => print 'w', 'l' or 'q' if suffix_always is true
1281
   'T' => print 'q' in 64bit mode and behave as 'P' otherwise
1282
   'U' => print 'q' in 64bit mode and behave as 'Q' otherwise
1283
   'V' => print 'q' in 64bit mode and behave as 'S' otherwise
1284
   'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
1285
   'X' => print 's', 'd' depending on data16 prefix (for XMM)
1286
   'Y' => 'q' if instruction has an REX 64bit overwrite prefix and
1287
          suffix_always is true.
1288
   'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
1289
   '!' => change condition from true to false or from false to true.
1290
   '%' => add 1 upper case letter to the macro.
1291
 
1292
   2 upper case letter macros:
1293
   "XY" => print 'x' or 'y' if no register operands or suffix_always
1294
           is true.
1295
   'LQ' => print 'l' ('d' in Intel mode) or 'q' for memory operand
1296
           or suffix_always is true
1297
 
1298
   Many of the above letters print nothing in Intel mode.  See "putop"
1299
   for the details.
1300
 
1301
   Braces '{' and '}', and vertical bars '|', indicate alternative
1302
   mnemonic strings for AT&T and Intel.  */
1303
 
1304
static const struct dis386 dis386[] = {
1305
  /* 00 */
1306
  { "addB",             { Eb, Gb } },
1307
  { "addS",             { Ev, Gv } },
1308
  { "addB",             { Gb, Eb } },
1309
  { "addS",             { Gv, Ev } },
1310
  { "addB",             { AL, Ib } },
1311
  { "addS",             { eAX, Iv } },
1312
  { X86_64_TABLE (X86_64_06) },
1313
  { X86_64_TABLE (X86_64_07) },
1314
  /* 08 */
1315
  { "orB",              { Eb, Gb } },
1316
  { "orS",              { Ev, Gv } },
1317
  { "orB",              { Gb, Eb } },
1318
  { "orS",              { Gv, Ev } },
1319
  { "orB",              { AL, Ib } },
1320
  { "orS",              { eAX, Iv } },
1321
  { X86_64_TABLE (X86_64_0D) },
1322
  { "(bad)",            { XX } },       /* 0x0f extended opcode escape */
1323
  /* 10 */
1324
  { "adcB",             { Eb, Gb } },
1325
  { "adcS",             { Ev, Gv } },
1326
  { "adcB",             { Gb, Eb } },
1327
  { "adcS",             { Gv, Ev } },
1328
  { "adcB",             { AL, Ib } },
1329
  { "adcS",             { eAX, Iv } },
1330
  { X86_64_TABLE (X86_64_16) },
1331
  { X86_64_TABLE (X86_64_17) },
1332
  /* 18 */
1333
  { "sbbB",             { Eb, Gb } },
1334
  { "sbbS",             { Ev, Gv } },
1335
  { "sbbB",             { Gb, Eb } },
1336
  { "sbbS",             { Gv, Ev } },
1337
  { "sbbB",             { AL, Ib } },
1338
  { "sbbS",             { eAX, Iv } },
1339
  { X86_64_TABLE (X86_64_1E) },
1340
  { X86_64_TABLE (X86_64_1F) },
1341
  /* 20 */
1342
  { "andB",             { Eb, Gb } },
1343
  { "andS",             { Ev, Gv } },
1344
  { "andB",             { Gb, Eb } },
1345
  { "andS",             { Gv, Ev } },
1346
  { "andB",             { AL, Ib } },
1347
  { "andS",             { eAX, Iv } },
1348
  { "(bad)",            { XX } },       /* SEG ES prefix */
1349
  { X86_64_TABLE (X86_64_27) },
1350
  /* 28 */
1351
  { "subB",             { Eb, Gb } },
1352
  { "subS",             { Ev, Gv } },
1353
  { "subB",             { Gb, Eb } },
1354
  { "subS",             { Gv, Ev } },
1355
  { "subB",             { AL, Ib } },
1356
  { "subS",             { eAX, Iv } },
1357
  { "(bad)",            { XX } },       /* SEG CS prefix */
1358
  { X86_64_TABLE (X86_64_2F) },
1359
  /* 30 */
1360
  { "xorB",             { Eb, Gb } },
1361
  { "xorS",             { Ev, Gv } },
1362
  { "xorB",             { Gb, Eb } },
1363
  { "xorS",             { Gv, Ev } },
1364
  { "xorB",             { AL, Ib } },
1365
  { "xorS",             { eAX, Iv } },
1366
  { "(bad)",            { XX } },       /* SEG SS prefix */
1367
  { X86_64_TABLE (X86_64_37) },
1368
  /* 38 */
1369
  { "cmpB",             { Eb, Gb } },
1370
  { "cmpS",             { Ev, Gv } },
1371
  { "cmpB",             { Gb, Eb } },
1372
  { "cmpS",             { Gv, Ev } },
1373
  { "cmpB",             { AL, Ib } },
1374
  { "cmpS",             { eAX, Iv } },
1375
  { "(bad)",            { XX } },       /* SEG DS prefix */
1376
  { X86_64_TABLE (X86_64_3F) },
1377
  /* 40 */
1378
  { "inc{S|}",          { RMeAX } },
1379
  { "inc{S|}",          { RMeCX } },
1380
  { "inc{S|}",          { RMeDX } },
1381
  { "inc{S|}",          { RMeBX } },
1382
  { "inc{S|}",          { RMeSP } },
1383
  { "inc{S|}",          { RMeBP } },
1384
  { "inc{S|}",          { RMeSI } },
1385
  { "inc{S|}",          { RMeDI } },
1386
  /* 48 */
1387
  { "dec{S|}",          { RMeAX } },
1388
  { "dec{S|}",          { RMeCX } },
1389
  { "dec{S|}",          { RMeDX } },
1390
  { "dec{S|}",          { RMeBX } },
1391
  { "dec{S|}",          { RMeSP } },
1392
  { "dec{S|}",          { RMeBP } },
1393
  { "dec{S|}",          { RMeSI } },
1394
  { "dec{S|}",          { RMeDI } },
1395
  /* 50 */
1396
  { "pushV",            { RMrAX } },
1397
  { "pushV",            { RMrCX } },
1398
  { "pushV",            { RMrDX } },
1399
  { "pushV",            { RMrBX } },
1400
  { "pushV",            { RMrSP } },
1401
  { "pushV",            { RMrBP } },
1402
  { "pushV",            { RMrSI } },
1403
  { "pushV",            { RMrDI } },
1404
  /* 58 */
1405
  { "popV",             { RMrAX } },
1406
  { "popV",             { RMrCX } },
1407
  { "popV",             { RMrDX } },
1408
  { "popV",             { RMrBX } },
1409
  { "popV",             { RMrSP } },
1410
  { "popV",             { RMrBP } },
1411
  { "popV",             { RMrSI } },
1412
  { "popV",             { RMrDI } },
1413
  /* 60 */
1414
  { X86_64_TABLE (X86_64_60) },
1415
  { X86_64_TABLE (X86_64_61) },
1416
  { X86_64_TABLE (X86_64_62) },
1417
  { X86_64_TABLE (X86_64_63) },
1418
  { "(bad)",            { XX } },       /* seg fs */
1419
  { "(bad)",            { XX } },       /* seg gs */
1420
  { "(bad)",            { XX } },       /* op size prefix */
1421
  { "(bad)",            { XX } },       /* adr size prefix */
1422
  /* 68 */
1423
  { "pushT",            { Iq } },
1424
  { "imulS",            { Gv, Ev, Iv } },
1425
  { "pushT",            { sIb } },
1426
  { "imulS",            { Gv, Ev, sIb } },
1427
  { "ins{b|}",          { Ybr, indirDX } },
1428
  { X86_64_TABLE (X86_64_6D) },
1429
  { "outs{b|}",         { indirDXr, Xb } },
1430
  { X86_64_TABLE (X86_64_6F) },
1431
  /* 70 */
1432
  { "joH",              { Jb, XX, cond_jump_flag } },
1433
  { "jnoH",             { Jb, XX, cond_jump_flag } },
1434
  { "jbH",              { Jb, XX, cond_jump_flag } },
1435
  { "jaeH",             { Jb, XX, cond_jump_flag } },
1436
  { "jeH",              { Jb, XX, cond_jump_flag } },
1437
  { "jneH",             { Jb, XX, cond_jump_flag } },
1438
  { "jbeH",             { Jb, XX, cond_jump_flag } },
1439
  { "jaH",              { Jb, XX, cond_jump_flag } },
1440
  /* 78 */
1441
  { "jsH",              { Jb, XX, cond_jump_flag } },
1442
  { "jnsH",             { Jb, XX, cond_jump_flag } },
1443
  { "jpH",              { Jb, XX, cond_jump_flag } },
1444
  { "jnpH",             { Jb, XX, cond_jump_flag } },
1445
  { "jlH",              { Jb, XX, cond_jump_flag } },
1446
  { "jgeH",             { Jb, XX, cond_jump_flag } },
1447
  { "jleH",             { Jb, XX, cond_jump_flag } },
1448
  { "jgH",              { Jb, XX, cond_jump_flag } },
1449
  /* 80 */
1450
  { REG_TABLE (REG_80) },
1451
  { REG_TABLE (REG_81) },
1452
  { "(bad)",            { XX } },
1453
  { REG_TABLE (REG_82) },
1454
  { "testB",            { Eb, Gb } },
1455
  { "testS",            { Ev, Gv } },
1456
  { "xchgB",            { Eb, Gb } },
1457
  { "xchgS",            { Ev, Gv } },
1458
  /* 88 */
1459
  { "movB",             { Eb, Gb } },
1460
  { "movS",             { Ev, Gv } },
1461
  { "movB",             { Gb, Eb } },
1462
  { "movS",             { Gv, Ev } },
1463
  { "movD",             { Sv, Sw } },
1464
  { MOD_TABLE (MOD_8D) },
1465
  { "movD",             { Sw, Sv } },
1466
  { REG_TABLE (REG_8F) },
1467
  /* 90 */
1468
  { PREFIX_TABLE (PREFIX_90) },
1469
  { "xchgS",            { RMeCX, eAX } },
1470
  { "xchgS",            { RMeDX, eAX } },
1471
  { "xchgS",            { RMeBX, eAX } },
1472
  { "xchgS",            { RMeSP, eAX } },
1473
  { "xchgS",            { RMeBP, eAX } },
1474
  { "xchgS",            { RMeSI, eAX } },
1475
  { "xchgS",            { RMeDI, eAX } },
1476
  /* 98 */
1477
  { "cW{t|}R",          { XX } },
1478
  { "cR{t|}O",          { XX } },
1479
  { X86_64_TABLE (X86_64_9A) },
1480
  { "(bad)",            { XX } },       /* fwait */
1481
  { "pushfT",           { XX } },
1482
  { "popfT",            { XX } },
1483
  { "sahf",             { XX } },
1484
  { "lahf",             { XX } },
1485
  /* a0 */
1486
  { "movB",             { AL, Ob } },
1487
  { "movS",             { eAX, Ov } },
1488
  { "movB",             { Ob, AL } },
1489
  { "movS",             { Ov, eAX } },
1490
  { "movs{b|}",         { Ybr, Xb } },
1491
  { "movs{R|}",         { Yvr, Xv } },
1492
  { "cmps{b|}",         { Xb, Yb } },
1493
  { "cmps{R|}",         { Xv, Yv } },
1494
  /* a8 */
1495
  { "testB",            { AL, Ib } },
1496
  { "testS",            { eAX, Iv } },
1497
  { "stosB",            { Ybr, AL } },
1498
  { "stosS",            { Yvr, eAX } },
1499
  { "lodsB",            { ALr, Xb } },
1500
  { "lodsS",            { eAXr, Xv } },
1501
  { "scasB",            { AL, Yb } },
1502
  { "scasS",            { eAX, Yv } },
1503
  /* b0 */
1504
  { "movB",             { RMAL, Ib } },
1505
  { "movB",             { RMCL, Ib } },
1506
  { "movB",             { RMDL, Ib } },
1507
  { "movB",             { RMBL, Ib } },
1508
  { "movB",             { RMAH, Ib } },
1509
  { "movB",             { RMCH, Ib } },
1510
  { "movB",             { RMDH, Ib } },
1511
  { "movB",             { RMBH, Ib } },
1512
  /* b8 */
1513
  { "movS",             { RMeAX, Iv64 } },
1514
  { "movS",             { RMeCX, Iv64 } },
1515
  { "movS",             { RMeDX, Iv64 } },
1516
  { "movS",             { RMeBX, Iv64 } },
1517
  { "movS",             { RMeSP, Iv64 } },
1518
  { "movS",             { RMeBP, Iv64 } },
1519
  { "movS",             { RMeSI, Iv64 } },
1520
  { "movS",             { RMeDI, Iv64 } },
1521
  /* c0 */
1522
  { REG_TABLE (REG_C0) },
1523
  { REG_TABLE (REG_C1) },
1524
  { "retT",             { Iw } },
1525
  { "retT",             { XX } },
1526
  { X86_64_TABLE (X86_64_C4) },
1527
  { X86_64_TABLE (X86_64_C5) },
1528
  { REG_TABLE (REG_C6) },
1529
  { REG_TABLE (REG_C7) },
1530
  /* c8 */
1531
  { "enterT",           { Iw, Ib } },
1532
  { "leaveT",           { XX } },
1533
  { "Jret{|f}P",        { Iw } },
1534
  { "Jret{|f}P",        { XX } },
1535
  { "int3",             { XX } },
1536
  { "int",              { Ib } },
1537
  { X86_64_TABLE (X86_64_CE) },
1538
  { "iretP",            { XX } },
1539
  /* d0 */
1540
  { REG_TABLE (REG_D0) },
1541
  { REG_TABLE (REG_D1) },
1542
  { REG_TABLE (REG_D2) },
1543
  { REG_TABLE (REG_D3) },
1544
  { X86_64_TABLE (X86_64_D4) },
1545
  { X86_64_TABLE (X86_64_D5) },
1546
  { "(bad)",            { XX } },
1547
  { "xlat",             { DSBX } },
1548
  /* d8 */
1549
  { FLOAT },
1550
  { FLOAT },
1551
  { FLOAT },
1552
  { FLOAT },
1553
  { FLOAT },
1554
  { FLOAT },
1555
  { FLOAT },
1556
  { FLOAT },
1557
  /* e0 */
1558
  { "loopneFH",         { Jb, XX, loop_jcxz_flag } },
1559
  { "loopeFH",          { Jb, XX, loop_jcxz_flag } },
1560
  { "loopFH",           { Jb, XX, loop_jcxz_flag } },
1561
  { "jEcxzH",           { Jb, XX, loop_jcxz_flag } },
1562
  { "inB",              { AL, Ib } },
1563
  { "inG",              { zAX, Ib } },
1564
  { "outB",             { Ib, AL } },
1565
  { "outG",             { Ib, zAX } },
1566
  /* e8 */
1567
  { "callT",            { Jv } },
1568
  { "jmpT",             { Jv } },
1569
  { X86_64_TABLE (X86_64_EA) },
1570
  { "jmp",              { Jb } },
1571
  { "inB",              { AL, indirDX } },
1572
  { "inG",              { zAX, indirDX } },
1573
  { "outB",             { indirDX, AL } },
1574
  { "outG",             { indirDX, zAX } },
1575
  /* f0 */
1576
  { "(bad)",            { XX } },       /* lock prefix */
1577
  { "icebp",            { XX } },
1578
  { "(bad)",            { XX } },       /* repne */
1579
  { "(bad)",            { XX } },       /* repz */
1580
  { "hlt",              { XX } },
1581
  { "cmc",              { XX } },
1582
  { REG_TABLE (REG_F6) },
1583
  { REG_TABLE (REG_F7) },
1584
  /* f8 */
1585
  { "clc",              { XX } },
1586
  { "stc",              { XX } },
1587
  { "cli",              { XX } },
1588
  { "sti",              { XX } },
1589
  { "cld",              { XX } },
1590
  { "std",              { XX } },
1591
  { REG_TABLE (REG_FE) },
1592
  { REG_TABLE (REG_FF) },
1593
};
1594
 
1595
static const struct dis386 dis386_twobyte[] = {
1596
  /* 00 */
1597
  { REG_TABLE (REG_0F00 ) },
1598
  { REG_TABLE (REG_0F01 ) },
1599
  { "larS",             { Gv, Ew } },
1600
  { "lslS",             { Gv, Ew } },
1601
  { "(bad)",            { XX } },
1602
  { "syscall",          { XX } },
1603
  { "clts",             { XX } },
1604
  { "sysretP",          { XX } },
1605
  /* 08 */
1606
  { "invd",             { XX } },
1607
  { "wbinvd",           { XX } },
1608
  { "(bad)",            { XX } },
1609
  { "ud2a",             { XX } },
1610
  { "(bad)",            { XX } },
1611
  { REG_TABLE (REG_0F0D) },
1612
  { "femms",            { XX } },
1613
  { "",                 { MX, EM, OPSUF } }, /* See OP_3DNowSuffix.  */
1614
  /* 10 */
1615
  { PREFIX_TABLE (PREFIX_0F10) },
1616
  { PREFIX_TABLE (PREFIX_0F11) },
1617
  { PREFIX_TABLE (PREFIX_0F12) },
1618
  { MOD_TABLE (MOD_0F13) },
1619
  { "unpcklpX",         { XM, EXx } },
1620
  { "unpckhpX",         { XM, EXx } },
1621
  { PREFIX_TABLE (PREFIX_0F16) },
1622
  { MOD_TABLE (MOD_0F17) },
1623
  /* 18 */
1624
  { REG_TABLE (REG_0F18) },
1625
  { "nopQ",             { Ev } },
1626
  { "nopQ",             { Ev } },
1627
  { "nopQ",             { Ev } },
1628
  { "nopQ",             { Ev } },
1629
  { "nopQ",             { Ev } },
1630
  { "nopQ",             { Ev } },
1631
  { "nopQ",             { Ev } },
1632
  /* 20 */
1633
  { MOD_TABLE (MOD_0F20) },
1634
  { MOD_TABLE (MOD_0F21) },
1635
  { MOD_TABLE (MOD_0F22) },
1636
  { MOD_TABLE (MOD_0F23) },
1637
  { MOD_TABLE (MOD_0F24) },
1638
  { THREE_BYTE_TABLE (THREE_BYTE_0F25) },
1639
  { MOD_TABLE (MOD_0F26) },
1640
  { "(bad)",            { XX } },
1641
  /* 28 */
1642
  { "movapX",           { XM, EXx } },
1643
  { "movapX",           { EXx, XM } },
1644
  { PREFIX_TABLE (PREFIX_0F2A) },
1645
  { PREFIX_TABLE (PREFIX_0F2B) },
1646
  { PREFIX_TABLE (PREFIX_0F2C) },
1647
  { PREFIX_TABLE (PREFIX_0F2D) },
1648
  { PREFIX_TABLE (PREFIX_0F2E) },
1649
  { PREFIX_TABLE (PREFIX_0F2F) },
1650
  /* 30 */
1651
  { "wrmsr",            { XX } },
1652
  { "rdtsc",            { XX } },
1653
  { "rdmsr",            { XX } },
1654
  { "rdpmc",            { XX } },
1655
  { "sysenter",         { XX } },
1656
  { "sysexit",          { XX } },
1657
  { "(bad)",            { XX } },
1658
  { "getsec",           { XX } },
1659
  /* 38 */
1660
  { THREE_BYTE_TABLE (THREE_BYTE_0F38) },
1661
  { "(bad)",            { XX } },
1662
  { THREE_BYTE_TABLE (THREE_BYTE_0F3A) },
1663
  { "(bad)",            { XX } },
1664
  { "(bad)",            { XX } },
1665
  { "(bad)",            { XX } },
1666
  { "(bad)",            { XX } },
1667
  { "(bad)",            { XX } },
1668
  /* 40 */
1669
  { "cmovoS",           { Gv, Ev } },
1670
  { "cmovnoS",          { Gv, Ev } },
1671
  { "cmovbS",           { Gv, Ev } },
1672
  { "cmovaeS",          { Gv, Ev } },
1673
  { "cmoveS",           { Gv, Ev } },
1674
  { "cmovneS",          { Gv, Ev } },
1675
  { "cmovbeS",          { Gv, Ev } },
1676
  { "cmovaS",           { Gv, Ev } },
1677
  /* 48 */
1678
  { "cmovsS",           { Gv, Ev } },
1679
  { "cmovnsS",          { Gv, Ev } },
1680
  { "cmovpS",           { Gv, Ev } },
1681
  { "cmovnpS",          { Gv, Ev } },
1682
  { "cmovlS",           { Gv, Ev } },
1683
  { "cmovgeS",          { Gv, Ev } },
1684
  { "cmovleS",          { Gv, Ev } },
1685
  { "cmovgS",           { Gv, Ev } },
1686
  /* 50 */
1687
  { MOD_TABLE (MOD_0F51) },
1688
  { PREFIX_TABLE (PREFIX_0F51) },
1689
  { PREFIX_TABLE (PREFIX_0F52) },
1690
  { PREFIX_TABLE (PREFIX_0F53) },
1691
  { "andpX",            { XM, EXx } },
1692
  { "andnpX",           { XM, EXx } },
1693
  { "orpX",             { XM, EXx } },
1694
  { "xorpX",            { XM, EXx } },
1695
  /* 58 */
1696
  { PREFIX_TABLE (PREFIX_0F58) },
1697
  { PREFIX_TABLE (PREFIX_0F59) },
1698
  { PREFIX_TABLE (PREFIX_0F5A) },
1699
  { PREFIX_TABLE (PREFIX_0F5B) },
1700
  { PREFIX_TABLE (PREFIX_0F5C) },
1701
  { PREFIX_TABLE (PREFIX_0F5D) },
1702
  { PREFIX_TABLE (PREFIX_0F5E) },
1703
  { PREFIX_TABLE (PREFIX_0F5F) },
1704
  /* 60 */
1705
  { PREFIX_TABLE (PREFIX_0F60) },
1706
  { PREFIX_TABLE (PREFIX_0F61) },
1707
  { PREFIX_TABLE (PREFIX_0F62) },
1708
  { "packsswb",         { MX, EM } },
1709
  { "pcmpgtb",          { MX, EM } },
1710
  { "pcmpgtw",          { MX, EM } },
1711
  { "pcmpgtd",          { MX, EM } },
1712
  { "packuswb",         { MX, EM } },
1713
  /* 68 */
1714
  { "punpckhbw",        { MX, EM } },
1715
  { "punpckhwd",        { MX, EM } },
1716
  { "punpckhdq",        { MX, EM } },
1717
  { "packssdw",         { MX, EM } },
1718
  { PREFIX_TABLE (PREFIX_0F6C) },
1719
  { PREFIX_TABLE (PREFIX_0F6D) },
1720
  { "movK",             { MX, Edq } },
1721
  { PREFIX_TABLE (PREFIX_0F6F) },
1722
  /* 70 */
1723
  { PREFIX_TABLE (PREFIX_0F70) },
1724
  { REG_TABLE (REG_0F71) },
1725
  { REG_TABLE (REG_0F72) },
1726
  { REG_TABLE (REG_0F73) },
1727
  { "pcmpeqb",          { MX, EM } },
1728
  { "pcmpeqw",          { MX, EM } },
1729
  { "pcmpeqd",          { MX, EM } },
1730
  { "emms",             { XX } },
1731
  /* 78 */
1732
  { PREFIX_TABLE (PREFIX_0F78) },
1733
  { PREFIX_TABLE (PREFIX_0F79) },
1734
  { THREE_BYTE_TABLE (THREE_BYTE_0F7A) },
1735
  { THREE_BYTE_TABLE (THREE_BYTE_0F7B) },
1736
  { PREFIX_TABLE (PREFIX_0F7C) },
1737
  { PREFIX_TABLE (PREFIX_0F7D) },
1738
  { PREFIX_TABLE (PREFIX_0F7E) },
1739
  { PREFIX_TABLE (PREFIX_0F7F) },
1740
  /* 80 */
1741
  { "joH",              { Jv, XX, cond_jump_flag } },
1742
  { "jnoH",             { Jv, XX, cond_jump_flag } },
1743
  { "jbH",              { Jv, XX, cond_jump_flag } },
1744
  { "jaeH",             { Jv, XX, cond_jump_flag } },
1745
  { "jeH",              { Jv, XX, cond_jump_flag } },
1746
  { "jneH",             { Jv, XX, cond_jump_flag } },
1747
  { "jbeH",             { Jv, XX, cond_jump_flag } },
1748
  { "jaH",              { Jv, XX, cond_jump_flag } },
1749
  /* 88 */
1750
  { "jsH",              { Jv, XX, cond_jump_flag } },
1751
  { "jnsH",             { Jv, XX, cond_jump_flag } },
1752
  { "jpH",              { Jv, XX, cond_jump_flag } },
1753
  { "jnpH",             { Jv, XX, cond_jump_flag } },
1754
  { "jlH",              { Jv, XX, cond_jump_flag } },
1755
  { "jgeH",             { Jv, XX, cond_jump_flag } },
1756
  { "jleH",             { Jv, XX, cond_jump_flag } },
1757
  { "jgH",              { Jv, XX, cond_jump_flag } },
1758
  /* 90 */
1759
  { "seto",             { Eb } },
1760
  { "setno",            { Eb } },
1761
  { "setb",             { Eb } },
1762
  { "setae",            { Eb } },
1763
  { "sete",             { Eb } },
1764
  { "setne",            { Eb } },
1765
  { "setbe",            { Eb } },
1766
  { "seta",             { Eb } },
1767
  /* 98 */
1768
  { "sets",             { Eb } },
1769
  { "setns",            { Eb } },
1770
  { "setp",             { Eb } },
1771
  { "setnp",            { Eb } },
1772
  { "setl",             { Eb } },
1773
  { "setge",            { Eb } },
1774
  { "setle",            { Eb } },
1775
  { "setg",             { Eb } },
1776
  /* a0 */
1777
  { "pushT",            { fs } },
1778
  { "popT",             { fs } },
1779
  { "cpuid",            { XX } },
1780
  { "btS",              { Ev, Gv } },
1781
  { "shldS",            { Ev, Gv, Ib } },
1782
  { "shldS",            { Ev, Gv, CL } },
1783
  { REG_TABLE (REG_0FA6) },
1784
  { REG_TABLE (REG_0FA7) },
1785
  /* a8 */
1786
  { "pushT",            { gs } },
1787
  { "popT",             { gs } },
1788
  { "rsm",              { XX } },
1789
  { "btsS",             { Ev, Gv } },
1790
  { "shrdS",            { Ev, Gv, Ib } },
1791
  { "shrdS",            { Ev, Gv, CL } },
1792
  { REG_TABLE (REG_0FAE) },
1793
  { "imulS",            { Gv, Ev } },
1794
  /* b0 */
1795
  { "cmpxchgB",         { Eb, Gb } },
1796
  { "cmpxchgS",         { Ev, Gv } },
1797
  { MOD_TABLE (MOD_0FB2) },
1798
  { "btrS",             { Ev, Gv } },
1799
  { MOD_TABLE (MOD_0FB4) },
1800
  { MOD_TABLE (MOD_0FB5) },
1801
  { "movz{bR|x}",       { Gv, Eb } },
1802
  { "movz{wR|x}",       { Gv, Ew } }, /* yes, there really is movzww ! */
1803
  /* b8 */
1804
  { PREFIX_TABLE (PREFIX_0FB8) },
1805
  { "ud2b",             { XX } },
1806
  { REG_TABLE (REG_0FBA) },
1807
  { "btcS",             { Ev, Gv } },
1808
  { "bsfS",             { Gv, Ev } },
1809
  { PREFIX_TABLE (PREFIX_0FBD) },
1810
  { "movs{bR|x}",       { Gv, Eb } },
1811
  { "movs{wR|x}",       { Gv, Ew } }, /* yes, there really is movsww ! */
1812
  /* c0 */
1813
  { "xaddB",            { Eb, Gb } },
1814
  { "xaddS",            { Ev, Gv } },
1815
  { PREFIX_TABLE (PREFIX_0FC2) },
1816
  { PREFIX_TABLE (PREFIX_0FC3) },
1817
  { "pinsrw",           { MX, Edqw, Ib } },
1818
  { "pextrw",           { Gdq, MS, Ib } },
1819
  { "shufpX",           { XM, EXx, Ib } },
1820
  { REG_TABLE (REG_0FC7) },
1821
  /* c8 */
1822
  { "bswap",            { RMeAX } },
1823
  { "bswap",            { RMeCX } },
1824
  { "bswap",            { RMeDX } },
1825
  { "bswap",            { RMeBX } },
1826
  { "bswap",            { RMeSP } },
1827
  { "bswap",            { RMeBP } },
1828
  { "bswap",            { RMeSI } },
1829
  { "bswap",            { RMeDI } },
1830
  /* d0 */
1831
  { PREFIX_TABLE (PREFIX_0FD0) },
1832
  { "psrlw",            { MX, EM } },
1833
  { "psrld",            { MX, EM } },
1834
  { "psrlq",            { MX, EM } },
1835
  { "paddq",            { MX, EM } },
1836
  { "pmullw",           { MX, EM } },
1837
  { PREFIX_TABLE (PREFIX_0FD6) },
1838
  { MOD_TABLE (MOD_0FD7) },
1839
  /* d8 */
1840
  { "psubusb",          { MX, EM } },
1841
  { "psubusw",          { MX, EM } },
1842
  { "pminub",           { MX, EM } },
1843
  { "pand",             { MX, EM } },
1844
  { "paddusb",          { MX, EM } },
1845
  { "paddusw",          { MX, EM } },
1846
  { "pmaxub",           { MX, EM } },
1847
  { "pandn",            { MX, EM } },
1848
  /* e0 */
1849
  { "pavgb",            { MX, EM } },
1850
  { "psraw",            { MX, EM } },
1851
  { "psrad",            { MX, EM } },
1852
  { "pavgw",            { MX, EM } },
1853
  { "pmulhuw",          { MX, EM } },
1854
  { "pmulhw",           { MX, EM } },
1855
  { PREFIX_TABLE (PREFIX_0FE6) },
1856
  { PREFIX_TABLE (PREFIX_0FE7) },
1857
  /* e8 */
1858
  { "psubsb",           { MX, EM } },
1859
  { "psubsw",           { MX, EM } },
1860
  { "pminsw",           { MX, EM } },
1861
  { "por",              { MX, EM } },
1862
  { "paddsb",           { MX, EM } },
1863
  { "paddsw",           { MX, EM } },
1864
  { "pmaxsw",           { MX, EM } },
1865
  { "pxor",             { MX, EM } },
1866
  /* f0 */
1867
  { PREFIX_TABLE (PREFIX_0FF0) },
1868
  { "psllw",            { MX, EM } },
1869
  { "pslld",            { MX, EM } },
1870
  { "psllq",            { MX, EM } },
1871
  { "pmuludq",          { MX, EM } },
1872
  { "pmaddwd",          { MX, EM } },
1873
  { "psadbw",           { MX, EM } },
1874
  { PREFIX_TABLE (PREFIX_0FF7) },
1875
  /* f8 */
1876
  { "psubb",            { MX, EM } },
1877
  { "psubw",            { MX, EM } },
1878
  { "psubd",            { MX, EM } },
1879
  { "psubq",            { MX, EM } },
1880
  { "paddb",            { MX, EM } },
1881
  { "paddw",            { MX, EM } },
1882
  { "paddd",            { MX, EM } },
1883
  { "(bad)",            { XX } },
1884
};
1885
 
1886
static const unsigned char onebyte_has_modrm[256] = {
1887
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1888
  /*       -------------------------------        */
1889
  /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
1890
  /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
1891
  /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
1892
  /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
1893
  /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
1894
  /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
1895
  /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
1896
  /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
1897
  /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
1898
  /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
1899
  /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
1900
  /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
1901
  /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
1902
  /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
1903
  /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
1904
  /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1  /* f0 */
1905
  /*       -------------------------------        */
1906
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1907
};
1908
 
1909
static const unsigned char twobyte_has_modrm[256] = {
1910
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1911
  /*       -------------------------------        */
1912
  /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
1913
  /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
1914
  /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
1915
  /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
1916
  /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
1917
  /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
1918
  /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
1919
  /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
1920
  /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
1921
  /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
1922
  /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
1923
  /* b0 */ 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, /* bf */
1924
  /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
1925
  /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
1926
  /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
1927
  /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0  /* ff */
1928
  /*       -------------------------------        */
1929
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1930
};
1931
 
1932
static char obuf[100];
1933
static char *obufp;
1934
static char scratchbuf[100];
1935
static unsigned char *start_codep;
1936
static unsigned char *insn_codep;
1937
static unsigned char *codep;
1938
static const char *lock_prefix;
1939
static const char *data_prefix;
1940
static const char *addr_prefix;
1941
static const char *repz_prefix;
1942
static const char *repnz_prefix;
1943
static disassemble_info *the_info;
1944
static struct
1945
  {
1946
    int mod;
1947
    int reg;
1948
    int rm;
1949
  }
1950
modrm;
1951
static unsigned char need_modrm;
1952
static struct
1953
  {
1954
    int register_specifier;
1955
    int length;
1956
    int prefix;
1957
    int w;
1958
  }
1959
vex;
1960
static unsigned char need_vex;
1961
static unsigned char need_vex_reg;
1962
static unsigned char vex_w_done;
1963
 
1964
/* If we are accessing mod/rm/reg without need_modrm set, then the
1965
   values are stale.  Hitting this abort likely indicates that you
1966
   need to update onebyte_has_modrm or twobyte_has_modrm.  */
1967
#define MODRM_CHECK  if (!need_modrm) abort ()
1968
 
1969
static const char **names64;
1970
static const char **names32;
1971
static const char **names16;
1972
static const char **names8;
1973
static const char **names8rex;
1974
static const char **names_seg;
1975
static const char *index64;
1976
static const char *index32;
1977
static const char **index16;
1978
 
1979
static const char *intel_names64[] = {
1980
  "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
1981
  "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
1982
};
1983
static const char *intel_names32[] = {
1984
  "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
1985
  "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
1986
};
1987
static const char *intel_names16[] = {
1988
  "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
1989
  "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
1990
};
1991
static const char *intel_names8[] = {
1992
  "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
1993
};
1994
static const char *intel_names8rex[] = {
1995
  "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
1996
  "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
1997
};
1998
static const char *intel_names_seg[] = {
1999
  "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
2000
};
2001
static const char *intel_index64 = "riz";
2002
static const char *intel_index32 = "eiz";
2003
static const char *intel_index16[] = {
2004
  "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2005
};
2006
 
2007
static const char *att_names64[] = {
2008
  "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
2009
  "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
2010
};
2011
static const char *att_names32[] = {
2012
  "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
2013
  "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
2014
};
2015
static const char *att_names16[] = {
2016
  "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
2017
  "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
2018
};
2019
static const char *att_names8[] = {
2020
  "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
2021
};
2022
static const char *att_names8rex[] = {
2023
  "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
2024
  "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
2025
};
2026
static const char *att_names_seg[] = {
2027
  "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
2028
};
2029
static const char *att_index64 = "%riz";
2030
static const char *att_index32 = "%eiz";
2031
static const char *att_index16[] = {
2032
  "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
2033
};
2034
 
2035
static const struct dis386 reg_table[][8] = {
2036
  /* REG_80 */
2037
  {
2038
    { "addA",   { Eb, Ib } },
2039
    { "orA",    { Eb, Ib } },
2040
    { "adcA",   { Eb, Ib } },
2041
    { "sbbA",   { Eb, Ib } },
2042
    { "andA",   { Eb, Ib } },
2043
    { "subA",   { Eb, Ib } },
2044
    { "xorA",   { Eb, Ib } },
2045
    { "cmpA",   { Eb, Ib } },
2046
  },
2047
  /* REG_81 */
2048
  {
2049
    { "addQ",   { Ev, Iv } },
2050
    { "orQ",    { Ev, Iv } },
2051
    { "adcQ",   { Ev, Iv } },
2052
    { "sbbQ",   { Ev, Iv } },
2053
    { "andQ",   { Ev, Iv } },
2054
    { "subQ",   { Ev, Iv } },
2055
    { "xorQ",   { Ev, Iv } },
2056
    { "cmpQ",   { Ev, Iv } },
2057
  },
2058
  /* REG_82 */
2059
  {
2060
    { "addQ",   { Ev, sIb } },
2061
    { "orQ",    { Ev, sIb } },
2062
    { "adcQ",   { Ev, sIb } },
2063
    { "sbbQ",   { Ev, sIb } },
2064
    { "andQ",   { Ev, sIb } },
2065
    { "subQ",   { Ev, sIb } },
2066
    { "xorQ",   { Ev, sIb } },
2067
    { "cmpQ",   { Ev, sIb } },
2068
  },
2069
  /* REG_8F */
2070
  {
2071
    { "popU",   { stackEv } },
2072
    { "(bad)",  { XX } },
2073
    { "(bad)",  { XX } },
2074
    { "(bad)",  { XX } },
2075
    { "(bad)",  { XX } },
2076
    { "(bad)",  { XX } },
2077
    { "(bad)",  { XX } },
2078
    { "(bad)",  { XX } },
2079
  },
2080
  /* REG_C0 */
2081
  {
2082
    { "rolA",   { Eb, Ib } },
2083
    { "rorA",   { Eb, Ib } },
2084
    { "rclA",   { Eb, Ib } },
2085
    { "rcrA",   { Eb, Ib } },
2086
    { "shlA",   { Eb, Ib } },
2087
    { "shrA",   { Eb, Ib } },
2088
    { "(bad)",  { XX } },
2089
    { "sarA",   { Eb, Ib } },
2090
  },
2091
  /* REG_C1 */
2092
  {
2093
    { "rolQ",   { Ev, Ib } },
2094
    { "rorQ",   { Ev, Ib } },
2095
    { "rclQ",   { Ev, Ib } },
2096
    { "rcrQ",   { Ev, Ib } },
2097
    { "shlQ",   { Ev, Ib } },
2098
    { "shrQ",   { Ev, Ib } },
2099
    { "(bad)",  { XX } },
2100
    { "sarQ",   { Ev, Ib } },
2101
  },
2102
  /* REG_C6 */
2103
  {
2104
    { "movA",   { Eb, Ib } },
2105
    { "(bad)",  { XX } },
2106
    { "(bad)",  { XX } },
2107
    { "(bad)",  { XX } },
2108
    { "(bad)",  { XX } },
2109
    { "(bad)",  { XX } },
2110
    { "(bad)",  { XX } },
2111
    { "(bad)",  { XX } },
2112
  },
2113
  /* REG_C7 */
2114
  {
2115
    { "movQ",   { Ev, Iv } },
2116
    { "(bad)",  { XX } },
2117
    { "(bad)",  { XX } },
2118
    { "(bad)",  { XX } },
2119
    { "(bad)",  { XX } },
2120
    { "(bad)",  { XX } },
2121
    { "(bad)",  { XX } },
2122
    { "(bad)",  { XX } },
2123
  },
2124
  /* REG_D0 */
2125
  {
2126
    { "rolA",   { Eb, I1 } },
2127
    { "rorA",   { Eb, I1 } },
2128
    { "rclA",   { Eb, I1 } },
2129
    { "rcrA",   { Eb, I1 } },
2130
    { "shlA",   { Eb, I1 } },
2131
    { "shrA",   { Eb, I1 } },
2132
    { "(bad)",  { XX } },
2133
    { "sarA",   { Eb, I1 } },
2134
  },
2135
  /* REG_D1 */
2136
  {
2137
    { "rolQ",   { Ev, I1 } },
2138
    { "rorQ",   { Ev, I1 } },
2139
    { "rclQ",   { Ev, I1 } },
2140
    { "rcrQ",   { Ev, I1 } },
2141
    { "shlQ",   { Ev, I1 } },
2142
    { "shrQ",   { Ev, I1 } },
2143
    { "(bad)",  { XX } },
2144
    { "sarQ",   { Ev, I1 } },
2145
  },
2146
  /* REG_D2 */
2147
  {
2148
    { "rolA",   { Eb, CL } },
2149
    { "rorA",   { Eb, CL } },
2150
    { "rclA",   { Eb, CL } },
2151
    { "rcrA",   { Eb, CL } },
2152
    { "shlA",   { Eb, CL } },
2153
    { "shrA",   { Eb, CL } },
2154
    { "(bad)",  { XX } },
2155
    { "sarA",   { Eb, CL } },
2156
  },
2157
  /* REG_D3 */
2158
  {
2159
    { "rolQ",   { Ev, CL } },
2160
    { "rorQ",   { Ev, CL } },
2161
    { "rclQ",   { Ev, CL } },
2162
    { "rcrQ",   { Ev, CL } },
2163
    { "shlQ",   { Ev, CL } },
2164
    { "shrQ",   { Ev, CL } },
2165
    { "(bad)",  { XX } },
2166
    { "sarQ",   { Ev, CL } },
2167
  },
2168
  /* REG_F6 */
2169
  {
2170
    { "testA",  { Eb, Ib } },
2171
    { "(bad)",  { XX } },
2172
    { "notA",   { Eb } },
2173
    { "negA",   { Eb } },
2174
    { "mulA",   { Eb } },       /* Don't print the implicit %al register,  */
2175
    { "imulA",  { Eb } },       /* to distinguish these opcodes from other */
2176
    { "divA",   { Eb } },       /* mul/imul opcodes.  Do the same for div  */
2177
    { "idivA",  { Eb } },       /* and idiv for consistency.               */
2178
  },
2179
  /* REG_F7 */
2180
  {
2181
    { "testQ",  { Ev, Iv } },
2182
    { "(bad)",  { XX } },
2183
    { "notQ",   { Ev } },
2184
    { "negQ",   { Ev } },
2185
    { "mulQ",   { Ev } },       /* Don't print the implicit register.  */
2186
    { "imulQ",  { Ev } },
2187
    { "divQ",   { Ev } },
2188
    { "idivQ",  { Ev } },
2189
  },
2190
  /* REG_FE */
2191
  {
2192
    { "incA",   { Eb } },
2193
    { "decA",   { Eb } },
2194
    { "(bad)",  { XX } },
2195
    { "(bad)",  { XX } },
2196
    { "(bad)",  { XX } },
2197
    { "(bad)",  { XX } },
2198
    { "(bad)",  { XX } },
2199
    { "(bad)",  { XX } },
2200
  },
2201
  /* REG_FF */
2202
  {
2203
    { "incQ",   { Ev } },
2204
    { "decQ",   { Ev } },
2205
    { "callT",  { indirEv } },
2206
    { "JcallT", { indirEp } },
2207
    { "jmpT",   { indirEv } },
2208
    { "JjmpT",  { indirEp } },
2209
    { "pushU",  { stackEv } },
2210
    { "(bad)",  { XX } },
2211
  },
2212
  /* REG_0F00 */
2213
  {
2214
    { "sldtD",  { Sv } },
2215
    { "strD",   { Sv } },
2216
    { "lldt",   { Ew } },
2217
    { "ltr",    { Ew } },
2218
    { "verr",   { Ew } },
2219
    { "verw",   { Ew } },
2220
    { "(bad)",  { XX } },
2221
    { "(bad)",  { XX } },
2222
  },
2223
  /* REG_0F01 */
2224
  {
2225
    { MOD_TABLE (MOD_0F01_REG_0) },
2226
    { MOD_TABLE (MOD_0F01_REG_1) },
2227
    { MOD_TABLE (MOD_0F01_REG_2) },
2228
    { MOD_TABLE (MOD_0F01_REG_3) },
2229
    { "smswD",  { Sv } },
2230
    { "(bad)",  { XX } },
2231
    { "lmsw",   { Ew } },
2232
    { MOD_TABLE (MOD_0F01_REG_7) },
2233
  },
2234
  /* REG_0F0D */
2235
  {
2236
    { "prefetch",       { Eb } },
2237
    { "prefetchw",      { Eb } },
2238
    { "(bad)",          { XX } },
2239
    { "(bad)",          { XX } },
2240
    { "(bad)",          { XX } },
2241
    { "(bad)",          { XX } },
2242
    { "(bad)",          { XX } },
2243
    { "(bad)",          { XX } },
2244
  },
2245
  /* REG_0F18 */
2246
  {
2247
    { MOD_TABLE (MOD_0F18_REG_0) },
2248
    { MOD_TABLE (MOD_0F18_REG_1) },
2249
    { MOD_TABLE (MOD_0F18_REG_2) },
2250
    { MOD_TABLE (MOD_0F18_REG_3) },
2251
    { "(bad)",  { XX } },
2252
    { "(bad)",  { XX } },
2253
    { "(bad)",  { XX } },
2254
    { "(bad)",  { XX } },
2255
  },
2256
  /* REG_0F71 */
2257
  {
2258
    { "(bad)",  { XX } },
2259
    { "(bad)",  { XX } },
2260
    { MOD_TABLE (MOD_0F71_REG_2) },
2261
    { "(bad)",  { XX } },
2262
    { MOD_TABLE (MOD_0F71_REG_4) },
2263
    { "(bad)",  { XX } },
2264
    { MOD_TABLE (MOD_0F71_REG_6) },
2265
    { "(bad)",  { XX } },
2266
  },
2267
  /* REG_0F72 */
2268
  {
2269
    { "(bad)",  { XX } },
2270
    { "(bad)",  { XX } },
2271
    { MOD_TABLE (MOD_0F72_REG_2) },
2272
    { "(bad)",  { XX } },
2273
    { MOD_TABLE (MOD_0F72_REG_4) },
2274
    { "(bad)",  { XX } },
2275
    { MOD_TABLE (MOD_0F72_REG_6) },
2276
    { "(bad)",  { XX } },
2277
  },
2278
  /* REG_0F73 */
2279
  {
2280
    { "(bad)",  { XX } },
2281
    { "(bad)",  { XX } },
2282
    { MOD_TABLE (MOD_0F73_REG_2) },
2283
    { MOD_TABLE (MOD_0F73_REG_3) },
2284
    { "(bad)",  { XX } },
2285
    { "(bad)",  { XX } },
2286
    { MOD_TABLE (MOD_0F73_REG_6) },
2287
    { MOD_TABLE (MOD_0F73_REG_7) },
2288
  },
2289
  /* REG_0FA6 */
2290
  {
2291
    { "montmul",        { { OP_0f07, 0 } } },
2292
    { "xsha1",          { { OP_0f07, 0 } } },
2293
    { "xsha256",        { { OP_0f07, 0 } } },
2294
    { "(bad)",          { { OP_0f07, 0 } } },
2295
    { "(bad)",          { { OP_0f07, 0 } } },
2296
    { "(bad)",          { { OP_0f07, 0 } } },
2297
    { "(bad)",          { { OP_0f07, 0 } } },
2298
    { "(bad)",          { { OP_0f07, 0 } } },
2299
  },
2300
  /* REG_0FA7 */
2301
  {
2302
    { "xstore-rng",     { { OP_0f07, 0 } } },
2303
    { "xcrypt-ecb",     { { OP_0f07, 0 } } },
2304
    { "xcrypt-cbc",     { { OP_0f07, 0 } } },
2305
    { "xcrypt-ctr",     { { OP_0f07, 0 } } },
2306
    { "xcrypt-cfb",     { { OP_0f07, 0 } } },
2307
    { "xcrypt-ofb",     { { OP_0f07, 0 } } },
2308
    { "(bad)",          { { OP_0f07, 0 } } },
2309
    { "(bad)",          { { OP_0f07, 0 } } },
2310
  },
2311
  /* REG_0FAE */
2312
  {
2313
    { MOD_TABLE (MOD_0FAE_REG_0) },
2314
    { MOD_TABLE (MOD_0FAE_REG_1) },
2315
    { MOD_TABLE (MOD_0FAE_REG_2) },
2316
    { MOD_TABLE (MOD_0FAE_REG_3) },
2317
    { MOD_TABLE (MOD_0FAE_REG_4) },
2318
    { MOD_TABLE (MOD_0FAE_REG_5) },
2319
    { MOD_TABLE (MOD_0FAE_REG_6) },
2320
    { MOD_TABLE (MOD_0FAE_REG_7) },
2321
  },
2322
  /* REG_0FBA */
2323
  {
2324
    { "(bad)",  { XX } },
2325
    { "(bad)",  { XX } },
2326
    { "(bad)",  { XX } },
2327
    { "(bad)",  { XX } },
2328
    { "btQ",    { Ev, Ib } },
2329
    { "btsQ",   { Ev, Ib } },
2330
    { "btrQ",   { Ev, Ib } },
2331
    { "btcQ",   { Ev, Ib } },
2332
  },
2333
  /* REG_0FC7 */
2334
  {
2335
    { "(bad)",  { XX } },
2336
    { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } } },
2337
    { "(bad)",  { XX } },
2338
    { "(bad)",  { XX } },
2339
    { "(bad)",  { XX } },
2340
    { "(bad)",  { XX } },
2341
    { MOD_TABLE (MOD_0FC7_REG_6) },
2342
    { MOD_TABLE (MOD_0FC7_REG_7) },
2343
  },
2344
  /* REG_VEX_71 */
2345
  {
2346
    { "(bad)",  { XX } },
2347
    { "(bad)",  { XX } },
2348
    { MOD_TABLE (MOD_VEX_71_REG_2) },
2349
    { "(bad)",  { XX } },
2350
    { MOD_TABLE (MOD_VEX_71_REG_4) },
2351
    { "(bad)",  { XX } },
2352
    { MOD_TABLE (MOD_VEX_71_REG_6) },
2353
    { "(bad)",  { XX } },
2354
  },
2355
  /* REG_VEX_72 */
2356
  {
2357
    { "(bad)",  { XX } },
2358
    { "(bad)",  { XX } },
2359
    { MOD_TABLE (MOD_VEX_72_REG_2) },
2360
    { "(bad)",  { XX } },
2361
    { MOD_TABLE (MOD_VEX_72_REG_4) },
2362
    { "(bad)",  { XX } },
2363
    { MOD_TABLE (MOD_VEX_72_REG_6) },
2364
    { "(bad)",  { XX } },
2365
  },
2366
  /* REG_VEX_73 */
2367
  {
2368
    { "(bad)",  { XX } },
2369
    { "(bad)",  { XX } },
2370
    { MOD_TABLE (MOD_VEX_73_REG_2) },
2371
    { MOD_TABLE (MOD_VEX_73_REG_3) },
2372
    { "(bad)",  { XX } },
2373
    { "(bad)",  { XX } },
2374
    { MOD_TABLE (MOD_VEX_73_REG_6) },
2375
    { MOD_TABLE (MOD_VEX_73_REG_7) },
2376
  },
2377
  /* REG_VEX_AE */
2378
  {
2379
    { "(bad)",  { XX } },
2380
    { "(bad)",  { XX } },
2381
    { MOD_TABLE (MOD_VEX_AE_REG_2) },
2382
    { MOD_TABLE (MOD_VEX_AE_REG_3) },
2383
    { "(bad)",  { XX } },
2384
    { "(bad)",  { XX } },
2385
    { "(bad)",  { XX } },
2386
    { "(bad)",  { XX } },
2387
  },
2388
};
2389
 
2390
static const struct dis386 prefix_table[][4] = {
2391
  /* PREFIX_90 */
2392
  {
2393
    { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
2394
    { "pause", { XX } },
2395
    { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
2396
    { "(bad)", { XX } },
2397
  },
2398
 
2399
  /* PREFIX_0F10 */
2400
  {
2401
    { "movups", { XM, EXx } },
2402
    { "movss",  { XM, EXd } },
2403
    { "movupd", { XM, EXx } },
2404
    { "movsd",  { XM, EXq } },
2405
  },
2406
 
2407
  /* PREFIX_0F11 */
2408
  {
2409
    { "movups", { EXx, XM } },
2410
    { "movss",  { EXd, XM } },
2411
    { "movupd", { EXx, XM } },
2412
    { "movsd",  { EXq, XM } },
2413
  },
2414
 
2415
  /* PREFIX_0F12 */
2416
  {
2417
    { MOD_TABLE (MOD_0F12_PREFIX_0) },
2418
    { "movsldup", { XM, EXx } },
2419
    { "movlpd", { XM, EXq } },
2420
    { "movddup", { XM, EXq } },
2421
  },
2422
 
2423
  /* PREFIX_0F16 */
2424
  {
2425
    { MOD_TABLE (MOD_0F16_PREFIX_0) },
2426
    { "movshdup", { XM, EXx } },
2427
    { "movhpd", { XM, EXq } },
2428
    { "(bad)",  { XX } },
2429
  },
2430
 
2431
  /* PREFIX_0F2A */
2432
  {
2433
    { "cvtpi2ps", { XM, EMCq } },
2434
    { "cvtsi2ss%LQ", { XM, Ev } },
2435
    { "cvtpi2pd", { XM, EMCq } },
2436
    { "cvtsi2sd%LQ", { XM, Ev } },
2437
  },
2438
 
2439
  /* PREFIX_0F2B */
2440
  {
2441
    { MOD_TABLE (MOD_0F2B_PREFIX_0) },
2442
    { MOD_TABLE (MOD_0F2B_PREFIX_1) },
2443
    { MOD_TABLE (MOD_0F2B_PREFIX_2) },
2444
    { MOD_TABLE (MOD_0F2B_PREFIX_3) },
2445
  },
2446
 
2447
  /* PREFIX_0F2C */
2448
  {
2449
    { "cvttps2pi", { MXC, EXq } },
2450
    { "cvttss2siY", { Gv, EXd } },
2451
    { "cvttpd2pi", { MXC, EXx } },
2452
    { "cvttsd2siY", { Gv, EXq } },
2453
  },
2454
 
2455
  /* PREFIX_0F2D */
2456
  {
2457
    { "cvtps2pi", { MXC, EXq } },
2458
    { "cvtss2siY", { Gv, EXd } },
2459
    { "cvtpd2pi", { MXC, EXx } },
2460
    { "cvtsd2siY", { Gv, EXq } },
2461
  },
2462
 
2463
  /* PREFIX_0F2E */
2464
  {
2465
    { "ucomiss",{ XM, EXd } },
2466
    { "(bad)",  { XX } },
2467
    { "ucomisd",{ XM, EXq } },
2468
    { "(bad)",  { XX } },
2469
  },
2470
 
2471
  /* PREFIX_0F2F */
2472
  {
2473
    { "comiss", { XM, EXd } },
2474
    { "(bad)",  { XX } },
2475
    { "comisd", { XM, EXq } },
2476
    { "(bad)",  { XX } },
2477
  },
2478
 
2479
  /* PREFIX_0F51 */
2480
  {
2481
    { "sqrtps", { XM, EXx } },
2482
    { "sqrtss", { XM, EXd } },
2483
    { "sqrtpd", { XM, EXx } },
2484
    { "sqrtsd", { XM, EXq } },
2485
  },
2486
 
2487
  /* PREFIX_0F52 */
2488
  {
2489
    { "rsqrtps",{ XM, EXx } },
2490
    { "rsqrtss",{ XM, EXd } },
2491
    { "(bad)",  { XX } },
2492
    { "(bad)",  { XX } },
2493
  },
2494
 
2495
  /* PREFIX_0F53 */
2496
  {
2497
    { "rcpps",  { XM, EXx } },
2498
    { "rcpss",  { XM, EXd } },
2499
    { "(bad)",  { XX } },
2500
    { "(bad)",  { XX } },
2501
  },
2502
 
2503
  /* PREFIX_0F58 */
2504
  {
2505
    { "addps", { XM, EXx } },
2506
    { "addss", { XM, EXd } },
2507
    { "addpd", { XM, EXx } },
2508
    { "addsd", { XM, EXq } },
2509
  },
2510
 
2511
  /* PREFIX_0F59 */
2512
  {
2513
    { "mulps",  { XM, EXx } },
2514
    { "mulss",  { XM, EXd } },
2515
    { "mulpd",  { XM, EXx } },
2516
    { "mulsd",  { XM, EXq } },
2517
  },
2518
 
2519
  /* PREFIX_0F5A */
2520
  {
2521
    { "cvtps2pd", { XM, EXq } },
2522
    { "cvtss2sd", { XM, EXd } },
2523
    { "cvtpd2ps", { XM, EXx } },
2524
    { "cvtsd2ss", { XM, EXq } },
2525
  },
2526
 
2527
  /* PREFIX_0F5B */
2528
  {
2529
    { "cvtdq2ps", { XM, EXx } },
2530
    { "cvttps2dq", { XM, EXx } },
2531
    { "cvtps2dq", { XM, EXx } },
2532
    { "(bad)",  { XX } },
2533
  },
2534
 
2535
  /* PREFIX_0F5C */
2536
  {
2537
    { "subps",  { XM, EXx } },
2538
    { "subss",  { XM, EXd } },
2539
    { "subpd",  { XM, EXx } },
2540
    { "subsd",  { XM, EXq } },
2541
  },
2542
 
2543
  /* PREFIX_0F5D */
2544
  {
2545
    { "minps",  { XM, EXx } },
2546
    { "minss",  { XM, EXd } },
2547
    { "minpd",  { XM, EXx } },
2548
    { "minsd",  { XM, EXq } },
2549
  },
2550
 
2551
  /* PREFIX_0F5E */
2552
  {
2553
    { "divps",  { XM, EXx } },
2554
    { "divss",  { XM, EXd } },
2555
    { "divpd",  { XM, EXx } },
2556
    { "divsd",  { XM, EXq } },
2557
  },
2558
 
2559
  /* PREFIX_0F5F */
2560
  {
2561
    { "maxps",  { XM, EXx } },
2562
    { "maxss",  { XM, EXd } },
2563
    { "maxpd",  { XM, EXx } },
2564
    { "maxsd",  { XM, EXq } },
2565
  },
2566
 
2567
  /* PREFIX_0F60 */
2568
  {
2569
    { "punpcklbw",{ MX, EMd } },
2570
    { "(bad)",  { XX } },
2571
    { "punpcklbw",{ MX, EMx } },
2572
    { "(bad)",  { XX } },
2573
  },
2574
 
2575
  /* PREFIX_0F61 */
2576
  {
2577
    { "punpcklwd",{ MX, EMd } },
2578
    { "(bad)",  { XX } },
2579
    { "punpcklwd",{ MX, EMx } },
2580
    { "(bad)",  { XX } },
2581
  },
2582
 
2583
  /* PREFIX_0F62 */
2584
  {
2585
    { "punpckldq",{ MX, EMd } },
2586
    { "(bad)",  { XX } },
2587
    { "punpckldq",{ MX, EMx } },
2588
    { "(bad)",  { XX } },
2589
  },
2590
 
2591
  /* PREFIX_0F6C */
2592
  {
2593
    { "(bad)",  { XX } },
2594
    { "(bad)",  { XX } },
2595
    { "punpcklqdq", { XM, EXx } },
2596
    { "(bad)",  { XX } },
2597
  },
2598
 
2599
  /* PREFIX_0F6D */
2600
  {
2601
    { "(bad)",  { XX } },
2602
    { "(bad)",  { XX } },
2603
    { "punpckhqdq", { XM, EXx } },
2604
    { "(bad)",  { XX } },
2605
  },
2606
 
2607
  /* PREFIX_0F6F */
2608
  {
2609
    { "movq",   { MX, EM } },
2610
    { "movdqu", { XM, EXx } },
2611
    { "movdqa", { XM, EXx } },
2612
    { "(bad)",  { XX } },
2613
  },
2614
 
2615
  /* PREFIX_0F70 */
2616
  {
2617
    { "pshufw", { MX, EM, Ib } },
2618
    { "pshufhw",{ XM, EXx, Ib } },
2619
    { "pshufd", { XM, EXx, Ib } },
2620
    { "pshuflw",{ XM, EXx, Ib } },
2621
  },
2622
 
2623
  /* PREFIX_0F73_REG_3 */
2624
  {
2625
    { "(bad)",  { XX } },
2626
    { "(bad)",  { XX } },
2627
    { "psrldq", { XS, Ib } },
2628
    { "(bad)",  { XX } },
2629
  },
2630
 
2631
  /* PREFIX_0F73_REG_7 */
2632
  {
2633
    { "(bad)",  { XX } },
2634
    { "(bad)",  { XX } },
2635
    { "pslldq", { XS, Ib } },
2636
    { "(bad)",  { XX } },
2637
  },
2638
 
2639
  /* PREFIX_0F78 */
2640
  {
2641
    {"vmread",  { Em, Gm } },
2642
    {"(bad)",   { XX } },
2643
    {"extrq",   { XS, Ib, Ib } },
2644
    {"insertq", { XM, XS, Ib, Ib } },
2645
  },
2646
 
2647
  /* PREFIX_0F79 */
2648
  {
2649
    {"vmwrite", { Gm, Em } },
2650
    {"(bad)",   { XX } },
2651
    {"extrq",   { XM, XS } },
2652
    {"insertq", { XM, XS } },
2653
  },
2654
 
2655
  /* PREFIX_0F7C */
2656
  {
2657
    { "(bad)",  { XX } },
2658
    { "(bad)",  { XX } },
2659
    { "haddpd", { XM, EXx } },
2660
    { "haddps", { XM, EXx } },
2661
  },
2662
 
2663
  /* PREFIX_0F7D */
2664
  {
2665
    { "(bad)",  { XX } },
2666
    { "(bad)",  { XX } },
2667
    { "hsubpd", { XM, EXx } },
2668
    { "hsubps", { XM, EXx } },
2669
  },
2670
 
2671
  /* PREFIX_0F7E */
2672
  {
2673
    { "movK",   { Edq, MX } },
2674
    { "movq",   { XM, EXq } },
2675
    { "movK",   { Edq, XM } },
2676
    { "(bad)",  { XX } },
2677
  },
2678
 
2679
  /* PREFIX_0F7F */
2680
  {
2681
    { "movq",   { EM, MX } },
2682
    { "movdqu", { EXx, XM } },
2683
    { "movdqa", { EXx, XM } },
2684
    { "(bad)",  { XX } },
2685
  },
2686
 
2687
  /* PREFIX_0FB8 */
2688
  {
2689
    { "(bad)", { XX } },
2690
    { "popcntS", { Gv, Ev } },
2691
    { "(bad)", { XX } },
2692
    { "(bad)", { XX } },
2693
  },
2694
 
2695
  /* PREFIX_0FBD */
2696
  {
2697
    { "bsrS",   { Gv, Ev } },
2698
    { "lzcntS", { Gv, Ev } },
2699
    { "bsrS",   { Gv, Ev } },
2700
    { "(bad)",  { XX } },
2701
  },
2702
 
2703
  /* PREFIX_0FC2 */
2704
  {
2705
    { "cmpps",  { XM, EXx, CMP } },
2706
    { "cmpss",  { XM, EXd, CMP } },
2707
    { "cmppd",  { XM, EXx, CMP } },
2708
    { "cmpsd",  { XM, EXq, CMP } },
2709
  },
2710
 
2711
  /* PREFIX_0FC3 */
2712
  {
2713
    { "movntiS", { Ma, Gv } },
2714
    { "(bad)",  { XX } },
2715
    { "(bad)",  { XX } },
2716
    { "(bad)",  { XX } },
2717
  },
2718
 
2719
  /* PREFIX_0FC7_REG_6 */
2720
  {
2721
    { "vmptrld",{ Mq } },
2722
    { "vmxon",  { Mq } },
2723
    { "vmclear",{ Mq } },
2724
    { "(bad)",  { XX } },
2725
  },
2726
 
2727
  /* PREFIX_0FD0 */
2728
  {
2729
    { "(bad)",  { XX } },
2730
    { "(bad)",  { XX } },
2731
    { "addsubpd", { XM, EXx } },
2732
    { "addsubps", { XM, EXx } },
2733
  },
2734
 
2735
  /* PREFIX_0FD6 */
2736
  {
2737
    { "(bad)",  { XX } },
2738
    { "movq2dq",{ XM, MS } },
2739
    { "movq",   { EXq, XM } },
2740
    { "movdq2q",{ MX, XS } },
2741
  },
2742
 
2743
  /* PREFIX_0FE6 */
2744
  {
2745
    { "(bad)",  { XX } },
2746
    { "cvtdq2pd", { XM, EXq } },
2747
    { "cvttpd2dq", { XM, EXx } },
2748
    { "cvtpd2dq", { XM, EXx } },
2749
  },
2750
 
2751
  /* PREFIX_0FE7 */
2752
  {
2753
    { "movntq", { Mq, MX } },
2754
    { "(bad)",  { XX } },
2755
    { MOD_TABLE (MOD_0FE7_PREFIX_2) },
2756
    { "(bad)",  { XX } },
2757
  },
2758
 
2759
  /* PREFIX_0FF0 */
2760
  {
2761
    { "(bad)",  { XX } },
2762
    { "(bad)",  { XX } },
2763
    { "(bad)",  { XX } },
2764
    { MOD_TABLE (MOD_0FF0_PREFIX_3) },
2765
  },
2766
 
2767
  /* PREFIX_0FF7 */
2768
  {
2769
    { "maskmovq", { MX, MS } },
2770
    { "(bad)",  { XX } },
2771
    { "maskmovdqu", { XM, XS } },
2772
    { "(bad)",  { XX } },
2773
  },
2774
 
2775
  /* PREFIX_0F3810 */
2776
  {
2777
    { "(bad)",  { XX } },
2778
    { "(bad)",  { XX } },
2779
    { "pblendvb", { XM, EXx, XMM0 } },
2780
    { "(bad)",  { XX } },
2781
  },
2782
 
2783
  /* PREFIX_0F3814 */
2784
  {
2785
    { "(bad)",  { XX } },
2786
    { "(bad)",  { XX } },
2787
    { "blendvps", { XM, EXx, XMM0 } },
2788
    { "(bad)",  { XX } },
2789
  },
2790
 
2791
  /* PREFIX_0F3815 */
2792
  {
2793
    { "(bad)",  { XX } },
2794
    { "(bad)",  { XX } },
2795
    { "blendvpd", { XM, EXx, XMM0 } },
2796
    { "(bad)",  { XX } },
2797
  },
2798
 
2799
  /* PREFIX_0F3817 */
2800
  {
2801
    { "(bad)",  { XX } },
2802
    { "(bad)",  { XX } },
2803
    { "ptest",  { XM, EXx } },
2804
    { "(bad)",  { XX } },
2805
  },
2806
 
2807
  /* PREFIX_0F3820 */
2808
  {
2809
    { "(bad)",  { XX } },
2810
    { "(bad)",  { XX } },
2811
    { "pmovsxbw", { XM, EXq } },
2812
    { "(bad)",  { XX } },
2813
  },
2814
 
2815
  /* PREFIX_0F3821 */
2816
  {
2817
    { "(bad)",  { XX } },
2818
    { "(bad)",  { XX } },
2819
    { "pmovsxbd", { XM, EXd } },
2820
    { "(bad)",  { XX } },
2821
  },
2822
 
2823
  /* PREFIX_0F3822 */
2824
  {
2825
    { "(bad)",  { XX } },
2826
    { "(bad)",  { XX } },
2827
    { "pmovsxbq", { XM, EXw } },
2828
    { "(bad)",  { XX } },
2829
  },
2830
 
2831
  /* PREFIX_0F3823 */
2832
  {
2833
    { "(bad)",  { XX } },
2834
    { "(bad)",  { XX } },
2835
    { "pmovsxwd", { XM, EXq } },
2836
    { "(bad)",  { XX } },
2837
  },
2838
 
2839
  /* PREFIX_0F3824 */
2840
  {
2841
    { "(bad)",  { XX } },
2842
    { "(bad)",  { XX } },
2843
    { "pmovsxwq", { XM, EXd } },
2844
    { "(bad)",  { XX } },
2845
  },
2846
 
2847
  /* PREFIX_0F3825 */
2848
  {
2849
    { "(bad)",  { XX } },
2850
    { "(bad)",  { XX } },
2851
    { "pmovsxdq", { XM, EXq } },
2852
    { "(bad)",  { XX } },
2853
  },
2854
 
2855
  /* PREFIX_0F3828 */
2856
  {
2857
    { "(bad)",  { XX } },
2858
    { "(bad)",  { XX } },
2859
    { "pmuldq", { XM, EXx } },
2860
    { "(bad)",  { XX } },
2861
  },
2862
 
2863
  /* PREFIX_0F3829 */
2864
  {
2865
    { "(bad)",  { XX } },
2866
    { "(bad)",  { XX } },
2867
    { "pcmpeqq", { XM, EXx } },
2868
    { "(bad)",  { XX } },
2869
  },
2870
 
2871
  /* PREFIX_0F382A */
2872
  {
2873
    { "(bad)",  { XX } },
2874
    { "(bad)",  { XX } },
2875
    { MOD_TABLE (MOD_0F382A_PREFIX_2) },
2876
    { "(bad)",  { XX } },
2877
  },
2878
 
2879
  /* PREFIX_0F382B */
2880
  {
2881
    { "(bad)",  { XX } },
2882
    { "(bad)",  { XX } },
2883
    { "packusdw", { XM, EXx } },
2884
    { "(bad)",  { XX } },
2885
  },
2886
 
2887
  /* PREFIX_0F3830 */
2888
  {
2889
    { "(bad)",  { XX } },
2890
    { "(bad)",  { XX } },
2891
    { "pmovzxbw", { XM, EXq } },
2892
    { "(bad)",  { XX } },
2893
  },
2894
 
2895
  /* PREFIX_0F3831 */
2896
  {
2897
    { "(bad)",  { XX } },
2898
    { "(bad)",  { XX } },
2899
    { "pmovzxbd", { XM, EXd } },
2900
    { "(bad)",  { XX } },
2901
  },
2902
 
2903
  /* PREFIX_0F3832 */
2904
  {
2905
    { "(bad)",  { XX } },
2906
    { "(bad)",  { XX } },
2907
    { "pmovzxbq", { XM, EXw } },
2908
    { "(bad)",  { XX } },
2909
  },
2910
 
2911
  /* PREFIX_0F3833 */
2912
  {
2913
    { "(bad)",  { XX } },
2914
    { "(bad)",  { XX } },
2915
    { "pmovzxwd", { XM, EXq } },
2916
    { "(bad)",  { XX } },
2917
  },
2918
 
2919
  /* PREFIX_0F3834 */
2920
  {
2921
    { "(bad)",  { XX } },
2922
    { "(bad)",  { XX } },
2923
    { "pmovzxwq", { XM, EXd } },
2924
    { "(bad)",  { XX } },
2925
  },
2926
 
2927
  /* PREFIX_0F3835 */
2928
  {
2929
    { "(bad)",  { XX } },
2930
    { "(bad)",  { XX } },
2931
    { "pmovzxdq", { XM, EXq } },
2932
    { "(bad)",  { XX } },
2933
  },
2934
 
2935
  /* PREFIX_0F3837 */
2936
  {
2937
    { "(bad)",  { XX } },
2938
    { "(bad)",  { XX } },
2939
    { "pcmpgtq", { XM, EXx } },
2940
    { "(bad)",  { XX } },
2941
  },
2942
 
2943
  /* PREFIX_0F3838 */
2944
  {
2945
    { "(bad)",  { XX } },
2946
    { "(bad)",  { XX } },
2947
    { "pminsb", { XM, EXx } },
2948
    { "(bad)",  { XX } },
2949
  },
2950
 
2951
  /* PREFIX_0F3839 */
2952
  {
2953
    { "(bad)",  { XX } },
2954
    { "(bad)",  { XX } },
2955
    { "pminsd", { XM, EXx } },
2956
    { "(bad)",  { XX } },
2957
  },
2958
 
2959
  /* PREFIX_0F383A */
2960
  {
2961
    { "(bad)",  { XX } },
2962
    { "(bad)",  { XX } },
2963
    { "pminuw", { XM, EXx } },
2964
    { "(bad)",  { XX } },
2965
  },
2966
 
2967
  /* PREFIX_0F383B */
2968
  {
2969
    { "(bad)",  { XX } },
2970
    { "(bad)",  { XX } },
2971
    { "pminud", { XM, EXx } },
2972
    { "(bad)",  { XX } },
2973
  },
2974
 
2975
  /* PREFIX_0F383C */
2976
  {
2977
    { "(bad)",  { XX } },
2978
    { "(bad)",  { XX } },
2979
    { "pmaxsb", { XM, EXx } },
2980
    { "(bad)",  { XX } },
2981
  },
2982
 
2983
  /* PREFIX_0F383D */
2984
  {
2985
    { "(bad)",  { XX } },
2986
    { "(bad)",  { XX } },
2987
    { "pmaxsd", { XM, EXx } },
2988
    { "(bad)",  { XX } },
2989
  },
2990
 
2991
  /* PREFIX_0F383E */
2992
  {
2993
    { "(bad)",  { XX } },
2994
    { "(bad)",  { XX } },
2995
    { "pmaxuw", { XM, EXx } },
2996
    { "(bad)",  { XX } },
2997
  },
2998
 
2999
  /* PREFIX_0F383F */
3000
  {
3001
    { "(bad)",  { XX } },
3002
    { "(bad)",  { XX } },
3003
    { "pmaxud", { XM, EXx } },
3004
    { "(bad)",  { XX } },
3005
  },
3006
 
3007
  /* PREFIX_0F3840 */
3008
  {
3009
    { "(bad)",  { XX } },
3010
    { "(bad)",  { XX } },
3011
    { "pmulld", { XM, EXx } },
3012
    { "(bad)",  { XX } },
3013
  },
3014
 
3015
  /* PREFIX_0F3841 */
3016
  {
3017
    { "(bad)",  { XX } },
3018
    { "(bad)",  { XX } },
3019
    { "phminposuw", { XM, EXx } },
3020
    { "(bad)",  { XX } },
3021
  },
3022
 
3023
  /* PREFIX_0F3880 */
3024
  {
3025
    { "(bad)",  { XX } },
3026
    { "(bad)",  { XX } },
3027
    { "invept", { Gm, Mo } },
3028
    { "(bad)",  { XX } },
3029
  },
3030
 
3031
  /* PREFIX_0F3881 */
3032
  {
3033
    { "(bad)",  { XX } },
3034
    { "(bad)",  { XX } },
3035
    { "invvpid", { Gm, Mo } },
3036
    { "(bad)",  { XX } },
3037
  },
3038
 
3039
  /* PREFIX_0F38DB */
3040
  {
3041
    { "(bad)",  { XX } },
3042
    { "(bad)",  { XX } },
3043
    { "aesimc", { XM, EXx } },
3044
    { "(bad)",  { XX } },
3045
  },
3046
 
3047
  /* PREFIX_0F38DC */
3048
  {
3049
    { "(bad)",  { XX } },
3050
    { "(bad)",  { XX } },
3051
    { "aesenc", { XM, EXx } },
3052
    { "(bad)",  { XX } },
3053
  },
3054
 
3055
  /* PREFIX_0F38DD */
3056
  {
3057
    { "(bad)",  { XX } },
3058
    { "(bad)",  { XX } },
3059
    { "aesenclast", { XM, EXx } },
3060
    { "(bad)",  { XX } },
3061
  },
3062
 
3063
  /* PREFIX_0F38DE */
3064
  {
3065
    { "(bad)",  { XX } },
3066
    { "(bad)",  { XX } },
3067
    { "aesdec", { XM, EXx } },
3068
    { "(bad)",  { XX } },
3069
  },
3070
 
3071
  /* PREFIX_0F38DF */
3072
  {
3073
    { "(bad)",  { XX } },
3074
    { "(bad)",  { XX } },
3075
    { "aesdeclast", { XM, EXx } },
3076
    { "(bad)",  { XX } },
3077
  },
3078
 
3079
  /* PREFIX_0F38F0 */
3080
  {
3081
    { "movbeS", { Gv, { MOVBE_Fixup, v_mode } } },
3082
    { "(bad)",  { XX } },
3083
    { "movbeS", { Gv, { MOVBE_Fixup, v_mode } } },
3084
    { "crc32",  { Gdq, { CRC32_Fixup, b_mode } } },
3085
  },
3086
 
3087
  /* PREFIX_0F38F1 */
3088
  {
3089
    { "movbeS", { { MOVBE_Fixup, v_mode }, Gv } },
3090
    { "(bad)",  { XX } },
3091
    { "movbeS", { { MOVBE_Fixup, v_mode }, Gv } },
3092
    { "crc32",  { Gdq, { CRC32_Fixup, v_mode } } },
3093
  },
3094
 
3095
  /* PREFIX_0F3A08 */
3096
  {
3097
    { "(bad)",  { XX } },
3098
    { "(bad)",  { XX } },
3099
    { "roundps", { XM, EXx, Ib } },
3100
    { "(bad)",  { XX } },
3101
  },
3102
 
3103
  /* PREFIX_0F3A09 */
3104
  {
3105
    { "(bad)",  { XX } },
3106
    { "(bad)",  { XX } },
3107
    { "roundpd", { XM, EXx, Ib } },
3108
    { "(bad)",  { XX } },
3109
  },
3110
 
3111
  /* PREFIX_0F3A0A */
3112
  {
3113
    { "(bad)",  { XX } },
3114
    { "(bad)",  { XX } },
3115
    { "roundss", { XM, EXd, Ib } },
3116
    { "(bad)",  { XX } },
3117
  },
3118
 
3119
  /* PREFIX_0F3A0B */
3120
  {
3121
    { "(bad)",  { XX } },
3122
    { "(bad)",  { XX } },
3123
    { "roundsd", { XM, EXq, Ib } },
3124
    { "(bad)",  { XX } },
3125
  },
3126
 
3127
  /* PREFIX_0F3A0C */
3128
  {
3129
    { "(bad)",  { XX } },
3130
    { "(bad)",  { XX } },
3131
    { "blendps", { XM, EXx, Ib } },
3132
    { "(bad)",  { XX } },
3133
  },
3134
 
3135
  /* PREFIX_0F3A0D */
3136
  {
3137
    { "(bad)",  { XX } },
3138
    { "(bad)",  { XX } },
3139
    { "blendpd", { XM, EXx, Ib } },
3140
    { "(bad)",  { XX } },
3141
  },
3142
 
3143
  /* PREFIX_0F3A0E */
3144
  {
3145
    { "(bad)",  { XX } },
3146
    { "(bad)",  { XX } },
3147
    { "pblendw", { XM, EXx, Ib } },
3148
    { "(bad)",  { XX } },
3149
  },
3150
 
3151
  /* PREFIX_0F3A14 */
3152
  {
3153
    { "(bad)",  { XX } },
3154
    { "(bad)",  { XX } },
3155
    { "pextrb", { Edqb, XM, Ib } },
3156
    { "(bad)",  { XX } },
3157
  },
3158
 
3159
  /* PREFIX_0F3A15 */
3160
  {
3161
    { "(bad)",  { XX } },
3162
    { "(bad)",  { XX } },
3163
    { "pextrw", { Edqw, XM, Ib } },
3164
    { "(bad)",  { XX } },
3165
  },
3166
 
3167
  /* PREFIX_0F3A16 */
3168
  {
3169
    { "(bad)",  { XX } },
3170
    { "(bad)",  { XX } },
3171
    { "pextrK", { Edq, XM, Ib } },
3172
    { "(bad)",  { XX } },
3173
  },
3174
 
3175
  /* PREFIX_0F3A17 */
3176
  {
3177
    { "(bad)",  { XX } },
3178
    { "(bad)",  { XX } },
3179
    { "extractps", { Edqd, XM, Ib } },
3180
    { "(bad)",  { XX } },
3181
  },
3182
 
3183
  /* PREFIX_0F3A20 */
3184
  {
3185
    { "(bad)",  { XX } },
3186
    { "(bad)",  { XX } },
3187
    { "pinsrb", { XM, Edqb, Ib } },
3188
    { "(bad)",  { XX } },
3189
  },
3190
 
3191
  /* PREFIX_0F3A21 */
3192
  {
3193
    { "(bad)",  { XX } },
3194
    { "(bad)",  { XX } },
3195
    { "insertps", { XM, EXd, Ib } },
3196
    { "(bad)",  { XX } },
3197
  },
3198
 
3199
  /* PREFIX_0F3A22 */
3200
  {
3201
    { "(bad)",  { XX } },
3202
    { "(bad)",  { XX } },
3203
    { "pinsrK", { XM, Edq, Ib } },
3204
    { "(bad)",  { XX } },
3205
  },
3206
 
3207
  /* PREFIX_0F3A40 */
3208
  {
3209
    { "(bad)",  { XX } },
3210
    { "(bad)",  { XX } },
3211
    { "dpps",   { XM, EXx, Ib } },
3212
    { "(bad)",  { XX } },
3213
  },
3214
 
3215
  /* PREFIX_0F3A41 */
3216
  {
3217
    { "(bad)",  { XX } },
3218
    { "(bad)",  { XX } },
3219
    { "dppd",   { XM, EXx, Ib } },
3220
    { "(bad)",  { XX } },
3221
  },
3222
 
3223
  /* PREFIX_0F3A42 */
3224
  {
3225
    { "(bad)",  { XX } },
3226
    { "(bad)",  { XX } },
3227
    { "mpsadbw", { XM, EXx, Ib } },
3228
    { "(bad)",  { XX } },
3229
  },
3230
 
3231
  /* PREFIX_0F3A44 */
3232
  {
3233
    { "(bad)",  { XX } },
3234
    { "(bad)",  { XX } },
3235
    { "pclmulqdq", { XM, EXx, PCLMUL } },
3236
    { "(bad)",  { XX } },
3237
  },
3238
 
3239
  /* PREFIX_0F3A60 */
3240
  {
3241
    { "(bad)",  { XX } },
3242
    { "(bad)",  { XX } },
3243
    { "pcmpestrm", { XM, EXx, Ib } },
3244
    { "(bad)",  { XX } },
3245
  },
3246
 
3247
  /* PREFIX_0F3A61 */
3248
  {
3249
    { "(bad)",  { XX } },
3250
    { "(bad)",  { XX } },
3251
    { "pcmpestri", { XM, EXx, Ib } },
3252
    { "(bad)",  { XX } },
3253
  },
3254
 
3255
  /* PREFIX_0F3A62 */
3256
  {
3257
    { "(bad)",  { XX } },
3258
    { "(bad)",  { XX } },
3259
    { "pcmpistrm", { XM, EXx, Ib } },
3260
    { "(bad)",  { XX } },
3261
  },
3262
 
3263
  /* PREFIX_0F3A63 */
3264
  {
3265
    { "(bad)",  { XX } },
3266
    { "(bad)",  { XX } },
3267
    { "pcmpistri", { XM, EXx, Ib } },
3268
    { "(bad)",  { XX } },
3269
  },
3270
 
3271
  /* PREFIX_0F3ADF */
3272
  {
3273
    { "(bad)",  { XX } },
3274
    { "(bad)",  { XX } },
3275
    { "aeskeygenassist", { XM, EXx, Ib } },
3276
    { "(bad)",  { XX } },
3277
  },
3278
 
3279
  /* PREFIX_VEX_10 */
3280
  {
3281
    { "vmovups", { XM, EXx } },
3282
    { VEX_LEN_TABLE (VEX_LEN_10_P_1) },
3283
    { "vmovupd", { XM, EXx } },
3284
    { VEX_LEN_TABLE (VEX_LEN_10_P_3) },
3285
  },
3286
 
3287
  /* PREFIX_VEX_11 */
3288
  {
3289
    { "vmovups", { EXx, XM } },
3290
    { VEX_LEN_TABLE (VEX_LEN_11_P_1) },
3291
    { "vmovupd", { EXx, XM } },
3292
    { VEX_LEN_TABLE (VEX_LEN_11_P_3) },
3293
  },
3294
 
3295
  /* PREFIX_VEX_12 */
3296
  {
3297
    { MOD_TABLE (MOD_VEX_12_PREFIX_0) },
3298
    { "vmovsldup", { XM, EXx } },
3299
    { VEX_LEN_TABLE (VEX_LEN_12_P_2) },
3300
    { "vmovddup", { XM, EXymmq } },
3301
  },
3302
 
3303
  /* PREFIX_VEX_16 */
3304
  {
3305
    { MOD_TABLE (MOD_VEX_16_PREFIX_0) },
3306
    { "vmovshdup", { XM, EXx } },
3307
    { VEX_LEN_TABLE (VEX_LEN_16_P_2) },
3308
    { "(bad)",  { XX } },
3309
  },
3310
 
3311
  /* PREFIX_VEX_2A */
3312
  {
3313
    { "(bad)",  { XX } },
3314
    { VEX_LEN_TABLE (VEX_LEN_2A_P_1) },
3315
    { "(bad)",  { XX } },
3316
    { VEX_LEN_TABLE (VEX_LEN_2A_P_3) },
3317
  },
3318
 
3319
  /* PREFIX_VEX_2C */
3320
  {
3321
    { "(bad)",  { XX } },
3322
    { VEX_LEN_TABLE (VEX_LEN_2C_P_1) },
3323
    { "(bad)",  { XX } },
3324
    { VEX_LEN_TABLE (VEX_LEN_2C_P_3) },
3325
  },
3326
 
3327
  /* PREFIX_VEX_2D */
3328
  {
3329
    { "(bad)",  { XX } },
3330
    { VEX_LEN_TABLE (VEX_LEN_2D_P_1) },
3331
    { "(bad)",  { XX } },
3332
    { VEX_LEN_TABLE (VEX_LEN_2D_P_3) },
3333
  },
3334
 
3335
  /* PREFIX_VEX_2E */
3336
  {
3337
    { VEX_LEN_TABLE (VEX_LEN_2E_P_0) },
3338
    { "(bad)",  { XX } },
3339
    { VEX_LEN_TABLE (VEX_LEN_2E_P_2) },
3340
    { "(bad)",  { XX } },
3341
  },
3342
 
3343
  /* PREFIX_VEX_2F */
3344
  {
3345
    { VEX_LEN_TABLE (VEX_LEN_2F_P_0) },
3346
    { "(bad)",  { XX } },
3347
    { VEX_LEN_TABLE (VEX_LEN_2F_P_2) },
3348
    { "(bad)",  { XX } },
3349
  },
3350
 
3351
  /* PREFIX_VEX_51 */
3352
  {
3353
    { "vsqrtps", { XM, EXx } },
3354
    { VEX_LEN_TABLE (VEX_LEN_51_P_1) },
3355
    { "vsqrtpd", { XM, EXx } },
3356
    { VEX_LEN_TABLE (VEX_LEN_51_P_3) },
3357
  },
3358
 
3359
  /* PREFIX_VEX_52 */
3360
  {
3361
    { "vrsqrtps", { XM, EXx } },
3362
    { VEX_LEN_TABLE (VEX_LEN_52_P_1) },
3363
    { "(bad)",  { XX } },
3364
    { "(bad)",  { XX } },
3365
  },
3366
 
3367
  /* PREFIX_VEX_53 */
3368
  {
3369
    { "vrcpps", { XM, EXx } },
3370
    { VEX_LEN_TABLE (VEX_LEN_53_P_1) },
3371
    { "(bad)",  { XX } },
3372
    { "(bad)",  { XX } },
3373
  },
3374
 
3375
  /* PREFIX_VEX_58 */
3376
  {
3377
    { "vaddps", { XM, Vex, EXx } },
3378
    { VEX_LEN_TABLE (VEX_LEN_58_P_1) },
3379
    { "vaddpd", { XM, Vex, EXx } },
3380
    { VEX_LEN_TABLE (VEX_LEN_58_P_3) },
3381
  },
3382
 
3383
  /* PREFIX_VEX_59 */
3384
  {
3385
    { "vmulps", { XM, Vex, EXx } },
3386
    { VEX_LEN_TABLE (VEX_LEN_59_P_1) },
3387
    { "vmulpd", { XM, Vex, EXx } },
3388
    { VEX_LEN_TABLE (VEX_LEN_59_P_3) },
3389
  },
3390
 
3391
  /* PREFIX_VEX_5A */
3392
  {
3393
    { "vcvtps2pd", { XM, EXxmmq } },
3394
    { VEX_LEN_TABLE (VEX_LEN_5A_P_1) },
3395
    { "vcvtpd2ps%XY", { XMM, EXx } },
3396
    { VEX_LEN_TABLE (VEX_LEN_5A_P_3) },
3397
  },
3398
 
3399
  /* PREFIX_VEX_5B */
3400
  {
3401
    { "vcvtdq2ps", { XM, EXx } },
3402
    { "vcvttps2dq", { XM, EXx } },
3403
    { "vcvtps2dq", { XM, EXx } },
3404
    { "(bad)",  { XX } },
3405
  },
3406
 
3407
  /* PREFIX_VEX_5C */
3408
  {
3409
    { "vsubps", { XM, Vex, EXx } },
3410
    { VEX_LEN_TABLE (VEX_LEN_5C_P_1) },
3411
    { "vsubpd", { XM, Vex, EXx } },
3412
    { VEX_LEN_TABLE (VEX_LEN_5C_P_3) },
3413
  },
3414
 
3415
  /* PREFIX_VEX_5D */
3416
  {
3417
    { "vminps", { XM, Vex, EXx } },
3418
    { VEX_LEN_TABLE (VEX_LEN_5D_P_1) },
3419
    { "vminpd", { XM, Vex, EXx } },
3420
    { VEX_LEN_TABLE (VEX_LEN_5D_P_3) },
3421
  },
3422
 
3423
  /* PREFIX_VEX_5E */
3424
  {
3425
    { "vdivps", { XM, Vex, EXx } },
3426
    { VEX_LEN_TABLE (VEX_LEN_5E_P_1) },
3427
    { "vdivpd", { XM, Vex, EXx } },
3428
    { VEX_LEN_TABLE (VEX_LEN_5E_P_3) },
3429
  },
3430
 
3431
  /* PREFIX_VEX_5F */
3432
  {
3433
    { "vmaxps", { XM, Vex, EXx } },
3434
    { VEX_LEN_TABLE (VEX_LEN_5F_P_1) },
3435
    { "vmaxpd", { XM, Vex, EXx } },
3436
    { VEX_LEN_TABLE (VEX_LEN_5F_P_3) },
3437
  },
3438
 
3439
  /* PREFIX_VEX_60 */
3440
  {
3441
    { "(bad)",  { XX } },
3442
    { "(bad)",  { XX } },
3443
    { VEX_LEN_TABLE (VEX_LEN_60_P_2) },
3444
    { "(bad)",  { XX } },
3445
  },
3446
 
3447
  /* PREFIX_VEX_61 */
3448
  {
3449
    { "(bad)",  { XX } },
3450
    { "(bad)",  { XX } },
3451
    { VEX_LEN_TABLE (VEX_LEN_61_P_2) },
3452
    { "(bad)",  { XX } },
3453
  },
3454
 
3455
  /* PREFIX_VEX_62 */
3456
  {
3457
    { "(bad)",  { XX } },
3458
    { "(bad)",  { XX } },
3459
    { VEX_LEN_TABLE (VEX_LEN_62_P_2) },
3460
    { "(bad)",  { XX } },
3461
  },
3462
 
3463
  /* PREFIX_VEX_63 */
3464
  {
3465
    { "(bad)",  { XX } },
3466
    { "(bad)",  { XX } },
3467
    { VEX_LEN_TABLE (VEX_LEN_63_P_2) },
3468
    { "(bad)",  { XX } },
3469
  },
3470
 
3471
  /* PREFIX_VEX_64 */
3472
  {
3473
    { "(bad)",  { XX } },
3474
    { "(bad)",  { XX } },
3475
    { VEX_LEN_TABLE (VEX_LEN_64_P_2) },
3476
    { "(bad)",  { XX } },
3477
  },
3478
 
3479
  /* PREFIX_VEX_65 */
3480
  {
3481
    { "(bad)",  { XX } },
3482
    { "(bad)",  { XX } },
3483
    { VEX_LEN_TABLE (VEX_LEN_65_P_2) },
3484
    { "(bad)",  { XX } },
3485
  },
3486
 
3487
  /* PREFIX_VEX_66 */
3488
  {
3489
    { "(bad)",  { XX } },
3490
    { "(bad)",  { XX } },
3491
    { VEX_LEN_TABLE (VEX_LEN_66_P_2) },
3492
    { "(bad)",  { XX } },
3493
  },
3494
 
3495
  /* PREFIX_VEX_67 */
3496
  {
3497
    { "(bad)",  { XX } },
3498
    { "(bad)",  { XX } },
3499
    { VEX_LEN_TABLE (VEX_LEN_67_P_2) },
3500
    { "(bad)",  { XX } },
3501
  },
3502
 
3503
  /* PREFIX_VEX_68 */
3504
  {
3505
    { "(bad)",  { XX } },
3506
    { "(bad)",  { XX } },
3507
    { VEX_LEN_TABLE (VEX_LEN_68_P_2) },
3508
    { "(bad)",  { XX } },
3509
  },
3510
 
3511
  /* PREFIX_VEX_69 */
3512
  {
3513
    { "(bad)",  { XX } },
3514
    { "(bad)",  { XX } },
3515
    { VEX_LEN_TABLE (VEX_LEN_69_P_2) },
3516
    { "(bad)",  { XX } },
3517
  },
3518
 
3519
  /* PREFIX_VEX_6A */
3520
  {
3521
    { "(bad)",  { XX } },
3522
    { "(bad)",  { XX } },
3523
    { VEX_LEN_TABLE (VEX_LEN_6A_P_2) },
3524
    { "(bad)",  { XX } },
3525
  },
3526
 
3527
  /* PREFIX_VEX_6B */
3528
  {
3529
    { "(bad)",  { XX } },
3530
    { "(bad)",  { XX } },
3531
    { VEX_LEN_TABLE (VEX_LEN_6B_P_2) },
3532
    { "(bad)",  { XX } },
3533
  },
3534
 
3535
  /* PREFIX_VEX_6C */
3536
  {
3537
    { "(bad)",  { XX } },
3538
    { "(bad)",  { XX } },
3539
    { VEX_LEN_TABLE (VEX_LEN_6C_P_2) },
3540
    { "(bad)",  { XX } },
3541
  },
3542
 
3543
  /* PREFIX_VEX_6D */
3544
  {
3545
    { "(bad)",  { XX } },
3546
    { "(bad)",  { XX } },
3547
    { VEX_LEN_TABLE (VEX_LEN_6D_P_2) },
3548
    { "(bad)",  { XX } },
3549
  },
3550
 
3551
  /* PREFIX_VEX_6E */
3552
  {
3553
    { "(bad)",  { XX } },
3554
    { "(bad)",  { XX } },
3555
    { VEX_LEN_TABLE (VEX_LEN_6E_P_2) },
3556
    { "(bad)",  { XX } },
3557
  },
3558
 
3559
  /* PREFIX_VEX_6F */
3560
  {
3561
    { "(bad)",  { XX } },
3562
    { "vmovdqu", { XM, EXx } },
3563
    { "vmovdqa", { XM, EXx } },
3564
    { "(bad)",  { XX } },
3565
  },
3566
 
3567
  /* PREFIX_VEX_70 */
3568
  {
3569
    { "(bad)",  { XX } },
3570
    { VEX_LEN_TABLE (VEX_LEN_70_P_1) },
3571
    { VEX_LEN_TABLE (VEX_LEN_70_P_2) },
3572
    { VEX_LEN_TABLE (VEX_LEN_70_P_3) },
3573
  },
3574
 
3575
  /* PREFIX_VEX_71_REG_2 */
3576
  {
3577
    { "(bad)",  { XX } },
3578
    { "(bad)",  { XX } },
3579
    { VEX_LEN_TABLE (VEX_LEN_71_R_2_P_2) },
3580
    { "(bad)",  { XX } },
3581
  },
3582
 
3583
  /* PREFIX_VEX_71_REG_4 */
3584
  {
3585
    { "(bad)",  { XX } },
3586
    { "(bad)",  { XX } },
3587
    { VEX_LEN_TABLE (VEX_LEN_71_R_4_P_2) },
3588
    { "(bad)",  { XX } },
3589
  },
3590
 
3591
  /* PREFIX_VEX_71_REG_6 */
3592
  {
3593
    { "(bad)",  { XX } },
3594
    { "(bad)",  { XX } },
3595
    { VEX_LEN_TABLE (VEX_LEN_71_R_6_P_2) },
3596
    { "(bad)",  { XX } },
3597
  },
3598
 
3599
  /* PREFIX_VEX_72_REG_2 */
3600
  {
3601
    { "(bad)",  { XX } },
3602
    { "(bad)",  { XX } },
3603
    { VEX_LEN_TABLE (VEX_LEN_72_R_2_P_2) },
3604
    { "(bad)",  { XX } },
3605
  },
3606
 
3607
  /* PREFIX_VEX_72_REG_4 */
3608
  {
3609
    { "(bad)",  { XX } },
3610
    { "(bad)",  { XX } },
3611
    { VEX_LEN_TABLE (VEX_LEN_72_R_4_P_2) },
3612
    { "(bad)",  { XX } },
3613
  },
3614
 
3615
  /* PREFIX_VEX_72_REG_6 */
3616
  {
3617
    { "(bad)",  { XX } },
3618
    { "(bad)",  { XX } },
3619
    { VEX_LEN_TABLE (VEX_LEN_72_R_6_P_2) },
3620
    { "(bad)",  { XX } },
3621
  },
3622
 
3623
  /* PREFIX_VEX_73_REG_2 */
3624
  {
3625
    { "(bad)",  { XX } },
3626
    { "(bad)",  { XX } },
3627
    { VEX_LEN_TABLE (VEX_LEN_73_R_2_P_2) },
3628
    { "(bad)",  { XX } },
3629
  },
3630
 
3631
  /* PREFIX_VEX_73_REG_3 */
3632
  {
3633
    { "(bad)",  { XX } },
3634
    { "(bad)",  { XX } },
3635
    { VEX_LEN_TABLE (VEX_LEN_73_R_3_P_2) },
3636
    { "(bad)",  { XX } },
3637
  },
3638
 
3639
  /* PREFIX_VEX_73_REG_6 */
3640
  {
3641
    { "(bad)",  { XX } },
3642
    { "(bad)",  { XX } },
3643
    { VEX_LEN_TABLE (VEX_LEN_73_R_6_P_2) },
3644
    { "(bad)",  { XX } },
3645
  },
3646
 
3647
  /* PREFIX_VEX_73_REG_7 */
3648
  {
3649
    { "(bad)",  { XX } },
3650
    { "(bad)",  { XX } },
3651
    { VEX_LEN_TABLE (VEX_LEN_73_R_7_P_2) },
3652
    { "(bad)",  { XX } },
3653
  },
3654
 
3655
  /* PREFIX_VEX_74 */
3656
  {
3657
    { "(bad)",  { XX } },
3658
    { "(bad)",  { XX } },
3659
    { VEX_LEN_TABLE (VEX_LEN_74_P_2) },
3660
    { "(bad)",  { XX } },
3661
  },
3662
 
3663
  /* PREFIX_VEX_75 */
3664
  {
3665
    { "(bad)",  { XX } },
3666
    { "(bad)",  { XX } },
3667
    { VEX_LEN_TABLE (VEX_LEN_75_P_2) },
3668
    { "(bad)",  { XX } },
3669
  },
3670
 
3671
  /* PREFIX_VEX_76 */
3672
  {
3673
    { "(bad)",  { XX } },
3674
    { "(bad)",  { XX } },
3675
    { VEX_LEN_TABLE (VEX_LEN_76_P_2) },
3676
    { "(bad)",  { XX } },
3677
  },
3678
 
3679
  /* PREFIX_VEX_77 */
3680
  {
3681
    { "",       { VZERO } },
3682
    { "(bad)",  { XX } },
3683
    { "(bad)",  { XX } },
3684
    { "(bad)",  { XX } },
3685
  },
3686
 
3687
  /* PREFIX_VEX_7C */
3688
  {
3689
    { "(bad)",  { XX } },
3690
    { "(bad)",  { XX } },
3691
    { "vhaddpd", { XM, Vex, EXx } },
3692
    { "vhaddps", { XM, Vex, EXx } },
3693
  },
3694
 
3695
  /* PREFIX_VEX_7D */
3696
  {
3697
    { "(bad)",  { XX } },
3698
    { "(bad)",  { XX } },
3699
    { "vhsubpd", { XM, Vex, EXx } },
3700
    { "vhsubps", { XM, Vex, EXx } },
3701
  },
3702
 
3703
  /* PREFIX_VEX_7E */
3704
  {
3705
    { "(bad)",  { XX } },
3706
    { VEX_LEN_TABLE (VEX_LEN_7E_P_1) },
3707
    { VEX_LEN_TABLE (VEX_LEN_7E_P_2) },
3708
    { "(bad)",  { XX } },
3709
  },
3710
 
3711
  /* PREFIX_VEX_7F */
3712
  {
3713
    { "(bad)",  { XX } },
3714
    { "vmovdqu", { EXx, XM } },
3715
    { "vmovdqa", { EXx, XM } },
3716
    { "(bad)",  { XX } },
3717
  },
3718
 
3719
  /* PREFIX_VEX_C2 */
3720
  {
3721
    { "vcmpps", { XM, Vex, EXx, VCMP } },
3722
    { VEX_LEN_TABLE (VEX_LEN_C2_P_1) },
3723
    { "vcmppd", { XM, Vex, EXx, VCMP } },
3724
    { VEX_LEN_TABLE (VEX_LEN_C2_P_3) },
3725
  },
3726
 
3727
  /* PREFIX_VEX_C4 */
3728
  {
3729
    { "(bad)",  { XX } },
3730
    { "(bad)",  { XX } },
3731
    { VEX_LEN_TABLE (VEX_LEN_C4_P_2) },
3732
    { "(bad)",  { XX } },
3733
  },
3734
 
3735
  /* PREFIX_VEX_C5 */
3736
  {
3737
    { "(bad)",  { XX } },
3738
    { "(bad)",  { XX } },
3739
    { VEX_LEN_TABLE (VEX_LEN_C5_P_2) },
3740
    { "(bad)",  { XX } },
3741
  },
3742
 
3743
  /* PREFIX_VEX_D0 */
3744
  {
3745
    { "(bad)",  { XX } },
3746
    { "(bad)",  { XX } },
3747
    { "vaddsubpd", { XM, Vex, EXx } },
3748
    { "vaddsubps", { XM, Vex, EXx } },
3749
  },
3750
 
3751
  /* PREFIX_VEX_D1 */
3752
  {
3753
    { "(bad)",  { XX } },
3754
    { "(bad)",  { XX } },
3755
    { VEX_LEN_TABLE (VEX_LEN_D1_P_2) },
3756
    { "(bad)",  { XX } },
3757
  },
3758
 
3759
  /* PREFIX_VEX_D2 */
3760
  {
3761
    { "(bad)",  { XX } },
3762
    { "(bad)",  { XX } },
3763
    { VEX_LEN_TABLE (VEX_LEN_D2_P_2) },
3764
    { "(bad)",  { XX } },
3765
  },
3766
 
3767
  /* PREFIX_VEX_D3 */
3768
  {
3769
    { "(bad)",  { XX } },
3770
    { "(bad)",  { XX } },
3771
    { VEX_LEN_TABLE (VEX_LEN_D3_P_2) },
3772
    { "(bad)",  { XX } },
3773
  },
3774
 
3775
  /* PREFIX_VEX_D4 */
3776
  {
3777
    { "(bad)",  { XX } },
3778
    { "(bad)",  { XX } },
3779
    { VEX_LEN_TABLE (VEX_LEN_D4_P_2) },
3780
    { "(bad)",  { XX } },
3781
  },
3782
 
3783
  /* PREFIX_VEX_D5 */
3784
  {
3785
    { "(bad)",  { XX } },
3786
    { "(bad)",  { XX } },
3787
    { VEX_LEN_TABLE (VEX_LEN_D5_P_2) },
3788
    { "(bad)",  { XX } },
3789
  },
3790
 
3791
  /* PREFIX_VEX_D6 */
3792
  {
3793
    { "(bad)",  { XX } },
3794
    { "(bad)",  { XX } },
3795
    { VEX_LEN_TABLE (VEX_LEN_D6_P_2) },
3796
    { "(bad)",  { XX } },
3797
  },
3798
 
3799
  /* PREFIX_VEX_D7 */
3800
  {
3801
    { "(bad)",  { XX } },
3802
    { "(bad)",  { XX } },
3803
    { MOD_TABLE (MOD_VEX_D7_PREFIX_2) },
3804
    { "(bad)",  { XX } },
3805
  },
3806
 
3807
  /* PREFIX_VEX_D8 */
3808
  {
3809
    { "(bad)",  { XX } },
3810
    { "(bad)",  { XX } },
3811
    { VEX_LEN_TABLE (VEX_LEN_D8_P_2) },
3812
    { "(bad)",  { XX } },
3813
  },
3814
 
3815
  /* PREFIX_VEX_D9 */
3816
  {
3817
    { "(bad)",  { XX } },
3818
    { "(bad)",  { XX } },
3819
    { VEX_LEN_TABLE (VEX_LEN_D9_P_2) },
3820
    { "(bad)",  { XX } },
3821
  },
3822
 
3823
  /* PREFIX_VEX_DA */
3824
  {
3825
    { "(bad)",  { XX } },
3826
    { "(bad)",  { XX } },
3827
    { VEX_LEN_TABLE (VEX_LEN_DA_P_2) },
3828
    { "(bad)",  { XX } },
3829
  },
3830
 
3831
  /* PREFIX_VEX_DB */
3832
  {
3833
    { "(bad)",  { XX } },
3834
    { "(bad)",  { XX } },
3835
    { VEX_LEN_TABLE (VEX_LEN_DB_P_2) },
3836
    { "(bad)",  { XX } },
3837
  },
3838
 
3839
  /* PREFIX_VEX_DC */
3840
  {
3841
    { "(bad)",  { XX } },
3842
    { "(bad)",  { XX } },
3843
    { VEX_LEN_TABLE (VEX_LEN_DC_P_2) },
3844
    { "(bad)",  { XX } },
3845
  },
3846
 
3847
  /* PREFIX_VEX_DD */
3848
  {
3849
    { "(bad)",  { XX } },
3850
    { "(bad)",  { XX } },
3851
    { VEX_LEN_TABLE (VEX_LEN_DD_P_2) },
3852
    { "(bad)",  { XX } },
3853
  },
3854
 
3855
  /* PREFIX_VEX_DE */
3856
  {
3857
    { "(bad)",  { XX } },
3858
    { "(bad)",  { XX } },
3859
    { VEX_LEN_TABLE (VEX_LEN_DE_P_2) },
3860
    { "(bad)",  { XX } },
3861
  },
3862
 
3863
  /* PREFIX_VEX_DF */
3864
  {
3865
    { "(bad)",  { XX } },
3866
    { "(bad)",  { XX } },
3867
    { VEX_LEN_TABLE (VEX_LEN_DF_P_2) },
3868
    { "(bad)",  { XX } },
3869
  },
3870
 
3871
  /* PREFIX_VEX_E0 */
3872
  {
3873
    { "(bad)",  { XX } },
3874
    { "(bad)",  { XX } },
3875
    { VEX_LEN_TABLE (VEX_LEN_E0_P_2) },
3876
    { "(bad)",  { XX } },
3877
  },
3878
 
3879
  /* PREFIX_VEX_E1 */
3880
  {
3881
    { "(bad)",  { XX } },
3882
    { "(bad)",  { XX } },
3883
    { VEX_LEN_TABLE (VEX_LEN_E1_P_2) },
3884
    { "(bad)",  { XX } },
3885
  },
3886
 
3887
  /* PREFIX_VEX_E2 */
3888
  {
3889
    { "(bad)",  { XX } },
3890
    { "(bad)",  { XX } },
3891
    { VEX_LEN_TABLE (VEX_LEN_E2_P_2) },
3892
    { "(bad)",  { XX } },
3893
  },
3894
 
3895
  /* PREFIX_VEX_E3 */
3896
  {
3897
    { "(bad)",  { XX } },
3898
    { "(bad)",  { XX } },
3899
    { VEX_LEN_TABLE (VEX_LEN_E3_P_2) },
3900
    { "(bad)",  { XX } },
3901
  },
3902
 
3903
  /* PREFIX_VEX_E4 */
3904
  {
3905
    { "(bad)",  { XX } },
3906
    { "(bad)",  { XX } },
3907
    { VEX_LEN_TABLE (VEX_LEN_E4_P_2) },
3908
    { "(bad)",  { XX } },
3909
  },
3910
 
3911
  /* PREFIX_VEX_E5 */
3912
  {
3913
    { "(bad)",  { XX } },
3914
    { "(bad)",  { XX } },
3915
    { VEX_LEN_TABLE (VEX_LEN_E5_P_2) },
3916
    { "(bad)",  { XX } },
3917
  },
3918
 
3919
  /* PREFIX_VEX_E6 */
3920
  {
3921
    { "(bad)",  { XX } },
3922
    { "vcvtdq2pd", { XM, EXxmmq } },
3923
    { "vcvttpd2dq%XY", { XMM, EXx } },
3924
    { "vcvtpd2dq%XY", { XMM, EXx } },
3925
  },
3926
 
3927
  /* PREFIX_VEX_E7 */
3928
  {
3929
    { "(bad)",  { XX } },
3930
    { "(bad)",  { XX } },
3931
    { MOD_TABLE (MOD_VEX_E7_PREFIX_2) },
3932
    { "(bad)",  { XX } },
3933
  },
3934
 
3935
  /* PREFIX_VEX_E8 */
3936
  {
3937
    { "(bad)",  { XX } },
3938
    { "(bad)",  { XX } },
3939
    { VEX_LEN_TABLE (VEX_LEN_E8_P_2) },
3940
    { "(bad)",  { XX } },
3941
  },
3942
 
3943
  /* PREFIX_VEX_E9 */
3944
  {
3945
    { "(bad)",  { XX } },
3946
    { "(bad)",  { XX } },
3947
    { VEX_LEN_TABLE (VEX_LEN_E9_P_2) },
3948
    { "(bad)",  { XX } },
3949
  },
3950
 
3951
  /* PREFIX_VEX_EA */
3952
  {
3953
    { "(bad)",  { XX } },
3954
    { "(bad)",  { XX } },
3955
    { VEX_LEN_TABLE (VEX_LEN_EA_P_2) },
3956
    { "(bad)",  { XX } },
3957
  },
3958
 
3959
  /* PREFIX_VEX_EB */
3960
  {
3961
    { "(bad)",  { XX } },
3962
    { "(bad)",  { XX } },
3963
    { VEX_LEN_TABLE (VEX_LEN_EB_P_2) },
3964
    { "(bad)",  { XX } },
3965
  },
3966
 
3967
  /* PREFIX_VEX_EC */
3968
  {
3969
    { "(bad)",  { XX } },
3970
    { "(bad)",  { XX } },
3971
    { VEX_LEN_TABLE (VEX_LEN_EC_P_2) },
3972
    { "(bad)",  { XX } },
3973
  },
3974
 
3975
  /* PREFIX_VEX_ED */
3976
  {
3977
    { "(bad)",  { XX } },
3978
    { "(bad)",  { XX } },
3979
    { VEX_LEN_TABLE (VEX_LEN_ED_P_2) },
3980
    { "(bad)",  { XX } },
3981
  },
3982
 
3983
  /* PREFIX_VEX_EE */
3984
  {
3985
    { "(bad)",  { XX } },
3986
    { "(bad)",  { XX } },
3987
    { VEX_LEN_TABLE (VEX_LEN_EE_P_2) },
3988
    { "(bad)",  { XX } },
3989
  },
3990
 
3991
  /* PREFIX_VEX_EF */
3992
  {
3993
    { "(bad)",  { XX } },
3994
    { "(bad)",  { XX } },
3995
    { VEX_LEN_TABLE (VEX_LEN_EF_P_2) },
3996
    { "(bad)",  { XX } },
3997
  },
3998
 
3999
  /* PREFIX_VEX_F0 */
4000
  {
4001
    { "(bad)",  { XX } },
4002
    { "(bad)",  { XX } },
4003
    { "(bad)",  { XX } },
4004
    { MOD_TABLE (MOD_VEX_F0_PREFIX_3) },
4005
  },
4006
 
4007
  /* PREFIX_VEX_F1 */
4008
  {
4009
    { "(bad)",  { XX } },
4010
    { "(bad)",  { XX } },
4011
    { VEX_LEN_TABLE (VEX_LEN_F1_P_2) },
4012
    { "(bad)",  { XX } },
4013
  },
4014
 
4015
  /* PREFIX_VEX_F2 */
4016
  {
4017
    { "(bad)",  { XX } },
4018
    { "(bad)",  { XX } },
4019
    { VEX_LEN_TABLE (VEX_LEN_F2_P_2) },
4020
    { "(bad)",  { XX } },
4021
  },
4022
 
4023
  /* PREFIX_VEX_F3 */
4024
  {
4025
    { "(bad)",  { XX } },
4026
    { "(bad)",  { XX } },
4027
    { VEX_LEN_TABLE (VEX_LEN_F3_P_2) },
4028
    { "(bad)",  { XX } },
4029
  },
4030
 
4031
  /* PREFIX_VEX_F4 */
4032
  {
4033
    { "(bad)",  { XX } },
4034
    { "(bad)",  { XX } },
4035
    { VEX_LEN_TABLE (VEX_LEN_F4_P_2) },
4036
    { "(bad)",  { XX } },
4037
  },
4038
 
4039
  /* PREFIX_VEX_F5 */
4040
  {
4041
    { "(bad)",  { XX } },
4042
    { "(bad)",  { XX } },
4043
    { VEX_LEN_TABLE (VEX_LEN_F5_P_2) },
4044
    { "(bad)",  { XX } },
4045
  },
4046
 
4047
  /* PREFIX_VEX_F6 */
4048
  {
4049
    { "(bad)",  { XX } },
4050
    { "(bad)",  { XX } },
4051
    { VEX_LEN_TABLE (VEX_LEN_F6_P_2) },
4052
    { "(bad)",  { XX } },
4053
  },
4054
 
4055
  /* PREFIX_VEX_F7 */
4056
  {
4057
    { "(bad)",  { XX } },
4058
    { "(bad)",  { XX } },
4059
    { VEX_LEN_TABLE (VEX_LEN_F7_P_2) },
4060
    { "(bad)",  { XX } },
4061
  },
4062
 
4063
  /* PREFIX_VEX_F8 */
4064
  {
4065
    { "(bad)",  { XX } },
4066
    { "(bad)",  { XX } },
4067
    { VEX_LEN_TABLE (VEX_LEN_F8_P_2) },
4068
    { "(bad)",  { XX } },
4069
  },
4070
 
4071
  /* PREFIX_VEX_F9 */
4072
  {
4073
    { "(bad)",  { XX } },
4074
    { "(bad)",  { XX } },
4075
    { VEX_LEN_TABLE (VEX_LEN_F9_P_2) },
4076
    { "(bad)",  { XX } },
4077
  },
4078
 
4079
  /* PREFIX_VEX_FA */
4080
  {
4081
    { "(bad)",  { XX } },
4082
    { "(bad)",  { XX } },
4083
    { VEX_LEN_TABLE (VEX_LEN_FA_P_2) },
4084
    { "(bad)",  { XX } },
4085
  },
4086
 
4087
  /* PREFIX_VEX_FB */
4088
  {
4089
    { "(bad)",  { XX } },
4090
    { "(bad)",  { XX } },
4091
    { VEX_LEN_TABLE (VEX_LEN_FB_P_2) },
4092
    { "(bad)",  { XX } },
4093
  },
4094
 
4095
  /* PREFIX_VEX_FC */
4096
  {
4097
    { "(bad)",  { XX } },
4098
    { "(bad)",  { XX } },
4099
    { VEX_LEN_TABLE (VEX_LEN_FC_P_2) },
4100
    { "(bad)",  { XX } },
4101
  },
4102
 
4103
  /* PREFIX_VEX_FD */
4104
  {
4105
    { "(bad)",  { XX } },
4106
    { "(bad)",  { XX } },
4107
    { VEX_LEN_TABLE (VEX_LEN_FD_P_2) },
4108
    { "(bad)",  { XX } },
4109
  },
4110
 
4111
  /* PREFIX_VEX_FE */
4112
  {
4113
    { "(bad)",  { XX } },
4114
    { "(bad)",  { XX } },
4115
    { VEX_LEN_TABLE (VEX_LEN_FE_P_2) },
4116
    { "(bad)",  { XX } },
4117
  },
4118
 
4119
  /* PREFIX_VEX_3800 */
4120
  {
4121
    { "(bad)",  { XX } },
4122
    { "(bad)",  { XX } },
4123
    { VEX_LEN_TABLE (VEX_LEN_3800_P_2) },
4124
    { "(bad)",  { XX } },
4125
  },
4126
 
4127
  /* PREFIX_VEX_3801 */
4128
  {
4129
    { "(bad)",  { XX } },
4130
    { "(bad)",  { XX } },
4131
    { VEX_LEN_TABLE (VEX_LEN_3801_P_2) },
4132
    { "(bad)",  { XX } },
4133
  },
4134
 
4135
  /* PREFIX_VEX_3802 */
4136
  {
4137
    { "(bad)",  { XX } },
4138
    { "(bad)",  { XX } },
4139
    { VEX_LEN_TABLE (VEX_LEN_3802_P_2) },
4140
    { "(bad)",  { XX } },
4141
  },
4142
 
4143
  /* PREFIX_VEX_3803 */
4144
  {
4145
    { "(bad)",  { XX } },
4146
    { "(bad)",  { XX } },
4147
    { VEX_LEN_TABLE (VEX_LEN_3803_P_2) },
4148
    { "(bad)",  { XX } },
4149
  },
4150
 
4151
  /* PREFIX_VEX_3804 */
4152
  {
4153
    { "(bad)",  { XX } },
4154
    { "(bad)",  { XX } },
4155
    { VEX_LEN_TABLE (VEX_LEN_3804_P_2) },
4156
    { "(bad)",  { XX } },
4157
  },
4158
 
4159
  /* PREFIX_VEX_3805 */
4160
  {
4161
    { "(bad)",  { XX } },
4162
    { "(bad)",  { XX } },
4163
    { VEX_LEN_TABLE (VEX_LEN_3805_P_2) },
4164
    { "(bad)",  { XX } },
4165
  },
4166
 
4167
  /* PREFIX_VEX_3806 */
4168
  {
4169
    { "(bad)",  { XX } },
4170
    { "(bad)",  { XX } },
4171
    { VEX_LEN_TABLE (VEX_LEN_3806_P_2) },
4172
    { "(bad)",  { XX } },
4173
  },
4174
 
4175
  /* PREFIX_VEX_3807 */
4176
  {
4177
    { "(bad)",  { XX } },
4178
    { "(bad)",  { XX } },
4179
    { VEX_LEN_TABLE (VEX_LEN_3807_P_2) },
4180
    { "(bad)",  { XX } },
4181
  },
4182
 
4183
  /* PREFIX_VEX_3808 */
4184
  {
4185
    { "(bad)",  { XX } },
4186
    { "(bad)",  { XX } },
4187
    { VEX_LEN_TABLE (VEX_LEN_3808_P_2) },
4188
    { "(bad)",  { XX } },
4189
  },
4190
 
4191
  /* PREFIX_VEX_3809 */
4192
  {
4193
    { "(bad)",  { XX } },
4194
    { "(bad)",  { XX } },
4195
    { VEX_LEN_TABLE (VEX_LEN_3809_P_2) },
4196
    { "(bad)",  { XX } },
4197
  },
4198
 
4199
  /* PREFIX_VEX_380A */
4200
  {
4201
    { "(bad)",  { XX } },
4202
    { "(bad)",  { XX } },
4203
    { VEX_LEN_TABLE (VEX_LEN_380A_P_2) },
4204
    { "(bad)",  { XX } },
4205
  },
4206
 
4207
  /* PREFIX_VEX_380B */
4208
  {
4209
    { "(bad)",  { XX } },
4210
    { "(bad)",  { XX } },
4211
    { VEX_LEN_TABLE (VEX_LEN_380B_P_2) },
4212
    { "(bad)",  { XX } },
4213
  },
4214
 
4215
  /* PREFIX_VEX_380C */
4216
  {
4217
    { "(bad)",  { XX } },
4218
    { "(bad)",  { XX } },
4219
    { "vpermilps", { XM, Vex, EXx } },
4220
    { "(bad)",  { XX } },
4221
  },
4222
 
4223
  /* PREFIX_VEX_380D */
4224
  {
4225
    { "(bad)",  { XX } },
4226
    { "(bad)",  { XX } },
4227
    { "vpermilpd", { XM, Vex, EXx } },
4228
    { "(bad)",  { XX } },
4229
  },
4230
 
4231
  /* PREFIX_VEX_380E */
4232
  {
4233
    { "(bad)",  { XX } },
4234
    { "(bad)",  { XX } },
4235
    { "vtestps", { XM, EXx } },
4236
    { "(bad)",  { XX } },
4237
  },
4238
 
4239
  /* PREFIX_VEX_380F */
4240
  {
4241
    { "(bad)",  { XX } },
4242
    { "(bad)",  { XX } },
4243
    { "vtestpd", { XM, EXx } },
4244
    { "(bad)",  { XX } },
4245
  },
4246
 
4247
  /* PREFIX_VEX_3817 */
4248
  {
4249
    { "(bad)",  { XX } },
4250
    { "(bad)",  { XX } },
4251
    { "vptest", { XM, EXx } },
4252
    { "(bad)",  { XX } },
4253
  },
4254
 
4255
  /* PREFIX_VEX_3818 */
4256
  {
4257
    { "(bad)",  { XX } },
4258
    { "(bad)",  { XX } },
4259
    { MOD_TABLE (MOD_VEX_3818_PREFIX_2) },
4260
    { "(bad)",  { XX } },
4261
  },
4262
 
4263
  /* PREFIX_VEX_3819 */
4264
  {
4265
    { "(bad)",  { XX } },
4266
    { "(bad)",  { XX } },
4267
    { MOD_TABLE (MOD_VEX_3819_PREFIX_2) },
4268
    { "(bad)",  { XX } },
4269
  },
4270
 
4271
  /* PREFIX_VEX_381A */
4272
  {
4273
    { "(bad)",  { XX } },
4274
    { "(bad)",  { XX } },
4275
    { MOD_TABLE (MOD_VEX_381A_PREFIX_2) },
4276
    { "(bad)",  { XX } },
4277
  },
4278
 
4279
  /* PREFIX_VEX_381C */
4280
  {
4281
    { "(bad)",  { XX } },
4282
    { "(bad)",  { XX } },
4283
    { VEX_LEN_TABLE (VEX_LEN_381C_P_2) },
4284
    { "(bad)",  { XX } },
4285
  },
4286
 
4287
  /* PREFIX_VEX_381D */
4288
  {
4289
    { "(bad)",  { XX } },
4290
    { "(bad)",  { XX } },
4291
    { VEX_LEN_TABLE (VEX_LEN_381D_P_2) },
4292
    { "(bad)",  { XX } },
4293
  },
4294
 
4295
  /* PREFIX_VEX_381E */
4296
  {
4297
    { "(bad)",  { XX } },
4298
    { "(bad)",  { XX } },
4299
    { VEX_LEN_TABLE (VEX_LEN_381E_P_2) },
4300
    { "(bad)",  { XX } },
4301
  },
4302
 
4303
  /* PREFIX_VEX_3820 */
4304
  {
4305
    { "(bad)",  { XX } },
4306
    { "(bad)",  { XX } },
4307
    { VEX_LEN_TABLE (VEX_LEN_3820_P_2) },
4308
    { "(bad)",  { XX } },
4309
  },
4310
 
4311
  /* PREFIX_VEX_3821 */
4312
  {
4313
    { "(bad)",  { XX } },
4314
    { "(bad)",  { XX } },
4315
    { VEX_LEN_TABLE (VEX_LEN_3821_P_2) },
4316
    { "(bad)",  { XX } },
4317
  },
4318
 
4319
  /* PREFIX_VEX_3822 */
4320
  {
4321
    { "(bad)",  { XX } },
4322
    { "(bad)",  { XX } },
4323
    { VEX_LEN_TABLE (VEX_LEN_3822_P_2) },
4324
    { "(bad)",  { XX } },
4325
  },
4326
 
4327
  /* PREFIX_VEX_3823 */
4328
  {
4329
    { "(bad)",  { XX } },
4330
    { "(bad)",  { XX } },
4331
    { VEX_LEN_TABLE (VEX_LEN_3823_P_2) },
4332
    { "(bad)",  { XX } },
4333
  },
4334
 
4335
  /* PREFIX_VEX_3824 */
4336
  {
4337
    { "(bad)",  { XX } },
4338
    { "(bad)",  { XX } },
4339
    { VEX_LEN_TABLE (VEX_LEN_3824_P_2) },
4340
    { "(bad)",  { XX } },
4341
  },
4342
 
4343
  /* PREFIX_VEX_3825 */
4344
  {
4345
    { "(bad)",  { XX } },
4346
    { "(bad)",  { XX } },
4347
    { VEX_LEN_TABLE (VEX_LEN_3825_P_2) },
4348
    { "(bad)",  { XX } },
4349
  },
4350
 
4351
  /* PREFIX_VEX_3828 */
4352
  {
4353
    { "(bad)",  { XX } },
4354
    { "(bad)",  { XX } },
4355
    { VEX_LEN_TABLE (VEX_LEN_3828_P_2) },
4356
    { "(bad)",  { XX } },
4357
  },
4358
 
4359
  /* PREFIX_VEX_3829 */
4360
  {
4361
    { "(bad)",  { XX } },
4362
    { "(bad)",  { XX } },
4363
    { VEX_LEN_TABLE (VEX_LEN_3829_P_2) },
4364
    { "(bad)",  { XX } },
4365
  },
4366
 
4367
  /* PREFIX_VEX_382A */
4368
  {
4369
    { "(bad)",  { XX } },
4370
    { "(bad)",  { XX } },
4371
    { MOD_TABLE (MOD_VEX_382A_PREFIX_2) },
4372
    { "(bad)",  { XX } },
4373
  },
4374
 
4375
  /* PREFIX_VEX_382B */
4376
  {
4377
    { "(bad)",  { XX } },
4378
    { "(bad)",  { XX } },
4379
    { VEX_LEN_TABLE (VEX_LEN_382B_P_2) },
4380
    { "(bad)",  { XX } },
4381
  },
4382
 
4383
  /* PREFIX_VEX_382C */
4384
  {
4385
    { "(bad)",  { XX } },
4386
    { "(bad)",  { XX } },
4387
     { MOD_TABLE (MOD_VEX_382C_PREFIX_2) },
4388
    { "(bad)",  { XX } },
4389
  },
4390
 
4391
  /* PREFIX_VEX_382D */
4392
  {
4393
    { "(bad)",  { XX } },
4394
    { "(bad)",  { XX } },
4395
     { MOD_TABLE (MOD_VEX_382D_PREFIX_2) },
4396
    { "(bad)",  { XX } },
4397
  },
4398
 
4399
  /* PREFIX_VEX_382E */
4400
  {
4401
    { "(bad)",  { XX } },
4402
    { "(bad)",  { XX } },
4403
     { MOD_TABLE (MOD_VEX_382E_PREFIX_2) },
4404
    { "(bad)",  { XX } },
4405
  },
4406
 
4407
  /* PREFIX_VEX_382F */
4408
  {
4409
    { "(bad)",  { XX } },
4410
    { "(bad)",  { XX } },
4411
     { MOD_TABLE (MOD_VEX_382F_PREFIX_2) },
4412
    { "(bad)",  { XX } },
4413
  },
4414
 
4415
  /* PREFIX_VEX_3830 */
4416
  {
4417
    { "(bad)",  { XX } },
4418
    { "(bad)",  { XX } },
4419
    { VEX_LEN_TABLE (VEX_LEN_3830_P_2) },
4420
    { "(bad)",  { XX } },
4421
  },
4422
 
4423
  /* PREFIX_VEX_3831 */
4424
  {
4425
    { "(bad)",  { XX } },
4426
    { "(bad)",  { XX } },
4427
    { VEX_LEN_TABLE (VEX_LEN_3831_P_2) },
4428
    { "(bad)",  { XX } },
4429
  },
4430
 
4431
  /* PREFIX_VEX_3832 */
4432
  {
4433
    { "(bad)",  { XX } },
4434
    { "(bad)",  { XX } },
4435
    { VEX_LEN_TABLE (VEX_LEN_3832_P_2) },
4436
    { "(bad)",  { XX } },
4437
  },
4438
 
4439
  /* PREFIX_VEX_3833 */
4440
  {
4441
    { "(bad)",  { XX } },
4442
    { "(bad)",  { XX } },
4443
    { VEX_LEN_TABLE (VEX_LEN_3833_P_2) },
4444
    { "(bad)",  { XX } },
4445
  },
4446
 
4447
  /* PREFIX_VEX_3834 */
4448
  {
4449
    { "(bad)",  { XX } },
4450
    { "(bad)",  { XX } },
4451
    { VEX_LEN_TABLE (VEX_LEN_3834_P_2) },
4452
    { "(bad)",  { XX } },
4453
  },
4454
 
4455
  /* PREFIX_VEX_3835 */
4456
  {
4457
    { "(bad)",  { XX } },
4458
    { "(bad)",  { XX } },
4459
    { VEX_LEN_TABLE (VEX_LEN_3835_P_2) },
4460
    { "(bad)",  { XX } },
4461
  },
4462
 
4463
  /* PREFIX_VEX_3837 */
4464
  {
4465
    { "(bad)",  { XX } },
4466
    { "(bad)",  { XX } },
4467
    { VEX_LEN_TABLE (VEX_LEN_3837_P_2) },
4468
    { "(bad)",  { XX } },
4469
  },
4470
 
4471
  /* PREFIX_VEX_3838 */
4472
  {
4473
    { "(bad)",  { XX } },
4474
    { "(bad)",  { XX } },
4475
    { VEX_LEN_TABLE (VEX_LEN_3838_P_2) },
4476
    { "(bad)",  { XX } },
4477
  },
4478
 
4479
  /* PREFIX_VEX_3839 */
4480
  {
4481
    { "(bad)",  { XX } },
4482
    { "(bad)",  { XX } },
4483
    { VEX_LEN_TABLE (VEX_LEN_3839_P_2) },
4484
    { "(bad)",  { XX } },
4485
  },
4486
 
4487
  /* PREFIX_VEX_383A */
4488
  {
4489
    { "(bad)",  { XX } },
4490
    { "(bad)",  { XX } },
4491
    { VEX_LEN_TABLE (VEX_LEN_383A_P_2) },
4492
    { "(bad)",  { XX } },
4493
  },
4494
 
4495
  /* PREFIX_VEX_383B */
4496
  {
4497
    { "(bad)",  { XX } },
4498
    { "(bad)",  { XX } },
4499
    { VEX_LEN_TABLE (VEX_LEN_383B_P_2) },
4500
    { "(bad)",  { XX } },
4501
  },
4502
 
4503
  /* PREFIX_VEX_383C */
4504
  {
4505
    { "(bad)",  { XX } },
4506
    { "(bad)",  { XX } },
4507
    { VEX_LEN_TABLE (VEX_LEN_383C_P_2) },
4508
    { "(bad)",  { XX } },
4509
  },
4510
 
4511
  /* PREFIX_VEX_383D */
4512
  {
4513
    { "(bad)",  { XX } },
4514
    { "(bad)",  { XX } },
4515
    { VEX_LEN_TABLE (VEX_LEN_383D_P_2) },
4516
    { "(bad)",  { XX } },
4517
  },
4518
 
4519
  /* PREFIX_VEX_383E */
4520
  {
4521
    { "(bad)",  { XX } },
4522
    { "(bad)",  { XX } },
4523
    { VEX_LEN_TABLE (VEX_LEN_383E_P_2) },
4524
    { "(bad)",  { XX } },
4525
  },
4526
 
4527
  /* PREFIX_VEX_383F */
4528
  {
4529
    { "(bad)",  { XX } },
4530
    { "(bad)",  { XX } },
4531
    { VEX_LEN_TABLE (VEX_LEN_383F_P_2) },
4532
    { "(bad)",  { XX } },
4533
  },
4534
 
4535
  /* PREFIX_VEX_3840 */
4536
  {
4537
    { "(bad)",  { XX } },
4538
    { "(bad)",  { XX } },
4539
    { VEX_LEN_TABLE (VEX_LEN_3840_P_2) },
4540
    { "(bad)",  { XX } },
4541
  },
4542
 
4543
  /* PREFIX_VEX_3841 */
4544
  {
4545
    { "(bad)",  { XX } },
4546
    { "(bad)",  { XX } },
4547
    { VEX_LEN_TABLE (VEX_LEN_3841_P_2) },
4548
    { "(bad)",  { XX } },
4549
  },
4550
 
4551
  /* PREFIX_VEX_38DB */
4552
  {
4553
    { "(bad)",  { XX } },
4554
    { "(bad)",  { XX } },
4555
    { VEX_LEN_TABLE (VEX_LEN_38DB_P_2) },
4556
    { "(bad)",  { XX } },
4557
  },
4558
 
4559
  /* PREFIX_VEX_38DC */
4560
  {
4561
    { "(bad)",  { XX } },
4562
    { "(bad)",  { XX } },
4563
    { VEX_LEN_TABLE (VEX_LEN_38DC_P_2) },
4564
    { "(bad)",  { XX } },
4565
  },
4566
 
4567
  /* PREFIX_VEX_38DD */
4568
  {
4569
    { "(bad)",  { XX } },
4570
    { "(bad)",  { XX } },
4571
    { VEX_LEN_TABLE (VEX_LEN_38DD_P_2) },
4572
    { "(bad)",  { XX } },
4573
  },
4574
 
4575
  /* PREFIX_VEX_38DE */
4576
  {
4577
    { "(bad)",  { XX } },
4578
    { "(bad)",  { XX } },
4579
    { VEX_LEN_TABLE (VEX_LEN_38DE_P_2) },
4580
    { "(bad)",  { XX } },
4581
  },
4582
 
4583
  /* PREFIX_VEX_38DF */
4584
  {
4585
    { "(bad)",  { XX } },
4586
    { "(bad)",  { XX } },
4587
    { VEX_LEN_TABLE (VEX_LEN_38DF_P_2) },
4588
    { "(bad)",  { XX } },
4589
  },
4590
 
4591
  /* PREFIX_VEX_3A04 */
4592
  {
4593
    { "(bad)",  { XX } },
4594
    { "(bad)",  { XX } },
4595
    { "vpermilps", { XM, EXx, Ib } },
4596
    { "(bad)",  { XX } },
4597
  },
4598
 
4599
  /* PREFIX_VEX_3A05 */
4600
  {
4601
    { "(bad)",  { XX } },
4602
    { "(bad)",  { XX } },
4603
    { "vpermilpd", { XM, EXx, Ib } },
4604
    { "(bad)",  { XX } },
4605
  },
4606
 
4607
  /* PREFIX_VEX_3A06 */
4608
  {
4609
    { "(bad)",  { XX } },
4610
    { "(bad)",  { XX } },
4611
    { VEX_LEN_TABLE (VEX_LEN_3A06_P_2) },
4612
    { "(bad)",  { XX } },
4613
  },
4614
 
4615
  /* PREFIX_VEX_3A08 */
4616
  {
4617
    { "(bad)",  { XX } },
4618
    { "(bad)",  { XX } },
4619
    { "vroundps", { XM, EXx, Ib } },
4620
    { "(bad)",  { XX } },
4621
  },
4622
 
4623
  /* PREFIX_VEX_3A09 */
4624
  {
4625
    { "(bad)",  { XX } },
4626
    { "(bad)",  { XX } },
4627
    { "vroundpd", { XM, EXx, Ib } },
4628
    { "(bad)",  { XX } },
4629
  },
4630
 
4631
  /* PREFIX_VEX_3A0A */
4632
  {
4633
    { "(bad)",  { XX } },
4634
    { "(bad)",  { XX } },
4635
    { VEX_LEN_TABLE (VEX_LEN_3A0A_P_2) },
4636
    { "(bad)",  { XX } },
4637
  },
4638
 
4639
  /* PREFIX_VEX_3A0B */
4640
  {
4641
    { "(bad)",  { XX } },
4642
    { "(bad)",  { XX } },
4643
    { VEX_LEN_TABLE (VEX_LEN_3A0B_P_2) },
4644
    { "(bad)",  { XX } },
4645
  },
4646
 
4647
  /* PREFIX_VEX_3A0C */
4648
  {
4649
    { "(bad)",  { XX } },
4650
    { "(bad)",  { XX } },
4651
    { "vblendps", { XM, Vex, EXx, Ib } },
4652
    { "(bad)",  { XX } },
4653
  },
4654
 
4655
  /* PREFIX_VEX_3A0D */
4656
  {
4657
    { "(bad)",  { XX } },
4658
    { "(bad)",  { XX } },
4659
    { "vblendpd", { XM, Vex, EXx, Ib } },
4660
    { "(bad)",  { XX } },
4661
  },
4662
 
4663
  /* PREFIX_VEX_3A0E */
4664
  {
4665
    { "(bad)",  { XX } },
4666
    { "(bad)",  { XX } },
4667
    { VEX_LEN_TABLE (VEX_LEN_3A0E_P_2) },
4668
    { "(bad)",  { XX } },
4669
  },
4670
 
4671
  /* PREFIX_VEX_3A0F */
4672
  {
4673
    { "(bad)",  { XX } },
4674
    { "(bad)",  { XX } },
4675
    { VEX_LEN_TABLE (VEX_LEN_3A0F_P_2) },
4676
    { "(bad)",  { XX } },
4677
  },
4678
 
4679
  /* PREFIX_VEX_3A14 */
4680
  {
4681
    { "(bad)",  { XX } },
4682
    { "(bad)",  { XX } },
4683
    { VEX_LEN_TABLE (VEX_LEN_3A14_P_2) },
4684
    { "(bad)",  { XX } },
4685
  },
4686
 
4687
  /* PREFIX_VEX_3A15 */
4688
  {
4689
    { "(bad)",  { XX } },
4690
    { "(bad)",  { XX } },
4691
    { VEX_LEN_TABLE (VEX_LEN_3A15_P_2) },
4692
    { "(bad)",  { XX } },
4693
  },
4694
 
4695
  /* PREFIX_VEX_3A16 */
4696
  {
4697
    { "(bad)",  { XX } },
4698
    { "(bad)",  { XX } },
4699
    { VEX_LEN_TABLE (VEX_LEN_3A16_P_2) },
4700
    { "(bad)",  { XX } },
4701
  },
4702
 
4703
  /* PREFIX_VEX_3A17 */
4704
  {
4705
    { "(bad)",  { XX } },
4706
    { "(bad)",  { XX } },
4707
    { VEX_LEN_TABLE (VEX_LEN_3A17_P_2) },
4708
    { "(bad)",  { XX } },
4709
  },
4710
 
4711
  /* PREFIX_VEX_3A18 */
4712
  {
4713
    { "(bad)",  { XX } },
4714
    { "(bad)",  { XX } },
4715
    { VEX_LEN_TABLE (VEX_LEN_3A18_P_2) },
4716
    { "(bad)",  { XX } },
4717
  },
4718
 
4719
  /* PREFIX_VEX_3A19 */
4720
  {
4721
    { "(bad)",  { XX } },
4722
    { "(bad)",  { XX } },
4723
    { VEX_LEN_TABLE (VEX_LEN_3A19_P_2) },
4724
    { "(bad)",  { XX } },
4725
  },
4726
 
4727
  /* PREFIX_VEX_3A20 */
4728
  {
4729
    { "(bad)",  { XX } },
4730
    { "(bad)",  { XX } },
4731
    { VEX_LEN_TABLE (VEX_LEN_3A20_P_2) },
4732
    { "(bad)",  { XX } },
4733
  },
4734
 
4735
  /* PREFIX_VEX_3A21 */
4736
  {
4737
    { "(bad)",  { XX } },
4738
    { "(bad)",  { XX } },
4739
    { VEX_LEN_TABLE (VEX_LEN_3A21_P_2) },
4740
    { "(bad)",  { XX } },
4741
  },
4742
 
4743
  /* PREFIX_VEX_3A22 */
4744
  {
4745
    { "(bad)",  { XX } },
4746
    { "(bad)",  { XX } },
4747
    { VEX_LEN_TABLE (VEX_LEN_3A22_P_2) },
4748
    { "(bad)",  { XX } },
4749
  },
4750
 
4751
  /* PREFIX_VEX_3A40 */
4752
  {
4753
    { "(bad)",  { XX } },
4754
    { "(bad)",  { XX } },
4755
    { "vdpps",  { XM, Vex, EXx, Ib } },
4756
    { "(bad)",  { XX } },
4757
  },
4758
 
4759
  /* PREFIX_VEX_3A41 */
4760
  {
4761
    { "(bad)",  { XX } },
4762
    { "(bad)",  { XX } },
4763
    { VEX_LEN_TABLE (VEX_LEN_3A41_P_2) },
4764
    { "(bad)",  { XX } },
4765
  },
4766
 
4767
  /* PREFIX_VEX_3A42 */
4768
  {
4769
    { "(bad)",  { XX } },
4770
    { "(bad)",  { XX } },
4771
    { VEX_LEN_TABLE (VEX_LEN_3A42_P_2) },
4772
    { "(bad)",  { XX } },
4773
  },
4774
 
4775
  /* PREFIX_VEX_3A48 */
4776
  {
4777
    { "(bad)",  { XX } },
4778
    { "(bad)",  { XX } },
4779
    { "vpermil2ps", { XMVexW, Vex, EXVexImmW, EXVexImmW, VPERMIL2 } },
4780
    { "(bad)",  { XX } },
4781
  },
4782
 
4783
  /* PREFIX_VEX_3A49 */
4784
  {
4785
    { "(bad)",  { XX } },
4786
    { "(bad)",  { XX } },
4787
    { "vpermil2pd", { XMVexW, Vex, EXVexImmW, EXVexImmW, VPERMIL2 } },
4788
    { "(bad)",  { XX } },
4789
  },
4790
 
4791
  /* PREFIX_VEX_3A4A */
4792
  {
4793
    { "(bad)",  { XX } },
4794
    { "(bad)",  { XX } },
4795
    { "vblendvps", { XM, Vex, EXx, XMVexI4 } },
4796
    { "(bad)",  { XX } },
4797
  },
4798
 
4799
  /* PREFIX_VEX_3A4B */
4800
  {
4801
    { "(bad)",  { XX } },
4802
    { "(bad)",  { XX } },
4803
    { "vblendvpd", { XM, Vex, EXx, XMVexI4 } },
4804
    { "(bad)",  { XX } },
4805
  },
4806
 
4807
  /* PREFIX_VEX_3A4C */
4808
  {
4809
    { "(bad)",  { XX } },
4810
    { "(bad)",  { XX } },
4811
    { VEX_LEN_TABLE (VEX_LEN_3A4C_P_2) },
4812
    { "(bad)",  { XX } },
4813
  },
4814
 
4815
  /* PREFIX_VEX_3A5C */
4816
  {
4817
    { "(bad)",  { XX } },
4818
    { "(bad)",  { XX } },
4819
    { "vfmaddsubps", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
4820
    { "(bad)",  { XX } },
4821
  },
4822
 
4823
  /* PREFIX_VEX_3A5D */
4824
  {
4825
    { "(bad)",  { XX } },
4826
    { "(bad)",  { XX } },
4827
    { "vfmaddsubpd", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
4828
    { "(bad)",  { XX } },
4829
  },
4830
 
4831
  /* PREFIX_VEX_3A5E */
4832
  {
4833
    { "(bad)",  { XX } },
4834
    { "(bad)",  { XX } },
4835
    { "vfmsubaddps", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
4836
    { "(bad)",  { XX } },
4837
  },
4838
 
4839
  /* PREFIX_VEX_3A5F */
4840
  {
4841
    { "(bad)",  { XX } },
4842
    { "(bad)",  { XX } },
4843
    { "vfmsubaddpd", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
4844
    { "(bad)",  { XX } },
4845
  },
4846
 
4847
  /* PREFIX_VEX_3A60 */
4848
  {
4849
    { "(bad)",  { XX } },
4850
    { "(bad)",  { XX } },
4851
    { VEX_LEN_TABLE (VEX_LEN_3A60_P_2) },
4852
    { "(bad)",  { XX } },
4853
  },
4854
 
4855
  /* PREFIX_VEX_3A61 */
4856
  {
4857
    { "(bad)",  { XX } },
4858
    { "(bad)",  { XX } },
4859
    { VEX_LEN_TABLE (VEX_LEN_3A61_P_2) },
4860
    { "(bad)",  { XX } },
4861
  },
4862
 
4863
  /* PREFIX_VEX_3A62 */
4864
  {
4865
    { "(bad)",  { XX } },
4866
    { "(bad)",  { XX } },
4867
    { VEX_LEN_TABLE (VEX_LEN_3A62_P_2) },
4868
    { "(bad)",  { XX } },
4869
  },
4870
 
4871
  /* PREFIX_VEX_3A63 */
4872
  {
4873
    { "(bad)",  { XX } },
4874
    { "(bad)",  { XX } },
4875
    { VEX_LEN_TABLE (VEX_LEN_3A63_P_2) },
4876
    { "(bad)",  { XX } },
4877
  },
4878
 
4879
  /* PREFIX_VEX_3A68 */
4880
  {
4881
    { "(bad)",  { XX } },
4882
    { "(bad)",  { XX } },
4883
    { "vfmaddps", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
4884
    { "(bad)",  { XX } },
4885
  },
4886
 
4887
  /* PREFIX_VEX_3A69 */
4888
  {
4889
    { "(bad)",  { XX } },
4890
    { "(bad)",  { XX } },
4891
    { "vfmaddpd", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
4892
    { "(bad)",  { XX } },
4893
  },
4894
 
4895
  /* PREFIX_VEX_3A6A */
4896
  {
4897
    { "(bad)",  { XX } },
4898
    { "(bad)",  { XX } },
4899
    { VEX_LEN_TABLE (VEX_LEN_3A6A_P_2) },
4900
    { "(bad)",  { XX } },
4901
  },
4902
 
4903
  /* PREFIX_VEX_3A6B */
4904
  {
4905
    { "(bad)",  { XX } },
4906
    { "(bad)",  { XX } },
4907
    { VEX_LEN_TABLE (VEX_LEN_3A6B_P_2) },
4908
    { "(bad)",  { XX } },
4909
  },
4910
 
4911
  /* PREFIX_VEX_3A6C */
4912
  {
4913
    { "(bad)",  { XX } },
4914
    { "(bad)",  { XX } },
4915
    { "vfmsubps", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
4916
    { "(bad)",  { XX } },
4917
  },
4918
 
4919
  /* PREFIX_VEX_3A6D */
4920
  {
4921
    { "(bad)",  { XX } },
4922
    { "(bad)",  { XX } },
4923
    { "vfmsubpd", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
4924
    { "(bad)",  { XX } },
4925
  },
4926
 
4927
  /* PREFIX_VEX_3A6E */
4928
  {
4929
    { "(bad)",  { XX } },
4930
    { "(bad)",  { XX } },
4931
    { VEX_LEN_TABLE (VEX_LEN_3A6E_P_2) },
4932
    { "(bad)",  { XX } },
4933
  },
4934
 
4935
  /* PREFIX_VEX_3A6F */
4936
  {
4937
    { "(bad)",  { XX } },
4938
    { "(bad)",  { XX } },
4939
    { VEX_LEN_TABLE (VEX_LEN_3A6F_P_2) },
4940
    { "(bad)",  { XX } },
4941
  },
4942
 
4943
  /* PREFIX_VEX_3A78 */
4944
  {
4945
    { "(bad)",  { XX } },
4946
    { "(bad)",  { XX } },
4947
    { "vfnmaddps", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
4948
    { "(bad)",  { XX } },
4949
  },
4950
 
4951
  /* PREFIX_VEX_3A79 */
4952
  {
4953
    { "(bad)",  { XX } },
4954
    { "(bad)",  { XX } },
4955
    { "vfnmaddpd", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
4956
    { "(bad)",  { XX } },
4957
  },
4958
 
4959
  /* PREFIX_VEX_3A7A */
4960
  {
4961
    { "(bad)",  { XX } },
4962
    { "(bad)",  { XX } },
4963
    { VEX_LEN_TABLE (VEX_LEN_3A7A_P_2) },
4964
    { "(bad)",  { XX } },
4965
  },
4966
 
4967
  /* PREFIX_VEX_3A7B */
4968
  {
4969
    { "(bad)",  { XX } },
4970
    { "(bad)",  { XX } },
4971
    { VEX_LEN_TABLE (VEX_LEN_3A7B_P_2) },
4972
    { "(bad)",  { XX } },
4973
  },
4974
 
4975
  /* PREFIX_VEX_3A7C */
4976
  {
4977
    { "(bad)",  { XX } },
4978
    { "(bad)",  { XX } },
4979
    { "vfnmsubps", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
4980
    { "(bad)",  { XX } },
4981
  },
4982
 
4983
  /* PREFIX_VEX_3A7D */
4984
  {
4985
    { "(bad)",  { XX } },
4986
    { "(bad)",  { XX } },
4987
    { "vfnmsubpd", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } },
4988
    { "(bad)",  { XX } },
4989
  },
4990
 
4991
  /* PREFIX_VEX_3A7E */
4992
  {
4993
    { "(bad)",  { XX } },
4994
    { "(bad)",  { XX } },
4995
    { VEX_LEN_TABLE (VEX_LEN_3A7E_P_2) },
4996
    { "(bad)",  { XX } },
4997
  },
4998
 
4999
  /* PREFIX_VEX_3A7F */
5000
  {
5001
    { "(bad)",  { XX } },
5002
    { "(bad)",  { XX } },
5003
    { VEX_LEN_TABLE (VEX_LEN_3A7F_P_2) },
5004
    { "(bad)",  { XX } },
5005
  },
5006
 
5007
  /* PREFIX_VEX_3ADF */
5008
  {
5009
    { "(bad)",  { XX } },
5010
    { "(bad)",  { XX } },
5011
    { VEX_LEN_TABLE (VEX_LEN_3ADF_P_2) },
5012
    { "(bad)",  { XX } },
5013
  },
5014
};
5015
 
5016
static const struct dis386 x86_64_table[][2] = {
5017
  /* X86_64_06 */
5018
  {
5019
    { "push{T|}", { es } },
5020
    { "(bad)", { XX } },
5021
  },
5022
 
5023
  /* X86_64_07 */
5024
  {
5025
    { "pop{T|}", { es } },
5026
    { "(bad)", { XX } },
5027
  },
5028
 
5029
  /* X86_64_0D */
5030
  {
5031
    { "push{T|}", { cs } },
5032
    { "(bad)", { XX } },
5033
  },
5034
 
5035
  /* X86_64_16 */
5036
  {
5037
    { "push{T|}", { ss } },
5038
    { "(bad)", { XX } },
5039
  },
5040
 
5041
  /* X86_64_17 */
5042
  {
5043
    { "pop{T|}", { ss } },
5044
    { "(bad)", { XX } },
5045
  },
5046
 
5047
  /* X86_64_1E */
5048
  {
5049
    { "push{T|}", { ds } },
5050
    { "(bad)", { XX } },
5051
  },
5052
 
5053
  /* X86_64_1F */
5054
  {
5055
    { "pop{T|}", { ds } },
5056
    { "(bad)", { XX } },
5057
  },
5058
 
5059
  /* X86_64_27 */
5060
  {
5061
    { "daa", { XX } },
5062
    { "(bad)", { XX } },
5063
  },
5064
 
5065
  /* X86_64_2F */
5066
  {
5067
    { "das", { XX } },
5068
    { "(bad)", { XX } },
5069
  },
5070
 
5071
  /* X86_64_37 */
5072
  {
5073
    { "aaa", { XX } },
5074
    { "(bad)", { XX } },
5075
  },
5076
 
5077
  /* X86_64_3F */
5078
  {
5079
    { "aas", { XX } },
5080
    { "(bad)", { XX } },
5081
  },
5082
 
5083
  /* X86_64_60 */
5084
  {
5085
    { "pusha{P|}", { XX } },
5086
    { "(bad)", { XX } },
5087
  },
5088
 
5089
  /* X86_64_61 */
5090
  {
5091
    { "popa{P|}", { XX } },
5092
    { "(bad)", { XX } },
5093
  },
5094
 
5095
  /* X86_64_62 */
5096
  {
5097
    { MOD_TABLE (MOD_62_32BIT) },
5098
    { "(bad)", { XX } },
5099
  },
5100
 
5101
  /* X86_64_63 */
5102
  {
5103
    { "arpl", { Ew, Gw } },
5104
    { "movs{lq|xd}", { Gv, Ed } },
5105
  },
5106
 
5107
  /* X86_64_6D */
5108
  {
5109
    { "ins{R|}", { Yzr, indirDX } },
5110
    { "ins{G|}", { Yzr, indirDX } },
5111
  },
5112
 
5113
  /* X86_64_6F */
5114
  {
5115
    { "outs{R|}", { indirDXr, Xz } },
5116
    { "outs{G|}", { indirDXr, Xz } },
5117
  },
5118
 
5119
  /* X86_64_9A */
5120
  {
5121
    { "Jcall{T|}", { Ap } },
5122
    { "(bad)", { XX } },
5123
  },
5124
 
5125
  /* X86_64_C4 */
5126
  {
5127
    { MOD_TABLE (MOD_C4_32BIT) },
5128
    { VEX_C4_TABLE (VEX_0F) },
5129
  },
5130
 
5131
  /* X86_64_C5 */
5132
  {
5133
    { MOD_TABLE (MOD_C5_32BIT) },
5134
    { VEX_C5_TABLE (VEX_0F) },
5135
  },
5136
 
5137
  /* X86_64_CE */
5138
  {
5139
    { "into", { XX } },
5140
    { "(bad)", { XX } },
5141
  },
5142
 
5143
  /* X86_64_D4 */
5144
  {
5145
    { "aam", { sIb } },
5146
    { "(bad)", { XX } },
5147
  },
5148
 
5149
  /* X86_64_D5 */
5150
  {
5151
    { "aad", { sIb } },
5152
    { "(bad)", { XX } },
5153
  },
5154
 
5155
  /* X86_64_EA */
5156
  {
5157
    { "Jjmp{T|}", { Ap } },
5158
    { "(bad)", { XX } },
5159
  },
5160
 
5161
  /* X86_64_0F01_REG_0 */
5162
  {
5163
    { "sgdt{Q|IQ}", { M } },
5164
    { "sgdt", { M } },
5165
  },
5166
 
5167
  /* X86_64_0F01_REG_1 */
5168
  {
5169
    { "sidt{Q|IQ}", { M } },
5170
    { "sidt", { M } },
5171
  },
5172
 
5173
  /* X86_64_0F01_REG_2 */
5174
  {
5175
    { "lgdt{Q|Q}", { M } },
5176
    { "lgdt", { M } },
5177
  },
5178
 
5179
  /* X86_64_0F01_REG_3 */
5180
  {
5181
    { "lidt{Q|Q}", { M } },
5182
    { "lidt", { M } },
5183
  },
5184
};
5185
 
5186
static const struct dis386 three_byte_table[][256] = {
5187
  /* THREE_BYTE_0F24 */
5188
  {
5189
    /* 00 */
5190
    { "fmaddps",        { { OP_DREX4, q_mode } } },
5191
    { "fmaddpd",        { { OP_DREX4, q_mode } } },
5192
    { "fmaddss",        { { OP_DREX4, w_mode } } },
5193
    { "fmaddsd",        { { OP_DREX4, d_mode } } },
5194
    { "fmaddps",        { { OP_DREX4, DREX_OC1 + q_mode } } },
5195
    { "fmaddpd",        { { OP_DREX4, DREX_OC1 + q_mode } } },
5196
    { "fmaddss",        { { OP_DREX4, DREX_OC1 + w_mode } } },
5197
    { "fmaddsd",        { { OP_DREX4, DREX_OC1 + d_mode } } },
5198
    /* 08 */
5199
    { "fmsubps",        { { OP_DREX4, q_mode } } },
5200
    { "fmsubpd",        { { OP_DREX4, q_mode } } },
5201
    { "fmsubss",        { { OP_DREX4, w_mode } } },
5202
    { "fmsubsd",        { { OP_DREX4, d_mode } } },
5203
    { "fmsubps",        { { OP_DREX4, DREX_OC1 + q_mode } } },
5204
    { "fmsubpd",        { { OP_DREX4, DREX_OC1 + q_mode } } },
5205
    { "fmsubss",        { { OP_DREX4, DREX_OC1 + w_mode } } },
5206
    { "fmsubsd",        { { OP_DREX4, DREX_OC1 + d_mode } } },
5207
    /* 10 */
5208
    { "fnmaddps",       { { OP_DREX4, q_mode } } },
5209
    { "fnmaddpd",       { { OP_DREX4, q_mode } } },
5210
    { "fnmaddss",       { { OP_DREX4, w_mode } } },
5211
    { "fnmaddsd",       { { OP_DREX4, d_mode } } },
5212
    { "fnmaddps",       { { OP_DREX4, DREX_OC1 + q_mode } } },
5213
    { "fnmaddpd",       { { OP_DREX4, DREX_OC1 + q_mode } } },
5214
    { "fnmaddss",       { { OP_DREX4, DREX_OC1 + w_mode } } },
5215
    { "fnmaddsd",       { { OP_DREX4, DREX_OC1 + d_mode } } },
5216
    /* 18 */
5217
    { "fnmsubps",       { { OP_DREX4, q_mode } } },
5218
    { "fnmsubpd",       { { OP_DREX4, q_mode } } },
5219
    { "fnmsubss",       { { OP_DREX4, w_mode } } },
5220
    { "fnmsubsd",       { { OP_DREX4, d_mode } } },
5221
    { "fnmsubps",       { { OP_DREX4, DREX_OC1 + q_mode } } },
5222
    { "fnmsubpd",       { { OP_DREX4, DREX_OC1 + q_mode } } },
5223
    { "fnmsubss",       { { OP_DREX4, DREX_OC1 + w_mode } } },
5224
    { "fnmsubsd",       { { OP_DREX4, DREX_OC1 + d_mode } } },
5225
    /* 20 */
5226
    { "permps",         { { OP_DREX4, q_mode } } },
5227
    { "permpd",         { { OP_DREX4, q_mode } } },
5228
    { "pcmov",          { { OP_DREX4, q_mode } } },
5229
    { "pperm",          { { OP_DREX4, q_mode } } },
5230
    { "permps",         { { OP_DREX4, DREX_OC1 + q_mode } } },
5231
    { "permpd",         { { OP_DREX4, DREX_OC1 + q_mode } } },
5232
    { "pcmov",          { { OP_DREX4, DREX_OC1 + w_mode } } },
5233
    { "pperm",          { { OP_DREX4, DREX_OC1 + d_mode } } },
5234
    /* 28 */
5235
    { "(bad)",          { XX } },
5236
    { "(bad)",          { XX } },
5237
    { "(bad)",          { XX } },
5238
    { "(bad)",          { XX } },
5239
    { "(bad)",          { XX } },
5240
    { "(bad)",          { XX } },
5241
    { "(bad)",          { XX } },
5242
    { "(bad)",          { XX } },
5243
    /* 30 */
5244
    { "(bad)",          { XX } },
5245
    { "(bad)",          { XX } },
5246
    { "(bad)",          { XX } },
5247
    { "(bad)",          { XX } },
5248
    { "(bad)",          { XX } },
5249
    { "(bad)",          { XX } },
5250
    { "(bad)",          { XX } },
5251
    { "(bad)",          { XX } },
5252
    /* 38 */
5253
    { "(bad)",          { XX } },
5254
    { "(bad)",          { XX } },
5255
    { "(bad)",          { XX } },
5256
    { "(bad)",          { XX } },
5257
    { "(bad)",          { XX } },
5258
    { "(bad)",          { XX } },
5259
    { "(bad)",          { XX } },
5260
    { "(bad)",          { XX } },
5261
    /* 40 */
5262
    { "protb",          { { OP_DREX3, q_mode } } },
5263
    { "protw",          { { OP_DREX3, q_mode } } },
5264
    { "protd",          { { OP_DREX3, q_mode } } },
5265
    { "protq",          { { OP_DREX3, q_mode } } },
5266
    { "pshlb",          { { OP_DREX3, q_mode } } },
5267
    { "pshlw",          { { OP_DREX3, q_mode } } },
5268
    { "pshld",          { { OP_DREX3, q_mode } } },
5269
    { "pshlq",          { { OP_DREX3, q_mode } } },
5270
    /* 48 */
5271
    { "pshab",          { { OP_DREX3, q_mode } } },
5272
    { "pshaw",          { { OP_DREX3, q_mode } } },
5273
    { "pshad",          { { OP_DREX3, q_mode } } },
5274
    { "pshaq",          { { OP_DREX3, q_mode } } },
5275
    { "(bad)",          { XX } },
5276
    { "(bad)",          { XX } },
5277
    { "(bad)",          { XX } },
5278
    { "(bad)",          { XX } },
5279
    /* 50 */
5280
    { "(bad)",          { XX } },
5281
    { "(bad)",          { XX } },
5282
    { "(bad)",          { XX } },
5283
    { "(bad)",          { XX } },
5284
    { "(bad)",          { XX } },
5285
    { "(bad)",          { XX } },
5286
    { "(bad)",          { XX } },
5287
    { "(bad)",          { XX } },
5288
    /* 58 */
5289
    { "(bad)",          { XX } },
5290
    { "(bad)",          { XX } },
5291
    { "(bad)",          { XX } },
5292
    { "(bad)",          { XX } },
5293
    { "(bad)",          { XX } },
5294
    { "(bad)",          { XX } },
5295
    { "(bad)",          { XX } },
5296
    { "(bad)",          { XX } },
5297
    /* 60 */
5298
    { "(bad)",          { XX } },
5299
    { "(bad)",          { XX } },
5300
    { "(bad)",          { XX } },
5301
    { "(bad)",          { XX } },
5302
    { "(bad)",          { XX } },
5303
    { "(bad)",          { XX } },
5304
    { "(bad)",          { XX } },
5305
    { "(bad)",          { XX } },
5306
    /* 68 */
5307
    { "(bad)",          { XX } },
5308
    { "(bad)",          { XX } },
5309
    { "(bad)",          { XX } },
5310
    { "(bad)",          { XX } },
5311
    { "(bad)",          { XX } },
5312
    { "(bad)",          { XX } },
5313
    { "(bad)",          { XX } },
5314
    { "(bad)",          { XX } },
5315
    /* 70 */
5316
    { "(bad)",          { XX } },
5317
    { "(bad)",          { XX } },
5318
    { "(bad)",          { XX } },
5319
    { "(bad)",          { XX } },
5320
    { "(bad)",          { XX } },
5321
    { "(bad)",          { XX } },
5322
    { "(bad)",          { XX } },
5323
    { "(bad)",          { XX } },
5324
    /* 78 */
5325
    { "(bad)",          { XX } },
5326
    { "(bad)",          { XX } },
5327
    { "(bad)",          { XX } },
5328
    { "(bad)",          { XX } },
5329
    { "(bad)",          { XX } },
5330
    { "(bad)",          { XX } },
5331
    { "(bad)",          { XX } },
5332
    { "(bad)",          { XX } },
5333
    /* 80 */
5334
    { "(bad)",          { XX } },
5335
    { "(bad)",          { XX } },
5336
    { "(bad)",          { XX } },
5337
    { "(bad)",          { XX } },
5338
    { "(bad)",          { XX } },
5339
    { "pmacssww",       { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5340
    { "pmacsswd",       { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5341
    { "pmacssdql",      { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5342
    /* 88 */
5343
    { "(bad)",          { XX } },
5344
    { "(bad)",          { XX } },
5345
    { "(bad)",          { XX } },
5346
    { "(bad)",          { XX } },
5347
    { "(bad)",          { XX } },
5348
    { "(bad)",          { XX } },
5349
    { "pmacssdd",       { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5350
    { "pmacssdqh",      { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5351
    /* 90 */
5352
    { "(bad)",          { XX } },
5353
    { "(bad)",          { XX } },
5354
    { "(bad)",          { XX } },
5355
    { "(bad)",          { XX } },
5356
    { "(bad)",          { XX } },
5357
    { "pmacsww",        { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5358
    { "pmacswd",        { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5359
    { "pmacsdql",       { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5360
    /* 98 */
5361
    { "(bad)",          { XX } },
5362
    { "(bad)",          { XX } },
5363
    { "(bad)",          { XX } },
5364
    { "(bad)",          { XX } },
5365
    { "(bad)",          { XX } },
5366
    { "(bad)",          { XX } },
5367
    { "pmacsdd",        { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5368
    { "pmacsdqh",       { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5369
    /* a0 */
5370
    { "(bad)",          { XX } },
5371
    { "(bad)",          { XX } },
5372
    { "(bad)",          { XX } },
5373
    { "(bad)",          { XX } },
5374
    { "(bad)",          { XX } },
5375
    { "(bad)",          { XX } },
5376
    { "pmadcsswd",      { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5377
    { "(bad)",          { XX } },
5378
    /* a8 */
5379
    { "(bad)",          { XX } },
5380
    { "(bad)",          { XX } },
5381
    { "(bad)",          { XX } },
5382
    { "(bad)",          { XX } },
5383
    { "(bad)",          { XX } },
5384
    { "(bad)",          { XX } },
5385
    { "(bad)",          { XX } },
5386
    { "(bad)",          { XX } },
5387
    /* b0 */
5388
    { "(bad)",          { XX } },
5389
    { "(bad)",          { XX } },
5390
    { "(bad)",          { XX } },
5391
    { "(bad)",          { XX } },
5392
    { "(bad)",          { XX } },
5393
    { "(bad)",          { XX } },
5394
    { "pmadcswd",       { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
5395
    { "(bad)",          { XX } },
5396
    /* b8 */
5397
    { "(bad)",          { XX } },
5398
    { "(bad)",          { XX } },
5399
    { "(bad)",          { XX } },
5400
    { "(bad)",          { XX } },
5401
    { "(bad)",          { XX } },
5402
    { "(bad)",          { XX } },
5403
    { "(bad)",          { XX } },
5404
    { "(bad)",          { XX } },
5405
    /* c0 */
5406
    { "(bad)",          { XX } },
5407
    { "(bad)",          { XX } },
5408
    { "(bad)",          { XX } },
5409
    { "(bad)",          { XX } },
5410
    { "(bad)",          { XX } },
5411
    { "(bad)",          { XX } },
5412
    { "(bad)",          { XX } },
5413
    { "(bad)",          { XX } },
5414
    /* c8 */
5415
    { "(bad)",          { XX } },
5416
    { "(bad)",          { XX } },
5417
    { "(bad)",          { XX } },
5418
    { "(bad)",          { XX } },
5419
    { "(bad)",          { XX } },
5420
    { "(bad)",          { XX } },
5421
    { "(bad)",          { XX } },
5422
    { "(bad)",          { XX } },
5423
    /* d0 */
5424
    { "(bad)",          { XX } },
5425
    { "(bad)",          { XX } },
5426
    { "(bad)",          { XX } },
5427
    { "(bad)",          { XX } },
5428
    { "(bad)",          { XX } },
5429
    { "(bad)",          { XX } },
5430
    { "(bad)",          { XX } },
5431
    { "(bad)",          { XX } },
5432
    /* d8 */
5433
    { "(bad)",          { XX } },
5434
    { "(bad)",          { XX } },
5435
    { "(bad)",          { XX } },
5436
    { "(bad)",          { XX } },
5437
    { "(bad)",          { XX } },
5438
    { "(bad)",          { XX } },
5439
    { "(bad)",          { XX } },
5440
    { "(bad)",          { XX } },
5441
    /* e0 */
5442
    { "(bad)",          { XX } },
5443
    { "(bad)",          { XX } },
5444
    { "(bad)",          { XX } },
5445
    { "(bad)",          { XX } },
5446
    { "(bad)",          { XX } },
5447
    { "(bad)",          { XX } },
5448
    { "(bad)",          { XX } },
5449
    { "(bad)",          { XX } },
5450
    /* e8 */
5451
    { "(bad)",          { XX } },
5452
    { "(bad)",          { XX } },
5453
    { "(bad)",          { XX } },
5454
    { "(bad)",          { XX } },
5455
    { "(bad)",          { XX } },
5456
    { "(bad)",          { XX } },
5457
    { "(bad)",          { XX } },
5458
    { "(bad)",          { XX } },
5459
    /* f0 */
5460
    { "(bad)",          { XX } },
5461
    { "(bad)",          { XX } },
5462
    { "(bad)",          { XX } },
5463
    { "(bad)",          { XX } },
5464
    { "(bad)",          { XX } },
5465
    { "(bad)",          { XX } },
5466
    { "(bad)",          { XX } },
5467
    { "(bad)",          { XX } },
5468
    /* f8 */
5469
    { "(bad)",          { XX } },
5470
    { "(bad)",          { XX } },
5471
    { "(bad)",          { XX } },
5472
    { "(bad)",          { XX } },
5473
    { "(bad)",          { XX } },
5474
    { "(bad)",          { XX } },
5475
    { "(bad)",          { XX } },
5476
    { "(bad)",          { XX } },
5477
  },
5478
  /* THREE_BYTE_0F25 */
5479
  {
5480
    /* 00 */
5481
    { "(bad)",          { XX } },
5482
    { "(bad)",          { XX } },
5483
    { "(bad)",          { XX } },
5484
    { "(bad)",          { XX } },
5485
    { "(bad)",          { XX } },
5486
    { "(bad)",          { XX } },
5487
    { "(bad)",          { XX } },
5488
    { "(bad)",          { XX } },
5489
    /* 08 */
5490
    { "(bad)",          { XX } },
5491
    { "(bad)",          { XX } },
5492
    { "(bad)",          { XX } },
5493
    { "(bad)",          { XX } },
5494
    { "(bad)",          { XX } },
5495
    { "(bad)",          { XX } },
5496
    { "(bad)",          { XX } },
5497
    { "(bad)",          { XX } },
5498
    /* 10 */
5499
    { "(bad)",          { XX } },
5500
    { "(bad)",          { XX } },
5501
    { "(bad)",          { XX } },
5502
    { "(bad)",          { XX } },
5503
    { "(bad)",          { XX } },
5504
    { "(bad)",          { XX } },
5505
    { "(bad)",          { XX } },
5506
    { "(bad)",          { XX } },
5507
    /* 18 */
5508
    { "(bad)",          { XX } },
5509
    { "(bad)",          { XX } },
5510
    { "(bad)",          { XX } },
5511
    { "(bad)",          { XX } },
5512
    { "(bad)",          { XX } },
5513
    { "(bad)",          { XX } },
5514
    { "(bad)",          { XX } },
5515
    { "(bad)",          { XX } },
5516
    /* 20 */
5517
    { "(bad)",          { XX } },
5518
    { "(bad)",          { XX } },
5519
    { "(bad)",          { XX } },
5520
    { "(bad)",          { XX } },
5521
    { "(bad)",          { XX } },
5522
    { "(bad)",          { XX } },
5523
    { "(bad)",          { XX } },
5524
    { "(bad)",          { XX } },
5525
    /* 28 */
5526
    { "(bad)",          { XX } },
5527
    { "(bad)",          { XX } },
5528
    { "(bad)",          { XX } },
5529
    { "(bad)",          { XX } },
5530
    { "comps",          { { OP_DREX3, q_mode }, { OP_DREX_FCMP, b_mode } } },
5531
    { "compd",          { { OP_DREX3, q_mode }, { OP_DREX_FCMP, b_mode } } },
5532
    { "comss",          { { OP_DREX3, w_mode }, { OP_DREX_FCMP, b_mode } } },
5533
    { "comsd",          { { OP_DREX3, d_mode }, { OP_DREX_FCMP, b_mode } } },
5534
    /* 30 */
5535
    { "(bad)",          { XX } },
5536
    { "(bad)",          { XX } },
5537
    { "(bad)",          { XX } },
5538
    { "(bad)",          { XX } },
5539
    { "(bad)",          { XX } },
5540
    { "(bad)",          { XX } },
5541
    { "(bad)",          { XX } },
5542
    { "(bad)",          { XX } },
5543
    /* 38 */
5544
    { "(bad)",          { XX } },
5545
    { "(bad)",          { XX } },
5546
    { "(bad)",          { XX } },
5547
    { "(bad)",          { XX } },
5548
    { "(bad)",          { XX } },
5549
    { "(bad)",          { XX } },
5550
    { "(bad)",          { XX } },
5551
    { "(bad)",          { XX } },
5552
    /* 40 */
5553
    { "(bad)",          { XX } },
5554
    { "(bad)",          { XX } },
5555
    { "(bad)",          { XX } },
5556
    { "(bad)",          { XX } },
5557
    { "(bad)",          { XX } },
5558
    { "(bad)",          { XX } },
5559
    { "(bad)",          { XX } },
5560
    { "(bad)",          { XX } },
5561
    /* 48 */
5562
    { "(bad)",          { XX } },
5563
    { "(bad)",          { XX } },
5564
    { "(bad)",          { XX } },
5565
    { "(bad)",          { XX } },
5566
    { "pcomb",          { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5567
    { "pcomw",          { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5568
    { "pcomd",          { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5569
    { "pcomq",          { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5570
    /* 50 */
5571
    { "(bad)",          { XX } },
5572
    { "(bad)",          { XX } },
5573
    { "(bad)",          { XX } },
5574
    { "(bad)",          { XX } },
5575
    { "(bad)",          { XX } },
5576
    { "(bad)",          { XX } },
5577
    { "(bad)",          { XX } },
5578
    { "(bad)",          { XX } },
5579
    /* 58 */
5580
    { "(bad)",          { XX } },
5581
    { "(bad)",          { XX } },
5582
    { "(bad)",          { XX } },
5583
    { "(bad)",          { XX } },
5584
    { "(bad)",          { XX } },
5585
    { "(bad)",          { XX } },
5586
    { "(bad)",          { XX } },
5587
    { "(bad)",          { XX } },
5588
    /* 60 */
5589
    { "(bad)",          { XX } },
5590
    { "(bad)",          { XX } },
5591
    { "(bad)",          { XX } },
5592
    { "(bad)",          { XX } },
5593
    { "(bad)",          { XX } },
5594
    { "(bad)",          { XX } },
5595
    { "(bad)",          { XX } },
5596
    { "(bad)",          { XX } },
5597
    /* 68 */
5598
    { "(bad)",          { XX } },
5599
    { "(bad)",          { XX } },
5600
    { "(bad)",          { XX } },
5601
    { "(bad)",          { XX } },
5602
    { "pcomub",         { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5603
    { "pcomuw",         { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5604
    { "pcomud",         { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5605
    { "pcomuq",         { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
5606
    /* 70 */
5607
    { "(bad)",          { XX } },
5608
    { "(bad)",          { XX } },
5609
    { "(bad)",          { XX } },
5610
    { "(bad)",          { XX } },
5611
    { "(bad)",          { XX } },
5612
    { "(bad)",          { XX } },
5613
    { "(bad)",          { XX } },
5614
    { "(bad)",          { XX } },
5615
    /* 78 */
5616
    { "(bad)",          { XX } },
5617
    { "(bad)",          { XX } },
5618
    { "(bad)",          { XX } },
5619
    { "(bad)",          { XX } },
5620
    { "(bad)",          { XX } },
5621
    { "(bad)",          { XX } },
5622
    { "(bad)",          { XX } },
5623
    { "(bad)",          { XX } },
5624
    /* 80 */
5625
    { "(bad)",          { XX } },
5626
    { "(bad)",          { XX } },
5627
    { "(bad)",          { XX } },
5628
    { "(bad)",          { XX } },
5629
    { "(bad)",          { XX } },
5630
    { "(bad)",          { XX } },
5631
    { "(bad)",          { XX } },
5632
    { "(bad)",          { XX } },
5633
    /* 88 */
5634
    { "(bad)",          { XX } },
5635
    { "(bad)",          { XX } },
5636
    { "(bad)",          { XX } },
5637
    { "(bad)",          { XX } },
5638
    { "(bad)",          { XX } },
5639
    { "(bad)",          { XX } },
5640
    { "(bad)",          { XX } },
5641
    { "(bad)",          { XX } },
5642
    /* 90 */
5643
    { "(bad)",          { XX } },
5644
    { "(bad)",          { XX } },
5645
    { "(bad)",          { XX } },
5646
    { "(bad)",          { XX } },
5647
    { "(bad)",          { XX } },
5648
    { "(bad)",          { XX } },
5649
    { "(bad)",          { XX } },
5650
    { "(bad)",          { XX } },
5651
    /* 98 */
5652
    { "(bad)",          { XX } },
5653
    { "(bad)",          { XX } },
5654
    { "(bad)",          { XX } },
5655
    { "(bad)",          { XX } },
5656
    { "(bad)",          { XX } },
5657
    { "(bad)",          { XX } },
5658
    { "(bad)",          { XX } },
5659
    { "(bad)",          { XX } },
5660
    /* a0 */
5661
    { "(bad)",          { XX } },
5662
    { "(bad)",          { XX } },
5663
    { "(bad)",          { XX } },
5664
    { "(bad)",          { XX } },
5665
    { "(bad)",          { XX } },
5666
    { "(bad)",          { XX } },
5667
    { "(bad)",          { XX } },
5668
    { "(bad)",          { XX } },
5669
    /* a8 */
5670
    { "(bad)",          { XX } },
5671
    { "(bad)",          { XX } },
5672
    { "(bad)",          { XX } },
5673
    { "(bad)",          { XX } },
5674
    { "(bad)",          { XX } },
5675
    { "(bad)",          { XX } },
5676
    { "(bad)",          { XX } },
5677
    { "(bad)",          { XX } },
5678
    /* b0 */
5679
    { "(bad)",          { XX } },
5680
    { "(bad)",          { XX } },
5681
    { "(bad)",          { XX } },
5682
    { "(bad)",          { XX } },
5683
    { "(bad)",          { XX } },
5684
    { "(bad)",          { XX } },
5685
    { "(bad)",          { XX } },
5686
    { "(bad)",          { XX } },
5687
    /* b8 */
5688
    { "(bad)",          { XX } },
5689
    { "(bad)",          { XX } },
5690
    { "(bad)",          { XX } },
5691
    { "(bad)",          { XX } },
5692
    { "(bad)",          { XX } },
5693
    { "(bad)",          { XX } },
5694
    { "(bad)",          { XX } },
5695
    { "(bad)",          { XX } },
5696
    /* c0 */
5697
    { "(bad)",          { XX } },
5698
    { "(bad)",          { XX } },
5699
    { "(bad)",          { XX } },
5700
    { "(bad)",          { XX } },
5701
    { "(bad)",          { XX } },
5702
    { "(bad)",          { XX } },
5703
    { "(bad)",          { XX } },
5704
    { "(bad)",          { XX } },
5705
    /* c8 */
5706
    { "(bad)",          { XX } },
5707
    { "(bad)",          { XX } },
5708
    { "(bad)",          { XX } },
5709
    { "(bad)",          { XX } },
5710
    { "(bad)",          { XX } },
5711
    { "(bad)",          { XX } },
5712
    { "(bad)",          { XX } },
5713
    { "(bad)",          { XX } },
5714
    /* d0 */
5715
    { "(bad)",          { XX } },
5716
    { "(bad)",          { XX } },
5717
    { "(bad)",          { XX } },
5718
    { "(bad)",          { XX } },
5719
    { "(bad)",          { XX } },
5720
    { "(bad)",          { XX } },
5721
    { "(bad)",          { XX } },
5722
    { "(bad)",          { XX } },
5723
    /* d8 */
5724
    { "(bad)",          { XX } },
5725
    { "(bad)",          { XX } },
5726
    { "(bad)",          { XX } },
5727
    { "(bad)",          { XX } },
5728
    { "(bad)",          { XX } },
5729
    { "(bad)",          { XX } },
5730
    { "(bad)",          { XX } },
5731
    { "(bad)",          { XX } },
5732
    /* e0 */
5733
    { "(bad)",          { XX } },
5734
    { "(bad)",          { XX } },
5735
    { "(bad)",          { XX } },
5736
    { "(bad)",          { XX } },
5737
    { "(bad)",          { XX } },
5738
    { "(bad)",          { XX } },
5739
    { "(bad)",          { XX } },
5740
    { "(bad)",          { XX } },
5741
    /* e8 */
5742
    { "(bad)",          { XX } },
5743
    { "(bad)",          { XX } },
5744
    { "(bad)",          { XX } },
5745
    { "(bad)",          { XX } },
5746
    { "(bad)",          { XX } },
5747
    { "(bad)",          { XX } },
5748
    { "(bad)",          { XX } },
5749
    { "(bad)",          { XX } },
5750
    /* f0 */
5751
    { "(bad)",          { XX } },
5752
    { "(bad)",          { XX } },
5753
    { "(bad)",          { XX } },
5754
    { "(bad)",          { XX } },
5755
    { "(bad)",          { XX } },
5756
    { "(bad)",          { XX } },
5757
    { "(bad)",          { XX } },
5758
    { "(bad)",          { XX } },
5759
    /* f8 */
5760
    { "(bad)",          { XX } },
5761
    { "(bad)",          { XX } },
5762
    { "(bad)",          { XX } },
5763
    { "(bad)",          { XX } },
5764
    { "(bad)",          { XX } },
5765
    { "(bad)",          { XX } },
5766
    { "(bad)",          { XX } },
5767
    { "(bad)",          { XX } },
5768
  },
5769
  /* THREE_BYTE_0F38 */
5770
  {
5771
    /* 00 */
5772
    { "pshufb",         { MX, EM } },
5773
    { "phaddw",         { MX, EM } },
5774
    { "phaddd",         { MX, EM } },
5775
    { "phaddsw",        { MX, EM } },
5776
    { "pmaddubsw",      { MX, EM } },
5777
    { "phsubw",         { MX, EM } },
5778
    { "phsubd",         { MX, EM } },
5779
    { "phsubsw",        { MX, EM } },
5780
    /* 08 */
5781
    { "psignb",         { MX, EM } },
5782
    { "psignw",         { MX, EM } },
5783
    { "psignd",         { MX, EM } },
5784
    { "pmulhrsw",       { MX, EM } },
5785
    { "(bad)",          { XX } },
5786
    { "(bad)",          { XX } },
5787
    { "(bad)",          { XX } },
5788
    { "(bad)",          { XX } },
5789
    /* 10 */
5790
    { PREFIX_TABLE (PREFIX_0F3810) },
5791
    { "(bad)",          { XX } },
5792
    { "(bad)",          { XX } },
5793
    { "(bad)",          { XX } },
5794
    { PREFIX_TABLE (PREFIX_0F3814) },
5795
    { PREFIX_TABLE (PREFIX_0F3815) },
5796
    { "(bad)",          { XX } },
5797
    { PREFIX_TABLE (PREFIX_0F3817) },
5798
    /* 18 */
5799
    { "(bad)",          { XX } },
5800
    { "(bad)",          { XX } },
5801
    { "(bad)",          { XX } },
5802
    { "(bad)",          { XX } },
5803
    { "pabsb",          { MX, EM } },
5804
    { "pabsw",          { MX, EM } },
5805
    { "pabsd",          { MX, EM } },
5806
    { "(bad)",          { XX } },
5807
    /* 20 */
5808
    { PREFIX_TABLE (PREFIX_0F3820) },
5809
    { PREFIX_TABLE (PREFIX_0F3821) },
5810
    { PREFIX_TABLE (PREFIX_0F3822) },
5811
    { PREFIX_TABLE (PREFIX_0F3823) },
5812
    { PREFIX_TABLE (PREFIX_0F3824) },
5813
    { PREFIX_TABLE (PREFIX_0F3825) },
5814
    { "(bad)",          { XX } },
5815
    { "(bad)",          { XX } },
5816
    /* 28 */
5817
    { PREFIX_TABLE (PREFIX_0F3828) },
5818
    { PREFIX_TABLE (PREFIX_0F3829) },
5819
    { PREFIX_TABLE (PREFIX_0F382A) },
5820
    { PREFIX_TABLE (PREFIX_0F382B) },
5821
    { "(bad)",          { XX } },
5822
    { "(bad)",          { XX } },
5823
    { "(bad)",          { XX } },
5824
    { "(bad)",          { XX } },
5825
    /* 30 */
5826
    { PREFIX_TABLE (PREFIX_0F3830) },
5827
    { PREFIX_TABLE (PREFIX_0F3831) },
5828
    { PREFIX_TABLE (PREFIX_0F3832) },
5829
    { PREFIX_TABLE (PREFIX_0F3833) },
5830
    { PREFIX_TABLE (PREFIX_0F3834) },
5831
    { PREFIX_TABLE (PREFIX_0F3835) },
5832
    { "(bad)",          { XX } },
5833
    { PREFIX_TABLE (PREFIX_0F3837) },
5834
    /* 38 */
5835
    { PREFIX_TABLE (PREFIX_0F3838) },
5836
    { PREFIX_TABLE (PREFIX_0F3839) },
5837
    { PREFIX_TABLE (PREFIX_0F383A) },
5838
    { PREFIX_TABLE (PREFIX_0F383B) },
5839
    { PREFIX_TABLE (PREFIX_0F383C) },
5840
    { PREFIX_TABLE (PREFIX_0F383D) },
5841
    { PREFIX_TABLE (PREFIX_0F383E) },
5842
    { PREFIX_TABLE (PREFIX_0F383F) },
5843
    /* 40 */
5844
    { PREFIX_TABLE (PREFIX_0F3840) },
5845
    { PREFIX_TABLE (PREFIX_0F3841) },
5846
    { "(bad)",          { XX } },
5847
    { "(bad)",          { XX } },
5848
    { "(bad)",          { XX } },
5849
    { "(bad)",          { XX } },
5850
    { "(bad)",          { XX } },
5851
    { "(bad)",          { XX } },
5852
    /* 48 */
5853
    { "(bad)",          { XX } },
5854
    { "(bad)",          { XX } },
5855
    { "(bad)",          { XX } },
5856
    { "(bad)",          { XX } },
5857
    { "(bad)",          { XX } },
5858
    { "(bad)",          { XX } },
5859
    { "(bad)",          { XX } },
5860
    { "(bad)",          { XX } },
5861
    /* 50 */
5862
    { "(bad)",          { XX } },
5863
    { "(bad)",          { XX } },
5864
    { "(bad)",          { XX } },
5865
    { "(bad)",          { XX } },
5866
    { "(bad)",          { XX } },
5867
    { "(bad)",          { XX } },
5868
    { "(bad)",          { XX } },
5869
    { "(bad)",          { XX } },
5870
    /* 58 */
5871
    { "(bad)",          { XX } },
5872
    { "(bad)",          { XX } },
5873
    { "(bad)",          { XX } },
5874
    { "(bad)",          { XX } },
5875
    { "(bad)",          { XX } },
5876
    { "(bad)",          { XX } },
5877
    { "(bad)",          { XX } },
5878
    { "(bad)",          { XX } },
5879
    /* 60 */
5880
    { "(bad)",          { XX } },
5881
    { "(bad)",          { XX } },
5882
    { "(bad)",          { XX } },
5883
    { "(bad)",          { XX } },
5884
    { "(bad)",          { XX } },
5885
    { "(bad)",          { XX } },
5886
    { "(bad)",          { XX } },
5887
    { "(bad)",          { XX } },
5888
    /* 68 */
5889
    { "(bad)",          { XX } },
5890
    { "(bad)",          { XX } },
5891
    { "(bad)",          { XX } },
5892
    { "(bad)",          { XX } },
5893
    { "(bad)",          { XX } },
5894
    { "(bad)",          { XX } },
5895
    { "(bad)",          { XX } },
5896
    { "(bad)",          { XX } },
5897
    /* 70 */
5898
    { "(bad)",          { XX } },
5899
    { "(bad)",          { XX } },
5900
    { "(bad)",          { XX } },
5901
    { "(bad)",          { XX } },
5902
    { "(bad)",          { XX } },
5903
    { "(bad)",          { XX } },
5904
    { "(bad)",          { XX } },
5905
    { "(bad)",          { XX } },
5906
    /* 78 */
5907
    { "(bad)",          { XX } },
5908
    { "(bad)",          { XX } },
5909
    { "(bad)",          { XX } },
5910
    { "(bad)",          { XX } },
5911
    { "(bad)",          { XX } },
5912
    { "(bad)",          { XX } },
5913
    { "(bad)",          { XX } },
5914
    { "(bad)",          { XX } },
5915
    /* 80 */
5916
    { PREFIX_TABLE (PREFIX_0F3880) },
5917
    { PREFIX_TABLE (PREFIX_0F3881) },
5918
    { "(bad)",          { XX } },
5919
    { "(bad)",          { XX } },
5920
    { "(bad)",          { XX } },
5921
    { "(bad)",          { XX } },
5922
    { "(bad)",          { XX } },
5923
    { "(bad)",          { XX } },
5924
    /* 88 */
5925
    { "(bad)",          { XX } },
5926
    { "(bad)",          { XX } },
5927
    { "(bad)",          { XX } },
5928
    { "(bad)",          { XX } },
5929
    { "(bad)",          { XX } },
5930
    { "(bad)",          { XX } },
5931
    { "(bad)",          { XX } },
5932
    { "(bad)",          { XX } },
5933
    /* 90 */
5934
    { "(bad)",          { XX } },
5935
    { "(bad)",          { XX } },
5936
    { "(bad)",          { XX } },
5937
    { "(bad)",          { XX } },
5938
    { "(bad)",          { XX } },
5939
    { "(bad)",          { XX } },
5940
    { "(bad)",          { XX } },
5941
    { "(bad)",          { XX } },
5942
    /* 98 */
5943
    { "(bad)",          { XX } },
5944
    { "(bad)",          { XX } },
5945
    { "(bad)",          { XX } },
5946
    { "(bad)",          { XX } },
5947
    { "(bad)",          { XX } },
5948
    { "(bad)",          { XX } },
5949
    { "(bad)",          { XX } },
5950
    { "(bad)",          { XX } },
5951
    /* a0 */
5952
    { "(bad)",          { XX } },
5953
    { "(bad)",          { XX } },
5954
    { "(bad)",          { XX } },
5955
    { "(bad)",          { XX } },
5956
    { "(bad)",          { XX } },
5957
    { "(bad)",          { XX } },
5958
    { "(bad)",          { XX } },
5959
    { "(bad)",          { XX } },
5960
    /* a8 */
5961
    { "(bad)",          { XX } },
5962
    { "(bad)",          { XX } },
5963
    { "(bad)",          { XX } },
5964
    { "(bad)",          { XX } },
5965
    { "(bad)",          { XX } },
5966
    { "(bad)",          { XX } },
5967
    { "(bad)",          { XX } },
5968
    { "(bad)",          { XX } },
5969
    /* b0 */
5970
    { "(bad)",          { XX } },
5971
    { "(bad)",          { XX } },
5972
    { "(bad)",          { XX } },
5973
    { "(bad)",          { XX } },
5974
    { "(bad)",          { XX } },
5975
    { "(bad)",          { XX } },
5976
    { "(bad)",          { XX } },
5977
    { "(bad)",          { XX } },
5978
    /* b8 */
5979
    { "(bad)",          { XX } },
5980
    { "(bad)",          { XX } },
5981
    { "(bad)",          { XX } },
5982
    { "(bad)",          { XX } },
5983
    { "(bad)",          { XX } },
5984
    { "(bad)",          { XX } },
5985
    { "(bad)",          { XX } },
5986
    { "(bad)",          { XX } },
5987
    /* c0 */
5988
    { "(bad)",          { XX } },
5989
    { "(bad)",          { XX } },
5990
    { "(bad)",          { XX } },
5991
    { "(bad)",          { XX } },
5992
    { "(bad)",          { XX } },
5993
    { "(bad)",          { XX } },
5994
    { "(bad)",          { XX } },
5995
    { "(bad)",          { XX } },
5996
    /* c8 */
5997
    { "(bad)",          { XX } },
5998
    { "(bad)",          { XX } },
5999
    { "(bad)",          { XX } },
6000
    { "(bad)",          { XX } },
6001
    { "(bad)",          { XX } },
6002
    { "(bad)",          { XX } },
6003
    { "(bad)",          { XX } },
6004
    { "(bad)",          { XX } },
6005
    /* d0 */
6006
    { "(bad)",          { XX } },
6007
    { "(bad)",          { XX } },
6008
    { "(bad)",          { XX } },
6009
    { "(bad)",          { XX } },
6010
    { "(bad)",          { XX } },
6011
    { "(bad)",          { XX } },
6012
    { "(bad)",          { XX } },
6013
    { "(bad)",          { XX } },
6014
    /* d8 */
6015
    { "(bad)",          { XX } },
6016
    { "(bad)",          { XX } },
6017
    { "(bad)",          { XX } },
6018
    { PREFIX_TABLE (PREFIX_0F38DB) },
6019
    { PREFIX_TABLE (PREFIX_0F38DC) },
6020
    { PREFIX_TABLE (PREFIX_0F38DD) },
6021
    { PREFIX_TABLE (PREFIX_0F38DE) },
6022
    { PREFIX_TABLE (PREFIX_0F38DF) },
6023
    /* e0 */
6024
    { "(bad)",          { XX } },
6025
    { "(bad)",          { XX } },
6026
    { "(bad)",          { XX } },
6027
    { "(bad)",          { XX } },
6028
    { "(bad)",          { XX } },
6029
    { "(bad)",          { XX } },
6030
    { "(bad)",          { XX } },
6031
    { "(bad)",          { XX } },
6032
    /* e8 */
6033
    { "(bad)",          { XX } },
6034
    { "(bad)",          { XX } },
6035
    { "(bad)",          { XX } },
6036
    { "(bad)",          { XX } },
6037
    { "(bad)",          { XX } },
6038
    { "(bad)",          { XX } },
6039
    { "(bad)",          { XX } },
6040
    { "(bad)",          { XX } },
6041
    /* f0 */
6042
    { PREFIX_TABLE (PREFIX_0F38F0) },
6043
    { PREFIX_TABLE (PREFIX_0F38F1) },
6044
    { "(bad)",          { XX } },
6045
    { "(bad)",          { XX } },
6046
    { "(bad)",          { XX } },
6047
    { "(bad)",          { XX } },
6048
    { "(bad)",          { XX } },
6049
    { "(bad)",          { XX } },
6050
    /* f8 */
6051
    { "(bad)",          { XX } },
6052
    { "(bad)",          { XX } },
6053
    { "(bad)",          { XX } },
6054
    { "(bad)",          { XX } },
6055
    { "(bad)",          { XX } },
6056
    { "(bad)",          { XX } },
6057
    { "(bad)",          { XX } },
6058
    { "(bad)",          { XX } },
6059
  },
6060
  /* THREE_BYTE_0F3A */
6061
  {
6062
    /* 00 */
6063
    { "(bad)",          { XX } },
6064
    { "(bad)",          { XX } },
6065
    { "(bad)",          { XX } },
6066
    { "(bad)",          { XX } },
6067
    { "(bad)",          { XX } },
6068
    { "(bad)",          { XX } },
6069
    { "(bad)",          { XX } },
6070
    { "(bad)",          { XX } },
6071
    /* 08 */
6072
    { PREFIX_TABLE (PREFIX_0F3A08) },
6073
    { PREFIX_TABLE (PREFIX_0F3A09) },
6074
    { PREFIX_TABLE (PREFIX_0F3A0A) },
6075
    { PREFIX_TABLE (PREFIX_0F3A0B) },
6076
    { PREFIX_TABLE (PREFIX_0F3A0C) },
6077
    { PREFIX_TABLE (PREFIX_0F3A0D) },
6078
    { PREFIX_TABLE (PREFIX_0F3A0E) },
6079
    { "palignr",        { MX, EM, Ib } },
6080
    /* 10 */
6081
    { "(bad)",          { XX } },
6082
    { "(bad)",          { XX } },
6083
    { "(bad)",          { XX } },
6084
    { "(bad)",          { XX } },
6085
    { PREFIX_TABLE (PREFIX_0F3A14) },
6086
    { PREFIX_TABLE (PREFIX_0F3A15) },
6087
    { PREFIX_TABLE (PREFIX_0F3A16) },
6088
    { PREFIX_TABLE (PREFIX_0F3A17) },
6089
    /* 18 */
6090
    { "(bad)",          { XX } },
6091
    { "(bad)",          { XX } },
6092
    { "(bad)",          { XX } },
6093
    { "(bad)",          { XX } },
6094
    { "(bad)",          { XX } },
6095
    { "(bad)",          { XX } },
6096
    { "(bad)",          { XX } },
6097
    { "(bad)",          { XX } },
6098
    /* 20 */
6099
    { PREFIX_TABLE (PREFIX_0F3A20) },
6100
    { PREFIX_TABLE (PREFIX_0F3A21) },
6101
    { PREFIX_TABLE (PREFIX_0F3A22) },
6102
    { "(bad)",          { XX } },
6103
    { "(bad)",          { XX } },
6104
    { "(bad)",          { XX } },
6105
    { "(bad)",          { XX } },
6106
    { "(bad)",          { XX } },
6107
    /* 28 */
6108
    { "(bad)",          { XX } },
6109
    { "(bad)",          { XX } },
6110
    { "(bad)",          { XX } },
6111
    { "(bad)",          { XX } },
6112
    { "(bad)",          { XX } },
6113
    { "(bad)",          { XX } },
6114
    { "(bad)",          { XX } },
6115
    { "(bad)",          { XX } },
6116
    /* 30 */
6117
    { "(bad)",          { XX } },
6118
    { "(bad)",          { XX } },
6119
    { "(bad)",          { XX } },
6120
    { "(bad)",          { XX } },
6121
    { "(bad)",          { XX } },
6122
    { "(bad)",          { XX } },
6123
    { "(bad)",          { XX } },
6124
    { "(bad)",          { XX } },
6125
    /* 38 */
6126
    { "(bad)",          { XX } },
6127
    { "(bad)",          { XX } },
6128
    { "(bad)",          { XX } },
6129
    { "(bad)",          { XX } },
6130
    { "(bad)",          { XX } },
6131
    { "(bad)",          { XX } },
6132
    { "(bad)",          { XX } },
6133
    { "(bad)",          { XX } },
6134
    /* 40 */
6135
    { PREFIX_TABLE (PREFIX_0F3A40) },
6136
    { PREFIX_TABLE (PREFIX_0F3A41) },
6137
    { PREFIX_TABLE (PREFIX_0F3A42) },
6138
    { "(bad)",          { XX } },
6139
    { PREFIX_TABLE (PREFIX_0F3A44) },
6140
    { "(bad)",          { XX } },
6141
    { "(bad)",          { XX } },
6142
    { "(bad)",          { XX } },
6143
    /* 48 */
6144
    { "(bad)",          { XX } },
6145
    { "(bad)",          { XX } },
6146
    { "(bad)",          { XX } },
6147
    { "(bad)",          { XX } },
6148
    { "(bad)",          { XX } },
6149
    { "(bad)",          { XX } },
6150
    { "(bad)",          { XX } },
6151
    { "(bad)",          { XX } },
6152
    /* 50 */
6153
    { "(bad)",          { XX } },
6154
    { "(bad)",          { XX } },
6155
    { "(bad)",          { XX } },
6156
    { "(bad)",          { XX } },
6157
    { "(bad)",          { XX } },
6158
    { "(bad)",          { XX } },
6159
    { "(bad)",          { XX } },
6160
    { "(bad)",          { XX } },
6161
    /* 58 */
6162
    { "(bad)",          { XX } },
6163
    { "(bad)",          { XX } },
6164
    { "(bad)",          { XX } },
6165
    { "(bad)",          { XX } },
6166
    { "(bad)",          { XX } },
6167
    { "(bad)",          { XX } },
6168
    { "(bad)",          { XX } },
6169
    { "(bad)",          { XX } },
6170
    /* 60 */
6171
    { PREFIX_TABLE (PREFIX_0F3A60) },
6172
    { PREFIX_TABLE (PREFIX_0F3A61) },
6173
    { PREFIX_TABLE (PREFIX_0F3A62) },
6174
    { PREFIX_TABLE (PREFIX_0F3A63) },
6175
    { "(bad)",          { XX } },
6176
    { "(bad)",          { XX } },
6177
    { "(bad)",          { XX } },
6178
    { "(bad)",          { XX } },
6179
    /* 68 */
6180
    { "(bad)",          { XX } },
6181
    { "(bad)",          { XX } },
6182
    { "(bad)",          { XX } },
6183
    { "(bad)",          { XX } },
6184
    { "(bad)",          { XX } },
6185
    { "(bad)",          { XX } },
6186
    { "(bad)",          { XX } },
6187
    { "(bad)",          { XX } },
6188
    /* 70 */
6189
    { "(bad)",          { XX } },
6190
    { "(bad)",          { XX } },
6191
    { "(bad)",          { XX } },
6192
    { "(bad)",          { XX } },
6193
    { "(bad)",          { XX } },
6194
    { "(bad)",          { XX } },
6195
    { "(bad)",          { XX } },
6196
    { "(bad)",          { XX } },
6197
    /* 78 */
6198
    { "(bad)",          { XX } },
6199
    { "(bad)",          { XX } },
6200
    { "(bad)",          { XX } },
6201
    { "(bad)",          { XX } },
6202
    { "(bad)",          { XX } },
6203
    { "(bad)",          { XX } },
6204
    { "(bad)",          { XX } },
6205
    { "(bad)",          { XX } },
6206
    /* 80 */
6207
    { "(bad)",          { XX } },
6208
    { "(bad)",          { XX } },
6209
    { "(bad)",          { XX } },
6210
    { "(bad)",          { XX } },
6211
    { "(bad)",          { XX } },
6212
    { "(bad)",          { XX } },
6213
    { "(bad)",          { XX } },
6214
    { "(bad)",          { XX } },
6215
    /* 88 */
6216
    { "(bad)",          { XX } },
6217
    { "(bad)",          { XX } },
6218
    { "(bad)",          { XX } },
6219
    { "(bad)",          { XX } },
6220
    { "(bad)",          { XX } },
6221
    { "(bad)",          { XX } },
6222
    { "(bad)",          { XX } },
6223
    { "(bad)",          { XX } },
6224
    /* 90 */
6225
    { "(bad)",          { XX } },
6226
    { "(bad)",          { XX } },
6227
    { "(bad)",          { XX } },
6228
    { "(bad)",          { XX } },
6229
    { "(bad)",          { XX } },
6230
    { "(bad)",          { XX } },
6231
    { "(bad)",          { XX } },
6232
    { "(bad)",          { XX } },
6233
    /* 98 */
6234
    { "(bad)",          { XX } },
6235
    { "(bad)",          { XX } },
6236
    { "(bad)",          { XX } },
6237
    { "(bad)",          { XX } },
6238
    { "(bad)",          { XX } },
6239
    { "(bad)",          { XX } },
6240
    { "(bad)",          { XX } },
6241
    { "(bad)",          { XX } },
6242
    /* a0 */
6243
    { "(bad)",          { XX } },
6244
    { "(bad)",          { XX } },
6245
    { "(bad)",          { XX } },
6246
    { "(bad)",          { XX } },
6247
    { "(bad)",          { XX } },
6248
    { "(bad)",          { XX } },
6249
    { "(bad)",          { XX } },
6250
    { "(bad)",          { XX } },
6251
    /* a8 */
6252
    { "(bad)",          { XX } },
6253
    { "(bad)",          { XX } },
6254
    { "(bad)",          { XX } },
6255
    { "(bad)",          { XX } },
6256
    { "(bad)",          { XX } },
6257
    { "(bad)",          { XX } },
6258
    { "(bad)",          { XX } },
6259
    { "(bad)",          { XX } },
6260
    /* b0 */
6261
    { "(bad)",          { XX } },
6262
    { "(bad)",          { XX } },
6263
    { "(bad)",          { XX } },
6264
    { "(bad)",          { XX } },
6265
    { "(bad)",          { XX } },
6266
    { "(bad)",          { XX } },
6267
    { "(bad)",          { XX } },
6268
    { "(bad)",          { XX } },
6269
    /* b8 */
6270
    { "(bad)",          { XX } },
6271
    { "(bad)",          { XX } },
6272
    { "(bad)",          { XX } },
6273
    { "(bad)",          { XX } },
6274
    { "(bad)",          { XX } },
6275
    { "(bad)",          { XX } },
6276
    { "(bad)",          { XX } },
6277
    { "(bad)",          { XX } },
6278
    /* c0 */
6279
    { "(bad)",          { XX } },
6280
    { "(bad)",          { XX } },
6281
    { "(bad)",          { XX } },
6282
    { "(bad)",          { XX } },
6283
    { "(bad)",          { XX } },
6284
    { "(bad)",          { XX } },
6285
    { "(bad)",          { XX } },
6286
    { "(bad)",          { XX } },
6287
    /* c8 */
6288
    { "(bad)",          { XX } },
6289
    { "(bad)",          { XX } },
6290
    { "(bad)",          { XX } },
6291
    { "(bad)",          { XX } },
6292
    { "(bad)",          { XX } },
6293
    { "(bad)",          { XX } },
6294
    { "(bad)",          { XX } },
6295
    { "(bad)",          { XX } },
6296
    /* d0 */
6297
    { "(bad)",          { XX } },
6298
    { "(bad)",          { XX } },
6299
    { "(bad)",          { XX } },
6300
    { "(bad)",          { XX } },
6301
    { "(bad)",          { XX } },
6302
    { "(bad)",          { XX } },
6303
    { "(bad)",          { XX } },
6304
    { "(bad)",          { XX } },
6305
    /* d8 */
6306
    { "(bad)",          { XX } },
6307
    { "(bad)",          { XX } },
6308
    { "(bad)",          { XX } },
6309
    { "(bad)",          { XX } },
6310
    { "(bad)",          { XX } },
6311
    { "(bad)",          { XX } },
6312
    { "(bad)",          { XX } },
6313
    { PREFIX_TABLE (PREFIX_0F3ADF) },
6314
    /* e0 */
6315
    { "(bad)",          { XX } },
6316
    { "(bad)",          { XX } },
6317
    { "(bad)",          { XX } },
6318
    { "(bad)",          { XX } },
6319
    { "(bad)",          { XX } },
6320
    { "(bad)",          { XX } },
6321
    { "(bad)",          { XX } },
6322
    { "(bad)",          { XX } },
6323
    /* e8 */
6324
    { "(bad)",          { XX } },
6325
    { "(bad)",          { XX } },
6326
    { "(bad)",          { XX } },
6327
    { "(bad)",          { XX } },
6328
    { "(bad)",          { XX } },
6329
    { "(bad)",          { XX } },
6330
    { "(bad)",          { XX } },
6331
    { "(bad)",          { XX } },
6332
    /* f0 */
6333
    { "(bad)",          { XX } },
6334
    { "(bad)",          { XX } },
6335
    { "(bad)",          { XX } },
6336
    { "(bad)",          { XX } },
6337
    { "(bad)",          { XX } },
6338
    { "(bad)",          { XX } },
6339
    { "(bad)",          { XX } },
6340
    { "(bad)",          { XX } },
6341
    /* f8 */
6342
    { "(bad)",          { XX } },
6343
    { "(bad)",          { XX } },
6344
    { "(bad)",          { XX } },
6345
    { "(bad)",          { XX } },
6346
    { "(bad)",          { XX } },
6347
    { "(bad)",          { XX } },
6348
    { "(bad)",          { XX } },
6349
    { "(bad)",          { XX } },
6350
  },
6351
  /* THREE_BYTE_0F7A */
6352
  {
6353
    /* 00 */
6354
    { "(bad)",          { XX } },
6355
    { "(bad)",          { XX } },
6356
    { "(bad)",          { XX } },
6357
    { "(bad)",          { XX } },
6358
    { "(bad)",          { XX } },
6359
    { "(bad)",          { XX } },
6360
    { "(bad)",          { XX } },
6361
    { "(bad)",          { XX } },
6362
    /* 08 */
6363
    { "(bad)",          { XX } },
6364
    { "(bad)",          { XX } },
6365
    { "(bad)",          { XX } },
6366
    { "(bad)",          { XX } },
6367
    { "(bad)",          { XX } },
6368
    { "(bad)",          { XX } },
6369
    { "(bad)",          { XX } },
6370
    { "(bad)",          { XX } },
6371
    /* 10 */
6372
    { "frczps",         { XM, EXq } },
6373
    { "frczpd",         { XM, EXq } },
6374
    { "frczss",         { XM, EXq } },
6375
    { "frczsd",         { XM, EXq } },
6376
    { "(bad)",          { XX } },
6377
    { "(bad)",          { XX } },
6378
    { "(bad)",          { XX } },
6379
    { "(bad)",          { XX } },
6380
    /* 18 */
6381
    { "(bad)",          { XX } },
6382
    { "(bad)",          { XX } },
6383
    { "(bad)",          { XX } },
6384
    { "(bad)",          { XX } },
6385
    { "(bad)",          { XX } },
6386
    { "(bad)",          { XX } },
6387
    { "(bad)",          { XX } },
6388
    { "(bad)",          { XX } },
6389
    /* 20 */
6390
    { "ptest",          { XX } },
6391
    { "(bad)",          { XX } },
6392
    { "(bad)",          { XX } },
6393
    { "(bad)",          { XX } },
6394
    { "(bad)",          { XX } },
6395
    { "(bad)",          { XX } },
6396
    { "(bad)",          { XX } },
6397
    { "(bad)",          { XX } },
6398
    /* 28 */
6399
    { "(bad)",          { XX } },
6400
    { "(bad)",          { XX } },
6401
    { "(bad)",          { XX } },
6402
    { "(bad)",          { XX } },
6403
    { "(bad)",          { XX } },
6404
    { "(bad)",          { XX } },
6405
    { "(bad)",          { XX } },
6406
    { "(bad)",          { XX } },
6407
    /* 30 */
6408
    { "cvtph2ps",       { XM, EXd } },
6409
    { "cvtps2ph",       { EXd, XM } },
6410
    { "(bad)",          { XX } },
6411
    { "(bad)",          { XX } },
6412
    { "(bad)",          { XX } },
6413
    { "(bad)",          { XX } },
6414
    { "(bad)",          { XX } },
6415
    { "(bad)",          { XX } },
6416
    /* 38 */
6417
    { "(bad)",          { XX } },
6418
    { "(bad)",          { XX } },
6419
    { "(bad)",          { XX } },
6420
    { "(bad)",          { XX } },
6421
    { "(bad)",          { XX } },
6422
    { "(bad)",          { XX } },
6423
    { "(bad)",          { XX } },
6424
    { "(bad)",          { XX } },
6425
    /* 40 */
6426
    { "(bad)",          { XX } },
6427
    { "phaddbw",        { XM, EXq } },
6428
    { "phaddbd",        { XM, EXq } },
6429
    { "phaddbq",        { XM, EXq } },
6430
    { "(bad)",          { XX } },
6431
    { "(bad)",          { XX } },
6432
    { "phaddwd",        { XM, EXq } },
6433
    { "phaddwq",        { XM, EXq } },
6434
    /* 48 */
6435
    { "(bad)",          { XX } },
6436
    { "(bad)",          { XX } },
6437
    { "(bad)",          { XX } },
6438
    { "phadddq",        { XM, EXq } },
6439
    { "(bad)",          { XX } },
6440
    { "(bad)",          { XX } },
6441
    { "(bad)",          { XX } },
6442
    { "(bad)",          { XX } },
6443
    /* 50 */
6444
    { "(bad)",          { XX } },
6445
    { "phaddubw",       { XM, EXq } },
6446
    { "phaddubd",       { XM, EXq } },
6447
    { "phaddubq",       { XM, EXq } },
6448
    { "(bad)",          { XX } },
6449
    { "(bad)",          { XX } },
6450
    { "phadduwd",       { XM, EXq } },
6451
    { "phadduwq",       { XM, EXq } },
6452
    /* 58 */
6453
    { "(bad)",          { XX } },
6454
    { "(bad)",          { XX } },
6455
    { "(bad)",          { XX } },
6456
    { "phaddudq",       { XM, EXq } },
6457
    { "(bad)",          { XX } },
6458
    { "(bad)",          { XX } },
6459
    { "(bad)",          { XX } },
6460
    { "(bad)",          { XX } },
6461
    /* 60 */
6462
    { "(bad)",          { XX } },
6463
    { "phsubbw",        { XM, EXq } },
6464
    { "phsubbd",        { XM, EXq } },
6465
    { "phsubbq",        { XM, EXq } },
6466
    { "(bad)",          { XX } },
6467
    { "(bad)",          { XX } },
6468
    { "(bad)",          { XX } },
6469
    { "(bad)",          { XX } },
6470
    /* 68 */
6471
    { "(bad)",          { XX } },
6472
    { "(bad)",          { XX } },
6473
    { "(bad)",          { XX } },
6474
    { "(bad)",          { XX } },
6475
    { "(bad)",          { XX } },
6476
    { "(bad)",          { XX } },
6477
    { "(bad)",          { XX } },
6478
    { "(bad)",          { XX } },
6479
    /* 70 */
6480
    { "(bad)",          { XX } },
6481
    { "(bad)",          { XX } },
6482
    { "(bad)",          { XX } },
6483
    { "(bad)",          { XX } },
6484
    { "(bad)",          { XX } },
6485
    { "(bad)",          { XX } },
6486
    { "(bad)",          { XX } },
6487
    { "(bad)",          { XX } },
6488
    /* 78 */
6489
    { "(bad)",          { XX } },
6490
    { "(bad)",          { XX } },
6491
    { "(bad)",          { XX } },
6492
    { "(bad)",          { XX } },
6493
    { "(bad)",          { XX } },
6494
    { "(bad)",          { XX } },
6495
    { "(bad)",          { XX } },
6496
    { "(bad)",          { XX } },
6497
    /* 80 */
6498
    { "(bad)",          { XX } },
6499
    { "(bad)",          { XX } },
6500
    { "(bad)",          { XX } },
6501
    { "(bad)",          { XX } },
6502
    { "(bad)",          { XX } },
6503
    { "(bad)",          { XX } },
6504
    { "(bad)",          { XX } },
6505
    { "(bad)",          { XX } },
6506
    /* 88 */
6507
    { "(bad)",          { XX } },
6508
    { "(bad)",          { XX } },
6509
    { "(bad)",          { XX } },
6510
    { "(bad)",          { XX } },
6511
    { "(bad)",          { XX } },
6512
    { "(bad)",          { XX } },
6513
    { "(bad)",          { XX } },
6514
    { "(bad)",          { XX } },
6515
    /* 90 */
6516
    { "(bad)",          { XX } },
6517
    { "(bad)",          { XX } },
6518
    { "(bad)",          { XX } },
6519
    { "(bad)",          { XX } },
6520
    { "(bad)",          { XX } },
6521
    { "(bad)",          { XX } },
6522
    { "(bad)",          { XX } },
6523
    { "(bad)",          { XX } },
6524
    /* 98 */
6525
    { "(bad)",          { XX } },
6526
    { "(bad)",          { XX } },
6527
    { "(bad)",          { XX } },
6528
    { "(bad)",          { XX } },
6529
    { "(bad)",          { XX } },
6530
    { "(bad)",          { XX } },
6531
    { "(bad)",          { XX } },
6532
    { "(bad)",          { XX } },
6533
    /* a0 */
6534
    { "(bad)",          { XX } },
6535
    { "(bad)",          { XX } },
6536
    { "(bad)",          { XX } },
6537
    { "(bad)",          { XX } },
6538
    { "(bad)",          { XX } },
6539
    { "(bad)",          { XX } },
6540
    { "(bad)",          { XX } },
6541
    { "(bad)",          { XX } },
6542
    /* a8 */
6543
    { "(bad)",          { XX } },
6544
    { "(bad)",          { XX } },
6545
    { "(bad)",          { XX } },
6546
    { "(bad)",          { XX } },
6547
    { "(bad)",          { XX } },
6548
    { "(bad)",          { XX } },
6549
    { "(bad)",          { XX } },
6550
    { "(bad)",          { XX } },
6551
    /* b0 */
6552
    { "(bad)",          { XX } },
6553
    { "(bad)",          { XX } },
6554
    { "(bad)",          { XX } },
6555
    { "(bad)",          { XX } },
6556
    { "(bad)",          { XX } },
6557
    { "(bad)",          { XX } },
6558
    { "(bad)",          { XX } },
6559
    { "(bad)",          { XX } },
6560
    /* b8 */
6561
    { "(bad)",          { XX } },
6562
    { "(bad)",          { XX } },
6563
    { "(bad)",          { XX } },
6564
    { "(bad)",          { XX } },
6565
    { "(bad)",          { XX } },
6566
    { "(bad)",          { XX } },
6567
    { "(bad)",          { XX } },
6568
    { "(bad)",          { XX } },
6569
    /* c0 */
6570
    { "(bad)",          { XX } },
6571
    { "(bad)",          { XX } },
6572
    { "(bad)",          { XX } },
6573
    { "(bad)",          { XX } },
6574
    { "(bad)",          { XX } },
6575
    { "(bad)",          { XX } },
6576
    { "(bad)",          { XX } },
6577
    { "(bad)",          { XX } },
6578
    /* c8 */
6579
    { "(bad)",          { XX } },
6580
    { "(bad)",          { XX } },
6581
    { "(bad)",          { XX } },
6582
    { "(bad)",          { XX } },
6583
    { "(bad)",          { XX } },
6584
    { "(bad)",          { XX } },
6585
    { "(bad)",          { XX } },
6586
    { "(bad)",          { XX } },
6587
    /* d0 */
6588
    { "(bad)",          { XX } },
6589
    { "(bad)",          { XX } },
6590
    { "(bad)",          { XX } },
6591
    { "(bad)",          { XX } },
6592
    { "(bad)",          { XX } },
6593
    { "(bad)",          { XX } },
6594
    { "(bad)",          { XX } },
6595
    { "(bad)",          { XX } },
6596
    /* d8 */
6597
    { "(bad)",          { XX } },
6598
    { "(bad)",          { XX } },
6599
    { "(bad)",          { XX } },
6600
    { "(bad)",          { XX } },
6601
    { "(bad)",          { XX } },
6602
    { "(bad)",          { XX } },
6603
    { "(bad)",          { XX } },
6604
    { "(bad)",          { XX } },
6605
    /* e0 */
6606
    { "(bad)",          { XX } },
6607
    { "(bad)",          { XX } },
6608
    { "(bad)",          { XX } },
6609
    { "(bad)",          { XX } },
6610
    { "(bad)",          { XX } },
6611
    { "(bad)",          { XX } },
6612
    { "(bad)",          { XX } },
6613
    { "(bad)",          { XX } },
6614
    /* e8 */
6615
    { "(bad)",          { XX } },
6616
    { "(bad)",          { XX } },
6617
    { "(bad)",          { XX } },
6618
    { "(bad)",          { XX } },
6619
    { "(bad)",          { XX } },
6620
    { "(bad)",          { XX } },
6621
    { "(bad)",          { XX } },
6622
    { "(bad)",          { XX } },
6623
    /* f0 */
6624
    { "(bad)",          { XX } },
6625
    { "(bad)",          { XX } },
6626
    { "(bad)",          { XX } },
6627
    { "(bad)",          { XX } },
6628
    { "(bad)",          { XX } },
6629
    { "(bad)",          { XX } },
6630
    { "(bad)",          { XX } },
6631
    { "(bad)",          { XX } },
6632
    /* f8 */
6633
    { "(bad)",          { XX } },
6634
    { "(bad)",          { XX } },
6635
    { "(bad)",          { XX } },
6636
    { "(bad)",          { XX } },
6637
    { "(bad)",          { XX } },
6638
    { "(bad)",          { XX } },
6639
    { "(bad)",          { XX } },
6640
    { "(bad)",          { XX } },
6641
  },
6642
  /* THREE_BYTE_0F7B */
6643
  {
6644
    /* 00 */
6645
    { "(bad)",          { XX } },
6646
    { "(bad)",          { XX } },
6647
    { "(bad)",          { XX } },
6648
    { "(bad)",          { XX } },
6649
    { "(bad)",          { XX } },
6650
    { "(bad)",          { XX } },
6651
    { "(bad)",          { XX } },
6652
    { "(bad)",          { XX } },
6653
    /* 08 */
6654
    { "(bad)",          { XX } },
6655
    { "(bad)",          { XX } },
6656
    { "(bad)",          { XX } },
6657
    { "(bad)",          { XX } },
6658
    { "(bad)",          { XX } },
6659
    { "(bad)",          { XX } },
6660
    { "(bad)",          { XX } },
6661
    { "(bad)",          { XX } },
6662
    /* 10 */
6663
    { "(bad)",          { XX } },
6664
    { "(bad)",          { XX } },
6665
    { "(bad)",          { XX } },
6666
    { "(bad)",          { XX } },
6667
    { "(bad)",          { XX } },
6668
    { "(bad)",          { XX } },
6669
    { "(bad)",          { XX } },
6670
    { "(bad)",          { XX } },
6671
    /* 18 */
6672
    { "(bad)",          { XX } },
6673
    { "(bad)",          { XX } },
6674
    { "(bad)",          { XX } },
6675
    { "(bad)",          { XX } },
6676
    { "(bad)",          { XX } },
6677
    { "(bad)",          { XX } },
6678
    { "(bad)",          { XX } },
6679
    { "(bad)",          { XX } },
6680
    /* 20 */
6681
    { "(bad)",          { XX } },
6682
    { "(bad)",          { XX } },
6683
    { "(bad)",          { XX } },
6684
    { "(bad)",          { XX } },
6685
    { "(bad)",          { XX } },
6686
    { "(bad)",          { XX } },
6687
    { "(bad)",          { XX } },
6688
    { "(bad)",          { XX } },
6689
    /* 28 */
6690
    { "(bad)",          { XX } },
6691
    { "(bad)",          { XX } },
6692
    { "(bad)",          { XX } },
6693
    { "(bad)",          { XX } },
6694
    { "(bad)",          { XX } },
6695
    { "(bad)",          { XX } },
6696
    { "(bad)",          { XX } },
6697
    { "(bad)",          { XX } },
6698
    /* 30 */
6699
    { "(bad)",          { XX } },
6700
    { "(bad)",          { XX } },
6701
    { "(bad)",          { XX } },
6702
    { "(bad)",          { XX } },
6703
    { "(bad)",          { XX } },
6704
    { "(bad)",          { XX } },
6705
    { "(bad)",          { XX } },
6706
    { "(bad)",          { XX } },
6707
    /* 38 */
6708
    { "(bad)",          { XX } },
6709
    { "(bad)",          { XX } },
6710
    { "(bad)",          { XX } },
6711
    { "(bad)",          { XX } },
6712
    { "(bad)",          { XX } },
6713
    { "(bad)",          { XX } },
6714
    { "(bad)",          { XX } },
6715
    { "(bad)",          { XX } },
6716
    /* 40 */
6717
    { "protb",          { XM, EXq, Ib } },
6718
    { "protw",          { XM, EXq, Ib } },
6719
    { "protd",          { XM, EXq, Ib } },
6720
    { "protq",          { XM, EXq, Ib } },
6721
    { "pshlb",          { XM, EXq, Ib } },
6722
    { "pshlw",          { XM, EXq, Ib } },
6723
    { "pshld",          { XM, EXq, Ib } },
6724
    { "pshlq",          { XM, EXq, Ib } },
6725
    /* 48 */
6726
    { "pshab",          { XM, EXq, Ib } },
6727
    { "pshaw",          { XM, EXq, Ib } },
6728
    { "pshad",          { XM, EXq, Ib } },
6729
    { "pshaq",          { XM, EXq, Ib } },
6730
    { "(bad)",          { XX } },
6731
    { "(bad)",          { XX } },
6732
    { "(bad)",          { XX } },
6733
    { "(bad)",          { XX } },
6734
    /* 50 */
6735
    { "(bad)",          { XX } },
6736
    { "(bad)",          { XX } },
6737
    { "(bad)",          { XX } },
6738
    { "(bad)",          { XX } },
6739
    { "(bad)",          { XX } },
6740
    { "(bad)",          { XX } },
6741
    { "(bad)",          { XX } },
6742
    { "(bad)",          { XX } },
6743
    /* 58 */
6744
    { "(bad)",          { XX } },
6745
    { "(bad)",          { XX } },
6746
    { "(bad)",          { XX } },
6747
    { "(bad)",          { XX } },
6748
    { "(bad)",          { XX } },
6749
    { "(bad)",          { XX } },
6750
    { "(bad)",          { XX } },
6751
    { "(bad)",          { XX } },
6752
    /* 60 */
6753
    { "(bad)",          { XX } },
6754
    { "(bad)",          { XX } },
6755
    { "(bad)",          { XX } },
6756
    { "(bad)",          { XX } },
6757
    { "(bad)",          { XX } },
6758
    { "(bad)",          { XX } },
6759
    { "(bad)",          { XX } },
6760
    { "(bad)",          { XX } },
6761
    /* 68 */
6762
    { "(bad)",          { XX } },
6763
    { "(bad)",          { XX } },
6764
    { "(bad)",          { XX } },
6765
    { "(bad)",          { XX } },
6766
    { "(bad)",          { XX } },
6767
    { "(bad)",          { XX } },
6768
    { "(bad)",          { XX } },
6769
    { "(bad)",          { XX } },
6770
    /* 70 */
6771
    { "(bad)",          { XX } },
6772
    { "(bad)",          { XX } },
6773
    { "(bad)",          { XX } },
6774
    { "(bad)",          { XX } },
6775
    { "(bad)",          { XX } },
6776
    { "(bad)",          { XX } },
6777
    { "(bad)",          { XX } },
6778
    { "(bad)",          { XX } },
6779
    /* 78 */
6780
    { "(bad)",          { XX } },
6781
    { "(bad)",          { XX } },
6782
    { "(bad)",          { XX } },
6783
    { "(bad)",          { XX } },
6784
    { "(bad)",          { XX } },
6785
    { "(bad)",          { XX } },
6786
    { "(bad)",          { XX } },
6787
    { "(bad)",          { XX } },
6788
    /* 80 */
6789
    { "(bad)",          { XX } },
6790
    { "(bad)",          { XX } },
6791
    { "(bad)",          { XX } },
6792
    { "(bad)",          { XX } },
6793
    { "(bad)",          { XX } },
6794
    { "(bad)",          { XX } },
6795
    { "(bad)",          { XX } },
6796
    { "(bad)",          { XX } },
6797
    /* 88 */
6798
    { "(bad)",          { XX } },
6799
    { "(bad)",          { XX } },
6800
    { "(bad)",          { XX } },
6801
    { "(bad)",          { XX } },
6802
    { "(bad)",          { XX } },
6803
    { "(bad)",          { XX } },
6804
    { "(bad)",          { XX } },
6805
    { "(bad)",          { XX } },
6806
    /* 90 */
6807
    { "(bad)",          { XX } },
6808
    { "(bad)",          { XX } },
6809
    { "(bad)",          { XX } },
6810
    { "(bad)",          { XX } },
6811
    { "(bad)",          { XX } },
6812
    { "(bad)",          { XX } },
6813
    { "(bad)",          { XX } },
6814
    { "(bad)",          { XX } },
6815
    /* 98 */
6816
    { "(bad)",          { XX } },
6817
    { "(bad)",          { XX } },
6818
    { "(bad)",          { XX } },
6819
    { "(bad)",          { XX } },
6820
    { "(bad)",          { XX } },
6821
    { "(bad)",          { XX } },
6822
    { "(bad)",          { XX } },
6823
    { "(bad)",          { XX } },
6824
    /* a0 */
6825
    { "(bad)",          { XX } },
6826
    { "(bad)",          { XX } },
6827
    { "(bad)",          { XX } },
6828
    { "(bad)",          { XX } },
6829
    { "(bad)",          { XX } },
6830
    { "(bad)",          { XX } },
6831
    { "(bad)",          { XX } },
6832
    { "(bad)",          { XX } },
6833
    /* a8 */
6834
    { "(bad)",          { XX } },
6835
    { "(bad)",          { XX } },
6836
    { "(bad)",          { XX } },
6837
    { "(bad)",          { XX } },
6838
    { "(bad)",          { XX } },
6839
    { "(bad)",          { XX } },
6840
    { "(bad)",          { XX } },
6841
    { "(bad)",          { XX } },
6842
    /* b0 */
6843
    { "(bad)",          { XX } },
6844
    { "(bad)",          { XX } },
6845
    { "(bad)",          { XX } },
6846
    { "(bad)",          { XX } },
6847
    { "(bad)",          { XX } },
6848
    { "(bad)",          { XX } },
6849
    { "(bad)",          { XX } },
6850
    { "(bad)",          { XX } },
6851
    /* b8 */
6852
    { "(bad)",          { XX } },
6853
    { "(bad)",          { XX } },
6854
    { "(bad)",          { XX } },
6855
    { "(bad)",          { XX } },
6856
    { "(bad)",          { XX } },
6857
    { "(bad)",          { XX } },
6858
    { "(bad)",          { XX } },
6859
    { "(bad)",          { XX } },
6860
    /* c0 */
6861
    { "(bad)",          { XX } },
6862
    { "(bad)",          { XX } },
6863
    { "(bad)",          { XX } },
6864
    { "(bad)",          { XX } },
6865
    { "(bad)",          { XX } },
6866
    { "(bad)",          { XX } },
6867
    { "(bad)",          { XX } },
6868
    { "(bad)",          { XX } },
6869
    /* c8 */
6870
    { "(bad)",          { XX } },
6871
    { "(bad)",          { XX } },
6872
    { "(bad)",          { XX } },
6873
    { "(bad)",          { XX } },
6874
    { "(bad)",          { XX } },
6875
    { "(bad)",          { XX } },
6876
    { "(bad)",          { XX } },
6877
    { "(bad)",          { XX } },
6878
    /* d0 */
6879
    { "(bad)",          { XX } },
6880
    { "(bad)",          { XX } },
6881
    { "(bad)",          { XX } },
6882
    { "(bad)",          { XX } },
6883
    { "(bad)",          { XX } },
6884
    { "(bad)",          { XX } },
6885
    { "(bad)",          { XX } },
6886
    { "(bad)",          { XX } },
6887
    /* d8 */
6888
    { "(bad)",          { XX } },
6889
    { "(bad)",          { XX } },
6890
    { "(bad)",          { XX } },
6891
    { "(bad)",          { XX } },
6892
    { "(bad)",          { XX } },
6893
    { "(bad)",          { XX } },
6894
    { "(bad)",          { XX } },
6895
    { "(bad)",          { XX } },
6896
    /* e0 */
6897
    { "(bad)",          { XX } },
6898
    { "(bad)",          { XX } },
6899
    { "(bad)",          { XX } },
6900
    { "(bad)",          { XX } },
6901
    { "(bad)",          { XX } },
6902
    { "(bad)",          { XX } },
6903
    { "(bad)",          { XX } },
6904
    { "(bad)",          { XX } },
6905
    /* e8 */
6906
    { "(bad)",          { XX } },
6907
    { "(bad)",          { XX } },
6908
    { "(bad)",          { XX } },
6909
    { "(bad)",          { XX } },
6910
    { "(bad)",          { XX } },
6911
    { "(bad)",          { XX } },
6912
    { "(bad)",          { XX } },
6913
    { "(bad)",          { XX } },
6914
    /* f0 */
6915
    { "(bad)",          { XX } },
6916
    { "(bad)",          { XX } },
6917
    { "(bad)",          { XX } },
6918
    { "(bad)",          { XX } },
6919
    { "(bad)",          { XX } },
6920
    { "(bad)",          { XX } },
6921
    { "(bad)",          { XX } },
6922
    { "(bad)",          { XX } },
6923
    /* f8 */
6924
    { "(bad)",          { XX } },
6925
    { "(bad)",          { XX } },
6926
    { "(bad)",          { XX } },
6927
    { "(bad)",          { XX } },
6928
    { "(bad)",          { XX } },
6929
    { "(bad)",          { XX } },
6930
    { "(bad)",          { XX } },
6931
    { "(bad)",          { XX } },
6932
  },
6933
};
6934
 
6935
static const struct dis386 vex_table[][256] = {
6936
  /* VEX_0F */
6937
  {
6938
    /* 00 */
6939
    { "(bad)",          { XX } },
6940
    { "(bad)",          { XX } },
6941
    { "(bad)",          { XX } },
6942
    { "(bad)",          { XX } },
6943
    { "(bad)",          { XX } },
6944
    { "(bad)",          { XX } },
6945
    { "(bad)",          { XX } },
6946
    { "(bad)",          { XX } },
6947
    /* 08 */
6948
    { "(bad)",          { XX } },
6949
    { "(bad)",          { XX } },
6950
    { "(bad)",          { XX } },
6951
    { "(bad)",          { XX } },
6952
    { "(bad)",          { XX } },
6953
    { "(bad)",          { XX } },
6954
    { "(bad)",          { XX } },
6955
    { "(bad)",          { XX } },
6956
    /* 10 */
6957
    { PREFIX_TABLE (PREFIX_VEX_10) },
6958
    { PREFIX_TABLE (PREFIX_VEX_11) },
6959
    { PREFIX_TABLE (PREFIX_VEX_12) },
6960
    { MOD_TABLE (MOD_VEX_13) },
6961
    { "vunpcklpX",      { XM, Vex, EXx } },
6962
    { "vunpckhpX",      { XM, Vex, EXx } },
6963
    { PREFIX_TABLE (PREFIX_VEX_16) },
6964
    { MOD_TABLE (MOD_VEX_17) },
6965
    /* 18 */
6966
    { "(bad)",          { XX } },
6967
    { "(bad)",          { XX } },
6968
    { "(bad)",          { XX } },
6969
    { "(bad)",          { XX } },
6970
    { "(bad)",          { XX } },
6971
    { "(bad)",          { XX } },
6972
    { "(bad)",          { XX } },
6973
    { "(bad)",          { XX } },
6974
    /* 20 */
6975
    { "(bad)",          { XX } },
6976
    { "(bad)",          { XX } },
6977
    { "(bad)",          { XX } },
6978
    { "(bad)",          { XX } },
6979
    { "(bad)",          { XX } },
6980
    { "(bad)",          { XX } },
6981
    { "(bad)",          { XX } },
6982
    { "(bad)",          { XX } },
6983
    /* 28 */
6984
    { "vmovapX",        { XM, EXx } },
6985
    { "vmovapX",        { EXx, XM } },
6986
    { PREFIX_TABLE (PREFIX_VEX_2A) },
6987
    { MOD_TABLE (MOD_VEX_2B) },
6988
    { PREFIX_TABLE (PREFIX_VEX_2C) },
6989
    { PREFIX_TABLE (PREFIX_VEX_2D) },
6990
    { PREFIX_TABLE (PREFIX_VEX_2E) },
6991
    { PREFIX_TABLE (PREFIX_VEX_2F) },
6992
    /* 30 */
6993
    { "(bad)",          { XX } },
6994
    { "(bad)",          { XX } },
6995
    { "(bad)",          { XX } },
6996
    { "(bad)",          { XX } },
6997
    { "(bad)",          { XX } },
6998
    { "(bad)",          { XX } },
6999
    { "(bad)",          { XX } },
7000
    { "(bad)",          { XX } },
7001
    /* 38 */
7002
    { "(bad)",          { XX } },
7003
    { "(bad)",          { XX } },
7004
    { "(bad)",          { XX } },
7005
    { "(bad)",          { XX } },
7006
    { "(bad)",          { XX } },
7007
    { "(bad)",          { XX } },
7008
    { "(bad)",          { XX } },
7009
    { "(bad)",          { XX } },
7010
    /* 40 */
7011
    { "(bad)",          { XX } },
7012
    { "(bad)",          { XX } },
7013
    { "(bad)",          { XX } },
7014
    { "(bad)",          { XX } },
7015
    { "(bad)",          { XX } },
7016
    { "(bad)",          { XX } },
7017
    { "(bad)",          { XX } },
7018
    { "(bad)",          { XX } },
7019
    /* 48 */
7020
    { "(bad)",          { XX } },
7021
    { "(bad)",          { XX } },
7022
    { "(bad)",          { XX } },
7023
    { "(bad)",          { XX } },
7024
    { "(bad)",          { XX } },
7025
    { "(bad)",          { XX } },
7026
    { "(bad)",          { XX } },
7027
    { "(bad)",          { XX } },
7028
    /* 50 */
7029
    { MOD_TABLE (MOD_VEX_51) },
7030
    { PREFIX_TABLE (PREFIX_VEX_51) },
7031
    { PREFIX_TABLE (PREFIX_VEX_52) },
7032
    { PREFIX_TABLE (PREFIX_VEX_53) },
7033
    { "vandpX",         { XM, Vex, EXx } },
7034
    { "vandnpX",        { XM, Vex, EXx } },
7035
    { "vorpX",          { XM, Vex, EXx } },
7036
    { "vxorpX",         { XM, Vex, EXx } },
7037
    /* 58 */
7038
    { PREFIX_TABLE (PREFIX_VEX_58) },
7039
    { PREFIX_TABLE (PREFIX_VEX_59) },
7040
    { PREFIX_TABLE (PREFIX_VEX_5A) },
7041
    { PREFIX_TABLE (PREFIX_VEX_5B) },
7042
    { PREFIX_TABLE (PREFIX_VEX_5C) },
7043
    { PREFIX_TABLE (PREFIX_VEX_5D) },
7044
    { PREFIX_TABLE (PREFIX_VEX_5E) },
7045
    { PREFIX_TABLE (PREFIX_VEX_5F) },
7046
    /* 60 */
7047
    { PREFIX_TABLE (PREFIX_VEX_60) },
7048
    { PREFIX_TABLE (PREFIX_VEX_61) },
7049
    { PREFIX_TABLE (PREFIX_VEX_62) },
7050
    { PREFIX_TABLE (PREFIX_VEX_63) },
7051
    { PREFIX_TABLE (PREFIX_VEX_64) },
7052
    { PREFIX_TABLE (PREFIX_VEX_65) },
7053
    { PREFIX_TABLE (PREFIX_VEX_66) },
7054
    { PREFIX_TABLE (PREFIX_VEX_67) },
7055
    /* 68 */
7056
    { PREFIX_TABLE (PREFIX_VEX_68) },
7057
    { PREFIX_TABLE (PREFIX_VEX_69) },
7058
    { PREFIX_TABLE (PREFIX_VEX_6A) },
7059
    { PREFIX_TABLE (PREFIX_VEX_6B) },
7060
    { PREFIX_TABLE (PREFIX_VEX_6C) },
7061
    { PREFIX_TABLE (PREFIX_VEX_6D) },
7062
    { PREFIX_TABLE (PREFIX_VEX_6E) },
7063
    { PREFIX_TABLE (PREFIX_VEX_6F) },
7064
    /* 70 */
7065
    { PREFIX_TABLE (PREFIX_VEX_70) },
7066
    { REG_TABLE (REG_VEX_71) },
7067
    { REG_TABLE (REG_VEX_72) },
7068
    { REG_TABLE (REG_VEX_73) },
7069
    { PREFIX_TABLE (PREFIX_VEX_74) },
7070
    { PREFIX_TABLE (PREFIX_VEX_75) },
7071
    { PREFIX_TABLE (PREFIX_VEX_76) },
7072
    { PREFIX_TABLE (PREFIX_VEX_77) },
7073
    /* 78 */
7074
    { "(bad)",          { XX } },
7075
    { "(bad)",          { XX } },
7076
    { "(bad)",          { XX } },
7077
    { "(bad)",          { XX } },
7078
    { PREFIX_TABLE (PREFIX_VEX_7C) },
7079
    { PREFIX_TABLE (PREFIX_VEX_7D) },
7080
    { PREFIX_TABLE (PREFIX_VEX_7E) },
7081
    { PREFIX_TABLE (PREFIX_VEX_7F) },
7082
    /* 80 */
7083
    { "(bad)",          { XX } },
7084
    { "(bad)",          { XX } },
7085
    { "(bad)",          { XX } },
7086
    { "(bad)",          { XX } },
7087
    { "(bad)",          { XX } },
7088
    { "(bad)",          { XX } },
7089
    { "(bad)",          { XX } },
7090
    { "(bad)",          { XX } },
7091
    /* 88 */
7092
    { "(bad)",          { XX } },
7093
    { "(bad)",          { XX } },
7094
    { "(bad)",          { XX } },
7095
    { "(bad)",          { XX } },
7096
    { "(bad)",          { XX } },
7097
    { "(bad)",          { XX } },
7098
    { "(bad)",          { XX } },
7099
    { "(bad)",          { XX } },
7100
    /* 90 */
7101
    { "(bad)",          { XX } },
7102
    { "(bad)",          { XX } },
7103
    { "(bad)",          { XX } },
7104
    { "(bad)",          { XX } },
7105
    { "(bad)",          { XX } },
7106
    { "(bad)",          { XX } },
7107
    { "(bad)",          { XX } },
7108
    { "(bad)",          { XX } },
7109
    /* 98 */
7110
    { "(bad)",          { XX } },
7111
    { "(bad)",          { XX } },
7112
    { "(bad)",          { XX } },
7113
    { "(bad)",          { XX } },
7114
    { "(bad)",          { XX } },
7115
    { "(bad)",          { XX } },
7116
    { "(bad)",          { XX } },
7117
    { "(bad)",          { XX } },
7118
    /* a0 */
7119
    { "(bad)",          { XX } },
7120
    { "(bad)",          { XX } },
7121
    { "(bad)",          { XX } },
7122
    { "(bad)",          { XX } },
7123
    { "(bad)",          { XX } },
7124
    { "(bad)",          { XX } },
7125
    { "(bad)",          { XX } },
7126
    { "(bad)",          { XX } },
7127
    /* a8 */
7128
    { "(bad)",          { XX } },
7129
    { "(bad)",          { XX } },
7130
    { "(bad)",          { XX } },
7131
    { "(bad)",          { XX } },
7132
    { "(bad)",          { XX } },
7133
    { "(bad)",          { XX } },
7134
    { REG_TABLE (REG_VEX_AE) },
7135
    { "(bad)",          { XX } },
7136
    /* b0 */
7137
    { "(bad)",          { XX } },
7138
    { "(bad)",          { XX } },
7139
    { "(bad)",          { XX } },
7140
    { "(bad)",          { XX } },
7141
    { "(bad)",          { XX } },
7142
    { "(bad)",          { XX } },
7143
    { "(bad)",          { XX } },
7144
    { "(bad)",          { XX } },
7145
    /* b8 */
7146
    { "(bad)",          { XX } },
7147
    { "(bad)",          { XX } },
7148
    { "(bad)",          { XX } },
7149
    { "(bad)",          { XX } },
7150
    { "(bad)",          { XX } },
7151
    { "(bad)",          { XX } },
7152
    { "(bad)",          { XX } },
7153
    { "(bad)",          { XX } },
7154
    /* c0 */
7155
    { "(bad)",          { XX } },
7156
    { "(bad)",          { XX } },
7157
    { PREFIX_TABLE (PREFIX_VEX_C2) },
7158
    { "(bad)",          { XX } },
7159
    { PREFIX_TABLE (PREFIX_VEX_C4) },
7160
    { PREFIX_TABLE (PREFIX_VEX_C5) },
7161
    { "vshufpX",        { XM, Vex, EXx, Ib } },
7162
    { "(bad)",          { XX } },
7163
    /* c8 */
7164
    { "(bad)",          { XX } },
7165
    { "(bad)",          { XX } },
7166
    { "(bad)",          { XX } },
7167
    { "(bad)",          { XX } },
7168
    { "(bad)",          { XX } },
7169
    { "(bad)",          { XX } },
7170
    { "(bad)",          { XX } },
7171
    { "(bad)",          { XX } },
7172
    /* d0 */
7173
    { PREFIX_TABLE (PREFIX_VEX_D0) },
7174
    { PREFIX_TABLE (PREFIX_VEX_D1) },
7175
    { PREFIX_TABLE (PREFIX_VEX_D2) },
7176
    { PREFIX_TABLE (PREFIX_VEX_D3) },
7177
    { PREFIX_TABLE (PREFIX_VEX_D4) },
7178
    { PREFIX_TABLE (PREFIX_VEX_D5) },
7179
    { PREFIX_TABLE (PREFIX_VEX_D6) },
7180
    { PREFIX_TABLE (PREFIX_VEX_D7) },
7181
    /* d8 */
7182
    { PREFIX_TABLE (PREFIX_VEX_D8) },
7183
    { PREFIX_TABLE (PREFIX_VEX_D9) },
7184
    { PREFIX_TABLE (PREFIX_VEX_DA) },
7185
    { PREFIX_TABLE (PREFIX_VEX_DB) },
7186
    { PREFIX_TABLE (PREFIX_VEX_DC) },
7187
    { PREFIX_TABLE (PREFIX_VEX_DD) },
7188
    { PREFIX_TABLE (PREFIX_VEX_DE) },
7189
    { PREFIX_TABLE (PREFIX_VEX_DF) },
7190
    /* e0 */
7191
    { PREFIX_TABLE (PREFIX_VEX_E0) },
7192
    { PREFIX_TABLE (PREFIX_VEX_E1) },
7193
    { PREFIX_TABLE (PREFIX_VEX_E2) },
7194
    { PREFIX_TABLE (PREFIX_VEX_E3) },
7195
    { PREFIX_TABLE (PREFIX_VEX_E4) },
7196
    { PREFIX_TABLE (PREFIX_VEX_E5) },
7197
    { PREFIX_TABLE (PREFIX_VEX_E6) },
7198
    { PREFIX_TABLE (PREFIX_VEX_E7) },
7199
    /* e8 */
7200
    { PREFIX_TABLE (PREFIX_VEX_E8) },
7201
    { PREFIX_TABLE (PREFIX_VEX_E9) },
7202
    { PREFIX_TABLE (PREFIX_VEX_EA) },
7203
    { PREFIX_TABLE (PREFIX_VEX_EB) },
7204
    { PREFIX_TABLE (PREFIX_VEX_EC) },
7205
    { PREFIX_TABLE (PREFIX_VEX_ED) },
7206
    { PREFIX_TABLE (PREFIX_VEX_EE) },
7207
    { PREFIX_TABLE (PREFIX_VEX_EF) },
7208
    /* f0 */
7209
    { PREFIX_TABLE (PREFIX_VEX_F0) },
7210
    { PREFIX_TABLE (PREFIX_VEX_F1) },
7211
    { PREFIX_TABLE (PREFIX_VEX_F2) },
7212
    { PREFIX_TABLE (PREFIX_VEX_F3) },
7213
    { PREFIX_TABLE (PREFIX_VEX_F4) },
7214
    { PREFIX_TABLE (PREFIX_VEX_F5) },
7215
    { PREFIX_TABLE (PREFIX_VEX_F6) },
7216
    { PREFIX_TABLE (PREFIX_VEX_F7) },
7217
    /* f8 */
7218
    { PREFIX_TABLE (PREFIX_VEX_F8) },
7219
    { PREFIX_TABLE (PREFIX_VEX_F9) },
7220
    { PREFIX_TABLE (PREFIX_VEX_FA) },
7221
    { PREFIX_TABLE (PREFIX_VEX_FB) },
7222
    { PREFIX_TABLE (PREFIX_VEX_FC) },
7223
    { PREFIX_TABLE (PREFIX_VEX_FD) },
7224
    { PREFIX_TABLE (PREFIX_VEX_FE) },
7225
    { "(bad)",          { XX } },
7226
  },
7227
  /* VEX_0F38 */
7228
  {
7229
    /* 00 */
7230
    { PREFIX_TABLE (PREFIX_VEX_3800) },
7231
    { PREFIX_TABLE (PREFIX_VEX_3801) },
7232
    { PREFIX_TABLE (PREFIX_VEX_3802) },
7233
    { PREFIX_TABLE (PREFIX_VEX_3803) },
7234
    { PREFIX_TABLE (PREFIX_VEX_3804) },
7235
    { PREFIX_TABLE (PREFIX_VEX_3805) },
7236
    { PREFIX_TABLE (PREFIX_VEX_3806) },
7237
    { PREFIX_TABLE (PREFIX_VEX_3807) },
7238
    /* 08 */
7239
    { PREFIX_TABLE (PREFIX_VEX_3808) },
7240
    { PREFIX_TABLE (PREFIX_VEX_3809) },
7241
    { PREFIX_TABLE (PREFIX_VEX_380A) },
7242
    { PREFIX_TABLE (PREFIX_VEX_380B) },
7243
    { PREFIX_TABLE (PREFIX_VEX_380C) },
7244
    { PREFIX_TABLE (PREFIX_VEX_380D) },
7245
    { PREFIX_TABLE (PREFIX_VEX_380E) },
7246
    { PREFIX_TABLE (PREFIX_VEX_380F) },
7247
    /* 10 */
7248
    { "(bad)",          { XX } },
7249
    { "(bad)",          { XX } },
7250
    { "(bad)",          { XX } },
7251
    { "(bad)",          { XX } },
7252
    { "(bad)",          { XX } },
7253
    { "(bad)",          { XX } },
7254
    { "(bad)",          { XX } },
7255
    { PREFIX_TABLE (PREFIX_VEX_3817) },
7256
    /* 18 */
7257
    { PREFIX_TABLE (PREFIX_VEX_3818) },
7258
    { PREFIX_TABLE (PREFIX_VEX_3819) },
7259
    { PREFIX_TABLE (PREFIX_VEX_381A) },
7260
    { "(bad)",          { XX } },
7261
    { PREFIX_TABLE (PREFIX_VEX_381C) },
7262
    { PREFIX_TABLE (PREFIX_VEX_381D) },
7263
    { PREFIX_TABLE (PREFIX_VEX_381E) },
7264
    { "(bad)",          { XX } },
7265
    /* 20 */
7266
    { PREFIX_TABLE (PREFIX_VEX_3820) },
7267
    { PREFIX_TABLE (PREFIX_VEX_3821) },
7268
    { PREFIX_TABLE (PREFIX_VEX_3822) },
7269
    { PREFIX_TABLE (PREFIX_VEX_3823) },
7270
    { PREFIX_TABLE (PREFIX_VEX_3824) },
7271
    { PREFIX_TABLE (PREFIX_VEX_3825) },
7272
    { "(bad)",          { XX } },
7273
    { "(bad)",          { XX } },
7274
    /* 28 */
7275
    { PREFIX_TABLE (PREFIX_VEX_3828) },
7276
    { PREFIX_TABLE (PREFIX_VEX_3829) },
7277
    { PREFIX_TABLE (PREFIX_VEX_382A) },
7278
    { PREFIX_TABLE (PREFIX_VEX_382B) },
7279
    { PREFIX_TABLE (PREFIX_VEX_382C) },
7280
    { PREFIX_TABLE (PREFIX_VEX_382D) },
7281
    { PREFIX_TABLE (PREFIX_VEX_382E) },
7282
    { PREFIX_TABLE (PREFIX_VEX_382F) },
7283
    /* 30 */
7284
    { PREFIX_TABLE (PREFIX_VEX_3830) },
7285
    { PREFIX_TABLE (PREFIX_VEX_3831) },
7286
    { PREFIX_TABLE (PREFIX_VEX_3832) },
7287
    { PREFIX_TABLE (PREFIX_VEX_3833) },
7288
    { PREFIX_TABLE (PREFIX_VEX_3834) },
7289
    { PREFIX_TABLE (PREFIX_VEX_3835) },
7290
    { "(bad)",          { XX } },
7291
    { PREFIX_TABLE (PREFIX_VEX_3837) },
7292
    /* 38 */
7293
    { PREFIX_TABLE (PREFIX_VEX_3838) },
7294
    { PREFIX_TABLE (PREFIX_VEX_3839) },
7295
    { PREFIX_TABLE (PREFIX_VEX_383A) },
7296
    { PREFIX_TABLE (PREFIX_VEX_383B) },
7297
    { PREFIX_TABLE (PREFIX_VEX_383C) },
7298
    { PREFIX_TABLE (PREFIX_VEX_383D) },
7299
    { PREFIX_TABLE (PREFIX_VEX_383E) },
7300
    { PREFIX_TABLE (PREFIX_VEX_383F) },
7301
    /* 40 */
7302
    { PREFIX_TABLE (PREFIX_VEX_3840) },
7303
    { PREFIX_TABLE (PREFIX_VEX_3841) },
7304
    { "(bad)",          { XX } },
7305
    { "(bad)",          { XX } },
7306
    { "(bad)",          { XX } },
7307
    { "(bad)",          { XX } },
7308
    { "(bad)",          { XX } },
7309
    { "(bad)",          { XX } },
7310
    /* 48 */
7311
    { "(bad)",          { XX } },
7312
    { "(bad)",          { XX } },
7313
    { "(bad)",          { XX } },
7314
    { "(bad)",          { XX } },
7315
    { "(bad)",          { XX } },
7316
    { "(bad)",          { XX } },
7317
    { "(bad)",          { XX } },
7318
    { "(bad)",          { XX } },
7319
    /* 50 */
7320
    { "(bad)",          { XX } },
7321
    { "(bad)",          { XX } },
7322
    { "(bad)",          { XX } },
7323
    { "(bad)",          { XX } },
7324
    { "(bad)",          { XX } },
7325
    { "(bad)",          { XX } },
7326
    { "(bad)",          { XX } },
7327
    { "(bad)",          { XX } },
7328
    /* 58 */
7329
    { "(bad)",          { XX } },
7330
    { "(bad)",          { XX } },
7331
    { "(bad)",          { XX } },
7332
    { "(bad)",          { XX } },
7333
    { "(bad)",          { XX } },
7334
    { "(bad)",          { XX } },
7335
    { "(bad)",          { XX } },
7336
    { "(bad)",          { XX } },
7337
    /* 60 */
7338
    { "(bad)",          { XX } },
7339
    { "(bad)",          { XX } },
7340
    { "(bad)",          { XX } },
7341
    { "(bad)",          { XX } },
7342
    { "(bad)",          { XX } },
7343
    { "(bad)",          { XX } },
7344
    { "(bad)",          { XX } },
7345
    { "(bad)",          { XX } },
7346
    /* 68 */
7347
    { "(bad)",          { XX } },
7348
    { "(bad)",          { XX } },
7349
    { "(bad)",          { XX } },
7350
    { "(bad)",          { XX } },
7351
    { "(bad)",          { XX } },
7352
    { "(bad)",          { XX } },
7353
    { "(bad)",          { XX } },
7354
    { "(bad)",          { XX } },
7355
    /* 70 */
7356
    { "(bad)",          { XX } },
7357
    { "(bad)",          { XX } },
7358
    { "(bad)",          { XX } },
7359
    { "(bad)",          { XX } },
7360
    { "(bad)",          { XX } },
7361
    { "(bad)",          { XX } },
7362
    { "(bad)",          { XX } },
7363
    { "(bad)",          { XX } },
7364
    /* 78 */
7365
    { "(bad)",          { XX } },
7366
    { "(bad)",          { XX } },
7367
    { "(bad)",          { XX } },
7368
    { "(bad)",          { XX } },
7369
    { "(bad)",          { XX } },
7370
    { "(bad)",          { XX } },
7371
    { "(bad)",          { XX } },
7372
    { "(bad)",          { XX } },
7373
    /* 80 */
7374
    { "(bad)",          { XX } },
7375
    { "(bad)",          { XX } },
7376
    { "(bad)",          { XX } },
7377
    { "(bad)",          { XX } },
7378
    { "(bad)",          { XX } },
7379
    { "(bad)",          { XX } },
7380
    { "(bad)",          { XX } },
7381
    { "(bad)",          { XX } },
7382
    /* 88 */
7383
    { "(bad)",          { XX } },
7384
    { "(bad)",          { XX } },
7385
    { "(bad)",          { XX } },
7386
    { "(bad)",          { XX } },
7387
    { "(bad)",          { XX } },
7388
    { "(bad)",          { XX } },
7389
    { "(bad)",          { XX } },
7390
    { "(bad)",          { XX } },
7391
    /* 90 */
7392
    { "(bad)",          { XX } },
7393
    { "(bad)",          { XX } },
7394
    { "(bad)",          { XX } },
7395
    { "(bad)",          { XX } },
7396
    { "(bad)",          { XX } },
7397
    { "(bad)",          { XX } },
7398
    { "(bad)",          { XX } },
7399
    { "(bad)",          { XX } },
7400
    /* 98 */
7401
    { "(bad)",          { XX } },
7402
    { "(bad)",          { XX } },
7403
    { "(bad)",          { XX } },
7404
    { "(bad)",          { XX } },
7405
    { "(bad)",          { XX } },
7406
    { "(bad)",          { XX } },
7407
    { "(bad)",          { XX } },
7408
    { "(bad)",          { XX } },
7409
    /* a0 */
7410
    { "(bad)",          { XX } },
7411
    { "(bad)",          { XX } },
7412
    { "(bad)",          { XX } },
7413
    { "(bad)",          { XX } },
7414
    { "(bad)",          { XX } },
7415
    { "(bad)",          { XX } },
7416
    { "(bad)",          { XX } },
7417
    { "(bad)",          { XX } },
7418
    /* a8 */
7419
    { "(bad)",          { XX } },
7420
    { "(bad)",          { XX } },
7421
    { "(bad)",          { XX } },
7422
    { "(bad)",          { XX } },
7423
    { "(bad)",          { XX } },
7424
    { "(bad)",          { XX } },
7425
    { "(bad)",          { XX } },
7426
    { "(bad)",          { XX } },
7427
    /* b0 */
7428
    { "(bad)",          { XX } },
7429
    { "(bad)",          { XX } },
7430
    { "(bad)",          { XX } },
7431
    { "(bad)",          { XX } },
7432
    { "(bad)",          { XX } },
7433
    { "(bad)",          { XX } },
7434
    { "(bad)",          { XX } },
7435
    { "(bad)",          { XX } },
7436
    /* b8 */
7437
    { "(bad)",          { XX } },
7438
    { "(bad)",          { XX } },
7439
    { "(bad)",          { XX } },
7440
    { "(bad)",          { XX } },
7441
    { "(bad)",          { XX } },
7442
    { "(bad)",          { XX } },
7443
    { "(bad)",          { XX } },
7444
    { "(bad)",          { XX } },
7445
    /* c0 */
7446
    { "(bad)",          { XX } },
7447
    { "(bad)",          { XX } },
7448
    { "(bad)",          { XX } },
7449
    { "(bad)",          { XX } },
7450
    { "(bad)",          { XX } },
7451
    { "(bad)",          { XX } },
7452
    { "(bad)",          { XX } },
7453
    { "(bad)",          { XX } },
7454
    /* c8 */
7455
    { "(bad)",          { XX } },
7456
    { "(bad)",          { XX } },
7457
    { "(bad)",          { XX } },
7458
    { "(bad)",          { XX } },
7459
    { "(bad)",          { XX } },
7460
    { "(bad)",          { XX } },
7461
    { "(bad)",          { XX } },
7462
    { "(bad)",          { XX } },
7463
    /* d0 */
7464
    { "(bad)",          { XX } },
7465
    { "(bad)",          { XX } },
7466
    { "(bad)",          { XX } },
7467
    { "(bad)",          { XX } },
7468
    { "(bad)",          { XX } },
7469
    { "(bad)",          { XX } },
7470
    { "(bad)",          { XX } },
7471
    { "(bad)",          { XX } },
7472
    /* d8 */
7473
    { "(bad)",          { XX } },
7474
    { "(bad)",          { XX } },
7475
    { "(bad)",          { XX } },
7476
    { PREFIX_TABLE (PREFIX_VEX_38DB) },
7477
    { PREFIX_TABLE (PREFIX_VEX_38DC) },
7478
    { PREFIX_TABLE (PREFIX_VEX_38DD) },
7479
    { PREFIX_TABLE (PREFIX_VEX_38DE) },
7480
    { PREFIX_TABLE (PREFIX_VEX_38DF) },
7481
    /* e0 */
7482
    { "(bad)",          { XX } },
7483
    { "(bad)",          { XX } },
7484
    { "(bad)",          { XX } },
7485
    { "(bad)",          { XX } },
7486
    { "(bad)",          { XX } },
7487
    { "(bad)",          { XX } },
7488
    { "(bad)",          { XX } },
7489
    { "(bad)",          { XX } },
7490
    /* e8 */
7491
    { "(bad)",          { XX } },
7492
    { "(bad)",          { XX } },
7493
    { "(bad)",          { XX } },
7494
    { "(bad)",          { XX } },
7495
    { "(bad)",          { XX } },
7496
    { "(bad)",          { XX } },
7497
    { "(bad)",          { XX } },
7498
    { "(bad)",          { XX } },
7499
    /* f0 */
7500
    { "(bad)",          { XX } },
7501
    { "(bad)",          { XX } },
7502
    { "(bad)",          { XX } },
7503
    { "(bad)",          { XX } },
7504
    { "(bad)",          { XX } },
7505
    { "(bad)",          { XX } },
7506
    { "(bad)",          { XX } },
7507
    { "(bad)",          { XX } },
7508
    /* f8 */
7509
    { "(bad)",          { XX } },
7510
    { "(bad)",          { XX } },
7511
    { "(bad)",          { XX } },
7512
    { "(bad)",          { XX } },
7513
    { "(bad)",          { XX } },
7514
    { "(bad)",          { XX } },
7515
    { "(bad)",          { XX } },
7516
    { "(bad)",          { XX } },
7517
  },
7518
  /* VEX_0F3A */
7519
  {
7520
    /* 00 */
7521
    { "(bad)",          { XX } },
7522
    { "(bad)",          { XX } },
7523
    { "(bad)",          { XX } },
7524
    { "(bad)",          { XX } },
7525
    { PREFIX_TABLE (PREFIX_VEX_3A04) },
7526
    { PREFIX_TABLE (PREFIX_VEX_3A05) },
7527
    { PREFIX_TABLE (PREFIX_VEX_3A06) },
7528
    { "(bad)",          { XX } },
7529
    /* 08 */
7530
    { PREFIX_TABLE (PREFIX_VEX_3A08) },
7531
    { PREFIX_TABLE (PREFIX_VEX_3A09) },
7532
    { PREFIX_TABLE (PREFIX_VEX_3A0A) },
7533
    { PREFIX_TABLE (PREFIX_VEX_3A0B) },
7534
    { PREFIX_TABLE (PREFIX_VEX_3A0C) },
7535
    { PREFIX_TABLE (PREFIX_VEX_3A0D) },
7536
    { PREFIX_TABLE (PREFIX_VEX_3A0E) },
7537
    { PREFIX_TABLE (PREFIX_VEX_3A0F) },
7538
    /* 10 */
7539
    { "(bad)",          { XX } },
7540
    { "(bad)",          { XX } },
7541
    { "(bad)",          { XX } },
7542
    { "(bad)",          { XX } },
7543
    { PREFIX_TABLE (PREFIX_VEX_3A14) },
7544
    { PREFIX_TABLE (PREFIX_VEX_3A15) },
7545
    { PREFIX_TABLE (PREFIX_VEX_3A16) },
7546
    { PREFIX_TABLE (PREFIX_VEX_3A17) },
7547
    /* 18 */
7548
    { PREFIX_TABLE (PREFIX_VEX_3A18) },
7549
    { PREFIX_TABLE (PREFIX_VEX_3A19) },
7550
    { "(bad)",          { XX } },
7551
    { "(bad)",          { XX } },
7552
    { "(bad)",          { XX } },
7553
    { "(bad)",          { XX } },
7554
    { "(bad)",          { XX } },
7555
    { "(bad)",          { XX } },
7556
    /* 20 */
7557
    { PREFIX_TABLE (PREFIX_VEX_3A20) },
7558
    { PREFIX_TABLE (PREFIX_VEX_3A21) },
7559
    { PREFIX_TABLE (PREFIX_VEX_3A22) },
7560
    { "(bad)",          { XX } },
7561
    { "(bad)",          { XX } },
7562
    { "(bad)",          { XX } },
7563
    { "(bad)",          { XX } },
7564
    { "(bad)",          { XX } },
7565
    /* 28 */
7566
    { "(bad)",          { XX } },
7567
    { "(bad)",          { XX } },
7568
    { "(bad)",          { XX } },
7569
    { "(bad)",          { XX } },
7570
    { "(bad)",          { XX } },
7571
    { "(bad)",          { XX } },
7572
    { "(bad)",          { XX } },
7573
    { "(bad)",          { XX } },
7574
    /* 30 */
7575
    { "(bad)",          { XX } },
7576
    { "(bad)",          { XX } },
7577
    { "(bad)",          { XX } },
7578
    { "(bad)",          { XX } },
7579
    { "(bad)",          { XX } },
7580
    { "(bad)",          { XX } },
7581
    { "(bad)",          { XX } },
7582
    { "(bad)",          { XX } },
7583
    /* 38 */
7584
    { "(bad)",          { XX } },
7585
    { "(bad)",          { XX } },
7586
    { "(bad)",          { XX } },
7587
    { "(bad)",          { XX } },
7588
    { "(bad)",          { XX } },
7589
    { "(bad)",          { XX } },
7590
    { "(bad)",          { XX } },
7591
    { "(bad)",          { XX } },
7592
    /* 40 */
7593
    { PREFIX_TABLE (PREFIX_VEX_3A40) },
7594
    { PREFIX_TABLE (PREFIX_VEX_3A41) },
7595
    { PREFIX_TABLE (PREFIX_VEX_3A42) },
7596
    { "(bad)",          { XX } },
7597
    { "(bad)",          { XX } },
7598
    { "(bad)",          { XX } },
7599
    { "(bad)",          { XX } },
7600
    { "(bad)",          { XX } },
7601
    /* 48 */
7602
    { PREFIX_TABLE (PREFIX_VEX_3A48) },
7603
    { PREFIX_TABLE (PREFIX_VEX_3A49) },
7604
    { PREFIX_TABLE (PREFIX_VEX_3A4A) },
7605
    { PREFIX_TABLE (PREFIX_VEX_3A4B) },
7606
    { PREFIX_TABLE (PREFIX_VEX_3A4C) },
7607
    { "(bad)",          { XX } },
7608
    { "(bad)",          { XX } },
7609
    { "(bad)",          { XX } },
7610
    /* 50 */
7611
    { "(bad)",          { XX } },
7612
    { "(bad)",          { XX } },
7613
    { "(bad)",          { XX } },
7614
    { "(bad)",          { XX } },
7615
    { "(bad)",          { XX } },
7616
    { "(bad)",          { XX } },
7617
    { "(bad)",          { XX } },
7618
    { "(bad)",          { XX } },
7619
    /* 58 */
7620
    { "(bad)",          { XX } },
7621
    { "(bad)",          { XX } },
7622
    { "(bad)",          { XX } },
7623
    { "(bad)",          { XX } },
7624
    { PREFIX_TABLE (PREFIX_VEX_3A5C) },
7625
    { PREFIX_TABLE (PREFIX_VEX_3A5D) },
7626
    { PREFIX_TABLE (PREFIX_VEX_3A5E) },
7627
    { PREFIX_TABLE (PREFIX_VEX_3A5F) },
7628
    /* 60 */
7629
    { PREFIX_TABLE (PREFIX_VEX_3A60) },
7630
    { PREFIX_TABLE (PREFIX_VEX_3A61) },
7631
    { PREFIX_TABLE (PREFIX_VEX_3A62) },
7632
    { PREFIX_TABLE (PREFIX_VEX_3A63) },
7633
    { "(bad)",          { XX } },
7634
    { "(bad)",          { XX } },
7635
    { "(bad)",          { XX } },
7636
    { "(bad)",          { XX } },
7637
    /* 68 */
7638
    { PREFIX_TABLE (PREFIX_VEX_3A68) },
7639
    { PREFIX_TABLE (PREFIX_VEX_3A69) },
7640
    { PREFIX_TABLE (PREFIX_VEX_3A6A) },
7641
    { PREFIX_TABLE (PREFIX_VEX_3A6B) },
7642
    { PREFIX_TABLE (PREFIX_VEX_3A6C) },
7643
    { PREFIX_TABLE (PREFIX_VEX_3A6D) },
7644
    { PREFIX_TABLE (PREFIX_VEX_3A6E) },
7645
    { PREFIX_TABLE (PREFIX_VEX_3A6F) },
7646
    /* 70 */
7647
    { "(bad)",          { XX } },
7648
    { "(bad)",          { XX } },
7649
    { "(bad)",          { XX } },
7650
    { "(bad)",          { XX } },
7651
    { "(bad)",          { XX } },
7652
    { "(bad)",          { XX } },
7653
    { "(bad)",          { XX } },
7654
    { "(bad)",          { XX } },
7655
    /* 78 */
7656
    { PREFIX_TABLE (PREFIX_VEX_3A78) },
7657
    { PREFIX_TABLE (PREFIX_VEX_3A79) },
7658
    { PREFIX_TABLE (PREFIX_VEX_3A7A) },
7659
    { PREFIX_TABLE (PREFIX_VEX_3A7B) },
7660
    { PREFIX_TABLE (PREFIX_VEX_3A7C) },
7661
    { PREFIX_TABLE (PREFIX_VEX_3A7D) },
7662
    { PREFIX_TABLE (PREFIX_VEX_3A7E) },
7663
    { PREFIX_TABLE (PREFIX_VEX_3A7F) },
7664
    /* 80 */
7665
    { "(bad)",          { XX } },
7666
    { "(bad)",          { XX } },
7667
    { "(bad)",          { XX } },
7668
    { "(bad)",          { XX } },
7669
    { "(bad)",          { XX } },
7670
    { "(bad)",          { XX } },
7671
    { "(bad)",          { XX } },
7672
    { "(bad)",          { XX } },
7673
    /* 88 */
7674
    { "(bad)",          { XX } },
7675
    { "(bad)",          { XX } },
7676
    { "(bad)",          { XX } },
7677
    { "(bad)",          { XX } },
7678
    { "(bad)",          { XX } },
7679
    { "(bad)",          { XX } },
7680
    { "(bad)",          { XX } },
7681
    { "(bad)",          { XX } },
7682
    /* 90 */
7683
    { "(bad)",          { XX } },
7684
    { "(bad)",          { XX } },
7685
    { "(bad)",          { XX } },
7686
    { "(bad)",          { XX } },
7687
    { "(bad)",          { XX } },
7688
    { "(bad)",          { XX } },
7689
    { "(bad)",          { XX } },
7690
    { "(bad)",          { XX } },
7691
    /* 98 */
7692
    { "(bad)",          { XX } },
7693
    { "(bad)",          { XX } },
7694
    { "(bad)",          { XX } },
7695
    { "(bad)",          { XX } },
7696
    { "(bad)",          { XX } },
7697
    { "(bad)",          { XX } },
7698
    { "(bad)",          { XX } },
7699
    { "(bad)",          { XX } },
7700
    /* a0 */
7701
    { "(bad)",          { XX } },
7702
    { "(bad)",          { XX } },
7703
    { "(bad)",          { XX } },
7704
    { "(bad)",          { XX } },
7705
    { "(bad)",          { XX } },
7706
    { "(bad)",          { XX } },
7707
    { "(bad)",          { XX } },
7708
    { "(bad)",          { XX } },
7709
    /* a8 */
7710
    { "(bad)",          { XX } },
7711
    { "(bad)",          { XX } },
7712
    { "(bad)",          { XX } },
7713
    { "(bad)",          { XX } },
7714
    { "(bad)",          { XX } },
7715
    { "(bad)",          { XX } },
7716
    { "(bad)",          { XX } },
7717
    { "(bad)",          { XX } },
7718
    /* b0 */
7719
    { "(bad)",          { XX } },
7720
    { "(bad)",          { XX } },
7721
    { "(bad)",          { XX } },
7722
    { "(bad)",          { XX } },
7723
    { "(bad)",          { XX } },
7724
    { "(bad)",          { XX } },
7725
    { "(bad)",          { XX } },
7726
    { "(bad)",          { XX } },
7727
    /* b8 */
7728
    { "(bad)",          { XX } },
7729
    { "(bad)",          { XX } },
7730
    { "(bad)",          { XX } },
7731
    { "(bad)",          { XX } },
7732
    { "(bad)",          { XX } },
7733
    { "(bad)",          { XX } },
7734
    { "(bad)",          { XX } },
7735
    { "(bad)",          { XX } },
7736
    /* c0 */
7737
    { "(bad)",          { XX } },
7738
    { "(bad)",          { XX } },
7739
    { "(bad)",          { XX } },
7740
    { "(bad)",          { XX } },
7741
    { "(bad)",          { XX } },
7742
    { "(bad)",          { XX } },
7743
    { "(bad)",          { XX } },
7744
    { "(bad)",          { XX } },
7745
    /* c8 */
7746
    { "(bad)",          { XX } },
7747
    { "(bad)",          { XX } },
7748
    { "(bad)",          { XX } },
7749
    { "(bad)",          { XX } },
7750
    { "(bad)",          { XX } },
7751
    { "(bad)",          { XX } },
7752
    { "(bad)",          { XX } },
7753
    { "(bad)",          { XX } },
7754
    /* d0 */
7755
    { "(bad)",          { XX } },
7756
    { "(bad)",          { XX } },
7757
    { "(bad)",          { XX } },
7758
    { "(bad)",          { XX } },
7759
    { "(bad)",          { XX } },
7760
    { "(bad)",          { XX } },
7761
    { "(bad)",          { XX } },
7762
    { "(bad)",          { XX } },
7763
    /* d8 */
7764
    { "(bad)",          { XX } },
7765
    { "(bad)",          { XX } },
7766
    { "(bad)",          { XX } },
7767
    { "(bad)",          { XX } },
7768
    { "(bad)",          { XX } },
7769
    { "(bad)",          { XX } },
7770
    { "(bad)",          { XX } },
7771
    { PREFIX_TABLE (PREFIX_VEX_3ADF) },
7772
    /* e0 */
7773
    { "(bad)",          { XX } },
7774
    { "(bad)",          { XX } },
7775
    { "(bad)",          { XX } },
7776
    { "(bad)",          { XX } },
7777
    { "(bad)",          { XX } },
7778
    { "(bad)",          { XX } },
7779
    { "(bad)",          { XX } },
7780
    { "(bad)",          { XX } },
7781
    /* e8 */
7782
    { "(bad)",          { XX } },
7783
    { "(bad)",          { XX } },
7784
    { "(bad)",          { XX } },
7785
    { "(bad)",          { XX } },
7786
    { "(bad)",          { XX } },
7787
    { "(bad)",          { XX } },
7788
    { "(bad)",          { XX } },
7789
    { "(bad)",          { XX } },
7790
    /* f0 */
7791
    { "(bad)",          { XX } },
7792
    { "(bad)",          { XX } },
7793
    { "(bad)",          { XX } },
7794
    { "(bad)",          { XX } },
7795
    { "(bad)",          { XX } },
7796
    { "(bad)",          { XX } },
7797
    { "(bad)",          { XX } },
7798
    { "(bad)",          { XX } },
7799
    /* f8 */
7800
    { "(bad)",          { XX } },
7801
    { "(bad)",          { XX } },
7802
    { "(bad)",          { XX } },
7803
    { "(bad)",          { XX } },
7804
    { "(bad)",          { XX } },
7805
    { "(bad)",          { XX } },
7806
    { "(bad)",          { XX } },
7807
    { "(bad)",          { XX } },
7808
  },
7809
};
7810
 
7811
static const struct dis386 vex_len_table[][2] = {
7812
  /* VEX_LEN_10_P_1 */
7813
  {
7814
    { "vmovss",         { XMVex, Vex128, EXd } },
7815
    { "(bad)",          { XX } },
7816
  },
7817
 
7818
  /* VEX_LEN_10_P_3 */
7819
  {
7820
    { "vmovsd",         { XMVex, Vex128, EXq } },
7821
    { "(bad)",          { XX } },
7822
  },
7823
 
7824
  /* VEX_LEN_11_P_1 */
7825
  {
7826
    { "vmovss",         { EXdVex, Vex128, XM } },
7827
    { "(bad)",          { XX } },
7828
  },
7829
 
7830
  /* VEX_LEN_11_P_3 */
7831
  {
7832
    { "vmovsd",         { EXqVex, Vex128, XM } },
7833
    { "(bad)",          { XX } },
7834
  },
7835
 
7836
  /* VEX_LEN_12_P_0_M_0 */
7837
  {
7838
    { "vmovlps",        { XM, Vex128, EXq } },
7839
    { "(bad)",          { XX } },
7840
  },
7841
 
7842
  /* VEX_LEN_12_P_0_M_1 */
7843
  {
7844
    { "vmovhlps",       { XM, Vex128, EXq } },
7845
    { "(bad)",          { XX } },
7846
  },
7847
 
7848
  /* VEX_LEN_12_P_2 */
7849
  {
7850
    { "vmovlpd",        { XM, Vex128, EXq } },
7851
    { "(bad)",          { XX } },
7852
  },
7853
 
7854
  /* VEX_LEN_13_M_0 */
7855
  {
7856
    { "vmovlpX",        { EXq, XM } },
7857
    { "(bad)",          { XX } },
7858
  },
7859
 
7860
  /* VEX_LEN_16_P_0_M_0 */
7861
  {
7862
    { "vmovhps",        { XM, Vex128, EXq } },
7863
    { "(bad)",          { XX } },
7864
  },
7865
 
7866
  /* VEX_LEN_16_P_0_M_1 */
7867
  {
7868
    { "vmovlhps",       { XM, Vex128, EXq } },
7869
    { "(bad)",          { XX } },
7870
  },
7871
 
7872
  /* VEX_LEN_16_P_2 */
7873
  {
7874
    { "vmovhpd",        { XM, Vex128, EXq } },
7875
    { "(bad)",          { XX } },
7876
  },
7877
 
7878
  /* VEX_LEN_17_M_0 */
7879
  {
7880
    { "vmovhpX",        { EXq, XM } },
7881
    { "(bad)",          { XX } },
7882
  },
7883
 
7884
  /* VEX_LEN_2A_P_1 */
7885
  {
7886
    { "vcvtsi2ss%LQ",   { XM, Vex128, Ev } },
7887
    { "(bad)",          { XX } },
7888
  },
7889
 
7890
  /* VEX_LEN_2A_P_3 */
7891
  {
7892
    { "vcvtsi2sd%LQ",   { XM, Vex128, Ev } },
7893
    { "(bad)",          { XX } },
7894
  },
7895
 
7896
  /* VEX_LEN_2B_M_0 */
7897
  {
7898
    { "vmovntpX",       { Mx, XM } },
7899
    { "(bad)",          { XX } },
7900
  },
7901
 
7902
  /* VEX_LEN_2C_P_1 */
7903
  {
7904
    { "vcvttss2siY",    { Gv, EXd } },
7905
    { "(bad)",          { XX } },
7906
  },
7907
 
7908
  /* VEX_LEN_2C_P_3 */
7909
  {
7910
    { "vcvttsd2siY",    { Gv, EXq } },
7911
    { "(bad)",          { XX } },
7912
  },
7913
 
7914
  /* VEX_LEN_2D_P_1 */
7915
  {
7916
    { "vcvtss2siY",     { Gv, EXd } },
7917
    { "(bad)",          { XX } },
7918
  },
7919
 
7920
  /* VEX_LEN_2D_P_3 */
7921
  {
7922
    { "vcvtsd2siY",     { Gv, EXq } },
7923
    { "(bad)",          { XX } },
7924
  },
7925
 
7926
  /* VEX_LEN_2E_P_0 */
7927
  {
7928
    { "vucomiss",       { XM, EXd } },
7929
    { "(bad)",          { XX } },
7930
  },
7931
 
7932
  /* VEX_LEN_2E_P_2 */
7933
  {
7934
    { "vucomisd",       { XM, EXq } },
7935
    { "(bad)",          { XX } },
7936
  },
7937
 
7938
  /* VEX_LEN_2F_P_0 */
7939
  {
7940
    { "vcomiss",        { XM, EXd } },
7941
    { "(bad)",          { XX } },
7942
  },
7943
 
7944
  /* VEX_LEN_2F_P_2 */
7945
  {
7946
    { "vcomisd",        { XM, EXq } },
7947
    { "(bad)",          { XX } },
7948
  },
7949
 
7950
  /* VEX_LEN_51_P_1 */
7951
  {
7952
    { "vsqrtss",        { XM, Vex128, EXd } },
7953
    { "(bad)",          { XX } },
7954
  },
7955
 
7956
  /* VEX_LEN_51_P_3 */
7957
  {
7958
    { "vsqrtsd",        { XM, Vex128, EXq } },
7959
    { "(bad)",          { XX } },
7960
  },
7961
 
7962
  /* VEX_LEN_52_P_1 */
7963
  {
7964
    { "vrsqrtss",       { XM, Vex128, EXd } },
7965
    { "(bad)",          { XX } },
7966
  },
7967
 
7968
  /* VEX_LEN_53_P_1 */
7969
  {
7970
    { "vrcpss",         { XM, Vex128, EXd } },
7971
    { "(bad)",          { XX } },
7972
  },
7973
 
7974
  /* VEX_LEN_58_P_1 */
7975
  {
7976
    { "vaddss",         { XM, Vex128, EXd } },
7977
    { "(bad)",          { XX } },
7978
  },
7979
 
7980
  /* VEX_LEN_58_P_3 */
7981
  {
7982
    { "vaddsd",         { XM, Vex128, EXq } },
7983
    { "(bad)",          { XX } },
7984
  },
7985
 
7986
  /* VEX_LEN_59_P_1 */
7987
  {
7988
    { "vmulss",         { XM, Vex128, EXd } },
7989
    { "(bad)",          { XX } },
7990
  },
7991
 
7992
  /* VEX_LEN_59_P_3 */
7993
  {
7994
    { "vmulsd",         { XM, Vex128, EXq } },
7995
    { "(bad)",          { XX } },
7996
  },
7997
 
7998
  /* VEX_LEN_5A_P_1 */
7999
  {
8000
    { "vcvtss2sd",      { XM, Vex128, EXd } },
8001
    { "(bad)",          { XX } },
8002
  },
8003
 
8004
  /* VEX_LEN_5A_P_3 */
8005
  {
8006
    { "vcvtsd2ss",      { XM, Vex128, EXq } },
8007
    { "(bad)",          { XX } },
8008
  },
8009
 
8010
  /* VEX_LEN_5C_P_1 */
8011
  {
8012
    { "vsubss",         { XM, Vex128, EXd } },
8013
    { "(bad)",          { XX } },
8014
  },
8015
 
8016
  /* VEX_LEN_5C_P_3 */
8017
  {
8018
    { "vsubsd",         { XM, Vex128, EXq } },
8019
    { "(bad)",          { XX } },
8020
  },
8021
 
8022
  /* VEX_LEN_5D_P_1 */
8023
  {
8024
    { "vminss",         { XM, Vex128, EXd } },
8025
    { "(bad)",          { XX } },
8026
  },
8027
 
8028
  /* VEX_LEN_5D_P_3 */
8029
  {
8030
    { "vminsd",         { XM, Vex128, EXq } },
8031
    { "(bad)",          { XX } },
8032
  },
8033
 
8034
  /* VEX_LEN_5E_P_1 */
8035
  {
8036
    { "vdivss",         { XM, Vex128, EXd } },
8037
    { "(bad)",          { XX } },
8038
  },
8039
 
8040
  /* VEX_LEN_5E_P_3 */
8041
  {
8042
    { "vdivsd",         { XM, Vex128, EXq } },
8043
    { "(bad)",          { XX } },
8044
  },
8045
 
8046
  /* VEX_LEN_5F_P_1 */
8047
  {
8048
    { "vmaxss",         { XM, Vex128, EXd } },
8049
    { "(bad)",          { XX } },
8050
  },
8051
 
8052
  /* VEX_LEN_5F_P_3 */
8053
  {
8054
    { "vmaxsd",         { XM, Vex128, EXq } },
8055
    { "(bad)",          { XX } },
8056
  },
8057
 
8058
  /* VEX_LEN_60_P_2 */
8059
  {
8060
    { "vpunpcklbw",     { XM, Vex128, EXx } },
8061
    { "(bad)",          { XX } },
8062
  },
8063
 
8064
  /* VEX_LEN_61_P_2 */
8065
  {
8066
    { "vpunpcklwd",     { XM, Vex128, EXx } },
8067
    { "(bad)",          { XX } },
8068
  },
8069
 
8070
  /* VEX_LEN_62_P_2 */
8071
  {
8072
    { "vpunpckldq",     { XM, Vex128, EXx } },
8073
    { "(bad)",          { XX } },
8074
  },
8075
 
8076
  /* VEX_LEN_63_P_2 */
8077
  {
8078
    { "vpacksswb",      { XM, Vex128, EXx } },
8079
    { "(bad)",          { XX } },
8080
  },
8081
 
8082
  /* VEX_LEN_64_P_2 */
8083
  {
8084
    { "vpcmpgtb",       { XM, Vex128, EXx } },
8085
    { "(bad)",          { XX } },
8086
  },
8087
 
8088
  /* VEX_LEN_65_P_2 */
8089
  {
8090
    { "vpcmpgtw",       { XM, Vex128, EXx } },
8091
    { "(bad)",          { XX } },
8092
  },
8093
 
8094
  /* VEX_LEN_66_P_2 */
8095
  {
8096
    { "vpcmpgtd",       { XM, Vex128, EXx } },
8097
    { "(bad)",          { XX } },
8098
  },
8099
 
8100
  /* VEX_LEN_67_P_2 */
8101
  {
8102
    { "vpackuswb",      { XM, Vex128, EXx } },
8103
    { "(bad)",          { XX } },
8104
  },
8105
 
8106
  /* VEX_LEN_68_P_2 */
8107
  {
8108
    { "vpunpckhbw",     { XM, Vex128, EXx } },
8109
    { "(bad)",          { XX } },
8110
  },
8111
 
8112
  /* VEX_LEN_69_P_2 */
8113
  {
8114
    { "vpunpckhwd",     { XM, Vex128, EXx } },
8115
    { "(bad)",          { XX } },
8116
  },
8117
 
8118
  /* VEX_LEN_6A_P_2 */
8119
  {
8120
    { "vpunpckhdq",     { XM, Vex128, EXx } },
8121
    { "(bad)",          { XX } },
8122
  },
8123
 
8124
  /* VEX_LEN_6B_P_2 */
8125
  {
8126
    { "vpackssdw",      { XM, Vex128, EXx } },
8127
    { "(bad)",          { XX } },
8128
  },
8129
 
8130
  /* VEX_LEN_6C_P_2 */
8131
  {
8132
    { "vpunpcklqdq",    { XM, Vex128, EXx } },
8133
    { "(bad)",          { XX } },
8134
  },
8135
 
8136
  /* VEX_LEN_6D_P_2 */
8137
  {
8138
    { "vpunpckhqdq",    { XM, Vex128, EXx } },
8139
    { "(bad)",          { XX } },
8140
  },
8141
 
8142
  /* VEX_LEN_6E_P_2 */
8143
  {
8144
    { "vmovK",          { XM, Edq } },
8145
    { "(bad)",          { XX } },
8146
  },
8147
 
8148
  /* VEX_LEN_70_P_1 */
8149
  {
8150
    { "vpshufhw",       { XM, EXx, Ib } },
8151
    { "(bad)",          { XX } },
8152
  },
8153
 
8154
  /* VEX_LEN_70_P_2 */
8155
  {
8156
    { "vpshufd",        { XM, EXx, Ib } },
8157
    { "(bad)",          { XX } },
8158
  },
8159
 
8160
  /* VEX_LEN_70_P_3 */
8161
  {
8162
    { "vpshuflw",       { XM, EXx, Ib } },
8163
    { "(bad)",          { XX } },
8164
  },
8165
 
8166
  /* VEX_LEN_71_R_2_P_2 */
8167
  {
8168
    { "vpsrlw",         { Vex128, XS, Ib } },
8169
    { "(bad)",          { XX } },
8170
  },
8171
 
8172
  /* VEX_LEN_71_R_4_P_2 */
8173
  {
8174
    { "vpsraw",         { Vex128, XS, Ib } },
8175
    { "(bad)",          { XX } },
8176
  },
8177
 
8178
  /* VEX_LEN_71_R_6_P_2 */
8179
  {
8180
    { "vpsllw",         { Vex128, XS, Ib } },
8181
    { "(bad)",          { XX } },
8182
  },
8183
 
8184
  /* VEX_LEN_72_R_2_P_2 */
8185
  {
8186
    { "vpsrld",         { Vex128, XS, Ib } },
8187
    { "(bad)",          { XX } },
8188
  },
8189
 
8190
  /* VEX_LEN_72_R_4_P_2 */
8191
  {
8192
    { "vpsrad",         { Vex128, XS, Ib } },
8193
    { "(bad)",          { XX } },
8194
  },
8195
 
8196
  /* VEX_LEN_72_R_6_P_2 */
8197
  {
8198
    { "vpslld",         { Vex128, XS, Ib } },
8199
    { "(bad)",          { XX } },
8200
  },
8201
 
8202
  /* VEX_LEN_73_R_2_P_2 */
8203
  {
8204
    { "vpsrlq",         { Vex128, XS, Ib } },
8205
    { "(bad)",          { XX } },
8206
  },
8207
 
8208
  /* VEX_LEN_73_R_3_P_2 */
8209
  {
8210
    { "vpsrldq",        { Vex128, XS, Ib } },
8211
    { "(bad)",          { XX } },
8212
  },
8213
 
8214
  /* VEX_LEN_73_R_6_P_2 */
8215
  {
8216
    { "vpsllq",         { Vex128, XS, Ib } },
8217
    { "(bad)",          { XX } },
8218
  },
8219
 
8220
  /* VEX_LEN_73_R_7_P_2 */
8221
  {
8222
    { "vpslldq",        { Vex128, XS, Ib } },
8223
    { "(bad)",          { XX } },
8224
  },
8225
 
8226
  /* VEX_LEN_74_P_2 */
8227
  {
8228
    { "vpcmpeqb",       { XM, Vex128, EXx } },
8229
    { "(bad)",          { XX } },
8230
  },
8231
 
8232
  /* VEX_LEN_75_P_2 */
8233
  {
8234
    { "vpcmpeqw",       { XM, Vex128, EXx } },
8235
    { "(bad)",          { XX } },
8236
  },
8237
 
8238
  /* VEX_LEN_76_P_2 */
8239
  {
8240
    { "vpcmpeqd",       { XM, Vex128, EXx } },
8241
    { "(bad)",          { XX } },
8242
  },
8243
 
8244
  /* VEX_LEN_7E_P_1 */
8245
  {
8246
    { "vmovq",          { XM, EXq } },
8247
    { "(bad)",          { XX } },
8248
  },
8249
 
8250
  /* VEX_LEN_7E_P_2 */
8251
  {
8252
    { "vmovK",          { Edq, XM } },
8253
    { "(bad)",          { XX } },
8254
  },
8255
 
8256
  /* VEX_LEN_AE_R_2_M0 */
8257
  {
8258
    { "vldmxcsr",       { Md } },
8259
    { "(bad)",          { XX } },
8260
  },
8261
 
8262
  /* VEX_LEN_AE_R_3_M0 */
8263
  {
8264
    { "vstmxcsr",       { Md } },
8265
    { "(bad)",          { XX } },
8266
  },
8267
 
8268
  /* VEX_LEN_C2_P_1 */
8269
  {
8270
    { "vcmpss",         { XM, Vex128, EXd, VCMP } },
8271
    { "(bad)",          { XX } },
8272
  },
8273
 
8274
  /* VEX_LEN_C2_P_3 */
8275
  {
8276
    { "vcmpsd",         { XM, Vex128, EXq, VCMP } },
8277
    { "(bad)",          { XX } },
8278
  },
8279
 
8280
  /* VEX_LEN_C4_P_2 */
8281
  {
8282
    { "vpinsrw",        { XM, Vex128, Edqw, Ib } },
8283
    { "(bad)",          { XX } },
8284
  },
8285
 
8286
  /* VEX_LEN_C5_P_2 */
8287
  {
8288
    { "vpextrw",        { Gdq, XS, Ib } },
8289
    { "(bad)",          { XX } },
8290
  },
8291
 
8292
  /* VEX_LEN_D1_P_2 */
8293
  {
8294
    { "vpsrlw",         { XM, Vex128, EXx } },
8295
    { "(bad)",          { XX } },
8296
  },
8297
 
8298
  /* VEX_LEN_D2_P_2 */
8299
  {
8300
    { "vpsrld",         { XM, Vex128, EXx } },
8301
    { "(bad)",          { XX } },
8302
  },
8303
 
8304
  /* VEX_LEN_D3_P_2 */
8305
  {
8306
    { "vpsrlq",         { XM, Vex128, EXx } },
8307
    { "(bad)",          { XX } },
8308
  },
8309
 
8310
  /* VEX_LEN_D4_P_2 */
8311
  {
8312
    { "vpaddq",         { XM, Vex128, EXx } },
8313
    { "(bad)",          { XX } },
8314
  },
8315
 
8316
  /* VEX_LEN_D5_P_2 */
8317
  {
8318
    { "vpmullw",        { XM, Vex128, EXx } },
8319
    { "(bad)",          { XX } },
8320
  },
8321
 
8322
  /* VEX_LEN_D6_P_2 */
8323
  {
8324
    { "vmovq",          { EXq, XM } },
8325
    { "(bad)",          { XX } },
8326
  },
8327
 
8328
  /* VEX_LEN_D7_P_2_M_1 */
8329
  {
8330
    { "vpmovmskb",      { Gdq, XS } },
8331
    { "(bad)",          { XX } },
8332
  },
8333
 
8334
  /* VEX_LEN_D8_P_2 */
8335
  {
8336
    { "vpsubusb",       { XM, Vex128, EXx } },
8337
    { "(bad)",          { XX } },
8338
  },
8339
 
8340
  /* VEX_LEN_D9_P_2 */
8341
  {
8342
    { "vpsubusw",       { XM, Vex128, EXx } },
8343
    { "(bad)",          { XX } },
8344
  },
8345
 
8346
  /* VEX_LEN_DA_P_2 */
8347
  {
8348
    { "vpminub",        { XM, Vex128, EXx } },
8349
    { "(bad)",          { XX } },
8350
  },
8351
 
8352
  /* VEX_LEN_DB_P_2 */
8353
  {
8354
    { "vpand",          { XM, Vex128, EXx } },
8355
    { "(bad)",          { XX } },
8356
  },
8357
 
8358
  /* VEX_LEN_DC_P_2 */
8359
  {
8360
    { "vpaddusb",       { XM, Vex128, EXx } },
8361
    { "(bad)",          { XX } },
8362
  },
8363
 
8364
  /* VEX_LEN_DD_P_2 */
8365
  {
8366
    { "vpaddusw",       { XM, Vex128, EXx } },
8367
    { "(bad)",          { XX } },
8368
  },
8369
 
8370
  /* VEX_LEN_DE_P_2 */
8371
  {
8372
    { "vpmaxub",        { XM, Vex128, EXx } },
8373
    { "(bad)",          { XX } },
8374
  },
8375
 
8376
  /* VEX_LEN_DF_P_2 */
8377
  {
8378
    { "vpandn",         { XM, Vex128, EXx } },
8379
    { "(bad)",          { XX } },
8380
  },
8381
 
8382
  /* VEX_LEN_E0_P_2 */
8383
  {
8384
    { "vpavgb",         { XM, Vex128, EXx } },
8385
    { "(bad)",          { XX } },
8386
  },
8387
 
8388
  /* VEX_LEN_E1_P_2 */
8389
  {
8390
    { "vpsraw",         { XM, Vex128, EXx } },
8391
    { "(bad)",          { XX } },
8392
  },
8393
 
8394
  /* VEX_LEN_E2_P_2 */
8395
  {
8396
    { "vpsrad",         { XM, Vex128, EXx } },
8397
    { "(bad)",          { XX } },
8398
  },
8399
 
8400
  /* VEX_LEN_E3_P_2 */
8401
  {
8402
    { "vpavgw",         { XM, Vex128, EXx } },
8403
    { "(bad)",          { XX } },
8404
  },
8405
 
8406
  /* VEX_LEN_E4_P_2 */
8407
  {
8408
    { "vpmulhuw",       { XM, Vex128, EXx } },
8409
    { "(bad)",          { XX } },
8410
  },
8411
 
8412
  /* VEX_LEN_E5_P_2 */
8413
  {
8414
    { "vpmulhw",        { XM, Vex128, EXx } },
8415
    { "(bad)",          { XX } },
8416
  },
8417
 
8418
  /* VEX_LEN_E7_P_2_M_0 */
8419
  {
8420
    { "vmovntdq",       { Mx, XM } },
8421
    { "(bad)",          { XX } },
8422
  },
8423
 
8424
  /* VEX_LEN_E8_P_2 */
8425
  {
8426
    { "vpsubsb",        { XM, Vex128, EXx } },
8427
    { "(bad)",          { XX } },
8428
  },
8429
 
8430
  /* VEX_LEN_E9_P_2 */
8431
  {
8432
    { "vpsubsw",        { XM, Vex128, EXx } },
8433
    { "(bad)",          { XX } },
8434
  },
8435
 
8436
  /* VEX_LEN_EA_P_2 */
8437
  {
8438
    { "vpminsw",        { XM, Vex128, EXx } },
8439
    { "(bad)",          { XX } },
8440
  },
8441
 
8442
  /* VEX_LEN_EB_P_2 */
8443
  {
8444
    { "vpor",           { XM, Vex128, EXx } },
8445
    { "(bad)",          { XX } },
8446
  },
8447
 
8448
  /* VEX_LEN_EC_P_2 */
8449
  {
8450
    { "vpaddsb",        { XM, Vex128, EXx } },
8451
    { "(bad)",          { XX } },
8452
  },
8453
 
8454
  /* VEX_LEN_ED_P_2 */
8455
  {
8456
    { "vpaddsw",        { XM, Vex128, EXx } },
8457
    { "(bad)",          { XX } },
8458
  },
8459
 
8460
  /* VEX_LEN_EE_P_2 */
8461
  {
8462
    { "vpmaxsw",        { XM, Vex128, EXx } },
8463
    { "(bad)",          { XX } },
8464
  },
8465
 
8466
  /* VEX_LEN_EF_P_2 */
8467
  {
8468
    { "vpxor",          { XM, Vex128, EXx } },
8469
    { "(bad)",          { XX } },
8470
  },
8471
 
8472
  /* VEX_LEN_F1_P_2 */
8473
  {
8474
    { "vpsllw",         { XM, Vex128, EXx } },
8475
    { "(bad)",          { XX } },
8476
  },
8477
 
8478
  /* VEX_LEN_F2_P_2 */
8479
  {
8480
    { "vpslld",         { XM, Vex128, EXx } },
8481
    { "(bad)",          { XX } },
8482
  },
8483
 
8484
  /* VEX_LEN_F3_P_2 */
8485
  {
8486
    { "vpsllq",         { XM, Vex128, EXx } },
8487
    { "(bad)",          { XX } },
8488
  },
8489
 
8490
  /* VEX_LEN_F4_P_2 */
8491
  {
8492
    { "vpmuludq",       { XM, Vex128, EXx } },
8493
    { "(bad)",          { XX } },
8494
  },
8495
 
8496
  /* VEX_LEN_F5_P_2 */
8497
  {
8498
    { "vpmaddwd",       { XM, Vex128, EXx } },
8499
    { "(bad)",          { XX } },
8500
  },
8501
 
8502
  /* VEX_LEN_F6_P_2 */
8503
  {
8504
    { "vpsadbw",        { XM, Vex128, EXx } },
8505
    { "(bad)",          { XX } },
8506
  },
8507
 
8508
  /* VEX_LEN_F7_P_2 */
8509
  {
8510
    { "vmaskmovdqu",    { XM, XS } },
8511
    { "(bad)",          { XX } },
8512
  },
8513
 
8514
  /* VEX_LEN_F8_P_2 */
8515
  {
8516
    { "vpsubb",         { XM, Vex128, EXx } },
8517
    { "(bad)",          { XX } },
8518
  },
8519
 
8520
  /* VEX_LEN_F9_P_2 */
8521
  {
8522
    { "vpsubw",         { XM, Vex128, EXx } },
8523
    { "(bad)",          { XX } },
8524
  },
8525
 
8526
  /* VEX_LEN_FA_P_2 */
8527
  {
8528
    { "vpsubd",         { XM, Vex128, EXx } },
8529
    { "(bad)",          { XX } },
8530
  },
8531
 
8532
  /* VEX_LEN_FB_P_2 */
8533
  {
8534
    { "vpsubq",         { XM, Vex128, EXx } },
8535
    { "(bad)",          { XX } },
8536
  },
8537
 
8538
  /* VEX_LEN_FC_P_2 */
8539
  {
8540
    { "vpaddb",         { XM, Vex128, EXx } },
8541
    { "(bad)",          { XX } },
8542
  },
8543
 
8544
  /* VEX_LEN_FD_P_2 */
8545
  {
8546
    { "vpaddw",         { XM, Vex128, EXx } },
8547
    { "(bad)",          { XX } },
8548
  },
8549
 
8550
  /* VEX_LEN_FE_P_2 */
8551
  {
8552
    { "vpaddd",         { XM, Vex128, EXx } },
8553
    { "(bad)",          { XX } },
8554
  },
8555
 
8556
  /* VEX_LEN_3800_P_2 */
8557
  {
8558
    { "vpshufb",        { XM, Vex128, EXx } },
8559
    { "(bad)",          { XX } },
8560
  },
8561
 
8562
  /* VEX_LEN_3801_P_2 */
8563
  {
8564
    { "vphaddw",        { XM, Vex128, EXx } },
8565
    { "(bad)",          { XX } },
8566
  },
8567
 
8568
  /* VEX_LEN_3802_P_2 */
8569
  {
8570
    { "vphaddd",        { XM, Vex128, EXx } },
8571
    { "(bad)",          { XX } },
8572
  },
8573
 
8574
  /* VEX_LEN_3803_P_2 */
8575
  {
8576
    { "vphaddsw",       { XM, Vex128, EXx } },
8577
    { "(bad)",          { XX } },
8578
  },
8579
 
8580
  /* VEX_LEN_3804_P_2 */
8581
  {
8582
    { "vpmaddubsw",     { XM, Vex128, EXx } },
8583
    { "(bad)",          { XX } },
8584
  },
8585
 
8586
  /* VEX_LEN_3805_P_2 */
8587
  {
8588
    { "vphsubw",        { XM, Vex128, EXx } },
8589
    { "(bad)",          { XX } },
8590
  },
8591
 
8592
  /* VEX_LEN_3806_P_2 */
8593
  {
8594
    { "vphsubd",        { XM, Vex128, EXx } },
8595
    { "(bad)",          { XX } },
8596
  },
8597
 
8598
  /* VEX_LEN_3807_P_2 */
8599
  {
8600
    { "vphsubsw",       { XM, Vex128, EXx } },
8601
    { "(bad)",          { XX } },
8602
  },
8603
 
8604
  /* VEX_LEN_3808_P_2 */
8605
  {
8606
    { "vpsignb",        { XM, Vex128, EXx } },
8607
    { "(bad)",          { XX } },
8608
  },
8609
 
8610
  /* VEX_LEN_3809_P_2 */
8611
  {
8612
    { "vpsignw",        { XM, Vex128, EXx } },
8613
    { "(bad)",          { XX } },
8614
  },
8615
 
8616
  /* VEX_LEN_380A_P_2 */
8617
  {
8618
    { "vpsignd",        { XM, Vex128, EXx } },
8619
    { "(bad)",          { XX } },
8620
  },
8621
 
8622
  /* VEX_LEN_380B_P_2 */
8623
  {
8624
    { "vpmulhrsw",      { XM, Vex128, EXx } },
8625
    { "(bad)",          { XX } },
8626
  },
8627
 
8628
  /* VEX_LEN_3819_P_2_M_0 */
8629
  {
8630
    { "(bad)",          { XX } },
8631
    { "vbroadcastsd",   { XM, Mq } },
8632
  },
8633
 
8634
  /* VEX_LEN_381A_P_2_M_0 */
8635
  {
8636
    { "(bad)",          { XX } },
8637
    { "vbroadcastf128", { XM, Mxmm } },
8638
  },
8639
 
8640
  /* VEX_LEN_381C_P_2 */
8641
  {
8642
    { "vpabsb",         { XM, EXx } },
8643
    { "(bad)",          { XX } },
8644
  },
8645
 
8646
  /* VEX_LEN_381D_P_2 */
8647
  {
8648
    { "vpabsw",         { XM, EXx } },
8649
    { "(bad)",          { XX } },
8650
  },
8651
 
8652
  /* VEX_LEN_381E_P_2 */
8653
  {
8654
    { "vpabsd",         { XM, EXx } },
8655
    { "(bad)",          { XX } },
8656
  },
8657
 
8658
  /* VEX_LEN_3820_P_2 */
8659
  {
8660
    { "vpmovsxbw",      { XM, EXq } },
8661
    { "(bad)",          { XX } },
8662
  },
8663
 
8664
  /* VEX_LEN_3821_P_2 */
8665
  {
8666
    { "vpmovsxbd",      { XM, EXd } },
8667
    { "(bad)",          { XX } },
8668
  },
8669
 
8670
  /* VEX_LEN_3822_P_2 */
8671
  {
8672
    { "vpmovsxbq",      { XM, EXw } },
8673
    { "(bad)",          { XX } },
8674
  },
8675
 
8676
  /* VEX_LEN_3823_P_2 */
8677
  {
8678
    { "vpmovsxwd",      { XM, EXq } },
8679
    { "(bad)",          { XX } },
8680
  },
8681
 
8682
  /* VEX_LEN_3824_P_2 */
8683
  {
8684
    { "vpmovsxwq",      { XM, EXd } },
8685
    { "(bad)",          { XX } },
8686
  },
8687
 
8688
  /* VEX_LEN_3825_P_2 */
8689
  {
8690
    { "vpmovsxdq",      { XM, EXq } },
8691
    { "(bad)",          { XX } },
8692
  },
8693
 
8694
  /* VEX_LEN_3828_P_2 */
8695
  {
8696
    { "vpmuldq",        { XM, Vex128, EXx } },
8697
    { "(bad)",          { XX } },
8698
  },
8699
 
8700
  /* VEX_LEN_3829_P_2 */
8701
  {
8702
    { "vpcmpeqq",       { XM, Vex128, EXx } },
8703
    { "(bad)",          { XX } },
8704
  },
8705
 
8706
  /* VEX_LEN_382A_P_2_M_0 */
8707
  {
8708
    { "vmovntdqa",      { XM, Mx } },
8709
    { "(bad)",          { XX } },
8710
  },
8711
 
8712
  /* VEX_LEN_382B_P_2 */
8713
  {
8714
    { "vpackusdw",      { XM, Vex128, EXx } },
8715
    { "(bad)",          { XX } },
8716
  },
8717
 
8718
  /* VEX_LEN_3830_P_2 */
8719
  {
8720
    { "vpmovzxbw",      { XM, EXq } },
8721
    { "(bad)",          { XX } },
8722
  },
8723
 
8724
  /* VEX_LEN_3831_P_2 */
8725
  {
8726
    { "vpmovzxbd",      { XM, EXd } },
8727
    { "(bad)",          { XX } },
8728
  },
8729
 
8730
  /* VEX_LEN_3832_P_2 */
8731
  {
8732
    { "vpmovzxbq",      { XM, EXw } },
8733
    { "(bad)",          { XX } },
8734
  },
8735
 
8736
  /* VEX_LEN_3833_P_2 */
8737
  {
8738
    { "vpmovzxwd",      { XM, EXq } },
8739
    { "(bad)",          { XX } },
8740
  },
8741
 
8742
  /* VEX_LEN_3834_P_2 */
8743
  {
8744
    { "vpmovzxwq",      { XM, EXd } },
8745
    { "(bad)",          { XX } },
8746
  },
8747
 
8748
  /* VEX_LEN_3835_P_2 */
8749
  {
8750
    { "vpmovzxdq",      { XM, EXq } },
8751
    { "(bad)",          { XX } },
8752
  },
8753
 
8754
  /* VEX_LEN_3837_P_2 */
8755
  {
8756
    { "vpcmpgtq",       { XM, Vex128, EXx } },
8757
    { "(bad)",          { XX } },
8758
  },
8759
 
8760
  /* VEX_LEN_3838_P_2 */
8761
  {
8762
    { "vpminsb",        { XM, Vex128, EXx } },
8763
    { "(bad)",          { XX } },
8764
  },
8765
 
8766
  /* VEX_LEN_3839_P_2 */
8767
  {
8768
    { "vpminsd",        { XM, Vex128, EXx } },
8769
    { "(bad)",          { XX } },
8770
  },
8771
 
8772
  /* VEX_LEN_383A_P_2 */
8773
  {
8774
    { "vpminuw",        { XM, Vex128, EXx } },
8775
    { "(bad)",          { XX } },
8776
  },
8777
 
8778
  /* VEX_LEN_383B_P_2 */
8779
  {
8780
    { "vpminud",        { XM, Vex128, EXx } },
8781
    { "(bad)",          { XX } },
8782
  },
8783
 
8784
  /* VEX_LEN_383C_P_2 */
8785
  {
8786
    { "vpmaxsb",        { XM, Vex128, EXx } },
8787
    { "(bad)",          { XX } },
8788
  },
8789
 
8790
  /* VEX_LEN_383D_P_2 */
8791
  {
8792
    { "vpmaxsd",        { XM, Vex128, EXx } },
8793
    { "(bad)",          { XX } },
8794
  },
8795
 
8796
  /* VEX_LEN_383E_P_2 */
8797
  {
8798
    { "vpmaxuw",        { XM, Vex128, EXx } },
8799
    { "(bad)",          { XX } },
8800
  },
8801
 
8802
  /* VEX_LEN_383F_P_2 */
8803
  {
8804
    { "vpmaxud",        { XM, Vex128, EXx } },
8805
    { "(bad)",          { XX } },
8806
  },
8807
 
8808
  /* VEX_LEN_3840_P_2 */
8809
  {
8810
    { "vpmulld",        { XM, Vex128, EXx } },
8811
    { "(bad)",          { XX } },
8812
  },
8813
 
8814
  /* VEX_LEN_3841_P_2 */
8815
  {
8816
    { "vphminposuw",    { XM, EXx } },
8817
    { "(bad)",          { XX } },
8818
  },
8819
 
8820
  /* VEX_LEN_38DB_P_2 */
8821
  {
8822
    { "vaesimc",        { XM, EXx } },
8823
    { "(bad)",          { XX } },
8824
  },
8825
 
8826
  /* VEX_LEN_38DC_P_2 */
8827
  {
8828
    { "vaesenc",        { XM, Vex128, EXx } },
8829
    { "(bad)",          { XX } },
8830
  },
8831
 
8832
  /* VEX_LEN_38DD_P_2 */
8833
  {
8834
    { "vaesenclast",    { XM, Vex128, EXx } },
8835
    { "(bad)",          { XX } },
8836
  },
8837
 
8838
  /* VEX_LEN_38DE_P_2 */
8839
  {
8840
    { "vaesdec",        { XM, Vex128, EXx } },
8841
    { "(bad)",          { XX } },
8842
  },
8843
 
8844
  /* VEX_LEN_38DF_P_2 */
8845
  {
8846
    { "vaesdeclast",    { XM, Vex128, EXx } },
8847
    { "(bad)",          { XX } },
8848
  },
8849
 
8850
  /* VEX_LEN_3A06_P_2 */
8851
  {
8852
    { "(bad)",          { XX } },
8853
    { "vperm2f128",     { XM, Vex256, EXx, Ib } },
8854
  },
8855
 
8856
  /* VEX_LEN_3A0A_P_2 */
8857
  {
8858
    { "vroundss",       { XM, Vex128, EXd, Ib } },
8859
    { "(bad)",          { XX } },
8860
  },
8861
 
8862
  /* VEX_LEN_3A0B_P_2 */
8863
  {
8864
    { "vroundsd",       { XM, Vex128, EXq, Ib } },
8865
    { "(bad)",          { XX } },
8866
  },
8867
 
8868
  /* VEX_LEN_3A0E_P_2 */
8869
  {
8870
    { "vpblendw",       { XM, Vex128, EXx, Ib } },
8871
    { "(bad)",          { XX } },
8872
  },
8873
 
8874
  /* VEX_LEN_3A0F_P_2 */
8875
  {
8876
    { "vpalignr",       { XM, Vex128, EXx, Ib } },
8877
    { "(bad)",          { XX } },
8878
  },
8879
 
8880
  /* VEX_LEN_3A14_P_2 */
8881
  {
8882
    { "vpextrb",        { Edqb, XM, Ib } },
8883
    { "(bad)",          { XX } },
8884
  },
8885
 
8886
  /* VEX_LEN_3A15_P_2 */
8887
  {
8888
    { "vpextrw",        { Edqw, XM, Ib } },
8889
    { "(bad)",          { XX } },
8890
  },
8891
 
8892
  /* VEX_LEN_3A16_P_2  */
8893
  {
8894
    { "vpextrK",        { Edq, XM, Ib } },
8895
    { "(bad)",          { XX } },
8896
  },
8897
 
8898
  /* VEX_LEN_3A17_P_2 */
8899
  {
8900
    { "vextractps",     { Edqd, XM, Ib } },
8901
    { "(bad)",          { XX } },
8902
  },
8903
 
8904
  /* VEX_LEN_3A18_P_2 */
8905
  {
8906
    { "(bad)",          { XX } },
8907
    { "vinsertf128",    { XM, Vex256, EXxmm, Ib } },
8908
  },
8909
 
8910
  /* VEX_LEN_3A19_P_2 */
8911
  {
8912
    { "(bad)",          { XX } },
8913
    { "vextractf128",   { EXxmm, XM, Ib } },
8914
  },
8915
 
8916
  /* VEX_LEN_3A20_P_2 */
8917
  {
8918
    { "vpinsrb",        { XM, Vex128, Edqb, Ib } },
8919
    { "(bad)",          { XX } },
8920
  },
8921
 
8922
  /* VEX_LEN_3A21_P_2 */
8923
  {
8924
    { "vinsertps",      { XM, Vex128, EXd, Ib } },
8925
    { "(bad)",          { XX } },
8926
  },
8927
 
8928
  /* VEX_LEN_3A22_P_2 */
8929
  {
8930
    { "vpinsrK",        { XM, Vex128, Edq, Ib } },
8931
    { "(bad)",          { XX } },
8932
  },
8933
 
8934
  /* VEX_LEN_3A41_P_2 */
8935
  {
8936
    { "vdppd",          { XM, Vex128, EXx, Ib } },
8937
    { "(bad)",          { XX } },
8938
  },
8939
 
8940
  /* VEX_LEN_3A42_P_2 */
8941
  {
8942
    { "vmpsadbw",       { XM, Vex128, EXx, Ib } },
8943
    { "(bad)",          { XX } },
8944
  },
8945
 
8946
  /* VEX_LEN_3A4C_P_2 */
8947
  {
8948
    { "vpblendvb",      { XM, Vex128, EXx, XMVexI4 } },
8949
    { "(bad)",          { XX } },
8950
  },
8951
 
8952
  /* VEX_LEN_3A60_P_2 */
8953
  {
8954
    { "vpcmpestrm",     { XM, EXx, Ib } },
8955
    { "(bad)",          { XX } },
8956
  },
8957
 
8958
  /* VEX_LEN_3A61_P_2 */
8959
  {
8960
    { "vpcmpestri",     { XM, EXx, Ib } },
8961
    { "(bad)",          { XX } },
8962
  },
8963
 
8964
  /* VEX_LEN_3A62_P_2 */
8965
  {
8966
    { "vpcmpistrm",     { XM, EXx, Ib } },
8967
    { "(bad)",          { XX } },
8968
  },
8969
 
8970
  /* VEX_LEN_3A63_P_2 */
8971
  {
8972
    { "vpcmpistri",     { XM, EXx, Ib } },
8973
    { "(bad)",          { XX } },
8974
  },
8975
 
8976
  /* VEX_LEN_3A6A_P_2 */
8977
  {
8978
    { "vfmaddss",       { XMVexW, Vex128FMA, EXdVexW, EXdVexW, VexI4 } },
8979
    { "(bad)",          { XX } },
8980
  },
8981
 
8982
  /* VEX_LEN_3A6B_P_2 */
8983
  {
8984
    { "vfmaddsd",       { XMVexW, Vex128FMA, EXqVexW, EXqVexW, VexI4 } },
8985
    { "(bad)",          { XX } },
8986
  },
8987
 
8988
  /* VEX_LEN_3A6E_P_2 */
8989
  {
8990
    { "vfmsubss",       { XMVexW, Vex128FMA, EXdVexW, EXdVexW, VexI4 } },
8991
    { "(bad)",          { XX } },
8992
  },
8993
 
8994
  /* VEX_LEN_3A6F_P_2 */
8995
  {
8996
    { "vfmsubsd",       { XMVexW, Vex128FMA, EXqVexW, EXqVexW, VexI4 } },
8997
    { "(bad)",          { XX } },
8998
  },
8999
 
9000
  /* VEX_LEN_3A7A_P_2 */
9001
  {
9002
    { "vfnmaddss",      { XMVexW, Vex128FMA, EXdVexW, EXdVexW, VexI4 } },
9003
    { "(bad)",          { XX } },
9004
  },
9005
 
9006
  /* VEX_LEN_3A7B_P_2 */
9007
  {
9008
    { "vfnmaddsd",      { XMVexW, Vex128FMA, EXqVexW, EXqVexW, VexI4 } },
9009
    { "(bad)",          { XX } },
9010
  },
9011
 
9012
  /* VEX_LEN_3A7E_P_2 */
9013
  {
9014
    { "vfnmsubss",      { XMVexW, Vex128FMA, EXdVexW, EXdVexW, VexI4 } },
9015
    { "(bad)",          { XX } },
9016
  },
9017
 
9018
  /* VEX_LEN_3A7F_P_2 */
9019
  {
9020
    { "vfnmsubsd",      { XMVexW, Vex128FMA, EXqVexW, EXqVexW, VexI4 } },
9021
    { "(bad)",          { XX } },
9022
  },
9023
 
9024
  /* VEX_LEN_3ADF_P_2 */
9025
  {
9026
    { "vaeskeygenassist", { XM, EXx, Ib } },
9027
    { "(bad)",          { XX } },
9028
  },
9029
};
9030
 
9031
static const struct dis386 mod_table[][2] = {
9032
  {
9033
    /* MOD_8D */
9034
    { "leaS",           { Gv, M } },
9035
    { "(bad)",          { XX } },
9036
  },
9037
  {
9038
    /* MOD_0F01_REG_0 */
9039
    { X86_64_TABLE (X86_64_0F01_REG_0) },
9040
    { RM_TABLE (RM_0F01_REG_0) },
9041
  },
9042
  {
9043
    /* MOD_0F01_REG_1 */
9044
    { X86_64_TABLE (X86_64_0F01_REG_1) },
9045
    { RM_TABLE (RM_0F01_REG_1) },
9046
  },
9047
  {
9048
    /* MOD_0F01_REG_2 */
9049
    { X86_64_TABLE (X86_64_0F01_REG_2) },
9050
    { RM_TABLE (RM_0F01_REG_2) },
9051
  },
9052
  {
9053
    /* MOD_0F01_REG_3 */
9054
    { X86_64_TABLE (X86_64_0F01_REG_3) },
9055
    { RM_TABLE (RM_0F01_REG_3) },
9056
  },
9057
  {
9058
    /* MOD_0F01_REG_7 */
9059
    { "invlpg",         { Mb } },
9060
    { RM_TABLE (RM_0F01_REG_7) },
9061
  },
9062
  {
9063
    /* MOD_0F12_PREFIX_0 */
9064
    { "movlps",         { XM, EXq } },
9065
    { "movhlps",        { XM, EXq } },
9066
  },
9067
  {
9068
    /* MOD_0F13 */
9069
    { "movlpX",         { EXq, XM } },
9070
    { "(bad)",          { XX } },
9071
  },
9072
  {
9073
    /* MOD_0F16_PREFIX_0 */
9074
    { "movhps",         { XM, EXq } },
9075
    { "movlhps",        { XM, EXq } },
9076
  },
9077
  {
9078
    /* MOD_0F17 */
9079
    { "movhpX",         { EXq, XM } },
9080
    { "(bad)",          { XX } },
9081
  },
9082
  {
9083
    /* MOD_0F18_REG_0 */
9084
    { "prefetchnta",    { Mb } },
9085
    { "(bad)",          { XX } },
9086
  },
9087
  {
9088
    /* MOD_0F18_REG_1 */
9089
    { "prefetcht0",     { Mb } },
9090
    { "(bad)",          { XX } },
9091
  },
9092
  {
9093
    /* MOD_0F18_REG_2 */
9094
    { "prefetcht1",     { Mb } },
9095
    { "(bad)",          { XX } },
9096
  },
9097
  {
9098
    /* MOD_0F18_REG_3 */
9099
    { "prefetcht2",     { Mb } },
9100
    { "(bad)",          { XX } },
9101
  },
9102
  {
9103
    /* MOD_0F20 */
9104
    { "(bad)",          { XX } },
9105
    { "movZ",           { Rm, Cm } },
9106
  },
9107
  {
9108
    /* MOD_0F21 */
9109
    { "(bad)",          { XX } },
9110
    { "movZ",           { Rm, Dm } },
9111
  },
9112
  {
9113
    /* MOD_0F22 */
9114
    { "(bad)",          { XX } },
9115
    { "movZ",           { Cm, Rm } },
9116
  },
9117
  {
9118
    /* MOD_0F23 */
9119
    { "(bad)",          { XX } },
9120
    { "movZ",           { Dm, Rm } },
9121
  },
9122
  {
9123
    /* MOD_0F24 */
9124
    { THREE_BYTE_TABLE (THREE_BYTE_0F24) },
9125
    { "movL",           { Rd, Td } },
9126
  },
9127
  {
9128
    /* MOD_0F26 */
9129
    { "(bad)",          { XX } },
9130
    { "movL",           { Td, Rd } },
9131
  },
9132
  {
9133
    /* MOD_0F2B_PREFIX_0 */
9134
    {"movntps",         { Mx, XM } },
9135
    { "(bad)",          { XX } },
9136
  },
9137
  {
9138
    /* MOD_0F2B_PREFIX_1 */
9139
    {"movntss",         { Md, XM } },
9140
    { "(bad)",          { XX } },
9141
  },
9142
  {
9143
    /* MOD_0F2B_PREFIX_2 */
9144
    {"movntpd",         { Mx, XM } },
9145
    { "(bad)",          { XX } },
9146
  },
9147
  {
9148
    /* MOD_0F2B_PREFIX_3 */
9149
    {"movntsd",         { Mq, XM } },
9150
    { "(bad)",          { XX } },
9151
  },
9152
  {
9153
    /* MOD_0F51 */
9154
    { "(bad)",          { XX } },
9155
    { "movmskpX",       { Gdq, XS } },
9156
  },
9157
  {
9158
    /* MOD_0F71_REG_2 */
9159
    { "(bad)",          { XX } },
9160
    { "psrlw",          { MS, Ib } },
9161
  },
9162
  {
9163
    /* MOD_0F71_REG_4 */
9164
    { "(bad)",          { XX } },
9165
    { "psraw",          { MS, Ib } },
9166
  },
9167
  {
9168
    /* MOD_0F71_REG_6 */
9169
    { "(bad)",          { XX } },
9170
    { "psllw",          { MS, Ib } },
9171
  },
9172
  {
9173
    /* MOD_0F72_REG_2 */
9174
    { "(bad)",          { XX } },
9175
    { "psrld",          { MS, Ib } },
9176
  },
9177
  {
9178
    /* MOD_0F72_REG_4 */
9179
    { "(bad)",          { XX } },
9180
    { "psrad",          { MS, Ib } },
9181
  },
9182
  {
9183
    /* MOD_0F72_REG_6 */
9184
    { "(bad)",          { XX } },
9185
    { "pslld",          { MS, Ib } },
9186
  },
9187
  {
9188
    /* MOD_0F73_REG_2 */
9189
    { "(bad)",          { XX } },
9190
    { "psrlq",          { MS, Ib } },
9191
  },
9192
  {
9193
    /* MOD_0F73_REG_3 */
9194
    { "(bad)",          { XX } },
9195
    { PREFIX_TABLE (PREFIX_0F73_REG_3) },
9196
  },
9197
  {
9198
    /* MOD_0F73_REG_6 */
9199
    { "(bad)",          { XX } },
9200
    { "psllq",          { MS, Ib } },
9201
  },
9202
  {
9203
    /* MOD_0F73_REG_7 */
9204
    { "(bad)",          { XX } },
9205
    { PREFIX_TABLE (PREFIX_0F73_REG_7) },
9206
  },
9207
  {
9208
    /* MOD_0FAE_REG_0 */
9209
    { "fxsave",         { M } },
9210
    { "(bad)",          { XX } },
9211
  },
9212
  {
9213
    /* MOD_0FAE_REG_1 */
9214
    { "fxrstor",        { M } },
9215
    { "(bad)",          { XX } },
9216
  },
9217
  {
9218
    /* MOD_0FAE_REG_2 */
9219
    { "ldmxcsr",        { Md } },
9220
    { "(bad)",          { XX } },
9221
  },
9222
  {
9223
    /* MOD_0FAE_REG_3 */
9224
    { "stmxcsr",        { Md } },
9225
    { "(bad)",          { XX } },
9226
  },
9227
  {
9228
    /* MOD_0FAE_REG_4 */
9229
    { "xsave",          { M } },
9230
    { "(bad)",          { XX } },
9231
  },
9232
  {
9233
    /* MOD_0FAE_REG_5 */
9234
    { "xrstor",         { M } },
9235
    { RM_TABLE (RM_0FAE_REG_5) },
9236
  },
9237
  {
9238
    /* MOD_0FAE_REG_6 */
9239
    { "xsaveopt",       { M } },
9240
    { RM_TABLE (RM_0FAE_REG_6) },
9241
  },
9242
  {
9243
    /* MOD_0FAE_REG_7 */
9244
    { "clflush",        { Mb } },
9245
    { RM_TABLE (RM_0FAE_REG_7) },
9246
  },
9247
  {
9248
    /* MOD_0FB2 */
9249
    { "lssS",           { Gv, Mp } },
9250
    { "(bad)",          { XX } },
9251
  },
9252
  {
9253
    /* MOD_0FB4 */
9254
    { "lfsS",           { Gv, Mp } },
9255
    { "(bad)",          { XX } },
9256
  },
9257
  {
9258
    /* MOD_0FB5 */
9259
    { "lgsS",           { Gv, Mp } },
9260
    { "(bad)",          { XX } },
9261
  },
9262
  {
9263
    /* MOD_0FC7_REG_6 */
9264
    { PREFIX_TABLE (PREFIX_0FC7_REG_6) },
9265
    { "(bad)",          { XX } },
9266
  },
9267
  {
9268
    /* MOD_0FC7_REG_7 */
9269
    { "vmptrst",        { Mq } },
9270
    { "(bad)",          { XX } },
9271
  },
9272
  {
9273
    /* MOD_0FD7 */
9274
    { "(bad)",          { XX } },
9275
    { "pmovmskb",       { Gdq, MS } },
9276
  },
9277
  {
9278
    /* MOD_0FE7_PREFIX_2 */
9279
    { "movntdq",        { Mx, XM } },
9280
    { "(bad)",          { XX } },
9281
  },
9282
  {
9283
    /* MOD_0FF0_PREFIX_3 */
9284
    { "lddqu",          { XM, M } },
9285
    { "(bad)",          { XX } },
9286
  },
9287
  {
9288
    /* MOD_0F382A_PREFIX_2 */
9289
    { "movntdqa",       { XM, Mx } },
9290
    { "(bad)",          { XX } },
9291
  },
9292
  {
9293
    /* MOD_62_32BIT */
9294
    { "bound{S|}",      { Gv, Ma } },
9295
    { "(bad)",          { XX } },
9296
  },
9297
  {
9298
    /* MOD_C4_32BIT */
9299
    { "lesS",           { Gv, Mp } },
9300
    { VEX_C4_TABLE (VEX_0F) },
9301
  },
9302
  {
9303
    /* MOD_C5_32BIT */
9304
    { "ldsS",           { Gv, Mp } },
9305
    { VEX_C5_TABLE (VEX_0F) },
9306
  },
9307
  {
9308
    /* MOD_VEX_12_PREFIX_0 */
9309
    { VEX_LEN_TABLE (VEX_LEN_12_P_0_M_0) },
9310
    { VEX_LEN_TABLE (VEX_LEN_12_P_0_M_1) },
9311
  },
9312
  {
9313
    /* MOD_VEX_13 */
9314
    { VEX_LEN_TABLE (VEX_LEN_13_M_0) },
9315
    { "(bad)",          { XX } },
9316
  },
9317
  {
9318
    /* MOD_VEX_16_PREFIX_0 */
9319
    { VEX_LEN_TABLE (VEX_LEN_16_P_0_M_0) },
9320
    { VEX_LEN_TABLE (VEX_LEN_16_P_0_M_1) },
9321
  },
9322
  {
9323
    /* MOD_VEX_17 */
9324
    { VEX_LEN_TABLE (VEX_LEN_17_M_0) },
9325
    { "(bad)",          { XX } },
9326
  },
9327
  {
9328
    /* MOD_VEX_2B */
9329
    { VEX_LEN_TABLE (VEX_LEN_2B_M_0) },
9330
    { "(bad)",          { XX } },
9331
  },
9332
  {
9333
    /* MOD_VEX_51 */
9334
    { "(bad)",          { XX } },
9335
    { "vmovmskpX",      { Gdq, XS } },
9336
  },
9337
  {
9338
    /* MOD_VEX_71_REG_2 */
9339
    { "(bad)",          { XX } },
9340
    { PREFIX_TABLE (PREFIX_VEX_71_REG_2) },
9341
  },
9342
  {
9343
    /* MOD_VEX_71_REG_4 */
9344
    { "(bad)",          { XX } },
9345
    { PREFIX_TABLE (PREFIX_VEX_71_REG_4) },
9346
  },
9347
  {
9348
    /* MOD_VEX_71_REG_6 */
9349
    { "(bad)",          { XX } },
9350
    { PREFIX_TABLE (PREFIX_VEX_71_REG_6) },
9351
  },
9352
  {
9353
    /* MOD_VEX_72_REG_2 */
9354
    { "(bad)",          { XX } },
9355
    { PREFIX_TABLE (PREFIX_VEX_72_REG_2) },
9356
  },
9357
  {
9358
    /* MOD_VEX_72_REG_4 */
9359
    { "(bad)",          { XX } },
9360
    { PREFIX_TABLE (PREFIX_VEX_72_REG_4) },
9361
  },
9362
  {
9363
    /* MOD_VEX_72_REG_6 */
9364
    { "(bad)",          { XX } },
9365
    { PREFIX_TABLE (PREFIX_VEX_72_REG_6) },
9366
  },
9367
  {
9368
    /* MOD_VEX_73_REG_2 */
9369
    { "(bad)",          { XX } },
9370
    { PREFIX_TABLE (PREFIX_VEX_73_REG_2) },
9371
  },
9372
  {
9373
    /* MOD_VEX_73_REG_3 */
9374
    { "(bad)",          { XX } },
9375
    { PREFIX_TABLE (PREFIX_VEX_73_REG_3) },
9376
  },
9377
  {
9378
    /* MOD_VEX_73_REG_6 */
9379
    { "(bad)",          { XX } },
9380
    { PREFIX_TABLE (PREFIX_VEX_73_REG_6) },
9381
  },
9382
  {
9383
    /* MOD_VEX_73_REG_7 */
9384
    { "(bad)",          { XX } },
9385
    { PREFIX_TABLE (PREFIX_VEX_73_REG_7) },
9386
  },
9387
  {
9388
    /* MOD_VEX_AE_REG_2 */
9389
    { VEX_LEN_TABLE (VEX_LEN_AE_R_2_M_0) },
9390
    { "(bad)",          { XX } },
9391
  },
9392
  {
9393
    /* MOD_VEX_AE_REG_3 */
9394
    { VEX_LEN_TABLE (VEX_LEN_AE_R_3_M_0) },
9395
    { "(bad)",          { XX } },
9396
  },
9397
  {
9398
    /* MOD_VEX_D7_PREFIX_2 */
9399
    { "(bad)",          { XX } },
9400
    { VEX_LEN_TABLE (VEX_LEN_D7_P_2_M_1) },
9401
  },
9402
  {
9403
    /* MOD_VEX_E7_PREFIX_2 */
9404
    { VEX_LEN_TABLE (VEX_LEN_E7_P_2_M_0) },
9405
    { "(bad)",          { XX } },
9406
  },
9407
  {
9408
    /* MOD_VEX_F0_PREFIX_3 */
9409
    { "vlddqu",         { XM, M } },
9410
    { "(bad)",          { XX } },
9411
  },
9412
  {
9413
    /* MOD_VEX_3818_PREFIX_2 */
9414
    { "vbroadcastss",   { XM, Md } },
9415
    { "(bad)",          { XX } },
9416
  },
9417
  {
9418
    /* MOD_VEX_3819_PREFIX_2 */
9419
    { VEX_LEN_TABLE (VEX_LEN_3819_P_2_M_0) },
9420
    { "(bad)",          { XX } },
9421
  },
9422
  {
9423
    /* MOD_VEX_381A_PREFIX_2 */
9424
    { VEX_LEN_TABLE (VEX_LEN_381A_P_2_M_0) },
9425
    { "(bad)",          { XX } },
9426
  },
9427
  {
9428
    /* MOD_VEX_382A_PREFIX_2 */
9429
    { VEX_LEN_TABLE (VEX_LEN_382A_P_2_M_0) },
9430
    { "(bad)",          { XX } },
9431
  },
9432
  {
9433
    /* MOD_VEX_382C_PREFIX_2 */
9434
    { "vmaskmovps",     { XM, Vex, Mx } },
9435
    { "(bad)",          { XX } },
9436
  },
9437
  {
9438
    /* MOD_VEX_382D_PREFIX_2 */
9439
    { "vmaskmovpd",     { XM, Vex, Mx } },
9440
    { "(bad)",          { XX } },
9441
  },
9442
  {
9443
    /* MOD_VEX_382E_PREFIX_2 */
9444
    { "vmaskmovps",     { Mx, Vex, XM } },
9445
    { "(bad)",          { XX } },
9446
  },
9447
  {
9448
    /* MOD_VEX_382F_PREFIX_2 */
9449
    { "vmaskmovpd",     { Mx, Vex, XM } },
9450
    { "(bad)",          { XX } },
9451
  },
9452
};
9453
 
9454
static const struct dis386 rm_table[][8] = {
9455
  {
9456
    /* RM_0F01_REG_0 */
9457
    { "(bad)",          { XX } },
9458
    { "vmcall",         { Skip_MODRM } },
9459
    { "vmlaunch",       { Skip_MODRM } },
9460
    { "vmresume",       { Skip_MODRM } },
9461
    { "vmxoff",         { Skip_MODRM } },
9462
    { "(bad)",          { XX } },
9463
    { "(bad)",          { XX } },
9464
    { "(bad)",          { XX } },
9465
  },
9466
  {
9467
    /* RM_0F01_REG_1 */
9468
    { "monitor",        { { OP_Monitor, 0 } } },
9469
    { "mwait",          { { OP_Mwait, 0 } } },
9470
    { "(bad)",          { XX } },
9471
    { "(bad)",          { XX } },
9472
    { "(bad)",          { XX } },
9473
    { "(bad)",          { XX } },
9474
    { "(bad)",          { XX } },
9475
    { "(bad)",          { XX } },
9476
  },
9477
  {
9478
    /* RM_0F01_REG_2 */
9479
    { "xgetbv",         { Skip_MODRM } },
9480
    { "xsetbv",         { Skip_MODRM } },
9481
    { "(bad)",          { XX } },
9482
    { "(bad)",          { XX } },
9483
    { "(bad)",          { XX } },
9484
    { "(bad)",          { XX } },
9485
    { "(bad)",          { XX } },
9486
    { "(bad)",          { XX } },
9487
  },
9488
  {
9489
    /* RM_0F01_REG_3 */
9490
    { "vmrun",          { Skip_MODRM } },
9491
    { "vmmcall",        { Skip_MODRM } },
9492
    { "vmload",         { Skip_MODRM } },
9493
    { "vmsave",         { Skip_MODRM } },
9494
    { "stgi",           { Skip_MODRM } },
9495
    { "clgi",           { Skip_MODRM } },
9496
    { "skinit",         { Skip_MODRM } },
9497
    { "invlpga",        { Skip_MODRM } },
9498
  },
9499
  {
9500
    /* RM_0F01_REG_7 */
9501
    { "swapgs",         { Skip_MODRM } },
9502
    { "rdtscp",         { Skip_MODRM } },
9503
    { "(bad)",          { XX } },
9504
    { "(bad)",          { XX } },
9505
    { "(bad)",          { XX } },
9506
    { "(bad)",          { XX } },
9507
    { "(bad)",          { XX } },
9508
    { "(bad)",          { XX } },
9509
  },
9510
  {
9511
    /* RM_0FAE_REG_5 */
9512
    { "lfence",         { Skip_MODRM } },
9513
    { "(bad)",          { XX } },
9514
    { "(bad)",          { XX } },
9515
    { "(bad)",          { XX } },
9516
    { "(bad)",          { XX } },
9517
    { "(bad)",          { XX } },
9518
    { "(bad)",          { XX } },
9519
    { "(bad)",          { XX } },
9520
  },
9521
  {
9522
    /* RM_0FAE_REG_6 */
9523
    { "mfence",         { Skip_MODRM } },
9524
    { "(bad)",          { XX } },
9525
    { "(bad)",          { XX } },
9526
    { "(bad)",          { XX } },
9527
    { "(bad)",          { XX } },
9528
    { "(bad)",          { XX } },
9529
    { "(bad)",          { XX } },
9530
    { "(bad)",          { XX } },
9531
  },
9532
  {
9533
    /* RM_0FAE_REG_7 */
9534
    { "sfence",         { Skip_MODRM } },
9535
    { "(bad)",          { XX } },
9536
    { "(bad)",          { XX } },
9537
    { "(bad)",          { XX } },
9538
    { "(bad)",          { XX } },
9539
    { "(bad)",          { XX } },
9540
    { "(bad)",          { XX } },
9541
    { "(bad)",          { XX } },
9542
  },
9543
};
9544
 
9545
#define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
9546
 
9547
static void
9548
ckprefix (void)
9549
{
9550
  int newrex;
9551
  rex = 0;
9552
  rex_original = 0;
9553
  rex_ignored = 0;
9554
  prefixes = 0;
9555
  used_prefixes = 0;
9556
  rex_used = 0;
9557
  while (1)
9558
    {
9559
      FETCH_DATA (the_info, codep + 1);
9560
      newrex = 0;
9561
      switch (*codep)
9562
        {
9563
        /* REX prefixes family.  */
9564
        case 0x40:
9565
        case 0x41:
9566
        case 0x42:
9567
        case 0x43:
9568
        case 0x44:
9569
        case 0x45:
9570
        case 0x46:
9571
        case 0x47:
9572
        case 0x48:
9573
        case 0x49:
9574
        case 0x4a:
9575
        case 0x4b:
9576
        case 0x4c:
9577
        case 0x4d:
9578
        case 0x4e:
9579
        case 0x4f:
9580
            if (address_mode == mode_64bit)
9581
              newrex = *codep;
9582
            else
9583
              return;
9584
          break;
9585
        case 0xf3:
9586
          prefixes |= PREFIX_REPZ;
9587
          break;
9588
        case 0xf2:
9589
          prefixes |= PREFIX_REPNZ;
9590
          break;
9591
        case 0xf0:
9592
          prefixes |= PREFIX_LOCK;
9593
          break;
9594
        case 0x2e:
9595
          prefixes |= PREFIX_CS;
9596
          break;
9597
        case 0x36:
9598
          prefixes |= PREFIX_SS;
9599
          break;
9600
        case 0x3e:
9601
          prefixes |= PREFIX_DS;
9602
          break;
9603
        case 0x26:
9604
          prefixes |= PREFIX_ES;
9605
          break;
9606
        case 0x64:
9607
          prefixes |= PREFIX_FS;
9608
          break;
9609
        case 0x65:
9610
          prefixes |= PREFIX_GS;
9611
          break;
9612
        case 0x66:
9613
          prefixes |= PREFIX_DATA;
9614
          break;
9615
        case 0x67:
9616
          prefixes |= PREFIX_ADDR;
9617
          break;
9618
        case FWAIT_OPCODE:
9619
          /* fwait is really an instruction.  If there are prefixes
9620
             before the fwait, they belong to the fwait, *not* to the
9621
             following instruction.  */
9622
          if (prefixes || rex)
9623
            {
9624
              prefixes |= PREFIX_FWAIT;
9625
              codep++;
9626
              return;
9627
            }
9628
          prefixes = PREFIX_FWAIT;
9629
          break;
9630
        default:
9631
          return;
9632
        }
9633
      /* Rex is ignored when followed by another prefix.  */
9634
      if (rex)
9635
        {
9636
          rex_used = rex;
9637
          return;
9638
        }
9639
      rex = newrex;
9640
      rex_original = rex;
9641
      codep++;
9642
    }
9643
}
9644
 
9645
/* Return the name of the prefix byte PREF, or NULL if PREF is not a
9646
   prefix byte.  */
9647
 
9648
static const char *
9649
prefix_name (int pref, int sizeflag)
9650
{
9651
  static const char *rexes [16] =
9652
    {
9653
      "rex",            /* 0x40 */
9654
      "rex.B",          /* 0x41 */
9655
      "rex.X",          /* 0x42 */
9656
      "rex.XB",         /* 0x43 */
9657
      "rex.R",          /* 0x44 */
9658
      "rex.RB",         /* 0x45 */
9659
      "rex.RX",         /* 0x46 */
9660
      "rex.RXB",        /* 0x47 */
9661
      "rex.W",          /* 0x48 */
9662
      "rex.WB",         /* 0x49 */
9663
      "rex.WX",         /* 0x4a */
9664
      "rex.WXB",        /* 0x4b */
9665
      "rex.WR",         /* 0x4c */
9666
      "rex.WRB",        /* 0x4d */
9667
      "rex.WRX",        /* 0x4e */
9668
      "rex.WRXB",       /* 0x4f */
9669
    };
9670
 
9671
  switch (pref)
9672
    {
9673
    /* REX prefixes family.  */
9674
    case 0x40:
9675
    case 0x41:
9676
    case 0x42:
9677
    case 0x43:
9678
    case 0x44:
9679
    case 0x45:
9680
    case 0x46:
9681
    case 0x47:
9682
    case 0x48:
9683
    case 0x49:
9684
    case 0x4a:
9685
    case 0x4b:
9686
    case 0x4c:
9687
    case 0x4d:
9688
    case 0x4e:
9689
    case 0x4f:
9690
      return rexes [pref - 0x40];
9691
    case 0xf3:
9692
      return "repz";
9693
    case 0xf2:
9694
      return "repnz";
9695
    case 0xf0:
9696
      return "lock";
9697
    case 0x2e:
9698
      return "cs";
9699
    case 0x36:
9700
      return "ss";
9701
    case 0x3e:
9702
      return "ds";
9703
    case 0x26:
9704
      return "es";
9705
    case 0x64:
9706
      return "fs";
9707
    case 0x65:
9708
      return "gs";
9709
    case 0x66:
9710
      return (sizeflag & DFLAG) ? "data16" : "data32";
9711
    case 0x67:
9712
      if (address_mode == mode_64bit)
9713
        return (sizeflag & AFLAG) ? "addr32" : "addr64";
9714
      else
9715
        return (sizeflag & AFLAG) ? "addr16" : "addr32";
9716
    case FWAIT_OPCODE:
9717
      return "fwait";
9718
    default:
9719
      return NULL;
9720
    }
9721
}
9722
 
9723
static char op_out[MAX_OPERANDS][100];
9724
static int op_ad, op_index[MAX_OPERANDS];
9725
static int two_source_ops;
9726
static bfd_vma op_address[MAX_OPERANDS];
9727
static bfd_vma op_riprel[MAX_OPERANDS];
9728
static bfd_vma start_pc;
9729
 
9730
/*
9731
 *   On the 386's of 1988, the maximum length of an instruction is 15 bytes.
9732
 *   (see topic "Redundant prefixes" in the "Differences from 8086"
9733
 *   section of the "Virtual 8086 Mode" chapter.)
9734
 * 'pc' should be the address of this instruction, it will
9735
 *   be used to print the target address if this is a relative jump or call
9736
 * The function returns the length of this instruction in bytes.
9737
 */
9738
 
9739
static char intel_syntax;
9740
static char intel_mnemonic = !SYSV386_COMPAT;
9741
static char open_char;
9742
static char close_char;
9743
static char separator_char;
9744
static char scale_char;
9745
 
9746
/* Here for backwards compatibility.  When gdb stops using
9747
   print_insn_i386_att and print_insn_i386_intel these functions can
9748
   disappear, and print_insn_i386 be merged into print_insn.  */
9749
int
9750
print_insn_i386_att (bfd_vma pc, disassemble_info *info)
9751
{
9752
  intel_syntax = 0;
9753
 
9754
  return print_insn (pc, info);
9755
}
9756
 
9757
int
9758
print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
9759
{
9760
  intel_syntax = 1;
9761
 
9762
  return print_insn (pc, info);
9763
}
9764
 
9765
int
9766
print_insn_i386 (bfd_vma pc, disassemble_info *info)
9767
{
9768
  intel_syntax = -1;
9769
 
9770
  return print_insn (pc, info);
9771
}
9772
 
9773
void
9774
print_i386_disassembler_options (FILE *stream)
9775
{
9776
  fprintf (stream, _("\n\
9777
The following i386/x86-64 specific disassembler options are supported for use\n\
9778
with the -M switch (multiple options should be separated by commas):\n"));
9779
 
9780
  fprintf (stream, _("  x86-64      Disassemble in 64bit mode\n"));
9781
  fprintf (stream, _("  i386        Disassemble in 32bit mode\n"));
9782
  fprintf (stream, _("  i8086       Disassemble in 16bit mode\n"));
9783
  fprintf (stream, _("  att         Display instruction in AT&T syntax\n"));
9784
  fprintf (stream, _("  intel       Display instruction in Intel syntax\n"));
9785
  fprintf (stream, _("  att-mnemonic\n"
9786
                     "              Display instruction in AT&T mnemonic\n"));
9787
  fprintf (stream, _("  intel-mnemonic\n"
9788
                     "              Display instruction in Intel mnemonic\n"));
9789
  fprintf (stream, _("  addr64      Assume 64bit address size\n"));
9790
  fprintf (stream, _("  addr32      Assume 32bit address size\n"));
9791
  fprintf (stream, _("  addr16      Assume 16bit address size\n"));
9792
  fprintf (stream, _("  data32      Assume 32bit data size\n"));
9793
  fprintf (stream, _("  data16      Assume 16bit data size\n"));
9794
  fprintf (stream, _("  suffix      Always display instruction suffix in AT&T syntax\n"));
9795
}
9796
 
9797
/* Get a pointer to struct dis386 with a valid name.  */
9798
 
9799
static const struct dis386 *
9800
get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
9801
{
9802
  int index, vex_table_index;
9803
 
9804
  if (dp->name != NULL)
9805
    return dp;
9806
 
9807
  switch (dp->op[0].bytemode)
9808
    {
9809
    case USE_REG_TABLE:
9810
      dp = &reg_table[dp->op[1].bytemode][modrm.reg];
9811
      break;
9812
 
9813
    case USE_MOD_TABLE:
9814
      index = modrm.mod == 0x3 ? 1 : 0;
9815
      dp = &mod_table[dp->op[1].bytemode][index];
9816
      break;
9817
 
9818
    case USE_RM_TABLE:
9819
      dp = &rm_table[dp->op[1].bytemode][modrm.rm];
9820
      break;
9821
 
9822
    case USE_PREFIX_TABLE:
9823
      if (need_vex)
9824
        {
9825
          /* The prefix in VEX is implicit.  */
9826
          switch (vex.prefix)
9827
            {
9828
            case 0:
9829
              index = 0;
9830
              break;
9831
            case REPE_PREFIX_OPCODE:
9832
              index = 1;
9833
              break;
9834
            case DATA_PREFIX_OPCODE:
9835
              index = 2;
9836
              break;
9837
            case REPNE_PREFIX_OPCODE:
9838
              index = 3;
9839
              break;
9840
            default:
9841
              abort ();
9842
              break;
9843
            }
9844
        }
9845
      else
9846
        {
9847
          index = 0;
9848
          used_prefixes |= (prefixes & PREFIX_REPZ);
9849
          if (prefixes & PREFIX_REPZ)
9850
            {
9851
              index = 1;
9852
              repz_prefix = NULL;
9853
            }
9854
          else
9855
            {
9856
              /* We should check PREFIX_REPNZ and PREFIX_REPZ before
9857
                 PREFIX_DATA.  */
9858
              used_prefixes |= (prefixes & PREFIX_REPNZ);
9859
              if (prefixes & PREFIX_REPNZ)
9860
                {
9861
                  index = 3;
9862
                  repnz_prefix = NULL;
9863
                }
9864
              else
9865
                {
9866
                  used_prefixes |= (prefixes & PREFIX_DATA);
9867
                  if (prefixes & PREFIX_DATA)
9868
                    {
9869
                      index = 2;
9870
                      data_prefix = NULL;
9871
                    }
9872
                }
9873
            }
9874
        }
9875
      dp = &prefix_table[dp->op[1].bytemode][index];
9876
      break;
9877
 
9878
    case USE_X86_64_TABLE:
9879
      index = address_mode == mode_64bit ? 1 : 0;
9880
      dp = &x86_64_table[dp->op[1].bytemode][index];
9881
      break;
9882
 
9883
    case USE_3BYTE_TABLE:
9884
      FETCH_DATA (info, codep + 2);
9885
      index = *codep++;
9886
      dp = &three_byte_table[dp->op[1].bytemode][index];
9887
      modrm.mod = (*codep >> 6) & 3;
9888
      modrm.reg = (*codep >> 3) & 7;
9889
      modrm.rm = *codep & 7;
9890
      break;
9891
 
9892
    case USE_VEX_LEN_TABLE:
9893
      if (!need_vex)
9894
        abort ();
9895
 
9896
      switch (vex.length)
9897
        {
9898
        case 128:
9899
          index = 0;
9900
          break;
9901
        case 256:
9902
          index = 1;
9903
          break;
9904
        default:
9905
          abort ();
9906
          break;
9907
        }
9908
 
9909
      dp = &vex_len_table[dp->op[1].bytemode][index];
9910
      break;
9911
 
9912
    case USE_VEX_C4_TABLE:
9913
      FETCH_DATA (info, codep + 3);
9914
      /* All bits in the REX prefix are ignored.  */
9915
      rex_ignored = rex;
9916
      rex = ~(*codep >> 5) & 0x7;
9917
      switch ((*codep & 0x1f))
9918
        {
9919
        default:
9920
          BadOp ();
9921
        case 0x1:
9922
          vex_table_index = 0;
9923
          break;
9924
        case 0x2:
9925
          vex_table_index = 1;
9926
          break;
9927
        case 0x3:
9928
          vex_table_index = 2;
9929
          break;
9930
        }
9931
      codep++;
9932
      vex.w = *codep & 0x80;
9933
      if (vex.w && address_mode == mode_64bit)
9934
        rex |= REX_W;
9935
 
9936
      vex.register_specifier = (~(*codep >> 3)) & 0xf;
9937
      if (address_mode != mode_64bit
9938
          && vex.register_specifier > 0x7)
9939
        BadOp ();
9940
 
9941
      vex.length = (*codep & 0x4) ? 256 : 128;
9942
      switch ((*codep & 0x3))
9943
        {
9944
        case 0:
9945
          vex.prefix = 0;
9946
          break;
9947
        case 1:
9948
          vex.prefix = DATA_PREFIX_OPCODE;
9949
          break;
9950
        case 2:
9951
          vex.prefix = REPE_PREFIX_OPCODE;
9952
          break;
9953
        case 3:
9954
          vex.prefix = REPNE_PREFIX_OPCODE;
9955
          break;
9956
        }
9957
      need_vex = 1;
9958
      need_vex_reg = 1;
9959
      codep++;
9960
      index = *codep++;
9961
      dp = &vex_table[vex_table_index][index];
9962
      /* There is no MODRM byte for VEX [82|77].  */
9963
      if (index != 0x77 && index != 0x82)
9964
        {
9965
          FETCH_DATA (info, codep + 1);
9966
          modrm.mod = (*codep >> 6) & 3;
9967
          modrm.reg = (*codep >> 3) & 7;
9968
          modrm.rm = *codep & 7;
9969
        }
9970
      break;
9971
 
9972
    case USE_VEX_C5_TABLE:
9973
      FETCH_DATA (info, codep + 2);
9974
      /* All bits in the REX prefix are ignored.  */
9975
      rex_ignored = rex;
9976
      rex = (*codep & 0x80) ? 0 : REX_R;
9977
 
9978
      vex.register_specifier = (~(*codep >> 3)) & 0xf;
9979
      if (address_mode != mode_64bit
9980
          && vex.register_specifier > 0x7)
9981
        BadOp ();
9982
 
9983
      vex.length = (*codep & 0x4) ? 256 : 128;
9984
      switch ((*codep & 0x3))
9985
        {
9986
        case 0:
9987
          vex.prefix = 0;
9988
          break;
9989
        case 1:
9990
          vex.prefix = DATA_PREFIX_OPCODE;
9991
          break;
9992
        case 2:
9993
          vex.prefix = REPE_PREFIX_OPCODE;
9994
          break;
9995
        case 3:
9996
          vex.prefix = REPNE_PREFIX_OPCODE;
9997
          break;
9998
        }
9999
      need_vex = 1;
10000
      need_vex_reg = 1;
10001
      codep++;
10002
      index = *codep++;
10003
      dp = &vex_table[dp->op[1].bytemode][index];
10004
      /* There is no MODRM byte for VEX [82|77].  */
10005
      if (index != 0x77 && index != 0x82)
10006
        {
10007
          FETCH_DATA (info, codep + 1);
10008
          modrm.mod = (*codep >> 6) & 3;
10009
          modrm.reg = (*codep >> 3) & 7;
10010
          modrm.rm = *codep & 7;
10011
        }
10012
      break;
10013
 
10014
    default:
10015
      oappend (INTERNAL_DISASSEMBLER_ERROR);
10016
      return NULL;
10017
    }
10018
 
10019
  if (dp->name != NULL)
10020
    return dp;
10021
  else
10022
    return get_valid_dis386 (dp, info);
10023
}
10024
 
10025
static int
10026
print_insn (bfd_vma pc, disassemble_info *info)
10027
{
10028
  const struct dis386 *dp;
10029
  int i;
10030
  char *op_txt[MAX_OPERANDS];
10031
  int needcomma;
10032
  int sizeflag;
10033
  const char *p;
10034
  struct dis_private priv;
10035
  unsigned char op;
10036
  char prefix_obuf[32];
10037
  char *prefix_obufp;
10038
 
10039
  if (info->mach == bfd_mach_x86_64_intel_syntax
10040
      || info->mach == bfd_mach_x86_64)
10041
    address_mode = mode_64bit;
10042
  else
10043
    address_mode = mode_32bit;
10044
 
10045
  if (intel_syntax == (char) -1)
10046
    intel_syntax = (info->mach == bfd_mach_i386_i386_intel_syntax
10047
                    || info->mach == bfd_mach_x86_64_intel_syntax);
10048
 
10049
  if (info->mach == bfd_mach_i386_i386
10050
      || info->mach == bfd_mach_x86_64
10051
      || info->mach == bfd_mach_i386_i386_intel_syntax
10052
      || info->mach == bfd_mach_x86_64_intel_syntax)
10053
    priv.orig_sizeflag = AFLAG | DFLAG;
10054
  else if (info->mach == bfd_mach_i386_i8086)
10055
    priv.orig_sizeflag = 0;
10056
  else
10057
    abort ();
10058
 
10059
  for (p = info->disassembler_options; p != NULL; )
10060
    {
10061
      if (CONST_STRNEQ (p, "x86-64"))
10062
        {
10063
          address_mode = mode_64bit;
10064
          priv.orig_sizeflag = AFLAG | DFLAG;
10065
        }
10066
      else if (CONST_STRNEQ (p, "i386"))
10067
        {
10068
          address_mode = mode_32bit;
10069
          priv.orig_sizeflag = AFLAG | DFLAG;
10070
        }
10071
      else if (CONST_STRNEQ (p, "i8086"))
10072
        {
10073
          address_mode = mode_16bit;
10074
          priv.orig_sizeflag = 0;
10075
        }
10076
      else if (CONST_STRNEQ (p, "intel"))
10077
        {
10078
          intel_syntax = 1;
10079
          if (CONST_STRNEQ (p + 5, "-mnemonic"))
10080
            intel_mnemonic = 1;
10081
        }
10082
      else if (CONST_STRNEQ (p, "att"))
10083
        {
10084
          intel_syntax = 0;
10085
          if (CONST_STRNEQ (p + 3, "-mnemonic"))
10086
            intel_mnemonic = 0;
10087
        }
10088
      else if (CONST_STRNEQ (p, "addr"))
10089
        {
10090
          if (address_mode == mode_64bit)
10091
            {
10092
              if (p[4] == '3' && p[5] == '2')
10093
                priv.orig_sizeflag &= ~AFLAG;
10094
              else if (p[4] == '6' && p[5] == '4')
10095
                priv.orig_sizeflag |= AFLAG;
10096
            }
10097
          else
10098
            {
10099
              if (p[4] == '1' && p[5] == '6')
10100
                priv.orig_sizeflag &= ~AFLAG;
10101
              else if (p[4] == '3' && p[5] == '2')
10102
                priv.orig_sizeflag |= AFLAG;
10103
            }
10104
        }
10105
      else if (CONST_STRNEQ (p, "data"))
10106
        {
10107
          if (p[4] == '1' && p[5] == '6')
10108
            priv.orig_sizeflag &= ~DFLAG;
10109
          else if (p[4] == '3' && p[5] == '2')
10110
            priv.orig_sizeflag |= DFLAG;
10111
        }
10112
      else if (CONST_STRNEQ (p, "suffix"))
10113
        priv.orig_sizeflag |= SUFFIX_ALWAYS;
10114
 
10115
      p = strchr (p, ',');
10116
      if (p != NULL)
10117
        p++;
10118
    }
10119
 
10120
  if (intel_syntax)
10121
    {
10122
      names64 = intel_names64;
10123
      names32 = intel_names32;
10124
      names16 = intel_names16;
10125
      names8 = intel_names8;
10126
      names8rex = intel_names8rex;
10127
      names_seg = intel_names_seg;
10128
      index64 = intel_index64;
10129
      index32 = intel_index32;
10130
      index16 = intel_index16;
10131
      open_char = '[';
10132
      close_char = ']';
10133
      separator_char = '+';
10134
      scale_char = '*';
10135
    }
10136
  else
10137
    {
10138
      names64 = att_names64;
10139
      names32 = att_names32;
10140
      names16 = att_names16;
10141
      names8 = att_names8;
10142
      names8rex = att_names8rex;
10143
      names_seg = att_names_seg;
10144
      index64 = att_index64;
10145
      index32 = att_index32;
10146
      index16 = att_index16;
10147
      open_char = '(';
10148
      close_char =  ')';
10149
      separator_char = ',';
10150
      scale_char = ',';
10151
    }
10152
 
10153
  /* The output looks better if we put 7 bytes on a line, since that
10154
     puts most long word instructions on a single line.  */
10155
  info->bytes_per_line = 7;
10156
 
10157
  info->private_data = &priv;
10158
  priv.max_fetched = priv.the_buffer;
10159
  priv.insn_start = pc;
10160
 
10161
  obuf[0] = 0;
10162
  for (i = 0; i < MAX_OPERANDS; ++i)
10163
    {
10164
      op_out[i][0] = 0;
10165
      op_index[i] = -1;
10166
    }
10167
 
10168
  the_info = info;
10169
  start_pc = pc;
10170
  start_codep = priv.the_buffer;
10171
  codep = priv.the_buffer;
10172
 
10173
  if (setjmp (priv.bailout) != 0)
10174
    {
10175
      const char *name;
10176
 
10177
      /* Getting here means we tried for data but didn't get it.  That
10178
         means we have an incomplete instruction of some sort.  Just
10179
         print the first byte as a prefix or a .byte pseudo-op.  */
10180
      if (codep > priv.the_buffer)
10181
        {
10182
          name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
10183
          if (name != NULL)
10184
            (*info->fprintf_func) (info->stream, "%s", name);
10185
          else
10186
            {
10187
              /* Just print the first byte as a .byte instruction.  */
10188
              (*info->fprintf_func) (info->stream, ".byte 0x%x",
10189
                                     (unsigned int) priv.the_buffer[0]);
10190
            }
10191
 
10192
          return 1;
10193
        }
10194
 
10195
      return -1;
10196
    }
10197
 
10198
  obufp = obuf;
10199
  ckprefix ();
10200
 
10201
  insn_codep = codep;
10202
  sizeflag = priv.orig_sizeflag;
10203
 
10204
  FETCH_DATA (info, codep + 1);
10205
  two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
10206
 
10207
  if (((prefixes & PREFIX_FWAIT)
10208
       && ((*codep < 0xd8) || (*codep > 0xdf)))
10209
      || (rex && rex_used))
10210
    {
10211
      const char *name;
10212
 
10213
      /* fwait not followed by floating point instruction, or rex followed
10214
         by other prefixes.  Print the first prefix.  */
10215
      name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
10216
      if (name == NULL)
10217
        name = INTERNAL_DISASSEMBLER_ERROR;
10218
      (*info->fprintf_func) (info->stream, "%s", name);
10219
      return 1;
10220
    }
10221
 
10222
  op = 0;
10223
  if (*codep == 0x0f)
10224
    {
10225
      unsigned char threebyte;
10226
      FETCH_DATA (info, codep + 2);
10227
      threebyte = *++codep;
10228
      dp = &dis386_twobyte[threebyte];
10229
      need_modrm = twobyte_has_modrm[*codep];
10230
      codep++;
10231
    }
10232
  else
10233
    {
10234
      dp = &dis386[*codep];
10235
      need_modrm = onebyte_has_modrm[*codep];
10236
      codep++;
10237
    }
10238
 
10239
  if ((prefixes & PREFIX_REPZ))
10240
    {
10241
      repz_prefix = "repz ";
10242
      used_prefixes |= PREFIX_REPZ;
10243
    }
10244
  else
10245
    repz_prefix = NULL;
10246
 
10247
  if ((prefixes & PREFIX_REPNZ))
10248
    {
10249
      repnz_prefix = "repnz ";
10250
      used_prefixes |= PREFIX_REPNZ;
10251
    }
10252
  else
10253
    repnz_prefix = NULL;
10254
 
10255
  if ((prefixes & PREFIX_LOCK))
10256
    {
10257
      lock_prefix = "lock ";
10258
      used_prefixes |= PREFIX_LOCK;
10259
    }
10260
  else
10261
    lock_prefix = NULL;
10262
 
10263
  addr_prefix = NULL;
10264
  if (prefixes & PREFIX_ADDR)
10265
    {
10266
      sizeflag ^= AFLAG;
10267
      if (dp->op[2].bytemode != loop_jcxz_mode || intel_syntax)
10268
        {
10269
          if ((sizeflag & AFLAG) || address_mode == mode_64bit)
10270
            addr_prefix = "addr32 ";
10271
          else
10272
            addr_prefix = "addr16 ";
10273
          used_prefixes |= PREFIX_ADDR;
10274
        }
10275
    }
10276
 
10277
  data_prefix = NULL;
10278
  if ((prefixes & PREFIX_DATA))
10279
    {
10280
      sizeflag ^= DFLAG;
10281
      if (dp->op[2].bytemode == cond_jump_mode
10282
          && dp->op[0].bytemode == v_mode
10283
          && !intel_syntax)
10284
        {
10285
          if (sizeflag & DFLAG)
10286
            data_prefix = "data32 ";
10287
          else
10288
            data_prefix = "data16 ";
10289
          used_prefixes |= PREFIX_DATA;
10290
        }
10291
    }
10292
 
10293
  if (need_modrm)
10294
    {
10295
      FETCH_DATA (info, codep + 1);
10296
      modrm.mod = (*codep >> 6) & 3;
10297
      modrm.reg = (*codep >> 3) & 7;
10298
      modrm.rm = *codep & 7;
10299
    }
10300
 
10301
  if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
10302
    {
10303
      dofloat (sizeflag);
10304
    }
10305
  else
10306
    {
10307
      need_vex = 0;
10308
      need_vex_reg = 0;
10309
      vex_w_done = 0;
10310
      dp = get_valid_dis386 (dp, info);
10311
      if (dp != NULL && putop (dp->name, sizeflag) == 0)
10312
        {
10313
          for (i = 0; i < MAX_OPERANDS; ++i)
10314
            {
10315
              obufp = op_out[i];
10316
              op_ad = MAX_OPERANDS - 1 - i;
10317
              if (dp->op[i].rtn)
10318
                (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
10319
            }
10320
        }
10321
    }
10322
 
10323
  /* See if any prefixes were not used.  If so, print the first one
10324
     separately.  If we don't do this, we'll wind up printing an
10325
     instruction stream which does not precisely correspond to the
10326
     bytes we are disassembling.  */
10327
  if ((prefixes & ~used_prefixes) != 0)
10328
    {
10329
      const char *name;
10330
 
10331
      name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
10332
      if (name == NULL)
10333
        name = INTERNAL_DISASSEMBLER_ERROR;
10334
      (*info->fprintf_func) (info->stream, "%s", name);
10335
      return 1;
10336
    }
10337
  if ((rex_original & ~rex_used) || rex_ignored)
10338
    {
10339
      const char *name;
10340
      name = prefix_name (rex_original, priv.orig_sizeflag);
10341
      if (name == NULL)
10342
        name = INTERNAL_DISASSEMBLER_ERROR;
10343
      (*info->fprintf_func) (info->stream, "%s ", name);
10344
    }
10345
 
10346
  prefix_obuf[0] = 0;
10347
  prefix_obufp = prefix_obuf;
10348
  if (lock_prefix)
10349
    prefix_obufp = stpcpy (prefix_obufp, lock_prefix);
10350
  if (repz_prefix)
10351
    prefix_obufp = stpcpy (prefix_obufp, repz_prefix);
10352
  if (repnz_prefix)
10353
    prefix_obufp = stpcpy (prefix_obufp, repnz_prefix);
10354
  if (addr_prefix)
10355
    prefix_obufp = stpcpy (prefix_obufp, addr_prefix);
10356
  if (data_prefix)
10357
    prefix_obufp = stpcpy (prefix_obufp, data_prefix);
10358
 
10359
  if (prefix_obuf[0] != 0)
10360
    (*info->fprintf_func) (info->stream, "%s", prefix_obuf);
10361
 
10362
  obufp = obuf + strlen (obuf);
10363
  for (i = strlen (obuf) + strlen (prefix_obuf); i < 6; i++)
10364
    oappend (" ");
10365
  oappend (" ");
10366
  (*info->fprintf_func) (info->stream, "%s", obuf);
10367
 
10368
  /* The enter and bound instructions are printed with operands in the same
10369
     order as the intel book; everything else is printed in reverse order.  */
10370
  if (intel_syntax || two_source_ops)
10371
    {
10372
      bfd_vma riprel;
10373
 
10374
      for (i = 0; i < MAX_OPERANDS; ++i)
10375
        op_txt[i] = op_out[i];
10376
 
10377
      for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
10378
        {
10379
          op_ad = op_index[i];
10380
          op_index[i] = op_index[MAX_OPERANDS - 1 - i];
10381
          op_index[MAX_OPERANDS - 1 - i] = op_ad;
10382
          riprel = op_riprel[i];
10383
          op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
10384
          op_riprel[MAX_OPERANDS - 1 - i] = riprel;
10385
        }
10386
    }
10387
  else
10388
    {
10389
      for (i = 0; i < MAX_OPERANDS; ++i)
10390
        op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
10391
    }
10392
 
10393
  needcomma = 0;
10394
  for (i = 0; i < MAX_OPERANDS; ++i)
10395
    if (*op_txt[i])
10396
      {
10397
        if (needcomma)
10398
          (*info->fprintf_func) (info->stream, ",");
10399
        if (op_index[i] != -1 && !op_riprel[i])
10400
          (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
10401
        else
10402
          (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
10403
        needcomma = 1;
10404
      }
10405
 
10406
  for (i = 0; i < MAX_OPERANDS; i++)
10407
    if (op_index[i] != -1 && op_riprel[i])
10408
      {
10409
        (*info->fprintf_func) (info->stream, "        # ");
10410
        (*info->print_address_func) ((bfd_vma) (start_pc + codep - start_codep
10411
                                                + op_address[op_index[i]]), info);
10412
        break;
10413
      }
10414
  return codep - priv.the_buffer;
10415
}
10416
 
10417
static const char *float_mem[] = {
10418
  /* d8 */
10419
  "fadd{s|}",
10420
  "fmul{s|}",
10421
  "fcom{s|}",
10422
  "fcomp{s|}",
10423
  "fsub{s|}",
10424
  "fsubr{s|}",
10425
  "fdiv{s|}",
10426
  "fdivr{s|}",
10427
  /* d9 */
10428
  "fld{s|}",
10429
  "(bad)",
10430
  "fst{s|}",
10431
  "fstp{s|}",
10432
  "fldenvIC",
10433
  "fldcw",
10434
  "fNstenvIC",
10435
  "fNstcw",
10436
  /* da */
10437
  "fiadd{l|}",
10438
  "fimul{l|}",
10439
  "ficom{l|}",
10440
  "ficomp{l|}",
10441
  "fisub{l|}",
10442
  "fisubr{l|}",
10443
  "fidiv{l|}",
10444
  "fidivr{l|}",
10445
  /* db */
10446
  "fild{l|}",
10447
  "fisttp{l|}",
10448
  "fist{l|}",
10449
  "fistp{l|}",
10450
  "(bad)",
10451
  "fld{t||t|}",
10452
  "(bad)",
10453
  "fstp{t||t|}",
10454
  /* dc */
10455
  "fadd{l|}",
10456
  "fmul{l|}",
10457
  "fcom{l|}",
10458
  "fcomp{l|}",
10459
  "fsub{l|}",
10460
  "fsubr{l|}",
10461
  "fdiv{l|}",
10462
  "fdivr{l|}",
10463
  /* dd */
10464
  "fld{l|}",
10465
  "fisttp{ll|}",
10466
  "fst{l||}",
10467
  "fstp{l|}",
10468
  "frstorIC",
10469
  "(bad)",
10470
  "fNsaveIC",
10471
  "fNstsw",
10472
  /* de */
10473
  "fiadd",
10474
  "fimul",
10475
  "ficom",
10476
  "ficomp",
10477
  "fisub",
10478
  "fisubr",
10479
  "fidiv",
10480
  "fidivr",
10481
  /* df */
10482
  "fild",
10483
  "fisttp",
10484
  "fist",
10485
  "fistp",
10486
  "fbld",
10487
  "fild{ll|}",
10488
  "fbstp",
10489
  "fistp{ll|}",
10490
};
10491
 
10492
static const unsigned char float_mem_mode[] = {
10493
  /* d8 */
10494
  d_mode,
10495
  d_mode,
10496
  d_mode,
10497
  d_mode,
10498
  d_mode,
10499
  d_mode,
10500
  d_mode,
10501
  d_mode,
10502
  /* d9 */
10503
  d_mode,
10504
  0,
10505
  d_mode,
10506
  d_mode,
10507
  0,
10508
  w_mode,
10509
  0,
10510
  w_mode,
10511
  /* da */
10512
  d_mode,
10513
  d_mode,
10514
  d_mode,
10515
  d_mode,
10516
  d_mode,
10517
  d_mode,
10518
  d_mode,
10519
  d_mode,
10520
  /* db */
10521
  d_mode,
10522
  d_mode,
10523
  d_mode,
10524
  d_mode,
10525
  0,
10526
  t_mode,
10527
  0,
10528
  t_mode,
10529
  /* dc */
10530
  q_mode,
10531
  q_mode,
10532
  q_mode,
10533
  q_mode,
10534
  q_mode,
10535
  q_mode,
10536
  q_mode,
10537
  q_mode,
10538
  /* dd */
10539
  q_mode,
10540
  q_mode,
10541
  q_mode,
10542
  q_mode,
10543
  0,
10544
  0,
10545
  0,
10546
  w_mode,
10547
  /* de */
10548
  w_mode,
10549
  w_mode,
10550
  w_mode,
10551
  w_mode,
10552
  w_mode,
10553
  w_mode,
10554
  w_mode,
10555
  w_mode,
10556
  /* df */
10557
  w_mode,
10558
  w_mode,
10559
  w_mode,
10560
  w_mode,
10561
  t_mode,
10562
  q_mode,
10563
  t_mode,
10564
  q_mode
10565
};
10566
 
10567
#define ST { OP_ST, 0 }
10568
#define STi { OP_STi, 0 }
10569
 
10570
#define FGRPd9_2 NULL, { { NULL, 0 } }
10571
#define FGRPd9_4 NULL, { { NULL, 1 } }
10572
#define FGRPd9_5 NULL, { { NULL, 2 } }
10573
#define FGRPd9_6 NULL, { { NULL, 3 } }
10574
#define FGRPd9_7 NULL, { { NULL, 4 } }
10575
#define FGRPda_5 NULL, { { NULL, 5 } }
10576
#define FGRPdb_4 NULL, { { NULL, 6 } }
10577
#define FGRPde_3 NULL, { { NULL, 7 } }
10578
#define FGRPdf_4 NULL, { { NULL, 8 } }
10579
 
10580
static const struct dis386 float_reg[][8] = {
10581
  /* d8 */
10582
  {
10583
    { "fadd",   { ST, STi } },
10584
    { "fmul",   { ST, STi } },
10585
    { "fcom",   { STi } },
10586
    { "fcomp",  { STi } },
10587
    { "fsub",   { ST, STi } },
10588
    { "fsubr",  { ST, STi } },
10589
    { "fdiv",   { ST, STi } },
10590
    { "fdivr",  { ST, STi } },
10591
  },
10592
  /* d9 */
10593
  {
10594
    { "fld",    { STi } },
10595
    { "fxch",   { STi } },
10596
    { FGRPd9_2 },
10597
    { "(bad)",  { XX } },
10598
    { FGRPd9_4 },
10599
    { FGRPd9_5 },
10600
    { FGRPd9_6 },
10601
    { FGRPd9_7 },
10602
  },
10603
  /* da */
10604
  {
10605
    { "fcmovb", { ST, STi } },
10606
    { "fcmove", { ST, STi } },
10607
    { "fcmovbe",{ ST, STi } },
10608
    { "fcmovu", { ST, STi } },
10609
    { "(bad)",  { XX } },
10610
    { FGRPda_5 },
10611
    { "(bad)",  { XX } },
10612
    { "(bad)",  { XX } },
10613
  },
10614
  /* db */
10615
  {
10616
    { "fcmovnb",{ ST, STi } },
10617
    { "fcmovne",{ ST, STi } },
10618
    { "fcmovnbe",{ ST, STi } },
10619
    { "fcmovnu",{ ST, STi } },
10620
    { FGRPdb_4 },
10621
    { "fucomi", { ST, STi } },
10622
    { "fcomi",  { ST, STi } },
10623
    { "(bad)",  { XX } },
10624
  },
10625
  /* dc */
10626
  {
10627
    { "fadd",   { STi, ST } },
10628
    { "fmul",   { STi, ST } },
10629
    { "(bad)",  { XX } },
10630
    { "(bad)",  { XX } },
10631
    { "fsub!M", { STi, ST } },
10632
    { "fsubM",  { STi, ST } },
10633
    { "fdiv!M", { STi, ST } },
10634
    { "fdivM",  { STi, ST } },
10635
  },
10636
  /* dd */
10637
  {
10638
    { "ffree",  { STi } },
10639
    { "(bad)",  { XX } },
10640
    { "fst",    { STi } },
10641
    { "fstp",   { STi } },
10642
    { "fucom",  { STi } },
10643
    { "fucomp", { STi } },
10644
    { "(bad)",  { XX } },
10645
    { "(bad)",  { XX } },
10646
  },
10647
  /* de */
10648
  {
10649
    { "faddp",  { STi, ST } },
10650
    { "fmulp",  { STi, ST } },
10651
    { "(bad)",  { XX } },
10652
    { FGRPde_3 },
10653
    { "fsub!Mp", { STi, ST } },
10654
    { "fsubMp", { STi, ST } },
10655
    { "fdiv!Mp", { STi, ST } },
10656
    { "fdivMp", { STi, ST } },
10657
  },
10658
  /* df */
10659
  {
10660
    { "ffreep", { STi } },
10661
    { "(bad)",  { XX } },
10662
    { "(bad)",  { XX } },
10663
    { "(bad)",  { XX } },
10664
    { FGRPdf_4 },
10665
    { "fucomip", { ST, STi } },
10666
    { "fcomip", { ST, STi } },
10667
    { "(bad)",  { XX } },
10668
  },
10669
};
10670
 
10671
static char *fgrps[][8] = {
10672
  /* d9_2  0 */
10673
  {
10674
    "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10675
  },
10676
 
10677
  /* d9_4  1 */
10678
  {
10679
    "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
10680
  },
10681
 
10682
  /* d9_5  2 */
10683
  {
10684
    "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
10685
  },
10686
 
10687
  /* d9_6  3 */
10688
  {
10689
    "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
10690
  },
10691
 
10692
  /* d9_7  4 */
10693
  {
10694
    "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
10695
  },
10696
 
10697
  /* da_5  5 */
10698
  {
10699
    "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10700
  },
10701
 
10702
  /* db_4  6 */
10703
  {
10704
    "feni(287 only)","fdisi(287 only)","fNclex","fNinit",
10705
    "fNsetpm(287 only)","(bad)","(bad)","(bad)",
10706
  },
10707
 
10708
  /* de_3  7 */
10709
  {
10710
    "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10711
  },
10712
 
10713
  /* df_4  8 */
10714
  {
10715
    "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10716
  },
10717
};
10718
 
10719
static void
10720
OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
10721
               int sizeflag ATTRIBUTE_UNUSED)
10722
{
10723
  /* Skip mod/rm byte.  */
10724
  MODRM_CHECK;
10725
  codep++;
10726
}
10727
 
10728
static void
10729
dofloat (int sizeflag)
10730
{
10731
  const struct dis386 *dp;
10732
  unsigned char floatop;
10733
 
10734
  floatop = codep[-1];
10735
 
10736
  if (modrm.mod != 3)
10737
    {
10738
      int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
10739
 
10740
      putop (float_mem[fp_indx], sizeflag);
10741
      obufp = op_out[0];
10742
      op_ad = 2;
10743
      OP_E (float_mem_mode[fp_indx], sizeflag);
10744
      return;
10745
    }
10746
  /* Skip mod/rm byte.  */
10747
  MODRM_CHECK;
10748
  codep++;
10749
 
10750
  dp = &float_reg[floatop - 0xd8][modrm.reg];
10751
  if (dp->name == NULL)
10752
    {
10753
      putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
10754
 
10755
      /* Instruction fnstsw is only one with strange arg.  */
10756
      if (floatop == 0xdf && codep[-1] == 0xe0)
10757
        strcpy (op_out[0], names16[0]);
10758
    }
10759
  else
10760
    {
10761
      putop (dp->name, sizeflag);
10762
 
10763
      obufp = op_out[0];
10764
      op_ad = 2;
10765
      if (dp->op[0].rtn)
10766
        (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
10767
 
10768
      obufp = op_out[1];
10769
      op_ad = 1;
10770
      if (dp->op[1].rtn)
10771
        (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
10772
    }
10773
}
10774
 
10775
static void
10776
OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
10777
{
10778
  oappend ("%st" + intel_syntax);
10779
}
10780
 
10781
static void
10782
OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
10783
{
10784
  sprintf (scratchbuf, "%%st(%d)", modrm.rm);
10785
  oappend (scratchbuf + intel_syntax);
10786
}
10787
 
10788
/* Capital letters in template are macros.  */
10789
static int
10790
putop (const char *template, int sizeflag)
10791
{
10792
  const char *p;
10793
  int alt = 0;
10794
  int cond = 1;
10795
  unsigned int l = 0, len = 1;
10796
  char last[4];
10797
 
10798
#define SAVE_LAST(c)                    \
10799
  if (l < len && l < sizeof (last))     \
10800
    last[l++] = c;                      \
10801
  else                                  \
10802
    abort ();
10803
 
10804
  for (p = template; *p; p++)
10805
    {
10806
      switch (*p)
10807
        {
10808
        default:
10809
          *obufp++ = *p;
10810
          break;
10811
        case '%':
10812
          len++;
10813
          break;
10814
        case '!':
10815
          cond = 0;
10816
          break;
10817
        case '{':
10818
          alt = 0;
10819
          if (intel_syntax)
10820
            {
10821
              while (*++p != '|')
10822
                if (*p == '}' || *p == '\0')
10823
                  abort ();
10824
            }
10825
          /* Fall through.  */
10826
        case 'I':
10827
          alt = 1;
10828
          continue;
10829
        case '|':
10830
          while (*++p != '}')
10831
            {
10832
              if (*p == '\0')
10833
                abort ();
10834
            }
10835
          break;
10836
        case '}':
10837
          break;
10838
        case 'A':
10839
          if (intel_syntax)
10840
            break;
10841
          if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
10842
            *obufp++ = 'b';
10843
          break;
10844
        case 'B':
10845
          if (intel_syntax)
10846
            break;
10847
          if (sizeflag & SUFFIX_ALWAYS)
10848
            *obufp++ = 'b';
10849
          break;
10850
        case 'C':
10851
          if (intel_syntax && !alt)
10852
            break;
10853
          if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
10854
            {
10855
              if (sizeflag & DFLAG)
10856
                *obufp++ = intel_syntax ? 'd' : 'l';
10857
              else
10858
                *obufp++ = intel_syntax ? 'w' : 's';
10859
              used_prefixes |= (prefixes & PREFIX_DATA);
10860
            }
10861
          break;
10862
        case 'D':
10863
          if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
10864
            break;
10865
          USED_REX (REX_W);
10866
          if (modrm.mod == 3)
10867
            {
10868
              if (rex & REX_W)
10869
                *obufp++ = 'q';
10870
              else if (sizeflag & DFLAG)
10871
                *obufp++ = intel_syntax ? 'd' : 'l';
10872
              else
10873
                *obufp++ = 'w';
10874
              used_prefixes |= (prefixes & PREFIX_DATA);
10875
            }
10876
          else
10877
            *obufp++ = 'w';
10878
          break;
10879
        case 'E':               /* For jcxz/jecxz */
10880
          if (address_mode == mode_64bit)
10881
            {
10882
              if (sizeflag & AFLAG)
10883
                *obufp++ = 'r';
10884
              else
10885
                *obufp++ = 'e';
10886
            }
10887
          else
10888
            if (sizeflag & AFLAG)
10889
              *obufp++ = 'e';
10890
          used_prefixes |= (prefixes & PREFIX_ADDR);
10891
          break;
10892
        case 'F':
10893
          if (intel_syntax)
10894
            break;
10895
          if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
10896
            {
10897
              if (sizeflag & AFLAG)
10898
                *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
10899
              else
10900
                *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
10901
              used_prefixes |= (prefixes & PREFIX_ADDR);
10902
            }
10903
          break;
10904
        case 'G':
10905
          if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
10906
            break;
10907
          if ((rex & REX_W) || (sizeflag & DFLAG))
10908
            *obufp++ = 'l';
10909
          else
10910
            *obufp++ = 'w';
10911
          if (!(rex & REX_W))
10912
            used_prefixes |= (prefixes & PREFIX_DATA);
10913
          break;
10914
        case 'H':
10915
          if (intel_syntax)
10916
            break;
10917
          if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
10918
              || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
10919
            {
10920
              used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
10921
              *obufp++ = ',';
10922
              *obufp++ = 'p';
10923
              if (prefixes & PREFIX_DS)
10924
                *obufp++ = 't';
10925
              else
10926
                *obufp++ = 'n';
10927
            }
10928
          break;
10929
        case 'J':
10930
          if (intel_syntax)
10931
            break;
10932
          *obufp++ = 'l';
10933
          break;
10934
        case 'K':
10935
          USED_REX (REX_W);
10936
          if (rex & REX_W)
10937
            *obufp++ = 'q';
10938
          else
10939
            *obufp++ = 'd';
10940
          break;
10941
        case 'Z':
10942
          if (intel_syntax)
10943
            break;
10944
          if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
10945
            {
10946
              *obufp++ = 'q';
10947
              break;
10948
            }
10949
          /* Fall through.  */
10950
          goto case_L;
10951
        case 'L':
10952
          if (l != 0 || len != 1)
10953
            {
10954
              SAVE_LAST (*p);
10955
              break;
10956
            }
10957
case_L:
10958
          if (intel_syntax)
10959
            break;
10960
          if (sizeflag & SUFFIX_ALWAYS)
10961
            *obufp++ = 'l';
10962
          break;
10963
        case 'M':
10964
          if (intel_mnemonic != cond)
10965
            *obufp++ = 'r';
10966
          break;
10967
        case 'N':
10968
          if ((prefixes & PREFIX_FWAIT) == 0)
10969
            *obufp++ = 'n';
10970
          else
10971
            used_prefixes |= PREFIX_FWAIT;
10972
          break;
10973
        case 'O':
10974
          USED_REX (REX_W);
10975
          if (rex & REX_W)
10976
            *obufp++ = 'o';
10977
          else if (intel_syntax && (sizeflag & DFLAG))
10978
            *obufp++ = 'q';
10979
          else
10980
            *obufp++ = 'd';
10981
          if (!(rex & REX_W))
10982
            used_prefixes |= (prefixes & PREFIX_DATA);
10983
          break;
10984
        case 'T':
10985
          if (intel_syntax)
10986
            break;
10987
          if (address_mode == mode_64bit && (sizeflag & DFLAG))
10988
            {
10989
              *obufp++ = 'q';
10990
              break;
10991
            }
10992
          /* Fall through.  */
10993
        case 'P':
10994
          if (intel_syntax)
10995
            break;
10996
          if ((prefixes & PREFIX_DATA)
10997
              || (rex & REX_W)
10998
              || (sizeflag & SUFFIX_ALWAYS))
10999
            {
11000
              USED_REX (REX_W);
11001
              if (rex & REX_W)
11002
                *obufp++ = 'q';
11003
              else
11004
                {
11005
                   if (sizeflag & DFLAG)
11006
                      *obufp++ = 'l';
11007
                   else
11008
                     *obufp++ = 'w';
11009
                }
11010
              used_prefixes |= (prefixes & PREFIX_DATA);
11011
            }
11012
          break;
11013
        case 'U':
11014
          if (intel_syntax)
11015
            break;
11016
          if (address_mode == mode_64bit && (sizeflag & DFLAG))
11017
            {
11018
              if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
11019
                *obufp++ = 'q';
11020
              break;
11021
            }
11022
          /* Fall through.  */
11023
          goto case_Q;
11024
        case 'Q':
11025
          if (l == 0 && len == 1)
11026
            {
11027
case_Q:
11028
              if (intel_syntax && !alt)
11029
                break;
11030
              USED_REX (REX_W);
11031
              if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
11032
                {
11033
                  if (rex & REX_W)
11034
                    *obufp++ = 'q';
11035
                  else
11036
                    {
11037
                      if (sizeflag & DFLAG)
11038
                        *obufp++ = intel_syntax ? 'd' : 'l';
11039
                      else
11040
                        *obufp++ = 'w';
11041
                    }
11042
                  used_prefixes |= (prefixes & PREFIX_DATA);
11043
                }
11044
            }
11045
          else
11046
            {
11047
              if (l != 1 || len != 2 || last[0] != 'L')
11048
                {
11049
                  SAVE_LAST (*p);
11050
                  break;
11051
                }
11052
              if (intel_syntax
11053
                  || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
11054
                break;
11055
              if ((rex & REX_W))
11056
                {
11057
                  USED_REX (REX_W);
11058
                  *obufp++ = 'q';
11059
                }
11060
              else
11061
                *obufp++ = 'l';
11062
            }
11063
          break;
11064
        case 'R':
11065
          USED_REX (REX_W);
11066
          if (rex & REX_W)
11067
            *obufp++ = 'q';
11068
          else if (sizeflag & DFLAG)
11069
            {
11070
              if (intel_syntax)
11071
                  *obufp++ = 'd';
11072
              else
11073
                  *obufp++ = 'l';
11074
            }
11075
          else
11076
            *obufp++ = 'w';
11077
          if (intel_syntax && !p[1]
11078
              && ((rex & REX_W) || (sizeflag & DFLAG)))
11079
            *obufp++ = 'e';
11080
          if (!(rex & REX_W))
11081
            used_prefixes |= (prefixes & PREFIX_DATA);
11082
          break;
11083
        case 'V':
11084
          if (intel_syntax)
11085
            break;
11086
          if (address_mode == mode_64bit && (sizeflag & DFLAG))
11087
            {
11088
              if (sizeflag & SUFFIX_ALWAYS)
11089
                *obufp++ = 'q';
11090
              break;
11091
            }
11092
          /* Fall through.  */
11093
        case 'S':
11094
          if (intel_syntax)
11095
            break;
11096
          if (sizeflag & SUFFIX_ALWAYS)
11097
            {
11098
              if (rex & REX_W)
11099
                *obufp++ = 'q';
11100
              else
11101
                {
11102
                  if (sizeflag & DFLAG)
11103
                    *obufp++ = 'l';
11104
                  else
11105
                    *obufp++ = 'w';
11106
                  used_prefixes |= (prefixes & PREFIX_DATA);
11107
                }
11108
            }
11109
          break;
11110
        case 'X':
11111
          if (l != 0 || len != 1)
11112
            {
11113
              SAVE_LAST (*p);
11114
              break;
11115
            }
11116
          if (need_vex && vex.prefix)
11117
            {
11118
              if (vex.prefix == DATA_PREFIX_OPCODE)
11119
                *obufp++ = 'd';
11120
              else
11121
                *obufp++ = 's';
11122
            }
11123
          else if (prefixes & PREFIX_DATA)
11124
            *obufp++ = 'd';
11125
          else
11126
            *obufp++ = 's';
11127
          used_prefixes |= (prefixes & PREFIX_DATA);
11128
          break;
11129
        case 'Y':
11130
          if (l == 0 && len == 1)
11131
            {
11132
              if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
11133
                break;
11134
              if (rex & REX_W)
11135
                {
11136
                  USED_REX (REX_W);
11137
                  *obufp++ = 'q';
11138
                }
11139
              break;
11140
            }
11141
          else
11142
            {
11143
              if (l != 1 || len != 2 || last[0] != 'X')
11144
                {
11145
                  SAVE_LAST (*p);
11146
                  break;
11147
                }
11148
              if (!need_vex)
11149
                abort ();
11150
              if (intel_syntax
11151
                  || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
11152
                break;
11153
              switch (vex.length)
11154
                {
11155
                case 128:
11156
                  *obufp++ = 'x';
11157
                  break;
11158
                case 256:
11159
                  *obufp++ = 'y';
11160
                  break;
11161
                default:
11162
                  abort ();
11163
                }
11164
            }
11165
          break;
11166
          /* implicit operand size 'l' for i386 or 'q' for x86-64 */
11167
        case 'W':
11168
          /* operand size flag for cwtl, cbtw */
11169
          USED_REX (REX_W);
11170
          if (rex & REX_W)
11171
            {
11172
              if (intel_syntax)
11173
                *obufp++ = 'd';
11174
              else
11175
                *obufp++ = 'l';
11176
            }
11177
          else if (sizeflag & DFLAG)
11178
            *obufp++ = 'w';
11179
          else
11180
            *obufp++ = 'b';
11181
          if (!(rex & REX_W))
11182
            used_prefixes |= (prefixes & PREFIX_DATA);
11183
          break;
11184
        }
11185
      alt = 0;
11186
    }
11187
  *obufp = 0;
11188
  return 0;
11189
}
11190
 
11191
static void
11192
oappend (const char *s)
11193
{
11194
  strcpy (obufp, s);
11195
  obufp += strlen (s);
11196
}
11197
 
11198
static void
11199
append_seg (void)
11200
{
11201
  if (prefixes & PREFIX_CS)
11202
    {
11203
      used_prefixes |= PREFIX_CS;
11204
      oappend ("%cs:" + intel_syntax);
11205
    }
11206
  if (prefixes & PREFIX_DS)
11207
    {
11208
      used_prefixes |= PREFIX_DS;
11209
      oappend ("%ds:" + intel_syntax);
11210
    }
11211
  if (prefixes & PREFIX_SS)
11212
    {
11213
      used_prefixes |= PREFIX_SS;
11214
      oappend ("%ss:" + intel_syntax);
11215
    }
11216
  if (prefixes & PREFIX_ES)
11217
    {
11218
      used_prefixes |= PREFIX_ES;
11219
      oappend ("%es:" + intel_syntax);
11220
    }
11221
  if (prefixes & PREFIX_FS)
11222
    {
11223
      used_prefixes |= PREFIX_FS;
11224
      oappend ("%fs:" + intel_syntax);
11225
    }
11226
  if (prefixes & PREFIX_GS)
11227
    {
11228
      used_prefixes |= PREFIX_GS;
11229
      oappend ("%gs:" + intel_syntax);
11230
    }
11231
}
11232
 
11233
static void
11234
OP_indirE (int bytemode, int sizeflag)
11235
{
11236
  if (!intel_syntax)
11237
    oappend ("*");
11238
  OP_E (bytemode, sizeflag);
11239
}
11240
 
11241
static void
11242
print_operand_value (char *buf, int hex, bfd_vma disp)
11243
{
11244
  if (address_mode == mode_64bit)
11245
    {
11246
      if (hex)
11247
        {
11248
          char tmp[30];
11249
          int i;
11250
          buf[0] = '0';
11251
          buf[1] = 'x';
11252
          sprintf_vma (tmp, disp);
11253
          for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
11254
          strcpy (buf + 2, tmp + i);
11255
        }
11256
      else
11257
        {
11258
          bfd_signed_vma v = disp;
11259
          char tmp[30];
11260
          int i;
11261
          if (v < 0)
11262
            {
11263
              *(buf++) = '-';
11264
              v = -disp;
11265
              /* Check for possible overflow on 0x8000000000000000.  */
11266
              if (v < 0)
11267
                {
11268
                  strcpy (buf, "9223372036854775808");
11269
                  return;
11270
                }
11271
            }
11272
          if (!v)
11273
            {
11274
              strcpy (buf, "0");
11275
              return;
11276
            }
11277
 
11278
          i = 0;
11279
          tmp[29] = 0;
11280
          while (v)
11281
            {
11282
              tmp[28 - i] = (v % 10) + '0';
11283
              v /= 10;
11284
              i++;
11285
            }
11286
          strcpy (buf, tmp + 29 - i);
11287
        }
11288
    }
11289
  else
11290
    {
11291
      if (hex)
11292
        sprintf (buf, "0x%x", (unsigned int) disp);
11293
      else
11294
        sprintf (buf, "%d", (int) disp);
11295
    }
11296
}
11297
 
11298
/* Put DISP in BUF as signed hex number.  */
11299
 
11300
static void
11301
print_displacement (char *buf, bfd_vma disp)
11302
{
11303
  bfd_signed_vma val = disp;
11304
  char tmp[30];
11305
  int i, j = 0;
11306
 
11307
  if (val < 0)
11308
    {
11309
      buf[j++] = '-';
11310
      val = -disp;
11311
 
11312
      /* Check for possible overflow.  */
11313
      if (val < 0)
11314
        {
11315
          switch (address_mode)
11316
            {
11317
            case mode_64bit:
11318
              strcpy (buf + j, "0x8000000000000000");
11319
              break;
11320
            case mode_32bit:
11321
              strcpy (buf + j, "0x80000000");
11322
              break;
11323
            case mode_16bit:
11324
              strcpy (buf + j, "0x8000");
11325
              break;
11326
            }
11327
          return;
11328
        }
11329
    }
11330
 
11331
  buf[j++] = '0';
11332
  buf[j++] = 'x';
11333
 
11334
  sprintf_vma (tmp, (bfd_vma) val);
11335
  for (i = 0; tmp[i] == '0'; i++)
11336
    continue;
11337
  if (tmp[i] == '\0')
11338
    i--;
11339
  strcpy (buf + j, tmp + i);
11340
}
11341
 
11342
static void
11343
intel_operand_size (int bytemode, int sizeflag)
11344
{
11345
  switch (bytemode)
11346
    {
11347
    case b_mode:
11348
    case dqb_mode:
11349
      oappend ("BYTE PTR ");
11350
      break;
11351
    case w_mode:
11352
    case dqw_mode:
11353
      oappend ("WORD PTR ");
11354
      break;
11355
    case stack_v_mode:
11356
      if (address_mode == mode_64bit && (sizeflag & DFLAG))
11357
        {
11358
          oappend ("QWORD PTR ");
11359
          used_prefixes |= (prefixes & PREFIX_DATA);
11360
          break;
11361
        }
11362
      /* FALLTHRU */
11363
    case v_mode:
11364
    case dq_mode:
11365
      USED_REX (REX_W);
11366
      if (rex & REX_W)
11367
        oappend ("QWORD PTR ");
11368
      else if ((sizeflag & DFLAG) || bytemode == dq_mode)
11369
        oappend ("DWORD PTR ");
11370
      else
11371
        oappend ("WORD PTR ");
11372
      used_prefixes |= (prefixes & PREFIX_DATA);
11373
      break;
11374
    case z_mode:
11375
      if ((rex & REX_W) || (sizeflag & DFLAG))
11376
        *obufp++ = 'D';
11377
      oappend ("WORD PTR ");
11378
      if (!(rex & REX_W))
11379
        used_prefixes |= (prefixes & PREFIX_DATA);
11380
      break;
11381
    case a_mode:
11382
      if (sizeflag & DFLAG)
11383
        oappend ("QWORD PTR ");
11384
      else
11385
        oappend ("DWORD PTR ");
11386
      used_prefixes |= (prefixes & PREFIX_DATA);
11387
      break;
11388
    case d_mode:
11389
    case dqd_mode:
11390
      oappend ("DWORD PTR ");
11391
      break;
11392
    case q_mode:
11393
      oappend ("QWORD PTR ");
11394
      break;
11395
    case m_mode:
11396
      if (address_mode == mode_64bit)
11397
        oappend ("QWORD PTR ");
11398
      else
11399
        oappend ("DWORD PTR ");
11400
      break;
11401
    case f_mode:
11402
      if (sizeflag & DFLAG)
11403
        oappend ("FWORD PTR ");
11404
      else
11405
        oappend ("DWORD PTR ");
11406
      used_prefixes |= (prefixes & PREFIX_DATA);
11407
      break;
11408
    case t_mode:
11409
      oappend ("TBYTE PTR ");
11410
      break;
11411
    case x_mode:
11412
      if (need_vex)
11413
        {
11414
          switch (vex.length)
11415
            {
11416
            case 128:
11417
              oappend ("XMMWORD PTR ");
11418
              break;
11419
            case 256:
11420
              oappend ("YMMWORD PTR ");
11421
              break;
11422
            default:
11423
              abort ();
11424
            }
11425
        }
11426
      else
11427
        oappend ("XMMWORD PTR ");
11428
      break;
11429
    case xmm_mode:
11430
      oappend ("XMMWORD PTR ");
11431
      break;
11432
    case xmmq_mode:
11433
      if (!need_vex)
11434
        abort ();
11435
 
11436
      switch (vex.length)
11437
        {
11438
        case 128:
11439
          oappend ("QWORD PTR ");
11440
          break;
11441
        case 256:
11442
          oappend ("XMMWORD PTR ");
11443
          break;
11444
        default:
11445
          abort ();
11446
        }
11447
      break;
11448
    case ymmq_mode:
11449
      if (!need_vex)
11450
        abort ();
11451
 
11452
      switch (vex.length)
11453
        {
11454
        case 128:
11455
          oappend ("QWORD PTR ");
11456
          break;
11457
        case 256:
11458
          oappend ("YMMWORD PTR ");
11459
          break;
11460
        default:
11461
          abort ();
11462
        }
11463
      break;
11464
    case o_mode:
11465
      oappend ("OWORD PTR ");
11466
      break;
11467
    default:
11468
      break;
11469
    }
11470
}
11471
 
11472
static void
11473
OP_E_register (int bytemode, int sizeflag)
11474
{
11475
  int reg = modrm.rm;
11476
  const char **names;
11477
 
11478
  USED_REX (REX_B);
11479
  if ((rex & REX_B))
11480
    reg += 8;
11481
 
11482
  switch (bytemode)
11483
    {
11484
    case b_mode:
11485
      USED_REX (0);
11486
      if (rex)
11487
        names = names8rex;
11488
      else
11489
        names = names8;
11490
      break;
11491
    case w_mode:
11492
      names = names16;
11493
      break;
11494
    case d_mode:
11495
      names = names32;
11496
      break;
11497
    case q_mode:
11498
      names = names64;
11499
      break;
11500
    case m_mode:
11501
      names = address_mode == mode_64bit ? names64 : names32;
11502
      break;
11503
    case stack_v_mode:
11504
      if (address_mode == mode_64bit && (sizeflag & DFLAG))
11505
        {
11506
          names = names64;
11507
          used_prefixes |= (prefixes & PREFIX_DATA);
11508
          break;
11509
        }
11510
      bytemode = v_mode;
11511
      /* FALLTHRU */
11512
    case v_mode:
11513
    case dq_mode:
11514
    case dqb_mode:
11515
    case dqd_mode:
11516
    case dqw_mode:
11517
      USED_REX (REX_W);
11518
      if (rex & REX_W)
11519
        names = names64;
11520
      else if ((sizeflag & DFLAG) || bytemode != v_mode)
11521
        names = names32;
11522
      else
11523
        names = names16;
11524
      used_prefixes |= (prefixes & PREFIX_DATA);
11525
      break;
11526
    case 0:
11527
      return;
11528
    default:
11529
      oappend (INTERNAL_DISASSEMBLER_ERROR);
11530
      return;
11531
    }
11532
  oappend (names[reg]);
11533
}
11534
 
11535
static void
11536
OP_E_memory (int bytemode, int sizeflag, int has_drex)
11537
{
11538
  bfd_vma disp = 0;
11539
  int add = (rex & REX_B) ? 8 : 0;
11540
  int riprel = 0;
11541
 
11542
  USED_REX (REX_B);
11543
  if (intel_syntax)
11544
    intel_operand_size (bytemode, sizeflag);
11545
  append_seg ();
11546
 
11547
  if ((sizeflag & AFLAG) || address_mode == mode_64bit)
11548
    {
11549
      /* 32/64 bit address mode */
11550
      int havedisp;
11551
      int havesib;
11552
      int havebase;
11553
      int haveindex;
11554
      int needindex;
11555
      int base, rbase;
11556
      int index = 0;
11557
      int scale = 0;
11558
 
11559
      havesib = 0;
11560
      havebase = 1;
11561
      haveindex = 0;
11562
      base = modrm.rm;
11563
 
11564
      if (base == 4)
11565
        {
11566
          havesib = 1;
11567
          FETCH_DATA (the_info, codep + 1);
11568
          index = (*codep >> 3) & 7;
11569
          scale = (*codep >> 6) & 3;
11570
          base = *codep & 7;
11571
          USED_REX (REX_X);
11572
          if (rex & REX_X)
11573
            index += 8;
11574
          haveindex = index != 4;
11575
          codep++;
11576
        }
11577
      rbase = base + add;
11578
 
11579
      /* If we have a DREX byte, skip it now
11580
         (it has already been handled) */
11581
      if (has_drex)
11582
        {
11583
          FETCH_DATA (the_info, codep + 1);
11584
          codep++;
11585
        }
11586
 
11587
      switch (modrm.mod)
11588
        {
11589
        case 0:
11590
          if (base == 5)
11591
            {
11592
              havebase = 0;
11593
              if (address_mode == mode_64bit && !havesib)
11594
                riprel = 1;
11595
              disp = get32s ();
11596
            }
11597
          break;
11598
        case 1:
11599
          FETCH_DATA (the_info, codep + 1);
11600
          disp = *codep++;
11601
          if ((disp & 0x80) != 0)
11602
            disp -= 0x100;
11603
          break;
11604
        case 2:
11605
          disp = get32s ();
11606
          break;
11607
        }
11608
 
11609
      /* In 32bit mode, we need index register to tell [offset] from
11610
         [eiz*1 + offset].  */
11611
      needindex = (havesib
11612
                   && !havebase
11613
                   && !haveindex
11614
                   && address_mode == mode_32bit);
11615
      havedisp = (havebase
11616
                  || needindex
11617
                  || (havesib && (haveindex || scale != 0)));
11618
 
11619
      if (!intel_syntax)
11620
        if (modrm.mod != 0 || base == 5)
11621
          {
11622
            if (havedisp || riprel)
11623
              print_displacement (scratchbuf, disp);
11624
            else
11625
              print_operand_value (scratchbuf, 1, disp);
11626
            oappend (scratchbuf);
11627
            if (riprel)
11628
              {
11629
                set_op (disp, 1);
11630
                oappend (sizeflag & AFLAG ? "(%rip)" : "(%eip)");
11631
              }
11632
          }
11633
 
11634
      if (havebase || haveindex || riprel)
11635
        used_prefixes |= PREFIX_ADDR;
11636
 
11637
      if (havedisp || (intel_syntax && riprel))
11638
        {
11639
          *obufp++ = open_char;
11640
          if (intel_syntax && riprel)
11641
            {
11642
              set_op (disp, 1);
11643
              oappend (sizeflag & AFLAG ? "rip" : "eip");
11644
            }
11645
          *obufp = '\0';
11646
          if (havebase)
11647
            oappend (address_mode == mode_64bit && (sizeflag & AFLAG)
11648
                     ? names64[rbase] : names32[rbase]);
11649
          if (havesib)
11650
            {
11651
              /* ESP/RSP won't allow index.  If base isn't ESP/RSP,
11652
                 print index to tell base + index from base.  */
11653
              if (scale != 0
11654
                  || needindex
11655
                  || haveindex
11656
                  || (havebase && base != ESP_REG_NUM))
11657
                {
11658
                  if (!intel_syntax || havebase)
11659
                    {
11660
                      *obufp++ = separator_char;
11661
                      *obufp = '\0';
11662
                    }
11663
                  if (haveindex)
11664
                    oappend (address_mode == mode_64bit
11665
                             && (sizeflag & AFLAG)
11666
                             ? names64[index] : names32[index]);
11667
                  else
11668
                    oappend (address_mode == mode_64bit
11669
                             && (sizeflag & AFLAG)
11670
                             ? index64 : index32);
11671
 
11672
                  *obufp++ = scale_char;
11673
                  *obufp = '\0';
11674
                  sprintf (scratchbuf, "%d", 1 << scale);
11675
                  oappend (scratchbuf);
11676
                }
11677
            }
11678
          if (intel_syntax
11679
              && (disp || modrm.mod != 0 || base == 5))
11680
            {
11681
              if (!havedisp || (bfd_signed_vma) disp >= 0)
11682
                {
11683
                  *obufp++ = '+';
11684
                  *obufp = '\0';
11685
                }
11686
              else if (modrm.mod != 1)
11687
                {
11688
                  *obufp++ = '-';
11689
                  *obufp = '\0';
11690
                  disp = - (bfd_signed_vma) disp;
11691
                }
11692
 
11693
              if (havedisp)
11694
                print_displacement (scratchbuf, disp);
11695
              else
11696
                print_operand_value (scratchbuf, 1, disp);
11697
              oappend (scratchbuf);
11698
            }
11699
 
11700
          *obufp++ = close_char;
11701
          *obufp = '\0';
11702
        }
11703
      else if (intel_syntax)
11704
        {
11705
          if (modrm.mod != 0 || base == 5)
11706
            {
11707
              if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
11708
                              | PREFIX_ES | PREFIX_FS | PREFIX_GS))
11709
                ;
11710
              else
11711
                {
11712
                  oappend (names_seg[ds_reg - es_reg]);
11713
                  oappend (":");
11714
                }
11715
              print_operand_value (scratchbuf, 1, disp);
11716
              oappend (scratchbuf);
11717
            }
11718
        }
11719
    }
11720
  else
11721
    { /* 16 bit address mode */
11722
      switch (modrm.mod)
11723
        {
11724
        case 0:
11725
          if (modrm.rm == 6)
11726
            {
11727
              disp = get16 ();
11728
              if ((disp & 0x8000) != 0)
11729
                disp -= 0x10000;
11730
            }
11731
          break;
11732
        case 1:
11733
          FETCH_DATA (the_info, codep + 1);
11734
          disp = *codep++;
11735
          if ((disp & 0x80) != 0)
11736
            disp -= 0x100;
11737
          break;
11738
        case 2:
11739
          disp = get16 ();
11740
          if ((disp & 0x8000) != 0)
11741
            disp -= 0x10000;
11742
          break;
11743
        }
11744
 
11745
      if (!intel_syntax)
11746
        if (modrm.mod != 0 || modrm.rm == 6)
11747
          {
11748
            print_displacement (scratchbuf, disp);
11749
            oappend (scratchbuf);
11750
          }
11751
 
11752
      if (modrm.mod != 0 || modrm.rm != 6)
11753
        {
11754
          *obufp++ = open_char;
11755
          *obufp = '\0';
11756
          oappend (index16[modrm.rm]);
11757
          if (intel_syntax
11758
              && (disp || modrm.mod != 0 || modrm.rm == 6))
11759
            {
11760
              if ((bfd_signed_vma) disp >= 0)
11761
                {
11762
                  *obufp++ = '+';
11763
                  *obufp = '\0';
11764
                }
11765
              else if (modrm.mod != 1)
11766
                {
11767
                  *obufp++ = '-';
11768
                  *obufp = '\0';
11769
                  disp = - (bfd_signed_vma) disp;
11770
                }
11771
 
11772
              print_displacement (scratchbuf, disp);
11773
              oappend (scratchbuf);
11774
            }
11775
 
11776
          *obufp++ = close_char;
11777
          *obufp = '\0';
11778
        }
11779
      else if (intel_syntax)
11780
        {
11781
          if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
11782
                          | PREFIX_ES | PREFIX_FS | PREFIX_GS))
11783
            ;
11784
          else
11785
            {
11786
              oappend (names_seg[ds_reg - es_reg]);
11787
              oappend (":");
11788
            }
11789
          print_operand_value (scratchbuf, 1, disp & 0xffff);
11790
          oappend (scratchbuf);
11791
        }
11792
    }
11793
}
11794
 
11795
static void
11796
OP_E_extended (int bytemode, int sizeflag, int has_drex)
11797
{
11798
  /* Skip mod/rm byte.  */
11799
  MODRM_CHECK;
11800
  codep++;
11801
 
11802
  if (modrm.mod == 3)
11803
    OP_E_register (bytemode, sizeflag);
11804
  else
11805
    OP_E_memory (bytemode, sizeflag, has_drex);
11806
}
11807
 
11808
static void
11809
OP_E (int bytemode, int sizeflag)
11810
{
11811
  OP_E_extended (bytemode, sizeflag, 0);
11812
}
11813
 
11814
 
11815
static void
11816
OP_G (int bytemode, int sizeflag)
11817
{
11818
  int add = 0;
11819
  USED_REX (REX_R);
11820
  if (rex & REX_R)
11821
    add += 8;
11822
  switch (bytemode)
11823
    {
11824
    case b_mode:
11825
      USED_REX (0);
11826
      if (rex)
11827
        oappend (names8rex[modrm.reg + add]);
11828
      else
11829
        oappend (names8[modrm.reg + add]);
11830
      break;
11831
    case w_mode:
11832
      oappend (names16[modrm.reg + add]);
11833
      break;
11834
    case d_mode:
11835
      oappend (names32[modrm.reg + add]);
11836
      break;
11837
    case q_mode:
11838
      oappend (names64[modrm.reg + add]);
11839
      break;
11840
    case v_mode:
11841
    case dq_mode:
11842
    case dqb_mode:
11843
    case dqd_mode:
11844
    case dqw_mode:
11845
      USED_REX (REX_W);
11846
      if (rex & REX_W)
11847
        oappend (names64[modrm.reg + add]);
11848
      else if ((sizeflag & DFLAG) || bytemode != v_mode)
11849
        oappend (names32[modrm.reg + add]);
11850
      else
11851
        oappend (names16[modrm.reg + add]);
11852
      used_prefixes |= (prefixes & PREFIX_DATA);
11853
      break;
11854
    case m_mode:
11855
      if (address_mode == mode_64bit)
11856
        oappend (names64[modrm.reg + add]);
11857
      else
11858
        oappend (names32[modrm.reg + add]);
11859
      break;
11860
    default:
11861
      oappend (INTERNAL_DISASSEMBLER_ERROR);
11862
      break;
11863
    }
11864
}
11865
 
11866
static bfd_vma
11867
get64 (void)
11868
{
11869
  bfd_vma x;
11870
#ifdef BFD64
11871
  unsigned int a;
11872
  unsigned int b;
11873
 
11874
  FETCH_DATA (the_info, codep + 8);
11875
  a = *codep++ & 0xff;
11876
  a |= (*codep++ & 0xff) << 8;
11877
  a |= (*codep++ & 0xff) << 16;
11878
  a |= (*codep++ & 0xff) << 24;
11879
  b = *codep++ & 0xff;
11880
  b |= (*codep++ & 0xff) << 8;
11881
  b |= (*codep++ & 0xff) << 16;
11882
  b |= (*codep++ & 0xff) << 24;
11883
  x = a + ((bfd_vma) b << 32);
11884
#else
11885
  abort ();
11886
  x = 0;
11887
#endif
11888
  return x;
11889
}
11890
 
11891
static bfd_signed_vma
11892
get32 (void)
11893
{
11894
  bfd_signed_vma x = 0;
11895
 
11896
  FETCH_DATA (the_info, codep + 4);
11897
  x = *codep++ & (bfd_signed_vma) 0xff;
11898
  x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
11899
  x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
11900
  x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
11901
  return x;
11902
}
11903
 
11904
static bfd_signed_vma
11905
get32s (void)
11906
{
11907
  bfd_signed_vma x = 0;
11908
 
11909
  FETCH_DATA (the_info, codep + 4);
11910
  x = *codep++ & (bfd_signed_vma) 0xff;
11911
  x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
11912
  x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
11913
  x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
11914
 
11915
  x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
11916
 
11917
  return x;
11918
}
11919
 
11920
static int
11921
get16 (void)
11922
{
11923
  int x = 0;
11924
 
11925
  FETCH_DATA (the_info, codep + 2);
11926
  x = *codep++ & 0xff;
11927
  x |= (*codep++ & 0xff) << 8;
11928
  return x;
11929
}
11930
 
11931
static void
11932
set_op (bfd_vma op, int riprel)
11933
{
11934
  op_index[op_ad] = op_ad;
11935
  if (address_mode == mode_64bit)
11936
    {
11937
      op_address[op_ad] = op;
11938
      op_riprel[op_ad] = riprel;
11939
    }
11940
  else
11941
    {
11942
      /* Mask to get a 32-bit address.  */
11943
      op_address[op_ad] = op & 0xffffffff;
11944
      op_riprel[op_ad] = riprel & 0xffffffff;
11945
    }
11946
}
11947
 
11948
static void
11949
OP_REG (int code, int sizeflag)
11950
{
11951
  const char *s;
11952
  int add;
11953
  USED_REX (REX_B);
11954
  if (rex & REX_B)
11955
    add = 8;
11956
  else
11957
    add = 0;
11958
 
11959
  switch (code)
11960
    {
11961
    case ax_reg: case cx_reg: case dx_reg: case bx_reg:
11962
    case sp_reg: case bp_reg: case si_reg: case di_reg:
11963
      s = names16[code - ax_reg + add];
11964
      break;
11965
    case es_reg: case ss_reg: case cs_reg:
11966
    case ds_reg: case fs_reg: case gs_reg:
11967
      s = names_seg[code - es_reg + add];
11968
      break;
11969
    case al_reg: case ah_reg: case cl_reg: case ch_reg:
11970
    case dl_reg: case dh_reg: case bl_reg: case bh_reg:
11971
      USED_REX (0);
11972
      if (rex)
11973
        s = names8rex[code - al_reg + add];
11974
      else
11975
        s = names8[code - al_reg];
11976
      break;
11977
    case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
11978
    case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
11979
      if (address_mode == mode_64bit && (sizeflag & DFLAG))
11980
        {
11981
          s = names64[code - rAX_reg + add];
11982
          break;
11983
        }
11984
      code += eAX_reg - rAX_reg;
11985
      /* Fall through.  */
11986
    case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
11987
    case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
11988
      USED_REX (REX_W);
11989
      if (rex & REX_W)
11990
        s = names64[code - eAX_reg + add];
11991
      else if (sizeflag & DFLAG)
11992
        s = names32[code - eAX_reg + add];
11993
      else
11994
        s = names16[code - eAX_reg + add];
11995
      used_prefixes |= (prefixes & PREFIX_DATA);
11996
      break;
11997
    default:
11998
      s = INTERNAL_DISASSEMBLER_ERROR;
11999
      break;
12000
    }
12001
  oappend (s);
12002
}
12003
 
12004
static void
12005
OP_IMREG (int code, int sizeflag)
12006
{
12007
  const char *s;
12008
 
12009
  switch (code)
12010
    {
12011
    case indir_dx_reg:
12012
      if (intel_syntax)
12013
        s = "dx";
12014
      else
12015
        s = "(%dx)";
12016
      break;
12017
    case ax_reg: case cx_reg: case dx_reg: case bx_reg:
12018
    case sp_reg: case bp_reg: case si_reg: case di_reg:
12019
      s = names16[code - ax_reg];
12020
      break;
12021
    case es_reg: case ss_reg: case cs_reg:
12022
    case ds_reg: case fs_reg: case gs_reg:
12023
      s = names_seg[code - es_reg];
12024
      break;
12025
    case al_reg: case ah_reg: case cl_reg: case ch_reg:
12026
    case dl_reg: case dh_reg: case bl_reg: case bh_reg:
12027
      USED_REX (0);
12028
      if (rex)
12029
        s = names8rex[code - al_reg];
12030
      else
12031
        s = names8[code - al_reg];
12032
      break;
12033
    case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
12034
    case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
12035
      USED_REX (REX_W);
12036
      if (rex & REX_W)
12037
        s = names64[code - eAX_reg];
12038
      else if (sizeflag & DFLAG)
12039
        s = names32[code - eAX_reg];
12040
      else
12041
        s = names16[code - eAX_reg];
12042
      used_prefixes |= (prefixes & PREFIX_DATA);
12043
      break;
12044
    case z_mode_ax_reg:
12045
      if ((rex & REX_W) || (sizeflag & DFLAG))
12046
        s = *names32;
12047
      else
12048
        s = *names16;
12049
      if (!(rex & REX_W))
12050
        used_prefixes |= (prefixes & PREFIX_DATA);
12051
      break;
12052
    default:
12053
      s = INTERNAL_DISASSEMBLER_ERROR;
12054
      break;
12055
    }
12056
  oappend (s);
12057
}
12058
 
12059
static void
12060
OP_I (int bytemode, int sizeflag)
12061
{
12062
  bfd_signed_vma op;
12063
  bfd_signed_vma mask = -1;
12064
 
12065
  switch (bytemode)
12066
    {
12067
    case b_mode:
12068
      FETCH_DATA (the_info, codep + 1);
12069
      op = *codep++;
12070
      mask = 0xff;
12071
      break;
12072
    case q_mode:
12073
      if (address_mode == mode_64bit)
12074
        {
12075
          op = get32s ();
12076
          break;
12077
        }
12078
      /* Fall through.  */
12079
    case v_mode:
12080
      USED_REX (REX_W);
12081
      if (rex & REX_W)
12082
        op = get32s ();
12083
      else if (sizeflag & DFLAG)
12084
        {
12085
          op = get32 ();
12086
          mask = 0xffffffff;
12087
        }
12088
      else
12089
        {
12090
          op = get16 ();
12091
          mask = 0xfffff;
12092
        }
12093
      used_prefixes |= (prefixes & PREFIX_DATA);
12094
      break;
12095
    case w_mode:
12096
      mask = 0xfffff;
12097
      op = get16 ();
12098
      break;
12099
    case const_1_mode:
12100
      if (intel_syntax)
12101
        oappend ("1");
12102
      return;
12103
    default:
12104
      oappend (INTERNAL_DISASSEMBLER_ERROR);
12105
      return;
12106
    }
12107
 
12108
  op &= mask;
12109
  scratchbuf[0] = '$';
12110
  print_operand_value (scratchbuf + 1, 1, op);
12111
  oappend (scratchbuf + intel_syntax);
12112
  scratchbuf[0] = '\0';
12113
}
12114
 
12115
static void
12116
OP_I64 (int bytemode, int sizeflag)
12117
{
12118
  bfd_signed_vma op;
12119
  bfd_signed_vma mask = -1;
12120
 
12121
  if (address_mode != mode_64bit)
12122
    {
12123
      OP_I (bytemode, sizeflag);
12124
      return;
12125
    }
12126
 
12127
  switch (bytemode)
12128
    {
12129
    case b_mode:
12130
      FETCH_DATA (the_info, codep + 1);
12131
      op = *codep++;
12132
      mask = 0xff;
12133
      break;
12134
    case v_mode:
12135
      USED_REX (REX_W);
12136
      if (rex & REX_W)
12137
        op = get64 ();
12138
      else if (sizeflag & DFLAG)
12139
        {
12140
          op = get32 ();
12141
          mask = 0xffffffff;
12142
        }
12143
      else
12144
        {
12145
          op = get16 ();
12146
          mask = 0xfffff;
12147
        }
12148
      used_prefixes |= (prefixes & PREFIX_DATA);
12149
      break;
12150
    case w_mode:
12151
      mask = 0xfffff;
12152
      op = get16 ();
12153
      break;
12154
    default:
12155
      oappend (INTERNAL_DISASSEMBLER_ERROR);
12156
      return;
12157
    }
12158
 
12159
  op &= mask;
12160
  scratchbuf[0] = '$';
12161
  print_operand_value (scratchbuf + 1, 1, op);
12162
  oappend (scratchbuf + intel_syntax);
12163
  scratchbuf[0] = '\0';
12164
}
12165
 
12166
static void
12167
OP_sI (int bytemode, int sizeflag)
12168
{
12169
  bfd_signed_vma op;
12170
  bfd_signed_vma mask = -1;
12171
 
12172
  switch (bytemode)
12173
    {
12174
    case b_mode:
12175
      FETCH_DATA (the_info, codep + 1);
12176
      op = *codep++;
12177
      if ((op & 0x80) != 0)
12178
        op -= 0x100;
12179
      mask = 0xffffffff;
12180
      break;
12181
    case v_mode:
12182
      USED_REX (REX_W);
12183
      if (rex & REX_W)
12184
        op = get32s ();
12185
      else if (sizeflag & DFLAG)
12186
        {
12187
          op = get32s ();
12188
          mask = 0xffffffff;
12189
        }
12190
      else
12191
        {
12192
          mask = 0xffffffff;
12193
          op = get16 ();
12194
          if ((op & 0x8000) != 0)
12195
            op -= 0x10000;
12196
        }
12197
      used_prefixes |= (prefixes & PREFIX_DATA);
12198
      break;
12199
    case w_mode:
12200
      op = get16 ();
12201
      mask = 0xffffffff;
12202
      if ((op & 0x8000) != 0)
12203
        op -= 0x10000;
12204
      break;
12205
    default:
12206
      oappend (INTERNAL_DISASSEMBLER_ERROR);
12207
      return;
12208
    }
12209
 
12210
  scratchbuf[0] = '$';
12211
  print_operand_value (scratchbuf + 1, 1, op);
12212
  oappend (scratchbuf + intel_syntax);
12213
}
12214
 
12215
static void
12216
OP_J (int bytemode, int sizeflag)
12217
{
12218
  bfd_vma disp;
12219
  bfd_vma mask = -1;
12220
  bfd_vma segment = 0;
12221
 
12222
  switch (bytemode)
12223
    {
12224
    case b_mode:
12225
      FETCH_DATA (the_info, codep + 1);
12226
      disp = *codep++;
12227
      if ((disp & 0x80) != 0)
12228
        disp -= 0x100;
12229
      break;
12230
    case v_mode:
12231
      if ((sizeflag & DFLAG) || (rex & REX_W))
12232
        disp = get32s ();
12233
      else
12234
        {
12235
          disp = get16 ();
12236
          if ((disp & 0x8000) != 0)
12237
            disp -= 0x10000;
12238
          /* In 16bit mode, address is wrapped around at 64k within
12239
             the same segment.  Otherwise, a data16 prefix on a jump
12240
             instruction means that the pc is masked to 16 bits after
12241
             the displacement is added!  */
12242
          mask = 0xffff;
12243
          if ((prefixes & PREFIX_DATA) == 0)
12244
            segment = ((start_pc + codep - start_codep)
12245
                       & ~((bfd_vma) 0xffff));
12246
        }
12247
      used_prefixes |= (prefixes & PREFIX_DATA);
12248
      break;
12249
    default:
12250
      oappend (INTERNAL_DISASSEMBLER_ERROR);
12251
      return;
12252
    }
12253
  disp = ((start_pc + codep - start_codep + disp) & mask) | segment;
12254
  set_op (disp, 0);
12255
  print_operand_value (scratchbuf, 1, disp);
12256
  oappend (scratchbuf);
12257
}
12258
 
12259
static void
12260
OP_SEG (int bytemode, int sizeflag)
12261
{
12262
  if (bytemode == w_mode)
12263
    oappend (names_seg[modrm.reg]);
12264
  else
12265
    OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
12266
}
12267
 
12268
static void
12269
OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
12270
{
12271
  int seg, offset;
12272
 
12273
  if (sizeflag & DFLAG)
12274
    {
12275
      offset = get32 ();
12276
      seg = get16 ();
12277
    }
12278
  else
12279
    {
12280
      offset = get16 ();
12281
      seg = get16 ();
12282
    }
12283
  used_prefixes |= (prefixes & PREFIX_DATA);
12284
  if (intel_syntax)
12285
    sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
12286
  else
12287
    sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
12288
  oappend (scratchbuf);
12289
}
12290
 
12291
static void
12292
OP_OFF (int bytemode, int sizeflag)
12293
{
12294
  bfd_vma off;
12295
 
12296
  if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12297
    intel_operand_size (bytemode, sizeflag);
12298
  append_seg ();
12299
 
12300
  if ((sizeflag & AFLAG) || address_mode == mode_64bit)
12301
    off = get32 ();
12302
  else
12303
    off = get16 ();
12304
 
12305
  if (intel_syntax)
12306
    {
12307
      if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
12308
                        | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
12309
        {
12310
          oappend (names_seg[ds_reg - es_reg]);
12311
          oappend (":");
12312
        }
12313
    }
12314
  print_operand_value (scratchbuf, 1, off);
12315
  oappend (scratchbuf);
12316
}
12317
 
12318
static void
12319
OP_OFF64 (int bytemode, int sizeflag)
12320
{
12321
  bfd_vma off;
12322
 
12323
  if (address_mode != mode_64bit
12324
      || (prefixes & PREFIX_ADDR))
12325
    {
12326
      OP_OFF (bytemode, sizeflag);
12327
      return;
12328
    }
12329
 
12330
  if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12331
    intel_operand_size (bytemode, sizeflag);
12332
  append_seg ();
12333
 
12334
  off = get64 ();
12335
 
12336
  if (intel_syntax)
12337
    {
12338
      if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
12339
                        | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
12340
        {
12341
          oappend (names_seg[ds_reg - es_reg]);
12342
          oappend (":");
12343
        }
12344
    }
12345
  print_operand_value (scratchbuf, 1, off);
12346
  oappend (scratchbuf);
12347
}
12348
 
12349
static void
12350
ptr_reg (int code, int sizeflag)
12351
{
12352
  const char *s;
12353
 
12354
  *obufp++ = open_char;
12355
  used_prefixes |= (prefixes & PREFIX_ADDR);
12356
  if (address_mode == mode_64bit)
12357
    {
12358
      if (!(sizeflag & AFLAG))
12359
        s = names32[code - eAX_reg];
12360
      else
12361
        s = names64[code - eAX_reg];
12362
    }
12363
  else if (sizeflag & AFLAG)
12364
    s = names32[code - eAX_reg];
12365
  else
12366
    s = names16[code - eAX_reg];
12367
  oappend (s);
12368
  *obufp++ = close_char;
12369
  *obufp = 0;
12370
}
12371
 
12372
static void
12373
OP_ESreg (int code, int sizeflag)
12374
{
12375
  if (intel_syntax)
12376
    {
12377
      switch (codep[-1])
12378
        {
12379
        case 0x6d:      /* insw/insl */
12380
          intel_operand_size (z_mode, sizeflag);
12381
          break;
12382
        case 0xa5:      /* movsw/movsl/movsq */
12383
        case 0xa7:      /* cmpsw/cmpsl/cmpsq */
12384
        case 0xab:      /* stosw/stosl */
12385
        case 0xaf:      /* scasw/scasl */
12386
          intel_operand_size (v_mode, sizeflag);
12387
          break;
12388
        default:
12389
          intel_operand_size (b_mode, sizeflag);
12390
        }
12391
    }
12392
  oappend ("%es:" + intel_syntax);
12393
  ptr_reg (code, sizeflag);
12394
}
12395
 
12396
static void
12397
OP_DSreg (int code, int sizeflag)
12398
{
12399
  if (intel_syntax)
12400
    {
12401
      switch (codep[-1])
12402
        {
12403
        case 0x6f:      /* outsw/outsl */
12404
          intel_operand_size (z_mode, sizeflag);
12405
          break;
12406
        case 0xa5:      /* movsw/movsl/movsq */
12407
        case 0xa7:      /* cmpsw/cmpsl/cmpsq */
12408
        case 0xad:      /* lodsw/lodsl/lodsq */
12409
          intel_operand_size (v_mode, sizeflag);
12410
          break;
12411
        default:
12412
          intel_operand_size (b_mode, sizeflag);
12413
        }
12414
    }
12415
  if ((prefixes
12416
       & (PREFIX_CS
12417
          | PREFIX_DS
12418
          | PREFIX_SS
12419
          | PREFIX_ES
12420
          | PREFIX_FS
12421
          | PREFIX_GS)) == 0)
12422
    prefixes |= PREFIX_DS;
12423
  append_seg ();
12424
  ptr_reg (code, sizeflag);
12425
}
12426
 
12427
static void
12428
OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12429
{
12430
  int add;
12431
  if (rex & REX_R)
12432
    {
12433
      USED_REX (REX_R);
12434
      add = 8;
12435
    }
12436
  else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
12437
    {
12438
      lock_prefix = NULL;
12439
      used_prefixes |= PREFIX_LOCK;
12440
      add = 8;
12441
    }
12442
  else
12443
    add = 0;
12444
  sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
12445
  oappend (scratchbuf + intel_syntax);
12446
}
12447
 
12448
static void
12449
OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12450
{
12451
  int add;
12452
  USED_REX (REX_R);
12453
  if (rex & REX_R)
12454
    add = 8;
12455
  else
12456
    add = 0;
12457
  if (intel_syntax)
12458
    sprintf (scratchbuf, "db%d", modrm.reg + add);
12459
  else
12460
    sprintf (scratchbuf, "%%db%d", modrm.reg + add);
12461
  oappend (scratchbuf);
12462
}
12463
 
12464
static void
12465
OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12466
{
12467
  sprintf (scratchbuf, "%%tr%d", modrm.reg);
12468
  oappend (scratchbuf + intel_syntax);
12469
}
12470
 
12471
static void
12472
OP_R (int bytemode, int sizeflag)
12473
{
12474
  if (modrm.mod == 3)
12475
    OP_E (bytemode, sizeflag);
12476
  else
12477
    BadOp ();
12478
}
12479
 
12480
static void
12481
OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12482
{
12483
  used_prefixes |= (prefixes & PREFIX_DATA);
12484
  if (prefixes & PREFIX_DATA)
12485
    {
12486
      int add;
12487
      USED_REX (REX_R);
12488
      if (rex & REX_R)
12489
        add = 8;
12490
      else
12491
        add = 0;
12492
      sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
12493
    }
12494
  else
12495
    sprintf (scratchbuf, "%%mm%d", modrm.reg);
12496
  oappend (scratchbuf + intel_syntax);
12497
}
12498
 
12499
static void
12500
OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
12501
{
12502
  int add;
12503
  USED_REX (REX_R);
12504
  if (rex & REX_R)
12505
    add = 8;
12506
  else
12507
    add = 0;
12508
  if (need_vex && bytemode != xmm_mode)
12509
    {
12510
      switch (vex.length)
12511
        {
12512
        case 128:
12513
          sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
12514
          break;
12515
        case 256:
12516
          sprintf (scratchbuf, "%%ymm%d", modrm.reg + add);
12517
          break;
12518
        default:
12519
          abort ();
12520
        }
12521
    }
12522
  else
12523
    sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
12524
  oappend (scratchbuf + intel_syntax);
12525
}
12526
 
12527
static void
12528
OP_EM (int bytemode, int sizeflag)
12529
{
12530
  if (modrm.mod != 3)
12531
    {
12532
      if (intel_syntax && bytemode == v_mode)
12533
        {
12534
          bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
12535
          used_prefixes |= (prefixes & PREFIX_DATA);
12536
        }
12537
      OP_E (bytemode, sizeflag);
12538
      return;
12539
    }
12540
 
12541
  /* Skip mod/rm byte.  */
12542
  MODRM_CHECK;
12543
  codep++;
12544
  used_prefixes |= (prefixes & PREFIX_DATA);
12545
  if (prefixes & PREFIX_DATA)
12546
    {
12547
      int add;
12548
 
12549
      USED_REX (REX_B);
12550
      if (rex & REX_B)
12551
        add = 8;
12552
      else
12553
        add = 0;
12554
      sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
12555
    }
12556
  else
12557
    sprintf (scratchbuf, "%%mm%d", modrm.rm);
12558
  oappend (scratchbuf + intel_syntax);
12559
}
12560
 
12561
/* cvt* are the only instructions in sse2 which have
12562
   both SSE and MMX operands and also have 0x66 prefix
12563
   in their opcode. 0x66 was originally used to differentiate
12564
   between SSE and MMX instruction(operands). So we have to handle the
12565
   cvt* separately using OP_EMC and OP_MXC */
12566
static void
12567
OP_EMC (int bytemode, int sizeflag)
12568
{
12569
  if (modrm.mod != 3)
12570
    {
12571
      if (intel_syntax && bytemode == v_mode)
12572
        {
12573
          bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
12574
          used_prefixes |= (prefixes & PREFIX_DATA);
12575
        }
12576
      OP_E (bytemode, sizeflag);
12577
      return;
12578
    }
12579
 
12580
  /* Skip mod/rm byte.  */
12581
  MODRM_CHECK;
12582
  codep++;
12583
  used_prefixes |= (prefixes & PREFIX_DATA);
12584
  sprintf (scratchbuf, "%%mm%d", modrm.rm);
12585
  oappend (scratchbuf + intel_syntax);
12586
}
12587
 
12588
static void
12589
OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12590
{
12591
  used_prefixes |= (prefixes & PREFIX_DATA);
12592
  sprintf (scratchbuf, "%%mm%d", modrm.reg);
12593
  oappend (scratchbuf + intel_syntax);
12594
}
12595
 
12596
static void
12597
OP_EX (int bytemode, int sizeflag)
12598
{
12599
  int add;
12600
  if (modrm.mod != 3)
12601
    {
12602
      OP_E (bytemode, sizeflag);
12603
      return;
12604
    }
12605
  USED_REX (REX_B);
12606
  if (rex & REX_B)
12607
    add = 8;
12608
  else
12609
    add = 0;
12610
 
12611
  /* Skip mod/rm byte.  */
12612
  MODRM_CHECK;
12613
  codep++;
12614
  if (need_vex
12615
      && bytemode != xmm_mode
12616
      && bytemode != xmmq_mode)
12617
    {
12618
      switch (vex.length)
12619
        {
12620
        case 128:
12621
          sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
12622
          break;
12623
        case 256:
12624
          sprintf (scratchbuf, "%%ymm%d", modrm.rm + add);
12625
          break;
12626
        default:
12627
          abort ();
12628
        }
12629
    }
12630
  else
12631
    sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
12632
  oappend (scratchbuf + intel_syntax);
12633
}
12634
 
12635
static void
12636
OP_MS (int bytemode, int sizeflag)
12637
{
12638
  if (modrm.mod == 3)
12639
    OP_EM (bytemode, sizeflag);
12640
  else
12641
    BadOp ();
12642
}
12643
 
12644
static void
12645
OP_XS (int bytemode, int sizeflag)
12646
{
12647
  if (modrm.mod == 3)
12648
    OP_EX (bytemode, sizeflag);
12649
  else
12650
    BadOp ();
12651
}
12652
 
12653
static void
12654
OP_M (int bytemode, int sizeflag)
12655
{
12656
  if (modrm.mod == 3)
12657
    /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
12658
    BadOp ();
12659
  else
12660
    OP_E (bytemode, sizeflag);
12661
}
12662
 
12663
static void
12664
OP_0f07 (int bytemode, int sizeflag)
12665
{
12666
  if (modrm.mod != 3 || modrm.rm != 0)
12667
    BadOp ();
12668
  else
12669
    OP_E (bytemode, sizeflag);
12670
}
12671
 
12672
/* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
12673
   32bit mode and "xchg %rax,%rax" in 64bit mode.  */
12674
 
12675
static void
12676
NOP_Fixup1 (int bytemode, int sizeflag)
12677
{
12678
  if ((prefixes & PREFIX_DATA) != 0
12679
      || (rex != 0
12680
          && rex != 0x48
12681
          && address_mode == mode_64bit))
12682
    OP_REG (bytemode, sizeflag);
12683
  else
12684
    strcpy (obuf, "nop");
12685
}
12686
 
12687
static void
12688
NOP_Fixup2 (int bytemode, int sizeflag)
12689
{
12690
  if ((prefixes & PREFIX_DATA) != 0
12691
      || (rex != 0
12692
          && rex != 0x48
12693
          && address_mode == mode_64bit))
12694
    OP_IMREG (bytemode, sizeflag);
12695
}
12696
 
12697
static const char *const Suffix3DNow[] = {
12698
/* 00 */        NULL,           NULL,           NULL,           NULL,
12699
/* 04 */        NULL,           NULL,           NULL,           NULL,
12700
/* 08 */        NULL,           NULL,           NULL,           NULL,
12701
/* 0C */        "pi2fw",        "pi2fd",        NULL,           NULL,
12702
/* 10 */        NULL,           NULL,           NULL,           NULL,
12703
/* 14 */        NULL,           NULL,           NULL,           NULL,
12704
/* 18 */        NULL,           NULL,           NULL,           NULL,
12705
/* 1C */        "pf2iw",        "pf2id",        NULL,           NULL,
12706
/* 20 */        NULL,           NULL,           NULL,           NULL,
12707
/* 24 */        NULL,           NULL,           NULL,           NULL,
12708
/* 28 */        NULL,           NULL,           NULL,           NULL,
12709
/* 2C */        NULL,           NULL,           NULL,           NULL,
12710
/* 30 */        NULL,           NULL,           NULL,           NULL,
12711
/* 34 */        NULL,           NULL,           NULL,           NULL,
12712
/* 38 */        NULL,           NULL,           NULL,           NULL,
12713
/* 3C */        NULL,           NULL,           NULL,           NULL,
12714
/* 40 */        NULL,           NULL,           NULL,           NULL,
12715
/* 44 */        NULL,           NULL,           NULL,           NULL,
12716
/* 48 */        NULL,           NULL,           NULL,           NULL,
12717
/* 4C */        NULL,           NULL,           NULL,           NULL,
12718
/* 50 */        NULL,           NULL,           NULL,           NULL,
12719
/* 54 */        NULL,           NULL,           NULL,           NULL,
12720
/* 58 */        NULL,           NULL,           NULL,           NULL,
12721
/* 5C */        NULL,           NULL,           NULL,           NULL,
12722
/* 60 */        NULL,           NULL,           NULL,           NULL,
12723
/* 64 */        NULL,           NULL,           NULL,           NULL,
12724
/* 68 */        NULL,           NULL,           NULL,           NULL,
12725
/* 6C */        NULL,           NULL,           NULL,           NULL,
12726
/* 70 */        NULL,           NULL,           NULL,           NULL,
12727
/* 74 */        NULL,           NULL,           NULL,           NULL,
12728
/* 78 */        NULL,           NULL,           NULL,           NULL,
12729
/* 7C */        NULL,           NULL,           NULL,           NULL,
12730
/* 80 */        NULL,           NULL,           NULL,           NULL,
12731
/* 84 */        NULL,           NULL,           NULL,           NULL,
12732
/* 88 */        NULL,           NULL,           "pfnacc",       NULL,
12733
/* 8C */        NULL,           NULL,           "pfpnacc",      NULL,
12734
/* 90 */        "pfcmpge",      NULL,           NULL,           NULL,
12735
/* 94 */        "pfmin",        NULL,           "pfrcp",        "pfrsqrt",
12736
/* 98 */        NULL,           NULL,           "pfsub",        NULL,
12737
/* 9C */        NULL,           NULL,           "pfadd",        NULL,
12738
/* A0 */        "pfcmpgt",      NULL,           NULL,           NULL,
12739
/* A4 */        "pfmax",        NULL,           "pfrcpit1",     "pfrsqit1",
12740
/* A8 */        NULL,           NULL,           "pfsubr",       NULL,
12741
/* AC */        NULL,           NULL,           "pfacc",        NULL,
12742
/* B0 */        "pfcmpeq",      NULL,           NULL,           NULL,
12743
/* B4 */        "pfmul",        NULL,           "pfrcpit2",     "pmulhrw",
12744
/* B8 */        NULL,           NULL,           NULL,           "pswapd",
12745
/* BC */        NULL,           NULL,           NULL,           "pavgusb",
12746
/* C0 */        NULL,           NULL,           NULL,           NULL,
12747
/* C4 */        NULL,           NULL,           NULL,           NULL,
12748
/* C8 */        NULL,           NULL,           NULL,           NULL,
12749
/* CC */        NULL,           NULL,           NULL,           NULL,
12750
/* D0 */        NULL,           NULL,           NULL,           NULL,
12751
/* D4 */        NULL,           NULL,           NULL,           NULL,
12752
/* D8 */        NULL,           NULL,           NULL,           NULL,
12753
/* DC */        NULL,           NULL,           NULL,           NULL,
12754
/* E0 */        NULL,           NULL,           NULL,           NULL,
12755
/* E4 */        NULL,           NULL,           NULL,           NULL,
12756
/* E8 */        NULL,           NULL,           NULL,           NULL,
12757
/* EC */        NULL,           NULL,           NULL,           NULL,
12758
/* F0 */        NULL,           NULL,           NULL,           NULL,
12759
/* F4 */        NULL,           NULL,           NULL,           NULL,
12760
/* F8 */        NULL,           NULL,           NULL,           NULL,
12761
/* FC */        NULL,           NULL,           NULL,           NULL,
12762
};
12763
 
12764
static void
12765
OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12766
{
12767
  const char *mnemonic;
12768
 
12769
  FETCH_DATA (the_info, codep + 1);
12770
  /* AMD 3DNow! instructions are specified by an opcode suffix in the
12771
     place where an 8-bit immediate would normally go.  ie. the last
12772
     byte of the instruction.  */
12773
  obufp = obuf + strlen (obuf);
12774
  mnemonic = Suffix3DNow[*codep++ & 0xff];
12775
  if (mnemonic)
12776
    oappend (mnemonic);
12777
  else
12778
    {
12779
      /* Since a variable sized modrm/sib chunk is between the start
12780
         of the opcode (0x0f0f) and the opcode suffix, we need to do
12781
         all the modrm processing first, and don't know until now that
12782
         we have a bad opcode.  This necessitates some cleaning up.  */
12783
      op_out[0][0] = '\0';
12784
      op_out[1][0] = '\0';
12785
      BadOp ();
12786
    }
12787
}
12788
 
12789
static const char *simd_cmp_op[] = {
12790
  "eq",
12791
  "lt",
12792
  "le",
12793
  "unord",
12794
  "neq",
12795
  "nlt",
12796
  "nle",
12797
  "ord"
12798
};
12799
 
12800
static void
12801
CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12802
{
12803
  unsigned int cmp_type;
12804
 
12805
  FETCH_DATA (the_info, codep + 1);
12806
  cmp_type = *codep++ & 0xff;
12807
  if (cmp_type < ARRAY_SIZE (simd_cmp_op))
12808
    {
12809
      char suffix [3];
12810
      char *p = obuf + strlen (obuf) - 2;
12811
      suffix[0] = p[0];
12812
      suffix[1] = p[1];
12813
      suffix[2] = '\0';
12814
      sprintf (p, "%s%s", simd_cmp_op[cmp_type], suffix);
12815
    }
12816
  else
12817
    {
12818
      /* We have a reserved extension byte.  Output it directly.  */
12819
      scratchbuf[0] = '$';
12820
      print_operand_value (scratchbuf + 1, 1, cmp_type);
12821
      oappend (scratchbuf + intel_syntax);
12822
      scratchbuf[0] = '\0';
12823
    }
12824
}
12825
 
12826
static void
12827
OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
12828
          int sizeflag ATTRIBUTE_UNUSED)
12829
{
12830
  /* mwait %eax,%ecx  */
12831
  if (!intel_syntax)
12832
    {
12833
      const char **names = (address_mode == mode_64bit
12834
                            ? names64 : names32);
12835
      strcpy (op_out[0], names[0]);
12836
      strcpy (op_out[1], names[1]);
12837
      two_source_ops = 1;
12838
    }
12839
  /* Skip mod/rm byte.  */
12840
  MODRM_CHECK;
12841
  codep++;
12842
}
12843
 
12844
static void
12845
OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
12846
            int sizeflag ATTRIBUTE_UNUSED)
12847
{
12848
  /* monitor %eax,%ecx,%edx"  */
12849
  if (!intel_syntax)
12850
    {
12851
      const char **op1_names;
12852
      const char **names = (address_mode == mode_64bit
12853
                            ? names64 : names32);
12854
 
12855
      if (!(prefixes & PREFIX_ADDR))
12856
        op1_names = (address_mode == mode_16bit
12857
                     ? names16 : names);
12858
      else
12859
        {
12860
          /* Remove "addr16/addr32".  */
12861
          addr_prefix = NULL;
12862
          op1_names = (address_mode != mode_32bit
12863
                       ? names32 : names16);
12864
          used_prefixes |= PREFIX_ADDR;
12865
        }
12866
      strcpy (op_out[0], op1_names[0]);
12867
      strcpy (op_out[1], names[1]);
12868
      strcpy (op_out[2], names[2]);
12869
      two_source_ops = 1;
12870
    }
12871
  /* Skip mod/rm byte.  */
12872
  MODRM_CHECK;
12873
  codep++;
12874
}
12875
 
12876
static void
12877
BadOp (void)
12878
{
12879
  /* Throw away prefixes and 1st. opcode byte.  */
12880
  codep = insn_codep + 1;
12881
  oappend ("(bad)");
12882
}
12883
 
12884
static void
12885
REP_Fixup (int bytemode, int sizeflag)
12886
{
12887
  /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
12888
     lods and stos.  */
12889
  if (prefixes & PREFIX_REPZ)
12890
    repz_prefix = "rep ";
12891
 
12892
  switch (bytemode)
12893
    {
12894
    case al_reg:
12895
    case eAX_reg:
12896
    case indir_dx_reg:
12897
      OP_IMREG (bytemode, sizeflag);
12898
      break;
12899
    case eDI_reg:
12900
      OP_ESreg (bytemode, sizeflag);
12901
      break;
12902
    case eSI_reg:
12903
      OP_DSreg (bytemode, sizeflag);
12904
      break;
12905
    default:
12906
      abort ();
12907
      break;
12908
    }
12909
}
12910
 
12911
static void
12912
CMPXCHG8B_Fixup (int bytemode, int sizeflag)
12913
{
12914
  USED_REX (REX_W);
12915
  if (rex & REX_W)
12916
    {
12917
      /* Change cmpxchg8b to cmpxchg16b.  */
12918
      char *p = obuf + strlen (obuf) - 2;
12919
      strcpy (p, "16b");
12920
      bytemode = o_mode;
12921
    }
12922
  OP_M (bytemode, sizeflag);
12923
}
12924
 
12925
static void
12926
XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
12927
{
12928
  if (need_vex)
12929
    {
12930
      switch (vex.length)
12931
        {
12932
        case 128:
12933
          sprintf (scratchbuf, "%%xmm%d", reg);
12934
          break;
12935
        case 256:
12936
          sprintf (scratchbuf, "%%ymm%d", reg);
12937
          break;
12938
        default:
12939
          abort ();
12940
        }
12941
    }
12942
  else
12943
    sprintf (scratchbuf, "%%xmm%d", reg);
12944
  oappend (scratchbuf + intel_syntax);
12945
}
12946
 
12947
static void
12948
CRC32_Fixup (int bytemode, int sizeflag)
12949
{
12950
  /* Add proper suffix to "crc32".  */
12951
  char *p = obuf + strlen (obuf);
12952
 
12953
  switch (bytemode)
12954
    {
12955
    case b_mode:
12956
      if (intel_syntax)
12957
        break;
12958
 
12959
      *p++ = 'b';
12960
      break;
12961
    case v_mode:
12962
      if (intel_syntax)
12963
        break;
12964
 
12965
      USED_REX (REX_W);
12966
      if (rex & REX_W)
12967
        *p++ = 'q';
12968
      else if (sizeflag & DFLAG)
12969
        *p++ = 'l';
12970
      else
12971
        *p++ = 'w';
12972
      used_prefixes |= (prefixes & PREFIX_DATA);
12973
      break;
12974
    default:
12975
      oappend (INTERNAL_DISASSEMBLER_ERROR);
12976
      break;
12977
    }
12978
  *p = '\0';
12979
 
12980
  if (modrm.mod == 3)
12981
    {
12982
      int add;
12983
 
12984
      /* Skip mod/rm byte.  */
12985
      MODRM_CHECK;
12986
      codep++;
12987
 
12988
      USED_REX (REX_B);
12989
      add = (rex & REX_B) ? 8 : 0;
12990
      if (bytemode == b_mode)
12991
        {
12992
          USED_REX (0);
12993
          if (rex)
12994
            oappend (names8rex[modrm.rm + add]);
12995
          else
12996
            oappend (names8[modrm.rm + add]);
12997
        }
12998
      else
12999
        {
13000
          USED_REX (REX_W);
13001
          if (rex & REX_W)
13002
            oappend (names64[modrm.rm + add]);
13003
          else if ((prefixes & PREFIX_DATA))
13004
            oappend (names16[modrm.rm + add]);
13005
          else
13006
            oappend (names32[modrm.rm + add]);
13007
        }
13008
    }
13009
  else
13010
    OP_E (bytemode, sizeflag);
13011
}
13012
 
13013
/* Print a DREX argument as either a register or memory operation.  */
13014
static void
13015
print_drex_arg (unsigned int reg, int bytemode, int sizeflag)
13016
{
13017
  if (reg == DREX_REG_UNKNOWN)
13018
    BadOp ();
13019
 
13020
  else if (reg != DREX_REG_MEMORY)
13021
    {
13022
      sprintf (scratchbuf, "%%xmm%d", reg);
13023
      oappend (scratchbuf + intel_syntax);
13024
    }
13025
 
13026
  else
13027
    OP_E_extended (bytemode, sizeflag, 1);
13028
}
13029
 
13030
/* SSE5 instructions that have 4 arguments are encoded as:
13031
   0f 24 <sub-opcode> <modrm> <optional-sib> <drex> <offset>.
13032
 
13033
   The <sub-opcode> byte has 1 bit (0x4) that is combined with 1 bit in
13034
   the DREX field (0x8) to determine how the arguments are laid out.
13035
   The destination register must be the same register as one of the
13036
   inputs, and it is encoded in the DREX byte.  No REX prefix is used
13037
   for these instructions, since the DREX field contains the 3 extension
13038
   bits provided by the REX prefix.
13039
 
13040
   The bytemode argument adds 2 extra bits for passing extra information:
13041
        DREX_OC1        -- Set the OC1 bit to indicate dest == 1st arg
13042
        DREX_NO_OC0     -- OC0 in DREX is invalid
13043
        (but pretend it is set).  */
13044
 
13045
static void
13046
OP_DREX4 (int flag_bytemode, int sizeflag)
13047
{
13048
  unsigned int drex_byte;
13049
  unsigned int regs[4];
13050
  unsigned int modrm_regmem;
13051
  unsigned int modrm_reg;
13052
  unsigned int drex_reg;
13053
  int bytemode;
13054
  int rex_save = rex;
13055
  int rex_used_save = rex_used;
13056
  int has_sib = 0;
13057
  int oc1 = (flag_bytemode & DREX_OC1) ? 2 : 0;
13058
  int oc0;
13059
  int i;
13060
 
13061
  bytemode = flag_bytemode & ~ DREX_MASK;
13062
 
13063
  for (i = 0; i < 4; i++)
13064
    regs[i] = DREX_REG_UNKNOWN;
13065
 
13066
  /* Determine if we have a SIB byte in addition to MODRM before the
13067
     DREX byte.  */
13068
  if (((sizeflag & AFLAG) || address_mode == mode_64bit)
13069
      && (modrm.mod != 3)
13070
      && (modrm.rm == 4))
13071
    has_sib = 1;
13072
 
13073
  /* Get the DREX byte.  */
13074
  FETCH_DATA (the_info, codep + 2 + has_sib);
13075
  drex_byte = codep[has_sib+1];
13076
  drex_reg = DREX_XMM (drex_byte);
13077
  modrm_reg = modrm.reg + ((drex_byte & REX_R) ? 8 : 0);
13078
 
13079
  /* Is OC0 legal?  If not, hardwire oc0 == 1.  */
13080
  if (flag_bytemode & DREX_NO_OC0)
13081
    {
13082
      oc0 = 1;
13083
      if (DREX_OC0 (drex_byte))
13084
        BadOp ();
13085
    }
13086
  else
13087
    oc0 = DREX_OC0 (drex_byte);
13088
 
13089
  if (modrm.mod == 3)
13090
    {
13091
      /* regmem == register  */
13092
      modrm_regmem = modrm.rm + ((drex_byte & REX_B) ? 8 : 0);
13093
      rex = rex_used = 0;
13094
      /* skip modrm/drex since we don't call OP_E_extended  */
13095
      codep += 2;
13096
    }
13097
  else
13098
    {
13099
      /* regmem == memory, fill in appropriate REX bits  */
13100
      modrm_regmem = DREX_REG_MEMORY;
13101
      rex = drex_byte & (REX_B | REX_X | REX_R);
13102
      if (rex)
13103
        rex |= REX_OPCODE;
13104
      rex_used = rex;
13105
    }
13106
 
13107
  /* Based on the OC1/OC0 bits, lay out the arguments in the correct
13108
     order.  */
13109
  switch (oc0 + oc1)
13110
    {
13111
    default:
13112
      BadOp ();
13113
      return;
13114
 
13115
    case 0:
13116
      regs[0] = modrm_regmem;
13117
      regs[1] = modrm_reg;
13118
      regs[2] = drex_reg;
13119
      regs[3] = drex_reg;
13120
      break;
13121
 
13122
    case 1:
13123
      regs[0] = modrm_reg;
13124
      regs[1] = modrm_regmem;
13125
      regs[2] = drex_reg;
13126
      regs[3] = drex_reg;
13127
      break;
13128
 
13129
    case 2:
13130
      regs[0] = drex_reg;
13131
      regs[1] = modrm_regmem;
13132
      regs[2] = modrm_reg;
13133
      regs[3] = drex_reg;
13134
      break;
13135
 
13136
    case 3:
13137
      regs[0] = drex_reg;
13138
      regs[1] = modrm_reg;
13139
      regs[2] = modrm_regmem;
13140
      regs[3] = drex_reg;
13141
      break;
13142
    }
13143
 
13144
  /* Print out the arguments.  */
13145
  for (i = 0; i < 4; i++)
13146
    {
13147
      int j = (intel_syntax) ? 3 - i : i;
13148
      if (i > 0)
13149
        {
13150
          *obufp++ = ',';
13151
          *obufp = '\0';
13152
        }
13153
 
13154
      print_drex_arg (regs[j], bytemode, sizeflag);
13155
    }
13156
 
13157
  rex = rex_save;
13158
  rex_used = rex_used_save;
13159
}
13160
 
13161
/* SSE5 instructions that have 3 arguments, and are encoded as:
13162
   0f 24 <sub-opcode> <modrm> <optional-sib> <drex> <offset>    (or)
13163
   0f 25 <sub-opcode> <modrm> <optional-sib> <drex> <offset> <cmp-byte>
13164
 
13165
   The DREX field has 1 bit (0x8) to determine how the arguments are
13166
   laid out. The destination register is encoded in the DREX byte.
13167
   No REX prefix is used for these instructions, since the DREX field
13168
   contains the 3 extension bits provided by the REX prefix.  */
13169
 
13170
static void
13171
OP_DREX3 (int flag_bytemode, int sizeflag)
13172
{
13173
  unsigned int drex_byte;
13174
  unsigned int regs[3];
13175
  unsigned int modrm_regmem;
13176
  unsigned int modrm_reg;
13177
  unsigned int drex_reg;
13178
  int bytemode;
13179
  int rex_save = rex;
13180
  int rex_used_save = rex_used;
13181
  int has_sib = 0;
13182
  int oc0;
13183
  int i;
13184
 
13185
  bytemode = flag_bytemode & ~ DREX_MASK;
13186
 
13187
  for (i = 0; i < 3; i++)
13188
    regs[i] = DREX_REG_UNKNOWN;
13189
 
13190
  /* Determine if we have a SIB byte in addition to MODRM before the
13191
     DREX byte.  */
13192
  if (((sizeflag & AFLAG) || address_mode == mode_64bit)
13193
      && (modrm.mod != 3)
13194
      && (modrm.rm == 4))
13195
    has_sib = 1;
13196
 
13197
  /* Get the DREX byte.  */
13198
  FETCH_DATA (the_info, codep + 2 + has_sib);
13199
  drex_byte = codep[has_sib+1];
13200
  drex_reg = DREX_XMM (drex_byte);
13201
  modrm_reg = modrm.reg + ((drex_byte & REX_R) ? 8 : 0);
13202
 
13203
  /* Is OC0 legal?  If not, hardwire oc0 == 0 */
13204
  oc0 = DREX_OC0 (drex_byte);
13205
  if ((flag_bytemode & DREX_NO_OC0) && oc0)
13206
    BadOp ();
13207
 
13208
  if (modrm.mod == 3)
13209
    {
13210
      /* regmem == register */
13211
      modrm_regmem = modrm.rm + ((drex_byte & REX_B) ? 8 : 0);
13212
      rex = rex_used = 0;
13213
      /* skip modrm/drex since we don't call OP_E_extended.  */
13214
      codep += 2;
13215
    }
13216
  else
13217
    {
13218
      /* regmem == memory, fill in appropriate REX bits.  */
13219
      modrm_regmem = DREX_REG_MEMORY;
13220
      rex = drex_byte & (REX_B | REX_X | REX_R);
13221
      if (rex)
13222
        rex |= REX_OPCODE;
13223
      rex_used = rex;
13224
    }
13225
 
13226
  /* Based on the OC1/OC0 bits, lay out the arguments in the correct
13227
     order.  */
13228
  switch (oc0)
13229
    {
13230
    default:
13231
      BadOp ();
13232
      return;
13233
 
13234
    case 0:
13235
      regs[0] = modrm_regmem;
13236
      regs[1] = modrm_reg;
13237
      regs[2] = drex_reg;
13238
      break;
13239
 
13240
    case 1:
13241
      regs[0] = modrm_reg;
13242
      regs[1] = modrm_regmem;
13243
      regs[2] = drex_reg;
13244
      break;
13245
    }
13246
 
13247
  /* Print out the arguments.  */
13248
  for (i = 0; i < 3; i++)
13249
    {
13250
      int j = (intel_syntax) ? 2 - i : i;
13251
      if (i > 0)
13252
        {
13253
          *obufp++ = ',';
13254
          *obufp = '\0';
13255
        }
13256
 
13257
      print_drex_arg (regs[j], bytemode, sizeflag);
13258
    }
13259
 
13260
  rex = rex_save;
13261
  rex_used = rex_used_save;
13262
}
13263
 
13264
/* Emit a floating point comparison for comp<xx> instructions.  */
13265
 
13266
static void
13267
OP_DREX_FCMP (int bytemode ATTRIBUTE_UNUSED,
13268
              int sizeflag ATTRIBUTE_UNUSED)
13269
{
13270
  unsigned char byte;
13271
 
13272
  static const char *const cmp_test[] = {
13273
    "eq",
13274
    "lt",
13275
    "le",
13276
    "unord",
13277
    "ne",
13278
    "nlt",
13279
    "nle",
13280
    "ord",
13281
    "ueq",
13282
    "ult",
13283
    "ule",
13284
    "false",
13285
    "une",
13286
    "unlt",
13287
    "unle",
13288
    "true"
13289
  };
13290
 
13291
  FETCH_DATA (the_info, codep + 1);
13292
  byte = *codep & 0xff;
13293
 
13294
  if (byte >= ARRAY_SIZE (cmp_test)
13295
      || obuf[0] != 'c'
13296
      || obuf[1] != 'o'
13297
      || obuf[2] != 'm')
13298
    {
13299
      /* The instruction isn't one we know about, so just append the
13300
         extension byte as a numeric value.  */
13301
      OP_I (b_mode, 0);
13302
    }
13303
 
13304
  else
13305
    {
13306
      sprintf (scratchbuf, "com%s%s", cmp_test[byte], obuf+3);
13307
      strcpy (obuf, scratchbuf);
13308
      codep++;
13309
    }
13310
}
13311
 
13312
/* Emit an integer point comparison for pcom<xx> instructions,
13313
   rewriting the instruction to have the test inside of it.  */
13314
 
13315
static void
13316
OP_DREX_ICMP (int bytemode ATTRIBUTE_UNUSED,
13317
              int sizeflag ATTRIBUTE_UNUSED)
13318
{
13319
  unsigned char byte;
13320
 
13321
  static const char *const cmp_test[] = {
13322
    "lt",
13323
    "le",
13324
    "gt",
13325
    "ge",
13326
    "eq",
13327
    "ne",
13328
    "false",
13329
    "true"
13330
  };
13331
 
13332
  FETCH_DATA (the_info, codep + 1);
13333
  byte = *codep & 0xff;
13334
 
13335
  if (byte >= ARRAY_SIZE (cmp_test)
13336
      || obuf[0] != 'p'
13337
      || obuf[1] != 'c'
13338
      || obuf[2] != 'o'
13339
      || obuf[3] != 'm')
13340
    {
13341
      /* The instruction isn't one we know about, so just print the
13342
         comparison test byte as a numeric value.  */
13343
      OP_I (b_mode, 0);
13344
    }
13345
 
13346
  else
13347
    {
13348
      sprintf (scratchbuf, "pcom%s%s", cmp_test[byte], obuf+4);
13349
      strcpy (obuf, scratchbuf);
13350
      codep++;
13351
    }
13352
}
13353
 
13354
/* Display the destination register operand for instructions with
13355
   VEX. */
13356
 
13357
static void
13358
OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13359
{
13360
  if (!need_vex)
13361
    abort ();
13362
 
13363
  if (!need_vex_reg)
13364
    return;
13365
 
13366
  switch (vex.length)
13367
    {
13368
    case 128:
13369
      switch (bytemode)
13370
        {
13371
        case vex_mode:
13372
        case vex128_mode:
13373
          break;
13374
        default:
13375
          abort ();
13376
          return;
13377
        }
13378
 
13379
      sprintf (scratchbuf, "%%xmm%d", vex.register_specifier);
13380
      break;
13381
    case 256:
13382
      switch (bytemode)
13383
        {
13384
        case vex_mode:
13385
        case vex256_mode:
13386
          break;
13387
        default:
13388
          abort ();
13389
          return;
13390
        }
13391
 
13392
      sprintf (scratchbuf, "%%ymm%d", vex.register_specifier);
13393
      break;
13394
    default:
13395
      abort ();
13396
      break;
13397
    }
13398
  oappend (scratchbuf + intel_syntax);
13399
}
13400
 
13401
/* Get the VEX immediate byte without moving codep.  */
13402
 
13403
static unsigned char
13404
get_vex_imm8 (int sizeflag)
13405
{
13406
  int bytes_before_imm = 0;
13407
 
13408
  /* Skip mod/rm byte.   */
13409
  MODRM_CHECK;
13410
  codep++;
13411
 
13412
  if (modrm.mod != 3)
13413
    {
13414
      /* There are SIB/displacement bytes.  */
13415
      if ((sizeflag & AFLAG) || address_mode == mode_64bit)
13416
        {
13417
          /* 32/64 bit address mode */
13418
          int base = modrm.rm;
13419
 
13420
          /* Check SIB byte.  */
13421
          if (base == 4)
13422
            {
13423
              FETCH_DATA (the_info, codep + 1);
13424
              base = *codep & 7;
13425
              bytes_before_imm++;
13426
            }
13427
 
13428
          switch (modrm.mod)
13429
            {
13430
            case 0:
13431
              /* When modrm.rm == 5 or modrm.rm == 4 and base in
13432
                 SIB == 5, there is a 4 byte displacement.  */
13433
              if (base != 5)
13434
                /* No displacement. */
13435
                break;
13436
            case 2:
13437
              /* 4 byte displacement.  */
13438
              bytes_before_imm += 4;
13439
              break;
13440
            case 1:
13441
              /* 1 byte displacement.  */
13442
              bytes_before_imm++;
13443
              break;
13444
            }
13445
        }
13446
      else
13447
        { /* 16 bit address mode */
13448
          switch (modrm.mod)
13449
            {
13450
            case 0:
13451
              /* When modrm.rm == 6, there is a 2 byte displacement.  */
13452
              if (modrm.rm != 6)
13453
                /* No displacement. */
13454
                break;
13455
            case 2:
13456
              /* 2 byte displacement.  */
13457
              bytes_before_imm += 2;
13458
              break;
13459
            case 1:
13460
              /* 1 byte displacement.  */
13461
              bytes_before_imm++;
13462
              break;
13463
            }
13464
        }
13465
    }
13466
 
13467
  FETCH_DATA (the_info, codep + bytes_before_imm + 1);
13468
  return codep [bytes_before_imm];
13469
}
13470
 
13471
static void
13472
OP_EX_VexReg (int bytemode, int sizeflag, int reg)
13473
{
13474
  if (reg == -1 && modrm.mod != 3)
13475
    {
13476
      OP_E_memory (bytemode, sizeflag, 0);
13477
      return;
13478
    }
13479
  else
13480
    {
13481
      if (reg == -1)
13482
        {
13483
          reg = modrm.rm;
13484
          USED_REX (REX_B);
13485
          if (rex & REX_B)
13486
            reg += 8;
13487
        }
13488
      else if (reg > 7 && address_mode != mode_64bit)
13489
        BadOp ();
13490
    }
13491
 
13492
  switch (vex.length)
13493
    {
13494
    case 128:
13495
      sprintf (scratchbuf, "%%xmm%d", reg);
13496
      break;
13497
    case 256:
13498
      sprintf (scratchbuf, "%%ymm%d", reg);
13499
      break;
13500
    default:
13501
      abort ();
13502
    }
13503
  oappend (scratchbuf + intel_syntax);
13504
}
13505
 
13506
static void
13507
OP_EX_VexImmW (int bytemode, int sizeflag)
13508
{
13509
  int reg = -1;
13510
  static unsigned char vex_imm8;
13511
 
13512
  if (!vex_w_done)
13513
    {
13514
      vex_imm8 = get_vex_imm8 (sizeflag);
13515
      if (vex.w)
13516
        reg = vex_imm8 >> 4;
13517
      vex_w_done = 1;
13518
    }
13519
  else
13520
    {
13521
      if (!vex.w)
13522
        reg = vex_imm8 >> 4;
13523
    }
13524
 
13525
  OP_EX_VexReg (bytemode, sizeflag, reg);
13526
}
13527
 
13528
static void
13529
OP_EX_VexW (int bytemode, int sizeflag)
13530
{
13531
  int reg = -1;
13532
 
13533
  if (!vex_w_done)
13534
    {
13535
      vex_w_done = 1;
13536
      if (vex.w)
13537
        reg = vex.register_specifier;
13538
    }
13539
  else
13540
    {
13541
      if (!vex.w)
13542
        reg = vex.register_specifier;
13543
    }
13544
 
13545
  OP_EX_VexReg (bytemode, sizeflag, reg);
13546
}
13547
 
13548
static void
13549
OP_VEX_FMA (int bytemode, int sizeflag)
13550
{
13551
  int reg = get_vex_imm8 (sizeflag) >> 4;
13552
 
13553
  if (reg > 7 && address_mode != mode_64bit)
13554
    BadOp ();
13555
 
13556
  switch (vex.length)
13557
    {
13558
    case 128:
13559
      switch (bytemode)
13560
        {
13561
        case vex_mode:
13562
        case vex128_mode:
13563
          break;
13564
        default:
13565
          abort ();
13566
          return;
13567
        }
13568
 
13569
      sprintf (scratchbuf, "%%xmm%d", reg);
13570
      break;
13571
    case 256:
13572
      switch (bytemode)
13573
        {
13574
        case vex_mode:
13575
          break;
13576
        default:
13577
          abort ();
13578
          return;
13579
        }
13580
 
13581
      sprintf (scratchbuf, "%%ymm%d", reg);
13582
      break;
13583
    default:
13584
      abort ();
13585
    }
13586
  oappend (scratchbuf + intel_syntax);
13587
}
13588
 
13589
static void
13590
VEXI4_Fixup (int bytemode ATTRIBUTE_UNUSED,
13591
             int sizeflag ATTRIBUTE_UNUSED)
13592
{
13593
  /* Skip the immediate byte and check for invalid bits.  */
13594
  FETCH_DATA (the_info, codep + 1);
13595
  if (*codep++ & 0xf)
13596
    BadOp ();
13597
}
13598
 
13599
static void
13600
OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13601
{
13602
  int reg;
13603
  FETCH_DATA (the_info, codep + 1);
13604
  reg = *codep++;
13605
 
13606
  if (bytemode != x_mode)
13607
    abort ();
13608
 
13609
  if (reg & 0xf)
13610
      BadOp ();
13611
 
13612
  reg >>= 4;
13613
  if (reg > 7 && address_mode != mode_64bit)
13614
    BadOp ();
13615
 
13616
  switch (vex.length)
13617
    {
13618
    case 128:
13619
      sprintf (scratchbuf, "%%xmm%d", reg);
13620
      break;
13621
    case 256:
13622
      sprintf (scratchbuf, "%%ymm%d", reg);
13623
      break;
13624
    default:
13625
      abort ();
13626
    }
13627
  oappend (scratchbuf + intel_syntax);
13628
}
13629
 
13630
static void
13631
OP_XMM_VexW (int bytemode, int sizeflag)
13632
{
13633
  /* Turn off the REX.W bit since it is used for swapping operands
13634
     now.  */
13635
  rex &= ~REX_W;
13636
  OP_XMM (bytemode, sizeflag);
13637
}
13638
 
13639
static void
13640
OP_EX_Vex (int bytemode, int sizeflag)
13641
{
13642
  if (modrm.mod != 3)
13643
    {
13644
      if (vex.register_specifier != 0)
13645
        BadOp ();
13646
      need_vex_reg = 0;
13647
    }
13648
  OP_EX (bytemode, sizeflag);
13649
}
13650
 
13651
static void
13652
OP_XMM_Vex (int bytemode, int sizeflag)
13653
{
13654
  if (modrm.mod != 3)
13655
    {
13656
      if (vex.register_specifier != 0)
13657
        BadOp ();
13658
      need_vex_reg = 0;
13659
    }
13660
  OP_XMM (bytemode, sizeflag);
13661
}
13662
 
13663
static void
13664
VZERO_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13665
{
13666
  switch (vex.length)
13667
    {
13668
    case 128:
13669
      strcpy (obuf, "vzeroupper");
13670
      break;
13671
    case 256:
13672
      strcpy (obuf, "vzeroall");
13673
      break;
13674
    default:
13675
      abort ();
13676
    }
13677
}
13678
 
13679
static const char *vex_cmp_op[] = {
13680
  "eq",
13681
  "lt",
13682
  "le",
13683
  "unord",
13684
  "neq",
13685
  "nlt",
13686
  "nle",
13687
  "ord",
13688
  "eq_uq",
13689
  "nge",
13690
  "ngt",
13691
  "false",
13692
  "neq_oq",
13693
  "ge",
13694
  "gt",
13695
  "true",
13696
  "eq_os",
13697
  "lt_oq",
13698
  "le_oq",
13699
  "unord_s",
13700
  "neq_us",
13701
  "nlt_uq",
13702
  "nle_uq",
13703
  "ord_s",
13704
  "eq_us",
13705
  "nge_uq",
13706
  "ngt_uq",
13707
  "false_os",
13708
  "neq_os",
13709
  "ge_oq",
13710
  "gt_oq",
13711
  "true_us"
13712
};
13713
 
13714
static void
13715
VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13716
{
13717
  unsigned int cmp_type;
13718
 
13719
  FETCH_DATA (the_info, codep + 1);
13720
  cmp_type = *codep++ & 0xff;
13721
  if (cmp_type < ARRAY_SIZE (vex_cmp_op))
13722
    {
13723
      char suffix [3];
13724
      char *p = obuf + strlen (obuf) - 2;
13725
      suffix[0] = p[0];
13726
      suffix[1] = p[1];
13727
      suffix[2] = '\0';
13728
      sprintf (p, "%s%s", vex_cmp_op[cmp_type], suffix);
13729
    }
13730
  else
13731
    {
13732
      /* We have a reserved extension byte.  Output it directly.  */
13733
      scratchbuf[0] = '$';
13734
      print_operand_value (scratchbuf + 1, 1, cmp_type);
13735
      oappend (scratchbuf + intel_syntax);
13736
      scratchbuf[0] = '\0';
13737
    }
13738
}
13739
 
13740
static const char *pclmul_op[] = {
13741
  "lql",
13742
  "hql",
13743
  "lqh",
13744
  "hqh"
13745
};
13746
 
13747
static void
13748
PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
13749
              int sizeflag ATTRIBUTE_UNUSED)
13750
{
13751
  unsigned int pclmul_type;
13752
 
13753
  FETCH_DATA (the_info, codep + 1);
13754
  pclmul_type = *codep++ & 0xff;
13755
  switch (pclmul_type)
13756
    {
13757
    case 0x10:
13758
      pclmul_type = 2;
13759
      break;
13760
    case 0x11:
13761
      pclmul_type = 3;
13762
      break;
13763
    default:
13764
      break;
13765
    }
13766
  if (pclmul_type < ARRAY_SIZE (pclmul_op))
13767
    {
13768
      char suffix [4];
13769
      char *p = obuf + strlen (obuf) - 3;
13770
      suffix[0] = p[0];
13771
      suffix[1] = p[1];
13772
      suffix[2] = p[2];
13773
      suffix[3] = '\0';
13774
      sprintf (p, "%s%s", pclmul_op[pclmul_type], suffix);
13775
    }
13776
  else
13777
    {
13778
      /* We have a reserved extension byte.  Output it directly.  */
13779
      scratchbuf[0] = '$';
13780
      print_operand_value (scratchbuf + 1, 1, pclmul_type);
13781
      oappend (scratchbuf + intel_syntax);
13782
      scratchbuf[0] = '\0';
13783
    }
13784
}
13785
 
13786
static const char *vpermil2_op[] = {
13787
  "td",
13788
  "td",
13789
  "mo",
13790
  "mz"
13791
};
13792
 
13793
static void
13794
VPERMIL2_Fixup (int bytemode ATTRIBUTE_UNUSED,
13795
                int sizeflag ATTRIBUTE_UNUSED)
13796
{
13797
  unsigned int vpermil2_type;
13798
 
13799
  FETCH_DATA (the_info, codep + 1);
13800
  vpermil2_type = *codep++ & 0xf;
13801
  if (vpermil2_type < ARRAY_SIZE (vpermil2_op))
13802
    {
13803
      char suffix [4];
13804
      char *p = obuf + strlen (obuf) - 3;
13805
      suffix[0] = p[0];
13806
      suffix[1] = p[1];
13807
      suffix[2] = p[2];
13808
      suffix[3] = '\0';
13809
      sprintf (p, "%s%s", vpermil2_op[vpermil2_type], suffix);
13810
    }
13811
  else
13812
    {
13813
      /* We have a reserved extension byte.  Output it directly.  */
13814
      scratchbuf[0] = '$';
13815
      print_operand_value (scratchbuf + 1, 1, vpermil2_type);
13816
      oappend (scratchbuf + intel_syntax);
13817
      scratchbuf[0] = '\0';
13818
    }
13819
}
13820
 
13821
static void
13822
MOVBE_Fixup (int bytemode, int sizeflag)
13823
{
13824
  /* Add proper suffix to "movbe".  */
13825
  char *p = obuf + strlen (obuf);
13826
 
13827
  switch (bytemode)
13828
    {
13829
    case v_mode:
13830
      if (intel_syntax)
13831
        break;
13832
 
13833
      USED_REX (REX_W);
13834
      if (sizeflag & SUFFIX_ALWAYS)
13835
        {
13836
          if (rex & REX_W)
13837
            *p++ = 'q';
13838
          else if (sizeflag & DFLAG)
13839
            *p++ = 'l';
13840
          else
13841
            *p++ = 'w';
13842
        }
13843
      used_prefixes |= (prefixes & PREFIX_DATA);
13844
      break;
13845
    default:
13846
      oappend (INTERNAL_DISASSEMBLER_ERROR);
13847
      break;
13848
    }
13849
  *p = '\0';
13850
 
13851
  OP_M (bytemode, sizeflag);
13852
}

powered by: WebSVN 2.1.0

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