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

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [opcodes/] [i386-dis.c] - Blame information for rev 174

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

Line No. Rev Author Line
1 18 khays
/* 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, 2009, 2010, 2011
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 print_insn (bfd_vma, disassemble_info *);
46
static void dofloat (int);
47
static void OP_ST (int, int);
48
static void OP_STi (int, int);
49
static int putop (const char *, int);
50
static void oappend (const char *);
51
static void append_seg (void);
52
static void OP_indirE (int, int);
53
static void print_operand_value (char *, int, bfd_vma);
54
static void OP_E_register (int, int);
55
static void OP_E_memory (int, int);
56
static void print_displacement (char *, bfd_vma);
57
static void OP_E (int, int);
58
static void OP_G (int, int);
59
static bfd_vma get64 (void);
60
static bfd_signed_vma get32 (void);
61
static bfd_signed_vma get32s (void);
62
static int get16 (void);
63
static void set_op (bfd_vma, int);
64
static void OP_Skip_MODRM (int, int);
65
static void OP_REG (int, int);
66
static void OP_IMREG (int, int);
67
static void OP_I (int, int);
68
static void OP_I64 (int, int);
69
static void OP_sI (int, int);
70
static void OP_J (int, int);
71
static void OP_SEG (int, int);
72
static void OP_DIR (int, int);
73
static void OP_OFF (int, int);
74
static void OP_OFF64 (int, int);
75
static void ptr_reg (int, int);
76
static void OP_ESreg (int, int);
77
static void OP_DSreg (int, int);
78
static void OP_C (int, int);
79
static void OP_D (int, int);
80
static void OP_T (int, int);
81
static void OP_R (int, int);
82
static void OP_MMX (int, int);
83
static void OP_XMM (int, int);
84
static void OP_EM (int, int);
85
static void OP_EX (int, int);
86
static void OP_EMC (int,int);
87
static void OP_MXC (int,int);
88
static void OP_MS (int, int);
89
static void OP_XS (int, int);
90
static void OP_M (int, int);
91
static void OP_VEX (int, int);
92
static void OP_EX_Vex (int, int);
93
static void OP_EX_VexW (int, int);
94
static void OP_EX_VexImmW (int, int);
95
static void OP_XMM_Vex (int, int);
96
static void OP_XMM_VexW (int, int);
97
static void OP_REG_VexI4 (int, int);
98
static void PCLMUL_Fixup (int, int);
99
static void VEXI4_Fixup (int, int);
100
static void VZERO_Fixup (int, int);
101
static void VCMP_Fixup (int, int);
102
static void OP_0f07 (int, int);
103
static void OP_Monitor (int, int);
104
static void OP_Mwait (int, int);
105
static void NOP_Fixup1 (int, int);
106
static void NOP_Fixup2 (int, int);
107
static void OP_3DNowSuffix (int, int);
108
static void CMP_Fixup (int, int);
109
static void BadOp (void);
110
static void REP_Fixup (int, int);
111 166 khays
static void HLE_Fixup1 (int, int);
112
static void HLE_Fixup2 (int, int);
113
static void HLE_Fixup3 (int, int);
114 18 khays
static void CMPXCHG8B_Fixup (int, int);
115
static void XMM_Fixup (int, int);
116
static void CRC32_Fixup (int, int);
117
static void FXSAVE_Fixup (int, int);
118
static void OP_LWPCB_E (int, int);
119
static void OP_LWP_E (int, int);
120
static void OP_Vex_2src_1 (int, int);
121
static void OP_Vex_2src_2 (int, int);
122
 
123
static void MOVBE_Fixup (int, int);
124
 
125
struct dis_private {
126
  /* Points to first byte not fetched.  */
127
  bfd_byte *max_fetched;
128
  bfd_byte the_buffer[MAX_MNEM_SIZE];
129
  bfd_vma insn_start;
130
  int orig_sizeflag;
131
  jmp_buf bailout;
132
};
133
 
134
enum address_mode
135
{
136
  mode_16bit,
137
  mode_32bit,
138
  mode_64bit
139
};
140
 
141
enum address_mode address_mode;
142
 
143
/* Flags for the prefixes for the current instruction.  See below.  */
144
static int prefixes;
145
 
146
/* REX prefix the current instruction.  See below.  */
147
static int rex;
148
/* Bits of REX we've already used.  */
149
static int rex_used;
150
/* REX bits in original REX prefix ignored.  */
151
static int rex_ignored;
152
/* Mark parts used in the REX prefix.  When we are testing for
153
   empty prefix (for 8bit register REX extension), just mask it
154
   out.  Otherwise test for REX bit is excuse for existence of REX
155
   only in case value is nonzero.  */
156
#define USED_REX(value)                                 \
157
  {                                                     \
158
    if (value)                                          \
159
      {                                                 \
160
        if ((rex & value))                              \
161
          rex_used |= (value) | REX_OPCODE;             \
162
      }                                                 \
163
    else                                                \
164
      rex_used |= REX_OPCODE;                           \
165
  }
166
 
167
/* Flags for prefixes which we somehow handled when printing the
168
   current instruction.  */
169
static int used_prefixes;
170
 
171
/* Flags stored in PREFIXES.  */
172
#define PREFIX_REPZ 1
173
#define PREFIX_REPNZ 2
174
#define PREFIX_LOCK 4
175
#define PREFIX_CS 8
176
#define PREFIX_SS 0x10
177
#define PREFIX_DS 0x20
178
#define PREFIX_ES 0x40
179
#define PREFIX_FS 0x80
180
#define PREFIX_GS 0x100
181
#define PREFIX_DATA 0x200
182
#define PREFIX_ADDR 0x400
183
#define PREFIX_FWAIT 0x800
184
 
185
/* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
186
   to ADDR (exclusive) are valid.  Returns 1 for success, longjmps
187
   on error.  */
188
#define FETCH_DATA(info, addr) \
189
  ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
190
   ? 1 : fetch_data ((info), (addr)))
191
 
192
static int
193
fetch_data (struct disassemble_info *info, bfd_byte *addr)
194
{
195
  int status;
196
  struct dis_private *priv = (struct dis_private *) info->private_data;
197
  bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
198
 
199
  if (addr <= priv->the_buffer + MAX_MNEM_SIZE)
200
    status = (*info->read_memory_func) (start,
201
                                        priv->max_fetched,
202
                                        addr - priv->max_fetched,
203
                                        info);
204
  else
205
    status = -1;
206
  if (status != 0)
207
    {
208
      /* If we did manage to read at least one byte, then
209
         print_insn_i386 will do something sensible.  Otherwise, print
210
         an error.  We do that here because this is where we know
211
         STATUS.  */
212
      if (priv->max_fetched == priv->the_buffer)
213
        (*info->memory_error_func) (status, start, info);
214
      longjmp (priv->bailout, 1);
215
    }
216
  else
217
    priv->max_fetched = addr;
218
  return 1;
219
}
220
 
221
#define XX { NULL, 0 }
222
#define Bad_Opcode NULL, { { NULL, 0 } }
223
 
224
#define Eb { OP_E, b_mode }
225
#define EbS { OP_E, b_swap_mode }
226
#define Ev { OP_E, v_mode }
227
#define EvS { OP_E, v_swap_mode }
228
#define Ed { OP_E, d_mode }
229
#define Edq { OP_E, dq_mode }
230
#define Edqw { OP_E, dqw_mode }
231
#define Edqb { OP_E, dqb_mode }
232
#define Edqd { OP_E, dqd_mode }
233
#define Eq { OP_E, q_mode }
234
#define indirEv { OP_indirE, stack_v_mode }
235
#define indirEp { OP_indirE, f_mode }
236
#define stackEv { OP_E, stack_v_mode }
237
#define Em { OP_E, m_mode }
238
#define Ew { OP_E, w_mode }
239
#define M { OP_M, 0 }           /* lea, lgdt, etc. */
240
#define Ma { OP_M, a_mode }
241
#define Mb { OP_M, b_mode }
242
#define Md { OP_M, d_mode }
243
#define Mo { OP_M, o_mode }
244
#define Mp { OP_M, f_mode }             /* 32 or 48 bit memory operand for LDS, LES etc */
245
#define Mq { OP_M, q_mode }
246
#define Mx { OP_M, x_mode }
247
#define Mxmm { OP_M, xmm_mode }
248
#define Gb { OP_G, b_mode }
249
#define Gv { OP_G, v_mode }
250
#define Gd { OP_G, d_mode }
251
#define Gdq { OP_G, dq_mode }
252
#define Gm { OP_G, m_mode }
253
#define Gw { OP_G, w_mode }
254
#define Rd { OP_R, d_mode }
255
#define Rm { OP_R, m_mode }
256
#define Ib { OP_I, b_mode }
257
#define sIb { OP_sI, b_mode }   /* sign extened byte */
258
#define sIbT { OP_sI, b_T_mode } /* sign extened byte like 'T' */
259
#define Iv { OP_I, v_mode }
260
#define sIv { OP_sI, v_mode } 
261
#define Iq { OP_I, q_mode }
262
#define Iv64 { OP_I64, v_mode }
263
#define Iw { OP_I, w_mode }
264
#define I1 { OP_I, const_1_mode }
265
#define Jb { OP_J, b_mode }
266
#define Jv { OP_J, v_mode }
267
#define Cm { OP_C, m_mode }
268
#define Dm { OP_D, m_mode }
269
#define Td { OP_T, d_mode }
270
#define Skip_MODRM { OP_Skip_MODRM, 0 }
271
 
272
#define RMeAX { OP_REG, eAX_reg }
273
#define RMeBX { OP_REG, eBX_reg }
274
#define RMeCX { OP_REG, eCX_reg }
275
#define RMeDX { OP_REG, eDX_reg }
276
#define RMeSP { OP_REG, eSP_reg }
277
#define RMeBP { OP_REG, eBP_reg }
278
#define RMeSI { OP_REG, eSI_reg }
279
#define RMeDI { OP_REG, eDI_reg }
280
#define RMrAX { OP_REG, rAX_reg }
281
#define RMrBX { OP_REG, rBX_reg }
282
#define RMrCX { OP_REG, rCX_reg }
283
#define RMrDX { OP_REG, rDX_reg }
284
#define RMrSP { OP_REG, rSP_reg }
285
#define RMrBP { OP_REG, rBP_reg }
286
#define RMrSI { OP_REG, rSI_reg }
287
#define RMrDI { OP_REG, rDI_reg }
288
#define RMAL { OP_REG, al_reg }
289
#define RMCL { OP_REG, cl_reg }
290
#define RMDL { OP_REG, dl_reg }
291
#define RMBL { OP_REG, bl_reg }
292
#define RMAH { OP_REG, ah_reg }
293
#define RMCH { OP_REG, ch_reg }
294
#define RMDH { OP_REG, dh_reg }
295
#define RMBH { OP_REG, bh_reg }
296
#define RMAX { OP_REG, ax_reg }
297
#define RMDX { OP_REG, dx_reg }
298
 
299
#define eAX { OP_IMREG, eAX_reg }
300
#define eBX { OP_IMREG, eBX_reg }
301
#define eCX { OP_IMREG, eCX_reg }
302
#define eDX { OP_IMREG, eDX_reg }
303
#define eSP { OP_IMREG, eSP_reg }
304
#define eBP { OP_IMREG, eBP_reg }
305
#define eSI { OP_IMREG, eSI_reg }
306
#define eDI { OP_IMREG, eDI_reg }
307
#define AL { OP_IMREG, al_reg }
308
#define CL { OP_IMREG, cl_reg }
309
#define DL { OP_IMREG, dl_reg }
310
#define BL { OP_IMREG, bl_reg }
311
#define AH { OP_IMREG, ah_reg }
312
#define CH { OP_IMREG, ch_reg }
313
#define DH { OP_IMREG, dh_reg }
314
#define BH { OP_IMREG, bh_reg }
315
#define AX { OP_IMREG, ax_reg }
316
#define DX { OP_IMREG, dx_reg }
317
#define zAX { OP_IMREG, z_mode_ax_reg }
318
#define indirDX { OP_IMREG, indir_dx_reg }
319
 
320
#define Sw { OP_SEG, w_mode }
321
#define Sv { OP_SEG, v_mode }
322
#define Ap { OP_DIR, 0 }
323
#define Ob { OP_OFF64, b_mode }
324
#define Ov { OP_OFF64, v_mode }
325
#define Xb { OP_DSreg, eSI_reg }
326
#define Xv { OP_DSreg, eSI_reg }
327
#define Xz { OP_DSreg, eSI_reg }
328
#define Yb { OP_ESreg, eDI_reg }
329
#define Yv { OP_ESreg, eDI_reg }
330
#define DSBX { OP_DSreg, eBX_reg }
331
 
332
#define es { OP_REG, es_reg }
333
#define ss { OP_REG, ss_reg }
334
#define cs { OP_REG, cs_reg }
335
#define ds { OP_REG, ds_reg }
336
#define fs { OP_REG, fs_reg }
337
#define gs { OP_REG, gs_reg }
338
 
339
#define MX { OP_MMX, 0 }
340
#define XM { OP_XMM, 0 }
341
#define XMScalar { OP_XMM, scalar_mode }
342 148 khays
#define XMGatherQ { OP_XMM, vex_vsib_q_w_dq_mode }
343 18 khays
#define XMM { OP_XMM, xmm_mode }
344
#define EM { OP_EM, v_mode }
345
#define EMS { OP_EM, v_swap_mode }
346
#define EMd { OP_EM, d_mode }
347
#define EMx { OP_EM, x_mode }
348
#define EXw { OP_EX, w_mode }
349
#define EXd { OP_EX, d_mode }
350
#define EXdScalar { OP_EX, d_scalar_mode }
351
#define EXdS { OP_EX, d_swap_mode }
352
#define EXq { OP_EX, q_mode }
353
#define EXqScalar { OP_EX, q_scalar_mode }
354
#define EXqScalarS { OP_EX, q_scalar_swap_mode }
355
#define EXqS { OP_EX, q_swap_mode }
356
#define EXx { OP_EX, x_mode }
357
#define EXxS { OP_EX, x_swap_mode }
358
#define EXxmm { OP_EX, xmm_mode }
359
#define EXxmmq { OP_EX, xmmq_mode }
360 148 khays
#define EXxmm_mb { OP_EX, xmm_mb_mode }
361
#define EXxmm_mw { OP_EX, xmm_mw_mode }
362
#define EXxmm_md { OP_EX, xmm_md_mode }
363
#define EXxmm_mq { OP_EX, xmm_mq_mode }
364
#define EXxmmdw { OP_EX, xmmdw_mode }
365
#define EXxmmqd { OP_EX, xmmqd_mode }
366 18 khays
#define EXymmq { OP_EX, ymmq_mode }
367
#define EXVexWdq { OP_EX, vex_w_dq_mode }
368
#define EXVexWdqScalar { OP_EX, vex_scalar_w_dq_mode }
369
#define MS { OP_MS, v_mode }
370
#define XS { OP_XS, v_mode }
371
#define EMCq { OP_EMC, q_mode }
372
#define MXC { OP_MXC, 0 }
373
#define OPSUF { OP_3DNowSuffix, 0 }
374
#define CMP { CMP_Fixup, 0 }
375
#define XMM0 { XMM_Fixup, 0 }
376
#define FXSAVE { FXSAVE_Fixup, 0 }
377
#define Vex_2src_1 { OP_Vex_2src_1, 0 }
378
#define Vex_2src_2 { OP_Vex_2src_2, 0 }
379
 
380
#define Vex { OP_VEX, vex_mode }
381
#define VexScalar { OP_VEX, vex_scalar_mode }
382 148 khays
#define VexGatherQ { OP_VEX, vex_vsib_q_w_dq_mode }
383 18 khays
#define Vex128 { OP_VEX, vex128_mode }
384
#define Vex256 { OP_VEX, vex256_mode }
385
#define VexGdq { OP_VEX, dq_mode }
386
#define VexI4 { VEXI4_Fixup, 0}
387
#define EXdVex { OP_EX_Vex, d_mode }
388
#define EXdVexS { OP_EX_Vex, d_swap_mode }
389
#define EXdVexScalarS { OP_EX_Vex, d_scalar_swap_mode }
390
#define EXqVex { OP_EX_Vex, q_mode }
391
#define EXqVexS { OP_EX_Vex, q_swap_mode }
392
#define EXqVexScalarS { OP_EX_Vex, q_scalar_swap_mode }
393
#define EXVexW { OP_EX_VexW, x_mode }
394
#define EXdVexW { OP_EX_VexW, d_mode }
395
#define EXqVexW { OP_EX_VexW, q_mode }
396
#define EXVexImmW { OP_EX_VexImmW, x_mode }
397
#define XMVex { OP_XMM_Vex, 0 }
398
#define XMVexScalar { OP_XMM_Vex, scalar_mode }
399
#define XMVexW { OP_XMM_VexW, 0 }
400
#define XMVexI4 { OP_REG_VexI4, x_mode }
401
#define PCLMUL { PCLMUL_Fixup, 0 }
402
#define VZERO { VZERO_Fixup, 0 }
403
#define VCMP { VCMP_Fixup, 0 }
404
 
405 148 khays
#define MVexVSIBDWpX { OP_M, vex_vsib_d_w_dq_mode }
406
#define MVexVSIBQWpX { OP_M, vex_vsib_q_w_dq_mode }
407
 
408 18 khays
/* Used handle "rep" prefix for string instructions.  */
409
#define Xbr { REP_Fixup, eSI_reg }
410
#define Xvr { REP_Fixup, eSI_reg }
411
#define Ybr { REP_Fixup, eDI_reg }
412
#define Yvr { REP_Fixup, eDI_reg }
413
#define Yzr { REP_Fixup, eDI_reg }
414
#define indirDXr { REP_Fixup, indir_dx_reg }
415
#define ALr { REP_Fixup, al_reg }
416
#define eAXr { REP_Fixup, eAX_reg }
417
 
418 166 khays
/* Used handle HLE prefix for lockable instructions.  */
419
#define Ebh1 { HLE_Fixup1, b_mode }
420
#define Evh1 { HLE_Fixup1, v_mode }
421
#define Ebh2 { HLE_Fixup2, b_mode }
422
#define Evh2 { HLE_Fixup2, v_mode }
423
#define Ebh3 { HLE_Fixup3, b_mode }
424
#define Evh3 { HLE_Fixup3, v_mode }
425
 
426 18 khays
#define cond_jump_flag { NULL, cond_jump_mode }
427
#define loop_jcxz_flag { NULL, loop_jcxz_mode }
428
 
429
/* bits in sizeflag */
430
#define SUFFIX_ALWAYS 4
431
#define AFLAG 2
432
#define DFLAG 1
433
 
434
enum
435
{
436
  /* byte operand */
437
  b_mode = 1,
438
  /* byte operand with operand swapped */
439
  b_swap_mode,
440
  /* byte operand, sign extend like 'T' suffix */
441
  b_T_mode,
442
  /* operand size depends on prefixes */
443
  v_mode,
444
  /* operand size depends on prefixes with operand swapped */
445
  v_swap_mode,
446
  /* word operand */
447
  w_mode,
448
  /* double word operand  */
449
  d_mode,
450
  /* double word operand with operand swapped */
451
  d_swap_mode,
452
  /* quad word operand */
453
  q_mode,
454
  /* quad word operand with operand swapped */
455
  q_swap_mode,
456
  /* ten-byte operand */
457
  t_mode,
458
  /* 16-byte XMM or 32-byte YMM operand */
459
  x_mode,
460
  /* 16-byte XMM or 32-byte YMM operand with operand swapped */
461
  x_swap_mode,
462
  /* 16-byte XMM operand */
463
  xmm_mode,
464
  /* 16-byte XMM or quad word operand */
465
  xmmq_mode,
466 148 khays
  /* XMM register or byte memory operand */
467
  xmm_mb_mode,
468
  /* XMM register or word memory operand */
469
  xmm_mw_mode,
470
  /* XMM register or double word memory operand */
471
  xmm_md_mode,
472
  /* XMM register or quad word memory operand */
473
  xmm_mq_mode,
474
  /* 16-byte XMM, word or double word operand  */
475
  xmmdw_mode,
476
  /* 16-byte XMM, double word or quad word operand */
477
  xmmqd_mode,
478 18 khays
  /* 32-byte YMM or quad word operand */
479
  ymmq_mode,
480 148 khays
  /* 32-byte YMM or 16-byte word operand */
481
  ymmxmm_mode,
482 18 khays
  /* d_mode in 32bit, q_mode in 64bit mode.  */
483
  m_mode,
484
  /* pair of v_mode operands */
485
  a_mode,
486
  cond_jump_mode,
487
  loop_jcxz_mode,
488
  /* operand size depends on REX prefixes.  */
489
  dq_mode,
490
  /* registers like dq_mode, memory like w_mode.  */
491
  dqw_mode,
492
  /* 4- or 6-byte pointer operand */
493
  f_mode,
494
  const_1_mode,
495
  /* v_mode for stack-related opcodes.  */
496
  stack_v_mode,
497
  /* non-quad operand size depends on prefixes */
498
  z_mode,
499
  /* 16-byte operand */
500
  o_mode,
501
  /* registers like dq_mode, memory like b_mode.  */
502
  dqb_mode,
503
  /* registers like dq_mode, memory like d_mode.  */
504
  dqd_mode,
505
  /* normal vex mode */
506
  vex_mode,
507
  /* 128bit vex mode */
508
  vex128_mode,
509
  /* 256bit vex mode */
510
  vex256_mode,
511
  /* operand size depends on the VEX.W bit.  */
512
  vex_w_dq_mode,
513
 
514 148 khays
  /* Similar to vex_w_dq_mode, with VSIB dword indices.  */
515
  vex_vsib_d_w_dq_mode,
516
  /* Similar to vex_w_dq_mode, with VSIB qword indices.  */
517
  vex_vsib_q_w_dq_mode,
518
 
519 18 khays
  /* scalar, ignore vector length.  */
520
  scalar_mode,
521
  /* like d_mode, ignore vector length.  */
522
  d_scalar_mode,
523
  /* like d_swap_mode, ignore vector length.  */
524
  d_scalar_swap_mode,
525
  /* like q_mode, ignore vector length.  */
526
  q_scalar_mode,
527
  /* like q_swap_mode, ignore vector length.  */
528
  q_scalar_swap_mode,
529
  /* like vex_mode, ignore vector length.  */
530
  vex_scalar_mode,
531
  /* like vex_w_dq_mode, ignore vector length.  */
532
  vex_scalar_w_dq_mode,
533
 
534
  es_reg,
535
  cs_reg,
536
  ss_reg,
537
  ds_reg,
538
  fs_reg,
539
  gs_reg,
540
 
541
  eAX_reg,
542
  eCX_reg,
543
  eDX_reg,
544
  eBX_reg,
545
  eSP_reg,
546
  eBP_reg,
547
  eSI_reg,
548
  eDI_reg,
549
 
550
  al_reg,
551
  cl_reg,
552
  dl_reg,
553
  bl_reg,
554
  ah_reg,
555
  ch_reg,
556
  dh_reg,
557
  bh_reg,
558
 
559
  ax_reg,
560
  cx_reg,
561
  dx_reg,
562
  bx_reg,
563
  sp_reg,
564
  bp_reg,
565
  si_reg,
566
  di_reg,
567
 
568
  rAX_reg,
569
  rCX_reg,
570
  rDX_reg,
571
  rBX_reg,
572
  rSP_reg,
573
  rBP_reg,
574
  rSI_reg,
575
  rDI_reg,
576
 
577
  z_mode_ax_reg,
578
  indir_dx_reg
579
};
580
 
581
enum
582
{
583
  FLOATCODE = 1,
584
  USE_REG_TABLE,
585
  USE_MOD_TABLE,
586
  USE_RM_TABLE,
587
  USE_PREFIX_TABLE,
588
  USE_X86_64_TABLE,
589
  USE_3BYTE_TABLE,
590
  USE_XOP_8F_TABLE,
591
  USE_VEX_C4_TABLE,
592
  USE_VEX_C5_TABLE,
593
  USE_VEX_LEN_TABLE,
594
  USE_VEX_W_TABLE
595
};
596
 
597
#define FLOAT                   NULL, { { NULL, FLOATCODE } }
598
 
599
#define DIS386(T, I)            NULL, { { NULL, (T)}, { NULL,  (I) } }
600
#define REG_TABLE(I)            DIS386 (USE_REG_TABLE, (I))
601
#define MOD_TABLE(I)            DIS386 (USE_MOD_TABLE, (I))
602
#define RM_TABLE(I)             DIS386 (USE_RM_TABLE, (I))
603
#define PREFIX_TABLE(I)         DIS386 (USE_PREFIX_TABLE, (I))
604
#define X86_64_TABLE(I)         DIS386 (USE_X86_64_TABLE, (I))
605
#define THREE_BYTE_TABLE(I)     DIS386 (USE_3BYTE_TABLE, (I))
606
#define XOP_8F_TABLE(I)         DIS386 (USE_XOP_8F_TABLE, (I))
607
#define VEX_C4_TABLE(I)         DIS386 (USE_VEX_C4_TABLE, (I))
608
#define VEX_C5_TABLE(I)         DIS386 (USE_VEX_C5_TABLE, (I))
609
#define VEX_LEN_TABLE(I)        DIS386 (USE_VEX_LEN_TABLE, (I))
610
#define VEX_W_TABLE(I)          DIS386 (USE_VEX_W_TABLE, (I))
611
 
612
enum
613
{
614
  REG_80 = 0,
615
  REG_81,
616
  REG_82,
617
  REG_8F,
618
  REG_C0,
619
  REG_C1,
620
  REG_C6,
621
  REG_C7,
622
  REG_D0,
623
  REG_D1,
624
  REG_D2,
625
  REG_D3,
626
  REG_F6,
627
  REG_F7,
628
  REG_FE,
629
  REG_FF,
630
  REG_0F00,
631
  REG_0F01,
632
  REG_0F0D,
633
  REG_0F18,
634
  REG_0F71,
635
  REG_0F72,
636
  REG_0F73,
637
  REG_0FA6,
638
  REG_0FA7,
639
  REG_0FAE,
640
  REG_0FBA,
641
  REG_0FC7,
642
  REG_VEX_0F71,
643
  REG_VEX_0F72,
644
  REG_VEX_0F73,
645
  REG_VEX_0FAE,
646
  REG_VEX_0F38F3,
647
  REG_XOP_LWPCB,
648
  REG_XOP_LWP,
649
  REG_XOP_TBM_01,
650
  REG_XOP_TBM_02
651
};
652
 
653
enum
654
{
655
  MOD_8D = 0,
656 166 khays
  MOD_C6_REG_7,
657
  MOD_C7_REG_7,
658 18 khays
  MOD_0F01_REG_0,
659
  MOD_0F01_REG_1,
660
  MOD_0F01_REG_2,
661
  MOD_0F01_REG_3,
662
  MOD_0F01_REG_7,
663
  MOD_0F12_PREFIX_0,
664
  MOD_0F13,
665
  MOD_0F16_PREFIX_0,
666
  MOD_0F17,
667
  MOD_0F18_REG_0,
668
  MOD_0F18_REG_1,
669
  MOD_0F18_REG_2,
670
  MOD_0F18_REG_3,
671
  MOD_0F20,
672
  MOD_0F21,
673
  MOD_0F22,
674
  MOD_0F23,
675
  MOD_0F24,
676
  MOD_0F26,
677
  MOD_0F2B_PREFIX_0,
678
  MOD_0F2B_PREFIX_1,
679
  MOD_0F2B_PREFIX_2,
680
  MOD_0F2B_PREFIX_3,
681
  MOD_0F51,
682
  MOD_0F71_REG_2,
683
  MOD_0F71_REG_4,
684
  MOD_0F71_REG_6,
685
  MOD_0F72_REG_2,
686
  MOD_0F72_REG_4,
687
  MOD_0F72_REG_6,
688
  MOD_0F73_REG_2,
689
  MOD_0F73_REG_3,
690
  MOD_0F73_REG_6,
691
  MOD_0F73_REG_7,
692
  MOD_0FAE_REG_0,
693
  MOD_0FAE_REG_1,
694
  MOD_0FAE_REG_2,
695
  MOD_0FAE_REG_3,
696
  MOD_0FAE_REG_4,
697
  MOD_0FAE_REG_5,
698
  MOD_0FAE_REG_6,
699
  MOD_0FAE_REG_7,
700
  MOD_0FB2,
701
  MOD_0FB4,
702
  MOD_0FB5,
703
  MOD_0FC7_REG_6,
704
  MOD_0FC7_REG_7,
705
  MOD_0FD7,
706
  MOD_0FE7_PREFIX_2,
707
  MOD_0FF0_PREFIX_3,
708
  MOD_0F382A_PREFIX_2,
709
  MOD_62_32BIT,
710
  MOD_C4_32BIT,
711
  MOD_C5_32BIT,
712
  MOD_VEX_0F12_PREFIX_0,
713
  MOD_VEX_0F13,
714
  MOD_VEX_0F16_PREFIX_0,
715
  MOD_VEX_0F17,
716
  MOD_VEX_0F2B,
717
  MOD_VEX_0F50,
718
  MOD_VEX_0F71_REG_2,
719
  MOD_VEX_0F71_REG_4,
720
  MOD_VEX_0F71_REG_6,
721
  MOD_VEX_0F72_REG_2,
722
  MOD_VEX_0F72_REG_4,
723
  MOD_VEX_0F72_REG_6,
724
  MOD_VEX_0F73_REG_2,
725
  MOD_VEX_0F73_REG_3,
726
  MOD_VEX_0F73_REG_6,
727
  MOD_VEX_0F73_REG_7,
728
  MOD_VEX_0FAE_REG_2,
729
  MOD_VEX_0FAE_REG_3,
730
  MOD_VEX_0FD7_PREFIX_2,
731
  MOD_VEX_0FE7_PREFIX_2,
732
  MOD_VEX_0FF0_PREFIX_3,
733
  MOD_VEX_0F381A_PREFIX_2,
734
  MOD_VEX_0F382A_PREFIX_2,
735
  MOD_VEX_0F382C_PREFIX_2,
736
  MOD_VEX_0F382D_PREFIX_2,
737
  MOD_VEX_0F382E_PREFIX_2,
738 148 khays
  MOD_VEX_0F382F_PREFIX_2,
739
  MOD_VEX_0F385A_PREFIX_2,
740
  MOD_VEX_0F388C_PREFIX_2,
741
  MOD_VEX_0F388E_PREFIX_2,
742 18 khays
};
743
 
744
enum
745
{
746 166 khays
  RM_C6_REG_7 = 0,
747
  RM_C7_REG_7,
748
  RM_0F01_REG_0,
749 18 khays
  RM_0F01_REG_1,
750
  RM_0F01_REG_2,
751
  RM_0F01_REG_3,
752
  RM_0F01_REG_7,
753
  RM_0FAE_REG_5,
754
  RM_0FAE_REG_6,
755
  RM_0FAE_REG_7
756
};
757
 
758
enum
759
{
760
  PREFIX_90 = 0,
761
  PREFIX_0F10,
762
  PREFIX_0F11,
763
  PREFIX_0F12,
764
  PREFIX_0F16,
765
  PREFIX_0F2A,
766
  PREFIX_0F2B,
767
  PREFIX_0F2C,
768
  PREFIX_0F2D,
769
  PREFIX_0F2E,
770
  PREFIX_0F2F,
771
  PREFIX_0F51,
772
  PREFIX_0F52,
773
  PREFIX_0F53,
774
  PREFIX_0F58,
775
  PREFIX_0F59,
776
  PREFIX_0F5A,
777
  PREFIX_0F5B,
778
  PREFIX_0F5C,
779
  PREFIX_0F5D,
780
  PREFIX_0F5E,
781
  PREFIX_0F5F,
782
  PREFIX_0F60,
783
  PREFIX_0F61,
784
  PREFIX_0F62,
785
  PREFIX_0F6C,
786
  PREFIX_0F6D,
787
  PREFIX_0F6F,
788
  PREFIX_0F70,
789
  PREFIX_0F73_REG_3,
790
  PREFIX_0F73_REG_7,
791
  PREFIX_0F78,
792
  PREFIX_0F79,
793
  PREFIX_0F7C,
794
  PREFIX_0F7D,
795
  PREFIX_0F7E,
796
  PREFIX_0F7F,
797
  PREFIX_0FAE_REG_0,
798
  PREFIX_0FAE_REG_1,
799
  PREFIX_0FAE_REG_2,
800
  PREFIX_0FAE_REG_3,
801
  PREFIX_0FB8,
802
  PREFIX_0FBC,
803
  PREFIX_0FBD,
804
  PREFIX_0FC2,
805
  PREFIX_0FC3,
806
  PREFIX_0FC7_REG_6,
807
  PREFIX_0FD0,
808
  PREFIX_0FD6,
809
  PREFIX_0FE6,
810
  PREFIX_0FE7,
811
  PREFIX_0FF0,
812
  PREFIX_0FF7,
813
  PREFIX_0F3810,
814
  PREFIX_0F3814,
815
  PREFIX_0F3815,
816
  PREFIX_0F3817,
817
  PREFIX_0F3820,
818
  PREFIX_0F3821,
819
  PREFIX_0F3822,
820
  PREFIX_0F3823,
821
  PREFIX_0F3824,
822
  PREFIX_0F3825,
823
  PREFIX_0F3828,
824
  PREFIX_0F3829,
825
  PREFIX_0F382A,
826
  PREFIX_0F382B,
827
  PREFIX_0F3830,
828
  PREFIX_0F3831,
829
  PREFIX_0F3832,
830
  PREFIX_0F3833,
831
  PREFIX_0F3834,
832
  PREFIX_0F3835,
833
  PREFIX_0F3837,
834
  PREFIX_0F3838,
835
  PREFIX_0F3839,
836
  PREFIX_0F383A,
837
  PREFIX_0F383B,
838
  PREFIX_0F383C,
839
  PREFIX_0F383D,
840
  PREFIX_0F383E,
841
  PREFIX_0F383F,
842
  PREFIX_0F3840,
843
  PREFIX_0F3841,
844
  PREFIX_0F3880,
845
  PREFIX_0F3881,
846 148 khays
  PREFIX_0F3882,
847 18 khays
  PREFIX_0F38DB,
848
  PREFIX_0F38DC,
849
  PREFIX_0F38DD,
850
  PREFIX_0F38DE,
851
  PREFIX_0F38DF,
852
  PREFIX_0F38F0,
853
  PREFIX_0F38F1,
854
  PREFIX_0F3A08,
855
  PREFIX_0F3A09,
856
  PREFIX_0F3A0A,
857
  PREFIX_0F3A0B,
858
  PREFIX_0F3A0C,
859
  PREFIX_0F3A0D,
860
  PREFIX_0F3A0E,
861
  PREFIX_0F3A14,
862
  PREFIX_0F3A15,
863
  PREFIX_0F3A16,
864
  PREFIX_0F3A17,
865
  PREFIX_0F3A20,
866
  PREFIX_0F3A21,
867
  PREFIX_0F3A22,
868
  PREFIX_0F3A40,
869
  PREFIX_0F3A41,
870
  PREFIX_0F3A42,
871
  PREFIX_0F3A44,
872
  PREFIX_0F3A60,
873
  PREFIX_0F3A61,
874
  PREFIX_0F3A62,
875
  PREFIX_0F3A63,
876
  PREFIX_0F3ADF,
877
  PREFIX_VEX_0F10,
878
  PREFIX_VEX_0F11,
879
  PREFIX_VEX_0F12,
880
  PREFIX_VEX_0F16,
881
  PREFIX_VEX_0F2A,
882
  PREFIX_VEX_0F2C,
883
  PREFIX_VEX_0F2D,
884
  PREFIX_VEX_0F2E,
885
  PREFIX_VEX_0F2F,
886
  PREFIX_VEX_0F51,
887
  PREFIX_VEX_0F52,
888
  PREFIX_VEX_0F53,
889
  PREFIX_VEX_0F58,
890
  PREFIX_VEX_0F59,
891
  PREFIX_VEX_0F5A,
892
  PREFIX_VEX_0F5B,
893
  PREFIX_VEX_0F5C,
894
  PREFIX_VEX_0F5D,
895
  PREFIX_VEX_0F5E,
896
  PREFIX_VEX_0F5F,
897
  PREFIX_VEX_0F60,
898
  PREFIX_VEX_0F61,
899
  PREFIX_VEX_0F62,
900
  PREFIX_VEX_0F63,
901
  PREFIX_VEX_0F64,
902
  PREFIX_VEX_0F65,
903
  PREFIX_VEX_0F66,
904
  PREFIX_VEX_0F67,
905
  PREFIX_VEX_0F68,
906
  PREFIX_VEX_0F69,
907
  PREFIX_VEX_0F6A,
908
  PREFIX_VEX_0F6B,
909
  PREFIX_VEX_0F6C,
910
  PREFIX_VEX_0F6D,
911
  PREFIX_VEX_0F6E,
912
  PREFIX_VEX_0F6F,
913
  PREFIX_VEX_0F70,
914
  PREFIX_VEX_0F71_REG_2,
915
  PREFIX_VEX_0F71_REG_4,
916
  PREFIX_VEX_0F71_REG_6,
917
  PREFIX_VEX_0F72_REG_2,
918
  PREFIX_VEX_0F72_REG_4,
919
  PREFIX_VEX_0F72_REG_6,
920
  PREFIX_VEX_0F73_REG_2,
921
  PREFIX_VEX_0F73_REG_3,
922
  PREFIX_VEX_0F73_REG_6,
923
  PREFIX_VEX_0F73_REG_7,
924
  PREFIX_VEX_0F74,
925
  PREFIX_VEX_0F75,
926
  PREFIX_VEX_0F76,
927
  PREFIX_VEX_0F77,
928
  PREFIX_VEX_0F7C,
929
  PREFIX_VEX_0F7D,
930
  PREFIX_VEX_0F7E,
931
  PREFIX_VEX_0F7F,
932
  PREFIX_VEX_0FC2,
933
  PREFIX_VEX_0FC4,
934
  PREFIX_VEX_0FC5,
935
  PREFIX_VEX_0FD0,
936
  PREFIX_VEX_0FD1,
937
  PREFIX_VEX_0FD2,
938
  PREFIX_VEX_0FD3,
939
  PREFIX_VEX_0FD4,
940
  PREFIX_VEX_0FD5,
941
  PREFIX_VEX_0FD6,
942
  PREFIX_VEX_0FD7,
943
  PREFIX_VEX_0FD8,
944
  PREFIX_VEX_0FD9,
945
  PREFIX_VEX_0FDA,
946
  PREFIX_VEX_0FDB,
947
  PREFIX_VEX_0FDC,
948
  PREFIX_VEX_0FDD,
949
  PREFIX_VEX_0FDE,
950
  PREFIX_VEX_0FDF,
951
  PREFIX_VEX_0FE0,
952
  PREFIX_VEX_0FE1,
953
  PREFIX_VEX_0FE2,
954
  PREFIX_VEX_0FE3,
955
  PREFIX_VEX_0FE4,
956
  PREFIX_VEX_0FE5,
957
  PREFIX_VEX_0FE6,
958
  PREFIX_VEX_0FE7,
959
  PREFIX_VEX_0FE8,
960
  PREFIX_VEX_0FE9,
961
  PREFIX_VEX_0FEA,
962
  PREFIX_VEX_0FEB,
963
  PREFIX_VEX_0FEC,
964
  PREFIX_VEX_0FED,
965
  PREFIX_VEX_0FEE,
966
  PREFIX_VEX_0FEF,
967
  PREFIX_VEX_0FF0,
968
  PREFIX_VEX_0FF1,
969
  PREFIX_VEX_0FF2,
970
  PREFIX_VEX_0FF3,
971
  PREFIX_VEX_0FF4,
972
  PREFIX_VEX_0FF5,
973
  PREFIX_VEX_0FF6,
974
  PREFIX_VEX_0FF7,
975
  PREFIX_VEX_0FF8,
976
  PREFIX_VEX_0FF9,
977
  PREFIX_VEX_0FFA,
978
  PREFIX_VEX_0FFB,
979
  PREFIX_VEX_0FFC,
980
  PREFIX_VEX_0FFD,
981
  PREFIX_VEX_0FFE,
982
  PREFIX_VEX_0F3800,
983
  PREFIX_VEX_0F3801,
984
  PREFIX_VEX_0F3802,
985
  PREFIX_VEX_0F3803,
986
  PREFIX_VEX_0F3804,
987
  PREFIX_VEX_0F3805,
988
  PREFIX_VEX_0F3806,
989
  PREFIX_VEX_0F3807,
990
  PREFIX_VEX_0F3808,
991
  PREFIX_VEX_0F3809,
992
  PREFIX_VEX_0F380A,
993
  PREFIX_VEX_0F380B,
994
  PREFIX_VEX_0F380C,
995
  PREFIX_VEX_0F380D,
996
  PREFIX_VEX_0F380E,
997
  PREFIX_VEX_0F380F,
998
  PREFIX_VEX_0F3813,
999 148 khays
  PREFIX_VEX_0F3816,
1000 18 khays
  PREFIX_VEX_0F3817,
1001
  PREFIX_VEX_0F3818,
1002
  PREFIX_VEX_0F3819,
1003
  PREFIX_VEX_0F381A,
1004
  PREFIX_VEX_0F381C,
1005
  PREFIX_VEX_0F381D,
1006
  PREFIX_VEX_0F381E,
1007
  PREFIX_VEX_0F3820,
1008
  PREFIX_VEX_0F3821,
1009
  PREFIX_VEX_0F3822,
1010
  PREFIX_VEX_0F3823,
1011
  PREFIX_VEX_0F3824,
1012
  PREFIX_VEX_0F3825,
1013
  PREFIX_VEX_0F3828,
1014
  PREFIX_VEX_0F3829,
1015
  PREFIX_VEX_0F382A,
1016
  PREFIX_VEX_0F382B,
1017
  PREFIX_VEX_0F382C,
1018
  PREFIX_VEX_0F382D,
1019
  PREFIX_VEX_0F382E,
1020
  PREFIX_VEX_0F382F,
1021
  PREFIX_VEX_0F3830,
1022
  PREFIX_VEX_0F3831,
1023
  PREFIX_VEX_0F3832,
1024
  PREFIX_VEX_0F3833,
1025
  PREFIX_VEX_0F3834,
1026
  PREFIX_VEX_0F3835,
1027 148 khays
  PREFIX_VEX_0F3836,
1028 18 khays
  PREFIX_VEX_0F3837,
1029
  PREFIX_VEX_0F3838,
1030
  PREFIX_VEX_0F3839,
1031
  PREFIX_VEX_0F383A,
1032
  PREFIX_VEX_0F383B,
1033
  PREFIX_VEX_0F383C,
1034
  PREFIX_VEX_0F383D,
1035
  PREFIX_VEX_0F383E,
1036
  PREFIX_VEX_0F383F,
1037
  PREFIX_VEX_0F3840,
1038
  PREFIX_VEX_0F3841,
1039 148 khays
  PREFIX_VEX_0F3845,
1040
  PREFIX_VEX_0F3846,
1041
  PREFIX_VEX_0F3847,
1042
  PREFIX_VEX_0F3858,
1043
  PREFIX_VEX_0F3859,
1044
  PREFIX_VEX_0F385A,
1045
  PREFIX_VEX_0F3878,
1046
  PREFIX_VEX_0F3879,
1047
  PREFIX_VEX_0F388C,
1048
  PREFIX_VEX_0F388E,
1049
  PREFIX_VEX_0F3890,
1050
  PREFIX_VEX_0F3891,
1051
  PREFIX_VEX_0F3892,
1052
  PREFIX_VEX_0F3893,
1053 18 khays
  PREFIX_VEX_0F3896,
1054
  PREFIX_VEX_0F3897,
1055
  PREFIX_VEX_0F3898,
1056
  PREFIX_VEX_0F3899,
1057
  PREFIX_VEX_0F389A,
1058
  PREFIX_VEX_0F389B,
1059
  PREFIX_VEX_0F389C,
1060
  PREFIX_VEX_0F389D,
1061
  PREFIX_VEX_0F389E,
1062
  PREFIX_VEX_0F389F,
1063
  PREFIX_VEX_0F38A6,
1064
  PREFIX_VEX_0F38A7,
1065
  PREFIX_VEX_0F38A8,
1066
  PREFIX_VEX_0F38A9,
1067
  PREFIX_VEX_0F38AA,
1068
  PREFIX_VEX_0F38AB,
1069
  PREFIX_VEX_0F38AC,
1070
  PREFIX_VEX_0F38AD,
1071
  PREFIX_VEX_0F38AE,
1072
  PREFIX_VEX_0F38AF,
1073
  PREFIX_VEX_0F38B6,
1074
  PREFIX_VEX_0F38B7,
1075
  PREFIX_VEX_0F38B8,
1076
  PREFIX_VEX_0F38B9,
1077
  PREFIX_VEX_0F38BA,
1078
  PREFIX_VEX_0F38BB,
1079
  PREFIX_VEX_0F38BC,
1080
  PREFIX_VEX_0F38BD,
1081
  PREFIX_VEX_0F38BE,
1082
  PREFIX_VEX_0F38BF,
1083
  PREFIX_VEX_0F38DB,
1084
  PREFIX_VEX_0F38DC,
1085
  PREFIX_VEX_0F38DD,
1086
  PREFIX_VEX_0F38DE,
1087
  PREFIX_VEX_0F38DF,
1088
  PREFIX_VEX_0F38F2,
1089
  PREFIX_VEX_0F38F3_REG_1,
1090
  PREFIX_VEX_0F38F3_REG_2,
1091
  PREFIX_VEX_0F38F3_REG_3,
1092 148 khays
  PREFIX_VEX_0F38F5,
1093
  PREFIX_VEX_0F38F6,
1094 18 khays
  PREFIX_VEX_0F38F7,
1095 148 khays
  PREFIX_VEX_0F3A00,
1096
  PREFIX_VEX_0F3A01,
1097
  PREFIX_VEX_0F3A02,
1098 18 khays
  PREFIX_VEX_0F3A04,
1099
  PREFIX_VEX_0F3A05,
1100
  PREFIX_VEX_0F3A06,
1101
  PREFIX_VEX_0F3A08,
1102
  PREFIX_VEX_0F3A09,
1103
  PREFIX_VEX_0F3A0A,
1104
  PREFIX_VEX_0F3A0B,
1105
  PREFIX_VEX_0F3A0C,
1106
  PREFIX_VEX_0F3A0D,
1107
  PREFIX_VEX_0F3A0E,
1108
  PREFIX_VEX_0F3A0F,
1109
  PREFIX_VEX_0F3A14,
1110
  PREFIX_VEX_0F3A15,
1111
  PREFIX_VEX_0F3A16,
1112
  PREFIX_VEX_0F3A17,
1113
  PREFIX_VEX_0F3A18,
1114
  PREFIX_VEX_0F3A19,
1115
  PREFIX_VEX_0F3A1D,
1116
  PREFIX_VEX_0F3A20,
1117
  PREFIX_VEX_0F3A21,
1118
  PREFIX_VEX_0F3A22,
1119 148 khays
  PREFIX_VEX_0F3A38,
1120
  PREFIX_VEX_0F3A39,
1121 18 khays
  PREFIX_VEX_0F3A40,
1122
  PREFIX_VEX_0F3A41,
1123
  PREFIX_VEX_0F3A42,
1124
  PREFIX_VEX_0F3A44,
1125 148 khays
  PREFIX_VEX_0F3A46,
1126 18 khays
  PREFIX_VEX_0F3A48,
1127
  PREFIX_VEX_0F3A49,
1128
  PREFIX_VEX_0F3A4A,
1129
  PREFIX_VEX_0F3A4B,
1130
  PREFIX_VEX_0F3A4C,
1131
  PREFIX_VEX_0F3A5C,
1132
  PREFIX_VEX_0F3A5D,
1133
  PREFIX_VEX_0F3A5E,
1134
  PREFIX_VEX_0F3A5F,
1135
  PREFIX_VEX_0F3A60,
1136
  PREFIX_VEX_0F3A61,
1137
  PREFIX_VEX_0F3A62,
1138
  PREFIX_VEX_0F3A63,
1139
  PREFIX_VEX_0F3A68,
1140
  PREFIX_VEX_0F3A69,
1141
  PREFIX_VEX_0F3A6A,
1142
  PREFIX_VEX_0F3A6B,
1143
  PREFIX_VEX_0F3A6C,
1144
  PREFIX_VEX_0F3A6D,
1145
  PREFIX_VEX_0F3A6E,
1146
  PREFIX_VEX_0F3A6F,
1147
  PREFIX_VEX_0F3A78,
1148
  PREFIX_VEX_0F3A79,
1149
  PREFIX_VEX_0F3A7A,
1150
  PREFIX_VEX_0F3A7B,
1151
  PREFIX_VEX_0F3A7C,
1152
  PREFIX_VEX_0F3A7D,
1153
  PREFIX_VEX_0F3A7E,
1154
  PREFIX_VEX_0F3A7F,
1155 148 khays
  PREFIX_VEX_0F3ADF,
1156
  PREFIX_VEX_0F3AF0
1157 18 khays
};
1158
 
1159
enum
1160
{
1161
  X86_64_06 = 0,
1162
  X86_64_07,
1163
  X86_64_0D,
1164
  X86_64_16,
1165
  X86_64_17,
1166
  X86_64_1E,
1167
  X86_64_1F,
1168
  X86_64_27,
1169
  X86_64_2F,
1170
  X86_64_37,
1171
  X86_64_3F,
1172
  X86_64_60,
1173
  X86_64_61,
1174
  X86_64_62,
1175
  X86_64_63,
1176
  X86_64_6D,
1177
  X86_64_6F,
1178
  X86_64_9A,
1179
  X86_64_C4,
1180
  X86_64_C5,
1181
  X86_64_CE,
1182
  X86_64_D4,
1183
  X86_64_D5,
1184
  X86_64_EA,
1185
  X86_64_0F01_REG_0,
1186
  X86_64_0F01_REG_1,
1187
  X86_64_0F01_REG_2,
1188
  X86_64_0F01_REG_3
1189
};
1190
 
1191
enum
1192
{
1193
  THREE_BYTE_0F38 = 0,
1194
  THREE_BYTE_0F3A,
1195
  THREE_BYTE_0F7A
1196
};
1197
 
1198
enum
1199
{
1200
  XOP_08 = 0,
1201
  XOP_09,
1202
  XOP_0A
1203
};
1204
 
1205
enum
1206
{
1207
  VEX_0F = 0,
1208
  VEX_0F38,
1209
  VEX_0F3A
1210
};
1211
 
1212
enum
1213
{
1214
  VEX_LEN_0F10_P_1 = 0,
1215
  VEX_LEN_0F10_P_3,
1216
  VEX_LEN_0F11_P_1,
1217
  VEX_LEN_0F11_P_3,
1218
  VEX_LEN_0F12_P_0_M_0,
1219
  VEX_LEN_0F12_P_0_M_1,
1220
  VEX_LEN_0F12_P_2,
1221
  VEX_LEN_0F13_M_0,
1222
  VEX_LEN_0F16_P_0_M_0,
1223
  VEX_LEN_0F16_P_0_M_1,
1224
  VEX_LEN_0F16_P_2,
1225
  VEX_LEN_0F17_M_0,
1226
  VEX_LEN_0F2A_P_1,
1227
  VEX_LEN_0F2A_P_3,
1228
  VEX_LEN_0F2C_P_1,
1229
  VEX_LEN_0F2C_P_3,
1230
  VEX_LEN_0F2D_P_1,
1231
  VEX_LEN_0F2D_P_3,
1232
  VEX_LEN_0F2E_P_0,
1233
  VEX_LEN_0F2E_P_2,
1234
  VEX_LEN_0F2F_P_0,
1235
  VEX_LEN_0F2F_P_2,
1236
  VEX_LEN_0F51_P_1,
1237
  VEX_LEN_0F51_P_3,
1238
  VEX_LEN_0F52_P_1,
1239
  VEX_LEN_0F53_P_1,
1240
  VEX_LEN_0F58_P_1,
1241
  VEX_LEN_0F58_P_3,
1242
  VEX_LEN_0F59_P_1,
1243
  VEX_LEN_0F59_P_3,
1244
  VEX_LEN_0F5A_P_1,
1245
  VEX_LEN_0F5A_P_3,
1246
  VEX_LEN_0F5C_P_1,
1247
  VEX_LEN_0F5C_P_3,
1248
  VEX_LEN_0F5D_P_1,
1249
  VEX_LEN_0F5D_P_3,
1250
  VEX_LEN_0F5E_P_1,
1251
  VEX_LEN_0F5E_P_3,
1252
  VEX_LEN_0F5F_P_1,
1253
  VEX_LEN_0F5F_P_3,
1254
  VEX_LEN_0F6E_P_2,
1255
  VEX_LEN_0F7E_P_1,
1256
  VEX_LEN_0F7E_P_2,
1257
  VEX_LEN_0FAE_R_2_M_0,
1258
  VEX_LEN_0FAE_R_3_M_0,
1259
  VEX_LEN_0FC2_P_1,
1260
  VEX_LEN_0FC2_P_3,
1261
  VEX_LEN_0FC4_P_2,
1262
  VEX_LEN_0FC5_P_2,
1263
  VEX_LEN_0FD6_P_2,
1264
  VEX_LEN_0FF7_P_2,
1265 148 khays
  VEX_LEN_0F3816_P_2,
1266
  VEX_LEN_0F3819_P_2,
1267 18 khays
  VEX_LEN_0F381A_P_2_M_0,
1268 148 khays
  VEX_LEN_0F3836_P_2,
1269 18 khays
  VEX_LEN_0F3841_P_2,
1270 148 khays
  VEX_LEN_0F385A_P_2_M_0,
1271 18 khays
  VEX_LEN_0F38DB_P_2,
1272
  VEX_LEN_0F38DC_P_2,
1273
  VEX_LEN_0F38DD_P_2,
1274
  VEX_LEN_0F38DE_P_2,
1275
  VEX_LEN_0F38DF_P_2,
1276
  VEX_LEN_0F38F2_P_0,
1277
  VEX_LEN_0F38F3_R_1_P_0,
1278
  VEX_LEN_0F38F3_R_2_P_0,
1279
  VEX_LEN_0F38F3_R_3_P_0,
1280 148 khays
  VEX_LEN_0F38F5_P_0,
1281
  VEX_LEN_0F38F5_P_1,
1282
  VEX_LEN_0F38F5_P_3,
1283
  VEX_LEN_0F38F6_P_3,
1284 18 khays
  VEX_LEN_0F38F7_P_0,
1285 148 khays
  VEX_LEN_0F38F7_P_1,
1286
  VEX_LEN_0F38F7_P_2,
1287
  VEX_LEN_0F38F7_P_3,
1288
  VEX_LEN_0F3A00_P_2,
1289
  VEX_LEN_0F3A01_P_2,
1290 18 khays
  VEX_LEN_0F3A06_P_2,
1291
  VEX_LEN_0F3A0A_P_2,
1292
  VEX_LEN_0F3A0B_P_2,
1293
  VEX_LEN_0F3A14_P_2,
1294
  VEX_LEN_0F3A15_P_2,
1295
  VEX_LEN_0F3A16_P_2,
1296
  VEX_LEN_0F3A17_P_2,
1297
  VEX_LEN_0F3A18_P_2,
1298
  VEX_LEN_0F3A19_P_2,
1299
  VEX_LEN_0F3A20_P_2,
1300
  VEX_LEN_0F3A21_P_2,
1301
  VEX_LEN_0F3A22_P_2,
1302 148 khays
  VEX_LEN_0F3A38_P_2,
1303
  VEX_LEN_0F3A39_P_2,
1304 18 khays
  VEX_LEN_0F3A41_P_2,
1305
  VEX_LEN_0F3A44_P_2,
1306 148 khays
  VEX_LEN_0F3A46_P_2,
1307 18 khays
  VEX_LEN_0F3A60_P_2,
1308
  VEX_LEN_0F3A61_P_2,
1309
  VEX_LEN_0F3A62_P_2,
1310
  VEX_LEN_0F3A63_P_2,
1311
  VEX_LEN_0F3A6A_P_2,
1312
  VEX_LEN_0F3A6B_P_2,
1313
  VEX_LEN_0F3A6E_P_2,
1314
  VEX_LEN_0F3A6F_P_2,
1315
  VEX_LEN_0F3A7A_P_2,
1316
  VEX_LEN_0F3A7B_P_2,
1317
  VEX_LEN_0F3A7E_P_2,
1318
  VEX_LEN_0F3A7F_P_2,
1319
  VEX_LEN_0F3ADF_P_2,
1320 148 khays
  VEX_LEN_0F3AF0_P_3,
1321 18 khays
  VEX_LEN_0FXOP_09_80,
1322
  VEX_LEN_0FXOP_09_81
1323
};
1324
 
1325
enum
1326
{
1327
  VEX_W_0F10_P_0 = 0,
1328
  VEX_W_0F10_P_1,
1329
  VEX_W_0F10_P_2,
1330
  VEX_W_0F10_P_3,
1331
  VEX_W_0F11_P_0,
1332
  VEX_W_0F11_P_1,
1333
  VEX_W_0F11_P_2,
1334
  VEX_W_0F11_P_3,
1335
  VEX_W_0F12_P_0_M_0,
1336
  VEX_W_0F12_P_0_M_1,
1337
  VEX_W_0F12_P_1,
1338
  VEX_W_0F12_P_2,
1339
  VEX_W_0F12_P_3,
1340
  VEX_W_0F13_M_0,
1341
  VEX_W_0F14,
1342
  VEX_W_0F15,
1343
  VEX_W_0F16_P_0_M_0,
1344
  VEX_W_0F16_P_0_M_1,
1345
  VEX_W_0F16_P_1,
1346
  VEX_W_0F16_P_2,
1347
  VEX_W_0F17_M_0,
1348
  VEX_W_0F28,
1349
  VEX_W_0F29,
1350
  VEX_W_0F2B_M_0,
1351
  VEX_W_0F2E_P_0,
1352
  VEX_W_0F2E_P_2,
1353
  VEX_W_0F2F_P_0,
1354
  VEX_W_0F2F_P_2,
1355
  VEX_W_0F50_M_0,
1356
  VEX_W_0F51_P_0,
1357
  VEX_W_0F51_P_1,
1358
  VEX_W_0F51_P_2,
1359
  VEX_W_0F51_P_3,
1360
  VEX_W_0F52_P_0,
1361
  VEX_W_0F52_P_1,
1362
  VEX_W_0F53_P_0,
1363
  VEX_W_0F53_P_1,
1364
  VEX_W_0F58_P_0,
1365
  VEX_W_0F58_P_1,
1366
  VEX_W_0F58_P_2,
1367
  VEX_W_0F58_P_3,
1368
  VEX_W_0F59_P_0,
1369
  VEX_W_0F59_P_1,
1370
  VEX_W_0F59_P_2,
1371
  VEX_W_0F59_P_3,
1372
  VEX_W_0F5A_P_0,
1373
  VEX_W_0F5A_P_1,
1374
  VEX_W_0F5A_P_3,
1375
  VEX_W_0F5B_P_0,
1376
  VEX_W_0F5B_P_1,
1377
  VEX_W_0F5B_P_2,
1378
  VEX_W_0F5C_P_0,
1379
  VEX_W_0F5C_P_1,
1380
  VEX_W_0F5C_P_2,
1381
  VEX_W_0F5C_P_3,
1382
  VEX_W_0F5D_P_0,
1383
  VEX_W_0F5D_P_1,
1384
  VEX_W_0F5D_P_2,
1385
  VEX_W_0F5D_P_3,
1386
  VEX_W_0F5E_P_0,
1387
  VEX_W_0F5E_P_1,
1388
  VEX_W_0F5E_P_2,
1389
  VEX_W_0F5E_P_3,
1390
  VEX_W_0F5F_P_0,
1391
  VEX_W_0F5F_P_1,
1392
  VEX_W_0F5F_P_2,
1393
  VEX_W_0F5F_P_3,
1394
  VEX_W_0F60_P_2,
1395
  VEX_W_0F61_P_2,
1396
  VEX_W_0F62_P_2,
1397
  VEX_W_0F63_P_2,
1398
  VEX_W_0F64_P_2,
1399
  VEX_W_0F65_P_2,
1400
  VEX_W_0F66_P_2,
1401
  VEX_W_0F67_P_2,
1402
  VEX_W_0F68_P_2,
1403
  VEX_W_0F69_P_2,
1404
  VEX_W_0F6A_P_2,
1405
  VEX_W_0F6B_P_2,
1406
  VEX_W_0F6C_P_2,
1407
  VEX_W_0F6D_P_2,
1408
  VEX_W_0F6F_P_1,
1409
  VEX_W_0F6F_P_2,
1410
  VEX_W_0F70_P_1,
1411
  VEX_W_0F70_P_2,
1412
  VEX_W_0F70_P_3,
1413
  VEX_W_0F71_R_2_P_2,
1414
  VEX_W_0F71_R_4_P_2,
1415
  VEX_W_0F71_R_6_P_2,
1416
  VEX_W_0F72_R_2_P_2,
1417
  VEX_W_0F72_R_4_P_2,
1418
  VEX_W_0F72_R_6_P_2,
1419
  VEX_W_0F73_R_2_P_2,
1420
  VEX_W_0F73_R_3_P_2,
1421
  VEX_W_0F73_R_6_P_2,
1422
  VEX_W_0F73_R_7_P_2,
1423
  VEX_W_0F74_P_2,
1424
  VEX_W_0F75_P_2,
1425
  VEX_W_0F76_P_2,
1426
  VEX_W_0F77_P_0,
1427
  VEX_W_0F7C_P_2,
1428
  VEX_W_0F7C_P_3,
1429
  VEX_W_0F7D_P_2,
1430
  VEX_W_0F7D_P_3,
1431
  VEX_W_0F7E_P_1,
1432
  VEX_W_0F7F_P_1,
1433
  VEX_W_0F7F_P_2,
1434
  VEX_W_0FAE_R_2_M_0,
1435
  VEX_W_0FAE_R_3_M_0,
1436
  VEX_W_0FC2_P_0,
1437
  VEX_W_0FC2_P_1,
1438
  VEX_W_0FC2_P_2,
1439
  VEX_W_0FC2_P_3,
1440
  VEX_W_0FC4_P_2,
1441
  VEX_W_0FC5_P_2,
1442
  VEX_W_0FD0_P_2,
1443
  VEX_W_0FD0_P_3,
1444
  VEX_W_0FD1_P_2,
1445
  VEX_W_0FD2_P_2,
1446
  VEX_W_0FD3_P_2,
1447
  VEX_W_0FD4_P_2,
1448
  VEX_W_0FD5_P_2,
1449
  VEX_W_0FD6_P_2,
1450
  VEX_W_0FD7_P_2_M_1,
1451
  VEX_W_0FD8_P_2,
1452
  VEX_W_0FD9_P_2,
1453
  VEX_W_0FDA_P_2,
1454
  VEX_W_0FDB_P_2,
1455
  VEX_W_0FDC_P_2,
1456
  VEX_W_0FDD_P_2,
1457
  VEX_W_0FDE_P_2,
1458
  VEX_W_0FDF_P_2,
1459
  VEX_W_0FE0_P_2,
1460
  VEX_W_0FE1_P_2,
1461
  VEX_W_0FE2_P_2,
1462
  VEX_W_0FE3_P_2,
1463
  VEX_W_0FE4_P_2,
1464
  VEX_W_0FE5_P_2,
1465
  VEX_W_0FE6_P_1,
1466
  VEX_W_0FE6_P_2,
1467
  VEX_W_0FE6_P_3,
1468
  VEX_W_0FE7_P_2_M_0,
1469
  VEX_W_0FE8_P_2,
1470
  VEX_W_0FE9_P_2,
1471
  VEX_W_0FEA_P_2,
1472
  VEX_W_0FEB_P_2,
1473
  VEX_W_0FEC_P_2,
1474
  VEX_W_0FED_P_2,
1475
  VEX_W_0FEE_P_2,
1476
  VEX_W_0FEF_P_2,
1477
  VEX_W_0FF0_P_3_M_0,
1478
  VEX_W_0FF1_P_2,
1479
  VEX_W_0FF2_P_2,
1480
  VEX_W_0FF3_P_2,
1481
  VEX_W_0FF4_P_2,
1482
  VEX_W_0FF5_P_2,
1483
  VEX_W_0FF6_P_2,
1484
  VEX_W_0FF7_P_2,
1485
  VEX_W_0FF8_P_2,
1486
  VEX_W_0FF9_P_2,
1487
  VEX_W_0FFA_P_2,
1488
  VEX_W_0FFB_P_2,
1489
  VEX_W_0FFC_P_2,
1490
  VEX_W_0FFD_P_2,
1491
  VEX_W_0FFE_P_2,
1492
  VEX_W_0F3800_P_2,
1493
  VEX_W_0F3801_P_2,
1494
  VEX_W_0F3802_P_2,
1495
  VEX_W_0F3803_P_2,
1496
  VEX_W_0F3804_P_2,
1497
  VEX_W_0F3805_P_2,
1498
  VEX_W_0F3806_P_2,
1499
  VEX_W_0F3807_P_2,
1500
  VEX_W_0F3808_P_2,
1501
  VEX_W_0F3809_P_2,
1502
  VEX_W_0F380A_P_2,
1503
  VEX_W_0F380B_P_2,
1504
  VEX_W_0F380C_P_2,
1505
  VEX_W_0F380D_P_2,
1506
  VEX_W_0F380E_P_2,
1507
  VEX_W_0F380F_P_2,
1508 148 khays
  VEX_W_0F3816_P_2,
1509 18 khays
  VEX_W_0F3817_P_2,
1510 148 khays
  VEX_W_0F3818_P_2,
1511
  VEX_W_0F3819_P_2,
1512 18 khays
  VEX_W_0F381A_P_2_M_0,
1513
  VEX_W_0F381C_P_2,
1514
  VEX_W_0F381D_P_2,
1515
  VEX_W_0F381E_P_2,
1516
  VEX_W_0F3820_P_2,
1517
  VEX_W_0F3821_P_2,
1518
  VEX_W_0F3822_P_2,
1519
  VEX_W_0F3823_P_2,
1520
  VEX_W_0F3824_P_2,
1521
  VEX_W_0F3825_P_2,
1522
  VEX_W_0F3828_P_2,
1523
  VEX_W_0F3829_P_2,
1524
  VEX_W_0F382A_P_2_M_0,
1525
  VEX_W_0F382B_P_2,
1526
  VEX_W_0F382C_P_2_M_0,
1527
  VEX_W_0F382D_P_2_M_0,
1528
  VEX_W_0F382E_P_2_M_0,
1529
  VEX_W_0F382F_P_2_M_0,
1530
  VEX_W_0F3830_P_2,
1531
  VEX_W_0F3831_P_2,
1532
  VEX_W_0F3832_P_2,
1533
  VEX_W_0F3833_P_2,
1534
  VEX_W_0F3834_P_2,
1535
  VEX_W_0F3835_P_2,
1536 148 khays
  VEX_W_0F3836_P_2,
1537 18 khays
  VEX_W_0F3837_P_2,
1538
  VEX_W_0F3838_P_2,
1539
  VEX_W_0F3839_P_2,
1540
  VEX_W_0F383A_P_2,
1541
  VEX_W_0F383B_P_2,
1542
  VEX_W_0F383C_P_2,
1543
  VEX_W_0F383D_P_2,
1544
  VEX_W_0F383E_P_2,
1545
  VEX_W_0F383F_P_2,
1546
  VEX_W_0F3840_P_2,
1547
  VEX_W_0F3841_P_2,
1548 148 khays
  VEX_W_0F3846_P_2,
1549
  VEX_W_0F3858_P_2,
1550
  VEX_W_0F3859_P_2,
1551
  VEX_W_0F385A_P_2_M_0,
1552
  VEX_W_0F3878_P_2,
1553
  VEX_W_0F3879_P_2,
1554 18 khays
  VEX_W_0F38DB_P_2,
1555
  VEX_W_0F38DC_P_2,
1556
  VEX_W_0F38DD_P_2,
1557
  VEX_W_0F38DE_P_2,
1558
  VEX_W_0F38DF_P_2,
1559 148 khays
  VEX_W_0F3A00_P_2,
1560
  VEX_W_0F3A01_P_2,
1561
  VEX_W_0F3A02_P_2,
1562 18 khays
  VEX_W_0F3A04_P_2,
1563
  VEX_W_0F3A05_P_2,
1564
  VEX_W_0F3A06_P_2,
1565
  VEX_W_0F3A08_P_2,
1566
  VEX_W_0F3A09_P_2,
1567
  VEX_W_0F3A0A_P_2,
1568
  VEX_W_0F3A0B_P_2,
1569
  VEX_W_0F3A0C_P_2,
1570
  VEX_W_0F3A0D_P_2,
1571
  VEX_W_0F3A0E_P_2,
1572
  VEX_W_0F3A0F_P_2,
1573
  VEX_W_0F3A14_P_2,
1574
  VEX_W_0F3A15_P_2,
1575
  VEX_W_0F3A18_P_2,
1576
  VEX_W_0F3A19_P_2,
1577
  VEX_W_0F3A20_P_2,
1578
  VEX_W_0F3A21_P_2,
1579 148 khays
  VEX_W_0F3A38_P_2,
1580
  VEX_W_0F3A39_P_2,
1581 18 khays
  VEX_W_0F3A40_P_2,
1582
  VEX_W_0F3A41_P_2,
1583
  VEX_W_0F3A42_P_2,
1584
  VEX_W_0F3A44_P_2,
1585 148 khays
  VEX_W_0F3A46_P_2,
1586 18 khays
  VEX_W_0F3A48_P_2,
1587
  VEX_W_0F3A49_P_2,
1588
  VEX_W_0F3A4A_P_2,
1589
  VEX_W_0F3A4B_P_2,
1590
  VEX_W_0F3A4C_P_2,
1591
  VEX_W_0F3A60_P_2,
1592
  VEX_W_0F3A61_P_2,
1593
  VEX_W_0F3A62_P_2,
1594
  VEX_W_0F3A63_P_2,
1595
  VEX_W_0F3ADF_P_2
1596
};
1597
 
1598
typedef void (*op_rtn) (int bytemode, int sizeflag);
1599
 
1600
struct dis386 {
1601
  const char *name;
1602
  struct
1603
    {
1604
      op_rtn rtn;
1605
      int bytemode;
1606
    } op[MAX_OPERANDS];
1607
};
1608
 
1609
/* Upper case letters in the instruction names here are macros.
1610
   'A' => print 'b' if no register operands or suffix_always is true
1611
   'B' => print 'b' if suffix_always is true
1612
   'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
1613
          size prefix
1614
   'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
1615
          suffix_always is true
1616
   'E' => print 'e' if 32-bit form of jcxz
1617
   'F' => print 'w' or 'l' depending on address size prefix (loop insns)
1618
   'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
1619
   'H' => print ",pt" or ",pn" branch hint
1620
   'I' => honor following macro letter even in Intel mode (implemented only
1621
          for some of the macro letters)
1622
   'J' => print 'l'
1623
   'K' => print 'd' or 'q' if rex prefix is present.
1624
   'L' => print 'l' if suffix_always is true
1625
   'M' => print 'r' if intel_mnemonic is false.
1626
   'N' => print 'n' if instruction has no wait "prefix"
1627
   'O' => print 'd' or 'o' (or 'q' in Intel mode)
1628
   'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
1629
          or suffix_always is true.  print 'q' if rex prefix is present.
1630
   'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
1631
          is true
1632
   'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
1633
   'S' => print 'w', 'l' or 'q' if suffix_always is true
1634
   'T' => print 'q' in 64bit mode and behave as 'P' otherwise
1635
   'U' => print 'q' in 64bit mode and behave as 'Q' otherwise
1636
   'V' => print 'q' in 64bit mode and behave as 'S' otherwise
1637
   'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
1638
   'X' => print 's', 'd' depending on data16 prefix (for XMM)
1639
   'Y' => 'q' if instruction has an REX 64bit overwrite prefix and
1640
          suffix_always is true.
1641
   'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
1642
   '!' => change condition from true to false or from false to true.
1643
   '%' => add 1 upper case letter to the macro.
1644
 
1645
   2 upper case letter macros:
1646
   "XY" => print 'x' or 'y' if no register operands or suffix_always
1647
           is true.
1648
   "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
1649
   "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand
1650
           or suffix_always is true
1651
   "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
1652
   "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
1653
   "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
1654 148 khays
   "LW" => print 'd', 'q' depending on the VEX.W bit
1655 18 khays
 
1656
   Many of the above letters print nothing in Intel mode.  See "putop"
1657
   for the details.
1658
 
1659
   Braces '{' and '}', and vertical bars '|', indicate alternative
1660
   mnemonic strings for AT&T and Intel.  */
1661
 
1662
static const struct dis386 dis386[] = {
1663
  /* 00 */
1664 166 khays
  { "addB",             { Ebh1, Gb } },
1665
  { "addS",             { Evh1, Gv } },
1666 18 khays
  { "addB",             { Gb, EbS } },
1667
  { "addS",             { Gv, EvS } },
1668
  { "addB",             { AL, Ib } },
1669
  { "addS",             { eAX, Iv } },
1670
  { X86_64_TABLE (X86_64_06) },
1671
  { X86_64_TABLE (X86_64_07) },
1672
  /* 08 */
1673 166 khays
  { "orB",              { Ebh1, Gb } },
1674
  { "orS",              { Evh1, Gv } },
1675 18 khays
  { "orB",              { Gb, EbS } },
1676
  { "orS",              { Gv, EvS } },
1677
  { "orB",              { AL, Ib } },
1678
  { "orS",              { eAX, Iv } },
1679
  { X86_64_TABLE (X86_64_0D) },
1680
  { Bad_Opcode },       /* 0x0f extended opcode escape */
1681
  /* 10 */
1682 166 khays
  { "adcB",             { Ebh1, Gb } },
1683
  { "adcS",             { Evh1, Gv } },
1684 18 khays
  { "adcB",             { Gb, EbS } },
1685
  { "adcS",             { Gv, EvS } },
1686
  { "adcB",             { AL, Ib } },
1687
  { "adcS",             { eAX, Iv } },
1688
  { X86_64_TABLE (X86_64_16) },
1689
  { X86_64_TABLE (X86_64_17) },
1690
  /* 18 */
1691 166 khays
  { "sbbB",             { Ebh1, Gb } },
1692
  { "sbbS",             { Evh1, Gv } },
1693 18 khays
  { "sbbB",             { Gb, EbS } },
1694
  { "sbbS",             { Gv, EvS } },
1695
  { "sbbB",             { AL, Ib } },
1696
  { "sbbS",             { eAX, Iv } },
1697
  { X86_64_TABLE (X86_64_1E) },
1698
  { X86_64_TABLE (X86_64_1F) },
1699
  /* 20 */
1700 166 khays
  { "andB",             { Ebh1, Gb } },
1701
  { "andS",             { Evh1, Gv } },
1702 18 khays
  { "andB",             { Gb, EbS } },
1703
  { "andS",             { Gv, EvS } },
1704
  { "andB",             { AL, Ib } },
1705
  { "andS",             { eAX, Iv } },
1706
  { Bad_Opcode },       /* SEG ES prefix */
1707
  { X86_64_TABLE (X86_64_27) },
1708
  /* 28 */
1709 166 khays
  { "subB",             { Ebh1, Gb } },
1710
  { "subS",             { Evh1, Gv } },
1711 18 khays
  { "subB",             { Gb, EbS } },
1712
  { "subS",             { Gv, EvS } },
1713
  { "subB",             { AL, Ib } },
1714
  { "subS",             { eAX, Iv } },
1715
  { Bad_Opcode },       /* SEG CS prefix */
1716
  { X86_64_TABLE (X86_64_2F) },
1717
  /* 30 */
1718 166 khays
  { "xorB",             { Ebh1, Gb } },
1719
  { "xorS",             { Evh1, Gv } },
1720 18 khays
  { "xorB",             { Gb, EbS } },
1721
  { "xorS",             { Gv, EvS } },
1722
  { "xorB",             { AL, Ib } },
1723
  { "xorS",             { eAX, Iv } },
1724
  { Bad_Opcode },       /* SEG SS prefix */
1725
  { X86_64_TABLE (X86_64_37) },
1726
  /* 38 */
1727
  { "cmpB",             { Eb, Gb } },
1728
  { "cmpS",             { Ev, Gv } },
1729
  { "cmpB",             { Gb, EbS } },
1730
  { "cmpS",             { Gv, EvS } },
1731
  { "cmpB",             { AL, Ib } },
1732
  { "cmpS",             { eAX, Iv } },
1733
  { Bad_Opcode },       /* SEG DS prefix */
1734
  { X86_64_TABLE (X86_64_3F) },
1735
  /* 40 */
1736
  { "inc{S|}",          { RMeAX } },
1737
  { "inc{S|}",          { RMeCX } },
1738
  { "inc{S|}",          { RMeDX } },
1739
  { "inc{S|}",          { RMeBX } },
1740
  { "inc{S|}",          { RMeSP } },
1741
  { "inc{S|}",          { RMeBP } },
1742
  { "inc{S|}",          { RMeSI } },
1743
  { "inc{S|}",          { RMeDI } },
1744
  /* 48 */
1745
  { "dec{S|}",          { RMeAX } },
1746
  { "dec{S|}",          { RMeCX } },
1747
  { "dec{S|}",          { RMeDX } },
1748
  { "dec{S|}",          { RMeBX } },
1749
  { "dec{S|}",          { RMeSP } },
1750
  { "dec{S|}",          { RMeBP } },
1751
  { "dec{S|}",          { RMeSI } },
1752
  { "dec{S|}",          { RMeDI } },
1753
  /* 50 */
1754
  { "pushV",            { RMrAX } },
1755
  { "pushV",            { RMrCX } },
1756
  { "pushV",            { RMrDX } },
1757
  { "pushV",            { RMrBX } },
1758
  { "pushV",            { RMrSP } },
1759
  { "pushV",            { RMrBP } },
1760
  { "pushV",            { RMrSI } },
1761
  { "pushV",            { RMrDI } },
1762
  /* 58 */
1763
  { "popV",             { RMrAX } },
1764
  { "popV",             { RMrCX } },
1765
  { "popV",             { RMrDX } },
1766
  { "popV",             { RMrBX } },
1767
  { "popV",             { RMrSP } },
1768
  { "popV",             { RMrBP } },
1769
  { "popV",             { RMrSI } },
1770
  { "popV",             { RMrDI } },
1771
  /* 60 */
1772
  { X86_64_TABLE (X86_64_60) },
1773
  { X86_64_TABLE (X86_64_61) },
1774
  { X86_64_TABLE (X86_64_62) },
1775
  { X86_64_TABLE (X86_64_63) },
1776
  { Bad_Opcode },       /* seg fs */
1777
  { Bad_Opcode },       /* seg gs */
1778
  { Bad_Opcode },       /* op size prefix */
1779
  { Bad_Opcode },       /* adr size prefix */
1780
  /* 68 */
1781
  { "pushT",            { sIv } },
1782
  { "imulS",            { Gv, Ev, Iv } },
1783
  { "pushT",            { sIbT } },
1784
  { "imulS",            { Gv, Ev, sIb } },
1785
  { "ins{b|}",          { Ybr, indirDX } },
1786
  { X86_64_TABLE (X86_64_6D) },
1787
  { "outs{b|}",         { indirDXr, Xb } },
1788
  { X86_64_TABLE (X86_64_6F) },
1789
  /* 70 */
1790
  { "joH",              { Jb, XX, cond_jump_flag } },
1791
  { "jnoH",             { Jb, XX, cond_jump_flag } },
1792
  { "jbH",              { Jb, XX, cond_jump_flag } },
1793
  { "jaeH",             { Jb, XX, cond_jump_flag } },
1794
  { "jeH",              { Jb, XX, cond_jump_flag } },
1795
  { "jneH",             { Jb, XX, cond_jump_flag } },
1796
  { "jbeH",             { Jb, XX, cond_jump_flag } },
1797
  { "jaH",              { Jb, XX, cond_jump_flag } },
1798
  /* 78 */
1799
  { "jsH",              { Jb, XX, cond_jump_flag } },
1800
  { "jnsH",             { Jb, XX, cond_jump_flag } },
1801
  { "jpH",              { Jb, XX, cond_jump_flag } },
1802
  { "jnpH",             { Jb, XX, cond_jump_flag } },
1803
  { "jlH",              { Jb, XX, cond_jump_flag } },
1804
  { "jgeH",             { Jb, XX, cond_jump_flag } },
1805
  { "jleH",             { Jb, XX, cond_jump_flag } },
1806
  { "jgH",              { Jb, XX, cond_jump_flag } },
1807
  /* 80 */
1808
  { REG_TABLE (REG_80) },
1809
  { REG_TABLE (REG_81) },
1810
  { Bad_Opcode },
1811
  { REG_TABLE (REG_82) },
1812
  { "testB",            { Eb, Gb } },
1813
  { "testS",            { Ev, Gv } },
1814 166 khays
  { "xchgB",            { Ebh2, Gb } },
1815
  { "xchgS",            { Evh2, Gv } },
1816 18 khays
  /* 88 */
1817 166 khays
  { "movB",             { Ebh3, Gb } },
1818
  { "movS",             { Evh3, Gv } },
1819 18 khays
  { "movB",             { Gb, EbS } },
1820
  { "movS",             { Gv, EvS } },
1821
  { "movD",             { Sv, Sw } },
1822
  { MOD_TABLE (MOD_8D) },
1823
  { "movD",             { Sw, Sv } },
1824
  { REG_TABLE (REG_8F) },
1825
  /* 90 */
1826
  { PREFIX_TABLE (PREFIX_90) },
1827
  { "xchgS",            { RMeCX, eAX } },
1828
  { "xchgS",            { RMeDX, eAX } },
1829
  { "xchgS",            { RMeBX, eAX } },
1830
  { "xchgS",            { RMeSP, eAX } },
1831
  { "xchgS",            { RMeBP, eAX } },
1832
  { "xchgS",            { RMeSI, eAX } },
1833
  { "xchgS",            { RMeDI, eAX } },
1834
  /* 98 */
1835
  { "cW{t|}R",          { XX } },
1836
  { "cR{t|}O",          { XX } },
1837
  { X86_64_TABLE (X86_64_9A) },
1838
  { Bad_Opcode },       /* fwait */
1839
  { "pushfT",           { XX } },
1840
  { "popfT",            { XX } },
1841
  { "sahf",             { XX } },
1842
  { "lahf",             { XX } },
1843
  /* a0 */
1844
  { "mov%LB",           { AL, Ob } },
1845
  { "mov%LS",           { eAX, Ov } },
1846
  { "mov%LB",           { Ob, AL } },
1847
  { "mov%LS",           { Ov, eAX } },
1848
  { "movs{b|}",         { Ybr, Xb } },
1849
  { "movs{R|}",         { Yvr, Xv } },
1850
  { "cmps{b|}",         { Xb, Yb } },
1851
  { "cmps{R|}",         { Xv, Yv } },
1852
  /* a8 */
1853
  { "testB",            { AL, Ib } },
1854
  { "testS",            { eAX, Iv } },
1855
  { "stosB",            { Ybr, AL } },
1856
  { "stosS",            { Yvr, eAX } },
1857
  { "lodsB",            { ALr, Xb } },
1858
  { "lodsS",            { eAXr, Xv } },
1859
  { "scasB",            { AL, Yb } },
1860
  { "scasS",            { eAX, Yv } },
1861
  /* b0 */
1862
  { "movB",             { RMAL, Ib } },
1863
  { "movB",             { RMCL, Ib } },
1864
  { "movB",             { RMDL, Ib } },
1865
  { "movB",             { RMBL, Ib } },
1866
  { "movB",             { RMAH, Ib } },
1867
  { "movB",             { RMCH, Ib } },
1868
  { "movB",             { RMDH, Ib } },
1869
  { "movB",             { RMBH, Ib } },
1870
  /* b8 */
1871
  { "mov%LV",           { RMeAX, Iv64 } },
1872
  { "mov%LV",           { RMeCX, Iv64 } },
1873
  { "mov%LV",           { RMeDX, Iv64 } },
1874
  { "mov%LV",           { RMeBX, Iv64 } },
1875
  { "mov%LV",           { RMeSP, Iv64 } },
1876
  { "mov%LV",           { RMeBP, Iv64 } },
1877
  { "mov%LV",           { RMeSI, Iv64 } },
1878
  { "mov%LV",           { RMeDI, Iv64 } },
1879
  /* c0 */
1880
  { REG_TABLE (REG_C0) },
1881
  { REG_TABLE (REG_C1) },
1882
  { "retT",             { Iw } },
1883
  { "retT",             { XX } },
1884
  { X86_64_TABLE (X86_64_C4) },
1885
  { X86_64_TABLE (X86_64_C5) },
1886
  { REG_TABLE (REG_C6) },
1887
  { REG_TABLE (REG_C7) },
1888
  /* c8 */
1889
  { "enterT",           { Iw, Ib } },
1890
  { "leaveT",           { XX } },
1891
  { "Jret{|f}P",        { Iw } },
1892
  { "Jret{|f}P",        { XX } },
1893
  { "int3",             { XX } },
1894
  { "int",              { Ib } },
1895
  { X86_64_TABLE (X86_64_CE) },
1896
  { "iretP",            { XX } },
1897
  /* d0 */
1898
  { REG_TABLE (REG_D0) },
1899
  { REG_TABLE (REG_D1) },
1900
  { REG_TABLE (REG_D2) },
1901
  { REG_TABLE (REG_D3) },
1902
  { X86_64_TABLE (X86_64_D4) },
1903
  { X86_64_TABLE (X86_64_D5) },
1904
  { Bad_Opcode },
1905
  { "xlat",             { DSBX } },
1906
  /* d8 */
1907
  { FLOAT },
1908
  { FLOAT },
1909
  { FLOAT },
1910
  { FLOAT },
1911
  { FLOAT },
1912
  { FLOAT },
1913
  { FLOAT },
1914
  { FLOAT },
1915
  /* e0 */
1916
  { "loopneFH",         { Jb, XX, loop_jcxz_flag } },
1917
  { "loopeFH",          { Jb, XX, loop_jcxz_flag } },
1918
  { "loopFH",           { Jb, XX, loop_jcxz_flag } },
1919
  { "jEcxzH",           { Jb, XX, loop_jcxz_flag } },
1920
  { "inB",              { AL, Ib } },
1921
  { "inG",              { zAX, Ib } },
1922
  { "outB",             { Ib, AL } },
1923
  { "outG",             { Ib, zAX } },
1924
  /* e8 */
1925
  { "callT",            { Jv } },
1926
  { "jmpT",             { Jv } },
1927
  { X86_64_TABLE (X86_64_EA) },
1928
  { "jmp",              { Jb } },
1929
  { "inB",              { AL, indirDX } },
1930
  { "inG",              { zAX, indirDX } },
1931
  { "outB",             { indirDX, AL } },
1932
  { "outG",             { indirDX, zAX } },
1933
  /* f0 */
1934
  { Bad_Opcode },       /* lock prefix */
1935
  { "icebp",            { XX } },
1936
  { Bad_Opcode },       /* repne */
1937
  { Bad_Opcode },       /* repz */
1938
  { "hlt",              { XX } },
1939
  { "cmc",              { XX } },
1940
  { REG_TABLE (REG_F6) },
1941
  { REG_TABLE (REG_F7) },
1942
  /* f8 */
1943
  { "clc",              { XX } },
1944
  { "stc",              { XX } },
1945
  { "cli",              { XX } },
1946
  { "sti",              { XX } },
1947
  { "cld",              { XX } },
1948
  { "std",              { XX } },
1949
  { REG_TABLE (REG_FE) },
1950
  { REG_TABLE (REG_FF) },
1951
};
1952
 
1953
static const struct dis386 dis386_twobyte[] = {
1954
  /* 00 */
1955
  { REG_TABLE (REG_0F00 ) },
1956
  { REG_TABLE (REG_0F01 ) },
1957
  { "larS",             { Gv, Ew } },
1958
  { "lslS",             { Gv, Ew } },
1959
  { Bad_Opcode },
1960
  { "syscall",          { XX } },
1961
  { "clts",             { XX } },
1962
  { "sysretP",          { XX } },
1963
  /* 08 */
1964
  { "invd",             { XX } },
1965
  { "wbinvd",           { XX } },
1966
  { Bad_Opcode },
1967
  { "ud2",              { XX } },
1968
  { Bad_Opcode },
1969
  { REG_TABLE (REG_0F0D) },
1970
  { "femms",            { XX } },
1971
  { "",                 { MX, EM, OPSUF } }, /* See OP_3DNowSuffix.  */
1972
  /* 10 */
1973
  { PREFIX_TABLE (PREFIX_0F10) },
1974
  { PREFIX_TABLE (PREFIX_0F11) },
1975
  { PREFIX_TABLE (PREFIX_0F12) },
1976
  { MOD_TABLE (MOD_0F13) },
1977
  { "unpcklpX",         { XM, EXx } },
1978
  { "unpckhpX",         { XM, EXx } },
1979
  { PREFIX_TABLE (PREFIX_0F16) },
1980
  { MOD_TABLE (MOD_0F17) },
1981
  /* 18 */
1982
  { REG_TABLE (REG_0F18) },
1983
  { "nopQ",             { Ev } },
1984
  { "nopQ",             { Ev } },
1985
  { "nopQ",             { Ev } },
1986
  { "nopQ",             { Ev } },
1987
  { "nopQ",             { Ev } },
1988
  { "nopQ",             { Ev } },
1989
  { "nopQ",             { Ev } },
1990
  /* 20 */
1991
  { MOD_TABLE (MOD_0F20) },
1992
  { MOD_TABLE (MOD_0F21) },
1993
  { MOD_TABLE (MOD_0F22) },
1994
  { MOD_TABLE (MOD_0F23) },
1995
  { MOD_TABLE (MOD_0F24) },
1996
  { Bad_Opcode },
1997
  { MOD_TABLE (MOD_0F26) },
1998
  { Bad_Opcode },
1999
  /* 28 */
2000
  { "movapX",           { XM, EXx } },
2001
  { "movapX",           { EXxS, XM } },
2002
  { PREFIX_TABLE (PREFIX_0F2A) },
2003
  { PREFIX_TABLE (PREFIX_0F2B) },
2004
  { PREFIX_TABLE (PREFIX_0F2C) },
2005
  { PREFIX_TABLE (PREFIX_0F2D) },
2006
  { PREFIX_TABLE (PREFIX_0F2E) },
2007
  { PREFIX_TABLE (PREFIX_0F2F) },
2008
  /* 30 */
2009
  { "wrmsr",            { XX } },
2010
  { "rdtsc",            { XX } },
2011
  { "rdmsr",            { XX } },
2012
  { "rdpmc",            { XX } },
2013
  { "sysenter",         { XX } },
2014
  { "sysexit",          { XX } },
2015
  { Bad_Opcode },
2016
  { "getsec",           { XX } },
2017
  /* 38 */
2018
  { THREE_BYTE_TABLE (THREE_BYTE_0F38) },
2019
  { Bad_Opcode },
2020
  { THREE_BYTE_TABLE (THREE_BYTE_0F3A) },
2021
  { Bad_Opcode },
2022
  { Bad_Opcode },
2023
  { Bad_Opcode },
2024
  { Bad_Opcode },
2025
  { Bad_Opcode },
2026
  /* 40 */
2027
  { "cmovoS",           { Gv, Ev } },
2028
  { "cmovnoS",          { Gv, Ev } },
2029
  { "cmovbS",           { Gv, Ev } },
2030
  { "cmovaeS",          { Gv, Ev } },
2031
  { "cmoveS",           { Gv, Ev } },
2032
  { "cmovneS",          { Gv, Ev } },
2033
  { "cmovbeS",          { Gv, Ev } },
2034
  { "cmovaS",           { Gv, Ev } },
2035
  /* 48 */
2036
  { "cmovsS",           { Gv, Ev } },
2037
  { "cmovnsS",          { Gv, Ev } },
2038
  { "cmovpS",           { Gv, Ev } },
2039
  { "cmovnpS",          { Gv, Ev } },
2040
  { "cmovlS",           { Gv, Ev } },
2041
  { "cmovgeS",          { Gv, Ev } },
2042
  { "cmovleS",          { Gv, Ev } },
2043
  { "cmovgS",           { Gv, Ev } },
2044
  /* 50 */
2045
  { MOD_TABLE (MOD_0F51) },
2046
  { PREFIX_TABLE (PREFIX_0F51) },
2047
  { PREFIX_TABLE (PREFIX_0F52) },
2048
  { PREFIX_TABLE (PREFIX_0F53) },
2049
  { "andpX",            { XM, EXx } },
2050
  { "andnpX",           { XM, EXx } },
2051
  { "orpX",             { XM, EXx } },
2052
  { "xorpX",            { XM, EXx } },
2053
  /* 58 */
2054
  { PREFIX_TABLE (PREFIX_0F58) },
2055
  { PREFIX_TABLE (PREFIX_0F59) },
2056
  { PREFIX_TABLE (PREFIX_0F5A) },
2057
  { PREFIX_TABLE (PREFIX_0F5B) },
2058
  { PREFIX_TABLE (PREFIX_0F5C) },
2059
  { PREFIX_TABLE (PREFIX_0F5D) },
2060
  { PREFIX_TABLE (PREFIX_0F5E) },
2061
  { PREFIX_TABLE (PREFIX_0F5F) },
2062
  /* 60 */
2063
  { PREFIX_TABLE (PREFIX_0F60) },
2064
  { PREFIX_TABLE (PREFIX_0F61) },
2065
  { PREFIX_TABLE (PREFIX_0F62) },
2066
  { "packsswb",         { MX, EM } },
2067
  { "pcmpgtb",          { MX, EM } },
2068
  { "pcmpgtw",          { MX, EM } },
2069
  { "pcmpgtd",          { MX, EM } },
2070
  { "packuswb",         { MX, EM } },
2071
  /* 68 */
2072
  { "punpckhbw",        { MX, EM } },
2073
  { "punpckhwd",        { MX, EM } },
2074
  { "punpckhdq",        { MX, EM } },
2075
  { "packssdw",         { MX, EM } },
2076
  { PREFIX_TABLE (PREFIX_0F6C) },
2077
  { PREFIX_TABLE (PREFIX_0F6D) },
2078
  { "movK",             { MX, Edq } },
2079
  { PREFIX_TABLE (PREFIX_0F6F) },
2080
  /* 70 */
2081
  { PREFIX_TABLE (PREFIX_0F70) },
2082
  { REG_TABLE (REG_0F71) },
2083
  { REG_TABLE (REG_0F72) },
2084
  { REG_TABLE (REG_0F73) },
2085
  { "pcmpeqb",          { MX, EM } },
2086
  { "pcmpeqw",          { MX, EM } },
2087
  { "pcmpeqd",          { MX, EM } },
2088
  { "emms",             { XX } },
2089
  /* 78 */
2090
  { PREFIX_TABLE (PREFIX_0F78) },
2091
  { PREFIX_TABLE (PREFIX_0F79) },
2092
  { THREE_BYTE_TABLE (THREE_BYTE_0F7A) },
2093
  { Bad_Opcode },
2094
  { PREFIX_TABLE (PREFIX_0F7C) },
2095
  { PREFIX_TABLE (PREFIX_0F7D) },
2096
  { PREFIX_TABLE (PREFIX_0F7E) },
2097
  { PREFIX_TABLE (PREFIX_0F7F) },
2098
  /* 80 */
2099
  { "joH",              { Jv, XX, cond_jump_flag } },
2100
  { "jnoH",             { Jv, XX, cond_jump_flag } },
2101
  { "jbH",              { Jv, XX, cond_jump_flag } },
2102
  { "jaeH",             { Jv, XX, cond_jump_flag } },
2103
  { "jeH",              { Jv, XX, cond_jump_flag } },
2104
  { "jneH",             { Jv, XX, cond_jump_flag } },
2105
  { "jbeH",             { Jv, XX, cond_jump_flag } },
2106
  { "jaH",              { Jv, XX, cond_jump_flag } },
2107
  /* 88 */
2108
  { "jsH",              { Jv, XX, cond_jump_flag } },
2109
  { "jnsH",             { Jv, XX, cond_jump_flag } },
2110
  { "jpH",              { Jv, XX, cond_jump_flag } },
2111
  { "jnpH",             { Jv, XX, cond_jump_flag } },
2112
  { "jlH",              { Jv, XX, cond_jump_flag } },
2113
  { "jgeH",             { Jv, XX, cond_jump_flag } },
2114
  { "jleH",             { Jv, XX, cond_jump_flag } },
2115
  { "jgH",              { Jv, XX, cond_jump_flag } },
2116
  /* 90 */
2117
  { "seto",             { Eb } },
2118
  { "setno",            { Eb } },
2119
  { "setb",             { Eb } },
2120
  { "setae",            { Eb } },
2121
  { "sete",             { Eb } },
2122
  { "setne",            { Eb } },
2123
  { "setbe",            { Eb } },
2124
  { "seta",             { Eb } },
2125
  /* 98 */
2126
  { "sets",             { Eb } },
2127
  { "setns",            { Eb } },
2128
  { "setp",             { Eb } },
2129
  { "setnp",            { Eb } },
2130
  { "setl",             { Eb } },
2131
  { "setge",            { Eb } },
2132
  { "setle",            { Eb } },
2133
  { "setg",             { Eb } },
2134
  /* a0 */
2135
  { "pushT",            { fs } },
2136
  { "popT",             { fs } },
2137
  { "cpuid",            { XX } },
2138
  { "btS",              { Ev, Gv } },
2139
  { "shldS",            { Ev, Gv, Ib } },
2140
  { "shldS",            { Ev, Gv, CL } },
2141
  { REG_TABLE (REG_0FA6) },
2142
  { REG_TABLE (REG_0FA7) },
2143
  /* a8 */
2144
  { "pushT",            { gs } },
2145
  { "popT",             { gs } },
2146
  { "rsm",              { XX } },
2147 166 khays
  { "btsS",             { Evh1, Gv } },
2148 18 khays
  { "shrdS",            { Ev, Gv, Ib } },
2149
  { "shrdS",            { Ev, Gv, CL } },
2150
  { REG_TABLE (REG_0FAE) },
2151
  { "imulS",            { Gv, Ev } },
2152
  /* b0 */
2153 166 khays
  { "cmpxchgB",         { Ebh1, Gb } },
2154
  { "cmpxchgS",         { Evh1, Gv } },
2155 18 khays
  { MOD_TABLE (MOD_0FB2) },
2156 166 khays
  { "btrS",             { Evh1, Gv } },
2157 18 khays
  { MOD_TABLE (MOD_0FB4) },
2158
  { MOD_TABLE (MOD_0FB5) },
2159
  { "movz{bR|x}",       { Gv, Eb } },
2160
  { "movz{wR|x}",       { Gv, Ew } }, /* yes, there really is movzww ! */
2161
  /* b8 */
2162
  { PREFIX_TABLE (PREFIX_0FB8) },
2163
  { "ud1",              { XX } },
2164
  { REG_TABLE (REG_0FBA) },
2165 166 khays
  { "btcS",             { Evh1, Gv } },
2166 18 khays
  { PREFIX_TABLE (PREFIX_0FBC) },
2167
  { PREFIX_TABLE (PREFIX_0FBD) },
2168
  { "movs{bR|x}",       { Gv, Eb } },
2169
  { "movs{wR|x}",       { Gv, Ew } }, /* yes, there really is movsww ! */
2170
  /* c0 */
2171 166 khays
  { "xaddB",            { Ebh1, Gb } },
2172
  { "xaddS",            { Evh1, Gv } },
2173 18 khays
  { PREFIX_TABLE (PREFIX_0FC2) },
2174
  { PREFIX_TABLE (PREFIX_0FC3) },
2175
  { "pinsrw",           { MX, Edqw, Ib } },
2176
  { "pextrw",           { Gdq, MS, Ib } },
2177
  { "shufpX",           { XM, EXx, Ib } },
2178
  { REG_TABLE (REG_0FC7) },
2179
  /* c8 */
2180
  { "bswap",            { RMeAX } },
2181
  { "bswap",            { RMeCX } },
2182
  { "bswap",            { RMeDX } },
2183
  { "bswap",            { RMeBX } },
2184
  { "bswap",            { RMeSP } },
2185
  { "bswap",            { RMeBP } },
2186
  { "bswap",            { RMeSI } },
2187
  { "bswap",            { RMeDI } },
2188
  /* d0 */
2189
  { PREFIX_TABLE (PREFIX_0FD0) },
2190
  { "psrlw",            { MX, EM } },
2191
  { "psrld",            { MX, EM } },
2192
  { "psrlq",            { MX, EM } },
2193
  { "paddq",            { MX, EM } },
2194
  { "pmullw",           { MX, EM } },
2195
  { PREFIX_TABLE (PREFIX_0FD6) },
2196
  { MOD_TABLE (MOD_0FD7) },
2197
  /* d8 */
2198
  { "psubusb",          { MX, EM } },
2199
  { "psubusw",          { MX, EM } },
2200
  { "pminub",           { MX, EM } },
2201
  { "pand",             { MX, EM } },
2202
  { "paddusb",          { MX, EM } },
2203
  { "paddusw",          { MX, EM } },
2204
  { "pmaxub",           { MX, EM } },
2205
  { "pandn",            { MX, EM } },
2206
  /* e0 */
2207
  { "pavgb",            { MX, EM } },
2208
  { "psraw",            { MX, EM } },
2209
  { "psrad",            { MX, EM } },
2210
  { "pavgw",            { MX, EM } },
2211
  { "pmulhuw",          { MX, EM } },
2212
  { "pmulhw",           { MX, EM } },
2213
  { PREFIX_TABLE (PREFIX_0FE6) },
2214
  { PREFIX_TABLE (PREFIX_0FE7) },
2215
  /* e8 */
2216
  { "psubsb",           { MX, EM } },
2217
  { "psubsw",           { MX, EM } },
2218
  { "pminsw",           { MX, EM } },
2219
  { "por",              { MX, EM } },
2220
  { "paddsb",           { MX, EM } },
2221
  { "paddsw",           { MX, EM } },
2222
  { "pmaxsw",           { MX, EM } },
2223
  { "pxor",             { MX, EM } },
2224
  /* f0 */
2225
  { PREFIX_TABLE (PREFIX_0FF0) },
2226
  { "psllw",            { MX, EM } },
2227
  { "pslld",            { MX, EM } },
2228
  { "psllq",            { MX, EM } },
2229
  { "pmuludq",          { MX, EM } },
2230
  { "pmaddwd",          { MX, EM } },
2231
  { "psadbw",           { MX, EM } },
2232
  { PREFIX_TABLE (PREFIX_0FF7) },
2233
  /* f8 */
2234
  { "psubb",            { MX, EM } },
2235
  { "psubw",            { MX, EM } },
2236
  { "psubd",            { MX, EM } },
2237
  { "psubq",            { MX, EM } },
2238
  { "paddb",            { MX, EM } },
2239
  { "paddw",            { MX, EM } },
2240
  { "paddd",            { MX, EM } },
2241
  { Bad_Opcode },
2242
};
2243
 
2244
static const unsigned char onebyte_has_modrm[256] = {
2245
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2246
  /*       -------------------------------        */
2247
  /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2248
  /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2249
  /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2250
  /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2251
  /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2252
  /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2253
  /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2254
  /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2255
  /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2256
  /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2257
  /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2258
  /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2259
  /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2260
  /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2261
  /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2262
  /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1  /* f0 */
2263
  /*       -------------------------------        */
2264
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2265
};
2266
 
2267
static const unsigned char twobyte_has_modrm[256] = {
2268
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2269
  /*       -------------------------------        */
2270
  /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
2271
  /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
2272
  /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
2273
  /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
2274
  /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
2275
  /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2276
  /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
2277
  /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
2278
  /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2279
  /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
2280
  /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
2281
  /* b0 */ 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, /* bf */
2282
  /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
2283
  /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
2284
  /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
2285
  /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0  /* ff */
2286
  /*       -------------------------------        */
2287
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2288
};
2289
 
2290
static char obuf[100];
2291
static char *obufp;
2292
static char *mnemonicendp;
2293
static char scratchbuf[100];
2294
static unsigned char *start_codep;
2295
static unsigned char *insn_codep;
2296
static unsigned char *codep;
2297
static int last_lock_prefix;
2298
static int last_repz_prefix;
2299
static int last_repnz_prefix;
2300
static int last_data_prefix;
2301
static int last_addr_prefix;
2302
static int last_rex_prefix;
2303
static int last_seg_prefix;
2304
#define MAX_CODE_LENGTH 15
2305
/* We can up to 14 prefixes since the maximum instruction length is
2306
   15bytes.  */
2307
static int all_prefixes[MAX_CODE_LENGTH - 1];
2308
static disassemble_info *the_info;
2309
static struct
2310
  {
2311
    int mod;
2312
    int reg;
2313
    int rm;
2314
  }
2315
modrm;
2316
static unsigned char need_modrm;
2317
static struct
2318
  {
2319
    int scale;
2320
    int index;
2321
    int base;
2322
  }
2323
sib;
2324
static struct
2325
  {
2326
    int register_specifier;
2327
    int length;
2328
    int prefix;
2329
    int w;
2330
  }
2331
vex;
2332
static unsigned char need_vex;
2333
static unsigned char need_vex_reg;
2334
static unsigned char vex_w_done;
2335
 
2336
struct op
2337
  {
2338
    const char *name;
2339
    unsigned int len;
2340
  };
2341
 
2342
/* If we are accessing mod/rm/reg without need_modrm set, then the
2343
   values are stale.  Hitting this abort likely indicates that you
2344
   need to update onebyte_has_modrm or twobyte_has_modrm.  */
2345
#define MODRM_CHECK  if (!need_modrm) abort ()
2346
 
2347
static const char **names64;
2348
static const char **names32;
2349
static const char **names16;
2350
static const char **names8;
2351
static const char **names8rex;
2352
static const char **names_seg;
2353
static const char *index64;
2354
static const char *index32;
2355
static const char **index16;
2356
 
2357
static const char *intel_names64[] = {
2358
  "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
2359
  "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2360
};
2361
static const char *intel_names32[] = {
2362
  "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
2363
  "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
2364
};
2365
static const char *intel_names16[] = {
2366
  "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
2367
  "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
2368
};
2369
static const char *intel_names8[] = {
2370
  "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
2371
};
2372
static const char *intel_names8rex[] = {
2373
  "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
2374
  "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
2375
};
2376
static const char *intel_names_seg[] = {
2377
  "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
2378
};
2379
static const char *intel_index64 = "riz";
2380
static const char *intel_index32 = "eiz";
2381
static const char *intel_index16[] = {
2382
  "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2383
};
2384
 
2385
static const char *att_names64[] = {
2386
  "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
2387
  "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
2388
};
2389
static const char *att_names32[] = {
2390
  "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
2391
  "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
2392
};
2393
static const char *att_names16[] = {
2394
  "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
2395
  "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
2396
};
2397
static const char *att_names8[] = {
2398
  "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
2399
};
2400
static const char *att_names8rex[] = {
2401
  "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
2402
  "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
2403
};
2404
static const char *att_names_seg[] = {
2405
  "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
2406
};
2407
static const char *att_index64 = "%riz";
2408
static const char *att_index32 = "%eiz";
2409
static const char *att_index16[] = {
2410
  "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
2411
};
2412
 
2413
static const char **names_mm;
2414
static const char *intel_names_mm[] = {
2415
  "mm0", "mm1", "mm2", "mm3",
2416
  "mm4", "mm5", "mm6", "mm7"
2417
};
2418
static const char *att_names_mm[] = {
2419
  "%mm0", "%mm1", "%mm2", "%mm3",
2420
  "%mm4", "%mm5", "%mm6", "%mm7"
2421
};
2422
 
2423
static const char **names_xmm;
2424
static const char *intel_names_xmm[] = {
2425
  "xmm0", "xmm1", "xmm2", "xmm3",
2426
  "xmm4", "xmm5", "xmm6", "xmm7",
2427
  "xmm8", "xmm9", "xmm10", "xmm11",
2428
  "xmm12", "xmm13", "xmm14", "xmm15"
2429
};
2430
static const char *att_names_xmm[] = {
2431
  "%xmm0", "%xmm1", "%xmm2", "%xmm3",
2432
  "%xmm4", "%xmm5", "%xmm6", "%xmm7",
2433
  "%xmm8", "%xmm9", "%xmm10", "%xmm11",
2434
  "%xmm12", "%xmm13", "%xmm14", "%xmm15"
2435
};
2436
 
2437
static const char **names_ymm;
2438
static const char *intel_names_ymm[] = {
2439
  "ymm0", "ymm1", "ymm2", "ymm3",
2440
  "ymm4", "ymm5", "ymm6", "ymm7",
2441
  "ymm8", "ymm9", "ymm10", "ymm11",
2442
  "ymm12", "ymm13", "ymm14", "ymm15"
2443
};
2444
static const char *att_names_ymm[] = {
2445
  "%ymm0", "%ymm1", "%ymm2", "%ymm3",
2446
  "%ymm4", "%ymm5", "%ymm6", "%ymm7",
2447
  "%ymm8", "%ymm9", "%ymm10", "%ymm11",
2448
  "%ymm12", "%ymm13", "%ymm14", "%ymm15"
2449
};
2450
 
2451
static const struct dis386 reg_table[][8] = {
2452
  /* REG_80 */
2453
  {
2454 166 khays
    { "addA",   { Ebh1, Ib } },
2455
    { "orA",    { Ebh1, Ib } },
2456
    { "adcA",   { Ebh1, Ib } },
2457
    { "sbbA",   { Ebh1, Ib } },
2458
    { "andA",   { Ebh1, Ib } },
2459
    { "subA",   { Ebh1, Ib } },
2460
    { "xorA",   { Ebh1, Ib } },
2461 18 khays
    { "cmpA",   { Eb, Ib } },
2462
  },
2463
  /* REG_81 */
2464
  {
2465 166 khays
    { "addQ",   { Evh1, Iv } },
2466
    { "orQ",    { Evh1, Iv } },
2467
    { "adcQ",   { Evh1, Iv } },
2468
    { "sbbQ",   { Evh1, Iv } },
2469
    { "andQ",   { Evh1, Iv } },
2470
    { "subQ",   { Evh1, Iv } },
2471
    { "xorQ",   { Evh1, Iv } },
2472 18 khays
    { "cmpQ",   { Ev, Iv } },
2473
  },
2474
  /* REG_82 */
2475
  {
2476 166 khays
    { "addQ",   { Evh1, sIb } },
2477
    { "orQ",    { Evh1, sIb } },
2478
    { "adcQ",   { Evh1, sIb } },
2479
    { "sbbQ",   { Evh1, sIb } },
2480
    { "andQ",   { Evh1, sIb } },
2481
    { "subQ",   { Evh1, sIb } },
2482
    { "xorQ",   { Evh1, sIb } },
2483 18 khays
    { "cmpQ",   { Ev, sIb } },
2484
  },
2485
  /* REG_8F */
2486
  {
2487
    { "popU",   { stackEv } },
2488
    { XOP_8F_TABLE (XOP_09) },
2489
    { Bad_Opcode },
2490
    { Bad_Opcode },
2491
    { Bad_Opcode },
2492
    { XOP_8F_TABLE (XOP_09) },
2493
  },
2494
  /* REG_C0 */
2495
  {
2496
    { "rolA",   { Eb, Ib } },
2497
    { "rorA",   { Eb, Ib } },
2498
    { "rclA",   { Eb, Ib } },
2499
    { "rcrA",   { Eb, Ib } },
2500
    { "shlA",   { Eb, Ib } },
2501
    { "shrA",   { Eb, Ib } },
2502
    { Bad_Opcode },
2503
    { "sarA",   { Eb, Ib } },
2504
  },
2505
  /* REG_C1 */
2506
  {
2507
    { "rolQ",   { Ev, Ib } },
2508
    { "rorQ",   { Ev, Ib } },
2509
    { "rclQ",   { Ev, Ib } },
2510
    { "rcrQ",   { Ev, Ib } },
2511
    { "shlQ",   { Ev, Ib } },
2512
    { "shrQ",   { Ev, Ib } },
2513
    { Bad_Opcode },
2514
    { "sarQ",   { Ev, Ib } },
2515
  },
2516
  /* REG_C6 */
2517
  {
2518 166 khays
    { "movA",   { Ebh3, Ib } },
2519
    { Bad_Opcode },
2520
    { Bad_Opcode },
2521
    { Bad_Opcode },
2522
    { Bad_Opcode },
2523
    { Bad_Opcode },
2524
    { Bad_Opcode },
2525
    { MOD_TABLE (MOD_C6_REG_7) },
2526 18 khays
  },
2527
  /* REG_C7 */
2528
  {
2529 166 khays
    { "movQ",   { Evh3, Iv } },
2530
    { Bad_Opcode },
2531
    { Bad_Opcode },
2532
    { Bad_Opcode },
2533
    { Bad_Opcode },
2534
    { Bad_Opcode },
2535
    { Bad_Opcode },
2536
    { MOD_TABLE (MOD_C7_REG_7) },
2537 18 khays
  },
2538
  /* REG_D0 */
2539
  {
2540
    { "rolA",   { Eb, I1 } },
2541
    { "rorA",   { Eb, I1 } },
2542
    { "rclA",   { Eb, I1 } },
2543
    { "rcrA",   { Eb, I1 } },
2544
    { "shlA",   { Eb, I1 } },
2545
    { "shrA",   { Eb, I1 } },
2546
    { Bad_Opcode },
2547
    { "sarA",   { Eb, I1 } },
2548
  },
2549
  /* REG_D1 */
2550
  {
2551
    { "rolQ",   { Ev, I1 } },
2552
    { "rorQ",   { Ev, I1 } },
2553
    { "rclQ",   { Ev, I1 } },
2554
    { "rcrQ",   { Ev, I1 } },
2555
    { "shlQ",   { Ev, I1 } },
2556
    { "shrQ",   { Ev, I1 } },
2557
    { Bad_Opcode },
2558
    { "sarQ",   { Ev, I1 } },
2559
  },
2560
  /* REG_D2 */
2561
  {
2562
    { "rolA",   { Eb, CL } },
2563
    { "rorA",   { Eb, CL } },
2564
    { "rclA",   { Eb, CL } },
2565
    { "rcrA",   { Eb, CL } },
2566
    { "shlA",   { Eb, CL } },
2567
    { "shrA",   { Eb, CL } },
2568
    { Bad_Opcode },
2569
    { "sarA",   { Eb, CL } },
2570
  },
2571
  /* REG_D3 */
2572
  {
2573
    { "rolQ",   { Ev, CL } },
2574
    { "rorQ",   { Ev, CL } },
2575
    { "rclQ",   { Ev, CL } },
2576
    { "rcrQ",   { Ev, CL } },
2577
    { "shlQ",   { Ev, CL } },
2578
    { "shrQ",   { Ev, CL } },
2579
    { Bad_Opcode },
2580
    { "sarQ",   { Ev, CL } },
2581
  },
2582
  /* REG_F6 */
2583
  {
2584
    { "testA",  { Eb, Ib } },
2585
    { Bad_Opcode },
2586 166 khays
    { "notA",   { Ebh1 } },
2587
    { "negA",   { Ebh1 } },
2588 18 khays
    { "mulA",   { Eb } },       /* Don't print the implicit %al register,  */
2589
    { "imulA",  { Eb } },       /* to distinguish these opcodes from other */
2590
    { "divA",   { Eb } },       /* mul/imul opcodes.  Do the same for div  */
2591
    { "idivA",  { Eb } },       /* and idiv for consistency.               */
2592
  },
2593
  /* REG_F7 */
2594
  {
2595
    { "testQ",  { Ev, Iv } },
2596
    { Bad_Opcode },
2597 166 khays
    { "notQ",   { Evh1 } },
2598
    { "negQ",   { Evh1 } },
2599 18 khays
    { "mulQ",   { Ev } },       /* Don't print the implicit register.  */
2600
    { "imulQ",  { Ev } },
2601
    { "divQ",   { Ev } },
2602
    { "idivQ",  { Ev } },
2603
  },
2604
  /* REG_FE */
2605
  {
2606 166 khays
    { "incA",   { Ebh1 } },
2607
    { "decA",   { Ebh1 } },
2608 18 khays
  },
2609
  /* REG_FF */
2610
  {
2611 166 khays
    { "incQ",   { Evh1 } },
2612
    { "decQ",   { Evh1 } },
2613 18 khays
    { "call{T|}", { indirEv } },
2614
    { "Jcall{T|}", { indirEp } },
2615
    { "jmp{T|}", { indirEv } },
2616
    { "Jjmp{T|}", { indirEp } },
2617
    { "pushU",  { stackEv } },
2618
    { Bad_Opcode },
2619
  },
2620
  /* REG_0F00 */
2621
  {
2622
    { "sldtD",  { Sv } },
2623
    { "strD",   { Sv } },
2624
    { "lldt",   { Ew } },
2625
    { "ltr",    { Ew } },
2626
    { "verr",   { Ew } },
2627
    { "verw",   { Ew } },
2628
    { Bad_Opcode },
2629
    { Bad_Opcode },
2630
  },
2631
  /* REG_0F01 */
2632
  {
2633
    { MOD_TABLE (MOD_0F01_REG_0) },
2634
    { MOD_TABLE (MOD_0F01_REG_1) },
2635
    { MOD_TABLE (MOD_0F01_REG_2) },
2636
    { MOD_TABLE (MOD_0F01_REG_3) },
2637
    { "smswD",  { Sv } },
2638
    { Bad_Opcode },
2639
    { "lmsw",   { Ew } },
2640
    { MOD_TABLE (MOD_0F01_REG_7) },
2641
  },
2642
  /* REG_0F0D */
2643
  {
2644
    { "prefetch",       { Mb } },
2645
    { "prefetchw",      { Mb } },
2646
  },
2647
  /* REG_0F18 */
2648
  {
2649
    { MOD_TABLE (MOD_0F18_REG_0) },
2650
    { MOD_TABLE (MOD_0F18_REG_1) },
2651
    { MOD_TABLE (MOD_0F18_REG_2) },
2652
    { MOD_TABLE (MOD_0F18_REG_3) },
2653
  },
2654
  /* REG_0F71 */
2655
  {
2656
    { Bad_Opcode },
2657
    { Bad_Opcode },
2658
    { MOD_TABLE (MOD_0F71_REG_2) },
2659
    { Bad_Opcode },
2660
    { MOD_TABLE (MOD_0F71_REG_4) },
2661
    { Bad_Opcode },
2662
    { MOD_TABLE (MOD_0F71_REG_6) },
2663
  },
2664
  /* REG_0F72 */
2665
  {
2666
    { Bad_Opcode },
2667
    { Bad_Opcode },
2668
    { MOD_TABLE (MOD_0F72_REG_2) },
2669
    { Bad_Opcode },
2670
    { MOD_TABLE (MOD_0F72_REG_4) },
2671
    { Bad_Opcode },
2672
    { MOD_TABLE (MOD_0F72_REG_6) },
2673
  },
2674
  /* REG_0F73 */
2675
  {
2676
    { Bad_Opcode },
2677
    { Bad_Opcode },
2678
    { MOD_TABLE (MOD_0F73_REG_2) },
2679
    { MOD_TABLE (MOD_0F73_REG_3) },
2680
    { Bad_Opcode },
2681
    { Bad_Opcode },
2682
    { MOD_TABLE (MOD_0F73_REG_6) },
2683
    { MOD_TABLE (MOD_0F73_REG_7) },
2684
  },
2685
  /* REG_0FA6 */
2686
  {
2687
    { "montmul",        { { OP_0f07, 0 } } },
2688
    { "xsha1",          { { OP_0f07, 0 } } },
2689
    { "xsha256",        { { OP_0f07, 0 } } },
2690
  },
2691
  /* REG_0FA7 */
2692
  {
2693
    { "xstore-rng",     { { OP_0f07, 0 } } },
2694
    { "xcrypt-ecb",     { { OP_0f07, 0 } } },
2695
    { "xcrypt-cbc",     { { OP_0f07, 0 } } },
2696
    { "xcrypt-ctr",     { { OP_0f07, 0 } } },
2697
    { "xcrypt-cfb",     { { OP_0f07, 0 } } },
2698
    { "xcrypt-ofb",     { { OP_0f07, 0 } } },
2699
  },
2700
  /* REG_0FAE */
2701
  {
2702
    { MOD_TABLE (MOD_0FAE_REG_0) },
2703
    { MOD_TABLE (MOD_0FAE_REG_1) },
2704
    { MOD_TABLE (MOD_0FAE_REG_2) },
2705
    { MOD_TABLE (MOD_0FAE_REG_3) },
2706
    { MOD_TABLE (MOD_0FAE_REG_4) },
2707
    { MOD_TABLE (MOD_0FAE_REG_5) },
2708
    { MOD_TABLE (MOD_0FAE_REG_6) },
2709
    { MOD_TABLE (MOD_0FAE_REG_7) },
2710
  },
2711
  /* REG_0FBA */
2712
  {
2713
    { Bad_Opcode },
2714
    { Bad_Opcode },
2715
    { Bad_Opcode },
2716
    { Bad_Opcode },
2717
    { "btQ",    { Ev, Ib } },
2718 166 khays
    { "btsQ",   { Evh1, Ib } },
2719
    { "btrQ",   { Evh1, Ib } },
2720
    { "btcQ",   { Evh1, Ib } },
2721 18 khays
  },
2722
  /* REG_0FC7 */
2723
  {
2724
    { Bad_Opcode },
2725
    { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } } },
2726
    { Bad_Opcode },
2727
    { Bad_Opcode },
2728
    { Bad_Opcode },
2729
    { Bad_Opcode },
2730
    { MOD_TABLE (MOD_0FC7_REG_6) },
2731
    { MOD_TABLE (MOD_0FC7_REG_7) },
2732
  },
2733
  /* REG_VEX_0F71 */
2734
  {
2735
    { Bad_Opcode },
2736
    { Bad_Opcode },
2737
    { MOD_TABLE (MOD_VEX_0F71_REG_2) },
2738
    { Bad_Opcode },
2739
    { MOD_TABLE (MOD_VEX_0F71_REG_4) },
2740
    { Bad_Opcode },
2741
    { MOD_TABLE (MOD_VEX_0F71_REG_6) },
2742
  },
2743
  /* REG_VEX_0F72 */
2744
  {
2745
    { Bad_Opcode },
2746
    { Bad_Opcode },
2747
    { MOD_TABLE (MOD_VEX_0F72_REG_2) },
2748
    { Bad_Opcode },
2749
    { MOD_TABLE (MOD_VEX_0F72_REG_4) },
2750
    { Bad_Opcode },
2751
    { MOD_TABLE (MOD_VEX_0F72_REG_6) },
2752
  },
2753
  /* REG_VEX_0F73 */
2754
  {
2755
    { Bad_Opcode },
2756
    { Bad_Opcode },
2757
    { MOD_TABLE (MOD_VEX_0F73_REG_2) },
2758
    { MOD_TABLE (MOD_VEX_0F73_REG_3) },
2759
    { Bad_Opcode },
2760
    { Bad_Opcode },
2761
    { MOD_TABLE (MOD_VEX_0F73_REG_6) },
2762
    { MOD_TABLE (MOD_VEX_0F73_REG_7) },
2763
  },
2764
  /* REG_VEX_0FAE */
2765
  {
2766
    { Bad_Opcode },
2767
    { Bad_Opcode },
2768
    { MOD_TABLE (MOD_VEX_0FAE_REG_2) },
2769
    { MOD_TABLE (MOD_VEX_0FAE_REG_3) },
2770
  },
2771
  /* REG_VEX_0F38F3 */
2772
  {
2773
    { Bad_Opcode },
2774
    { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_1) },
2775
    { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_2) },
2776
    { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_3) },
2777
  },
2778
  /* REG_XOP_LWPCB */
2779
  {
2780
    { "llwpcb", { { OP_LWPCB_E, 0 } } },
2781
    { "slwpcb", { { OP_LWPCB_E, 0 } } },
2782
  },
2783
  /* REG_XOP_LWP */
2784
  {
2785
    { "lwpins", { { OP_LWP_E, 0 }, Ed, Iq } },
2786
    { "lwpval", { { OP_LWP_E, 0 }, Ed, Iq } },
2787
  },
2788
  /* REG_XOP_TBM_01 */
2789
  {
2790
    { Bad_Opcode },
2791
    { "blcfill",        { { OP_LWP_E, 0 }, Ev } },
2792
    { "blsfill",        { { OP_LWP_E, 0 }, Ev } },
2793
    { "blcs",   { { OP_LWP_E, 0 }, Ev } },
2794
    { "tzmsk",  { { OP_LWP_E, 0 }, Ev } },
2795
    { "blcic",  { { OP_LWP_E, 0 }, Ev } },
2796
    { "blsic",  { { OP_LWP_E, 0 }, Ev } },
2797
    { "t1mskc", { { OP_LWP_E, 0 }, Ev } },
2798
  },
2799
  /* REG_XOP_TBM_02 */
2800
  {
2801
    { Bad_Opcode },
2802
    { "blcmsk", { { OP_LWP_E, 0 }, Ev } },
2803
    { Bad_Opcode },
2804
    { Bad_Opcode },
2805
    { Bad_Opcode },
2806
    { Bad_Opcode },
2807
    { "blci",   { { OP_LWP_E, 0 }, Ev } },
2808
  },
2809
};
2810
 
2811
static const struct dis386 prefix_table[][4] = {
2812
  /* PREFIX_90 */
2813
  {
2814
    { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
2815
    { "pause", { XX } },
2816
    { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
2817
  },
2818
 
2819
  /* PREFIX_0F10 */
2820
  {
2821
    { "movups", { XM, EXx } },
2822
    { "movss",  { XM, EXd } },
2823
    { "movupd", { XM, EXx } },
2824
    { "movsd",  { XM, EXq } },
2825
  },
2826
 
2827
  /* PREFIX_0F11 */
2828
  {
2829
    { "movups", { EXxS, XM } },
2830
    { "movss",  { EXdS, XM } },
2831
    { "movupd", { EXxS, XM } },
2832
    { "movsd",  { EXqS, XM } },
2833
  },
2834
 
2835
  /* PREFIX_0F12 */
2836
  {
2837
    { MOD_TABLE (MOD_0F12_PREFIX_0) },
2838
    { "movsldup", { XM, EXx } },
2839
    { "movlpd", { XM, EXq } },
2840
    { "movddup", { XM, EXq } },
2841
  },
2842
 
2843
  /* PREFIX_0F16 */
2844
  {
2845
    { MOD_TABLE (MOD_0F16_PREFIX_0) },
2846
    { "movshdup", { XM, EXx } },
2847
    { "movhpd", { XM, EXq } },
2848
  },
2849
 
2850
  /* PREFIX_0F2A */
2851
  {
2852
    { "cvtpi2ps", { XM, EMCq } },
2853
    { "cvtsi2ss%LQ", { XM, Ev } },
2854
    { "cvtpi2pd", { XM, EMCq } },
2855
    { "cvtsi2sd%LQ", { XM, Ev } },
2856
  },
2857
 
2858
  /* PREFIX_0F2B */
2859
  {
2860
    { MOD_TABLE (MOD_0F2B_PREFIX_0) },
2861
    { MOD_TABLE (MOD_0F2B_PREFIX_1) },
2862
    { MOD_TABLE (MOD_0F2B_PREFIX_2) },
2863
    { MOD_TABLE (MOD_0F2B_PREFIX_3) },
2864
  },
2865
 
2866
  /* PREFIX_0F2C */
2867
  {
2868
    { "cvttps2pi", { MXC, EXq } },
2869
    { "cvttss2siY", { Gv, EXd } },
2870
    { "cvttpd2pi", { MXC, EXx } },
2871
    { "cvttsd2siY", { Gv, EXq } },
2872
  },
2873
 
2874
  /* PREFIX_0F2D */
2875
  {
2876
    { "cvtps2pi", { MXC, EXq } },
2877
    { "cvtss2siY", { Gv, EXd } },
2878
    { "cvtpd2pi", { MXC, EXx } },
2879
    { "cvtsd2siY", { Gv, EXq } },
2880
  },
2881
 
2882
  /* PREFIX_0F2E */
2883
  {
2884
    { "ucomiss",{ XM, EXd } },
2885
    { Bad_Opcode },
2886
    { "ucomisd",{ XM, EXq } },
2887
  },
2888
 
2889
  /* PREFIX_0F2F */
2890
  {
2891
    { "comiss", { XM, EXd } },
2892
    { Bad_Opcode },
2893
    { "comisd", { XM, EXq } },
2894
  },
2895
 
2896
  /* PREFIX_0F51 */
2897
  {
2898
    { "sqrtps", { XM, EXx } },
2899
    { "sqrtss", { XM, EXd } },
2900
    { "sqrtpd", { XM, EXx } },
2901
    { "sqrtsd", { XM, EXq } },
2902
  },
2903
 
2904
  /* PREFIX_0F52 */
2905
  {
2906
    { "rsqrtps",{ XM, EXx } },
2907
    { "rsqrtss",{ XM, EXd } },
2908
  },
2909
 
2910
  /* PREFIX_0F53 */
2911
  {
2912
    { "rcpps",  { XM, EXx } },
2913
    { "rcpss",  { XM, EXd } },
2914
  },
2915
 
2916
  /* PREFIX_0F58 */
2917
  {
2918
    { "addps", { XM, EXx } },
2919
    { "addss", { XM, EXd } },
2920
    { "addpd", { XM, EXx } },
2921
    { "addsd", { XM, EXq } },
2922
  },
2923
 
2924
  /* PREFIX_0F59 */
2925
  {
2926
    { "mulps",  { XM, EXx } },
2927
    { "mulss",  { XM, EXd } },
2928
    { "mulpd",  { XM, EXx } },
2929
    { "mulsd",  { XM, EXq } },
2930
  },
2931
 
2932
  /* PREFIX_0F5A */
2933
  {
2934
    { "cvtps2pd", { XM, EXq } },
2935
    { "cvtss2sd", { XM, EXd } },
2936
    { "cvtpd2ps", { XM, EXx } },
2937
    { "cvtsd2ss", { XM, EXq } },
2938
  },
2939
 
2940
  /* PREFIX_0F5B */
2941
  {
2942
    { "cvtdq2ps", { XM, EXx } },
2943
    { "cvttps2dq", { XM, EXx } },
2944
    { "cvtps2dq", { XM, EXx } },
2945
  },
2946
 
2947
  /* PREFIX_0F5C */
2948
  {
2949
    { "subps",  { XM, EXx } },
2950
    { "subss",  { XM, EXd } },
2951
    { "subpd",  { XM, EXx } },
2952
    { "subsd",  { XM, EXq } },
2953
  },
2954
 
2955
  /* PREFIX_0F5D */
2956
  {
2957
    { "minps",  { XM, EXx } },
2958
    { "minss",  { XM, EXd } },
2959
    { "minpd",  { XM, EXx } },
2960
    { "minsd",  { XM, EXq } },
2961
  },
2962
 
2963
  /* PREFIX_0F5E */
2964
  {
2965
    { "divps",  { XM, EXx } },
2966
    { "divss",  { XM, EXd } },
2967
    { "divpd",  { XM, EXx } },
2968
    { "divsd",  { XM, EXq } },
2969
  },
2970
 
2971
  /* PREFIX_0F5F */
2972
  {
2973
    { "maxps",  { XM, EXx } },
2974
    { "maxss",  { XM, EXd } },
2975
    { "maxpd",  { XM, EXx } },
2976
    { "maxsd",  { XM, EXq } },
2977
  },
2978
 
2979
  /* PREFIX_0F60 */
2980
  {
2981
    { "punpcklbw",{ MX, EMd } },
2982
    { Bad_Opcode },
2983
    { "punpcklbw",{ MX, EMx } },
2984
  },
2985
 
2986
  /* PREFIX_0F61 */
2987
  {
2988
    { "punpcklwd",{ MX, EMd } },
2989
    { Bad_Opcode },
2990
    { "punpcklwd",{ MX, EMx } },
2991
  },
2992
 
2993
  /* PREFIX_0F62 */
2994
  {
2995
    { "punpckldq",{ MX, EMd } },
2996
    { Bad_Opcode },
2997
    { "punpckldq",{ MX, EMx } },
2998
  },
2999
 
3000
  /* PREFIX_0F6C */
3001
  {
3002
    { Bad_Opcode },
3003
    { Bad_Opcode },
3004
    { "punpcklqdq", { XM, EXx } },
3005
  },
3006
 
3007
  /* PREFIX_0F6D */
3008
  {
3009
    { Bad_Opcode },
3010
    { Bad_Opcode },
3011
    { "punpckhqdq", { XM, EXx } },
3012
  },
3013
 
3014
  /* PREFIX_0F6F */
3015
  {
3016
    { "movq",   { MX, EM } },
3017
    { "movdqu", { XM, EXx } },
3018
    { "movdqa", { XM, EXx } },
3019
  },
3020
 
3021
  /* PREFIX_0F70 */
3022
  {
3023
    { "pshufw", { MX, EM, Ib } },
3024
    { "pshufhw",{ XM, EXx, Ib } },
3025
    { "pshufd", { XM, EXx, Ib } },
3026
    { "pshuflw",{ XM, EXx, Ib } },
3027
  },
3028
 
3029
  /* PREFIX_0F73_REG_3 */
3030
  {
3031
    { Bad_Opcode },
3032
    { Bad_Opcode },
3033
    { "psrldq", { XS, Ib } },
3034
  },
3035
 
3036
  /* PREFIX_0F73_REG_7 */
3037
  {
3038
    { Bad_Opcode },
3039
    { Bad_Opcode },
3040
    { "pslldq", { XS, Ib } },
3041
  },
3042
 
3043
  /* PREFIX_0F78 */
3044
  {
3045
    {"vmread",  { Em, Gm } },
3046
    { Bad_Opcode },
3047
    {"extrq",   { XS, Ib, Ib } },
3048
    {"insertq", { XM, XS, Ib, Ib } },
3049
  },
3050
 
3051
  /* PREFIX_0F79 */
3052
  {
3053
    {"vmwrite", { Gm, Em } },
3054
    { Bad_Opcode },
3055
    {"extrq",   { XM, XS } },
3056
    {"insertq", { XM, XS } },
3057
  },
3058
 
3059
  /* PREFIX_0F7C */
3060
  {
3061
    { Bad_Opcode },
3062
    { Bad_Opcode },
3063
    { "haddpd", { XM, EXx } },
3064
    { "haddps", { XM, EXx } },
3065
  },
3066
 
3067
  /* PREFIX_0F7D */
3068
  {
3069
    { Bad_Opcode },
3070
    { Bad_Opcode },
3071
    { "hsubpd", { XM, EXx } },
3072
    { "hsubps", { XM, EXx } },
3073
  },
3074
 
3075
  /* PREFIX_0F7E */
3076
  {
3077
    { "movK",   { Edq, MX } },
3078
    { "movq",   { XM, EXq } },
3079
    { "movK",   { Edq, XM } },
3080
  },
3081
 
3082
  /* PREFIX_0F7F */
3083
  {
3084
    { "movq",   { EMS, MX } },
3085
    { "movdqu", { EXxS, XM } },
3086
    { "movdqa", { EXxS, XM } },
3087
  },
3088
 
3089
  /* PREFIX_0FAE_REG_0 */
3090
  {
3091
    { Bad_Opcode },
3092
    { "rdfsbase", { Ev } },
3093
  },
3094
 
3095
  /* PREFIX_0FAE_REG_1 */
3096
  {
3097
    { Bad_Opcode },
3098
    { "rdgsbase", { Ev } },
3099
  },
3100
 
3101
  /* PREFIX_0FAE_REG_2 */
3102
  {
3103
    { Bad_Opcode },
3104
    { "wrfsbase", { Ev } },
3105
  },
3106
 
3107
  /* PREFIX_0FAE_REG_3 */
3108
  {
3109
    { Bad_Opcode },
3110
    { "wrgsbase", { Ev } },
3111
  },
3112
 
3113
  /* PREFIX_0FB8 */
3114
  {
3115
    { Bad_Opcode },
3116
    { "popcntS", { Gv, Ev } },
3117
  },
3118
 
3119
  /* PREFIX_0FBC */
3120
  {
3121
    { "bsfS",   { Gv, Ev } },
3122
    { "tzcntS", { Gv, Ev } },
3123
    { "bsfS",   { Gv, Ev } },
3124
  },
3125
 
3126
  /* PREFIX_0FBD */
3127
  {
3128
    { "bsrS",   { Gv, Ev } },
3129
    { "lzcntS", { Gv, Ev } },
3130
    { "bsrS",   { Gv, Ev } },
3131
  },
3132
 
3133
  /* PREFIX_0FC2 */
3134
  {
3135
    { "cmpps",  { XM, EXx, CMP } },
3136
    { "cmpss",  { XM, EXd, CMP } },
3137
    { "cmppd",  { XM, EXx, CMP } },
3138
    { "cmpsd",  { XM, EXq, CMP } },
3139
  },
3140
 
3141
  /* PREFIX_0FC3 */
3142
  {
3143
    { "movntiS", { Ma, Gv } },
3144
  },
3145
 
3146
  /* PREFIX_0FC7_REG_6 */
3147
  {
3148
    { "vmptrld",{ Mq } },
3149
    { "vmxon",  { Mq } },
3150
    { "vmclear",{ Mq } },
3151
  },
3152
 
3153
  /* PREFIX_0FD0 */
3154
  {
3155
    { Bad_Opcode },
3156
    { Bad_Opcode },
3157
    { "addsubpd", { XM, EXx } },
3158
    { "addsubps", { XM, EXx } },
3159
  },
3160
 
3161
  /* PREFIX_0FD6 */
3162
  {
3163
    { Bad_Opcode },
3164
    { "movq2dq",{ XM, MS } },
3165
    { "movq",   { EXqS, XM } },
3166
    { "movdq2q",{ MX, XS } },
3167
  },
3168
 
3169
  /* PREFIX_0FE6 */
3170
  {
3171
    { Bad_Opcode },
3172
    { "cvtdq2pd", { XM, EXq } },
3173
    { "cvttpd2dq", { XM, EXx } },
3174
    { "cvtpd2dq", { XM, EXx } },
3175
  },
3176
 
3177
  /* PREFIX_0FE7 */
3178
  {
3179
    { "movntq", { Mq, MX } },
3180
    { Bad_Opcode },
3181
    { MOD_TABLE (MOD_0FE7_PREFIX_2) },
3182
  },
3183
 
3184
  /* PREFIX_0FF0 */
3185
  {
3186
    { Bad_Opcode },
3187
    { Bad_Opcode },
3188
    { Bad_Opcode },
3189
    { MOD_TABLE (MOD_0FF0_PREFIX_3) },
3190
  },
3191
 
3192
  /* PREFIX_0FF7 */
3193
  {
3194
    { "maskmovq", { MX, MS } },
3195
    { Bad_Opcode },
3196
    { "maskmovdqu", { XM, XS } },
3197
  },
3198
 
3199
  /* PREFIX_0F3810 */
3200
  {
3201
    { Bad_Opcode },
3202
    { Bad_Opcode },
3203
    { "pblendvb", { XM, EXx, XMM0 } },
3204
  },
3205
 
3206
  /* PREFIX_0F3814 */
3207
  {
3208
    { Bad_Opcode },
3209
    { Bad_Opcode },
3210
    { "blendvps", { XM, EXx, XMM0 } },
3211
  },
3212
 
3213
  /* PREFIX_0F3815 */
3214
  {
3215
    { Bad_Opcode },
3216
    { Bad_Opcode },
3217
    { "blendvpd", { XM, EXx, XMM0 } },
3218
  },
3219
 
3220
  /* PREFIX_0F3817 */
3221
  {
3222
    { Bad_Opcode },
3223
    { Bad_Opcode },
3224
    { "ptest",  { XM, EXx } },
3225
  },
3226
 
3227
  /* PREFIX_0F3820 */
3228
  {
3229
    { Bad_Opcode },
3230
    { Bad_Opcode },
3231
    { "pmovsxbw", { XM, EXq } },
3232
  },
3233
 
3234
  /* PREFIX_0F3821 */
3235
  {
3236
    { Bad_Opcode },
3237
    { Bad_Opcode },
3238
    { "pmovsxbd", { XM, EXd } },
3239
  },
3240
 
3241
  /* PREFIX_0F3822 */
3242
  {
3243
    { Bad_Opcode },
3244
    { Bad_Opcode },
3245
    { "pmovsxbq", { XM, EXw } },
3246
  },
3247
 
3248
  /* PREFIX_0F3823 */
3249
  {
3250
    { Bad_Opcode },
3251
    { Bad_Opcode },
3252
    { "pmovsxwd", { XM, EXq } },
3253
  },
3254
 
3255
  /* PREFIX_0F3824 */
3256
  {
3257
    { Bad_Opcode },
3258
    { Bad_Opcode },
3259
    { "pmovsxwq", { XM, EXd } },
3260
  },
3261
 
3262
  /* PREFIX_0F3825 */
3263
  {
3264
    { Bad_Opcode },
3265
    { Bad_Opcode },
3266
    { "pmovsxdq", { XM, EXq } },
3267
  },
3268
 
3269
  /* PREFIX_0F3828 */
3270
  {
3271
    { Bad_Opcode },
3272
    { Bad_Opcode },
3273
    { "pmuldq", { XM, EXx } },
3274
  },
3275
 
3276
  /* PREFIX_0F3829 */
3277
  {
3278
    { Bad_Opcode },
3279
    { Bad_Opcode },
3280
    { "pcmpeqq", { XM, EXx } },
3281
  },
3282
 
3283
  /* PREFIX_0F382A */
3284
  {
3285
    { Bad_Opcode },
3286
    { Bad_Opcode },
3287
    { MOD_TABLE (MOD_0F382A_PREFIX_2) },
3288
  },
3289
 
3290
  /* PREFIX_0F382B */
3291
  {
3292
    { Bad_Opcode },
3293
    { Bad_Opcode },
3294
    { "packusdw", { XM, EXx } },
3295
  },
3296
 
3297
  /* PREFIX_0F3830 */
3298
  {
3299
    { Bad_Opcode },
3300
    { Bad_Opcode },
3301
    { "pmovzxbw", { XM, EXq } },
3302
  },
3303
 
3304
  /* PREFIX_0F3831 */
3305
  {
3306
    { Bad_Opcode },
3307
    { Bad_Opcode },
3308
    { "pmovzxbd", { XM, EXd } },
3309
  },
3310
 
3311
  /* PREFIX_0F3832 */
3312
  {
3313
    { Bad_Opcode },
3314
    { Bad_Opcode },
3315
    { "pmovzxbq", { XM, EXw } },
3316
  },
3317
 
3318
  /* PREFIX_0F3833 */
3319
  {
3320
    { Bad_Opcode },
3321
    { Bad_Opcode },
3322
    { "pmovzxwd", { XM, EXq } },
3323
  },
3324
 
3325
  /* PREFIX_0F3834 */
3326
  {
3327
    { Bad_Opcode },
3328
    { Bad_Opcode },
3329
    { "pmovzxwq", { XM, EXd } },
3330
  },
3331
 
3332
  /* PREFIX_0F3835 */
3333
  {
3334
    { Bad_Opcode },
3335
    { Bad_Opcode },
3336
    { "pmovzxdq", { XM, EXq } },
3337
  },
3338
 
3339
  /* PREFIX_0F3837 */
3340
  {
3341
    { Bad_Opcode },
3342
    { Bad_Opcode },
3343
    { "pcmpgtq", { XM, EXx } },
3344
  },
3345
 
3346
  /* PREFIX_0F3838 */
3347
  {
3348
    { Bad_Opcode },
3349
    { Bad_Opcode },
3350
    { "pminsb", { XM, EXx } },
3351
  },
3352
 
3353
  /* PREFIX_0F3839 */
3354
  {
3355
    { Bad_Opcode },
3356
    { Bad_Opcode },
3357
    { "pminsd", { XM, EXx } },
3358
  },
3359
 
3360
  /* PREFIX_0F383A */
3361
  {
3362
    { Bad_Opcode },
3363
    { Bad_Opcode },
3364
    { "pminuw", { XM, EXx } },
3365
  },
3366
 
3367
  /* PREFIX_0F383B */
3368
  {
3369
    { Bad_Opcode },
3370
    { Bad_Opcode },
3371
    { "pminud", { XM, EXx } },
3372
  },
3373
 
3374
  /* PREFIX_0F383C */
3375
  {
3376
    { Bad_Opcode },
3377
    { Bad_Opcode },
3378
    { "pmaxsb", { XM, EXx } },
3379
  },
3380
 
3381
  /* PREFIX_0F383D */
3382
  {
3383
    { Bad_Opcode },
3384
    { Bad_Opcode },
3385
    { "pmaxsd", { XM, EXx } },
3386
  },
3387
 
3388
  /* PREFIX_0F383E */
3389
  {
3390
    { Bad_Opcode },
3391
    { Bad_Opcode },
3392
    { "pmaxuw", { XM, EXx } },
3393
  },
3394
 
3395
  /* PREFIX_0F383F */
3396
  {
3397
    { Bad_Opcode },
3398
    { Bad_Opcode },
3399
    { "pmaxud", { XM, EXx } },
3400
  },
3401
 
3402
  /* PREFIX_0F3840 */
3403
  {
3404
    { Bad_Opcode },
3405
    { Bad_Opcode },
3406
    { "pmulld", { XM, EXx } },
3407
  },
3408
 
3409
  /* PREFIX_0F3841 */
3410
  {
3411
    { Bad_Opcode },
3412
    { Bad_Opcode },
3413
    { "phminposuw", { XM, EXx } },
3414
  },
3415
 
3416
  /* PREFIX_0F3880 */
3417
  {
3418
    { Bad_Opcode },
3419
    { Bad_Opcode },
3420
    { "invept", { Gm, Mo } },
3421
  },
3422
 
3423
  /* PREFIX_0F3881 */
3424
  {
3425
    { Bad_Opcode },
3426
    { Bad_Opcode },
3427
    { "invvpid", { Gm, Mo } },
3428
  },
3429
 
3430 148 khays
  /* PREFIX_0F3882 */
3431
  {
3432
    { Bad_Opcode },
3433
    { Bad_Opcode },
3434
    { "invpcid", { Gm, M } },
3435
  },
3436
 
3437 18 khays
  /* PREFIX_0F38DB */
3438
  {
3439
    { Bad_Opcode },
3440
    { Bad_Opcode },
3441
    { "aesimc", { XM, EXx } },
3442
  },
3443
 
3444
  /* PREFIX_0F38DC */
3445
  {
3446
    { Bad_Opcode },
3447
    { Bad_Opcode },
3448
    { "aesenc", { XM, EXx } },
3449
  },
3450
 
3451
  /* PREFIX_0F38DD */
3452
  {
3453
    { Bad_Opcode },
3454
    { Bad_Opcode },
3455
    { "aesenclast", { XM, EXx } },
3456
  },
3457
 
3458
  /* PREFIX_0F38DE */
3459
  {
3460
    { Bad_Opcode },
3461
    { Bad_Opcode },
3462
    { "aesdec", { XM, EXx } },
3463
  },
3464
 
3465
  /* PREFIX_0F38DF */
3466
  {
3467
    { Bad_Opcode },
3468
    { Bad_Opcode },
3469
    { "aesdeclast", { XM, EXx } },
3470
  },
3471
 
3472
  /* PREFIX_0F38F0 */
3473
  {
3474
    { "movbeS", { Gv, { MOVBE_Fixup, v_mode } } },
3475
    { Bad_Opcode },
3476
    { "movbeS", { Gv, { MOVBE_Fixup, v_mode } } },
3477
    { "crc32",  { Gdq, { CRC32_Fixup, b_mode } } },
3478
  },
3479
 
3480
  /* PREFIX_0F38F1 */
3481
  {
3482
    { "movbeS", { { MOVBE_Fixup, v_mode }, Gv } },
3483
    { Bad_Opcode },
3484
    { "movbeS", { { MOVBE_Fixup, v_mode }, Gv } },
3485
    { "crc32",  { Gdq, { CRC32_Fixup, v_mode } } },
3486
  },
3487
 
3488
  /* PREFIX_0F3A08 */
3489
  {
3490
    { Bad_Opcode },
3491
    { Bad_Opcode },
3492
    { "roundps", { XM, EXx, Ib } },
3493
  },
3494
 
3495
  /* PREFIX_0F3A09 */
3496
  {
3497
    { Bad_Opcode },
3498
    { Bad_Opcode },
3499
    { "roundpd", { XM, EXx, Ib } },
3500
  },
3501
 
3502
  /* PREFIX_0F3A0A */
3503
  {
3504
    { Bad_Opcode },
3505
    { Bad_Opcode },
3506
    { "roundss", { XM, EXd, Ib } },
3507
  },
3508
 
3509
  /* PREFIX_0F3A0B */
3510
  {
3511
    { Bad_Opcode },
3512
    { Bad_Opcode },
3513
    { "roundsd", { XM, EXq, Ib } },
3514
  },
3515
 
3516
  /* PREFIX_0F3A0C */
3517
  {
3518
    { Bad_Opcode },
3519
    { Bad_Opcode },
3520
    { "blendps", { XM, EXx, Ib } },
3521
  },
3522
 
3523
  /* PREFIX_0F3A0D */
3524
  {
3525
    { Bad_Opcode },
3526
    { Bad_Opcode },
3527
    { "blendpd", { XM, EXx, Ib } },
3528
  },
3529
 
3530
  /* PREFIX_0F3A0E */
3531
  {
3532
    { Bad_Opcode },
3533
    { Bad_Opcode },
3534
    { "pblendw", { XM, EXx, Ib } },
3535
  },
3536
 
3537
  /* PREFIX_0F3A14 */
3538
  {
3539
    { Bad_Opcode },
3540
    { Bad_Opcode },
3541
    { "pextrb", { Edqb, XM, Ib } },
3542
  },
3543
 
3544
  /* PREFIX_0F3A15 */
3545
  {
3546
    { Bad_Opcode },
3547
    { Bad_Opcode },
3548
    { "pextrw", { Edqw, XM, Ib } },
3549
  },
3550
 
3551
  /* PREFIX_0F3A16 */
3552
  {
3553
    { Bad_Opcode },
3554
    { Bad_Opcode },
3555
    { "pextrK", { Edq, XM, Ib } },
3556
  },
3557
 
3558
  /* PREFIX_0F3A17 */
3559
  {
3560
    { Bad_Opcode },
3561
    { Bad_Opcode },
3562
    { "extractps", { Edqd, XM, Ib } },
3563
  },
3564
 
3565
  /* PREFIX_0F3A20 */
3566
  {
3567
    { Bad_Opcode },
3568
    { Bad_Opcode },
3569
    { "pinsrb", { XM, Edqb, Ib } },
3570
  },
3571
 
3572
  /* PREFIX_0F3A21 */
3573
  {
3574
    { Bad_Opcode },
3575
    { Bad_Opcode },
3576
    { "insertps", { XM, EXd, Ib } },
3577
  },
3578
 
3579
  /* PREFIX_0F3A22 */
3580
  {
3581
    { Bad_Opcode },
3582
    { Bad_Opcode },
3583
    { "pinsrK", { XM, Edq, Ib } },
3584
  },
3585
 
3586
  /* PREFIX_0F3A40 */
3587
  {
3588
    { Bad_Opcode },
3589
    { Bad_Opcode },
3590
    { "dpps",   { XM, EXx, Ib } },
3591
  },
3592
 
3593
  /* PREFIX_0F3A41 */
3594
  {
3595
    { Bad_Opcode },
3596
    { Bad_Opcode },
3597
    { "dppd",   { XM, EXx, Ib } },
3598
  },
3599
 
3600
  /* PREFIX_0F3A42 */
3601
  {
3602
    { Bad_Opcode },
3603
    { Bad_Opcode },
3604
    { "mpsadbw", { XM, EXx, Ib } },
3605
  },
3606
 
3607
  /* PREFIX_0F3A44 */
3608
  {
3609
    { Bad_Opcode },
3610
    { Bad_Opcode },
3611
    { "pclmulqdq", { XM, EXx, PCLMUL } },
3612
  },
3613
 
3614
  /* PREFIX_0F3A60 */
3615
  {
3616
    { Bad_Opcode },
3617
    { Bad_Opcode },
3618
    { "pcmpestrm", { XM, EXx, Ib } },
3619
  },
3620
 
3621
  /* PREFIX_0F3A61 */
3622
  {
3623
    { Bad_Opcode },
3624
    { Bad_Opcode },
3625
    { "pcmpestri", { XM, EXx, Ib } },
3626
  },
3627
 
3628
  /* PREFIX_0F3A62 */
3629
  {
3630
    { Bad_Opcode },
3631
    { Bad_Opcode },
3632
    { "pcmpistrm", { XM, EXx, Ib } },
3633
  },
3634
 
3635
  /* PREFIX_0F3A63 */
3636
  {
3637
    { Bad_Opcode },
3638
    { Bad_Opcode },
3639
    { "pcmpistri", { XM, EXx, Ib } },
3640
  },
3641
 
3642
  /* PREFIX_0F3ADF */
3643
  {
3644
    { Bad_Opcode },
3645
    { Bad_Opcode },
3646
    { "aeskeygenassist", { XM, EXx, Ib } },
3647
  },
3648
 
3649
  /* PREFIX_VEX_0F10 */
3650
  {
3651
    { VEX_W_TABLE (VEX_W_0F10_P_0) },
3652
    { VEX_LEN_TABLE (VEX_LEN_0F10_P_1) },
3653
    { VEX_W_TABLE (VEX_W_0F10_P_2) },
3654
    { VEX_LEN_TABLE (VEX_LEN_0F10_P_3) },
3655
  },
3656
 
3657
  /* PREFIX_VEX_0F11 */
3658
  {
3659
    { VEX_W_TABLE (VEX_W_0F11_P_0) },
3660
    { VEX_LEN_TABLE (VEX_LEN_0F11_P_1) },
3661
    { VEX_W_TABLE (VEX_W_0F11_P_2) },
3662
    { VEX_LEN_TABLE (VEX_LEN_0F11_P_3) },
3663
  },
3664
 
3665
  /* PREFIX_VEX_0F12 */
3666
  {
3667
    { MOD_TABLE (MOD_VEX_0F12_PREFIX_0) },
3668
    { VEX_W_TABLE (VEX_W_0F12_P_1) },
3669
    { VEX_LEN_TABLE (VEX_LEN_0F12_P_2) },
3670
    { VEX_W_TABLE (VEX_W_0F12_P_3) },
3671
  },
3672
 
3673
  /* PREFIX_VEX_0F16 */
3674
  {
3675
    { MOD_TABLE (MOD_VEX_0F16_PREFIX_0) },
3676
    { VEX_W_TABLE (VEX_W_0F16_P_1) },
3677
    { VEX_LEN_TABLE (VEX_LEN_0F16_P_2) },
3678
  },
3679
 
3680
  /* PREFIX_VEX_0F2A */
3681
  {
3682
    { Bad_Opcode },
3683
    { VEX_LEN_TABLE (VEX_LEN_0F2A_P_1) },
3684
    { Bad_Opcode },
3685
    { VEX_LEN_TABLE (VEX_LEN_0F2A_P_3) },
3686
  },
3687
 
3688
  /* PREFIX_VEX_0F2C */
3689
  {
3690
    { Bad_Opcode },
3691
    { VEX_LEN_TABLE (VEX_LEN_0F2C_P_1) },
3692
    { Bad_Opcode },
3693
    { VEX_LEN_TABLE (VEX_LEN_0F2C_P_3) },
3694
  },
3695
 
3696
  /* PREFIX_VEX_0F2D */
3697
  {
3698
    { Bad_Opcode },
3699
    { VEX_LEN_TABLE (VEX_LEN_0F2D_P_1) },
3700
    { Bad_Opcode },
3701
    { VEX_LEN_TABLE (VEX_LEN_0F2D_P_3) },
3702
  },
3703
 
3704
  /* PREFIX_VEX_0F2E */
3705
  {
3706
    { VEX_LEN_TABLE (VEX_LEN_0F2E_P_0) },
3707
    { Bad_Opcode },
3708
    { VEX_LEN_TABLE (VEX_LEN_0F2E_P_2) },
3709
  },
3710
 
3711
  /* PREFIX_VEX_0F2F */
3712
  {
3713
    { VEX_LEN_TABLE (VEX_LEN_0F2F_P_0) },
3714
    { Bad_Opcode },
3715
    { VEX_LEN_TABLE (VEX_LEN_0F2F_P_2) },
3716
  },
3717
 
3718
  /* PREFIX_VEX_0F51 */
3719
  {
3720
    { VEX_W_TABLE (VEX_W_0F51_P_0) },
3721
    { VEX_LEN_TABLE (VEX_LEN_0F51_P_1) },
3722
    { VEX_W_TABLE (VEX_W_0F51_P_2) },
3723
    { VEX_LEN_TABLE (VEX_LEN_0F51_P_3) },
3724
  },
3725
 
3726
  /* PREFIX_VEX_0F52 */
3727
  {
3728
    { VEX_W_TABLE (VEX_W_0F52_P_0) },
3729
    { VEX_LEN_TABLE (VEX_LEN_0F52_P_1) },
3730
  },
3731
 
3732
  /* PREFIX_VEX_0F53 */
3733
  {
3734
    { VEX_W_TABLE (VEX_W_0F53_P_0) },
3735
    { VEX_LEN_TABLE (VEX_LEN_0F53_P_1) },
3736
  },
3737
 
3738
  /* PREFIX_VEX_0F58 */
3739
  {
3740
    { VEX_W_TABLE (VEX_W_0F58_P_0) },
3741
    { VEX_LEN_TABLE (VEX_LEN_0F58_P_1) },
3742
    { VEX_W_TABLE (VEX_W_0F58_P_2) },
3743
    { VEX_LEN_TABLE (VEX_LEN_0F58_P_3) },
3744
  },
3745
 
3746
  /* PREFIX_VEX_0F59 */
3747
  {
3748
    { VEX_W_TABLE (VEX_W_0F59_P_0) },
3749
    { VEX_LEN_TABLE (VEX_LEN_0F59_P_1) },
3750
    { VEX_W_TABLE (VEX_W_0F59_P_2) },
3751
    { VEX_LEN_TABLE (VEX_LEN_0F59_P_3) },
3752
  },
3753
 
3754
  /* PREFIX_VEX_0F5A */
3755
  {
3756
    { VEX_W_TABLE (VEX_W_0F5A_P_0) },
3757
    { VEX_LEN_TABLE (VEX_LEN_0F5A_P_1) },
3758
    { "vcvtpd2ps%XY", { XMM, EXx } },
3759
    { VEX_LEN_TABLE (VEX_LEN_0F5A_P_3) },
3760
  },
3761
 
3762
  /* PREFIX_VEX_0F5B */
3763
  {
3764
    { VEX_W_TABLE (VEX_W_0F5B_P_0) },
3765
    { VEX_W_TABLE (VEX_W_0F5B_P_1) },
3766
    { VEX_W_TABLE (VEX_W_0F5B_P_2) },
3767
  },
3768
 
3769
  /* PREFIX_VEX_0F5C */
3770
  {
3771
    { VEX_W_TABLE (VEX_W_0F5C_P_0) },
3772
    { VEX_LEN_TABLE (VEX_LEN_0F5C_P_1) },
3773
    { VEX_W_TABLE (VEX_W_0F5C_P_2) },
3774
    { VEX_LEN_TABLE (VEX_LEN_0F5C_P_3) },
3775
  },
3776
 
3777
  /* PREFIX_VEX_0F5D */
3778
  {
3779
    { VEX_W_TABLE (VEX_W_0F5D_P_0) },
3780
    { VEX_LEN_TABLE (VEX_LEN_0F5D_P_1) },
3781
    { VEX_W_TABLE (VEX_W_0F5D_P_2) },
3782
    { VEX_LEN_TABLE (VEX_LEN_0F5D_P_3) },
3783
  },
3784
 
3785
  /* PREFIX_VEX_0F5E */
3786
  {
3787
    { VEX_W_TABLE (VEX_W_0F5E_P_0) },
3788
    { VEX_LEN_TABLE (VEX_LEN_0F5E_P_1) },
3789
    { VEX_W_TABLE (VEX_W_0F5E_P_2) },
3790
    { VEX_LEN_TABLE (VEX_LEN_0F5E_P_3) },
3791
  },
3792
 
3793
  /* PREFIX_VEX_0F5F */
3794
  {
3795
    { VEX_W_TABLE (VEX_W_0F5F_P_0) },
3796
    { VEX_LEN_TABLE (VEX_LEN_0F5F_P_1) },
3797
    { VEX_W_TABLE (VEX_W_0F5F_P_2) },
3798
    { VEX_LEN_TABLE (VEX_LEN_0F5F_P_3) },
3799
  },
3800
 
3801
  /* PREFIX_VEX_0F60 */
3802
  {
3803
    { Bad_Opcode },
3804
    { Bad_Opcode },
3805 148 khays
    { VEX_W_TABLE (VEX_W_0F60_P_2) },
3806 18 khays
  },
3807
 
3808
  /* PREFIX_VEX_0F61 */
3809
  {
3810
    { Bad_Opcode },
3811
    { Bad_Opcode },
3812 148 khays
    { VEX_W_TABLE (VEX_W_0F61_P_2) },
3813 18 khays
  },
3814
 
3815
  /* PREFIX_VEX_0F62 */
3816
  {
3817
    { Bad_Opcode },
3818
    { Bad_Opcode },
3819 148 khays
    { VEX_W_TABLE (VEX_W_0F62_P_2) },
3820 18 khays
  },
3821
 
3822
  /* PREFIX_VEX_0F63 */
3823
  {
3824
    { Bad_Opcode },
3825
    { Bad_Opcode },
3826 148 khays
    { VEX_W_TABLE (VEX_W_0F63_P_2) },
3827 18 khays
  },
3828
 
3829
  /* PREFIX_VEX_0F64 */
3830
  {
3831
    { Bad_Opcode },
3832
    { Bad_Opcode },
3833 148 khays
    { VEX_W_TABLE (VEX_W_0F64_P_2) },
3834 18 khays
  },
3835
 
3836
  /* PREFIX_VEX_0F65 */
3837
  {
3838
    { Bad_Opcode },
3839
    { Bad_Opcode },
3840 148 khays
    { VEX_W_TABLE (VEX_W_0F65_P_2) },
3841 18 khays
  },
3842
 
3843
  /* PREFIX_VEX_0F66 */
3844
  {
3845
    { Bad_Opcode },
3846
    { Bad_Opcode },
3847 148 khays
    { VEX_W_TABLE (VEX_W_0F66_P_2) },
3848 18 khays
  },
3849
 
3850
  /* PREFIX_VEX_0F67 */
3851
  {
3852
    { Bad_Opcode },
3853
    { Bad_Opcode },
3854 148 khays
    { VEX_W_TABLE (VEX_W_0F67_P_2) },
3855 18 khays
  },
3856
 
3857
  /* PREFIX_VEX_0F68 */
3858
  {
3859
    { Bad_Opcode },
3860
    { Bad_Opcode },
3861 148 khays
    { VEX_W_TABLE (VEX_W_0F68_P_2) },
3862 18 khays
  },
3863
 
3864
  /* PREFIX_VEX_0F69 */
3865
  {
3866
    { Bad_Opcode },
3867
    { Bad_Opcode },
3868 148 khays
    { VEX_W_TABLE (VEX_W_0F69_P_2) },
3869 18 khays
  },
3870
 
3871
  /* PREFIX_VEX_0F6A */
3872
  {
3873
    { Bad_Opcode },
3874
    { Bad_Opcode },
3875 148 khays
    { VEX_W_TABLE (VEX_W_0F6A_P_2) },
3876 18 khays
  },
3877
 
3878
  /* PREFIX_VEX_0F6B */
3879
  {
3880
    { Bad_Opcode },
3881
    { Bad_Opcode },
3882 148 khays
    { VEX_W_TABLE (VEX_W_0F6B_P_2) },
3883 18 khays
  },
3884
 
3885
  /* PREFIX_VEX_0F6C */
3886
  {
3887
    { Bad_Opcode },
3888
    { Bad_Opcode },
3889 148 khays
    { VEX_W_TABLE (VEX_W_0F6C_P_2) },
3890 18 khays
  },
3891
 
3892
  /* PREFIX_VEX_0F6D */
3893
  {
3894
    { Bad_Opcode },
3895
    { Bad_Opcode },
3896 148 khays
    { VEX_W_TABLE (VEX_W_0F6D_P_2) },
3897 18 khays
  },
3898
 
3899
  /* PREFIX_VEX_0F6E */
3900
  {
3901
    { Bad_Opcode },
3902
    { Bad_Opcode },
3903
    { VEX_LEN_TABLE (VEX_LEN_0F6E_P_2) },
3904
  },
3905
 
3906
  /* PREFIX_VEX_0F6F */
3907
  {
3908
    { Bad_Opcode },
3909
    { VEX_W_TABLE (VEX_W_0F6F_P_1) },
3910
    { VEX_W_TABLE (VEX_W_0F6F_P_2) },
3911
  },
3912
 
3913
  /* PREFIX_VEX_0F70 */
3914
  {
3915
    { Bad_Opcode },
3916 148 khays
    { VEX_W_TABLE (VEX_W_0F70_P_1) },
3917
    { VEX_W_TABLE (VEX_W_0F70_P_2) },
3918
    { VEX_W_TABLE (VEX_W_0F70_P_3) },
3919 18 khays
  },
3920
 
3921
  /* PREFIX_VEX_0F71_REG_2 */
3922
  {
3923
    { Bad_Opcode },
3924
    { Bad_Opcode },
3925 148 khays
    { VEX_W_TABLE (VEX_W_0F71_R_2_P_2) },
3926 18 khays
  },
3927
 
3928
  /* PREFIX_VEX_0F71_REG_4 */
3929
  {
3930
    { Bad_Opcode },
3931
    { Bad_Opcode },
3932 148 khays
    { VEX_W_TABLE (VEX_W_0F71_R_4_P_2) },
3933 18 khays
  },
3934
 
3935
  /* PREFIX_VEX_0F71_REG_6 */
3936
  {
3937
    { Bad_Opcode },
3938
    { Bad_Opcode },
3939 148 khays
    { VEX_W_TABLE (VEX_W_0F71_R_6_P_2) },
3940 18 khays
  },
3941
 
3942
  /* PREFIX_VEX_0F72_REG_2 */
3943
  {
3944
    { Bad_Opcode },
3945
    { Bad_Opcode },
3946 148 khays
    { VEX_W_TABLE (VEX_W_0F72_R_2_P_2) },
3947 18 khays
  },
3948
 
3949
  /* PREFIX_VEX_0F72_REG_4 */
3950
  {
3951
    { Bad_Opcode },
3952
    { Bad_Opcode },
3953 148 khays
    { VEX_W_TABLE (VEX_W_0F72_R_4_P_2) },
3954 18 khays
  },
3955
 
3956
  /* PREFIX_VEX_0F72_REG_6 */
3957
  {
3958
    { Bad_Opcode },
3959
    { Bad_Opcode },
3960 148 khays
    { VEX_W_TABLE (VEX_W_0F72_R_6_P_2) },
3961 18 khays
  },
3962
 
3963
  /* PREFIX_VEX_0F73_REG_2 */
3964
  {
3965
    { Bad_Opcode },
3966
    { Bad_Opcode },
3967 148 khays
    { VEX_W_TABLE (VEX_W_0F73_R_2_P_2) },
3968 18 khays
  },
3969
 
3970
  /* PREFIX_VEX_0F73_REG_3 */
3971
  {
3972
    { Bad_Opcode },
3973
    { Bad_Opcode },
3974 148 khays
    { VEX_W_TABLE (VEX_W_0F73_R_3_P_2) },
3975 18 khays
  },
3976
 
3977
  /* PREFIX_VEX_0F73_REG_6 */
3978
  {
3979
    { Bad_Opcode },
3980
    { Bad_Opcode },
3981 148 khays
    { VEX_W_TABLE (VEX_W_0F73_R_6_P_2) },
3982 18 khays
  },
3983
 
3984
  /* PREFIX_VEX_0F73_REG_7 */
3985
  {
3986
    { Bad_Opcode },
3987
    { Bad_Opcode },
3988 148 khays
    { VEX_W_TABLE (VEX_W_0F73_R_7_P_2) },
3989 18 khays
  },
3990
 
3991
  /* PREFIX_VEX_0F74 */
3992
  {
3993
    { Bad_Opcode },
3994
    { Bad_Opcode },
3995 148 khays
    { VEX_W_TABLE (VEX_W_0F74_P_2) },
3996 18 khays
  },
3997
 
3998
  /* PREFIX_VEX_0F75 */
3999
  {
4000
    { Bad_Opcode },
4001
    { Bad_Opcode },
4002 148 khays
    { VEX_W_TABLE (VEX_W_0F75_P_2) },
4003 18 khays
  },
4004
 
4005
  /* PREFIX_VEX_0F76 */
4006
  {
4007
    { Bad_Opcode },
4008
    { Bad_Opcode },
4009 148 khays
    { VEX_W_TABLE (VEX_W_0F76_P_2) },
4010 18 khays
  },
4011
 
4012
  /* PREFIX_VEX_0F77 */
4013
  {
4014
    { VEX_W_TABLE (VEX_W_0F77_P_0) },
4015
  },
4016
 
4017
  /* PREFIX_VEX_0F7C */
4018
  {
4019
    { Bad_Opcode },
4020
    { Bad_Opcode },
4021
    { VEX_W_TABLE (VEX_W_0F7C_P_2) },
4022
    { VEX_W_TABLE (VEX_W_0F7C_P_3) },
4023
  },
4024
 
4025
  /* PREFIX_VEX_0F7D */
4026
  {
4027
    { Bad_Opcode },
4028
    { Bad_Opcode },
4029
    { VEX_W_TABLE (VEX_W_0F7D_P_2) },
4030
    { VEX_W_TABLE (VEX_W_0F7D_P_3) },
4031
  },
4032
 
4033
  /* PREFIX_VEX_0F7E */
4034
  {
4035
    { Bad_Opcode },
4036
    { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1) },
4037
    { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2) },
4038
  },
4039
 
4040
  /* PREFIX_VEX_0F7F */
4041
  {
4042
    { Bad_Opcode },
4043
    { VEX_W_TABLE (VEX_W_0F7F_P_1) },
4044
    { VEX_W_TABLE (VEX_W_0F7F_P_2) },
4045
  },
4046
 
4047
  /* PREFIX_VEX_0FC2 */
4048
  {
4049
    { VEX_W_TABLE (VEX_W_0FC2_P_0) },
4050
    { VEX_LEN_TABLE (VEX_LEN_0FC2_P_1) },
4051
    { VEX_W_TABLE (VEX_W_0FC2_P_2) },
4052
    { VEX_LEN_TABLE (VEX_LEN_0FC2_P_3) },
4053
  },
4054
 
4055
  /* PREFIX_VEX_0FC4 */
4056
  {
4057
    { Bad_Opcode },
4058
    { Bad_Opcode },
4059
    { VEX_LEN_TABLE (VEX_LEN_0FC4_P_2) },
4060
  },
4061
 
4062
  /* PREFIX_VEX_0FC5 */
4063
  {
4064
    { Bad_Opcode },
4065
    { Bad_Opcode },
4066
    { VEX_LEN_TABLE (VEX_LEN_0FC5_P_2) },
4067
  },
4068
 
4069
  /* PREFIX_VEX_0FD0 */
4070
  {
4071
    { Bad_Opcode },
4072
    { Bad_Opcode },
4073
    { VEX_W_TABLE (VEX_W_0FD0_P_2) },
4074
    { VEX_W_TABLE (VEX_W_0FD0_P_3) },
4075
  },
4076
 
4077
  /* PREFIX_VEX_0FD1 */
4078
  {
4079
    { Bad_Opcode },
4080
    { Bad_Opcode },
4081 148 khays
    { VEX_W_TABLE (VEX_W_0FD1_P_2) },
4082 18 khays
  },
4083
 
4084
  /* PREFIX_VEX_0FD2 */
4085
  {
4086
    { Bad_Opcode },
4087
    { Bad_Opcode },
4088 148 khays
    { VEX_W_TABLE (VEX_W_0FD2_P_2) },
4089 18 khays
  },
4090
 
4091
  /* PREFIX_VEX_0FD3 */
4092
  {
4093
    { Bad_Opcode },
4094
    { Bad_Opcode },
4095 148 khays
    { VEX_W_TABLE (VEX_W_0FD3_P_2) },
4096 18 khays
  },
4097
 
4098
  /* PREFIX_VEX_0FD4 */
4099
  {
4100
    { Bad_Opcode },
4101
    { Bad_Opcode },
4102 148 khays
    { VEX_W_TABLE (VEX_W_0FD4_P_2) },
4103 18 khays
  },
4104
 
4105
  /* PREFIX_VEX_0FD5 */
4106
  {
4107
    { Bad_Opcode },
4108
    { Bad_Opcode },
4109 148 khays
    { VEX_W_TABLE (VEX_W_0FD5_P_2) },
4110 18 khays
  },
4111
 
4112
  /* PREFIX_VEX_0FD6 */
4113
  {
4114
    { Bad_Opcode },
4115
    { Bad_Opcode },
4116
    { VEX_LEN_TABLE (VEX_LEN_0FD6_P_2) },
4117
  },
4118
 
4119
  /* PREFIX_VEX_0FD7 */
4120
  {
4121
    { Bad_Opcode },
4122
    { Bad_Opcode },
4123
    { MOD_TABLE (MOD_VEX_0FD7_PREFIX_2) },
4124
  },
4125
 
4126
  /* PREFIX_VEX_0FD8 */
4127
  {
4128
    { Bad_Opcode },
4129
    { Bad_Opcode },
4130 148 khays
    { VEX_W_TABLE (VEX_W_0FD8_P_2) },
4131 18 khays
  },
4132
 
4133
  /* PREFIX_VEX_0FD9 */
4134
  {
4135
    { Bad_Opcode },
4136
    { Bad_Opcode },
4137 148 khays
    { VEX_W_TABLE (VEX_W_0FD9_P_2) },
4138 18 khays
  },
4139
 
4140
  /* PREFIX_VEX_0FDA */
4141
  {
4142
    { Bad_Opcode },
4143
    { Bad_Opcode },
4144 148 khays
    { VEX_W_TABLE (VEX_W_0FDA_P_2) },
4145 18 khays
  },
4146
 
4147
  /* PREFIX_VEX_0FDB */
4148
  {
4149
    { Bad_Opcode },
4150
    { Bad_Opcode },
4151 148 khays
    { VEX_W_TABLE (VEX_W_0FDB_P_2) },
4152 18 khays
  },
4153
 
4154
  /* PREFIX_VEX_0FDC */
4155
  {
4156
    { Bad_Opcode },
4157
    { Bad_Opcode },
4158 148 khays
    { VEX_W_TABLE (VEX_W_0FDC_P_2) },
4159 18 khays
  },
4160
 
4161
  /* PREFIX_VEX_0FDD */
4162
  {
4163
    { Bad_Opcode },
4164
    { Bad_Opcode },
4165 148 khays
    { VEX_W_TABLE (VEX_W_0FDD_P_2) },
4166 18 khays
  },
4167
 
4168
  /* PREFIX_VEX_0FDE */
4169
  {
4170
    { Bad_Opcode },
4171
    { Bad_Opcode },
4172 148 khays
    { VEX_W_TABLE (VEX_W_0FDE_P_2) },
4173 18 khays
  },
4174
 
4175
  /* PREFIX_VEX_0FDF */
4176
  {
4177
    { Bad_Opcode },
4178
    { Bad_Opcode },
4179 148 khays
    { VEX_W_TABLE (VEX_W_0FDF_P_2) },
4180 18 khays
  },
4181
 
4182
  /* PREFIX_VEX_0FE0 */
4183
  {
4184
    { Bad_Opcode },
4185
    { Bad_Opcode },
4186 148 khays
    { VEX_W_TABLE (VEX_W_0FE0_P_2) },
4187 18 khays
  },
4188
 
4189
  /* PREFIX_VEX_0FE1 */
4190
  {
4191
    { Bad_Opcode },
4192
    { Bad_Opcode },
4193 148 khays
    { VEX_W_TABLE (VEX_W_0FE1_P_2) },
4194 18 khays
  },
4195
 
4196
  /* PREFIX_VEX_0FE2 */
4197
  {
4198
    { Bad_Opcode },
4199
    { Bad_Opcode },
4200 148 khays
    { VEX_W_TABLE (VEX_W_0FE2_P_2) },
4201 18 khays
  },
4202
 
4203
  /* PREFIX_VEX_0FE3 */
4204
  {
4205
    { Bad_Opcode },
4206
    { Bad_Opcode },
4207 148 khays
    { VEX_W_TABLE (VEX_W_0FE3_P_2) },
4208 18 khays
  },
4209
 
4210
  /* PREFIX_VEX_0FE4 */
4211
  {
4212
    { Bad_Opcode },
4213
    { Bad_Opcode },
4214 148 khays
    { VEX_W_TABLE (VEX_W_0FE4_P_2) },
4215 18 khays
  },
4216
 
4217
  /* PREFIX_VEX_0FE5 */
4218
  {
4219
    { Bad_Opcode },
4220
    { Bad_Opcode },
4221 148 khays
    { VEX_W_TABLE (VEX_W_0FE5_P_2) },
4222 18 khays
  },
4223
 
4224
  /* PREFIX_VEX_0FE6 */
4225
  {
4226
    { Bad_Opcode },
4227
    { VEX_W_TABLE (VEX_W_0FE6_P_1) },
4228
    { VEX_W_TABLE (VEX_W_0FE6_P_2) },
4229
    { VEX_W_TABLE (VEX_W_0FE6_P_3) },
4230
  },
4231
 
4232
  /* PREFIX_VEX_0FE7 */
4233
  {
4234
    { Bad_Opcode },
4235
    { Bad_Opcode },
4236
    { MOD_TABLE (MOD_VEX_0FE7_PREFIX_2) },
4237
  },
4238
 
4239
  /* PREFIX_VEX_0FE8 */
4240
  {
4241
    { Bad_Opcode },
4242
    { Bad_Opcode },
4243 148 khays
    { VEX_W_TABLE (VEX_W_0FE8_P_2) },
4244 18 khays
  },
4245
 
4246
  /* PREFIX_VEX_0FE9 */
4247
  {
4248
    { Bad_Opcode },
4249
    { Bad_Opcode },
4250 148 khays
    { VEX_W_TABLE (VEX_W_0FE9_P_2) },
4251 18 khays
  },
4252
 
4253
  /* PREFIX_VEX_0FEA */
4254
  {
4255
    { Bad_Opcode },
4256
    { Bad_Opcode },
4257 148 khays
    { VEX_W_TABLE (VEX_W_0FEA_P_2) },
4258 18 khays
  },
4259
 
4260
  /* PREFIX_VEX_0FEB */
4261
  {
4262
    { Bad_Opcode },
4263
    { Bad_Opcode },
4264 148 khays
    { VEX_W_TABLE (VEX_W_0FEB_P_2) },
4265 18 khays
  },
4266
 
4267
  /* PREFIX_VEX_0FEC */
4268
  {
4269
    { Bad_Opcode },
4270
    { Bad_Opcode },
4271 148 khays
    { VEX_W_TABLE (VEX_W_0FEC_P_2) },
4272 18 khays
  },
4273
 
4274
  /* PREFIX_VEX_0FED */
4275
  {
4276
    { Bad_Opcode },
4277
    { Bad_Opcode },
4278 148 khays
    { VEX_W_TABLE (VEX_W_0FED_P_2) },
4279 18 khays
  },
4280
 
4281
  /* PREFIX_VEX_0FEE */
4282
  {
4283
    { Bad_Opcode },
4284
    { Bad_Opcode },
4285 148 khays
    { VEX_W_TABLE (VEX_W_0FEE_P_2) },
4286 18 khays
  },
4287
 
4288
  /* PREFIX_VEX_0FEF */
4289
  {
4290
    { Bad_Opcode },
4291
    { Bad_Opcode },
4292 148 khays
    { VEX_W_TABLE (VEX_W_0FEF_P_2) },
4293 18 khays
  },
4294
 
4295
  /* PREFIX_VEX_0FF0 */
4296
  {
4297
    { Bad_Opcode },
4298
    { Bad_Opcode },
4299
    { Bad_Opcode },
4300
    { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3) },
4301
  },
4302
 
4303
  /* PREFIX_VEX_0FF1 */
4304
  {
4305
    { Bad_Opcode },
4306
    { Bad_Opcode },
4307 148 khays
    { VEX_W_TABLE (VEX_W_0FF1_P_2) },
4308 18 khays
  },
4309
 
4310
  /* PREFIX_VEX_0FF2 */
4311
  {
4312
    { Bad_Opcode },
4313
    { Bad_Opcode },
4314 148 khays
    { VEX_W_TABLE (VEX_W_0FF2_P_2) },
4315 18 khays
  },
4316
 
4317
  /* PREFIX_VEX_0FF3 */
4318
  {
4319
    { Bad_Opcode },
4320
    { Bad_Opcode },
4321 148 khays
    { VEX_W_TABLE (VEX_W_0FF3_P_2) },
4322 18 khays
  },
4323
 
4324
  /* PREFIX_VEX_0FF4 */
4325
  {
4326
    { Bad_Opcode },
4327
    { Bad_Opcode },
4328 148 khays
    { VEX_W_TABLE (VEX_W_0FF4_P_2) },
4329 18 khays
  },
4330
 
4331
  /* PREFIX_VEX_0FF5 */
4332
  {
4333
    { Bad_Opcode },
4334
    { Bad_Opcode },
4335 148 khays
    { VEX_W_TABLE (VEX_W_0FF5_P_2) },
4336 18 khays
  },
4337
 
4338
  /* PREFIX_VEX_0FF6 */
4339
  {
4340
    { Bad_Opcode },
4341
    { Bad_Opcode },
4342 148 khays
    { VEX_W_TABLE (VEX_W_0FF6_P_2) },
4343 18 khays
  },
4344
 
4345
  /* PREFIX_VEX_0FF7 */
4346
  {
4347
    { Bad_Opcode },
4348
    { Bad_Opcode },
4349
    { VEX_LEN_TABLE (VEX_LEN_0FF7_P_2) },
4350
  },
4351
 
4352
  /* PREFIX_VEX_0FF8 */
4353
  {
4354
    { Bad_Opcode },
4355
    { Bad_Opcode },
4356 148 khays
    { VEX_W_TABLE (VEX_W_0FF8_P_2) },
4357 18 khays
  },
4358
 
4359
  /* PREFIX_VEX_0FF9 */
4360
  {
4361
    { Bad_Opcode },
4362
    { Bad_Opcode },
4363 148 khays
    { VEX_W_TABLE (VEX_W_0FF9_P_2) },
4364 18 khays
  },
4365
 
4366
  /* PREFIX_VEX_0FFA */
4367
  {
4368
    { Bad_Opcode },
4369
    { Bad_Opcode },
4370 148 khays
    { VEX_W_TABLE (VEX_W_0FFA_P_2) },
4371 18 khays
  },
4372
 
4373
  /* PREFIX_VEX_0FFB */
4374
  {
4375
    { Bad_Opcode },
4376
    { Bad_Opcode },
4377 148 khays
    { VEX_W_TABLE (VEX_W_0FFB_P_2) },
4378 18 khays
  },
4379
 
4380
  /* PREFIX_VEX_0FFC */
4381
  {
4382
    { Bad_Opcode },
4383
    { Bad_Opcode },
4384 148 khays
    { VEX_W_TABLE (VEX_W_0FFC_P_2) },
4385 18 khays
  },
4386
 
4387
  /* PREFIX_VEX_0FFD */
4388
  {
4389
    { Bad_Opcode },
4390
    { Bad_Opcode },
4391 148 khays
    { VEX_W_TABLE (VEX_W_0FFD_P_2) },
4392 18 khays
  },
4393
 
4394
  /* PREFIX_VEX_0FFE */
4395
  {
4396
    { Bad_Opcode },
4397
    { Bad_Opcode },
4398 148 khays
    { VEX_W_TABLE (VEX_W_0FFE_P_2) },
4399 18 khays
  },
4400
 
4401
  /* PREFIX_VEX_0F3800 */
4402
  {
4403
    { Bad_Opcode },
4404
    { Bad_Opcode },
4405 148 khays
    { VEX_W_TABLE (VEX_W_0F3800_P_2) },
4406 18 khays
  },
4407
 
4408
  /* PREFIX_VEX_0F3801 */
4409
  {
4410
    { Bad_Opcode },
4411
    { Bad_Opcode },
4412 148 khays
    { VEX_W_TABLE (VEX_W_0F3801_P_2) },
4413 18 khays
  },
4414
 
4415
  /* PREFIX_VEX_0F3802 */
4416
  {
4417
    { Bad_Opcode },
4418
    { Bad_Opcode },
4419 148 khays
    { VEX_W_TABLE (VEX_W_0F3802_P_2) },
4420 18 khays
  },
4421
 
4422
  /* PREFIX_VEX_0F3803 */
4423
  {
4424
    { Bad_Opcode },
4425
    { Bad_Opcode },
4426 148 khays
    { VEX_W_TABLE (VEX_W_0F3803_P_2) },
4427 18 khays
  },
4428
 
4429
  /* PREFIX_VEX_0F3804 */
4430
  {
4431
    { Bad_Opcode },
4432
    { Bad_Opcode },
4433 148 khays
    { VEX_W_TABLE (VEX_W_0F3804_P_2) },
4434 18 khays
  },
4435
 
4436
  /* PREFIX_VEX_0F3805 */
4437
  {
4438
    { Bad_Opcode },
4439
    { Bad_Opcode },
4440 148 khays
    { VEX_W_TABLE (VEX_W_0F3805_P_2) },
4441 18 khays
  },
4442
 
4443
  /* PREFIX_VEX_0F3806 */
4444
  {
4445
    { Bad_Opcode },
4446
    { Bad_Opcode },
4447 148 khays
    { VEX_W_TABLE (VEX_W_0F3806_P_2) },
4448 18 khays
  },
4449
 
4450
  /* PREFIX_VEX_0F3807 */
4451
  {
4452
    { Bad_Opcode },
4453
    { Bad_Opcode },
4454 148 khays
    { VEX_W_TABLE (VEX_W_0F3807_P_2) },
4455 18 khays
  },
4456
 
4457
  /* PREFIX_VEX_0F3808 */
4458
  {
4459
    { Bad_Opcode },
4460
    { Bad_Opcode },
4461 148 khays
    { VEX_W_TABLE (VEX_W_0F3808_P_2) },
4462 18 khays
  },
4463
 
4464
  /* PREFIX_VEX_0F3809 */
4465
  {
4466
    { Bad_Opcode },
4467
    { Bad_Opcode },
4468 148 khays
    { VEX_W_TABLE (VEX_W_0F3809_P_2) },
4469 18 khays
  },
4470
 
4471
  /* PREFIX_VEX_0F380A */
4472
  {
4473
    { Bad_Opcode },
4474
    { Bad_Opcode },
4475 148 khays
    { VEX_W_TABLE (VEX_W_0F380A_P_2) },
4476 18 khays
  },
4477
 
4478
  /* PREFIX_VEX_0F380B */
4479
  {
4480
    { Bad_Opcode },
4481
    { Bad_Opcode },
4482 148 khays
    { VEX_W_TABLE (VEX_W_0F380B_P_2) },
4483 18 khays
  },
4484
 
4485
  /* PREFIX_VEX_0F380C */
4486
  {
4487
    { Bad_Opcode },
4488
    { Bad_Opcode },
4489
    { VEX_W_TABLE (VEX_W_0F380C_P_2) },
4490
  },
4491
 
4492
  /* PREFIX_VEX_0F380D */
4493
  {
4494
    { Bad_Opcode },
4495
    { Bad_Opcode },
4496
    { VEX_W_TABLE (VEX_W_0F380D_P_2) },
4497
  },
4498
 
4499
  /* PREFIX_VEX_0F380E */
4500
  {
4501
    { Bad_Opcode },
4502
    { Bad_Opcode },
4503
    { VEX_W_TABLE (VEX_W_0F380E_P_2) },
4504
  },
4505
 
4506
  /* PREFIX_VEX_0F380F */
4507
  {
4508
    { Bad_Opcode },
4509
    { Bad_Opcode },
4510
    { VEX_W_TABLE (VEX_W_0F380F_P_2) },
4511
  },
4512
 
4513
  /* PREFIX_VEX_0F3813 */
4514
  {
4515
    { Bad_Opcode },
4516
    { Bad_Opcode },
4517
    { "vcvtph2ps", { XM, EXxmmq } },
4518
  },
4519
 
4520 148 khays
  /* PREFIX_VEX_0F3816 */
4521
  {
4522
    { Bad_Opcode },
4523
    { Bad_Opcode },
4524
    { VEX_LEN_TABLE (VEX_LEN_0F3816_P_2) },
4525
  },
4526
 
4527 18 khays
  /* PREFIX_VEX_0F3817 */
4528
  {
4529
    { Bad_Opcode },
4530
    { Bad_Opcode },
4531
    { VEX_W_TABLE (VEX_W_0F3817_P_2) },
4532
  },
4533
 
4534
  /* PREFIX_VEX_0F3818 */
4535
  {
4536
    { Bad_Opcode },
4537
    { Bad_Opcode },
4538 148 khays
    { VEX_W_TABLE (VEX_W_0F3818_P_2) },
4539 18 khays
  },
4540
 
4541
  /* PREFIX_VEX_0F3819 */
4542
  {
4543
    { Bad_Opcode },
4544
    { Bad_Opcode },
4545 148 khays
    { VEX_LEN_TABLE (VEX_LEN_0F3819_P_2) },
4546 18 khays
  },
4547
 
4548
  /* PREFIX_VEX_0F381A */
4549
  {
4550
    { Bad_Opcode },
4551
    { Bad_Opcode },
4552
    { MOD_TABLE (MOD_VEX_0F381A_PREFIX_2) },
4553
  },
4554
 
4555
  /* PREFIX_VEX_0F381C */
4556
  {
4557
    { Bad_Opcode },
4558
    { Bad_Opcode },
4559 148 khays
    { VEX_W_TABLE (VEX_W_0F381C_P_2) },
4560 18 khays
  },
4561
 
4562
  /* PREFIX_VEX_0F381D */
4563
  {
4564
    { Bad_Opcode },
4565
    { Bad_Opcode },
4566 148 khays
    { VEX_W_TABLE (VEX_W_0F381D_P_2) },
4567 18 khays
  },
4568
 
4569
  /* PREFIX_VEX_0F381E */
4570
  {
4571
    { Bad_Opcode },
4572
    { Bad_Opcode },
4573 148 khays
    { VEX_W_TABLE (VEX_W_0F381E_P_2) },
4574 18 khays
  },
4575
 
4576
  /* PREFIX_VEX_0F3820 */
4577
  {
4578
    { Bad_Opcode },
4579
    { Bad_Opcode },
4580 148 khays
    { VEX_W_TABLE (VEX_W_0F3820_P_2) },
4581 18 khays
  },
4582
 
4583
  /* PREFIX_VEX_0F3821 */
4584
  {
4585
    { Bad_Opcode },
4586
    { Bad_Opcode },
4587 148 khays
    { VEX_W_TABLE (VEX_W_0F3821_P_2) },
4588 18 khays
  },
4589
 
4590
  /* PREFIX_VEX_0F3822 */
4591
  {
4592
    { Bad_Opcode },
4593
    { Bad_Opcode },
4594 148 khays
    { VEX_W_TABLE (VEX_W_0F3822_P_2) },
4595 18 khays
  },
4596
 
4597
  /* PREFIX_VEX_0F3823 */
4598
  {
4599
    { Bad_Opcode },
4600
    { Bad_Opcode },
4601 148 khays
    { VEX_W_TABLE (VEX_W_0F3823_P_2) },
4602 18 khays
  },
4603
 
4604
  /* PREFIX_VEX_0F3824 */
4605
  {
4606
    { Bad_Opcode },
4607
    { Bad_Opcode },
4608 148 khays
    { VEX_W_TABLE (VEX_W_0F3824_P_2) },
4609 18 khays
  },
4610
 
4611
  /* PREFIX_VEX_0F3825 */
4612
  {
4613
    { Bad_Opcode },
4614
    { Bad_Opcode },
4615 148 khays
    { VEX_W_TABLE (VEX_W_0F3825_P_2) },
4616 18 khays
  },
4617
 
4618
  /* PREFIX_VEX_0F3828 */
4619
  {
4620
    { Bad_Opcode },
4621
    { Bad_Opcode },
4622 148 khays
    { VEX_W_TABLE (VEX_W_0F3828_P_2) },
4623 18 khays
  },
4624
 
4625
  /* PREFIX_VEX_0F3829 */
4626
  {
4627
    { Bad_Opcode },
4628
    { Bad_Opcode },
4629 148 khays
    { VEX_W_TABLE (VEX_W_0F3829_P_2) },
4630 18 khays
  },
4631
 
4632
  /* PREFIX_VEX_0F382A */
4633
  {
4634
    { Bad_Opcode },
4635
    { Bad_Opcode },
4636
    { MOD_TABLE (MOD_VEX_0F382A_PREFIX_2) },
4637
  },
4638
 
4639
  /* PREFIX_VEX_0F382B */
4640
  {
4641
    { Bad_Opcode },
4642
    { Bad_Opcode },
4643 148 khays
    { VEX_W_TABLE (VEX_W_0F382B_P_2) },
4644 18 khays
  },
4645
 
4646
  /* PREFIX_VEX_0F382C */
4647
  {
4648
    { Bad_Opcode },
4649
    { Bad_Opcode },
4650
     { MOD_TABLE (MOD_VEX_0F382C_PREFIX_2) },
4651
  },
4652
 
4653
  /* PREFIX_VEX_0F382D */
4654
  {
4655
    { Bad_Opcode },
4656
    { Bad_Opcode },
4657
     { MOD_TABLE (MOD_VEX_0F382D_PREFIX_2) },
4658
  },
4659
 
4660
  /* PREFIX_VEX_0F382E */
4661
  {
4662
    { Bad_Opcode },
4663
    { Bad_Opcode },
4664
     { MOD_TABLE (MOD_VEX_0F382E_PREFIX_2) },
4665
  },
4666
 
4667
  /* PREFIX_VEX_0F382F */
4668
  {
4669
    { Bad_Opcode },
4670
    { Bad_Opcode },
4671
     { MOD_TABLE (MOD_VEX_0F382F_PREFIX_2) },
4672
  },
4673
 
4674
  /* PREFIX_VEX_0F3830 */
4675
  {
4676
    { Bad_Opcode },
4677
    { Bad_Opcode },
4678 148 khays
    { VEX_W_TABLE (VEX_W_0F3830_P_2) },
4679 18 khays
  },
4680
 
4681
  /* PREFIX_VEX_0F3831 */
4682
  {
4683
    { Bad_Opcode },
4684
    { Bad_Opcode },
4685 148 khays
    { VEX_W_TABLE (VEX_W_0F3831_P_2) },
4686 18 khays
  },
4687
 
4688
  /* PREFIX_VEX_0F3832 */
4689
  {
4690
    { Bad_Opcode },
4691
    { Bad_Opcode },
4692 148 khays
    { VEX_W_TABLE (VEX_W_0F3832_P_2) },
4693 18 khays
  },
4694
 
4695
  /* PREFIX_VEX_0F3833 */
4696
  {
4697
    { Bad_Opcode },
4698
    { Bad_Opcode },
4699 148 khays
    { VEX_W_TABLE (VEX_W_0F3833_P_2) },
4700 18 khays
  },
4701
 
4702
  /* PREFIX_VEX_0F3834 */
4703
  {
4704
    { Bad_Opcode },
4705
    { Bad_Opcode },
4706 148 khays
    { VEX_W_TABLE (VEX_W_0F3834_P_2) },
4707 18 khays
  },
4708
 
4709
  /* PREFIX_VEX_0F3835 */
4710
  {
4711
    { Bad_Opcode },
4712
    { Bad_Opcode },
4713 148 khays
    { VEX_W_TABLE (VEX_W_0F3835_P_2) },
4714 18 khays
  },
4715
 
4716 148 khays
  /* PREFIX_VEX_0F3836 */
4717
  {
4718
    { Bad_Opcode },
4719
    { Bad_Opcode },
4720
    { VEX_LEN_TABLE (VEX_LEN_0F3836_P_2) },
4721
  },
4722
 
4723 18 khays
  /* PREFIX_VEX_0F3837 */
4724
  {
4725
    { Bad_Opcode },
4726
    { Bad_Opcode },
4727 148 khays
    { VEX_W_TABLE (VEX_W_0F3837_P_2) },
4728 18 khays
  },
4729
 
4730
  /* PREFIX_VEX_0F3838 */
4731
  {
4732
    { Bad_Opcode },
4733
    { Bad_Opcode },
4734 148 khays
    { VEX_W_TABLE (VEX_W_0F3838_P_2) },
4735 18 khays
  },
4736
 
4737
  /* PREFIX_VEX_0F3839 */
4738
  {
4739
    { Bad_Opcode },
4740
    { Bad_Opcode },
4741 148 khays
    { VEX_W_TABLE (VEX_W_0F3839_P_2) },
4742 18 khays
  },
4743
 
4744
  /* PREFIX_VEX_0F383A */
4745
  {
4746
    { Bad_Opcode },
4747
    { Bad_Opcode },
4748 148 khays
    { VEX_W_TABLE (VEX_W_0F383A_P_2) },
4749 18 khays
  },
4750
 
4751
  /* PREFIX_VEX_0F383B */
4752
  {
4753
    { Bad_Opcode },
4754
    { Bad_Opcode },
4755 148 khays
    { VEX_W_TABLE (VEX_W_0F383B_P_2) },
4756 18 khays
  },
4757
 
4758
  /* PREFIX_VEX_0F383C */
4759
  {
4760
    { Bad_Opcode },
4761
    { Bad_Opcode },
4762 148 khays
    { VEX_W_TABLE (VEX_W_0F383C_P_2) },
4763 18 khays
  },
4764
 
4765
  /* PREFIX_VEX_0F383D */
4766
  {
4767
    { Bad_Opcode },
4768
    { Bad_Opcode },
4769 148 khays
    { VEX_W_TABLE (VEX_W_0F383D_P_2) },
4770 18 khays
  },
4771
 
4772
  /* PREFIX_VEX_0F383E */
4773
  {
4774
    { Bad_Opcode },
4775
    { Bad_Opcode },
4776 148 khays
    { VEX_W_TABLE (VEX_W_0F383E_P_2) },
4777 18 khays
  },
4778
 
4779
  /* PREFIX_VEX_0F383F */
4780
  {
4781
    { Bad_Opcode },
4782
    { Bad_Opcode },
4783 148 khays
    { VEX_W_TABLE (VEX_W_0F383F_P_2) },
4784 18 khays
  },
4785
 
4786
  /* PREFIX_VEX_0F3840 */
4787
  {
4788
    { Bad_Opcode },
4789
    { Bad_Opcode },
4790 148 khays
    { VEX_W_TABLE (VEX_W_0F3840_P_2) },
4791 18 khays
  },
4792
 
4793
  /* PREFIX_VEX_0F3841 */
4794
  {
4795
    { Bad_Opcode },
4796
    { Bad_Opcode },
4797
    { VEX_LEN_TABLE (VEX_LEN_0F3841_P_2) },
4798
  },
4799
 
4800 148 khays
  /* PREFIX_VEX_0F3845 */
4801
  {
4802
    { Bad_Opcode },
4803
    { Bad_Opcode },
4804
    { "vpsrlv%LW", { XM, Vex, EXx } },
4805
  },
4806
 
4807
  /* PREFIX_VEX_0F3846 */
4808
  {
4809
    { Bad_Opcode },
4810
    { Bad_Opcode },
4811
    { VEX_W_TABLE (VEX_W_0F3846_P_2) },
4812
  },
4813
 
4814
  /* PREFIX_VEX_0F3847 */
4815
  {
4816
    { Bad_Opcode },
4817
    { Bad_Opcode },
4818
    { "vpsllv%LW", { XM, Vex, EXx } },
4819
  },
4820
 
4821
  /* PREFIX_VEX_0F3858 */
4822
  {
4823
    { Bad_Opcode },
4824
    { Bad_Opcode },
4825
    { VEX_W_TABLE (VEX_W_0F3858_P_2) },
4826
  },
4827
 
4828
  /* PREFIX_VEX_0F3859 */
4829
  {
4830
    { Bad_Opcode },
4831
    { Bad_Opcode },
4832
    { VEX_W_TABLE (VEX_W_0F3859_P_2) },
4833
  },
4834
 
4835
  /* PREFIX_VEX_0F385A */
4836
  {
4837
    { Bad_Opcode },
4838
    { Bad_Opcode },
4839
    { MOD_TABLE (MOD_VEX_0F385A_PREFIX_2) },
4840
  },
4841
 
4842
  /* PREFIX_VEX_0F3878 */
4843
  {
4844
    { Bad_Opcode },
4845
    { Bad_Opcode },
4846
    { VEX_W_TABLE (VEX_W_0F3878_P_2) },
4847
  },
4848
 
4849
  /* PREFIX_VEX_0F3879 */
4850
  {
4851
    { Bad_Opcode },
4852
    { Bad_Opcode },
4853
    { VEX_W_TABLE (VEX_W_0F3879_P_2) },
4854
  },
4855
 
4856
  /* PREFIX_VEX_0F388C */
4857
  {
4858
    { Bad_Opcode },
4859
    { Bad_Opcode },
4860 158 khays
    { MOD_TABLE (MOD_VEX_0F388C_PREFIX_2) },
4861 148 khays
  },
4862
 
4863
  /* PREFIX_VEX_0F388E */
4864
  {
4865
    { Bad_Opcode },
4866
    { Bad_Opcode },
4867 158 khays
    { MOD_TABLE (MOD_VEX_0F388E_PREFIX_2) },
4868 148 khays
  },
4869
 
4870
  /* PREFIX_VEX_0F3890 */
4871
  {
4872
    { Bad_Opcode },
4873
    { Bad_Opcode },
4874
    { "vpgatherd%LW", { XM, MVexVSIBDWpX, Vex } },
4875
  },
4876
 
4877
  /* PREFIX_VEX_0F3891 */
4878
  {
4879
    { Bad_Opcode },
4880
    { Bad_Opcode },
4881
    { "vpgatherq%LW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ } },
4882
  },
4883
 
4884
  /* PREFIX_VEX_0F3892 */
4885
  {
4886
    { Bad_Opcode },
4887
    { Bad_Opcode },
4888
    { "vgatherdp%XW", { XM, MVexVSIBDWpX, Vex } },
4889
  },
4890
 
4891
  /* PREFIX_VEX_0F3893 */
4892
  {
4893
    { Bad_Opcode },
4894
    { Bad_Opcode },
4895
    { "vgatherqp%XW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ } },
4896
  },
4897
 
4898 18 khays
  /* PREFIX_VEX_0F3896 */
4899
  {
4900
    { Bad_Opcode },
4901
    { Bad_Opcode },
4902
    { "vfmaddsub132p%XW", { XM, Vex, EXx } },
4903
  },
4904
 
4905
  /* PREFIX_VEX_0F3897 */
4906
  {
4907
    { Bad_Opcode },
4908
    { Bad_Opcode },
4909
    { "vfmsubadd132p%XW", { XM, Vex, EXx } },
4910
  },
4911
 
4912
  /* PREFIX_VEX_0F3898 */
4913
  {
4914
    { Bad_Opcode },
4915
    { Bad_Opcode },
4916
    { "vfmadd132p%XW", { XM, Vex, EXx } },
4917
  },
4918
 
4919
  /* PREFIX_VEX_0F3899 */
4920
  {
4921
    { Bad_Opcode },
4922
    { Bad_Opcode },
4923
    { "vfmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4924
  },
4925
 
4926
  /* PREFIX_VEX_0F389A */
4927
  {
4928
    { Bad_Opcode },
4929
    { Bad_Opcode },
4930
    { "vfmsub132p%XW", { XM, Vex, EXx } },
4931
  },
4932
 
4933
  /* PREFIX_VEX_0F389B */
4934
  {
4935
    { Bad_Opcode },
4936
    { Bad_Opcode },
4937
    { "vfmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4938
  },
4939
 
4940
  /* PREFIX_VEX_0F389C */
4941
  {
4942
    { Bad_Opcode },
4943
    { Bad_Opcode },
4944
    { "vfnmadd132p%XW", { XM, Vex, EXx } },
4945
  },
4946
 
4947
  /* PREFIX_VEX_0F389D */
4948
  {
4949
    { Bad_Opcode },
4950
    { Bad_Opcode },
4951
    { "vfnmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4952
  },
4953
 
4954
  /* PREFIX_VEX_0F389E */
4955
  {
4956
    { Bad_Opcode },
4957
    { Bad_Opcode },
4958
    { "vfnmsub132p%XW", { XM, Vex, EXx } },
4959
  },
4960
 
4961
  /* PREFIX_VEX_0F389F */
4962
  {
4963
    { Bad_Opcode },
4964
    { Bad_Opcode },
4965
    { "vfnmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4966
  },
4967
 
4968
  /* PREFIX_VEX_0F38A6 */
4969
  {
4970
    { Bad_Opcode },
4971
    { Bad_Opcode },
4972
    { "vfmaddsub213p%XW", { XM, Vex, EXx } },
4973
    { Bad_Opcode },
4974
  },
4975
 
4976
  /* PREFIX_VEX_0F38A7 */
4977
  {
4978
    { Bad_Opcode },
4979
    { Bad_Opcode },
4980
    { "vfmsubadd213p%XW", { XM, Vex, EXx } },
4981
  },
4982
 
4983
  /* PREFIX_VEX_0F38A8 */
4984
  {
4985
    { Bad_Opcode },
4986
    { Bad_Opcode },
4987
    { "vfmadd213p%XW", { XM, Vex, EXx } },
4988
  },
4989
 
4990
  /* PREFIX_VEX_0F38A9 */
4991
  {
4992
    { Bad_Opcode },
4993
    { Bad_Opcode },
4994
    { "vfmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4995
  },
4996
 
4997
  /* PREFIX_VEX_0F38AA */
4998
  {
4999
    { Bad_Opcode },
5000
    { Bad_Opcode },
5001
    { "vfmsub213p%XW", { XM, Vex, EXx } },
5002
  },
5003
 
5004
  /* PREFIX_VEX_0F38AB */
5005
  {
5006
    { Bad_Opcode },
5007
    { Bad_Opcode },
5008
    { "vfmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
5009
  },
5010
 
5011
  /* PREFIX_VEX_0F38AC */
5012
  {
5013
    { Bad_Opcode },
5014
    { Bad_Opcode },
5015
    { "vfnmadd213p%XW", { XM, Vex, EXx } },
5016
  },
5017
 
5018
  /* PREFIX_VEX_0F38AD */
5019
  {
5020
    { Bad_Opcode },
5021
    { Bad_Opcode },
5022
    { "vfnmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
5023
  },
5024
 
5025
  /* PREFIX_VEX_0F38AE */
5026
  {
5027
    { Bad_Opcode },
5028
    { Bad_Opcode },
5029
    { "vfnmsub213p%XW", { XM, Vex, EXx } },
5030
  },
5031
 
5032
  /* PREFIX_VEX_0F38AF */
5033
  {
5034
    { Bad_Opcode },
5035
    { Bad_Opcode },
5036
    { "vfnmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
5037
  },
5038
 
5039
  /* PREFIX_VEX_0F38B6 */
5040
  {
5041
    { Bad_Opcode },
5042
    { Bad_Opcode },
5043
    { "vfmaddsub231p%XW", { XM, Vex, EXx } },
5044
  },
5045
 
5046
  /* PREFIX_VEX_0F38B7 */
5047
  {
5048
    { Bad_Opcode },
5049
    { Bad_Opcode },
5050
    { "vfmsubadd231p%XW", { XM, Vex, EXx } },
5051
  },
5052
 
5053
  /* PREFIX_VEX_0F38B8 */
5054
  {
5055
    { Bad_Opcode },
5056
    { Bad_Opcode },
5057
    { "vfmadd231p%XW", { XM, Vex, EXx } },
5058
  },
5059
 
5060
  /* PREFIX_VEX_0F38B9 */
5061
  {
5062
    { Bad_Opcode },
5063
    { Bad_Opcode },
5064
    { "vfmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
5065
  },
5066
 
5067
  /* PREFIX_VEX_0F38BA */
5068
  {
5069
    { Bad_Opcode },
5070
    { Bad_Opcode },
5071
    { "vfmsub231p%XW", { XM, Vex, EXx } },
5072
  },
5073
 
5074
  /* PREFIX_VEX_0F38BB */
5075
  {
5076
    { Bad_Opcode },
5077
    { Bad_Opcode },
5078
    { "vfmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
5079
  },
5080
 
5081
  /* PREFIX_VEX_0F38BC */
5082
  {
5083
    { Bad_Opcode },
5084
    { Bad_Opcode },
5085
    { "vfnmadd231p%XW", { XM, Vex, EXx } },
5086
  },
5087
 
5088
  /* PREFIX_VEX_0F38BD */
5089
  {
5090
    { Bad_Opcode },
5091
    { Bad_Opcode },
5092
    { "vfnmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
5093
  },
5094
 
5095
  /* PREFIX_VEX_0F38BE */
5096
  {
5097
    { Bad_Opcode },
5098
    { Bad_Opcode },
5099
    { "vfnmsub231p%XW", { XM, Vex, EXx } },
5100
  },
5101
 
5102
  /* PREFIX_VEX_0F38BF */
5103
  {
5104
    { Bad_Opcode },
5105
    { Bad_Opcode },
5106
    { "vfnmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
5107
  },
5108
 
5109
  /* PREFIX_VEX_0F38DB */
5110
  {
5111
    { Bad_Opcode },
5112
    { Bad_Opcode },
5113
    { VEX_LEN_TABLE (VEX_LEN_0F38DB_P_2) },
5114
  },
5115
 
5116
  /* PREFIX_VEX_0F38DC */
5117
  {
5118
    { Bad_Opcode },
5119
    { Bad_Opcode },
5120
    { VEX_LEN_TABLE (VEX_LEN_0F38DC_P_2) },
5121
  },
5122
 
5123
  /* PREFIX_VEX_0F38DD */
5124
  {
5125
    { Bad_Opcode },
5126
    { Bad_Opcode },
5127
    { VEX_LEN_TABLE (VEX_LEN_0F38DD_P_2) },
5128
  },
5129
 
5130
  /* PREFIX_VEX_0F38DE */
5131
  {
5132
    { Bad_Opcode },
5133
    { Bad_Opcode },
5134
    { VEX_LEN_TABLE (VEX_LEN_0F38DE_P_2) },
5135
  },
5136
 
5137
  /* PREFIX_VEX_0F38DF */
5138
  {
5139
    { Bad_Opcode },
5140
    { Bad_Opcode },
5141
    { VEX_LEN_TABLE (VEX_LEN_0F38DF_P_2) },
5142
  },
5143
 
5144
  /* PREFIX_VEX_0F38F2 */
5145
  {
5146
    { VEX_LEN_TABLE (VEX_LEN_0F38F2_P_0) },
5147
  },
5148
 
5149
  /* PREFIX_VEX_0F38F3_REG_1 */
5150
  {
5151
    { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_1_P_0) },
5152
  },
5153
 
5154
  /* PREFIX_VEX_0F38F3_REG_2 */
5155
  {
5156
    { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_2_P_0) },
5157
  },
5158
 
5159
  /* PREFIX_VEX_0F38F3_REG_3 */
5160
  {
5161
    { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_3_P_0) },
5162
  },
5163
 
5164 148 khays
  /* PREFIX_VEX_0F38F5 */
5165
  {
5166
    { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_0) },
5167
    { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_1) },
5168
    { Bad_Opcode },
5169
    { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_3) },
5170
  },
5171
 
5172
  /* PREFIX_VEX_0F38F6 */
5173
  {
5174
    { Bad_Opcode },
5175
    { Bad_Opcode },
5176
    { Bad_Opcode },
5177
    { VEX_LEN_TABLE (VEX_LEN_0F38F6_P_3) },
5178
  },
5179
 
5180 18 khays
  /* PREFIX_VEX_0F38F7 */
5181
  {
5182
    { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_0) },
5183 148 khays
    { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_1) },
5184
    { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_2) },
5185
    { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_3) },
5186 18 khays
  },
5187
 
5188 148 khays
  /* PREFIX_VEX_0F3A00 */
5189
  {
5190
    { Bad_Opcode },
5191
    { Bad_Opcode },
5192
    { VEX_LEN_TABLE (VEX_LEN_0F3A00_P_2) },
5193
  },
5194
 
5195
  /* PREFIX_VEX_0F3A01 */
5196
  {
5197
    { Bad_Opcode },
5198
    { Bad_Opcode },
5199
    { VEX_LEN_TABLE (VEX_LEN_0F3A01_P_2) },
5200
  },
5201
 
5202
  /* PREFIX_VEX_0F3A02 */
5203
  {
5204
    { Bad_Opcode },
5205
    { Bad_Opcode },
5206
    { VEX_W_TABLE (VEX_W_0F3A02_P_2) },
5207
  },
5208
 
5209 18 khays
  /* PREFIX_VEX_0F3A04 */
5210
  {
5211
    { Bad_Opcode },
5212
    { Bad_Opcode },
5213
    { VEX_W_TABLE (VEX_W_0F3A04_P_2) },
5214
  },
5215
 
5216
  /* PREFIX_VEX_0F3A05 */
5217
  {
5218
    { Bad_Opcode },
5219
    { Bad_Opcode },
5220
    { VEX_W_TABLE (VEX_W_0F3A05_P_2) },
5221
  },
5222
 
5223
  /* PREFIX_VEX_0F3A06 */
5224
  {
5225
    { Bad_Opcode },
5226
    { Bad_Opcode },
5227
    { VEX_LEN_TABLE (VEX_LEN_0F3A06_P_2) },
5228
  },
5229
 
5230
  /* PREFIX_VEX_0F3A08 */
5231
  {
5232
    { Bad_Opcode },
5233
    { Bad_Opcode },
5234
    { VEX_W_TABLE (VEX_W_0F3A08_P_2) },
5235
  },
5236
 
5237
  /* PREFIX_VEX_0F3A09 */
5238
  {
5239
    { Bad_Opcode },
5240
    { Bad_Opcode },
5241
    { VEX_W_TABLE (VEX_W_0F3A09_P_2) },
5242
  },
5243
 
5244
  /* PREFIX_VEX_0F3A0A */
5245
  {
5246
    { Bad_Opcode },
5247
    { Bad_Opcode },
5248
    { VEX_LEN_TABLE (VEX_LEN_0F3A0A_P_2) },
5249
  },
5250
 
5251
  /* PREFIX_VEX_0F3A0B */
5252
  {
5253
    { Bad_Opcode },
5254
    { Bad_Opcode },
5255
    { VEX_LEN_TABLE (VEX_LEN_0F3A0B_P_2) },
5256
  },
5257
 
5258
  /* PREFIX_VEX_0F3A0C */
5259
  {
5260
    { Bad_Opcode },
5261
    { Bad_Opcode },
5262
    { VEX_W_TABLE (VEX_W_0F3A0C_P_2) },
5263
  },
5264
 
5265
  /* PREFIX_VEX_0F3A0D */
5266
  {
5267
    { Bad_Opcode },
5268
    { Bad_Opcode },
5269
    { VEX_W_TABLE (VEX_W_0F3A0D_P_2) },
5270
  },
5271
 
5272
  /* PREFIX_VEX_0F3A0E */
5273
  {
5274
    { Bad_Opcode },
5275
    { Bad_Opcode },
5276 148 khays
    { VEX_W_TABLE (VEX_W_0F3A0E_P_2) },
5277 18 khays
  },
5278
 
5279
  /* PREFIX_VEX_0F3A0F */
5280
  {
5281
    { Bad_Opcode },
5282
    { Bad_Opcode },
5283 148 khays
    { VEX_W_TABLE (VEX_W_0F3A0F_P_2) },
5284 18 khays
  },
5285
 
5286
  /* PREFIX_VEX_0F3A14 */
5287
  {
5288
    { Bad_Opcode },
5289
    { Bad_Opcode },
5290
    { VEX_LEN_TABLE (VEX_LEN_0F3A14_P_2) },
5291
  },
5292
 
5293
  /* PREFIX_VEX_0F3A15 */
5294
  {
5295
    { Bad_Opcode },
5296
    { Bad_Opcode },
5297
    { VEX_LEN_TABLE (VEX_LEN_0F3A15_P_2) },
5298
  },
5299
 
5300
  /* PREFIX_VEX_0F3A16 */
5301
  {
5302
    { Bad_Opcode },
5303
    { Bad_Opcode },
5304
    { VEX_LEN_TABLE (VEX_LEN_0F3A16_P_2) },
5305
  },
5306
 
5307
  /* PREFIX_VEX_0F3A17 */
5308
  {
5309
    { Bad_Opcode },
5310
    { Bad_Opcode },
5311
    { VEX_LEN_TABLE (VEX_LEN_0F3A17_P_2) },
5312
  },
5313
 
5314
  /* PREFIX_VEX_0F3A18 */
5315
  {
5316
    { Bad_Opcode },
5317
    { Bad_Opcode },
5318
    { VEX_LEN_TABLE (VEX_LEN_0F3A18_P_2) },
5319
  },
5320
 
5321
  /* PREFIX_VEX_0F3A19 */
5322
  {
5323
    { Bad_Opcode },
5324
    { Bad_Opcode },
5325
    { VEX_LEN_TABLE (VEX_LEN_0F3A19_P_2) },
5326
  },
5327
 
5328
  /* PREFIX_VEX_0F3A1D */
5329
  {
5330
    { Bad_Opcode },
5331
    { Bad_Opcode },
5332
    { "vcvtps2ph", { EXxmmq, XM, Ib } },
5333
  },
5334
 
5335
  /* PREFIX_VEX_0F3A20 */
5336
  {
5337
    { Bad_Opcode },
5338
    { Bad_Opcode },
5339
    { VEX_LEN_TABLE (VEX_LEN_0F3A20_P_2) },
5340
  },
5341
 
5342
  /* PREFIX_VEX_0F3A21 */
5343
  {
5344
    { Bad_Opcode },
5345
    { Bad_Opcode },
5346
    { VEX_LEN_TABLE (VEX_LEN_0F3A21_P_2) },
5347
  },
5348
 
5349
  /* PREFIX_VEX_0F3A22 */
5350
  {
5351
    { Bad_Opcode },
5352
    { Bad_Opcode },
5353
    { VEX_LEN_TABLE (VEX_LEN_0F3A22_P_2) },
5354
  },
5355
 
5356 148 khays
  /* PREFIX_VEX_0F3A38 */
5357
  {
5358
    { Bad_Opcode },
5359
    { Bad_Opcode },
5360
    { VEX_LEN_TABLE (VEX_LEN_0F3A38_P_2) },
5361
  },
5362
 
5363
  /* PREFIX_VEX_0F3A39 */
5364
  {
5365
    { Bad_Opcode },
5366
    { Bad_Opcode },
5367
    { VEX_LEN_TABLE (VEX_LEN_0F3A39_P_2) },
5368
  },
5369
 
5370 18 khays
  /* PREFIX_VEX_0F3A40 */
5371
  {
5372
    { Bad_Opcode },
5373
    { Bad_Opcode },
5374
    { VEX_W_TABLE (VEX_W_0F3A40_P_2) },
5375
  },
5376
 
5377
  /* PREFIX_VEX_0F3A41 */
5378
  {
5379
    { Bad_Opcode },
5380
    { Bad_Opcode },
5381
    { VEX_LEN_TABLE (VEX_LEN_0F3A41_P_2) },
5382
  },
5383
 
5384
  /* PREFIX_VEX_0F3A42 */
5385
  {
5386
    { Bad_Opcode },
5387
    { Bad_Opcode },
5388 148 khays
    { VEX_W_TABLE (VEX_W_0F3A42_P_2) },
5389 18 khays
  },
5390
 
5391
  /* PREFIX_VEX_0F3A44 */
5392
  {
5393
    { Bad_Opcode },
5394
    { Bad_Opcode },
5395
    { VEX_LEN_TABLE (VEX_LEN_0F3A44_P_2) },
5396
  },
5397
 
5398 148 khays
  /* PREFIX_VEX_0F3A46 */
5399
  {
5400
    { Bad_Opcode },
5401
    { Bad_Opcode },
5402
    { VEX_LEN_TABLE (VEX_LEN_0F3A46_P_2) },
5403
  },
5404
 
5405 18 khays
  /* PREFIX_VEX_0F3A48 */
5406
  {
5407
    { Bad_Opcode },
5408
    { Bad_Opcode },
5409
    { VEX_W_TABLE (VEX_W_0F3A48_P_2) },
5410
  },
5411
 
5412
  /* PREFIX_VEX_0F3A49 */
5413
  {
5414
    { Bad_Opcode },
5415
    { Bad_Opcode },
5416
    { VEX_W_TABLE (VEX_W_0F3A49_P_2) },
5417
  },
5418
 
5419
  /* PREFIX_VEX_0F3A4A */
5420
  {
5421
    { Bad_Opcode },
5422
    { Bad_Opcode },
5423
    { VEX_W_TABLE (VEX_W_0F3A4A_P_2) },
5424
  },
5425
 
5426
  /* PREFIX_VEX_0F3A4B */
5427
  {
5428
    { Bad_Opcode },
5429
    { Bad_Opcode },
5430
    { VEX_W_TABLE (VEX_W_0F3A4B_P_2) },
5431
  },
5432
 
5433
  /* PREFIX_VEX_0F3A4C */
5434
  {
5435
    { Bad_Opcode },
5436
    { Bad_Opcode },
5437 148 khays
    { VEX_W_TABLE (VEX_W_0F3A4C_P_2) },
5438 18 khays
  },
5439
 
5440
  /* PREFIX_VEX_0F3A5C */
5441
  {
5442
    { Bad_Opcode },
5443
    { Bad_Opcode },
5444
    { "vfmaddsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5445
  },
5446
 
5447
  /* PREFIX_VEX_0F3A5D */
5448
  {
5449
    { Bad_Opcode },
5450
    { Bad_Opcode },
5451
    { "vfmaddsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5452
  },
5453
 
5454
  /* PREFIX_VEX_0F3A5E */
5455
  {
5456
    { Bad_Opcode },
5457
    { Bad_Opcode },
5458
    { "vfmsubaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5459
  },
5460
 
5461
  /* PREFIX_VEX_0F3A5F */
5462
  {
5463
    { Bad_Opcode },
5464
    { Bad_Opcode },
5465
    { "vfmsubaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5466
  },
5467
 
5468
  /* PREFIX_VEX_0F3A60 */
5469
  {
5470
    { Bad_Opcode },
5471
    { Bad_Opcode },
5472
    { VEX_LEN_TABLE (VEX_LEN_0F3A60_P_2) },
5473
    { Bad_Opcode },
5474
  },
5475
 
5476
  /* PREFIX_VEX_0F3A61 */
5477
  {
5478
    { Bad_Opcode },
5479
    { Bad_Opcode },
5480
    { VEX_LEN_TABLE (VEX_LEN_0F3A61_P_2) },
5481
  },
5482
 
5483
  /* PREFIX_VEX_0F3A62 */
5484
  {
5485
    { Bad_Opcode },
5486
    { Bad_Opcode },
5487
    { VEX_LEN_TABLE (VEX_LEN_0F3A62_P_2) },
5488
  },
5489
 
5490
  /* PREFIX_VEX_0F3A63 */
5491
  {
5492
    { Bad_Opcode },
5493
    { Bad_Opcode },
5494
    { VEX_LEN_TABLE (VEX_LEN_0F3A63_P_2) },
5495
  },
5496
 
5497
  /* PREFIX_VEX_0F3A68 */
5498
  {
5499
    { Bad_Opcode },
5500
    { Bad_Opcode },
5501
    { "vfmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5502
  },
5503
 
5504
  /* PREFIX_VEX_0F3A69 */
5505
  {
5506
    { Bad_Opcode },
5507
    { Bad_Opcode },
5508
    { "vfmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5509
  },
5510
 
5511
  /* PREFIX_VEX_0F3A6A */
5512
  {
5513
    { Bad_Opcode },
5514
    { Bad_Opcode },
5515
    { VEX_LEN_TABLE (VEX_LEN_0F3A6A_P_2) },
5516
  },
5517
 
5518
  /* PREFIX_VEX_0F3A6B */
5519
  {
5520
    { Bad_Opcode },
5521
    { Bad_Opcode },
5522
    { VEX_LEN_TABLE (VEX_LEN_0F3A6B_P_2) },
5523
  },
5524
 
5525
  /* PREFIX_VEX_0F3A6C */
5526
  {
5527
    { Bad_Opcode },
5528
    { Bad_Opcode },
5529
    { "vfmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5530
  },
5531
 
5532
  /* PREFIX_VEX_0F3A6D */
5533
  {
5534
    { Bad_Opcode },
5535
    { Bad_Opcode },
5536
    { "vfmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5537
  },
5538
 
5539
  /* PREFIX_VEX_0F3A6E */
5540
  {
5541
    { Bad_Opcode },
5542
    { Bad_Opcode },
5543
    { VEX_LEN_TABLE (VEX_LEN_0F3A6E_P_2) },
5544
  },
5545
 
5546
  /* PREFIX_VEX_0F3A6F */
5547
  {
5548
    { Bad_Opcode },
5549
    { Bad_Opcode },
5550
    { VEX_LEN_TABLE (VEX_LEN_0F3A6F_P_2) },
5551
  },
5552
 
5553
  /* PREFIX_VEX_0F3A78 */
5554
  {
5555
    { Bad_Opcode },
5556
    { Bad_Opcode },
5557
    { "vfnmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5558
  },
5559
 
5560
  /* PREFIX_VEX_0F3A79 */
5561
  {
5562
    { Bad_Opcode },
5563
    { Bad_Opcode },
5564
    { "vfnmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5565
  },
5566
 
5567
  /* PREFIX_VEX_0F3A7A */
5568
  {
5569
    { Bad_Opcode },
5570
    { Bad_Opcode },
5571
    { VEX_LEN_TABLE (VEX_LEN_0F3A7A_P_2) },
5572
  },
5573
 
5574
  /* PREFIX_VEX_0F3A7B */
5575
  {
5576
    { Bad_Opcode },
5577
    { Bad_Opcode },
5578
    { VEX_LEN_TABLE (VEX_LEN_0F3A7B_P_2) },
5579
  },
5580
 
5581
  /* PREFIX_VEX_0F3A7C */
5582
  {
5583
    { Bad_Opcode },
5584
    { Bad_Opcode },
5585
    { "vfnmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5586
    { Bad_Opcode },
5587
  },
5588
 
5589
  /* PREFIX_VEX_0F3A7D */
5590
  {
5591
    { Bad_Opcode },
5592
    { Bad_Opcode },
5593
    { "vfnmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5594
  },
5595
 
5596
  /* PREFIX_VEX_0F3A7E */
5597
  {
5598
    { Bad_Opcode },
5599
    { Bad_Opcode },
5600
    { VEX_LEN_TABLE (VEX_LEN_0F3A7E_P_2) },
5601
  },
5602
 
5603
  /* PREFIX_VEX_0F3A7F */
5604
  {
5605
    { Bad_Opcode },
5606
    { Bad_Opcode },
5607
    { VEX_LEN_TABLE (VEX_LEN_0F3A7F_P_2) },
5608
  },
5609
 
5610
  /* PREFIX_VEX_0F3ADF */
5611
  {
5612
    { Bad_Opcode },
5613
    { Bad_Opcode },
5614
    { VEX_LEN_TABLE (VEX_LEN_0F3ADF_P_2) },
5615
  },
5616 148 khays
 
5617
  /* PREFIX_VEX_0F3AF0 */
5618
  {
5619
    { Bad_Opcode },
5620
    { Bad_Opcode },
5621
    { Bad_Opcode },
5622
    { VEX_LEN_TABLE (VEX_LEN_0F3AF0_P_3) },
5623
  },
5624 18 khays
};
5625
 
5626
static const struct dis386 x86_64_table[][2] = {
5627
  /* X86_64_06 */
5628
  {
5629
    { "pushP", { es } },
5630
  },
5631
 
5632
  /* X86_64_07 */
5633
  {
5634
    { "popP", { es } },
5635
  },
5636
 
5637
  /* X86_64_0D */
5638
  {
5639
    { "pushP", { cs } },
5640
  },
5641
 
5642
  /* X86_64_16 */
5643
  {
5644
    { "pushP", { ss } },
5645
  },
5646
 
5647
  /* X86_64_17 */
5648
  {
5649
    { "popP", { ss } },
5650
  },
5651
 
5652
  /* X86_64_1E */
5653
  {
5654
    { "pushP", { ds } },
5655
  },
5656
 
5657
  /* X86_64_1F */
5658
  {
5659
    { "popP", { ds } },
5660
  },
5661
 
5662
  /* X86_64_27 */
5663
  {
5664
    { "daa", { XX } },
5665
  },
5666
 
5667
  /* X86_64_2F */
5668
  {
5669
    { "das", { XX } },
5670
  },
5671
 
5672
  /* X86_64_37 */
5673
  {
5674
    { "aaa", { XX } },
5675
  },
5676
 
5677
  /* X86_64_3F */
5678
  {
5679
    { "aas", { XX } },
5680
  },
5681
 
5682
  /* X86_64_60 */
5683
  {
5684
    { "pushaP", { XX } },
5685
  },
5686
 
5687
  /* X86_64_61 */
5688
  {
5689
    { "popaP", { XX } },
5690
  },
5691
 
5692
  /* X86_64_62 */
5693
  {
5694
    { MOD_TABLE (MOD_62_32BIT) },
5695
  },
5696
 
5697
  /* X86_64_63 */
5698
  {
5699
    { "arpl", { Ew, Gw } },
5700
    { "movs{lq|xd}", { Gv, Ed } },
5701
  },
5702
 
5703
  /* X86_64_6D */
5704
  {
5705
    { "ins{R|}", { Yzr, indirDX } },
5706
    { "ins{G|}", { Yzr, indirDX } },
5707
  },
5708
 
5709
  /* X86_64_6F */
5710
  {
5711
    { "outs{R|}", { indirDXr, Xz } },
5712
    { "outs{G|}", { indirDXr, Xz } },
5713
  },
5714
 
5715
  /* X86_64_9A */
5716
  {
5717
    { "Jcall{T|}", { Ap } },
5718
  },
5719
 
5720
  /* X86_64_C4 */
5721
  {
5722
    { MOD_TABLE (MOD_C4_32BIT) },
5723
    { VEX_C4_TABLE (VEX_0F) },
5724
  },
5725
 
5726
  /* X86_64_C5 */
5727
  {
5728
    { MOD_TABLE (MOD_C5_32BIT) },
5729
    { VEX_C5_TABLE (VEX_0F) },
5730
  },
5731
 
5732
  /* X86_64_CE */
5733
  {
5734
    { "into", { XX } },
5735
  },
5736
 
5737
  /* X86_64_D4 */
5738
  {
5739
    { "aam", { Ib } },
5740
  },
5741
 
5742
  /* X86_64_D5 */
5743
  {
5744
    { "aad", { Ib } },
5745
  },
5746
 
5747
  /* X86_64_EA */
5748
  {
5749
    { "Jjmp{T|}", { Ap } },
5750
  },
5751
 
5752
  /* X86_64_0F01_REG_0 */
5753
  {
5754
    { "sgdt{Q|IQ}", { M } },
5755
    { "sgdt", { M } },
5756
  },
5757
 
5758
  /* X86_64_0F01_REG_1 */
5759
  {
5760
    { "sidt{Q|IQ}", { M } },
5761
    { "sidt", { M } },
5762
  },
5763
 
5764
  /* X86_64_0F01_REG_2 */
5765
  {
5766
    { "lgdt{Q|Q}", { M } },
5767
    { "lgdt", { M } },
5768
  },
5769
 
5770
  /* X86_64_0F01_REG_3 */
5771
  {
5772
    { "lidt{Q|Q}", { M } },
5773
    { "lidt", { M } },
5774
  },
5775
};
5776
 
5777
static const struct dis386 three_byte_table[][256] = {
5778
 
5779
  /* THREE_BYTE_0F38 */
5780
  {
5781
    /* 00 */
5782
    { "pshufb",         { MX, EM } },
5783
    { "phaddw",         { MX, EM } },
5784
    { "phaddd",         { MX, EM } },
5785
    { "phaddsw",        { MX, EM } },
5786
    { "pmaddubsw",      { MX, EM } },
5787
    { "phsubw",         { MX, EM } },
5788
    { "phsubd",         { MX, EM } },
5789
    { "phsubsw",        { MX, EM } },
5790
    /* 08 */
5791
    { "psignb",         { MX, EM } },
5792
    { "psignw",         { MX, EM } },
5793
    { "psignd",         { MX, EM } },
5794
    { "pmulhrsw",       { MX, EM } },
5795
    { Bad_Opcode },
5796
    { Bad_Opcode },
5797
    { Bad_Opcode },
5798
    { Bad_Opcode },
5799
    /* 10 */
5800
    { PREFIX_TABLE (PREFIX_0F3810) },
5801
    { Bad_Opcode },
5802
    { Bad_Opcode },
5803
    { Bad_Opcode },
5804
    { PREFIX_TABLE (PREFIX_0F3814) },
5805
    { PREFIX_TABLE (PREFIX_0F3815) },
5806
    { Bad_Opcode },
5807
    { PREFIX_TABLE (PREFIX_0F3817) },
5808
    /* 18 */
5809
    { Bad_Opcode },
5810
    { Bad_Opcode },
5811
    { Bad_Opcode },
5812
    { Bad_Opcode },
5813
    { "pabsb",          { MX, EM } },
5814
    { "pabsw",          { MX, EM } },
5815
    { "pabsd",          { MX, EM } },
5816
    { Bad_Opcode },
5817
    /* 20 */
5818
    { PREFIX_TABLE (PREFIX_0F3820) },
5819
    { PREFIX_TABLE (PREFIX_0F3821) },
5820
    { PREFIX_TABLE (PREFIX_0F3822) },
5821
    { PREFIX_TABLE (PREFIX_0F3823) },
5822
    { PREFIX_TABLE (PREFIX_0F3824) },
5823
    { PREFIX_TABLE (PREFIX_0F3825) },
5824
    { Bad_Opcode },
5825
    { Bad_Opcode },
5826
    /* 28 */
5827
    { PREFIX_TABLE (PREFIX_0F3828) },
5828
    { PREFIX_TABLE (PREFIX_0F3829) },
5829
    { PREFIX_TABLE (PREFIX_0F382A) },
5830
    { PREFIX_TABLE (PREFIX_0F382B) },
5831
    { Bad_Opcode },
5832
    { Bad_Opcode },
5833
    { Bad_Opcode },
5834
    { Bad_Opcode },
5835
    /* 30 */
5836
    { PREFIX_TABLE (PREFIX_0F3830) },
5837
    { PREFIX_TABLE (PREFIX_0F3831) },
5838
    { PREFIX_TABLE (PREFIX_0F3832) },
5839
    { PREFIX_TABLE (PREFIX_0F3833) },
5840
    { PREFIX_TABLE (PREFIX_0F3834) },
5841
    { PREFIX_TABLE (PREFIX_0F3835) },
5842
    { Bad_Opcode },
5843
    { PREFIX_TABLE (PREFIX_0F3837) },
5844
    /* 38 */
5845
    { PREFIX_TABLE (PREFIX_0F3838) },
5846
    { PREFIX_TABLE (PREFIX_0F3839) },
5847
    { PREFIX_TABLE (PREFIX_0F383A) },
5848
    { PREFIX_TABLE (PREFIX_0F383B) },
5849
    { PREFIX_TABLE (PREFIX_0F383C) },
5850
    { PREFIX_TABLE (PREFIX_0F383D) },
5851
    { PREFIX_TABLE (PREFIX_0F383E) },
5852
    { PREFIX_TABLE (PREFIX_0F383F) },
5853
    /* 40 */
5854
    { PREFIX_TABLE (PREFIX_0F3840) },
5855
    { PREFIX_TABLE (PREFIX_0F3841) },
5856
    { Bad_Opcode },
5857
    { Bad_Opcode },
5858
    { Bad_Opcode },
5859
    { Bad_Opcode },
5860
    { Bad_Opcode },
5861
    { Bad_Opcode },
5862
    /* 48 */
5863
    { Bad_Opcode },
5864
    { Bad_Opcode },
5865
    { Bad_Opcode },
5866
    { Bad_Opcode },
5867
    { Bad_Opcode },
5868
    { Bad_Opcode },
5869
    { Bad_Opcode },
5870
    { Bad_Opcode },
5871
    /* 50 */
5872
    { Bad_Opcode },
5873
    { Bad_Opcode },
5874
    { Bad_Opcode },
5875
    { Bad_Opcode },
5876
    { Bad_Opcode },
5877
    { Bad_Opcode },
5878
    { Bad_Opcode },
5879
    { Bad_Opcode },
5880
    /* 58 */
5881
    { Bad_Opcode },
5882
    { Bad_Opcode },
5883
    { Bad_Opcode },
5884
    { Bad_Opcode },
5885
    { Bad_Opcode },
5886
    { Bad_Opcode },
5887
    { Bad_Opcode },
5888
    { Bad_Opcode },
5889
    /* 60 */
5890
    { Bad_Opcode },
5891
    { Bad_Opcode },
5892
    { Bad_Opcode },
5893
    { Bad_Opcode },
5894
    { Bad_Opcode },
5895
    { Bad_Opcode },
5896
    { Bad_Opcode },
5897
    { Bad_Opcode },
5898
    /* 68 */
5899
    { Bad_Opcode },
5900
    { Bad_Opcode },
5901
    { Bad_Opcode },
5902
    { Bad_Opcode },
5903
    { Bad_Opcode },
5904
    { Bad_Opcode },
5905
    { Bad_Opcode },
5906
    { Bad_Opcode },
5907
    /* 70 */
5908
    { Bad_Opcode },
5909
    { Bad_Opcode },
5910
    { Bad_Opcode },
5911
    { Bad_Opcode },
5912
    { Bad_Opcode },
5913
    { Bad_Opcode },
5914
    { Bad_Opcode },
5915
    { Bad_Opcode },
5916
    /* 78 */
5917
    { Bad_Opcode },
5918
    { Bad_Opcode },
5919
    { Bad_Opcode },
5920
    { Bad_Opcode },
5921
    { Bad_Opcode },
5922
    { Bad_Opcode },
5923
    { Bad_Opcode },
5924
    { Bad_Opcode },
5925
    /* 80 */
5926
    { PREFIX_TABLE (PREFIX_0F3880) },
5927
    { PREFIX_TABLE (PREFIX_0F3881) },
5928 148 khays
    { PREFIX_TABLE (PREFIX_0F3882) },
5929 18 khays
    { Bad_Opcode },
5930
    { Bad_Opcode },
5931
    { Bad_Opcode },
5932
    { Bad_Opcode },
5933
    { Bad_Opcode },
5934
    /* 88 */
5935
    { Bad_Opcode },
5936
    { Bad_Opcode },
5937
    { Bad_Opcode },
5938
    { Bad_Opcode },
5939
    { Bad_Opcode },
5940
    { Bad_Opcode },
5941
    { Bad_Opcode },
5942
    { Bad_Opcode },
5943
    /* 90 */
5944
    { Bad_Opcode },
5945
    { Bad_Opcode },
5946
    { Bad_Opcode },
5947
    { Bad_Opcode },
5948
    { Bad_Opcode },
5949
    { Bad_Opcode },
5950
    { Bad_Opcode },
5951
    { Bad_Opcode },
5952
    /* 98 */
5953
    { Bad_Opcode },
5954
    { Bad_Opcode },
5955
    { Bad_Opcode },
5956
    { Bad_Opcode },
5957
    { Bad_Opcode },
5958
    { Bad_Opcode },
5959
    { Bad_Opcode },
5960
    { Bad_Opcode },
5961
    /* a0 */
5962
    { Bad_Opcode },
5963
    { Bad_Opcode },
5964
    { Bad_Opcode },
5965
    { Bad_Opcode },
5966
    { Bad_Opcode },
5967
    { Bad_Opcode },
5968
    { Bad_Opcode },
5969
    { Bad_Opcode },
5970
    /* a8 */
5971
    { Bad_Opcode },
5972
    { Bad_Opcode },
5973
    { Bad_Opcode },
5974
    { Bad_Opcode },
5975
    { Bad_Opcode },
5976
    { Bad_Opcode },
5977
    { Bad_Opcode },
5978
    { Bad_Opcode },
5979
    /* b0 */
5980
    { Bad_Opcode },
5981
    { Bad_Opcode },
5982
    { Bad_Opcode },
5983
    { Bad_Opcode },
5984
    { Bad_Opcode },
5985
    { Bad_Opcode },
5986
    { Bad_Opcode },
5987
    { Bad_Opcode },
5988
    /* b8 */
5989
    { Bad_Opcode },
5990
    { Bad_Opcode },
5991
    { Bad_Opcode },
5992
    { Bad_Opcode },
5993
    { Bad_Opcode },
5994
    { Bad_Opcode },
5995
    { Bad_Opcode },
5996
    { Bad_Opcode },
5997
    /* c0 */
5998
    { Bad_Opcode },
5999
    { Bad_Opcode },
6000
    { Bad_Opcode },
6001
    { Bad_Opcode },
6002
    { Bad_Opcode },
6003
    { Bad_Opcode },
6004
    { Bad_Opcode },
6005
    { Bad_Opcode },
6006
    /* c8 */
6007
    { Bad_Opcode },
6008
    { Bad_Opcode },
6009
    { Bad_Opcode },
6010
    { Bad_Opcode },
6011
    { Bad_Opcode },
6012
    { Bad_Opcode },
6013
    { Bad_Opcode },
6014
    { Bad_Opcode },
6015
    /* d0 */
6016
    { Bad_Opcode },
6017
    { Bad_Opcode },
6018
    { Bad_Opcode },
6019
    { Bad_Opcode },
6020
    { Bad_Opcode },
6021
    { Bad_Opcode },
6022
    { Bad_Opcode },
6023
    { Bad_Opcode },
6024
    /* d8 */
6025
    { Bad_Opcode },
6026
    { Bad_Opcode },
6027
    { Bad_Opcode },
6028
    { PREFIX_TABLE (PREFIX_0F38DB) },
6029
    { PREFIX_TABLE (PREFIX_0F38DC) },
6030
    { PREFIX_TABLE (PREFIX_0F38DD) },
6031
    { PREFIX_TABLE (PREFIX_0F38DE) },
6032
    { PREFIX_TABLE (PREFIX_0F38DF) },
6033
    /* e0 */
6034
    { Bad_Opcode },
6035
    { Bad_Opcode },
6036
    { Bad_Opcode },
6037
    { Bad_Opcode },
6038
    { Bad_Opcode },
6039
    { Bad_Opcode },
6040
    { Bad_Opcode },
6041
    { Bad_Opcode },
6042
    /* e8 */
6043
    { Bad_Opcode },
6044
    { Bad_Opcode },
6045
    { Bad_Opcode },
6046
    { Bad_Opcode },
6047
    { Bad_Opcode },
6048
    { Bad_Opcode },
6049
    { Bad_Opcode },
6050
    { Bad_Opcode },
6051
    /* f0 */
6052
    { PREFIX_TABLE (PREFIX_0F38F0) },
6053
    { PREFIX_TABLE (PREFIX_0F38F1) },
6054
    { Bad_Opcode },
6055
    { Bad_Opcode },
6056
    { Bad_Opcode },
6057
    { Bad_Opcode },
6058
    { Bad_Opcode },
6059
    { Bad_Opcode },
6060
    /* f8 */
6061
    { Bad_Opcode },
6062
    { Bad_Opcode },
6063
    { Bad_Opcode },
6064
    { Bad_Opcode },
6065
    { Bad_Opcode },
6066
    { Bad_Opcode },
6067
    { Bad_Opcode },
6068
    { Bad_Opcode },
6069
  },
6070
  /* THREE_BYTE_0F3A */
6071
  {
6072
    /* 00 */
6073
    { Bad_Opcode },
6074
    { Bad_Opcode },
6075
    { Bad_Opcode },
6076
    { Bad_Opcode },
6077
    { Bad_Opcode },
6078
    { Bad_Opcode },
6079
    { Bad_Opcode },
6080
    { Bad_Opcode },
6081
    /* 08 */
6082
    { PREFIX_TABLE (PREFIX_0F3A08) },
6083
    { PREFIX_TABLE (PREFIX_0F3A09) },
6084
    { PREFIX_TABLE (PREFIX_0F3A0A) },
6085
    { PREFIX_TABLE (PREFIX_0F3A0B) },
6086
    { PREFIX_TABLE (PREFIX_0F3A0C) },
6087
    { PREFIX_TABLE (PREFIX_0F3A0D) },
6088
    { PREFIX_TABLE (PREFIX_0F3A0E) },
6089
    { "palignr",        { MX, EM, Ib } },
6090
    /* 10 */
6091
    { Bad_Opcode },
6092
    { Bad_Opcode },
6093
    { Bad_Opcode },
6094
    { Bad_Opcode },
6095
    { PREFIX_TABLE (PREFIX_0F3A14) },
6096
    { PREFIX_TABLE (PREFIX_0F3A15) },
6097
    { PREFIX_TABLE (PREFIX_0F3A16) },
6098
    { PREFIX_TABLE (PREFIX_0F3A17) },
6099
    /* 18 */
6100
    { Bad_Opcode },
6101
    { Bad_Opcode },
6102
    { Bad_Opcode },
6103
    { Bad_Opcode },
6104
    { Bad_Opcode },
6105
    { Bad_Opcode },
6106
    { Bad_Opcode },
6107
    { Bad_Opcode },
6108
    /* 20 */
6109
    { PREFIX_TABLE (PREFIX_0F3A20) },
6110
    { PREFIX_TABLE (PREFIX_0F3A21) },
6111
    { PREFIX_TABLE (PREFIX_0F3A22) },
6112
    { Bad_Opcode },
6113
    { Bad_Opcode },
6114
    { Bad_Opcode },
6115
    { Bad_Opcode },
6116
    { Bad_Opcode },
6117
    /* 28 */
6118
    { Bad_Opcode },
6119
    { Bad_Opcode },
6120
    { Bad_Opcode },
6121
    { Bad_Opcode },
6122
    { Bad_Opcode },
6123
    { Bad_Opcode },
6124
    { Bad_Opcode },
6125
    { Bad_Opcode },
6126
    /* 30 */
6127
    { Bad_Opcode },
6128
    { Bad_Opcode },
6129
    { Bad_Opcode },
6130
    { Bad_Opcode },
6131
    { Bad_Opcode },
6132
    { Bad_Opcode },
6133
    { Bad_Opcode },
6134
    { Bad_Opcode },
6135
    /* 38 */
6136
    { Bad_Opcode },
6137
    { Bad_Opcode },
6138
    { Bad_Opcode },
6139
    { Bad_Opcode },
6140
    { Bad_Opcode },
6141
    { Bad_Opcode },
6142
    { Bad_Opcode },
6143
    { Bad_Opcode },
6144
    /* 40 */
6145
    { PREFIX_TABLE (PREFIX_0F3A40) },
6146
    { PREFIX_TABLE (PREFIX_0F3A41) },
6147
    { PREFIX_TABLE (PREFIX_0F3A42) },
6148
    { Bad_Opcode },
6149
    { PREFIX_TABLE (PREFIX_0F3A44) },
6150
    { Bad_Opcode },
6151
    { Bad_Opcode },
6152
    { Bad_Opcode },
6153
    /* 48 */
6154
    { Bad_Opcode },
6155
    { Bad_Opcode },
6156
    { Bad_Opcode },
6157
    { Bad_Opcode },
6158
    { Bad_Opcode },
6159
    { Bad_Opcode },
6160
    { Bad_Opcode },
6161
    { Bad_Opcode },
6162
    /* 50 */
6163
    { Bad_Opcode },
6164
    { Bad_Opcode },
6165
    { Bad_Opcode },
6166
    { Bad_Opcode },
6167
    { Bad_Opcode },
6168
    { Bad_Opcode },
6169
    { Bad_Opcode },
6170
    { Bad_Opcode },
6171
    /* 58 */
6172
    { Bad_Opcode },
6173
    { Bad_Opcode },
6174
    { Bad_Opcode },
6175
    { Bad_Opcode },
6176
    { Bad_Opcode },
6177
    { Bad_Opcode },
6178
    { Bad_Opcode },
6179
    { Bad_Opcode },
6180
    /* 60 */
6181
    { PREFIX_TABLE (PREFIX_0F3A60) },
6182
    { PREFIX_TABLE (PREFIX_0F3A61) },
6183
    { PREFIX_TABLE (PREFIX_0F3A62) },
6184
    { PREFIX_TABLE (PREFIX_0F3A63) },
6185
    { Bad_Opcode },
6186
    { Bad_Opcode },
6187
    { Bad_Opcode },
6188
    { Bad_Opcode },
6189
    /* 68 */
6190
    { Bad_Opcode },
6191
    { Bad_Opcode },
6192
    { Bad_Opcode },
6193
    { Bad_Opcode },
6194
    { Bad_Opcode },
6195
    { Bad_Opcode },
6196
    { Bad_Opcode },
6197
    { Bad_Opcode },
6198
    /* 70 */
6199
    { Bad_Opcode },
6200
    { Bad_Opcode },
6201
    { Bad_Opcode },
6202
    { Bad_Opcode },
6203
    { Bad_Opcode },
6204
    { Bad_Opcode },
6205
    { Bad_Opcode },
6206
    { Bad_Opcode },
6207
    /* 78 */
6208
    { Bad_Opcode },
6209
    { Bad_Opcode },
6210
    { Bad_Opcode },
6211
    { Bad_Opcode },
6212
    { Bad_Opcode },
6213
    { Bad_Opcode },
6214
    { Bad_Opcode },
6215
    { Bad_Opcode },
6216
    /* 80 */
6217
    { Bad_Opcode },
6218
    { Bad_Opcode },
6219
    { Bad_Opcode },
6220
    { Bad_Opcode },
6221
    { Bad_Opcode },
6222
    { Bad_Opcode },
6223
    { Bad_Opcode },
6224
    { Bad_Opcode },
6225
    /* 88 */
6226
    { Bad_Opcode },
6227
    { Bad_Opcode },
6228
    { Bad_Opcode },
6229
    { Bad_Opcode },
6230
    { Bad_Opcode },
6231
    { Bad_Opcode },
6232
    { Bad_Opcode },
6233
    { Bad_Opcode },
6234
    /* 90 */
6235
    { Bad_Opcode },
6236
    { Bad_Opcode },
6237
    { Bad_Opcode },
6238
    { Bad_Opcode },
6239
    { Bad_Opcode },
6240
    { Bad_Opcode },
6241
    { Bad_Opcode },
6242
    { Bad_Opcode },
6243
    /* 98 */
6244
    { Bad_Opcode },
6245
    { Bad_Opcode },
6246
    { Bad_Opcode },
6247
    { Bad_Opcode },
6248
    { Bad_Opcode },
6249
    { Bad_Opcode },
6250
    { Bad_Opcode },
6251
    { Bad_Opcode },
6252
    /* a0 */
6253
    { Bad_Opcode },
6254
    { Bad_Opcode },
6255
    { Bad_Opcode },
6256
    { Bad_Opcode },
6257
    { Bad_Opcode },
6258
    { Bad_Opcode },
6259
    { Bad_Opcode },
6260
    { Bad_Opcode },
6261
    /* a8 */
6262
    { Bad_Opcode },
6263
    { Bad_Opcode },
6264
    { Bad_Opcode },
6265
    { Bad_Opcode },
6266
    { Bad_Opcode },
6267
    { Bad_Opcode },
6268
    { Bad_Opcode },
6269
    { Bad_Opcode },
6270
    /* b0 */
6271
    { Bad_Opcode },
6272
    { Bad_Opcode },
6273
    { Bad_Opcode },
6274
    { Bad_Opcode },
6275
    { Bad_Opcode },
6276
    { Bad_Opcode },
6277
    { Bad_Opcode },
6278
    { Bad_Opcode },
6279
    /* b8 */
6280
    { Bad_Opcode },
6281
    { Bad_Opcode },
6282
    { Bad_Opcode },
6283
    { Bad_Opcode },
6284
    { Bad_Opcode },
6285
    { Bad_Opcode },
6286
    { Bad_Opcode },
6287
    { Bad_Opcode },
6288
    /* c0 */
6289
    { Bad_Opcode },
6290
    { Bad_Opcode },
6291
    { Bad_Opcode },
6292
    { Bad_Opcode },
6293
    { Bad_Opcode },
6294
    { Bad_Opcode },
6295
    { Bad_Opcode },
6296
    { Bad_Opcode },
6297
    /* c8 */
6298
    { Bad_Opcode },
6299
    { Bad_Opcode },
6300
    { Bad_Opcode },
6301
    { Bad_Opcode },
6302
    { Bad_Opcode },
6303
    { Bad_Opcode },
6304
    { Bad_Opcode },
6305
    { Bad_Opcode },
6306
    /* d0 */
6307
    { Bad_Opcode },
6308
    { Bad_Opcode },
6309
    { Bad_Opcode },
6310
    { Bad_Opcode },
6311
    { Bad_Opcode },
6312
    { Bad_Opcode },
6313
    { Bad_Opcode },
6314
    { Bad_Opcode },
6315
    /* d8 */
6316
    { Bad_Opcode },
6317
    { Bad_Opcode },
6318
    { Bad_Opcode },
6319
    { Bad_Opcode },
6320
    { Bad_Opcode },
6321
    { Bad_Opcode },
6322
    { Bad_Opcode },
6323
    { PREFIX_TABLE (PREFIX_0F3ADF) },
6324
    /* e0 */
6325
    { Bad_Opcode },
6326
    { Bad_Opcode },
6327
    { Bad_Opcode },
6328
    { Bad_Opcode },
6329
    { Bad_Opcode },
6330
    { Bad_Opcode },
6331
    { Bad_Opcode },
6332
    { Bad_Opcode },
6333
    /* e8 */
6334
    { Bad_Opcode },
6335
    { Bad_Opcode },
6336
    { Bad_Opcode },
6337
    { Bad_Opcode },
6338
    { Bad_Opcode },
6339
    { Bad_Opcode },
6340
    { Bad_Opcode },
6341
    { Bad_Opcode },
6342
    /* f0 */
6343
    { Bad_Opcode },
6344
    { Bad_Opcode },
6345
    { Bad_Opcode },
6346
    { Bad_Opcode },
6347
    { Bad_Opcode },
6348
    { Bad_Opcode },
6349
    { Bad_Opcode },
6350
    { Bad_Opcode },
6351
    /* f8 */
6352
    { Bad_Opcode },
6353
    { Bad_Opcode },
6354
    { Bad_Opcode },
6355
    { Bad_Opcode },
6356
    { Bad_Opcode },
6357
    { Bad_Opcode },
6358
    { Bad_Opcode },
6359
    { Bad_Opcode },
6360
  },
6361
 
6362
  /* THREE_BYTE_0F7A */
6363
  {
6364
    /* 00 */
6365
    { Bad_Opcode },
6366
    { Bad_Opcode },
6367
    { Bad_Opcode },
6368
    { Bad_Opcode },
6369
    { Bad_Opcode },
6370
    { Bad_Opcode },
6371
    { Bad_Opcode },
6372
    { Bad_Opcode },
6373
    /* 08 */
6374
    { Bad_Opcode },
6375
    { Bad_Opcode },
6376
    { Bad_Opcode },
6377
    { Bad_Opcode },
6378
    { Bad_Opcode },
6379
    { Bad_Opcode },
6380
    { Bad_Opcode },
6381
    { Bad_Opcode },
6382
    /* 10 */
6383
    { Bad_Opcode },
6384
    { Bad_Opcode },
6385
    { Bad_Opcode },
6386
    { Bad_Opcode },
6387
    { Bad_Opcode },
6388
    { Bad_Opcode },
6389
    { Bad_Opcode },
6390
    { Bad_Opcode },
6391
    /* 18 */
6392
    { Bad_Opcode },
6393
    { Bad_Opcode },
6394
    { Bad_Opcode },
6395
    { Bad_Opcode },
6396
    { Bad_Opcode },
6397
    { Bad_Opcode },
6398
    { Bad_Opcode },
6399
    { Bad_Opcode },
6400
    /* 20 */
6401
    { "ptest",          { XX } },
6402
    { Bad_Opcode },
6403
    { Bad_Opcode },
6404
    { Bad_Opcode },
6405
    { Bad_Opcode },
6406
    { Bad_Opcode },
6407
    { Bad_Opcode },
6408
    { Bad_Opcode },
6409
    /* 28 */
6410
    { Bad_Opcode },
6411
    { Bad_Opcode },
6412
    { Bad_Opcode },
6413
    { Bad_Opcode },
6414
    { Bad_Opcode },
6415
    { Bad_Opcode },
6416
    { Bad_Opcode },
6417
    { Bad_Opcode },
6418
    /* 30 */
6419
    { Bad_Opcode },
6420
    { Bad_Opcode },
6421
    { Bad_Opcode },
6422
    { Bad_Opcode },
6423
    { Bad_Opcode },
6424
    { Bad_Opcode },
6425
    { Bad_Opcode },
6426
    { Bad_Opcode },
6427
    /* 38 */
6428
    { Bad_Opcode },
6429
    { Bad_Opcode },
6430
    { Bad_Opcode },
6431
    { Bad_Opcode },
6432
    { Bad_Opcode },
6433
    { Bad_Opcode },
6434
    { Bad_Opcode },
6435
    { Bad_Opcode },
6436
    /* 40 */
6437
    { Bad_Opcode },
6438
    { "phaddbw",        { XM, EXq } },
6439
    { "phaddbd",        { XM, EXq } },
6440
    { "phaddbq",        { XM, EXq } },
6441
    { Bad_Opcode },
6442
    { Bad_Opcode },
6443
    { "phaddwd",        { XM, EXq } },
6444
    { "phaddwq",        { XM, EXq } },
6445
    /* 48 */
6446
    { Bad_Opcode },
6447
    { Bad_Opcode },
6448
    { Bad_Opcode },
6449
    { "phadddq",        { XM, EXq } },
6450
    { Bad_Opcode },
6451
    { Bad_Opcode },
6452
    { Bad_Opcode },
6453
    { Bad_Opcode },
6454
    /* 50 */
6455
    { Bad_Opcode },
6456
    { "phaddubw",       { XM, EXq } },
6457
    { "phaddubd",       { XM, EXq } },
6458
    { "phaddubq",       { XM, EXq } },
6459
    { Bad_Opcode },
6460
    { Bad_Opcode },
6461
    { "phadduwd",       { XM, EXq } },
6462
    { "phadduwq",       { XM, EXq } },
6463
    /* 58 */
6464
    { Bad_Opcode },
6465
    { Bad_Opcode },
6466
    { Bad_Opcode },
6467
    { "phaddudq",       { XM, EXq } },
6468
    { Bad_Opcode },
6469
    { Bad_Opcode },
6470
    { Bad_Opcode },
6471
    { Bad_Opcode },
6472
    /* 60 */
6473
    { Bad_Opcode },
6474
    { "phsubbw",        { XM, EXq } },
6475
    { "phsubbd",        { XM, EXq } },
6476
    { "phsubbq",        { XM, EXq } },
6477
    { Bad_Opcode },
6478
    { Bad_Opcode },
6479
    { Bad_Opcode },
6480
    { Bad_Opcode },
6481
    /* 68 */
6482
    { Bad_Opcode },
6483
    { Bad_Opcode },
6484
    { Bad_Opcode },
6485
    { Bad_Opcode },
6486
    { Bad_Opcode },
6487
    { Bad_Opcode },
6488
    { Bad_Opcode },
6489
    { Bad_Opcode },
6490
    /* 70 */
6491
    { Bad_Opcode },
6492
    { Bad_Opcode },
6493
    { Bad_Opcode },
6494
    { Bad_Opcode },
6495
    { Bad_Opcode },
6496
    { Bad_Opcode },
6497
    { Bad_Opcode },
6498
    { Bad_Opcode },
6499
    /* 78 */
6500
    { Bad_Opcode },
6501
    { Bad_Opcode },
6502
    { Bad_Opcode },
6503
    { Bad_Opcode },
6504
    { Bad_Opcode },
6505
    { Bad_Opcode },
6506
    { Bad_Opcode },
6507
    { Bad_Opcode },
6508
    /* 80 */
6509
    { Bad_Opcode },
6510
    { Bad_Opcode },
6511
    { Bad_Opcode },
6512
    { Bad_Opcode },
6513
    { Bad_Opcode },
6514
    { Bad_Opcode },
6515
    { Bad_Opcode },
6516
    { Bad_Opcode },
6517
    /* 88 */
6518
    { Bad_Opcode },
6519
    { Bad_Opcode },
6520
    { Bad_Opcode },
6521
    { Bad_Opcode },
6522
    { Bad_Opcode },
6523
    { Bad_Opcode },
6524
    { Bad_Opcode },
6525
    { Bad_Opcode },
6526
    /* 90 */
6527
    { Bad_Opcode },
6528
    { Bad_Opcode },
6529
    { Bad_Opcode },
6530
    { Bad_Opcode },
6531
    { Bad_Opcode },
6532
    { Bad_Opcode },
6533
    { Bad_Opcode },
6534
    { Bad_Opcode },
6535
    /* 98 */
6536
    { Bad_Opcode },
6537
    { Bad_Opcode },
6538
    { Bad_Opcode },
6539
    { Bad_Opcode },
6540
    { Bad_Opcode },
6541
    { Bad_Opcode },
6542
    { Bad_Opcode },
6543
    { Bad_Opcode },
6544
    /* a0 */
6545
    { Bad_Opcode },
6546
    { Bad_Opcode },
6547
    { Bad_Opcode },
6548
    { Bad_Opcode },
6549
    { Bad_Opcode },
6550
    { Bad_Opcode },
6551
    { Bad_Opcode },
6552
    { Bad_Opcode },
6553
    /* a8 */
6554
    { Bad_Opcode },
6555
    { Bad_Opcode },
6556
    { Bad_Opcode },
6557
    { Bad_Opcode },
6558
    { Bad_Opcode },
6559
    { Bad_Opcode },
6560
    { Bad_Opcode },
6561
    { Bad_Opcode },
6562
    /* b0 */
6563
    { Bad_Opcode },
6564
    { Bad_Opcode },
6565
    { Bad_Opcode },
6566
    { Bad_Opcode },
6567
    { Bad_Opcode },
6568
    { Bad_Opcode },
6569
    { Bad_Opcode },
6570
    { Bad_Opcode },
6571
    /* b8 */
6572
    { Bad_Opcode },
6573
    { Bad_Opcode },
6574
    { Bad_Opcode },
6575
    { Bad_Opcode },
6576
    { Bad_Opcode },
6577
    { Bad_Opcode },
6578
    { Bad_Opcode },
6579
    { Bad_Opcode },
6580
    /* c0 */
6581
    { Bad_Opcode },
6582
    { Bad_Opcode },
6583
    { Bad_Opcode },
6584
    { Bad_Opcode },
6585
    { Bad_Opcode },
6586
    { Bad_Opcode },
6587
    { Bad_Opcode },
6588
    { Bad_Opcode },
6589
    /* c8 */
6590
    { Bad_Opcode },
6591
    { Bad_Opcode },
6592
    { Bad_Opcode },
6593
    { Bad_Opcode },
6594
    { Bad_Opcode },
6595
    { Bad_Opcode },
6596
    { Bad_Opcode },
6597
    { Bad_Opcode },
6598
    /* d0 */
6599
    { Bad_Opcode },
6600
    { Bad_Opcode },
6601
    { Bad_Opcode },
6602
    { Bad_Opcode },
6603
    { Bad_Opcode },
6604
    { Bad_Opcode },
6605
    { Bad_Opcode },
6606
    { Bad_Opcode },
6607
    /* d8 */
6608
    { Bad_Opcode },
6609
    { Bad_Opcode },
6610
    { Bad_Opcode },
6611
    { Bad_Opcode },
6612
    { Bad_Opcode },
6613
    { Bad_Opcode },
6614
    { Bad_Opcode },
6615
    { Bad_Opcode },
6616
    /* e0 */
6617
    { Bad_Opcode },
6618
    { Bad_Opcode },
6619
    { Bad_Opcode },
6620
    { Bad_Opcode },
6621
    { Bad_Opcode },
6622
    { Bad_Opcode },
6623
    { Bad_Opcode },
6624
    { Bad_Opcode },
6625
    /* e8 */
6626
    { Bad_Opcode },
6627
    { Bad_Opcode },
6628
    { Bad_Opcode },
6629
    { Bad_Opcode },
6630
    { Bad_Opcode },
6631
    { Bad_Opcode },
6632
    { Bad_Opcode },
6633
    { Bad_Opcode },
6634
    /* f0 */
6635
    { Bad_Opcode },
6636
    { Bad_Opcode },
6637
    { Bad_Opcode },
6638
    { Bad_Opcode },
6639
    { Bad_Opcode },
6640
    { Bad_Opcode },
6641
    { Bad_Opcode },
6642
    { Bad_Opcode },
6643
    /* f8 */
6644
    { Bad_Opcode },
6645
    { Bad_Opcode },
6646
    { Bad_Opcode },
6647
    { Bad_Opcode },
6648
    { Bad_Opcode },
6649
    { Bad_Opcode },
6650
    { Bad_Opcode },
6651
    { Bad_Opcode },
6652
  },
6653
};
6654
 
6655
static const struct dis386 xop_table[][256] = {
6656
  /* XOP_08 */
6657
  {
6658
    /* 00 */
6659
    { Bad_Opcode },
6660
    { Bad_Opcode },
6661
    { Bad_Opcode },
6662
    { Bad_Opcode },
6663
    { Bad_Opcode },
6664
    { Bad_Opcode },
6665
    { Bad_Opcode },
6666
    { Bad_Opcode },
6667
    /* 08 */
6668
    { Bad_Opcode },
6669
    { Bad_Opcode },
6670
    { Bad_Opcode },
6671
    { Bad_Opcode },
6672
    { Bad_Opcode },
6673
    { Bad_Opcode },
6674
    { Bad_Opcode },
6675
    { Bad_Opcode },
6676
    /* 10 */
6677
    { Bad_Opcode },
6678
    { Bad_Opcode },
6679
    { Bad_Opcode },
6680
    { Bad_Opcode },
6681
    { Bad_Opcode },
6682
    { Bad_Opcode },
6683
    { Bad_Opcode },
6684 158 khays
    { Bad_Opcode },
6685 18 khays
    /* 18 */
6686
    { Bad_Opcode },
6687
    { Bad_Opcode },
6688
    { Bad_Opcode },
6689
    { Bad_Opcode },
6690
    { Bad_Opcode },
6691
    { Bad_Opcode },
6692
    { Bad_Opcode },
6693
    { Bad_Opcode },
6694
    /* 20 */
6695
    { Bad_Opcode },
6696
    { Bad_Opcode },
6697
    { Bad_Opcode },
6698
    { Bad_Opcode },
6699
    { Bad_Opcode },
6700
    { Bad_Opcode },
6701
    { Bad_Opcode },
6702
    { Bad_Opcode },
6703
    /* 28 */
6704
    { Bad_Opcode },
6705
    { Bad_Opcode },
6706
    { Bad_Opcode },
6707
    { Bad_Opcode },
6708
    { Bad_Opcode },
6709
    { Bad_Opcode },
6710
    { Bad_Opcode },
6711
    { Bad_Opcode },
6712
    /* 30 */
6713
    { Bad_Opcode },
6714
    { Bad_Opcode },
6715
    { Bad_Opcode },
6716
    { Bad_Opcode },
6717
    { Bad_Opcode },
6718
    { Bad_Opcode },
6719
    { Bad_Opcode },
6720
    { Bad_Opcode },
6721
    /* 38 */
6722
    { Bad_Opcode },
6723
    { Bad_Opcode },
6724
    { Bad_Opcode },
6725
    { Bad_Opcode },
6726
    { Bad_Opcode },
6727
    { Bad_Opcode },
6728
    { Bad_Opcode },
6729
    { Bad_Opcode },
6730
    /* 40 */
6731
    { Bad_Opcode },
6732
    { Bad_Opcode },
6733
    { Bad_Opcode },
6734
    { Bad_Opcode },
6735
    { Bad_Opcode },
6736
    { Bad_Opcode },
6737
    { Bad_Opcode },
6738
    { Bad_Opcode },
6739
    /* 48 */
6740
    { Bad_Opcode },
6741
    { Bad_Opcode },
6742
    { Bad_Opcode },
6743
    { Bad_Opcode },
6744
    { Bad_Opcode },
6745
    { Bad_Opcode },
6746
    { Bad_Opcode },
6747
    { Bad_Opcode },
6748
    /* 50 */
6749
    { Bad_Opcode },
6750
    { Bad_Opcode },
6751
    { Bad_Opcode },
6752
    { Bad_Opcode },
6753
    { Bad_Opcode },
6754
    { Bad_Opcode },
6755
    { Bad_Opcode },
6756
    { Bad_Opcode },
6757
    /* 58 */
6758
    { Bad_Opcode },
6759
    { Bad_Opcode },
6760
    { Bad_Opcode },
6761
    { Bad_Opcode },
6762
    { Bad_Opcode },
6763
    { Bad_Opcode },
6764
    { Bad_Opcode },
6765
    { Bad_Opcode },
6766
    /* 60 */
6767
    { Bad_Opcode },
6768
    { Bad_Opcode },
6769
    { Bad_Opcode },
6770
    { Bad_Opcode },
6771
    { Bad_Opcode },
6772
    { Bad_Opcode },
6773
    { Bad_Opcode },
6774
    { Bad_Opcode },
6775
    /* 68 */
6776
    { Bad_Opcode },
6777
    { Bad_Opcode },
6778
    { Bad_Opcode },
6779
    { Bad_Opcode },
6780
    { Bad_Opcode },
6781
    { Bad_Opcode },
6782
    { Bad_Opcode },
6783
    { Bad_Opcode },
6784
    /* 70 */
6785
    { Bad_Opcode },
6786
    { Bad_Opcode },
6787
    { Bad_Opcode },
6788
    { Bad_Opcode },
6789
    { Bad_Opcode },
6790
    { Bad_Opcode },
6791
    { Bad_Opcode },
6792
    { Bad_Opcode },
6793
    /* 78 */
6794
    { Bad_Opcode },
6795
    { Bad_Opcode },
6796
    { Bad_Opcode },
6797
    { Bad_Opcode },
6798
    { Bad_Opcode },
6799
    { Bad_Opcode },
6800
    { Bad_Opcode },
6801
    { Bad_Opcode },
6802
    /* 80 */
6803
    { Bad_Opcode },
6804
    { Bad_Opcode },
6805
    { Bad_Opcode },
6806
    { Bad_Opcode },
6807
    { Bad_Opcode },
6808
    { "vpmacssww",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6809
    { "vpmacsswd",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6810
    { "vpmacssdql",     { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6811
    /* 88 */
6812
    { Bad_Opcode },
6813
    { Bad_Opcode },
6814
    { Bad_Opcode },
6815
    { Bad_Opcode },
6816
    { Bad_Opcode },
6817
    { Bad_Opcode },
6818
    { "vpmacssdd",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6819
    { "vpmacssdqh",     { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6820
    /* 90 */
6821
    { Bad_Opcode },
6822
    { Bad_Opcode },
6823
    { Bad_Opcode },
6824
    { Bad_Opcode },
6825
    { Bad_Opcode },
6826
    { "vpmacsww",       { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6827
    { "vpmacswd",       { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6828
    { "vpmacsdql",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6829
    /* 98 */
6830
    { Bad_Opcode },
6831
    { Bad_Opcode },
6832
    { Bad_Opcode },
6833
    { Bad_Opcode },
6834
    { Bad_Opcode },
6835
    { Bad_Opcode },
6836
    { "vpmacsdd",       { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6837
    { "vpmacsdqh",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6838
    /* a0 */
6839
    { Bad_Opcode },
6840
    { Bad_Opcode },
6841
    { "vpcmov",         { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6842
    { "vpperm",         { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6843
    { Bad_Opcode },
6844
    { Bad_Opcode },
6845
    { "vpmadcsswd",     { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6846
    { Bad_Opcode },
6847
    /* a8 */
6848
    { Bad_Opcode },
6849
    { Bad_Opcode },
6850
    { Bad_Opcode },
6851
    { Bad_Opcode },
6852
    { Bad_Opcode },
6853
    { Bad_Opcode },
6854
    { Bad_Opcode },
6855
    { Bad_Opcode },
6856
    /* b0 */
6857
    { Bad_Opcode },
6858
    { Bad_Opcode },
6859
    { Bad_Opcode },
6860
    { Bad_Opcode },
6861
    { Bad_Opcode },
6862
    { Bad_Opcode },
6863
    { "vpmadcswd",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6864
    { Bad_Opcode },
6865
    /* b8 */
6866
    { Bad_Opcode },
6867
    { Bad_Opcode },
6868
    { Bad_Opcode },
6869
    { Bad_Opcode },
6870
    { Bad_Opcode },
6871
    { Bad_Opcode },
6872
    { Bad_Opcode },
6873
    { Bad_Opcode },
6874
    /* c0 */
6875
    { "vprotb",         { XM, Vex_2src_1, Ib } },
6876
    { "vprotw",         { XM, Vex_2src_1, Ib } },
6877
    { "vprotd",         { XM, Vex_2src_1, Ib } },
6878
    { "vprotq",         { XM, Vex_2src_1, Ib } },
6879
    { Bad_Opcode },
6880
    { Bad_Opcode },
6881
    { Bad_Opcode },
6882
    { Bad_Opcode },
6883
    /* c8 */
6884
    { Bad_Opcode },
6885
    { Bad_Opcode },
6886
    { Bad_Opcode },
6887
    { Bad_Opcode },
6888
    { "vpcomb",         { XM, Vex128, EXx, Ib } },
6889
    { "vpcomw",         { XM, Vex128, EXx, Ib } },
6890
    { "vpcomd",         { XM, Vex128, EXx, Ib } },
6891
    { "vpcomq",         { XM, Vex128, EXx, Ib } },
6892
    /* d0 */
6893
    { Bad_Opcode },
6894
    { Bad_Opcode },
6895
    { Bad_Opcode },
6896
    { Bad_Opcode },
6897
    { Bad_Opcode },
6898
    { Bad_Opcode },
6899
    { Bad_Opcode },
6900
    { Bad_Opcode },
6901
    /* d8 */
6902
    { Bad_Opcode },
6903
    { Bad_Opcode },
6904
    { Bad_Opcode },
6905
    { Bad_Opcode },
6906
    { Bad_Opcode },
6907
    { Bad_Opcode },
6908
    { Bad_Opcode },
6909
    { Bad_Opcode },
6910
    /* e0 */
6911
    { Bad_Opcode },
6912
    { Bad_Opcode },
6913
    { Bad_Opcode },
6914
    { Bad_Opcode },
6915
    { Bad_Opcode },
6916
    { Bad_Opcode },
6917
    { Bad_Opcode },
6918
    { Bad_Opcode },
6919
    /* e8 */
6920
    { Bad_Opcode },
6921
    { Bad_Opcode },
6922
    { Bad_Opcode },
6923
    { Bad_Opcode },
6924
    { "vpcomub",        { XM, Vex128, EXx, Ib } },
6925
    { "vpcomuw",        { XM, Vex128, EXx, Ib } },
6926
    { "vpcomud",        { XM, Vex128, EXx, Ib } },
6927
    { "vpcomuq",        { XM, Vex128, EXx, Ib } },
6928
    /* f0 */
6929
    { Bad_Opcode },
6930
    { Bad_Opcode },
6931
    { Bad_Opcode },
6932
    { Bad_Opcode },
6933
    { Bad_Opcode },
6934
    { Bad_Opcode },
6935
    { Bad_Opcode },
6936
    { Bad_Opcode },
6937
    /* f8 */
6938
    { Bad_Opcode },
6939
    { Bad_Opcode },
6940
    { Bad_Opcode },
6941
    { Bad_Opcode },
6942
    { Bad_Opcode },
6943
    { Bad_Opcode },
6944
    { Bad_Opcode },
6945
    { Bad_Opcode },
6946
  },
6947
  /* XOP_09 */
6948
  {
6949
    /* 00 */
6950
    { Bad_Opcode },
6951
    { REG_TABLE (REG_XOP_TBM_01) },
6952
    { REG_TABLE (REG_XOP_TBM_02) },
6953
    { Bad_Opcode },
6954
    { Bad_Opcode },
6955
    { Bad_Opcode },
6956
    { Bad_Opcode },
6957
    { Bad_Opcode },
6958
    /* 08 */
6959
    { Bad_Opcode },
6960
    { Bad_Opcode },
6961
    { Bad_Opcode },
6962
    { Bad_Opcode },
6963
    { Bad_Opcode },
6964
    { Bad_Opcode },
6965
    { Bad_Opcode },
6966
    { Bad_Opcode },
6967
    /* 10 */
6968
    { Bad_Opcode },
6969
    { Bad_Opcode },
6970
    { REG_TABLE (REG_XOP_LWPCB) },
6971
    { Bad_Opcode },
6972
    { Bad_Opcode },
6973
    { Bad_Opcode },
6974
    { Bad_Opcode },
6975
    { Bad_Opcode },
6976
    /* 18 */
6977
    { Bad_Opcode },
6978
    { Bad_Opcode },
6979
    { Bad_Opcode },
6980
    { Bad_Opcode },
6981
    { Bad_Opcode },
6982
    { Bad_Opcode },
6983
    { Bad_Opcode },
6984
    { Bad_Opcode },
6985
    /* 20 */
6986
    { Bad_Opcode },
6987
    { Bad_Opcode },
6988
    { Bad_Opcode },
6989
    { Bad_Opcode },
6990
    { Bad_Opcode },
6991
    { Bad_Opcode },
6992
    { Bad_Opcode },
6993
    { Bad_Opcode },
6994
    /* 28 */
6995
    { Bad_Opcode },
6996
    { Bad_Opcode },
6997
    { Bad_Opcode },
6998
    { Bad_Opcode },
6999
    { Bad_Opcode },
7000
    { Bad_Opcode },
7001
    { Bad_Opcode },
7002
    { Bad_Opcode },
7003
    /* 30 */
7004
    { Bad_Opcode },
7005
    { Bad_Opcode },
7006
    { Bad_Opcode },
7007
    { Bad_Opcode },
7008
    { Bad_Opcode },
7009
    { Bad_Opcode },
7010
    { Bad_Opcode },
7011
    { Bad_Opcode },
7012
    /* 38 */
7013
    { Bad_Opcode },
7014
    { Bad_Opcode },
7015
    { Bad_Opcode },
7016
    { Bad_Opcode },
7017
    { Bad_Opcode },
7018
    { Bad_Opcode },
7019
    { Bad_Opcode },
7020
    { Bad_Opcode },
7021
    /* 40 */
7022
    { Bad_Opcode },
7023
    { Bad_Opcode },
7024
    { Bad_Opcode },
7025
    { Bad_Opcode },
7026
    { Bad_Opcode },
7027
    { Bad_Opcode },
7028
    { Bad_Opcode },
7029
    { Bad_Opcode },
7030
    /* 48 */
7031
    { Bad_Opcode },
7032
    { Bad_Opcode },
7033
    { Bad_Opcode },
7034
    { Bad_Opcode },
7035
    { Bad_Opcode },
7036
    { Bad_Opcode },
7037
    { Bad_Opcode },
7038
    { Bad_Opcode },
7039
    /* 50 */
7040
    { Bad_Opcode },
7041
    { Bad_Opcode },
7042
    { Bad_Opcode },
7043
    { Bad_Opcode },
7044
    { Bad_Opcode },
7045
    { Bad_Opcode },
7046
    { Bad_Opcode },
7047
    { Bad_Opcode },
7048
    /* 58 */
7049
    { Bad_Opcode },
7050
    { Bad_Opcode },
7051
    { Bad_Opcode },
7052
    { Bad_Opcode },
7053
    { Bad_Opcode },
7054
    { Bad_Opcode },
7055
    { Bad_Opcode },
7056
    { Bad_Opcode },
7057
    /* 60 */
7058
    { Bad_Opcode },
7059
    { Bad_Opcode },
7060
    { Bad_Opcode },
7061
    { Bad_Opcode },
7062
    { Bad_Opcode },
7063
    { Bad_Opcode },
7064
    { Bad_Opcode },
7065
    { Bad_Opcode },
7066
    /* 68 */
7067
    { Bad_Opcode },
7068
    { Bad_Opcode },
7069
    { Bad_Opcode },
7070
    { Bad_Opcode },
7071
    { Bad_Opcode },
7072
    { Bad_Opcode },
7073
    { Bad_Opcode },
7074
    { Bad_Opcode },
7075
    /* 70 */
7076
    { Bad_Opcode },
7077
    { Bad_Opcode },
7078
    { Bad_Opcode },
7079
    { Bad_Opcode },
7080
    { Bad_Opcode },
7081
    { Bad_Opcode },
7082
    { Bad_Opcode },
7083
    { Bad_Opcode },
7084
    /* 78 */
7085
    { Bad_Opcode },
7086
    { Bad_Opcode },
7087
    { Bad_Opcode },
7088
    { Bad_Opcode },
7089
    { Bad_Opcode },
7090
    { Bad_Opcode },
7091
    { Bad_Opcode },
7092
    { Bad_Opcode },
7093
    /* 80 */
7094
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_80) },
7095
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_81) },
7096
    { "vfrczss",        { XM, EXd } },
7097
    { "vfrczsd",        { XM, EXq } },
7098
    { Bad_Opcode },
7099
    { Bad_Opcode },
7100
    { Bad_Opcode },
7101
    { Bad_Opcode },
7102
    /* 88 */
7103
    { Bad_Opcode },
7104
    { Bad_Opcode },
7105
    { Bad_Opcode },
7106
    { Bad_Opcode },
7107
    { Bad_Opcode },
7108
    { Bad_Opcode },
7109
    { Bad_Opcode },
7110
    { Bad_Opcode },
7111
    /* 90 */
7112
    { "vprotb",         { XM, Vex_2src_1, Vex_2src_2 } },
7113
    { "vprotw",         { XM, Vex_2src_1, Vex_2src_2 } },
7114
    { "vprotd",         { XM, Vex_2src_1, Vex_2src_2 } },
7115
    { "vprotq",         { XM, Vex_2src_1, Vex_2src_2 } },
7116
    { "vpshlb",         { XM, Vex_2src_1, Vex_2src_2 } },
7117
    { "vpshlw",         { XM, Vex_2src_1, Vex_2src_2 } },
7118
    { "vpshld",         { XM, Vex_2src_1, Vex_2src_2 } },
7119
    { "vpshlq",         { XM, Vex_2src_1, Vex_2src_2 } },
7120
    /* 98 */
7121
    { "vpshab",         { XM, Vex_2src_1, Vex_2src_2 } },
7122
    { "vpshaw",         { XM, Vex_2src_1, Vex_2src_2 } },
7123
    { "vpshad",         { XM, Vex_2src_1, Vex_2src_2 } },
7124
    { "vpshaq",         { XM, Vex_2src_1, Vex_2src_2 } },
7125
    { Bad_Opcode },
7126
    { Bad_Opcode },
7127
    { Bad_Opcode },
7128
    { Bad_Opcode },
7129
    /* a0 */
7130
    { Bad_Opcode },
7131
    { Bad_Opcode },
7132
    { Bad_Opcode },
7133
    { Bad_Opcode },
7134
    { Bad_Opcode },
7135
    { Bad_Opcode },
7136
    { Bad_Opcode },
7137
    { Bad_Opcode },
7138
    /* a8 */
7139
    { Bad_Opcode },
7140
    { Bad_Opcode },
7141
    { Bad_Opcode },
7142
    { Bad_Opcode },
7143
    { Bad_Opcode },
7144
    { Bad_Opcode },
7145
    { Bad_Opcode },
7146
    { Bad_Opcode },
7147
    /* b0 */
7148
    { Bad_Opcode },
7149
    { Bad_Opcode },
7150
    { Bad_Opcode },
7151
    { Bad_Opcode },
7152
    { Bad_Opcode },
7153
    { Bad_Opcode },
7154
    { Bad_Opcode },
7155
    { Bad_Opcode },
7156
    /* b8 */
7157
    { Bad_Opcode },
7158
    { Bad_Opcode },
7159
    { Bad_Opcode },
7160
    { Bad_Opcode },
7161
    { Bad_Opcode },
7162
    { Bad_Opcode },
7163
    { Bad_Opcode },
7164
    { Bad_Opcode },
7165
    /* c0 */
7166
    { Bad_Opcode },
7167
    { "vphaddbw",       { XM, EXxmm } },
7168
    { "vphaddbd",       { XM, EXxmm } },
7169
    { "vphaddbq",       { XM, EXxmm } },
7170
    { Bad_Opcode },
7171
    { Bad_Opcode },
7172
    { "vphaddwd",       { XM, EXxmm } },
7173
    { "vphaddwq",       { XM, EXxmm } },
7174
    /* c8 */
7175
    { Bad_Opcode },
7176
    { Bad_Opcode },
7177
    { Bad_Opcode },
7178
    { "vphadddq",       { XM, EXxmm } },
7179
    { Bad_Opcode },
7180
    { Bad_Opcode },
7181
    { Bad_Opcode },
7182
    { Bad_Opcode },
7183
    /* d0 */
7184
    { Bad_Opcode },
7185
    { "vphaddubw",      { XM, EXxmm } },
7186
    { "vphaddubd",      { XM, EXxmm } },
7187
    { "vphaddubq",      { XM, EXxmm } },
7188
    { Bad_Opcode },
7189
    { Bad_Opcode },
7190
    { "vphadduwd",      { XM, EXxmm } },
7191
    { "vphadduwq",      { XM, EXxmm } },
7192
    /* d8 */
7193
    { Bad_Opcode },
7194
    { Bad_Opcode },
7195
    { Bad_Opcode },
7196
    { "vphaddudq",      { XM, EXxmm } },
7197
    { Bad_Opcode },
7198
    { Bad_Opcode },
7199
    { Bad_Opcode },
7200
    { Bad_Opcode },
7201
    /* e0 */
7202
    { Bad_Opcode },
7203
    { "vphsubbw",       { XM, EXxmm } },
7204
    { "vphsubwd",       { XM, EXxmm } },
7205
    { "vphsubdq",       { XM, EXxmm } },
7206
    { Bad_Opcode },
7207
    { Bad_Opcode },
7208
    { Bad_Opcode },
7209
    { Bad_Opcode },
7210
    /* e8 */
7211
    { Bad_Opcode },
7212
    { Bad_Opcode },
7213
    { Bad_Opcode },
7214
    { Bad_Opcode },
7215
    { Bad_Opcode },
7216
    { Bad_Opcode },
7217
    { Bad_Opcode },
7218
    { Bad_Opcode },
7219
    /* f0 */
7220
    { Bad_Opcode },
7221
    { Bad_Opcode },
7222
    { Bad_Opcode },
7223
    { Bad_Opcode },
7224
    { Bad_Opcode },
7225
    { Bad_Opcode },
7226
    { Bad_Opcode },
7227
    { Bad_Opcode },
7228
    /* f8 */
7229
    { Bad_Opcode },
7230
    { Bad_Opcode },
7231
    { Bad_Opcode },
7232
    { Bad_Opcode },
7233
    { Bad_Opcode },
7234
    { Bad_Opcode },
7235
    { Bad_Opcode },
7236
    { Bad_Opcode },
7237
  },
7238
  /* XOP_0A */
7239
  {
7240
    /* 00 */
7241
    { Bad_Opcode },
7242
    { Bad_Opcode },
7243
    { Bad_Opcode },
7244
    { Bad_Opcode },
7245
    { Bad_Opcode },
7246
    { Bad_Opcode },
7247
    { Bad_Opcode },
7248
    { Bad_Opcode },
7249
    /* 08 */
7250
    { Bad_Opcode },
7251
    { Bad_Opcode },
7252
    { Bad_Opcode },
7253
    { Bad_Opcode },
7254
    { Bad_Opcode },
7255
    { Bad_Opcode },
7256
    { Bad_Opcode },
7257
    { Bad_Opcode },
7258
    /* 10 */
7259
    { "bextr",  { Gv, Ev, Iq } },
7260
    { Bad_Opcode },
7261
    { REG_TABLE (REG_XOP_LWP) },
7262
    { Bad_Opcode },
7263
    { Bad_Opcode },
7264
    { Bad_Opcode },
7265
    { Bad_Opcode },
7266
    { Bad_Opcode },
7267
    /* 18 */
7268
    { Bad_Opcode },
7269
    { Bad_Opcode },
7270
    { Bad_Opcode },
7271
    { Bad_Opcode },
7272
    { Bad_Opcode },
7273
    { Bad_Opcode },
7274
    { Bad_Opcode },
7275
    { Bad_Opcode },
7276
    /* 20 */
7277
    { Bad_Opcode },
7278
    { Bad_Opcode },
7279
    { Bad_Opcode },
7280
    { Bad_Opcode },
7281
    { Bad_Opcode },
7282
    { Bad_Opcode },
7283
    { Bad_Opcode },
7284
    { Bad_Opcode },
7285
    /* 28 */
7286
    { Bad_Opcode },
7287
    { Bad_Opcode },
7288
    { Bad_Opcode },
7289
    { Bad_Opcode },
7290
    { Bad_Opcode },
7291
    { Bad_Opcode },
7292
    { Bad_Opcode },
7293
    { Bad_Opcode },
7294
    /* 30 */
7295
    { Bad_Opcode },
7296
    { Bad_Opcode },
7297
    { Bad_Opcode },
7298
    { Bad_Opcode },
7299
    { Bad_Opcode },
7300
    { Bad_Opcode },
7301
    { Bad_Opcode },
7302
    { Bad_Opcode },
7303
    /* 38 */
7304
    { Bad_Opcode },
7305
    { Bad_Opcode },
7306
    { Bad_Opcode },
7307
    { Bad_Opcode },
7308
    { Bad_Opcode },
7309
    { Bad_Opcode },
7310
    { Bad_Opcode },
7311
    { Bad_Opcode },
7312
    /* 40 */
7313
    { Bad_Opcode },
7314
    { Bad_Opcode },
7315
    { Bad_Opcode },
7316
    { Bad_Opcode },
7317
    { Bad_Opcode },
7318
    { Bad_Opcode },
7319
    { Bad_Opcode },
7320
    { Bad_Opcode },
7321
    /* 48 */
7322
    { Bad_Opcode },
7323
    { Bad_Opcode },
7324
    { Bad_Opcode },
7325
    { Bad_Opcode },
7326
    { Bad_Opcode },
7327
    { Bad_Opcode },
7328
    { Bad_Opcode },
7329
    { Bad_Opcode },
7330
    /* 50 */
7331
    { Bad_Opcode },
7332
    { Bad_Opcode },
7333
    { Bad_Opcode },
7334
    { Bad_Opcode },
7335
    { Bad_Opcode },
7336
    { Bad_Opcode },
7337
    { Bad_Opcode },
7338
    { Bad_Opcode },
7339
    /* 58 */
7340
    { Bad_Opcode },
7341
    { Bad_Opcode },
7342
    { Bad_Opcode },
7343
    { Bad_Opcode },
7344
    { Bad_Opcode },
7345
    { Bad_Opcode },
7346
    { Bad_Opcode },
7347
    { Bad_Opcode },
7348
    /* 60 */
7349
    { Bad_Opcode },
7350
    { Bad_Opcode },
7351
    { Bad_Opcode },
7352
    { Bad_Opcode },
7353
    { Bad_Opcode },
7354
    { Bad_Opcode },
7355
    { Bad_Opcode },
7356
    { Bad_Opcode },
7357
    /* 68 */
7358
    { Bad_Opcode },
7359
    { Bad_Opcode },
7360
    { Bad_Opcode },
7361
    { Bad_Opcode },
7362
    { Bad_Opcode },
7363
    { Bad_Opcode },
7364
    { Bad_Opcode },
7365
    { Bad_Opcode },
7366
    /* 70 */
7367
    { Bad_Opcode },
7368
    { Bad_Opcode },
7369
    { Bad_Opcode },
7370
    { Bad_Opcode },
7371
    { Bad_Opcode },
7372
    { Bad_Opcode },
7373
    { Bad_Opcode },
7374
    { Bad_Opcode },
7375
    /* 78 */
7376
    { Bad_Opcode },
7377
    { Bad_Opcode },
7378
    { Bad_Opcode },
7379
    { Bad_Opcode },
7380
    { Bad_Opcode },
7381
    { Bad_Opcode },
7382
    { Bad_Opcode },
7383
    { Bad_Opcode },
7384
    /* 80 */
7385
    { Bad_Opcode },
7386
    { Bad_Opcode },
7387
    { Bad_Opcode },
7388
    { Bad_Opcode },
7389
    { Bad_Opcode },
7390
    { Bad_Opcode },
7391
    { Bad_Opcode },
7392
    { Bad_Opcode },
7393
    /* 88 */
7394
    { Bad_Opcode },
7395
    { Bad_Opcode },
7396
    { Bad_Opcode },
7397
    { Bad_Opcode },
7398
    { Bad_Opcode },
7399
    { Bad_Opcode },
7400
    { Bad_Opcode },
7401
    { Bad_Opcode },
7402
    /* 90 */
7403
    { Bad_Opcode },
7404
    { Bad_Opcode },
7405
    { Bad_Opcode },
7406
    { Bad_Opcode },
7407
    { Bad_Opcode },
7408
    { Bad_Opcode },
7409
    { Bad_Opcode },
7410
    { Bad_Opcode },
7411
    /* 98 */
7412
    { Bad_Opcode },
7413
    { Bad_Opcode },
7414
    { Bad_Opcode },
7415
    { Bad_Opcode },
7416
    { Bad_Opcode },
7417
    { Bad_Opcode },
7418
    { Bad_Opcode },
7419
    { Bad_Opcode },
7420
    /* a0 */
7421
    { Bad_Opcode },
7422
    { Bad_Opcode },
7423
    { Bad_Opcode },
7424
    { Bad_Opcode },
7425
    { Bad_Opcode },
7426
    { Bad_Opcode },
7427
    { Bad_Opcode },
7428
    { Bad_Opcode },
7429
    /* a8 */
7430
    { Bad_Opcode },
7431
    { Bad_Opcode },
7432
    { Bad_Opcode },
7433
    { Bad_Opcode },
7434
    { Bad_Opcode },
7435
    { Bad_Opcode },
7436
    { Bad_Opcode },
7437
    { Bad_Opcode },
7438
    /* b0 */
7439
    { Bad_Opcode },
7440
    { Bad_Opcode },
7441
    { Bad_Opcode },
7442
    { Bad_Opcode },
7443
    { Bad_Opcode },
7444
    { Bad_Opcode },
7445
    { Bad_Opcode },
7446
    { Bad_Opcode },
7447
    /* b8 */
7448
    { Bad_Opcode },
7449
    { Bad_Opcode },
7450
    { Bad_Opcode },
7451
    { Bad_Opcode },
7452
    { Bad_Opcode },
7453
    { Bad_Opcode },
7454
    { Bad_Opcode },
7455
    { Bad_Opcode },
7456
    /* c0 */
7457
    { Bad_Opcode },
7458
    { Bad_Opcode },
7459
    { Bad_Opcode },
7460
    { Bad_Opcode },
7461
    { Bad_Opcode },
7462
    { Bad_Opcode },
7463
    { Bad_Opcode },
7464
    { Bad_Opcode },
7465
    /* c8 */
7466
    { Bad_Opcode },
7467
    { Bad_Opcode },
7468
    { Bad_Opcode },
7469
    { Bad_Opcode },
7470
    { Bad_Opcode },
7471
    { Bad_Opcode },
7472
    { Bad_Opcode },
7473
    { Bad_Opcode },
7474
    /* d0 */
7475
    { Bad_Opcode },
7476
    { Bad_Opcode },
7477
    { Bad_Opcode },
7478
    { Bad_Opcode },
7479
    { Bad_Opcode },
7480
    { Bad_Opcode },
7481
    { Bad_Opcode },
7482
    { Bad_Opcode },
7483
    /* d8 */
7484
    { Bad_Opcode },
7485
    { Bad_Opcode },
7486
    { Bad_Opcode },
7487
    { Bad_Opcode },
7488
    { Bad_Opcode },
7489
    { Bad_Opcode },
7490
    { Bad_Opcode },
7491
    { Bad_Opcode },
7492
    /* e0 */
7493
    { Bad_Opcode },
7494
    { Bad_Opcode },
7495
    { Bad_Opcode },
7496
    { Bad_Opcode },
7497
    { Bad_Opcode },
7498
    { Bad_Opcode },
7499
    { Bad_Opcode },
7500
    { Bad_Opcode },
7501
    /* e8 */
7502
    { Bad_Opcode },
7503
    { Bad_Opcode },
7504
    { Bad_Opcode },
7505
    { Bad_Opcode },
7506
    { Bad_Opcode },
7507
    { Bad_Opcode },
7508
    { Bad_Opcode },
7509
    { Bad_Opcode },
7510
    /* f0 */
7511
    { Bad_Opcode },
7512
    { Bad_Opcode },
7513
    { Bad_Opcode },
7514
    { Bad_Opcode },
7515
    { Bad_Opcode },
7516
    { Bad_Opcode },
7517
    { Bad_Opcode },
7518
    { Bad_Opcode },
7519
    /* f8 */
7520
    { Bad_Opcode },
7521
    { Bad_Opcode },
7522
    { Bad_Opcode },
7523
    { Bad_Opcode },
7524
    { Bad_Opcode },
7525
    { Bad_Opcode },
7526
    { Bad_Opcode },
7527
    { Bad_Opcode },
7528
  },
7529
};
7530
 
7531
static const struct dis386 vex_table[][256] = {
7532
  /* VEX_0F */
7533
  {
7534
    /* 00 */
7535
    { Bad_Opcode },
7536
    { Bad_Opcode },
7537
    { Bad_Opcode },
7538
    { Bad_Opcode },
7539
    { Bad_Opcode },
7540
    { Bad_Opcode },
7541
    { Bad_Opcode },
7542
    { Bad_Opcode },
7543
    /* 08 */
7544
    { Bad_Opcode },
7545
    { Bad_Opcode },
7546
    { Bad_Opcode },
7547
    { Bad_Opcode },
7548
    { Bad_Opcode },
7549
    { Bad_Opcode },
7550
    { Bad_Opcode },
7551
    { Bad_Opcode },
7552
    /* 10 */
7553
    { PREFIX_TABLE (PREFIX_VEX_0F10) },
7554
    { PREFIX_TABLE (PREFIX_VEX_0F11) },
7555
    { PREFIX_TABLE (PREFIX_VEX_0F12) },
7556
    { MOD_TABLE (MOD_VEX_0F13) },
7557
    { VEX_W_TABLE (VEX_W_0F14) },
7558
    { VEX_W_TABLE (VEX_W_0F15) },
7559
    { PREFIX_TABLE (PREFIX_VEX_0F16) },
7560
    { MOD_TABLE (MOD_VEX_0F17) },
7561
    /* 18 */
7562
    { Bad_Opcode },
7563
    { Bad_Opcode },
7564
    { Bad_Opcode },
7565
    { Bad_Opcode },
7566
    { Bad_Opcode },
7567
    { Bad_Opcode },
7568
    { Bad_Opcode },
7569
    { Bad_Opcode },
7570
    /* 20 */
7571
    { Bad_Opcode },
7572
    { Bad_Opcode },
7573
    { Bad_Opcode },
7574
    { Bad_Opcode },
7575
    { Bad_Opcode },
7576
    { Bad_Opcode },
7577
    { Bad_Opcode },
7578
    { Bad_Opcode },
7579
    /* 28 */
7580
    { VEX_W_TABLE (VEX_W_0F28) },
7581
    { VEX_W_TABLE (VEX_W_0F29) },
7582
    { PREFIX_TABLE (PREFIX_VEX_0F2A) },
7583
    { MOD_TABLE (MOD_VEX_0F2B) },
7584
    { PREFIX_TABLE (PREFIX_VEX_0F2C) },
7585
    { PREFIX_TABLE (PREFIX_VEX_0F2D) },
7586
    { PREFIX_TABLE (PREFIX_VEX_0F2E) },
7587
    { PREFIX_TABLE (PREFIX_VEX_0F2F) },
7588
    /* 30 */
7589
    { Bad_Opcode },
7590
    { Bad_Opcode },
7591
    { Bad_Opcode },
7592
    { Bad_Opcode },
7593
    { Bad_Opcode },
7594
    { Bad_Opcode },
7595
    { Bad_Opcode },
7596
    { Bad_Opcode },
7597
    /* 38 */
7598
    { Bad_Opcode },
7599
    { Bad_Opcode },
7600
    { Bad_Opcode },
7601
    { Bad_Opcode },
7602
    { Bad_Opcode },
7603
    { Bad_Opcode },
7604
    { Bad_Opcode },
7605
    { Bad_Opcode },
7606
    /* 40 */
7607
    { Bad_Opcode },
7608
    { Bad_Opcode },
7609
    { Bad_Opcode },
7610
    { Bad_Opcode },
7611
    { Bad_Opcode },
7612
    { Bad_Opcode },
7613
    { Bad_Opcode },
7614
    { Bad_Opcode },
7615
    /* 48 */
7616
    { Bad_Opcode },
7617
    { Bad_Opcode },
7618
    { Bad_Opcode },
7619
    { Bad_Opcode },
7620
    { Bad_Opcode },
7621
    { Bad_Opcode },
7622
    { Bad_Opcode },
7623
    { Bad_Opcode },
7624
    /* 50 */
7625
    { MOD_TABLE (MOD_VEX_0F50) },
7626
    { PREFIX_TABLE (PREFIX_VEX_0F51) },
7627
    { PREFIX_TABLE (PREFIX_VEX_0F52) },
7628
    { PREFIX_TABLE (PREFIX_VEX_0F53) },
7629
    { "vandpX",         { XM, Vex, EXx } },
7630
    { "vandnpX",        { XM, Vex, EXx } },
7631
    { "vorpX",          { XM, Vex, EXx } },
7632
    { "vxorpX",         { XM, Vex, EXx } },
7633
    /* 58 */
7634
    { PREFIX_TABLE (PREFIX_VEX_0F58) },
7635
    { PREFIX_TABLE (PREFIX_VEX_0F59) },
7636
    { PREFIX_TABLE (PREFIX_VEX_0F5A) },
7637
    { PREFIX_TABLE (PREFIX_VEX_0F5B) },
7638
    { PREFIX_TABLE (PREFIX_VEX_0F5C) },
7639
    { PREFIX_TABLE (PREFIX_VEX_0F5D) },
7640
    { PREFIX_TABLE (PREFIX_VEX_0F5E) },
7641
    { PREFIX_TABLE (PREFIX_VEX_0F5F) },
7642
    /* 60 */
7643
    { PREFIX_TABLE (PREFIX_VEX_0F60) },
7644
    { PREFIX_TABLE (PREFIX_VEX_0F61) },
7645
    { PREFIX_TABLE (PREFIX_VEX_0F62) },
7646
    { PREFIX_TABLE (PREFIX_VEX_0F63) },
7647
    { PREFIX_TABLE (PREFIX_VEX_0F64) },
7648
    { PREFIX_TABLE (PREFIX_VEX_0F65) },
7649
    { PREFIX_TABLE (PREFIX_VEX_0F66) },
7650
    { PREFIX_TABLE (PREFIX_VEX_0F67) },
7651
    /* 68 */
7652
    { PREFIX_TABLE (PREFIX_VEX_0F68) },
7653
    { PREFIX_TABLE (PREFIX_VEX_0F69) },
7654
    { PREFIX_TABLE (PREFIX_VEX_0F6A) },
7655
    { PREFIX_TABLE (PREFIX_VEX_0F6B) },
7656
    { PREFIX_TABLE (PREFIX_VEX_0F6C) },
7657
    { PREFIX_TABLE (PREFIX_VEX_0F6D) },
7658
    { PREFIX_TABLE (PREFIX_VEX_0F6E) },
7659
    { PREFIX_TABLE (PREFIX_VEX_0F6F) },
7660
    /* 70 */
7661
    { PREFIX_TABLE (PREFIX_VEX_0F70) },
7662
    { REG_TABLE (REG_VEX_0F71) },
7663
    { REG_TABLE (REG_VEX_0F72) },
7664
    { REG_TABLE (REG_VEX_0F73) },
7665
    { PREFIX_TABLE (PREFIX_VEX_0F74) },
7666
    { PREFIX_TABLE (PREFIX_VEX_0F75) },
7667
    { PREFIX_TABLE (PREFIX_VEX_0F76) },
7668
    { PREFIX_TABLE (PREFIX_VEX_0F77) },
7669
    /* 78 */
7670
    { Bad_Opcode },
7671
    { Bad_Opcode },
7672
    { Bad_Opcode },
7673
    { Bad_Opcode },
7674
    { PREFIX_TABLE (PREFIX_VEX_0F7C) },
7675
    { PREFIX_TABLE (PREFIX_VEX_0F7D) },
7676
    { PREFIX_TABLE (PREFIX_VEX_0F7E) },
7677
    { PREFIX_TABLE (PREFIX_VEX_0F7F) },
7678
    /* 80 */
7679
    { Bad_Opcode },
7680
    { Bad_Opcode },
7681
    { Bad_Opcode },
7682
    { Bad_Opcode },
7683
    { Bad_Opcode },
7684
    { Bad_Opcode },
7685
    { Bad_Opcode },
7686
    { Bad_Opcode },
7687
    /* 88 */
7688
    { Bad_Opcode },
7689
    { Bad_Opcode },
7690
    { Bad_Opcode },
7691
    { Bad_Opcode },
7692
    { Bad_Opcode },
7693
    { Bad_Opcode },
7694
    { Bad_Opcode },
7695
    { Bad_Opcode },
7696
    /* 90 */
7697
    { Bad_Opcode },
7698
    { Bad_Opcode },
7699
    { Bad_Opcode },
7700
    { Bad_Opcode },
7701
    { Bad_Opcode },
7702
    { Bad_Opcode },
7703
    { Bad_Opcode },
7704
    { Bad_Opcode },
7705
    /* 98 */
7706
    { Bad_Opcode },
7707
    { Bad_Opcode },
7708
    { Bad_Opcode },
7709
    { Bad_Opcode },
7710
    { Bad_Opcode },
7711
    { Bad_Opcode },
7712
    { Bad_Opcode },
7713
    { Bad_Opcode },
7714
    /* a0 */
7715
    { Bad_Opcode },
7716
    { Bad_Opcode },
7717
    { Bad_Opcode },
7718
    { Bad_Opcode },
7719
    { Bad_Opcode },
7720
    { Bad_Opcode },
7721
    { Bad_Opcode },
7722
    { Bad_Opcode },
7723
    /* a8 */
7724
    { Bad_Opcode },
7725
    { Bad_Opcode },
7726
    { Bad_Opcode },
7727
    { Bad_Opcode },
7728
    { Bad_Opcode },
7729
    { Bad_Opcode },
7730
    { REG_TABLE (REG_VEX_0FAE) },
7731
    { Bad_Opcode },
7732
    /* b0 */
7733
    { Bad_Opcode },
7734
    { Bad_Opcode },
7735
    { Bad_Opcode },
7736
    { Bad_Opcode },
7737
    { Bad_Opcode },
7738
    { Bad_Opcode },
7739
    { Bad_Opcode },
7740
    { Bad_Opcode },
7741
    /* b8 */
7742
    { Bad_Opcode },
7743
    { Bad_Opcode },
7744
    { Bad_Opcode },
7745
    { Bad_Opcode },
7746
    { Bad_Opcode },
7747
    { Bad_Opcode },
7748
    { Bad_Opcode },
7749
    { Bad_Opcode },
7750
    /* c0 */
7751
    { Bad_Opcode },
7752
    { Bad_Opcode },
7753
    { PREFIX_TABLE (PREFIX_VEX_0FC2) },
7754
    { Bad_Opcode },
7755
    { PREFIX_TABLE (PREFIX_VEX_0FC4) },
7756
    { PREFIX_TABLE (PREFIX_VEX_0FC5) },
7757
    { "vshufpX",        { XM, Vex, EXx, Ib } },
7758
    { Bad_Opcode },
7759
    /* c8 */
7760
    { Bad_Opcode },
7761
    { Bad_Opcode },
7762
    { Bad_Opcode },
7763
    { Bad_Opcode },
7764
    { Bad_Opcode },
7765
    { Bad_Opcode },
7766
    { Bad_Opcode },
7767
    { Bad_Opcode },
7768
    /* d0 */
7769
    { PREFIX_TABLE (PREFIX_VEX_0FD0) },
7770
    { PREFIX_TABLE (PREFIX_VEX_0FD1) },
7771
    { PREFIX_TABLE (PREFIX_VEX_0FD2) },
7772
    { PREFIX_TABLE (PREFIX_VEX_0FD3) },
7773
    { PREFIX_TABLE (PREFIX_VEX_0FD4) },
7774
    { PREFIX_TABLE (PREFIX_VEX_0FD5) },
7775
    { PREFIX_TABLE (PREFIX_VEX_0FD6) },
7776
    { PREFIX_TABLE (PREFIX_VEX_0FD7) },
7777
    /* d8 */
7778
    { PREFIX_TABLE (PREFIX_VEX_0FD8) },
7779
    { PREFIX_TABLE (PREFIX_VEX_0FD9) },
7780
    { PREFIX_TABLE (PREFIX_VEX_0FDA) },
7781
    { PREFIX_TABLE (PREFIX_VEX_0FDB) },
7782
    { PREFIX_TABLE (PREFIX_VEX_0FDC) },
7783
    { PREFIX_TABLE (PREFIX_VEX_0FDD) },
7784
    { PREFIX_TABLE (PREFIX_VEX_0FDE) },
7785
    { PREFIX_TABLE (PREFIX_VEX_0FDF) },
7786
    /* e0 */
7787
    { PREFIX_TABLE (PREFIX_VEX_0FE0) },
7788
    { PREFIX_TABLE (PREFIX_VEX_0FE1) },
7789
    { PREFIX_TABLE (PREFIX_VEX_0FE2) },
7790
    { PREFIX_TABLE (PREFIX_VEX_0FE3) },
7791
    { PREFIX_TABLE (PREFIX_VEX_0FE4) },
7792
    { PREFIX_TABLE (PREFIX_VEX_0FE5) },
7793
    { PREFIX_TABLE (PREFIX_VEX_0FE6) },
7794
    { PREFIX_TABLE (PREFIX_VEX_0FE7) },
7795
    /* e8 */
7796
    { PREFIX_TABLE (PREFIX_VEX_0FE8) },
7797
    { PREFIX_TABLE (PREFIX_VEX_0FE9) },
7798
    { PREFIX_TABLE (PREFIX_VEX_0FEA) },
7799
    { PREFIX_TABLE (PREFIX_VEX_0FEB) },
7800
    { PREFIX_TABLE (PREFIX_VEX_0FEC) },
7801
    { PREFIX_TABLE (PREFIX_VEX_0FED) },
7802
    { PREFIX_TABLE (PREFIX_VEX_0FEE) },
7803
    { PREFIX_TABLE (PREFIX_VEX_0FEF) },
7804
    /* f0 */
7805
    { PREFIX_TABLE (PREFIX_VEX_0FF0) },
7806
    { PREFIX_TABLE (PREFIX_VEX_0FF1) },
7807
    { PREFIX_TABLE (PREFIX_VEX_0FF2) },
7808
    { PREFIX_TABLE (PREFIX_VEX_0FF3) },
7809
    { PREFIX_TABLE (PREFIX_VEX_0FF4) },
7810
    { PREFIX_TABLE (PREFIX_VEX_0FF5) },
7811
    { PREFIX_TABLE (PREFIX_VEX_0FF6) },
7812
    { PREFIX_TABLE (PREFIX_VEX_0FF7) },
7813
    /* f8 */
7814
    { PREFIX_TABLE (PREFIX_VEX_0FF8) },
7815
    { PREFIX_TABLE (PREFIX_VEX_0FF9) },
7816
    { PREFIX_TABLE (PREFIX_VEX_0FFA) },
7817
    { PREFIX_TABLE (PREFIX_VEX_0FFB) },
7818
    { PREFIX_TABLE (PREFIX_VEX_0FFC) },
7819
    { PREFIX_TABLE (PREFIX_VEX_0FFD) },
7820
    { PREFIX_TABLE (PREFIX_VEX_0FFE) },
7821
    { Bad_Opcode },
7822
  },
7823
  /* VEX_0F38 */
7824
  {
7825
    /* 00 */
7826
    { PREFIX_TABLE (PREFIX_VEX_0F3800) },
7827
    { PREFIX_TABLE (PREFIX_VEX_0F3801) },
7828
    { PREFIX_TABLE (PREFIX_VEX_0F3802) },
7829
    { PREFIX_TABLE (PREFIX_VEX_0F3803) },
7830
    { PREFIX_TABLE (PREFIX_VEX_0F3804) },
7831
    { PREFIX_TABLE (PREFIX_VEX_0F3805) },
7832
    { PREFIX_TABLE (PREFIX_VEX_0F3806) },
7833
    { PREFIX_TABLE (PREFIX_VEX_0F3807) },
7834
    /* 08 */
7835
    { PREFIX_TABLE (PREFIX_VEX_0F3808) },
7836
    { PREFIX_TABLE (PREFIX_VEX_0F3809) },
7837
    { PREFIX_TABLE (PREFIX_VEX_0F380A) },
7838
    { PREFIX_TABLE (PREFIX_VEX_0F380B) },
7839
    { PREFIX_TABLE (PREFIX_VEX_0F380C) },
7840
    { PREFIX_TABLE (PREFIX_VEX_0F380D) },
7841
    { PREFIX_TABLE (PREFIX_VEX_0F380E) },
7842
    { PREFIX_TABLE (PREFIX_VEX_0F380F) },
7843
    /* 10 */
7844
    { Bad_Opcode },
7845
    { Bad_Opcode },
7846
    { Bad_Opcode },
7847
    { PREFIX_TABLE (PREFIX_VEX_0F3813) },
7848
    { Bad_Opcode },
7849
    { Bad_Opcode },
7850 148 khays
    { PREFIX_TABLE (PREFIX_VEX_0F3816) },
7851 18 khays
    { PREFIX_TABLE (PREFIX_VEX_0F3817) },
7852
    /* 18 */
7853
    { PREFIX_TABLE (PREFIX_VEX_0F3818) },
7854
    { PREFIX_TABLE (PREFIX_VEX_0F3819) },
7855
    { PREFIX_TABLE (PREFIX_VEX_0F381A) },
7856
    { Bad_Opcode },
7857
    { PREFIX_TABLE (PREFIX_VEX_0F381C) },
7858
    { PREFIX_TABLE (PREFIX_VEX_0F381D) },
7859
    { PREFIX_TABLE (PREFIX_VEX_0F381E) },
7860
    { Bad_Opcode },
7861
    /* 20 */
7862
    { PREFIX_TABLE (PREFIX_VEX_0F3820) },
7863
    { PREFIX_TABLE (PREFIX_VEX_0F3821) },
7864
    { PREFIX_TABLE (PREFIX_VEX_0F3822) },
7865
    { PREFIX_TABLE (PREFIX_VEX_0F3823) },
7866
    { PREFIX_TABLE (PREFIX_VEX_0F3824) },
7867
    { PREFIX_TABLE (PREFIX_VEX_0F3825) },
7868
    { Bad_Opcode },
7869
    { Bad_Opcode },
7870
    /* 28 */
7871
    { PREFIX_TABLE (PREFIX_VEX_0F3828) },
7872
    { PREFIX_TABLE (PREFIX_VEX_0F3829) },
7873
    { PREFIX_TABLE (PREFIX_VEX_0F382A) },
7874
    { PREFIX_TABLE (PREFIX_VEX_0F382B) },
7875
    { PREFIX_TABLE (PREFIX_VEX_0F382C) },
7876
    { PREFIX_TABLE (PREFIX_VEX_0F382D) },
7877
    { PREFIX_TABLE (PREFIX_VEX_0F382E) },
7878
    { PREFIX_TABLE (PREFIX_VEX_0F382F) },
7879
    /* 30 */
7880
    { PREFIX_TABLE (PREFIX_VEX_0F3830) },
7881
    { PREFIX_TABLE (PREFIX_VEX_0F3831) },
7882
    { PREFIX_TABLE (PREFIX_VEX_0F3832) },
7883
    { PREFIX_TABLE (PREFIX_VEX_0F3833) },
7884
    { PREFIX_TABLE (PREFIX_VEX_0F3834) },
7885
    { PREFIX_TABLE (PREFIX_VEX_0F3835) },
7886 148 khays
    { PREFIX_TABLE (PREFIX_VEX_0F3836) },
7887 18 khays
    { PREFIX_TABLE (PREFIX_VEX_0F3837) },
7888
    /* 38 */
7889
    { PREFIX_TABLE (PREFIX_VEX_0F3838) },
7890
    { PREFIX_TABLE (PREFIX_VEX_0F3839) },
7891
    { PREFIX_TABLE (PREFIX_VEX_0F383A) },
7892
    { PREFIX_TABLE (PREFIX_VEX_0F383B) },
7893
    { PREFIX_TABLE (PREFIX_VEX_0F383C) },
7894
    { PREFIX_TABLE (PREFIX_VEX_0F383D) },
7895
    { PREFIX_TABLE (PREFIX_VEX_0F383E) },
7896
    { PREFIX_TABLE (PREFIX_VEX_0F383F) },
7897
    /* 40 */
7898
    { PREFIX_TABLE (PREFIX_VEX_0F3840) },
7899
    { PREFIX_TABLE (PREFIX_VEX_0F3841) },
7900
    { Bad_Opcode },
7901
    { Bad_Opcode },
7902
    { Bad_Opcode },
7903 148 khays
    { PREFIX_TABLE (PREFIX_VEX_0F3845) },
7904
    { PREFIX_TABLE (PREFIX_VEX_0F3846) },
7905
    { PREFIX_TABLE (PREFIX_VEX_0F3847) },
7906 18 khays
    /* 48 */
7907
    { Bad_Opcode },
7908
    { Bad_Opcode },
7909
    { Bad_Opcode },
7910
    { Bad_Opcode },
7911
    { Bad_Opcode },
7912
    { Bad_Opcode },
7913
    { Bad_Opcode },
7914
    { Bad_Opcode },
7915
    /* 50 */
7916
    { Bad_Opcode },
7917
    { Bad_Opcode },
7918
    { Bad_Opcode },
7919
    { Bad_Opcode },
7920
    { Bad_Opcode },
7921
    { Bad_Opcode },
7922
    { Bad_Opcode },
7923
    { Bad_Opcode },
7924
    /* 58 */
7925 148 khays
    { PREFIX_TABLE (PREFIX_VEX_0F3858) },
7926
    { PREFIX_TABLE (PREFIX_VEX_0F3859) },
7927
    { PREFIX_TABLE (PREFIX_VEX_0F385A) },
7928 18 khays
    { Bad_Opcode },
7929
    { Bad_Opcode },
7930
    { Bad_Opcode },
7931
    { Bad_Opcode },
7932
    { Bad_Opcode },
7933
    /* 60 */
7934
    { Bad_Opcode },
7935
    { Bad_Opcode },
7936
    { Bad_Opcode },
7937
    { Bad_Opcode },
7938
    { Bad_Opcode },
7939
    { Bad_Opcode },
7940
    { Bad_Opcode },
7941
    { Bad_Opcode },
7942
    /* 68 */
7943
    { Bad_Opcode },
7944
    { Bad_Opcode },
7945
    { Bad_Opcode },
7946
    { Bad_Opcode },
7947
    { Bad_Opcode },
7948
    { Bad_Opcode },
7949
    { Bad_Opcode },
7950
    { Bad_Opcode },
7951
    /* 70 */
7952
    { Bad_Opcode },
7953
    { Bad_Opcode },
7954
    { Bad_Opcode },
7955
    { Bad_Opcode },
7956
    { Bad_Opcode },
7957
    { Bad_Opcode },
7958
    { Bad_Opcode },
7959
    { Bad_Opcode },
7960
    /* 78 */
7961 148 khays
    { PREFIX_TABLE (PREFIX_VEX_0F3878) },
7962
    { PREFIX_TABLE (PREFIX_VEX_0F3879) },
7963 18 khays
    { Bad_Opcode },
7964
    { Bad_Opcode },
7965
    { Bad_Opcode },
7966
    { Bad_Opcode },
7967
    { Bad_Opcode },
7968
    { Bad_Opcode },
7969
    /* 80 */
7970
    { Bad_Opcode },
7971
    { Bad_Opcode },
7972
    { Bad_Opcode },
7973
    { Bad_Opcode },
7974
    { Bad_Opcode },
7975
    { Bad_Opcode },
7976
    { Bad_Opcode },
7977
    { Bad_Opcode },
7978
    /* 88 */
7979
    { Bad_Opcode },
7980
    { Bad_Opcode },
7981
    { Bad_Opcode },
7982
    { Bad_Opcode },
7983 148 khays
    { PREFIX_TABLE (PREFIX_VEX_0F388C) },
7984 18 khays
    { Bad_Opcode },
7985 148 khays
    { PREFIX_TABLE (PREFIX_VEX_0F388E) },
7986 18 khays
    { Bad_Opcode },
7987
    /* 90 */
7988 148 khays
    { PREFIX_TABLE (PREFIX_VEX_0F3890) },
7989
    { PREFIX_TABLE (PREFIX_VEX_0F3891) },
7990
    { PREFIX_TABLE (PREFIX_VEX_0F3892) },
7991
    { PREFIX_TABLE (PREFIX_VEX_0F3893) },
7992 18 khays
    { Bad_Opcode },
7993
    { Bad_Opcode },
7994
    { PREFIX_TABLE (PREFIX_VEX_0F3896) },
7995
    { PREFIX_TABLE (PREFIX_VEX_0F3897) },
7996
    /* 98 */
7997
    { PREFIX_TABLE (PREFIX_VEX_0F3898) },
7998
    { PREFIX_TABLE (PREFIX_VEX_0F3899) },
7999
    { PREFIX_TABLE (PREFIX_VEX_0F389A) },
8000
    { PREFIX_TABLE (PREFIX_VEX_0F389B) },
8001
    { PREFIX_TABLE (PREFIX_VEX_0F389C) },
8002
    { PREFIX_TABLE (PREFIX_VEX_0F389D) },
8003
    { PREFIX_TABLE (PREFIX_VEX_0F389E) },
8004
    { PREFIX_TABLE (PREFIX_VEX_0F389F) },
8005
    /* a0 */
8006
    { Bad_Opcode },
8007
    { Bad_Opcode },
8008
    { Bad_Opcode },
8009
    { Bad_Opcode },
8010
    { Bad_Opcode },
8011
    { Bad_Opcode },
8012
    { PREFIX_TABLE (PREFIX_VEX_0F38A6) },
8013
    { PREFIX_TABLE (PREFIX_VEX_0F38A7) },
8014
    /* a8 */
8015
    { PREFIX_TABLE (PREFIX_VEX_0F38A8) },
8016
    { PREFIX_TABLE (PREFIX_VEX_0F38A9) },
8017
    { PREFIX_TABLE (PREFIX_VEX_0F38AA) },
8018
    { PREFIX_TABLE (PREFIX_VEX_0F38AB) },
8019
    { PREFIX_TABLE (PREFIX_VEX_0F38AC) },
8020
    { PREFIX_TABLE (PREFIX_VEX_0F38AD) },
8021
    { PREFIX_TABLE (PREFIX_VEX_0F38AE) },
8022
    { PREFIX_TABLE (PREFIX_VEX_0F38AF) },
8023
    /* b0 */
8024
    { Bad_Opcode },
8025
    { Bad_Opcode },
8026
    { Bad_Opcode },
8027
    { Bad_Opcode },
8028
    { Bad_Opcode },
8029
    { Bad_Opcode },
8030
    { PREFIX_TABLE (PREFIX_VEX_0F38B6) },
8031
    { PREFIX_TABLE (PREFIX_VEX_0F38B7) },
8032
    /* b8 */
8033
    { PREFIX_TABLE (PREFIX_VEX_0F38B8) },
8034
    { PREFIX_TABLE (PREFIX_VEX_0F38B9) },
8035
    { PREFIX_TABLE (PREFIX_VEX_0F38BA) },
8036
    { PREFIX_TABLE (PREFIX_VEX_0F38BB) },
8037
    { PREFIX_TABLE (PREFIX_VEX_0F38BC) },
8038
    { PREFIX_TABLE (PREFIX_VEX_0F38BD) },
8039
    { PREFIX_TABLE (PREFIX_VEX_0F38BE) },
8040
    { PREFIX_TABLE (PREFIX_VEX_0F38BF) },
8041
    /* c0 */
8042
    { Bad_Opcode },
8043
    { Bad_Opcode },
8044
    { Bad_Opcode },
8045
    { Bad_Opcode },
8046
    { Bad_Opcode },
8047
    { Bad_Opcode },
8048
    { Bad_Opcode },
8049
    { Bad_Opcode },
8050
    /* c8 */
8051
    { Bad_Opcode },
8052
    { Bad_Opcode },
8053
    { Bad_Opcode },
8054
    { Bad_Opcode },
8055
    { Bad_Opcode },
8056
    { Bad_Opcode },
8057
    { Bad_Opcode },
8058
    { Bad_Opcode },
8059
    /* d0 */
8060
    { Bad_Opcode },
8061
    { Bad_Opcode },
8062
    { Bad_Opcode },
8063
    { Bad_Opcode },
8064
    { Bad_Opcode },
8065
    { Bad_Opcode },
8066
    { Bad_Opcode },
8067
    { Bad_Opcode },
8068
    /* d8 */
8069
    { Bad_Opcode },
8070
    { Bad_Opcode },
8071
    { Bad_Opcode },
8072
    { PREFIX_TABLE (PREFIX_VEX_0F38DB) },
8073
    { PREFIX_TABLE (PREFIX_VEX_0F38DC) },
8074
    { PREFIX_TABLE (PREFIX_VEX_0F38DD) },
8075
    { PREFIX_TABLE (PREFIX_VEX_0F38DE) },
8076
    { PREFIX_TABLE (PREFIX_VEX_0F38DF) },
8077
    /* e0 */
8078
    { Bad_Opcode },
8079
    { Bad_Opcode },
8080
    { Bad_Opcode },
8081
    { Bad_Opcode },
8082
    { Bad_Opcode },
8083
    { Bad_Opcode },
8084
    { Bad_Opcode },
8085
    { Bad_Opcode },
8086
    /* e8 */
8087
    { Bad_Opcode },
8088
    { Bad_Opcode },
8089
    { Bad_Opcode },
8090
    { Bad_Opcode },
8091
    { Bad_Opcode },
8092
    { Bad_Opcode },
8093
    { Bad_Opcode },
8094
    { Bad_Opcode },
8095
    /* f0 */
8096
    { Bad_Opcode },
8097
    { Bad_Opcode },
8098
    { PREFIX_TABLE (PREFIX_VEX_0F38F2) },
8099
    { REG_TABLE (REG_VEX_0F38F3) },
8100
    { Bad_Opcode },
8101 148 khays
    { PREFIX_TABLE (PREFIX_VEX_0F38F5) },
8102
    { PREFIX_TABLE (PREFIX_VEX_0F38F6) },
8103 18 khays
    { PREFIX_TABLE (PREFIX_VEX_0F38F7) },
8104
    /* f8 */
8105
    { Bad_Opcode },
8106
    { Bad_Opcode },
8107
    { Bad_Opcode },
8108
    { Bad_Opcode },
8109
    { Bad_Opcode },
8110
    { Bad_Opcode },
8111
    { Bad_Opcode },
8112
    { Bad_Opcode },
8113
  },
8114
  /* VEX_0F3A */
8115
  {
8116
    /* 00 */
8117 148 khays
    { PREFIX_TABLE (PREFIX_VEX_0F3A00) },
8118
    { PREFIX_TABLE (PREFIX_VEX_0F3A01) },
8119
    { PREFIX_TABLE (PREFIX_VEX_0F3A02) },
8120 18 khays
    { Bad_Opcode },
8121
    { PREFIX_TABLE (PREFIX_VEX_0F3A04) },
8122
    { PREFIX_TABLE (PREFIX_VEX_0F3A05) },
8123
    { PREFIX_TABLE (PREFIX_VEX_0F3A06) },
8124
    { Bad_Opcode },
8125
    /* 08 */
8126
    { PREFIX_TABLE (PREFIX_VEX_0F3A08) },
8127
    { PREFIX_TABLE (PREFIX_VEX_0F3A09) },
8128
    { PREFIX_TABLE (PREFIX_VEX_0F3A0A) },
8129
    { PREFIX_TABLE (PREFIX_VEX_0F3A0B) },
8130
    { PREFIX_TABLE (PREFIX_VEX_0F3A0C) },
8131
    { PREFIX_TABLE (PREFIX_VEX_0F3A0D) },
8132
    { PREFIX_TABLE (PREFIX_VEX_0F3A0E) },
8133
    { PREFIX_TABLE (PREFIX_VEX_0F3A0F) },
8134
    /* 10 */
8135
    { Bad_Opcode },
8136
    { Bad_Opcode },
8137
    { Bad_Opcode },
8138
    { Bad_Opcode },
8139
    { PREFIX_TABLE (PREFIX_VEX_0F3A14) },
8140
    { PREFIX_TABLE (PREFIX_VEX_0F3A15) },
8141
    { PREFIX_TABLE (PREFIX_VEX_0F3A16) },
8142
    { PREFIX_TABLE (PREFIX_VEX_0F3A17) },
8143
    /* 18 */
8144
    { PREFIX_TABLE (PREFIX_VEX_0F3A18) },
8145
    { PREFIX_TABLE (PREFIX_VEX_0F3A19) },
8146
    { Bad_Opcode },
8147
    { Bad_Opcode },
8148
    { Bad_Opcode },
8149
    { PREFIX_TABLE (PREFIX_VEX_0F3A1D) },
8150
    { Bad_Opcode },
8151
    { Bad_Opcode },
8152
    /* 20 */
8153
    { PREFIX_TABLE (PREFIX_VEX_0F3A20) },
8154
    { PREFIX_TABLE (PREFIX_VEX_0F3A21) },
8155
    { PREFIX_TABLE (PREFIX_VEX_0F3A22) },
8156
    { Bad_Opcode },
8157
    { Bad_Opcode },
8158
    { Bad_Opcode },
8159
    { Bad_Opcode },
8160
    { Bad_Opcode },
8161
    /* 28 */
8162
    { Bad_Opcode },
8163
    { Bad_Opcode },
8164
    { Bad_Opcode },
8165
    { Bad_Opcode },
8166
    { Bad_Opcode },
8167
    { Bad_Opcode },
8168
    { Bad_Opcode },
8169
    { Bad_Opcode },
8170
    /* 30 */
8171
    { Bad_Opcode },
8172
    { Bad_Opcode },
8173
    { Bad_Opcode },
8174
    { Bad_Opcode },
8175
    { Bad_Opcode },
8176
    { Bad_Opcode },
8177
    { Bad_Opcode },
8178
    { Bad_Opcode },
8179
    /* 38 */
8180 148 khays
    { PREFIX_TABLE (PREFIX_VEX_0F3A38) },
8181
    { PREFIX_TABLE (PREFIX_VEX_0F3A39) },
8182 18 khays
    { Bad_Opcode },
8183
    { Bad_Opcode },
8184
    { Bad_Opcode },
8185
    { Bad_Opcode },
8186
    { Bad_Opcode },
8187
    { Bad_Opcode },
8188
    /* 40 */
8189
    { PREFIX_TABLE (PREFIX_VEX_0F3A40) },
8190
    { PREFIX_TABLE (PREFIX_VEX_0F3A41) },
8191
    { PREFIX_TABLE (PREFIX_VEX_0F3A42) },
8192
    { Bad_Opcode },
8193
    { PREFIX_TABLE (PREFIX_VEX_0F3A44) },
8194
    { Bad_Opcode },
8195 148 khays
    { PREFIX_TABLE (PREFIX_VEX_0F3A46) },
8196 18 khays
    { Bad_Opcode },
8197
    /* 48 */
8198
    { PREFIX_TABLE (PREFIX_VEX_0F3A48) },
8199
    { PREFIX_TABLE (PREFIX_VEX_0F3A49) },
8200
    { PREFIX_TABLE (PREFIX_VEX_0F3A4A) },
8201
    { PREFIX_TABLE (PREFIX_VEX_0F3A4B) },
8202
    { PREFIX_TABLE (PREFIX_VEX_0F3A4C) },
8203
    { Bad_Opcode },
8204
    { Bad_Opcode },
8205
    { Bad_Opcode },
8206
    /* 50 */
8207
    { Bad_Opcode },
8208
    { Bad_Opcode },
8209
    { Bad_Opcode },
8210
    { Bad_Opcode },
8211
    { Bad_Opcode },
8212
    { Bad_Opcode },
8213
    { Bad_Opcode },
8214
    { Bad_Opcode },
8215
    /* 58 */
8216
    { Bad_Opcode },
8217
    { Bad_Opcode },
8218
    { Bad_Opcode },
8219
    { Bad_Opcode },
8220
    { PREFIX_TABLE (PREFIX_VEX_0F3A5C) },
8221
    { PREFIX_TABLE (PREFIX_VEX_0F3A5D) },
8222
    { PREFIX_TABLE (PREFIX_VEX_0F3A5E) },
8223
    { PREFIX_TABLE (PREFIX_VEX_0F3A5F) },
8224
    /* 60 */
8225
    { PREFIX_TABLE (PREFIX_VEX_0F3A60) },
8226
    { PREFIX_TABLE (PREFIX_VEX_0F3A61) },
8227
    { PREFIX_TABLE (PREFIX_VEX_0F3A62) },
8228
    { PREFIX_TABLE (PREFIX_VEX_0F3A63) },
8229
    { Bad_Opcode },
8230
    { Bad_Opcode },
8231
    { Bad_Opcode },
8232
    { Bad_Opcode },
8233
    /* 68 */
8234
    { PREFIX_TABLE (PREFIX_VEX_0F3A68) },
8235
    { PREFIX_TABLE (PREFIX_VEX_0F3A69) },
8236
    { PREFIX_TABLE (PREFIX_VEX_0F3A6A) },
8237
    { PREFIX_TABLE (PREFIX_VEX_0F3A6B) },
8238
    { PREFIX_TABLE (PREFIX_VEX_0F3A6C) },
8239
    { PREFIX_TABLE (PREFIX_VEX_0F3A6D) },
8240
    { PREFIX_TABLE (PREFIX_VEX_0F3A6E) },
8241
    { PREFIX_TABLE (PREFIX_VEX_0F3A6F) },
8242
    /* 70 */
8243
    { Bad_Opcode },
8244
    { Bad_Opcode },
8245
    { Bad_Opcode },
8246
    { Bad_Opcode },
8247
    { Bad_Opcode },
8248
    { Bad_Opcode },
8249
    { Bad_Opcode },
8250
    { Bad_Opcode },
8251
    /* 78 */
8252
    { PREFIX_TABLE (PREFIX_VEX_0F3A78) },
8253
    { PREFIX_TABLE (PREFIX_VEX_0F3A79) },
8254
    { PREFIX_TABLE (PREFIX_VEX_0F3A7A) },
8255
    { PREFIX_TABLE (PREFIX_VEX_0F3A7B) },
8256
    { PREFIX_TABLE (PREFIX_VEX_0F3A7C) },
8257
    { PREFIX_TABLE (PREFIX_VEX_0F3A7D) },
8258
    { PREFIX_TABLE (PREFIX_VEX_0F3A7E) },
8259
    { PREFIX_TABLE (PREFIX_VEX_0F3A7F) },
8260
    /* 80 */
8261
    { Bad_Opcode },
8262
    { Bad_Opcode },
8263
    { Bad_Opcode },
8264
    { Bad_Opcode },
8265
    { Bad_Opcode },
8266
    { Bad_Opcode },
8267
    { Bad_Opcode },
8268
    { Bad_Opcode },
8269
    /* 88 */
8270
    { Bad_Opcode },
8271
    { Bad_Opcode },
8272
    { Bad_Opcode },
8273
    { Bad_Opcode },
8274
    { Bad_Opcode },
8275
    { Bad_Opcode },
8276
    { Bad_Opcode },
8277
    { Bad_Opcode },
8278
    /* 90 */
8279
    { Bad_Opcode },
8280
    { Bad_Opcode },
8281
    { Bad_Opcode },
8282
    { Bad_Opcode },
8283
    { Bad_Opcode },
8284
    { Bad_Opcode },
8285
    { Bad_Opcode },
8286
    { Bad_Opcode },
8287
    /* 98 */
8288
    { Bad_Opcode },
8289
    { Bad_Opcode },
8290
    { Bad_Opcode },
8291
    { Bad_Opcode },
8292
    { Bad_Opcode },
8293
    { Bad_Opcode },
8294
    { Bad_Opcode },
8295
    { Bad_Opcode },
8296
    /* a0 */
8297
    { Bad_Opcode },
8298
    { Bad_Opcode },
8299
    { Bad_Opcode },
8300
    { Bad_Opcode },
8301
    { Bad_Opcode },
8302
    { Bad_Opcode },
8303
    { Bad_Opcode },
8304
    { Bad_Opcode },
8305
    /* a8 */
8306
    { Bad_Opcode },
8307
    { Bad_Opcode },
8308
    { Bad_Opcode },
8309
    { Bad_Opcode },
8310
    { Bad_Opcode },
8311
    { Bad_Opcode },
8312
    { Bad_Opcode },
8313
    { Bad_Opcode },
8314
    /* b0 */
8315
    { Bad_Opcode },
8316
    { Bad_Opcode },
8317
    { Bad_Opcode },
8318
    { Bad_Opcode },
8319
    { Bad_Opcode },
8320
    { Bad_Opcode },
8321
    { Bad_Opcode },
8322
    { Bad_Opcode },
8323
    /* b8 */
8324
    { Bad_Opcode },
8325
    { Bad_Opcode },
8326
    { Bad_Opcode },
8327
    { Bad_Opcode },
8328
    { Bad_Opcode },
8329
    { Bad_Opcode },
8330
    { Bad_Opcode },
8331
    { Bad_Opcode },
8332
    /* c0 */
8333
    { Bad_Opcode },
8334
    { Bad_Opcode },
8335
    { Bad_Opcode },
8336
    { Bad_Opcode },
8337
    { Bad_Opcode },
8338
    { Bad_Opcode },
8339
    { Bad_Opcode },
8340
    { Bad_Opcode },
8341
    /* c8 */
8342
    { Bad_Opcode },
8343
    { Bad_Opcode },
8344
    { Bad_Opcode },
8345
    { Bad_Opcode },
8346
    { Bad_Opcode },
8347
    { Bad_Opcode },
8348
    { Bad_Opcode },
8349
    { Bad_Opcode },
8350
    /* d0 */
8351
    { Bad_Opcode },
8352
    { Bad_Opcode },
8353
    { Bad_Opcode },
8354
    { Bad_Opcode },
8355
    { Bad_Opcode },
8356
    { Bad_Opcode },
8357
    { Bad_Opcode },
8358
    { Bad_Opcode },
8359
    /* d8 */
8360
    { Bad_Opcode },
8361
    { Bad_Opcode },
8362
    { Bad_Opcode },
8363
    { Bad_Opcode },
8364
    { Bad_Opcode },
8365
    { Bad_Opcode },
8366
    { Bad_Opcode },
8367
    { PREFIX_TABLE (PREFIX_VEX_0F3ADF) },
8368
    /* e0 */
8369
    { Bad_Opcode },
8370
    { Bad_Opcode },
8371
    { Bad_Opcode },
8372
    { Bad_Opcode },
8373
    { Bad_Opcode },
8374
    { Bad_Opcode },
8375
    { Bad_Opcode },
8376
    { Bad_Opcode },
8377
    /* e8 */
8378
    { Bad_Opcode },
8379
    { Bad_Opcode },
8380
    { Bad_Opcode },
8381
    { Bad_Opcode },
8382
    { Bad_Opcode },
8383
    { Bad_Opcode },
8384
    { Bad_Opcode },
8385
    { Bad_Opcode },
8386
    /* f0 */
8387 148 khays
    { PREFIX_TABLE (PREFIX_VEX_0F3AF0) },
8388 18 khays
    { Bad_Opcode },
8389
    { Bad_Opcode },
8390
    { Bad_Opcode },
8391
    { Bad_Opcode },
8392
    { Bad_Opcode },
8393
    { Bad_Opcode },
8394
    { Bad_Opcode },
8395
    /* f8 */
8396
    { Bad_Opcode },
8397
    { Bad_Opcode },
8398
    { Bad_Opcode },
8399
    { Bad_Opcode },
8400
    { Bad_Opcode },
8401
    { Bad_Opcode },
8402
    { Bad_Opcode },
8403
    { Bad_Opcode },
8404
  },
8405
};
8406
 
8407
static const struct dis386 vex_len_table[][2] = {
8408
  /* VEX_LEN_0F10_P_1 */
8409
  {
8410
    { VEX_W_TABLE (VEX_W_0F10_P_1) },
8411
    { VEX_W_TABLE (VEX_W_0F10_P_1) },
8412
  },
8413
 
8414
  /* VEX_LEN_0F10_P_3 */
8415
  {
8416
    { VEX_W_TABLE (VEX_W_0F10_P_3) },
8417
    { VEX_W_TABLE (VEX_W_0F10_P_3) },
8418
  },
8419
 
8420
  /* VEX_LEN_0F11_P_1 */
8421
  {
8422
    { VEX_W_TABLE (VEX_W_0F11_P_1) },
8423
    { VEX_W_TABLE (VEX_W_0F11_P_1) },
8424
  },
8425
 
8426
  /* VEX_LEN_0F11_P_3 */
8427
  {
8428
    { VEX_W_TABLE (VEX_W_0F11_P_3) },
8429
    { VEX_W_TABLE (VEX_W_0F11_P_3) },
8430
  },
8431
 
8432
  /* VEX_LEN_0F12_P_0_M_0 */
8433
  {
8434
    { VEX_W_TABLE (VEX_W_0F12_P_0_M_0) },
8435
  },
8436
 
8437
  /* VEX_LEN_0F12_P_0_M_1 */
8438
  {
8439
    { VEX_W_TABLE (VEX_W_0F12_P_0_M_1) },
8440
  },
8441
 
8442
  /* VEX_LEN_0F12_P_2 */
8443
  {
8444
    { VEX_W_TABLE (VEX_W_0F12_P_2) },
8445
  },
8446
 
8447
  /* VEX_LEN_0F13_M_0 */
8448
  {
8449
    { VEX_W_TABLE (VEX_W_0F13_M_0) },
8450
  },
8451
 
8452
  /* VEX_LEN_0F16_P_0_M_0 */
8453
  {
8454
    { VEX_W_TABLE (VEX_W_0F16_P_0_M_0) },
8455
  },
8456
 
8457
  /* VEX_LEN_0F16_P_0_M_1 */
8458
  {
8459
    { VEX_W_TABLE (VEX_W_0F16_P_0_M_1) },
8460
  },
8461
 
8462
  /* VEX_LEN_0F16_P_2 */
8463
  {
8464
    { VEX_W_TABLE (VEX_W_0F16_P_2) },
8465
  },
8466
 
8467
  /* VEX_LEN_0F17_M_0 */
8468
  {
8469
    { VEX_W_TABLE (VEX_W_0F17_M_0) },
8470
  },
8471
 
8472
  /* VEX_LEN_0F2A_P_1 */
8473
  {
8474
    { "vcvtsi2ss%LQ",   { XMScalar, VexScalar, Ev } },
8475
    { "vcvtsi2ss%LQ",   { XMScalar, VexScalar, Ev } },
8476
  },
8477
 
8478
  /* VEX_LEN_0F2A_P_3 */
8479
  {
8480
    { "vcvtsi2sd%LQ",   { XMScalar, VexScalar, Ev } },
8481
    { "vcvtsi2sd%LQ",   { XMScalar, VexScalar, Ev } },
8482
  },
8483
 
8484
  /* VEX_LEN_0F2C_P_1 */
8485
  {
8486
    { "vcvttss2siY",    { Gv, EXdScalar } },
8487
    { "vcvttss2siY",    { Gv, EXdScalar } },
8488
  },
8489
 
8490
  /* VEX_LEN_0F2C_P_3 */
8491
  {
8492
    { "vcvttsd2siY",    { Gv, EXqScalar } },
8493
    { "vcvttsd2siY",    { Gv, EXqScalar } },
8494
  },
8495
 
8496
  /* VEX_LEN_0F2D_P_1 */
8497
  {
8498
    { "vcvtss2siY",     { Gv, EXdScalar } },
8499
    { "vcvtss2siY",     { Gv, EXdScalar } },
8500
  },
8501
 
8502
  /* VEX_LEN_0F2D_P_3 */
8503
  {
8504
    { "vcvtsd2siY",     { Gv, EXqScalar } },
8505
    { "vcvtsd2siY",     { Gv, EXqScalar } },
8506
  },
8507
 
8508
  /* VEX_LEN_0F2E_P_0 */
8509
  {
8510
    { VEX_W_TABLE (VEX_W_0F2E_P_0) },
8511
    { VEX_W_TABLE (VEX_W_0F2E_P_0) },
8512
  },
8513
 
8514
  /* VEX_LEN_0F2E_P_2 */
8515
  {
8516
    { VEX_W_TABLE (VEX_W_0F2E_P_2) },
8517
    { VEX_W_TABLE (VEX_W_0F2E_P_2) },
8518
  },
8519
 
8520
  /* VEX_LEN_0F2F_P_0 */
8521
  {
8522
    { VEX_W_TABLE (VEX_W_0F2F_P_0) },
8523
    { VEX_W_TABLE (VEX_W_0F2F_P_0) },
8524
  },
8525
 
8526
  /* VEX_LEN_0F2F_P_2 */
8527
  {
8528
    { VEX_W_TABLE (VEX_W_0F2F_P_2) },
8529
    { VEX_W_TABLE (VEX_W_0F2F_P_2) },
8530
  },
8531
 
8532
  /* VEX_LEN_0F51_P_1 */
8533
  {
8534
    { VEX_W_TABLE (VEX_W_0F51_P_1) },
8535
    { VEX_W_TABLE (VEX_W_0F51_P_1) },
8536
  },
8537
 
8538
  /* VEX_LEN_0F51_P_3 */
8539
  {
8540
    { VEX_W_TABLE (VEX_W_0F51_P_3) },
8541
    { VEX_W_TABLE (VEX_W_0F51_P_3) },
8542
  },
8543
 
8544
  /* VEX_LEN_0F52_P_1 */
8545
  {
8546
    { VEX_W_TABLE (VEX_W_0F52_P_1) },
8547
    { VEX_W_TABLE (VEX_W_0F52_P_1) },
8548
  },
8549
 
8550
  /* VEX_LEN_0F53_P_1 */
8551
  {
8552
    { VEX_W_TABLE (VEX_W_0F53_P_1) },
8553
    { VEX_W_TABLE (VEX_W_0F53_P_1) },
8554
  },
8555
 
8556
  /* VEX_LEN_0F58_P_1 */
8557
  {
8558
    { VEX_W_TABLE (VEX_W_0F58_P_1) },
8559
    { VEX_W_TABLE (VEX_W_0F58_P_1) },
8560
  },
8561
 
8562
  /* VEX_LEN_0F58_P_3 */
8563
  {
8564
    { VEX_W_TABLE (VEX_W_0F58_P_3) },
8565
    { VEX_W_TABLE (VEX_W_0F58_P_3) },
8566
  },
8567
 
8568
  /* VEX_LEN_0F59_P_1 */
8569
  {
8570
    { VEX_W_TABLE (VEX_W_0F59_P_1) },
8571
    { VEX_W_TABLE (VEX_W_0F59_P_1) },
8572
  },
8573
 
8574
  /* VEX_LEN_0F59_P_3 */
8575
  {
8576
    { VEX_W_TABLE (VEX_W_0F59_P_3) },
8577
    { VEX_W_TABLE (VEX_W_0F59_P_3) },
8578
  },
8579
 
8580
  /* VEX_LEN_0F5A_P_1 */
8581
  {
8582
    { VEX_W_TABLE (VEX_W_0F5A_P_1) },
8583
    { VEX_W_TABLE (VEX_W_0F5A_P_1) },
8584
  },
8585
 
8586
  /* VEX_LEN_0F5A_P_3 */
8587
  {
8588
    { VEX_W_TABLE (VEX_W_0F5A_P_3) },
8589
    { VEX_W_TABLE (VEX_W_0F5A_P_3) },
8590
  },
8591
 
8592
  /* VEX_LEN_0F5C_P_1 */
8593
  {
8594
    { VEX_W_TABLE (VEX_W_0F5C_P_1) },
8595
    { VEX_W_TABLE (VEX_W_0F5C_P_1) },
8596
  },
8597
 
8598
  /* VEX_LEN_0F5C_P_3 */
8599
  {
8600
    { VEX_W_TABLE (VEX_W_0F5C_P_3) },
8601
    { VEX_W_TABLE (VEX_W_0F5C_P_3) },
8602
  },
8603
 
8604
  /* VEX_LEN_0F5D_P_1 */
8605
  {
8606
    { VEX_W_TABLE (VEX_W_0F5D_P_1) },
8607
    { VEX_W_TABLE (VEX_W_0F5D_P_1) },
8608
  },
8609
 
8610
  /* VEX_LEN_0F5D_P_3 */
8611
  {
8612
    { VEX_W_TABLE (VEX_W_0F5D_P_3) },
8613
    { VEX_W_TABLE (VEX_W_0F5D_P_3) },
8614
  },
8615
 
8616
  /* VEX_LEN_0F5E_P_1 */
8617
  {
8618
    { VEX_W_TABLE (VEX_W_0F5E_P_1) },
8619
    { VEX_W_TABLE (VEX_W_0F5E_P_1) },
8620
  },
8621
 
8622
  /* VEX_LEN_0F5E_P_3 */
8623
  {
8624
    { VEX_W_TABLE (VEX_W_0F5E_P_3) },
8625
    { VEX_W_TABLE (VEX_W_0F5E_P_3) },
8626
  },
8627
 
8628
  /* VEX_LEN_0F5F_P_1 */
8629
  {
8630
    { VEX_W_TABLE (VEX_W_0F5F_P_1) },
8631
    { VEX_W_TABLE (VEX_W_0F5F_P_1) },
8632
  },
8633
 
8634
  /* VEX_LEN_0F5F_P_3 */
8635
  {
8636
    { VEX_W_TABLE (VEX_W_0F5F_P_3) },
8637
    { VEX_W_TABLE (VEX_W_0F5F_P_3) },
8638
  },
8639
 
8640
  /* VEX_LEN_0F6E_P_2 */
8641
  {
8642
    { "vmovK",          { XMScalar, Edq } },
8643
    { "vmovK",          { XMScalar, Edq } },
8644
  },
8645
 
8646
  /* VEX_LEN_0F7E_P_1 */
8647
  {
8648
    { VEX_W_TABLE (VEX_W_0F7E_P_1) },
8649
    { VEX_W_TABLE (VEX_W_0F7E_P_1) },
8650
  },
8651
 
8652
  /* VEX_LEN_0F7E_P_2 */
8653
  {
8654
    { "vmovK",          { Edq, XMScalar } },
8655
    { "vmovK",          { Edq, XMScalar } },
8656
  },
8657
 
8658
  /* VEX_LEN_0FAE_R_2_M_0 */
8659
  {
8660
    { VEX_W_TABLE (VEX_W_0FAE_R_2_M_0) },
8661
  },
8662
 
8663
  /* VEX_LEN_0FAE_R_3_M_0 */
8664
  {
8665
    { VEX_W_TABLE (VEX_W_0FAE_R_3_M_0) },
8666
  },
8667
 
8668
  /* VEX_LEN_0FC2_P_1 */
8669
  {
8670
    { VEX_W_TABLE (VEX_W_0FC2_P_1) },
8671
    { VEX_W_TABLE (VEX_W_0FC2_P_1) },
8672
  },
8673
 
8674
  /* VEX_LEN_0FC2_P_3 */
8675
  {
8676
    { VEX_W_TABLE (VEX_W_0FC2_P_3) },
8677
    { VEX_W_TABLE (VEX_W_0FC2_P_3) },
8678
  },
8679
 
8680
  /* VEX_LEN_0FC4_P_2 */
8681
  {
8682
    { VEX_W_TABLE (VEX_W_0FC4_P_2) },
8683
  },
8684
 
8685
  /* VEX_LEN_0FC5_P_2 */
8686
  {
8687
    { VEX_W_TABLE (VEX_W_0FC5_P_2) },
8688
  },
8689
 
8690
  /* VEX_LEN_0FD6_P_2 */
8691
  {
8692
    { VEX_W_TABLE (VEX_W_0FD6_P_2) },
8693
    { VEX_W_TABLE (VEX_W_0FD6_P_2) },
8694
  },
8695
 
8696
  /* VEX_LEN_0FF7_P_2 */
8697
  {
8698
    { VEX_W_TABLE (VEX_W_0FF7_P_2) },
8699
  },
8700
 
8701 148 khays
  /* VEX_LEN_0F3816_P_2 */
8702 18 khays
  {
8703 148 khays
    { Bad_Opcode },
8704
    { VEX_W_TABLE (VEX_W_0F3816_P_2) },
8705 18 khays
  },
8706
 
8707 148 khays
  /* VEX_LEN_0F3819_P_2 */
8708 18 khays
  {
8709
    { Bad_Opcode },
8710 148 khays
    { VEX_W_TABLE (VEX_W_0F3819_P_2) },
8711 18 khays
  },
8712
 
8713
  /* VEX_LEN_0F381A_P_2_M_0 */
8714
  {
8715
    { Bad_Opcode },
8716
    { VEX_W_TABLE (VEX_W_0F381A_P_2_M_0) },
8717
  },
8718
 
8719 148 khays
  /* VEX_LEN_0F3836_P_2 */
8720 18 khays
  {
8721 148 khays
    { Bad_Opcode },
8722
    { VEX_W_TABLE (VEX_W_0F3836_P_2) },
8723 18 khays
  },
8724
 
8725 148 khays
  /* VEX_LEN_0F3841_P_2 */
8726 18 khays
  {
8727 148 khays
    { VEX_W_TABLE (VEX_W_0F3841_P_2) },
8728 18 khays
  },
8729
 
8730 148 khays
  /* VEX_LEN_0F385A_P_2_M_0 */
8731 18 khays
  {
8732 148 khays
    { Bad_Opcode },
8733
    { VEX_W_TABLE (VEX_W_0F385A_P_2_M_0) },
8734 18 khays
  },
8735
 
8736 148 khays
  /* VEX_LEN_0F38DB_P_2 */
8737 18 khays
  {
8738 148 khays
    { VEX_W_TABLE (VEX_W_0F38DB_P_2) },
8739 18 khays
  },
8740
 
8741 148 khays
  /* VEX_LEN_0F38DC_P_2 */
8742 18 khays
  {
8743 148 khays
    { VEX_W_TABLE (VEX_W_0F38DC_P_2) },
8744 18 khays
  },
8745
 
8746 148 khays
  /* VEX_LEN_0F38DD_P_2 */
8747 18 khays
  {
8748 148 khays
    { VEX_W_TABLE (VEX_W_0F38DD_P_2) },
8749 18 khays
  },
8750
 
8751 148 khays
  /* VEX_LEN_0F38DE_P_2 */
8752 18 khays
  {
8753 148 khays
    { VEX_W_TABLE (VEX_W_0F38DE_P_2) },
8754 18 khays
  },
8755
 
8756 148 khays
  /* VEX_LEN_0F38DF_P_2 */
8757 18 khays
  {
8758 148 khays
    { VEX_W_TABLE (VEX_W_0F38DF_P_2) },
8759 18 khays
  },
8760
 
8761 148 khays
  /* VEX_LEN_0F38F2_P_0 */
8762 18 khays
  {
8763 148 khays
    { "andnS",          { Gdq, VexGdq, Edq } },
8764 18 khays
  },
8765
 
8766 148 khays
  /* VEX_LEN_0F38F3_R_1_P_0 */
8767 18 khays
  {
8768 148 khays
    { "blsrS",          { VexGdq, Edq } },
8769 18 khays
  },
8770
 
8771 148 khays
  /* VEX_LEN_0F38F3_R_2_P_0 */
8772 18 khays
  {
8773 148 khays
    { "blsmskS",        { VexGdq, Edq } },
8774 18 khays
  },
8775
 
8776 148 khays
  /* VEX_LEN_0F38F3_R_3_P_0 */
8777 18 khays
  {
8778 148 khays
    { "blsiS",          { VexGdq, Edq } },
8779 18 khays
  },
8780
 
8781 148 khays
  /* VEX_LEN_0F38F5_P_0 */
8782 18 khays
  {
8783 148 khays
    { "bzhiS",          { Gdq, Edq, VexGdq } },
8784 18 khays
  },
8785
 
8786 148 khays
  /* VEX_LEN_0F38F5_P_1 */
8787 18 khays
  {
8788 148 khays
    { "pextS",          { Gdq, VexGdq, Edq } },
8789 18 khays
  },
8790
 
8791 148 khays
  /* VEX_LEN_0F38F5_P_3 */
8792 18 khays
  {
8793 148 khays
    { "pdepS",          { Gdq, VexGdq, Edq } },
8794 18 khays
  },
8795
 
8796 148 khays
  /* VEX_LEN_0F38F6_P_3 */
8797 18 khays
  {
8798 148 khays
    { "mulxS",          { Gdq, VexGdq, Edq } },
8799 18 khays
  },
8800
 
8801 148 khays
  /* VEX_LEN_0F38F7_P_0 */
8802 18 khays
  {
8803 148 khays
    { "bextrS",         { Gdq, Edq, VexGdq } },
8804 18 khays
  },
8805
 
8806 148 khays
  /* VEX_LEN_0F38F7_P_1 */
8807 18 khays
  {
8808 148 khays
    { "sarxS",          { Gdq, Edq, VexGdq } },
8809 18 khays
  },
8810
 
8811 148 khays
  /* VEX_LEN_0F38F7_P_2 */
8812 18 khays
  {
8813 148 khays
    { "shlxS",          { Gdq, Edq, VexGdq } },
8814 18 khays
  },
8815
 
8816 148 khays
  /* VEX_LEN_0F38F7_P_3 */
8817 18 khays
  {
8818 148 khays
    { "shrxS",          { Gdq, Edq, VexGdq } },
8819 18 khays
  },
8820
 
8821 148 khays
  /* VEX_LEN_0F3A00_P_2 */
8822 18 khays
  {
8823 148 khays
    { Bad_Opcode },
8824
    { VEX_W_TABLE (VEX_W_0F3A00_P_2) },
8825 18 khays
  },
8826
 
8827 148 khays
  /* VEX_LEN_0F3A01_P_2 */
8828 18 khays
  {
8829 148 khays
    { Bad_Opcode },
8830
    { VEX_W_TABLE (VEX_W_0F3A01_P_2) },
8831 18 khays
  },
8832
 
8833
  /* VEX_LEN_0F3A06_P_2 */
8834
  {
8835
    { Bad_Opcode },
8836
    { VEX_W_TABLE (VEX_W_0F3A06_P_2) },
8837
  },
8838
 
8839
  /* VEX_LEN_0F3A0A_P_2 */
8840
  {
8841
    { VEX_W_TABLE (VEX_W_0F3A0A_P_2) },
8842
    { VEX_W_TABLE (VEX_W_0F3A0A_P_2) },
8843
  },
8844
 
8845
  /* VEX_LEN_0F3A0B_P_2 */
8846
  {
8847
    { VEX_W_TABLE (VEX_W_0F3A0B_P_2) },
8848
    { VEX_W_TABLE (VEX_W_0F3A0B_P_2) },
8849
  },
8850
 
8851
  /* VEX_LEN_0F3A14_P_2 */
8852
  {
8853
    { VEX_W_TABLE (VEX_W_0F3A14_P_2) },
8854
  },
8855
 
8856
  /* VEX_LEN_0F3A15_P_2 */
8857
  {
8858
    { VEX_W_TABLE (VEX_W_0F3A15_P_2) },
8859
  },
8860
 
8861
  /* VEX_LEN_0F3A16_P_2  */
8862
  {
8863
    { "vpextrK",        { Edq, XM, Ib } },
8864
  },
8865
 
8866
  /* VEX_LEN_0F3A17_P_2 */
8867
  {
8868
    { "vextractps",     { Edqd, XM, Ib } },
8869
  },
8870
 
8871
  /* VEX_LEN_0F3A18_P_2 */
8872
  {
8873
    { Bad_Opcode },
8874
    { VEX_W_TABLE (VEX_W_0F3A18_P_2) },
8875
  },
8876
 
8877
  /* VEX_LEN_0F3A19_P_2 */
8878
  {
8879
    { Bad_Opcode },
8880
    { VEX_W_TABLE (VEX_W_0F3A19_P_2) },
8881
  },
8882
 
8883
  /* VEX_LEN_0F3A20_P_2 */
8884
  {
8885
    { VEX_W_TABLE (VEX_W_0F3A20_P_2) },
8886
  },
8887
 
8888
  /* VEX_LEN_0F3A21_P_2 */
8889
  {
8890
    { VEX_W_TABLE (VEX_W_0F3A21_P_2) },
8891
  },
8892
 
8893
  /* VEX_LEN_0F3A22_P_2 */
8894
  {
8895
    { "vpinsrK",        { XM, Vex128, Edq, Ib } },
8896
  },
8897
 
8898 148 khays
  /* VEX_LEN_0F3A38_P_2 */
8899 18 khays
  {
8900 148 khays
    { Bad_Opcode },
8901
    { VEX_W_TABLE (VEX_W_0F3A38_P_2) },
8902 18 khays
  },
8903
 
8904 148 khays
  /* VEX_LEN_0F3A39_P_2 */
8905 18 khays
  {
8906 148 khays
    { Bad_Opcode },
8907
    { VEX_W_TABLE (VEX_W_0F3A39_P_2) },
8908 18 khays
  },
8909
 
8910 148 khays
  /* VEX_LEN_0F3A41_P_2 */
8911
  {
8912
    { VEX_W_TABLE (VEX_W_0F3A41_P_2) },
8913
  },
8914
 
8915 18 khays
  /* VEX_LEN_0F3A44_P_2 */
8916
  {
8917
    { VEX_W_TABLE (VEX_W_0F3A44_P_2) },
8918
  },
8919
 
8920 148 khays
  /* VEX_LEN_0F3A46_P_2 */
8921 18 khays
  {
8922 148 khays
    { Bad_Opcode },
8923
    { VEX_W_TABLE (VEX_W_0F3A46_P_2) },
8924 18 khays
  },
8925
 
8926
  /* VEX_LEN_0F3A60_P_2 */
8927
  {
8928
    { VEX_W_TABLE (VEX_W_0F3A60_P_2) },
8929
  },
8930
 
8931
  /* VEX_LEN_0F3A61_P_2 */
8932
  {
8933
    { VEX_W_TABLE (VEX_W_0F3A61_P_2) },
8934
  },
8935
 
8936
  /* VEX_LEN_0F3A62_P_2 */
8937
  {
8938
    { VEX_W_TABLE (VEX_W_0F3A62_P_2) },
8939
  },
8940
 
8941
  /* VEX_LEN_0F3A63_P_2 */
8942
  {
8943
    { VEX_W_TABLE (VEX_W_0F3A63_P_2) },
8944
  },
8945
 
8946
  /* VEX_LEN_0F3A6A_P_2 */
8947
  {
8948
    { "vfmaddss",       { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
8949
  },
8950
 
8951
  /* VEX_LEN_0F3A6B_P_2 */
8952
  {
8953
    { "vfmaddsd",       { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
8954
  },
8955
 
8956
  /* VEX_LEN_0F3A6E_P_2 */
8957
  {
8958
    { "vfmsubss",       { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
8959
  },
8960
 
8961
  /* VEX_LEN_0F3A6F_P_2 */
8962
  {
8963
    { "vfmsubsd",       { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
8964
  },
8965
 
8966
  /* VEX_LEN_0F3A7A_P_2 */
8967
  {
8968
    { "vfnmaddss",      { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
8969
  },
8970
 
8971
  /* VEX_LEN_0F3A7B_P_2 */
8972
  {
8973
    { "vfnmaddsd",      { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
8974
  },
8975
 
8976
  /* VEX_LEN_0F3A7E_P_2 */
8977
  {
8978
    { "vfnmsubss",      { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
8979
  },
8980
 
8981
  /* VEX_LEN_0F3A7F_P_2 */
8982
  {
8983
    { "vfnmsubsd",      { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
8984
  },
8985
 
8986
  /* VEX_LEN_0F3ADF_P_2 */
8987
  {
8988
    { VEX_W_TABLE (VEX_W_0F3ADF_P_2) },
8989
  },
8990
 
8991 148 khays
  /* VEX_LEN_0F3AF0_P_3 */
8992
  {
8993 158 khays
    { "rorxS",          { Gdq, Edq, Ib } },
8994 148 khays
  },
8995
 
8996 18 khays
  /* VEX_LEN_0FXOP_09_80 */
8997
  {
8998
    { "vfrczps",        { XM, EXxmm } },
8999
    { "vfrczps",        { XM, EXymmq } },
9000
  },
9001
 
9002
  /* VEX_LEN_0FXOP_09_81 */
9003
  {
9004
    { "vfrczpd",        { XM, EXxmm } },
9005
    { "vfrczpd",        { XM, EXymmq } },
9006
  },
9007
};
9008
 
9009
static const struct dis386 vex_w_table[][2] = {
9010
  {
9011
    /* VEX_W_0F10_P_0 */
9012
    { "vmovups",        { XM, EXx } },
9013
  },
9014
  {
9015
    /* VEX_W_0F10_P_1 */
9016
    { "vmovss",         { XMVexScalar, VexScalar, EXdScalar } },
9017
  },
9018
  {
9019
    /* VEX_W_0F10_P_2 */
9020
    { "vmovupd",        { XM, EXx } },
9021
  },
9022
  {
9023
    /* VEX_W_0F10_P_3 */
9024
    { "vmovsd",         { XMVexScalar, VexScalar, EXqScalar } },
9025
  },
9026
  {
9027
    /* VEX_W_0F11_P_0 */
9028
    { "vmovups",        { EXxS, XM } },
9029
  },
9030
  {
9031
    /* VEX_W_0F11_P_1 */
9032
    { "vmovss",         { EXdVexScalarS, VexScalar, XMScalar } },
9033
  },
9034
  {
9035
    /* VEX_W_0F11_P_2 */
9036
    { "vmovupd",        { EXxS, XM } },
9037
  },
9038
  {
9039
    /* VEX_W_0F11_P_3 */
9040
    { "vmovsd",         { EXqVexScalarS, VexScalar, XMScalar } },
9041
  },
9042
  {
9043
    /* VEX_W_0F12_P_0_M_0 */
9044
    { "vmovlps",        { XM, Vex128, EXq } },
9045
  },
9046
  {
9047
    /* VEX_W_0F12_P_0_M_1 */
9048
    { "vmovhlps",       { XM, Vex128, EXq } },
9049
  },
9050
  {
9051
    /* VEX_W_0F12_P_1 */
9052
    { "vmovsldup",      { XM, EXx } },
9053
  },
9054
  {
9055
    /* VEX_W_0F12_P_2 */
9056
    { "vmovlpd",        { XM, Vex128, EXq } },
9057
  },
9058
  {
9059
    /* VEX_W_0F12_P_3 */
9060
    { "vmovddup",       { XM, EXymmq } },
9061
  },
9062
  {
9063
    /* VEX_W_0F13_M_0 */
9064
    { "vmovlpX",        { EXq, XM } },
9065
  },
9066
  {
9067
    /* VEX_W_0F14 */
9068
    { "vunpcklpX",      { XM, Vex, EXx } },
9069
  },
9070
  {
9071
    /* VEX_W_0F15 */
9072
    { "vunpckhpX",      { XM, Vex, EXx } },
9073
  },
9074
  {
9075
    /* VEX_W_0F16_P_0_M_0 */
9076
    { "vmovhps",        { XM, Vex128, EXq } },
9077
  },
9078
  {
9079
    /* VEX_W_0F16_P_0_M_1 */
9080
    { "vmovlhps",       { XM, Vex128, EXq } },
9081
  },
9082
  {
9083
    /* VEX_W_0F16_P_1 */
9084
    { "vmovshdup",      { XM, EXx } },
9085
  },
9086
  {
9087
    /* VEX_W_0F16_P_2 */
9088
    { "vmovhpd",        { XM, Vex128, EXq } },
9089
  },
9090
  {
9091
    /* VEX_W_0F17_M_0 */
9092
    { "vmovhpX",        { EXq, XM } },
9093
  },
9094
  {
9095
    /* VEX_W_0F28 */
9096
    { "vmovapX",        { XM, EXx } },
9097
  },
9098
  {
9099
    /* VEX_W_0F29 */
9100
    { "vmovapX",        { EXxS, XM } },
9101
  },
9102
  {
9103
    /* VEX_W_0F2B_M_0 */
9104
    { "vmovntpX",       { Mx, XM } },
9105
  },
9106
  {
9107
    /* VEX_W_0F2E_P_0 */
9108
    { "vucomiss",       { XMScalar, EXdScalar } },
9109
  },
9110
  {
9111
    /* VEX_W_0F2E_P_2 */
9112
    { "vucomisd",       { XMScalar, EXqScalar } },
9113
  },
9114
  {
9115
    /* VEX_W_0F2F_P_0 */
9116
    { "vcomiss",        { XMScalar, EXdScalar } },
9117
  },
9118
  {
9119
    /* VEX_W_0F2F_P_2 */
9120
    { "vcomisd",        { XMScalar, EXqScalar } },
9121
  },
9122
  {
9123
    /* VEX_W_0F50_M_0 */
9124
    { "vmovmskpX",      { Gdq, XS } },
9125
  },
9126
  {
9127
    /* VEX_W_0F51_P_0 */
9128
    { "vsqrtps",        { XM, EXx } },
9129
  },
9130
  {
9131
    /* VEX_W_0F51_P_1 */
9132
    { "vsqrtss",        { XMScalar, VexScalar, EXdScalar } },
9133
  },
9134
  {
9135
    /* VEX_W_0F51_P_2  */
9136
    { "vsqrtpd",        { XM, EXx } },
9137
  },
9138
  {
9139
    /* VEX_W_0F51_P_3 */
9140
    { "vsqrtsd",        { XMScalar, VexScalar, EXqScalar } },
9141
  },
9142
  {
9143
    /* VEX_W_0F52_P_0 */
9144
    { "vrsqrtps",       { XM, EXx } },
9145
  },
9146
  {
9147
    /* VEX_W_0F52_P_1 */
9148
    { "vrsqrtss",       { XMScalar, VexScalar, EXdScalar } },
9149
  },
9150
  {
9151
    /* VEX_W_0F53_P_0  */
9152
    { "vrcpps",         { XM, EXx } },
9153
  },
9154
  {
9155
    /* VEX_W_0F53_P_1  */
9156
    { "vrcpss",         { XMScalar, VexScalar, EXdScalar } },
9157
  },
9158
  {
9159
    /* VEX_W_0F58_P_0  */
9160
    { "vaddps",         { XM, Vex, EXx } },
9161
  },
9162
  {
9163
    /* VEX_W_0F58_P_1  */
9164
    { "vaddss",         { XMScalar, VexScalar, EXdScalar } },
9165
  },
9166
  {
9167
    /* VEX_W_0F58_P_2  */
9168
    { "vaddpd",         { XM, Vex, EXx } },
9169
  },
9170
  {
9171
    /* VEX_W_0F58_P_3  */
9172
    { "vaddsd",         { XMScalar, VexScalar, EXqScalar } },
9173
  },
9174
  {
9175
    /* VEX_W_0F59_P_0  */
9176
    { "vmulps",         { XM, Vex, EXx } },
9177
  },
9178
  {
9179
    /* VEX_W_0F59_P_1  */
9180
    { "vmulss",         { XMScalar, VexScalar, EXdScalar } },
9181
  },
9182
  {
9183
    /* VEX_W_0F59_P_2  */
9184
    { "vmulpd",         { XM, Vex, EXx } },
9185
  },
9186
  {
9187
    /* VEX_W_0F59_P_3  */
9188
    { "vmulsd",         { XMScalar, VexScalar, EXqScalar } },
9189
  },
9190
  {
9191
    /* VEX_W_0F5A_P_0  */
9192
    { "vcvtps2pd",      { XM, EXxmmq } },
9193
  },
9194
  {
9195
    /* VEX_W_0F5A_P_1  */
9196
    { "vcvtss2sd",      { XMScalar, VexScalar, EXdScalar } },
9197
  },
9198
  {
9199
    /* VEX_W_0F5A_P_3  */
9200
    { "vcvtsd2ss",      { XMScalar, VexScalar, EXqScalar } },
9201
  },
9202
  {
9203
    /* VEX_W_0F5B_P_0  */
9204
    { "vcvtdq2ps",      { XM, EXx } },
9205
  },
9206
  {
9207
    /* VEX_W_0F5B_P_1  */
9208
    { "vcvttps2dq",     { XM, EXx } },
9209
  },
9210
  {
9211
    /* VEX_W_0F5B_P_2  */
9212
    { "vcvtps2dq",      { XM, EXx } },
9213
  },
9214
  {
9215
    /* VEX_W_0F5C_P_0  */
9216
    { "vsubps",         { XM, Vex, EXx } },
9217
  },
9218
  {
9219
    /* VEX_W_0F5C_P_1  */
9220
    { "vsubss",         { XMScalar, VexScalar, EXdScalar } },
9221
  },
9222
  {
9223
    /* VEX_W_0F5C_P_2  */
9224
    { "vsubpd",         { XM, Vex, EXx } },
9225
  },
9226
  {
9227
    /* VEX_W_0F5C_P_3  */
9228
    { "vsubsd",         { XMScalar, VexScalar, EXqScalar } },
9229
  },
9230
  {
9231
    /* VEX_W_0F5D_P_0  */
9232
    { "vminps",         { XM, Vex, EXx } },
9233
  },
9234
  {
9235
    /* VEX_W_0F5D_P_1  */
9236
    { "vminss",         { XMScalar, VexScalar, EXdScalar } },
9237
  },
9238
  {
9239
    /* VEX_W_0F5D_P_2  */
9240
    { "vminpd",         { XM, Vex, EXx } },
9241
  },
9242
  {
9243
    /* VEX_W_0F5D_P_3  */
9244
    { "vminsd",         { XMScalar, VexScalar, EXqScalar } },
9245
  },
9246
  {
9247
    /* VEX_W_0F5E_P_0  */
9248
    { "vdivps",         { XM, Vex, EXx } },
9249
  },
9250
  {
9251
    /* VEX_W_0F5E_P_1  */
9252
    { "vdivss",         { XMScalar, VexScalar, EXdScalar } },
9253
  },
9254
  {
9255
    /* VEX_W_0F5E_P_2  */
9256
    { "vdivpd",         { XM, Vex, EXx } },
9257
  },
9258
  {
9259
    /* VEX_W_0F5E_P_3  */
9260
    { "vdivsd",         { XMScalar, VexScalar, EXqScalar } },
9261
  },
9262
  {
9263
    /* VEX_W_0F5F_P_0  */
9264
    { "vmaxps",         { XM, Vex, EXx } },
9265
  },
9266
  {
9267
    /* VEX_W_0F5F_P_1  */
9268
    { "vmaxss",         { XMScalar, VexScalar, EXdScalar } },
9269
  },
9270
  {
9271
    /* VEX_W_0F5F_P_2  */
9272
    { "vmaxpd",         { XM, Vex, EXx } },
9273
  },
9274
  {
9275
    /* VEX_W_0F5F_P_3  */
9276
    { "vmaxsd",         { XMScalar, VexScalar, EXqScalar } },
9277
  },
9278
  {
9279
    /* VEX_W_0F60_P_2  */
9280 148 khays
    { "vpunpcklbw",     { XM, Vex, EXx } },
9281 18 khays
  },
9282
  {
9283
    /* VEX_W_0F61_P_2  */
9284 148 khays
    { "vpunpcklwd",     { XM, Vex, EXx } },
9285 18 khays
  },
9286
  {
9287
    /* VEX_W_0F62_P_2  */
9288 148 khays
    { "vpunpckldq",     { XM, Vex, EXx } },
9289 18 khays
  },
9290
  {
9291
    /* VEX_W_0F63_P_2  */
9292 148 khays
    { "vpacksswb",      { XM, Vex, EXx } },
9293 18 khays
  },
9294
  {
9295
    /* VEX_W_0F64_P_2  */
9296 148 khays
    { "vpcmpgtb",       { XM, Vex, EXx } },
9297 18 khays
  },
9298
  {
9299
    /* VEX_W_0F65_P_2  */
9300 148 khays
    { "vpcmpgtw",       { XM, Vex, EXx } },
9301 18 khays
  },
9302
  {
9303
    /* VEX_W_0F66_P_2  */
9304 148 khays
    { "vpcmpgtd",       { XM, Vex, EXx } },
9305 18 khays
  },
9306
  {
9307
    /* VEX_W_0F67_P_2  */
9308 148 khays
    { "vpackuswb",      { XM, Vex, EXx } },
9309 18 khays
  },
9310
  {
9311
    /* VEX_W_0F68_P_2  */
9312 148 khays
    { "vpunpckhbw",     { XM, Vex, EXx } },
9313 18 khays
  },
9314
  {
9315
    /* VEX_W_0F69_P_2  */
9316 148 khays
    { "vpunpckhwd",     { XM, Vex, EXx } },
9317 18 khays
  },
9318
  {
9319
    /* VEX_W_0F6A_P_2  */
9320 148 khays
    { "vpunpckhdq",     { XM, Vex, EXx } },
9321 18 khays
  },
9322
  {
9323
    /* VEX_W_0F6B_P_2  */
9324 148 khays
    { "vpackssdw",      { XM, Vex, EXx } },
9325 18 khays
  },
9326
  {
9327
    /* VEX_W_0F6C_P_2  */
9328 148 khays
    { "vpunpcklqdq",    { XM, Vex, EXx } },
9329 18 khays
  },
9330
  {
9331
    /* VEX_W_0F6D_P_2  */
9332 148 khays
    { "vpunpckhqdq",    { XM, Vex, EXx } },
9333 18 khays
  },
9334
  {
9335
    /* VEX_W_0F6F_P_1  */
9336
    { "vmovdqu",        { XM, EXx } },
9337
  },
9338
  {
9339
    /* VEX_W_0F6F_P_2  */
9340
    { "vmovdqa",        { XM, EXx } },
9341
  },
9342
  {
9343
    /* VEX_W_0F70_P_1 */
9344
    { "vpshufhw",       { XM, EXx, Ib } },
9345
  },
9346
  {
9347
    /* VEX_W_0F70_P_2 */
9348
    { "vpshufd",        { XM, EXx, Ib } },
9349
  },
9350
  {
9351
    /* VEX_W_0F70_P_3 */
9352
    { "vpshuflw",       { XM, EXx, Ib } },
9353
  },
9354
  {
9355
    /* VEX_W_0F71_R_2_P_2  */
9356 148 khays
    { "vpsrlw",         { Vex, XS, Ib } },
9357 18 khays
  },
9358
  {
9359
    /* VEX_W_0F71_R_4_P_2  */
9360 148 khays
    { "vpsraw",         { Vex, XS, Ib } },
9361 18 khays
  },
9362
  {
9363
    /* VEX_W_0F71_R_6_P_2  */
9364 148 khays
    { "vpsllw",         { Vex, XS, Ib } },
9365 18 khays
  },
9366
  {
9367
    /* VEX_W_0F72_R_2_P_2  */
9368 148 khays
    { "vpsrld",         { Vex, XS, Ib } },
9369 18 khays
  },
9370
  {
9371
    /* VEX_W_0F72_R_4_P_2  */
9372 148 khays
    { "vpsrad",         { Vex, XS, Ib } },
9373 18 khays
  },
9374
  {
9375
    /* VEX_W_0F72_R_6_P_2  */
9376 148 khays
    { "vpslld",         { Vex, XS, Ib } },
9377 18 khays
  },
9378
  {
9379
    /* VEX_W_0F73_R_2_P_2  */
9380 148 khays
    { "vpsrlq",         { Vex, XS, Ib } },
9381 18 khays
  },
9382
  {
9383
    /* VEX_W_0F73_R_3_P_2  */
9384 148 khays
    { "vpsrldq",        { Vex, XS, Ib } },
9385 18 khays
  },
9386
  {
9387
    /* VEX_W_0F73_R_6_P_2  */
9388 148 khays
    { "vpsllq",         { Vex, XS, Ib } },
9389 18 khays
  },
9390
  {
9391
    /* VEX_W_0F73_R_7_P_2  */
9392 148 khays
    { "vpslldq",        { Vex, XS, Ib } },
9393 18 khays
  },
9394
  {
9395
    /* VEX_W_0F74_P_2 */
9396 148 khays
    { "vpcmpeqb",       { XM, Vex, EXx } },
9397 18 khays
  },
9398
  {
9399
    /* VEX_W_0F75_P_2 */
9400 148 khays
    { "vpcmpeqw",       { XM, Vex, EXx } },
9401 18 khays
  },
9402
  {
9403
    /* VEX_W_0F76_P_2 */
9404 148 khays
    { "vpcmpeqd",       { XM, Vex, EXx } },
9405 18 khays
  },
9406
  {
9407
    /* VEX_W_0F77_P_0 */
9408
    { "",               { VZERO } },
9409
  },
9410
  {
9411
    /* VEX_W_0F7C_P_2 */
9412
    { "vhaddpd",        { XM, Vex, EXx } },
9413
  },
9414
  {
9415
    /* VEX_W_0F7C_P_3 */
9416
    { "vhaddps",        { XM, Vex, EXx } },
9417
  },
9418
  {
9419
    /* VEX_W_0F7D_P_2 */
9420
    { "vhsubpd",        { XM, Vex, EXx } },
9421
  },
9422
  {
9423
    /* VEX_W_0F7D_P_3 */
9424
    { "vhsubps",        { XM, Vex, EXx } },
9425
  },
9426
  {
9427
    /* VEX_W_0F7E_P_1 */
9428
    { "vmovq",          { XMScalar, EXqScalar } },
9429
  },
9430
  {
9431
    /* VEX_W_0F7F_P_1 */
9432
    { "vmovdqu",        { EXxS, XM } },
9433
  },
9434
  {
9435
    /* VEX_W_0F7F_P_2 */
9436
    { "vmovdqa",        { EXxS, XM } },
9437
  },
9438
  {
9439
    /* VEX_W_0FAE_R_2_M_0 */
9440
    { "vldmxcsr",       { Md } },
9441
  },
9442
  {
9443
    /* VEX_W_0FAE_R_3_M_0 */
9444
    { "vstmxcsr",       { Md } },
9445
  },
9446
  {
9447
    /* VEX_W_0FC2_P_0 */
9448
    { "vcmpps",         { XM, Vex, EXx, VCMP } },
9449
  },
9450
  {
9451
    /* VEX_W_0FC2_P_1 */
9452
    { "vcmpss",         { XMScalar, VexScalar, EXdScalar, VCMP } },
9453
  },
9454
  {
9455
    /* VEX_W_0FC2_P_2 */
9456
    { "vcmppd",         { XM, Vex, EXx, VCMP } },
9457
  },
9458
  {
9459
    /* VEX_W_0FC2_P_3 */
9460
    { "vcmpsd",         { XMScalar, VexScalar, EXqScalar, VCMP } },
9461
  },
9462
  {
9463
    /* VEX_W_0FC4_P_2 */
9464
    { "vpinsrw",        { XM, Vex128, Edqw, Ib } },
9465
  },
9466
  {
9467
    /* VEX_W_0FC5_P_2 */
9468
    { "vpextrw",        { Gdq, XS, Ib } },
9469
  },
9470
  {
9471
    /* VEX_W_0FD0_P_2 */
9472
    { "vaddsubpd",      { XM, Vex, EXx } },
9473
  },
9474
  {
9475
    /* VEX_W_0FD0_P_3 */
9476
    { "vaddsubps",      { XM, Vex, EXx } },
9477
  },
9478
  {
9479
    /* VEX_W_0FD1_P_2 */
9480 148 khays
    { "vpsrlw",         { XM, Vex, EXxmm } },
9481 18 khays
  },
9482
  {
9483
    /* VEX_W_0FD2_P_2 */
9484 148 khays
    { "vpsrld",         { XM, Vex, EXxmm } },
9485 18 khays
  },
9486
  {
9487
    /* VEX_W_0FD3_P_2 */
9488 148 khays
    { "vpsrlq",         { XM, Vex, EXxmm } },
9489 18 khays
  },
9490
  {
9491
    /* VEX_W_0FD4_P_2 */
9492 148 khays
    { "vpaddq",         { XM, Vex, EXx } },
9493 18 khays
  },
9494
  {
9495
    /* VEX_W_0FD5_P_2 */
9496 148 khays
    { "vpmullw",        { XM, Vex, EXx } },
9497 18 khays
  },
9498
  {
9499
    /* VEX_W_0FD6_P_2 */
9500
    { "vmovq",          { EXqScalarS, XMScalar } },
9501
  },
9502
  {
9503
    /* VEX_W_0FD7_P_2_M_1 */
9504
    { "vpmovmskb",      { Gdq, XS } },
9505
  },
9506
  {
9507
    /* VEX_W_0FD8_P_2 */
9508 148 khays
    { "vpsubusb",       { XM, Vex, EXx } },
9509 18 khays
  },
9510
  {
9511
    /* VEX_W_0FD9_P_2 */
9512 148 khays
    { "vpsubusw",       { XM, Vex, EXx } },
9513 18 khays
  },
9514
  {
9515
    /* VEX_W_0FDA_P_2 */
9516 148 khays
    { "vpminub",        { XM, Vex, EXx } },
9517 18 khays
  },
9518
  {
9519
    /* VEX_W_0FDB_P_2 */
9520 148 khays
    { "vpand",          { XM, Vex, EXx } },
9521 18 khays
  },
9522
  {
9523
    /* VEX_W_0FDC_P_2 */
9524 148 khays
    { "vpaddusb",       { XM, Vex, EXx } },
9525 18 khays
  },
9526
  {
9527
    /* VEX_W_0FDD_P_2 */
9528 148 khays
    { "vpaddusw",       { XM, Vex, EXx } },
9529 18 khays
  },
9530
  {
9531
    /* VEX_W_0FDE_P_2 */
9532 148 khays
    { "vpmaxub",        { XM, Vex, EXx } },
9533 18 khays
  },
9534
  {
9535
    /* VEX_W_0FDF_P_2 */
9536 148 khays
    { "vpandn",         { XM, Vex, EXx } },
9537 18 khays
  },
9538
  {
9539
    /* VEX_W_0FE0_P_2  */
9540 148 khays
    { "vpavgb",         { XM, Vex, EXx } },
9541 18 khays
  },
9542
  {
9543
    /* VEX_W_0FE1_P_2  */
9544 148 khays
    { "vpsraw",         { XM, Vex, EXxmm } },
9545 18 khays
  },
9546
  {
9547
    /* VEX_W_0FE2_P_2  */
9548 148 khays
    { "vpsrad",         { XM, Vex, EXxmm } },
9549 18 khays
  },
9550
  {
9551
    /* VEX_W_0FE3_P_2  */
9552 148 khays
    { "vpavgw",         { XM, Vex, EXx } },
9553 18 khays
  },
9554
  {
9555
    /* VEX_W_0FE4_P_2  */
9556 148 khays
    { "vpmulhuw",       { XM, Vex, EXx } },
9557 18 khays
  },
9558
  {
9559
    /* VEX_W_0FE5_P_2  */
9560 148 khays
    { "vpmulhw",        { XM, Vex, EXx } },
9561 18 khays
  },
9562
  {
9563
    /* VEX_W_0FE6_P_1  */
9564
    { "vcvtdq2pd",      { XM, EXxmmq } },
9565
  },
9566
  {
9567
    /* VEX_W_0FE6_P_2  */
9568
    { "vcvttpd2dq%XY",  { XMM, EXx } },
9569
  },
9570
  {
9571
    /* VEX_W_0FE6_P_3  */
9572
    { "vcvtpd2dq%XY",   { XMM, EXx } },
9573
  },
9574
  {
9575
    /* VEX_W_0FE7_P_2_M_0 */
9576
    { "vmovntdq",       { Mx, XM } },
9577
  },
9578
  {
9579
    /* VEX_W_0FE8_P_2  */
9580 148 khays
    { "vpsubsb",        { XM, Vex, EXx } },
9581 18 khays
  },
9582
  {
9583
    /* VEX_W_0FE9_P_2  */
9584 148 khays
    { "vpsubsw",        { XM, Vex, EXx } },
9585 18 khays
  },
9586
  {
9587
    /* VEX_W_0FEA_P_2  */
9588 148 khays
    { "vpminsw",        { XM, Vex, EXx } },
9589 18 khays
  },
9590
  {
9591
    /* VEX_W_0FEB_P_2  */
9592 148 khays
    { "vpor",           { XM, Vex, EXx } },
9593 18 khays
  },
9594
  {
9595
    /* VEX_W_0FEC_P_2  */
9596 148 khays
    { "vpaddsb",        { XM, Vex, EXx } },
9597 18 khays
  },
9598
  {
9599
    /* VEX_W_0FED_P_2  */
9600 148 khays
    { "vpaddsw",        { XM, Vex, EXx } },
9601 18 khays
  },
9602
  {
9603
    /* VEX_W_0FEE_P_2  */
9604 148 khays
    { "vpmaxsw",        { XM, Vex, EXx } },
9605 18 khays
  },
9606
  {
9607
    /* VEX_W_0FEF_P_2  */
9608 148 khays
    { "vpxor",          { XM, Vex, EXx } },
9609 18 khays
  },
9610
  {
9611
    /* VEX_W_0FF0_P_3_M_0 */
9612
    { "vlddqu",         { XM, M } },
9613
  },
9614
  {
9615
    /* VEX_W_0FF1_P_2 */
9616 148 khays
    { "vpsllw",         { XM, Vex, EXxmm } },
9617 18 khays
  },
9618
  {
9619
    /* VEX_W_0FF2_P_2 */
9620 148 khays
    { "vpslld",         { XM, Vex, EXxmm } },
9621 18 khays
  },
9622
  {
9623
    /* VEX_W_0FF3_P_2 */
9624 148 khays
    { "vpsllq",         { XM, Vex, EXxmm } },
9625 18 khays
  },
9626
  {
9627
    /* VEX_W_0FF4_P_2 */
9628 148 khays
    { "vpmuludq",       { XM, Vex, EXx } },
9629 18 khays
  },
9630
  {
9631
    /* VEX_W_0FF5_P_2 */
9632 148 khays
    { "vpmaddwd",       { XM, Vex, EXx } },
9633 18 khays
  },
9634
  {
9635
    /* VEX_W_0FF6_P_2 */
9636 148 khays
    { "vpsadbw",        { XM, Vex, EXx } },
9637 18 khays
  },
9638
  {
9639
    /* VEX_W_0FF7_P_2 */
9640
    { "vmaskmovdqu",    { XM, XS } },
9641
  },
9642
  {
9643
    /* VEX_W_0FF8_P_2 */
9644 148 khays
    { "vpsubb",         { XM, Vex, EXx } },
9645 18 khays
  },
9646
  {
9647
    /* VEX_W_0FF9_P_2 */
9648 148 khays
    { "vpsubw",         { XM, Vex, EXx } },
9649 18 khays
  },
9650
  {
9651
    /* VEX_W_0FFA_P_2 */
9652 148 khays
    { "vpsubd",         { XM, Vex, EXx } },
9653 18 khays
  },
9654
  {
9655
    /* VEX_W_0FFB_P_2 */
9656 148 khays
    { "vpsubq",         { XM, Vex, EXx } },
9657 18 khays
  },
9658
  {
9659
    /* VEX_W_0FFC_P_2 */
9660 148 khays
    { "vpaddb",         { XM, Vex, EXx } },
9661 18 khays
  },
9662
  {
9663
    /* VEX_W_0FFD_P_2 */
9664 148 khays
    { "vpaddw",         { XM, Vex, EXx } },
9665 18 khays
  },
9666
  {
9667
    /* VEX_W_0FFE_P_2 */
9668 148 khays
    { "vpaddd",         { XM, Vex, EXx } },
9669 18 khays
  },
9670
  {
9671
    /* VEX_W_0F3800_P_2  */
9672 148 khays
    { "vpshufb",        { XM, Vex, EXx } },
9673 18 khays
  },
9674
  {
9675
    /* VEX_W_0F3801_P_2  */
9676 148 khays
    { "vphaddw",        { XM, Vex, EXx } },
9677 18 khays
  },
9678
  {
9679
    /* VEX_W_0F3802_P_2  */
9680 148 khays
    { "vphaddd",        { XM, Vex, EXx } },
9681 18 khays
  },
9682
  {
9683
    /* VEX_W_0F3803_P_2  */
9684 148 khays
    { "vphaddsw",       { XM, Vex, EXx } },
9685 18 khays
  },
9686
  {
9687
    /* VEX_W_0F3804_P_2  */
9688 148 khays
    { "vpmaddubsw",     { XM, Vex, EXx } },
9689 18 khays
  },
9690
  {
9691
    /* VEX_W_0F3805_P_2  */
9692 148 khays
    { "vphsubw",        { XM, Vex, EXx } },
9693 18 khays
  },
9694
  {
9695
    /* VEX_W_0F3806_P_2  */
9696 148 khays
    { "vphsubd",        { XM, Vex, EXx } },
9697 18 khays
  },
9698
  {
9699
    /* VEX_W_0F3807_P_2  */
9700 148 khays
    { "vphsubsw",       { XM, Vex, EXx } },
9701 18 khays
  },
9702
  {
9703
    /* VEX_W_0F3808_P_2  */
9704 148 khays
    { "vpsignb",        { XM, Vex, EXx } },
9705 18 khays
  },
9706
  {
9707
    /* VEX_W_0F3809_P_2  */
9708 148 khays
    { "vpsignw",        { XM, Vex, EXx } },
9709 18 khays
  },
9710
  {
9711
    /* VEX_W_0F380A_P_2  */
9712 148 khays
    { "vpsignd",        { XM, Vex, EXx } },
9713 18 khays
  },
9714
  {
9715
    /* VEX_W_0F380B_P_2  */
9716 148 khays
    { "vpmulhrsw",      { XM, Vex, EXx } },
9717 18 khays
  },
9718
  {
9719
    /* VEX_W_0F380C_P_2  */
9720
    { "vpermilps",      { XM, Vex, EXx } },
9721
  },
9722
  {
9723
    /* VEX_W_0F380D_P_2  */
9724
    { "vpermilpd",      { XM, Vex, EXx } },
9725
  },
9726
  {
9727
    /* VEX_W_0F380E_P_2  */
9728
    { "vtestps",        { XM, EXx } },
9729
  },
9730
  {
9731
    /* VEX_W_0F380F_P_2  */
9732
    { "vtestpd",        { XM, EXx } },
9733
  },
9734
  {
9735 148 khays
    /* VEX_W_0F3816_P_2  */
9736
    { "vpermps",        { XM, Vex, EXx } },
9737
  },
9738
  {
9739 18 khays
    /* VEX_W_0F3817_P_2 */
9740
    { "vptest",         { XM, EXx } },
9741
  },
9742
  {
9743 148 khays
    /* VEX_W_0F3818_P_2 */
9744
    { "vbroadcastss",   { XM, EXxmm_md } },
9745 18 khays
  },
9746
  {
9747 148 khays
    /* VEX_W_0F3819_P_2 */
9748
    { "vbroadcastsd",   { XM, EXxmm_mq } },
9749 18 khays
  },
9750
  {
9751
    /* VEX_W_0F381A_P_2_M_0 */
9752
    { "vbroadcastf128", { XM, Mxmm } },
9753
  },
9754
  {
9755
    /* VEX_W_0F381C_P_2 */
9756
    { "vpabsb",         { XM, EXx } },
9757
  },
9758
  {
9759
    /* VEX_W_0F381D_P_2 */
9760
    { "vpabsw",         { XM, EXx } },
9761
  },
9762
  {
9763
    /* VEX_W_0F381E_P_2 */
9764
    { "vpabsd",         { XM, EXx } },
9765
  },
9766
  {
9767
    /* VEX_W_0F3820_P_2 */
9768 148 khays
    { "vpmovsxbw",      { XM, EXxmmq } },
9769 18 khays
  },
9770
  {
9771
    /* VEX_W_0F3821_P_2 */
9772 148 khays
    { "vpmovsxbd",      { XM, EXxmmqd } },
9773 18 khays
  },
9774
  {
9775
    /* VEX_W_0F3822_P_2 */
9776 148 khays
    { "vpmovsxbq",      { XM, EXxmmdw } },
9777 18 khays
  },
9778
  {
9779
    /* VEX_W_0F3823_P_2 */
9780 148 khays
    { "vpmovsxwd",      { XM, EXxmmq } },
9781 18 khays
  },
9782
  {
9783
    /* VEX_W_0F3824_P_2 */
9784 148 khays
    { "vpmovsxwq",      { XM, EXxmmqd } },
9785 18 khays
  },
9786
  {
9787
    /* VEX_W_0F3825_P_2 */
9788 148 khays
    { "vpmovsxdq",      { XM, EXxmmq } },
9789 18 khays
  },
9790
  {
9791
    /* VEX_W_0F3828_P_2 */
9792 148 khays
    { "vpmuldq",        { XM, Vex, EXx } },
9793 18 khays
  },
9794
  {
9795
    /* VEX_W_0F3829_P_2 */
9796 148 khays
    { "vpcmpeqq",       { XM, Vex, EXx } },
9797 18 khays
  },
9798
  {
9799
    /* VEX_W_0F382A_P_2_M_0 */
9800
    { "vmovntdqa",      { XM, Mx } },
9801
  },
9802
  {
9803
    /* VEX_W_0F382B_P_2 */
9804 148 khays
    { "vpackusdw",      { XM, Vex, EXx } },
9805 18 khays
  },
9806
  {
9807
    /* VEX_W_0F382C_P_2_M_0 */
9808
    { "vmaskmovps",     { XM, Vex, Mx } },
9809
  },
9810
  {
9811
    /* VEX_W_0F382D_P_2_M_0 */
9812
    { "vmaskmovpd",     { XM, Vex, Mx } },
9813
  },
9814
  {
9815
    /* VEX_W_0F382E_P_2_M_0 */
9816
    { "vmaskmovps",     { Mx, Vex, XM } },
9817
  },
9818
  {
9819
    /* VEX_W_0F382F_P_2_M_0 */
9820
    { "vmaskmovpd",     { Mx, Vex, XM } },
9821
  },
9822
  {
9823
    /* VEX_W_0F3830_P_2 */
9824 148 khays
    { "vpmovzxbw",      { XM, EXxmmq } },
9825 18 khays
  },
9826
  {
9827
    /* VEX_W_0F3831_P_2 */
9828 148 khays
    { "vpmovzxbd",      { XM, EXxmmqd } },
9829 18 khays
  },
9830
  {
9831
    /* VEX_W_0F3832_P_2 */
9832 148 khays
    { "vpmovzxbq",      { XM, EXxmmdw } },
9833 18 khays
  },
9834
  {
9835
    /* VEX_W_0F3833_P_2 */
9836 148 khays
    { "vpmovzxwd",      { XM, EXxmmq } },
9837 18 khays
  },
9838
  {
9839
    /* VEX_W_0F3834_P_2 */
9840 148 khays
    { "vpmovzxwq",      { XM, EXxmmqd } },
9841 18 khays
  },
9842
  {
9843
    /* VEX_W_0F3835_P_2 */
9844 148 khays
    { "vpmovzxdq",      { XM, EXxmmq } },
9845 18 khays
  },
9846
  {
9847 148 khays
    /* VEX_W_0F3836_P_2  */
9848
    { "vpermd",         { XM, Vex, EXx } },
9849
  },
9850
  {
9851 18 khays
    /* VEX_W_0F3837_P_2 */
9852 148 khays
    { "vpcmpgtq",       { XM, Vex, EXx } },
9853 18 khays
  },
9854
  {
9855
    /* VEX_W_0F3838_P_2 */
9856 148 khays
    { "vpminsb",        { XM, Vex, EXx } },
9857 18 khays
  },
9858
  {
9859
    /* VEX_W_0F3839_P_2 */
9860 148 khays
    { "vpminsd",        { XM, Vex, EXx } },
9861 18 khays
  },
9862
  {
9863
    /* VEX_W_0F383A_P_2 */
9864 148 khays
    { "vpminuw",        { XM, Vex, EXx } },
9865 18 khays
  },
9866
  {
9867
    /* VEX_W_0F383B_P_2 */
9868 148 khays
    { "vpminud",        { XM, Vex, EXx } },
9869 18 khays
  },
9870
  {
9871
    /* VEX_W_0F383C_P_2 */
9872 148 khays
    { "vpmaxsb",        { XM, Vex, EXx } },
9873 18 khays
  },
9874
  {
9875
    /* VEX_W_0F383D_P_2 */
9876 148 khays
    { "vpmaxsd",        { XM, Vex, EXx } },
9877 18 khays
  },
9878
  {
9879
    /* VEX_W_0F383E_P_2 */
9880 148 khays
    { "vpmaxuw",        { XM, Vex, EXx } },
9881 18 khays
  },
9882
  {
9883
    /* VEX_W_0F383F_P_2 */
9884 148 khays
    { "vpmaxud",        { XM, Vex, EXx } },
9885 18 khays
  },
9886
  {
9887
    /* VEX_W_0F3840_P_2 */
9888 148 khays
    { "vpmulld",        { XM, Vex, EXx } },
9889 18 khays
  },
9890
  {
9891
    /* VEX_W_0F3841_P_2 */
9892
    { "vphminposuw",    { XM, EXx } },
9893
  },
9894
  {
9895 148 khays
    /* VEX_W_0F3846_P_2 */
9896
    { "vpsravd",        { XM, Vex, EXx } },
9897
  },
9898
  {
9899
    /* VEX_W_0F3858_P_2 */
9900
    { "vpbroadcastd", { XM, EXxmm_md } },
9901
  },
9902
  {
9903
    /* VEX_W_0F3859_P_2 */
9904
    { "vpbroadcastq",   { XM, EXxmm_mq } },
9905
  },
9906
  {
9907
    /* VEX_W_0F385A_P_2_M_0 */
9908
    { "vbroadcasti128", { XM, Mxmm } },
9909
  },
9910
  {
9911
    /* VEX_W_0F3878_P_2 */
9912
    { "vpbroadcastb",   { XM, EXxmm_mb } },
9913
  },
9914
  {
9915
    /* VEX_W_0F3879_P_2 */
9916
    { "vpbroadcastw",   { XM, EXxmm_mw } },
9917
  },
9918
  {
9919 18 khays
    /* VEX_W_0F38DB_P_2 */
9920
    { "vaesimc",        { XM, EXx } },
9921
  },
9922
  {
9923
    /* VEX_W_0F38DC_P_2 */
9924
    { "vaesenc",        { XM, Vex128, EXx } },
9925
  },
9926
  {
9927
    /* VEX_W_0F38DD_P_2 */
9928
    { "vaesenclast",    { XM, Vex128, EXx } },
9929
  },
9930
  {
9931
    /* VEX_W_0F38DE_P_2 */
9932
    { "vaesdec",        { XM, Vex128, EXx } },
9933
  },
9934
  {
9935
    /* VEX_W_0F38DF_P_2 */
9936
    { "vaesdeclast",    { XM, Vex128, EXx } },
9937
  },
9938
  {
9939 148 khays
    /* VEX_W_0F3A00_P_2 */
9940
    { Bad_Opcode },
9941
    { "vpermq",         { XM, EXx, Ib } },
9942
  },
9943
  {
9944
    /* VEX_W_0F3A01_P_2 */
9945
    { Bad_Opcode },
9946
    { "vpermpd",        { XM, EXx, Ib } },
9947
  },
9948
  {
9949
    /* VEX_W_0F3A02_P_2 */
9950
    { "vpblendd",       { XM, Vex, EXx, Ib } },
9951
  },
9952
  {
9953 18 khays
    /* VEX_W_0F3A04_P_2 */
9954
    { "vpermilps",      { XM, EXx, Ib } },
9955
  },
9956
  {
9957
    /* VEX_W_0F3A05_P_2 */
9958
    { "vpermilpd",      { XM, EXx, Ib } },
9959
  },
9960
  {
9961
    /* VEX_W_0F3A06_P_2 */
9962
    { "vperm2f128",     { XM, Vex256, EXx, Ib } },
9963
  },
9964
  {
9965
    /* VEX_W_0F3A08_P_2 */
9966
    { "vroundps",       { XM, EXx, Ib } },
9967
  },
9968
  {
9969
    /* VEX_W_0F3A09_P_2 */
9970
    { "vroundpd",       { XM, EXx, Ib } },
9971
  },
9972
  {
9973
    /* VEX_W_0F3A0A_P_2 */
9974
    { "vroundss",       { XMScalar, VexScalar, EXdScalar, Ib } },
9975
  },
9976
  {
9977
    /* VEX_W_0F3A0B_P_2 */
9978
    { "vroundsd",       { XMScalar, VexScalar, EXqScalar, Ib } },
9979
  },
9980
  {
9981
    /* VEX_W_0F3A0C_P_2 */
9982
    { "vblendps",       { XM, Vex, EXx, Ib } },
9983
  },
9984
  {
9985
    /* VEX_W_0F3A0D_P_2 */
9986
    { "vblendpd",       { XM, Vex, EXx, Ib } },
9987
  },
9988
  {
9989
    /* VEX_W_0F3A0E_P_2 */
9990 148 khays
    { "vpblendw",       { XM, Vex, EXx, Ib } },
9991 18 khays
  },
9992
  {
9993
    /* VEX_W_0F3A0F_P_2 */
9994 148 khays
    { "vpalignr",       { XM, Vex, EXx, Ib } },
9995 18 khays
  },
9996
  {
9997
    /* VEX_W_0F3A14_P_2 */
9998
    { "vpextrb",        { Edqb, XM, Ib } },
9999
  },
10000
  {
10001
    /* VEX_W_0F3A15_P_2 */
10002
    { "vpextrw",        { Edqw, XM, Ib } },
10003
  },
10004
  {
10005
    /* VEX_W_0F3A18_P_2 */
10006
    { "vinsertf128",    { XM, Vex256, EXxmm, Ib } },
10007
  },
10008
  {
10009
    /* VEX_W_0F3A19_P_2 */
10010
    { "vextractf128",   { EXxmm, XM, Ib } },
10011
  },
10012
  {
10013
    /* VEX_W_0F3A20_P_2 */
10014
    { "vpinsrb",        { XM, Vex128, Edqb, Ib } },
10015
  },
10016
  {
10017
    /* VEX_W_0F3A21_P_2 */
10018
    { "vinsertps",      { XM, Vex128, EXd, Ib } },
10019
  },
10020
  {
10021 148 khays
    /* VEX_W_0F3A38_P_2 */
10022
    { "vinserti128",    { XM, Vex256, EXxmm, Ib } },
10023
  },
10024
  {
10025
    /* VEX_W_0F3A39_P_2 */
10026
    { "vextracti128",   { EXxmm, XM, Ib } },
10027
  },
10028
  {
10029 18 khays
    /* VEX_W_0F3A40_P_2 */
10030
    { "vdpps",          { XM, Vex, EXx, Ib } },
10031
  },
10032
  {
10033
    /* VEX_W_0F3A41_P_2 */
10034
    { "vdppd",          { XM, Vex128, EXx, Ib } },
10035
  },
10036
  {
10037
    /* VEX_W_0F3A42_P_2 */
10038 148 khays
    { "vmpsadbw",       { XM, Vex, EXx, Ib } },
10039 18 khays
  },
10040
  {
10041
    /* VEX_W_0F3A44_P_2 */
10042
    { "vpclmulqdq",     { XM, Vex128, EXx, PCLMUL } },
10043
  },
10044
  {
10045 148 khays
    /* VEX_W_0F3A46_P_2 */
10046
    { "vperm2i128",     { XM, Vex256, EXx, Ib } },
10047
  },
10048
  {
10049 18 khays
    /* VEX_W_0F3A48_P_2 */
10050
    { "vpermil2ps",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW } },
10051
    { "vpermil2ps",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW } },
10052
  },
10053
  {
10054
    /* VEX_W_0F3A49_P_2 */
10055
    { "vpermil2pd",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW } },
10056
    { "vpermil2pd",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW } },
10057
  },
10058
  {
10059
    /* VEX_W_0F3A4A_P_2 */
10060
    { "vblendvps",      { XM, Vex, EXx, XMVexI4 } },
10061
  },
10062
  {
10063
    /* VEX_W_0F3A4B_P_2 */
10064
    { "vblendvpd",      { XM, Vex, EXx, XMVexI4 } },
10065
  },
10066
  {
10067
    /* VEX_W_0F3A4C_P_2 */
10068 148 khays
    { "vpblendvb",      { XM, Vex, EXx, XMVexI4 } },
10069 18 khays
  },
10070
  {
10071
    /* VEX_W_0F3A60_P_2 */
10072
    { "vpcmpestrm",     { XM, EXx, Ib } },
10073
  },
10074
  {
10075
    /* VEX_W_0F3A61_P_2 */
10076
    { "vpcmpestri",     { XM, EXx, Ib } },
10077
  },
10078
  {
10079
    /* VEX_W_0F3A62_P_2 */
10080
    { "vpcmpistrm",     { XM, EXx, Ib } },
10081
  },
10082
  {
10083
    /* VEX_W_0F3A63_P_2 */
10084
    { "vpcmpistri",     { XM, EXx, Ib } },
10085
  },
10086
  {
10087
    /* VEX_W_0F3ADF_P_2 */
10088
    { "vaeskeygenassist", { XM, EXx, Ib } },
10089
  },
10090
};
10091
 
10092
static const struct dis386 mod_table[][2] = {
10093
  {
10094
    /* MOD_8D */
10095
    { "leaS",           { Gv, M } },
10096
  },
10097
  {
10098 166 khays
    /* MOD_C6_REG_7 */
10099
    { Bad_Opcode },
10100
    { RM_TABLE (RM_C6_REG_7) },
10101
  },
10102
  {
10103
    /* MOD_C7_REG_7 */
10104
    { Bad_Opcode },
10105
    { RM_TABLE (RM_C7_REG_7) },
10106
  },
10107
  {
10108 18 khays
    /* MOD_0F01_REG_0 */
10109
    { X86_64_TABLE (X86_64_0F01_REG_0) },
10110
    { RM_TABLE (RM_0F01_REG_0) },
10111
  },
10112
  {
10113
    /* MOD_0F01_REG_1 */
10114
    { X86_64_TABLE (X86_64_0F01_REG_1) },
10115
    { RM_TABLE (RM_0F01_REG_1) },
10116
  },
10117
  {
10118
    /* MOD_0F01_REG_2 */
10119
    { X86_64_TABLE (X86_64_0F01_REG_2) },
10120
    { RM_TABLE (RM_0F01_REG_2) },
10121
  },
10122
  {
10123
    /* MOD_0F01_REG_3 */
10124
    { X86_64_TABLE (X86_64_0F01_REG_3) },
10125
    { RM_TABLE (RM_0F01_REG_3) },
10126
  },
10127
  {
10128
    /* MOD_0F01_REG_7 */
10129
    { "invlpg",         { Mb } },
10130
    { RM_TABLE (RM_0F01_REG_7) },
10131
  },
10132
  {
10133
    /* MOD_0F12_PREFIX_0 */
10134
    { "movlps",         { XM, EXq } },
10135
    { "movhlps",        { XM, EXq } },
10136
  },
10137
  {
10138
    /* MOD_0F13 */
10139
    { "movlpX",         { EXq, XM } },
10140
  },
10141
  {
10142
    /* MOD_0F16_PREFIX_0 */
10143
    { "movhps",         { XM, EXq } },
10144
    { "movlhps",        { XM, EXq } },
10145
  },
10146
  {
10147
    /* MOD_0F17 */
10148
    { "movhpX",         { EXq, XM } },
10149
  },
10150
  {
10151
    /* MOD_0F18_REG_0 */
10152
    { "prefetchnta",    { Mb } },
10153
  },
10154
  {
10155
    /* MOD_0F18_REG_1 */
10156
    { "prefetcht0",     { Mb } },
10157
  },
10158
  {
10159
    /* MOD_0F18_REG_2 */
10160
    { "prefetcht1",     { Mb } },
10161
  },
10162
  {
10163
    /* MOD_0F18_REG_3 */
10164
    { "prefetcht2",     { Mb } },
10165
  },
10166
  {
10167
    /* MOD_0F20 */
10168
    { Bad_Opcode },
10169
    { "movZ",           { Rm, Cm } },
10170
  },
10171
  {
10172
    /* MOD_0F21 */
10173
    { Bad_Opcode },
10174
    { "movZ",           { Rm, Dm } },
10175
  },
10176
  {
10177
    /* MOD_0F22 */
10178
    { Bad_Opcode },
10179
    { "movZ",           { Cm, Rm } },
10180
  },
10181
  {
10182
    /* MOD_0F23 */
10183
    { Bad_Opcode },
10184
    { "movZ",           { Dm, Rm } },
10185
  },
10186
  {
10187
    /* MOD_0F24 */
10188
    { Bad_Opcode },
10189
    { "movL",           { Rd, Td } },
10190
  },
10191
  {
10192
    /* MOD_0F26 */
10193
    { Bad_Opcode },
10194
    { "movL",           { Td, Rd } },
10195
  },
10196
  {
10197
    /* MOD_0F2B_PREFIX_0 */
10198
    {"movntps",         { Mx, XM } },
10199
  },
10200
  {
10201
    /* MOD_0F2B_PREFIX_1 */
10202
    {"movntss",         { Md, XM } },
10203
  },
10204
  {
10205
    /* MOD_0F2B_PREFIX_2 */
10206
    {"movntpd",         { Mx, XM } },
10207
  },
10208
  {
10209
    /* MOD_0F2B_PREFIX_3 */
10210
    {"movntsd",         { Mq, XM } },
10211
  },
10212
  {
10213
    /* MOD_0F51 */
10214
    { Bad_Opcode },
10215
    { "movmskpX",       { Gdq, XS } },
10216
  },
10217
  {
10218
    /* MOD_0F71_REG_2 */
10219
    { Bad_Opcode },
10220
    { "psrlw",          { MS, Ib } },
10221
  },
10222
  {
10223
    /* MOD_0F71_REG_4 */
10224
    { Bad_Opcode },
10225
    { "psraw",          { MS, Ib } },
10226
  },
10227
  {
10228
    /* MOD_0F71_REG_6 */
10229
    { Bad_Opcode },
10230
    { "psllw",          { MS, Ib } },
10231
  },
10232
  {
10233
    /* MOD_0F72_REG_2 */
10234
    { Bad_Opcode },
10235
    { "psrld",          { MS, Ib } },
10236
  },
10237
  {
10238
    /* MOD_0F72_REG_4 */
10239
    { Bad_Opcode },
10240
    { "psrad",          { MS, Ib } },
10241
  },
10242
  {
10243
    /* MOD_0F72_REG_6 */
10244
    { Bad_Opcode },
10245
    { "pslld",          { MS, Ib } },
10246
  },
10247
  {
10248
    /* MOD_0F73_REG_2 */
10249
    { Bad_Opcode },
10250
    { "psrlq",          { MS, Ib } },
10251
  },
10252
  {
10253
    /* MOD_0F73_REG_3 */
10254
    { Bad_Opcode },
10255
    { PREFIX_TABLE (PREFIX_0F73_REG_3) },
10256
  },
10257
  {
10258
    /* MOD_0F73_REG_6 */
10259
    { Bad_Opcode },
10260
    { "psllq",          { MS, Ib } },
10261
  },
10262
  {
10263
    /* MOD_0F73_REG_7 */
10264
    { Bad_Opcode },
10265
    { PREFIX_TABLE (PREFIX_0F73_REG_7) },
10266
  },
10267
  {
10268
    /* MOD_0FAE_REG_0 */
10269
    { "fxsave",         { FXSAVE } },
10270
    { PREFIX_TABLE (PREFIX_0FAE_REG_0) },
10271
  },
10272
  {
10273
    /* MOD_0FAE_REG_1 */
10274
    { "fxrstor",        { FXSAVE } },
10275
    { PREFIX_TABLE (PREFIX_0FAE_REG_1) },
10276
  },
10277
  {
10278
    /* MOD_0FAE_REG_2 */
10279
    { "ldmxcsr",        { Md } },
10280
    { PREFIX_TABLE (PREFIX_0FAE_REG_2) },
10281
  },
10282
  {
10283
    /* MOD_0FAE_REG_3 */
10284
    { "stmxcsr",        { Md } },
10285
    { PREFIX_TABLE (PREFIX_0FAE_REG_3) },
10286
  },
10287
  {
10288
    /* MOD_0FAE_REG_4 */
10289
    { "xsave",          { FXSAVE } },
10290
  },
10291
  {
10292
    /* MOD_0FAE_REG_5 */
10293
    { "xrstor",         { FXSAVE } },
10294
    { RM_TABLE (RM_0FAE_REG_5) },
10295
  },
10296
  {
10297
    /* MOD_0FAE_REG_6 */
10298
    { "xsaveopt",       { FXSAVE } },
10299
    { RM_TABLE (RM_0FAE_REG_6) },
10300
  },
10301
  {
10302
    /* MOD_0FAE_REG_7 */
10303
    { "clflush",        { Mb } },
10304
    { RM_TABLE (RM_0FAE_REG_7) },
10305
  },
10306
  {
10307
    /* MOD_0FB2 */
10308
    { "lssS",           { Gv, Mp } },
10309
  },
10310
  {
10311
    /* MOD_0FB4 */
10312
    { "lfsS",           { Gv, Mp } },
10313
  },
10314
  {
10315
    /* MOD_0FB5 */
10316
    { "lgsS",           { Gv, Mp } },
10317
  },
10318
  {
10319
    /* MOD_0FC7_REG_6 */
10320
    { PREFIX_TABLE (PREFIX_0FC7_REG_6) },
10321
    { "rdrand",         { Ev } },
10322
  },
10323
  {
10324
    /* MOD_0FC7_REG_7 */
10325
    { "vmptrst",        { Mq } },
10326
  },
10327
  {
10328
    /* MOD_0FD7 */
10329
    { Bad_Opcode },
10330
    { "pmovmskb",       { Gdq, MS } },
10331
  },
10332
  {
10333
    /* MOD_0FE7_PREFIX_2 */
10334
    { "movntdq",        { Mx, XM } },
10335
  },
10336
  {
10337
    /* MOD_0FF0_PREFIX_3 */
10338
    { "lddqu",          { XM, M } },
10339
  },
10340
  {
10341
    /* MOD_0F382A_PREFIX_2 */
10342
    { "movntdqa",       { XM, Mx } },
10343
  },
10344
  {
10345
    /* MOD_62_32BIT */
10346
    { "bound{S|}",      { Gv, Ma } },
10347
  },
10348
  {
10349
    /* MOD_C4_32BIT */
10350
    { "lesS",           { Gv, Mp } },
10351
    { VEX_C4_TABLE (VEX_0F) },
10352
  },
10353
  {
10354
    /* MOD_C5_32BIT */
10355
    { "ldsS",           { Gv, Mp } },
10356
    { VEX_C5_TABLE (VEX_0F) },
10357
  },
10358
  {
10359
    /* MOD_VEX_0F12_PREFIX_0 */
10360
    { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0) },
10361
    { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1) },
10362
  },
10363
  {
10364
    /* MOD_VEX_0F13 */
10365
    { VEX_LEN_TABLE (VEX_LEN_0F13_M_0) },
10366
  },
10367
  {
10368
    /* MOD_VEX_0F16_PREFIX_0 */
10369
    { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0) },
10370
    { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1) },
10371
  },
10372
  {
10373
    /* MOD_VEX_0F17 */
10374
    { VEX_LEN_TABLE (VEX_LEN_0F17_M_0) },
10375
  },
10376
  {
10377
    /* MOD_VEX_0F2B */
10378
    { VEX_W_TABLE (VEX_W_0F2B_M_0) },
10379
  },
10380
  {
10381
    /* MOD_VEX_0F50 */
10382
    { Bad_Opcode },
10383
    { VEX_W_TABLE (VEX_W_0F50_M_0) },
10384
  },
10385
  {
10386
    /* MOD_VEX_0F71_REG_2 */
10387
    { Bad_Opcode },
10388
    { PREFIX_TABLE (PREFIX_VEX_0F71_REG_2) },
10389
  },
10390
  {
10391
    /* MOD_VEX_0F71_REG_4 */
10392
    { Bad_Opcode },
10393
    { PREFIX_TABLE (PREFIX_VEX_0F71_REG_4) },
10394
  },
10395
  {
10396
    /* MOD_VEX_0F71_REG_6 */
10397
    { Bad_Opcode },
10398
    { PREFIX_TABLE (PREFIX_VEX_0F71_REG_6) },
10399
  },
10400
  {
10401
    /* MOD_VEX_0F72_REG_2 */
10402
    { Bad_Opcode },
10403
    { PREFIX_TABLE (PREFIX_VEX_0F72_REG_2) },
10404
  },
10405
  {
10406
    /* MOD_VEX_0F72_REG_4 */
10407
    { Bad_Opcode },
10408
    { PREFIX_TABLE (PREFIX_VEX_0F72_REG_4) },
10409
  },
10410
  {
10411
    /* MOD_VEX_0F72_REG_6 */
10412
    { Bad_Opcode },
10413
    { PREFIX_TABLE (PREFIX_VEX_0F72_REG_6) },
10414
  },
10415
  {
10416
    /* MOD_VEX_0F73_REG_2 */
10417
    { Bad_Opcode },
10418
    { PREFIX_TABLE (PREFIX_VEX_0F73_REG_2) },
10419
  },
10420
  {
10421
    /* MOD_VEX_0F73_REG_3 */
10422
    { Bad_Opcode },
10423
    { PREFIX_TABLE (PREFIX_VEX_0F73_REG_3) },
10424
  },
10425
  {
10426
    /* MOD_VEX_0F73_REG_6 */
10427
    { Bad_Opcode },
10428
    { PREFIX_TABLE (PREFIX_VEX_0F73_REG_6) },
10429
  },
10430
  {
10431
    /* MOD_VEX_0F73_REG_7 */
10432
    { Bad_Opcode },
10433
    { PREFIX_TABLE (PREFIX_VEX_0F73_REG_7) },
10434
  },
10435
  {
10436
    /* MOD_VEX_0FAE_REG_2 */
10437
    { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0) },
10438
  },
10439
  {
10440
    /* MOD_VEX_0FAE_REG_3 */
10441
    { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0) },
10442
  },
10443
  {
10444
    /* MOD_VEX_0FD7_PREFIX_2 */
10445
    { Bad_Opcode },
10446 148 khays
    { VEX_W_TABLE (VEX_W_0FD7_P_2_M_1) },
10447 18 khays
  },
10448
  {
10449
    /* MOD_VEX_0FE7_PREFIX_2 */
10450
    { VEX_W_TABLE (VEX_W_0FE7_P_2_M_0) },
10451
  },
10452
  {
10453
    /* MOD_VEX_0FF0_PREFIX_3 */
10454
    { VEX_W_TABLE (VEX_W_0FF0_P_3_M_0) },
10455
  },
10456
  {
10457
    /* MOD_VEX_0F381A_PREFIX_2 */
10458
    { VEX_LEN_TABLE (VEX_LEN_0F381A_P_2_M_0) },
10459
  },
10460
  {
10461
    /* MOD_VEX_0F382A_PREFIX_2 */
10462 148 khays
    { VEX_W_TABLE (VEX_W_0F382A_P_2_M_0) },
10463 18 khays
  },
10464
  {
10465
    /* MOD_VEX_0F382C_PREFIX_2 */
10466
    { VEX_W_TABLE (VEX_W_0F382C_P_2_M_0) },
10467
  },
10468
  {
10469
    /* MOD_VEX_0F382D_PREFIX_2 */
10470
    { VEX_W_TABLE (VEX_W_0F382D_P_2_M_0) },
10471
  },
10472
  {
10473
    /* MOD_VEX_0F382E_PREFIX_2 */
10474
    { VEX_W_TABLE (VEX_W_0F382E_P_2_M_0) },
10475
  },
10476
  {
10477
    /* MOD_VEX_0F382F_PREFIX_2 */
10478
    { VEX_W_TABLE (VEX_W_0F382F_P_2_M_0) },
10479
  },
10480 148 khays
  {
10481
    /* MOD_VEX_0F385A_PREFIX_2 */
10482
    { VEX_LEN_TABLE (VEX_LEN_0F385A_P_2_M_0) },
10483
  },
10484
  {
10485
    /* MOD_VEX_0F388C_PREFIX_2 */
10486
    { "vpmaskmov%LW",   { XM, Vex, Mx } },
10487
  },
10488
  {
10489
    /* MOD_VEX_0F388E_PREFIX_2 */
10490
    { "vpmaskmov%LW",   { Mx, Vex, XM } },
10491
  },
10492 18 khays
};
10493
 
10494
static const struct dis386 rm_table[][8] = {
10495
  {
10496 166 khays
    /* RM_C6_REG_7 */
10497
    { "xabort",         { Skip_MODRM, Ib } },
10498
  },
10499
  {
10500
    /* RM_C7_REG_7 */
10501
    { "xbeginT",        { Skip_MODRM, Jv } },
10502
  },
10503
  {
10504 18 khays
    /* RM_0F01_REG_0 */
10505
    { Bad_Opcode },
10506
    { "vmcall",         { Skip_MODRM } },
10507
    { "vmlaunch",       { Skip_MODRM } },
10508
    { "vmresume",       { Skip_MODRM } },
10509
    { "vmxoff",         { Skip_MODRM } },
10510
  },
10511
  {
10512
    /* RM_0F01_REG_1 */
10513
    { "monitor",        { { OP_Monitor, 0 } } },
10514
    { "mwait",          { { OP_Mwait, 0 } } },
10515
  },
10516
  {
10517
    /* RM_0F01_REG_2 */
10518
    { "xgetbv",         { Skip_MODRM } },
10519
    { "xsetbv",         { Skip_MODRM } },
10520 166 khays
    { Bad_Opcode },
10521
    { Bad_Opcode },
10522
    { "vmfunc",         { Skip_MODRM } },
10523
    { "xend",           { Skip_MODRM } },
10524
    { "xtest",          { Skip_MODRM } },
10525
    { Bad_Opcode },
10526 18 khays
  },
10527
  {
10528
    /* RM_0F01_REG_3 */
10529
    { "vmrun",          { Skip_MODRM } },
10530
    { "vmmcall",        { Skip_MODRM } },
10531
    { "vmload",         { Skip_MODRM } },
10532
    { "vmsave",         { Skip_MODRM } },
10533
    { "stgi",           { Skip_MODRM } },
10534
    { "clgi",           { Skip_MODRM } },
10535
    { "skinit",         { Skip_MODRM } },
10536
    { "invlpga",        { Skip_MODRM } },
10537
  },
10538
  {
10539
    /* RM_0F01_REG_7 */
10540
    { "swapgs",         { Skip_MODRM } },
10541
    { "rdtscp",         { Skip_MODRM } },
10542
  },
10543
  {
10544
    /* RM_0FAE_REG_5 */
10545
    { "lfence",         { Skip_MODRM } },
10546
  },
10547
  {
10548
    /* RM_0FAE_REG_6 */
10549
    { "mfence",         { Skip_MODRM } },
10550
  },
10551
  {
10552
    /* RM_0FAE_REG_7 */
10553
    { "sfence",         { Skip_MODRM } },
10554
  },
10555
};
10556
 
10557
#define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
10558
 
10559
/* We use the high bit to indicate different name for the same
10560
   prefix.  */
10561
#define ADDR16_PREFIX   (0x67 | 0x100)
10562
#define ADDR32_PREFIX   (0x67 | 0x200)
10563
#define DATA16_PREFIX   (0x66 | 0x100)
10564
#define DATA32_PREFIX   (0x66 | 0x200)
10565
#define REP_PREFIX      (0xf3 | 0x100)
10566 166 khays
#define XACQUIRE_PREFIX (0xf2 | 0x200)
10567
#define XRELEASE_PREFIX (0xf3 | 0x400)
10568 18 khays
 
10569
static int
10570
ckprefix (void)
10571
{
10572
  int newrex, i, length;
10573
  rex = 0;
10574
  rex_ignored = 0;
10575
  prefixes = 0;
10576
  used_prefixes = 0;
10577
  rex_used = 0;
10578
  last_lock_prefix = -1;
10579
  last_repz_prefix = -1;
10580
  last_repnz_prefix = -1;
10581
  last_data_prefix = -1;
10582
  last_addr_prefix = -1;
10583
  last_rex_prefix = -1;
10584
  last_seg_prefix = -1;
10585
  for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
10586
    all_prefixes[i] = 0;
10587
  i = 0;
10588
  length = 0;
10589
  /* The maximum instruction length is 15bytes.  */
10590
  while (length < MAX_CODE_LENGTH - 1)
10591
    {
10592
      FETCH_DATA (the_info, codep + 1);
10593
      newrex = 0;
10594
      switch (*codep)
10595
        {
10596
        /* REX prefixes family.  */
10597
        case 0x40:
10598
        case 0x41:
10599
        case 0x42:
10600
        case 0x43:
10601
        case 0x44:
10602
        case 0x45:
10603
        case 0x46:
10604
        case 0x47:
10605
        case 0x48:
10606
        case 0x49:
10607
        case 0x4a:
10608
        case 0x4b:
10609
        case 0x4c:
10610
        case 0x4d:
10611
        case 0x4e:
10612
        case 0x4f:
10613
          if (address_mode == mode_64bit)
10614
            newrex = *codep;
10615
          else
10616
            return 1;
10617
          last_rex_prefix = i;
10618
          break;
10619
        case 0xf3:
10620
          prefixes |= PREFIX_REPZ;
10621
          last_repz_prefix = i;
10622
          break;
10623
        case 0xf2:
10624
          prefixes |= PREFIX_REPNZ;
10625
          last_repnz_prefix = i;
10626
          break;
10627
        case 0xf0:
10628
          prefixes |= PREFIX_LOCK;
10629
          last_lock_prefix = i;
10630
          break;
10631
        case 0x2e:
10632
          prefixes |= PREFIX_CS;
10633
          last_seg_prefix = i;
10634
          break;
10635
        case 0x36:
10636
          prefixes |= PREFIX_SS;
10637
          last_seg_prefix = i;
10638
          break;
10639
        case 0x3e:
10640
          prefixes |= PREFIX_DS;
10641
          last_seg_prefix = i;
10642
          break;
10643
        case 0x26:
10644
          prefixes |= PREFIX_ES;
10645
          last_seg_prefix = i;
10646
          break;
10647
        case 0x64:
10648
          prefixes |= PREFIX_FS;
10649
          last_seg_prefix = i;
10650
          break;
10651
        case 0x65:
10652
          prefixes |= PREFIX_GS;
10653
          last_seg_prefix = i;
10654
          break;
10655
        case 0x66:
10656
          prefixes |= PREFIX_DATA;
10657
          last_data_prefix = i;
10658
          break;
10659
        case 0x67:
10660
          prefixes |= PREFIX_ADDR;
10661
          last_addr_prefix = i;
10662
          break;
10663
        case FWAIT_OPCODE:
10664
          /* fwait is really an instruction.  If there are prefixes
10665
             before the fwait, they belong to the fwait, *not* to the
10666
             following instruction.  */
10667
          if (prefixes || rex)
10668
            {
10669
              prefixes |= PREFIX_FWAIT;
10670
              codep++;
10671
              return 1;
10672
            }
10673
          prefixes = PREFIX_FWAIT;
10674
          break;
10675
        default:
10676
          return 1;
10677
        }
10678
      /* Rex is ignored when followed by another prefix.  */
10679
      if (rex)
10680
        {
10681
          rex_used = rex;
10682
          return 1;
10683
        }
10684
      if (*codep != FWAIT_OPCODE)
10685
        all_prefixes[i++] = *codep;
10686
      rex = newrex;
10687
      codep++;
10688
      length++;
10689
    }
10690
  return 0;
10691
}
10692
 
10693
static int
10694
seg_prefix (int pref)
10695
{
10696
  switch (pref)
10697
    {
10698
    case 0x2e:
10699
      return PREFIX_CS;
10700
    case 0x36:
10701
      return PREFIX_SS;
10702
    case 0x3e:
10703
      return PREFIX_DS;
10704
    case 0x26:
10705
      return PREFIX_ES;
10706
    case 0x64:
10707
      return PREFIX_FS;
10708
    case 0x65:
10709
      return PREFIX_GS;
10710
    default:
10711
      return 0;
10712
    }
10713
}
10714
 
10715
/* Return the name of the prefix byte PREF, or NULL if PREF is not a
10716
   prefix byte.  */
10717
 
10718
static const char *
10719
prefix_name (int pref, int sizeflag)
10720
{
10721
  static const char *rexes [16] =
10722
    {
10723
      "rex",            /* 0x40 */
10724
      "rex.B",          /* 0x41 */
10725
      "rex.X",          /* 0x42 */
10726
      "rex.XB",         /* 0x43 */
10727
      "rex.R",          /* 0x44 */
10728
      "rex.RB",         /* 0x45 */
10729
      "rex.RX",         /* 0x46 */
10730
      "rex.RXB",        /* 0x47 */
10731
      "rex.W",          /* 0x48 */
10732
      "rex.WB",         /* 0x49 */
10733
      "rex.WX",         /* 0x4a */
10734
      "rex.WXB",        /* 0x4b */
10735
      "rex.WR",         /* 0x4c */
10736
      "rex.WRB",        /* 0x4d */
10737
      "rex.WRX",        /* 0x4e */
10738
      "rex.WRXB",       /* 0x4f */
10739
    };
10740
 
10741
  switch (pref)
10742
    {
10743
    /* REX prefixes family.  */
10744
    case 0x40:
10745
    case 0x41:
10746
    case 0x42:
10747
    case 0x43:
10748
    case 0x44:
10749
    case 0x45:
10750
    case 0x46:
10751
    case 0x47:
10752
    case 0x48:
10753
    case 0x49:
10754
    case 0x4a:
10755
    case 0x4b:
10756
    case 0x4c:
10757
    case 0x4d:
10758
    case 0x4e:
10759
    case 0x4f:
10760
      return rexes [pref - 0x40];
10761
    case 0xf3:
10762
      return "repz";
10763
    case 0xf2:
10764
      return "repnz";
10765
    case 0xf0:
10766
      return "lock";
10767
    case 0x2e:
10768
      return "cs";
10769
    case 0x36:
10770
      return "ss";
10771
    case 0x3e:
10772
      return "ds";
10773
    case 0x26:
10774
      return "es";
10775
    case 0x64:
10776
      return "fs";
10777
    case 0x65:
10778
      return "gs";
10779
    case 0x66:
10780
      return (sizeflag & DFLAG) ? "data16" : "data32";
10781
    case 0x67:
10782
      if (address_mode == mode_64bit)
10783
        return (sizeflag & AFLAG) ? "addr32" : "addr64";
10784
      else
10785
        return (sizeflag & AFLAG) ? "addr16" : "addr32";
10786
    case FWAIT_OPCODE:
10787
      return "fwait";
10788
    case ADDR16_PREFIX:
10789
      return "addr16";
10790
    case ADDR32_PREFIX:
10791
      return "addr32";
10792
    case DATA16_PREFIX:
10793
      return "data16";
10794
    case DATA32_PREFIX:
10795
      return "data32";
10796
    case REP_PREFIX:
10797
      return "rep";
10798 166 khays
    case XACQUIRE_PREFIX:
10799
      return "xacquire";
10800
    case XRELEASE_PREFIX:
10801
      return "xrelease";
10802 18 khays
    default:
10803
      return NULL;
10804
    }
10805
}
10806
 
10807
static char op_out[MAX_OPERANDS][100];
10808
static int op_ad, op_index[MAX_OPERANDS];
10809
static int two_source_ops;
10810
static bfd_vma op_address[MAX_OPERANDS];
10811
static bfd_vma op_riprel[MAX_OPERANDS];
10812
static bfd_vma start_pc;
10813
 
10814
/*
10815
 *   On the 386's of 1988, the maximum length of an instruction is 15 bytes.
10816
 *   (see topic "Redundant prefixes" in the "Differences from 8086"
10817
 *   section of the "Virtual 8086 Mode" chapter.)
10818
 * 'pc' should be the address of this instruction, it will
10819
 *   be used to print the target address if this is a relative jump or call
10820
 * The function returns the length of this instruction in bytes.
10821
 */
10822
 
10823
static char intel_syntax;
10824
static char intel_mnemonic = !SYSV386_COMPAT;
10825
static char open_char;
10826
static char close_char;
10827
static char separator_char;
10828
static char scale_char;
10829
 
10830
/* Here for backwards compatibility.  When gdb stops using
10831
   print_insn_i386_att and print_insn_i386_intel these functions can
10832
   disappear, and print_insn_i386 be merged into print_insn.  */
10833
int
10834
print_insn_i386_att (bfd_vma pc, disassemble_info *info)
10835
{
10836
  intel_syntax = 0;
10837
 
10838
  return print_insn (pc, info);
10839
}
10840
 
10841
int
10842
print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
10843
{
10844
  intel_syntax = 1;
10845
 
10846
  return print_insn (pc, info);
10847
}
10848
 
10849
int
10850
print_insn_i386 (bfd_vma pc, disassemble_info *info)
10851
{
10852
  intel_syntax = -1;
10853
 
10854
  return print_insn (pc, info);
10855
}
10856
 
10857
void
10858
print_i386_disassembler_options (FILE *stream)
10859
{
10860
  fprintf (stream, _("\n\
10861
The following i386/x86-64 specific disassembler options are supported for use\n\
10862
with the -M switch (multiple options should be separated by commas):\n"));
10863
 
10864
  fprintf (stream, _("  x86-64      Disassemble in 64bit mode\n"));
10865
  fprintf (stream, _("  i386        Disassemble in 32bit mode\n"));
10866
  fprintf (stream, _("  i8086       Disassemble in 16bit mode\n"));
10867
  fprintf (stream, _("  att         Display instruction in AT&T syntax\n"));
10868
  fprintf (stream, _("  intel       Display instruction in Intel syntax\n"));
10869
  fprintf (stream, _("  att-mnemonic\n"
10870
                     "              Display instruction in AT&T mnemonic\n"));
10871
  fprintf (stream, _("  intel-mnemonic\n"
10872
                     "              Display instruction in Intel mnemonic\n"));
10873
  fprintf (stream, _("  addr64      Assume 64bit address size\n"));
10874
  fprintf (stream, _("  addr32      Assume 32bit address size\n"));
10875
  fprintf (stream, _("  addr16      Assume 16bit address size\n"));
10876
  fprintf (stream, _("  data32      Assume 32bit data size\n"));
10877
  fprintf (stream, _("  data16      Assume 16bit data size\n"));
10878
  fprintf (stream, _("  suffix      Always display instruction suffix in AT&T syntax\n"));
10879
}
10880
 
10881
/* Bad opcode.  */
10882
static const struct dis386 bad_opcode = { "(bad)", { XX } };
10883
 
10884
/* Get a pointer to struct dis386 with a valid name.  */
10885
 
10886
static const struct dis386 *
10887
get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
10888
{
10889
  int vindex, vex_table_index;
10890
 
10891
  if (dp->name != NULL)
10892
    return dp;
10893
 
10894
  switch (dp->op[0].bytemode)
10895
    {
10896
    case USE_REG_TABLE:
10897
      dp = &reg_table[dp->op[1].bytemode][modrm.reg];
10898
      break;
10899
 
10900
    case USE_MOD_TABLE:
10901
      vindex = modrm.mod == 0x3 ? 1 : 0;
10902
      dp = &mod_table[dp->op[1].bytemode][vindex];
10903
      break;
10904
 
10905
    case USE_RM_TABLE:
10906
      dp = &rm_table[dp->op[1].bytemode][modrm.rm];
10907
      break;
10908
 
10909
    case USE_PREFIX_TABLE:
10910
      if (need_vex)
10911
        {
10912
          /* The prefix in VEX is implicit.  */
10913
          switch (vex.prefix)
10914
            {
10915
            case 0:
10916
              vindex = 0;
10917
              break;
10918
            case REPE_PREFIX_OPCODE:
10919
              vindex = 1;
10920
              break;
10921
            case DATA_PREFIX_OPCODE:
10922
              vindex = 2;
10923
              break;
10924
            case REPNE_PREFIX_OPCODE:
10925
              vindex = 3;
10926
              break;
10927
            default:
10928
              abort ();
10929
              break;
10930
            }
10931
        }
10932
      else
10933
        {
10934
          vindex = 0;
10935
          used_prefixes |= (prefixes & PREFIX_REPZ);
10936
          if (prefixes & PREFIX_REPZ)
10937
            {
10938
              vindex = 1;
10939
              all_prefixes[last_repz_prefix] = 0;
10940
            }
10941
          else
10942
            {
10943
              /* We should check PREFIX_REPNZ and PREFIX_REPZ before
10944
                 PREFIX_DATA.  */
10945
              used_prefixes |= (prefixes & PREFIX_REPNZ);
10946
              if (prefixes & PREFIX_REPNZ)
10947
                {
10948
                  vindex = 3;
10949
                  all_prefixes[last_repnz_prefix] = 0;
10950
                }
10951
              else
10952
                {
10953
                  used_prefixes |= (prefixes & PREFIX_DATA);
10954
                  if (prefixes & PREFIX_DATA)
10955
                    {
10956
                      vindex = 2;
10957
                      all_prefixes[last_data_prefix] = 0;
10958
                    }
10959
                }
10960
            }
10961
        }
10962
      dp = &prefix_table[dp->op[1].bytemode][vindex];
10963
      break;
10964
 
10965
    case USE_X86_64_TABLE:
10966
      vindex = address_mode == mode_64bit ? 1 : 0;
10967
      dp = &x86_64_table[dp->op[1].bytemode][vindex];
10968
      break;
10969
 
10970
    case USE_3BYTE_TABLE:
10971
      FETCH_DATA (info, codep + 2);
10972
      vindex = *codep++;
10973
      dp = &three_byte_table[dp->op[1].bytemode][vindex];
10974
      modrm.mod = (*codep >> 6) & 3;
10975
      modrm.reg = (*codep >> 3) & 7;
10976
      modrm.rm = *codep & 7;
10977
      break;
10978
 
10979
    case USE_VEX_LEN_TABLE:
10980
      if (!need_vex)
10981
        abort ();
10982
 
10983
      switch (vex.length)
10984
        {
10985
        case 128:
10986
          vindex = 0;
10987
          break;
10988
        case 256:
10989
          vindex = 1;
10990
          break;
10991
        default:
10992
          abort ();
10993
          break;
10994
        }
10995
 
10996
      dp = &vex_len_table[dp->op[1].bytemode][vindex];
10997
      break;
10998
 
10999
    case USE_XOP_8F_TABLE:
11000
      FETCH_DATA (info, codep + 3);
11001
      /* All bits in the REX prefix are ignored.  */
11002
      rex_ignored = rex;
11003
      rex = ~(*codep >> 5) & 0x7;
11004
 
11005
      /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm".  */
11006
      switch ((*codep & 0x1f))
11007
        {
11008
        default:
11009
          dp = &bad_opcode;
11010
          return dp;
11011
        case 0x8:
11012
          vex_table_index = XOP_08;
11013
          break;
11014
        case 0x9:
11015
          vex_table_index = XOP_09;
11016
          break;
11017
        case 0xa:
11018
          vex_table_index = XOP_0A;
11019
          break;
11020
        }
11021
      codep++;
11022
      vex.w = *codep & 0x80;
11023
      if (vex.w && address_mode == mode_64bit)
11024
        rex |= REX_W;
11025
 
11026
      vex.register_specifier = (~(*codep >> 3)) & 0xf;
11027
      if (address_mode != mode_64bit
11028
          && vex.register_specifier > 0x7)
11029
        {
11030
          dp = &bad_opcode;
11031
          return dp;
11032
        }
11033
 
11034
      vex.length = (*codep & 0x4) ? 256 : 128;
11035
      switch ((*codep & 0x3))
11036
        {
11037
        case 0:
11038
          vex.prefix = 0;
11039
          break;
11040
        case 1:
11041
          vex.prefix = DATA_PREFIX_OPCODE;
11042
          break;
11043
        case 2:
11044
          vex.prefix = REPE_PREFIX_OPCODE;
11045
          break;
11046
        case 3:
11047
          vex.prefix = REPNE_PREFIX_OPCODE;
11048
          break;
11049
        }
11050
      need_vex = 1;
11051
      need_vex_reg = 1;
11052
      codep++;
11053
      vindex = *codep++;
11054
      dp = &xop_table[vex_table_index][vindex];
11055
 
11056
      FETCH_DATA (info, codep + 1);
11057
      modrm.mod = (*codep >> 6) & 3;
11058
      modrm.reg = (*codep >> 3) & 7;
11059
      modrm.rm = *codep & 7;
11060
      break;
11061
 
11062
    case USE_VEX_C4_TABLE:
11063
      FETCH_DATA (info, codep + 3);
11064
      /* All bits in the REX prefix are ignored.  */
11065
      rex_ignored = rex;
11066
      rex = ~(*codep >> 5) & 0x7;
11067
      switch ((*codep & 0x1f))
11068
        {
11069
        default:
11070
          dp = &bad_opcode;
11071
          return dp;
11072
        case 0x1:
11073
          vex_table_index = VEX_0F;
11074
          break;
11075
        case 0x2:
11076
          vex_table_index = VEX_0F38;
11077
          break;
11078
        case 0x3:
11079
          vex_table_index = VEX_0F3A;
11080
          break;
11081
        }
11082
      codep++;
11083
      vex.w = *codep & 0x80;
11084
      if (vex.w && address_mode == mode_64bit)
11085
        rex |= REX_W;
11086
 
11087
      vex.register_specifier = (~(*codep >> 3)) & 0xf;
11088
      if (address_mode != mode_64bit
11089
          && vex.register_specifier > 0x7)
11090
        {
11091
          dp = &bad_opcode;
11092
          return dp;
11093
        }
11094
 
11095
      vex.length = (*codep & 0x4) ? 256 : 128;
11096
      switch ((*codep & 0x3))
11097
        {
11098
        case 0:
11099
          vex.prefix = 0;
11100
          break;
11101
        case 1:
11102
          vex.prefix = DATA_PREFIX_OPCODE;
11103
          break;
11104
        case 2:
11105
          vex.prefix = REPE_PREFIX_OPCODE;
11106
          break;
11107
        case 3:
11108
          vex.prefix = REPNE_PREFIX_OPCODE;
11109
          break;
11110
        }
11111
      need_vex = 1;
11112
      need_vex_reg = 1;
11113
      codep++;
11114
      vindex = *codep++;
11115
      dp = &vex_table[vex_table_index][vindex];
11116
      /* There is no MODRM byte for VEX [82|77].  */
11117
      if (vindex != 0x77 && vindex != 0x82)
11118
        {
11119
          FETCH_DATA (info, codep + 1);
11120
          modrm.mod = (*codep >> 6) & 3;
11121
          modrm.reg = (*codep >> 3) & 7;
11122
          modrm.rm = *codep & 7;
11123
        }
11124
      break;
11125
 
11126
    case USE_VEX_C5_TABLE:
11127
      FETCH_DATA (info, codep + 2);
11128
      /* All bits in the REX prefix are ignored.  */
11129
      rex_ignored = rex;
11130
      rex = (*codep & 0x80) ? 0 : REX_R;
11131
 
11132
      vex.register_specifier = (~(*codep >> 3)) & 0xf;
11133
      if (address_mode != mode_64bit
11134
          && vex.register_specifier > 0x7)
11135
        {
11136
          dp = &bad_opcode;
11137
          return dp;
11138
        }
11139
 
11140
      vex.w = 0;
11141
 
11142
      vex.length = (*codep & 0x4) ? 256 : 128;
11143
      switch ((*codep & 0x3))
11144
        {
11145
        case 0:
11146
          vex.prefix = 0;
11147
          break;
11148
        case 1:
11149
          vex.prefix = DATA_PREFIX_OPCODE;
11150
          break;
11151
        case 2:
11152
          vex.prefix = REPE_PREFIX_OPCODE;
11153
          break;
11154
        case 3:
11155
          vex.prefix = REPNE_PREFIX_OPCODE;
11156
          break;
11157
        }
11158
      need_vex = 1;
11159
      need_vex_reg = 1;
11160
      codep++;
11161
      vindex = *codep++;
11162
      dp = &vex_table[dp->op[1].bytemode][vindex];
11163
      /* There is no MODRM byte for VEX [82|77].  */
11164
      if (vindex != 0x77 && vindex != 0x82)
11165
        {
11166
          FETCH_DATA (info, codep + 1);
11167
          modrm.mod = (*codep >> 6) & 3;
11168
          modrm.reg = (*codep >> 3) & 7;
11169
          modrm.rm = *codep & 7;
11170
        }
11171
      break;
11172
 
11173
    case USE_VEX_W_TABLE:
11174
      if (!need_vex)
11175
        abort ();
11176
 
11177
      dp = &vex_w_table[dp->op[1].bytemode][vex.w ? 1 : 0];
11178
      break;
11179
 
11180
    case 0:
11181
      dp = &bad_opcode;
11182
      break;
11183
 
11184
    default:
11185
      abort ();
11186
    }
11187
 
11188
  if (dp->name != NULL)
11189
    return dp;
11190
  else
11191
    return get_valid_dis386 (dp, info);
11192
}
11193
 
11194
static void
11195
get_sib (disassemble_info *info)
11196
{
11197
  /* If modrm.mod == 3, operand must be register.  */
11198
  if (need_modrm
11199
      && address_mode != mode_16bit
11200
      && modrm.mod != 3
11201
      && modrm.rm == 4)
11202
    {
11203
      FETCH_DATA (info, codep + 2);
11204
      sib.index = (codep [1] >> 3) & 7;
11205
      sib.scale = (codep [1] >> 6) & 3;
11206
      sib.base = codep [1] & 7;
11207
    }
11208
}
11209
 
11210
static int
11211
print_insn (bfd_vma pc, disassemble_info *info)
11212
{
11213
  const struct dis386 *dp;
11214
  int i;
11215
  char *op_txt[MAX_OPERANDS];
11216
  int needcomma;
11217
  int sizeflag;
11218
  const char *p;
11219
  struct dis_private priv;
11220
  int prefix_length;
11221
  int default_prefixes;
11222
 
11223 158 khays
  priv.orig_sizeflag = AFLAG | DFLAG;
11224
  if ((info->mach & bfd_mach_i386_i386) != 0)
11225
    address_mode = mode_32bit;
11226
  else if (info->mach == bfd_mach_i386_i8086)
11227
    {
11228
      address_mode = mode_16bit;
11229
      priv.orig_sizeflag = 0;
11230
    }
11231
  else
11232 18 khays
    address_mode = mode_64bit;
11233
 
11234
  if (intel_syntax == (char) -1)
11235 158 khays
    intel_syntax = (info->mach & bfd_mach_i386_intel_syntax) != 0;
11236 18 khays
 
11237
  for (p = info->disassembler_options; p != NULL; )
11238
    {
11239
      if (CONST_STRNEQ (p, "x86-64"))
11240
        {
11241
          address_mode = mode_64bit;
11242
          priv.orig_sizeflag = AFLAG | DFLAG;
11243
        }
11244
      else if (CONST_STRNEQ (p, "i386"))
11245
        {
11246
          address_mode = mode_32bit;
11247
          priv.orig_sizeflag = AFLAG | DFLAG;
11248
        }
11249
      else if (CONST_STRNEQ (p, "i8086"))
11250
        {
11251
          address_mode = mode_16bit;
11252
          priv.orig_sizeflag = 0;
11253
        }
11254
      else if (CONST_STRNEQ (p, "intel"))
11255
        {
11256
          intel_syntax = 1;
11257
          if (CONST_STRNEQ (p + 5, "-mnemonic"))
11258
            intel_mnemonic = 1;
11259
        }
11260
      else if (CONST_STRNEQ (p, "att"))
11261
        {
11262
          intel_syntax = 0;
11263
          if (CONST_STRNEQ (p + 3, "-mnemonic"))
11264
            intel_mnemonic = 0;
11265
        }
11266
      else if (CONST_STRNEQ (p, "addr"))
11267
        {
11268
          if (address_mode == mode_64bit)
11269
            {
11270
              if (p[4] == '3' && p[5] == '2')
11271
                priv.orig_sizeflag &= ~AFLAG;
11272
              else if (p[4] == '6' && p[5] == '4')
11273
                priv.orig_sizeflag |= AFLAG;
11274
            }
11275
          else
11276
            {
11277
              if (p[4] == '1' && p[5] == '6')
11278
                priv.orig_sizeflag &= ~AFLAG;
11279
              else if (p[4] == '3' && p[5] == '2')
11280
                priv.orig_sizeflag |= AFLAG;
11281
            }
11282
        }
11283
      else if (CONST_STRNEQ (p, "data"))
11284
        {
11285
          if (p[4] == '1' && p[5] == '6')
11286
            priv.orig_sizeflag &= ~DFLAG;
11287
          else if (p[4] == '3' && p[5] == '2')
11288
            priv.orig_sizeflag |= DFLAG;
11289
        }
11290
      else if (CONST_STRNEQ (p, "suffix"))
11291
        priv.orig_sizeflag |= SUFFIX_ALWAYS;
11292
 
11293
      p = strchr (p, ',');
11294
      if (p != NULL)
11295
        p++;
11296
    }
11297
 
11298
  if (intel_syntax)
11299
    {
11300
      names64 = intel_names64;
11301
      names32 = intel_names32;
11302
      names16 = intel_names16;
11303
      names8 = intel_names8;
11304
      names8rex = intel_names8rex;
11305
      names_seg = intel_names_seg;
11306
      names_mm = intel_names_mm;
11307
      names_xmm = intel_names_xmm;
11308
      names_ymm = intel_names_ymm;
11309
      index64 = intel_index64;
11310
      index32 = intel_index32;
11311
      index16 = intel_index16;
11312
      open_char = '[';
11313
      close_char = ']';
11314
      separator_char = '+';
11315
      scale_char = '*';
11316
    }
11317
  else
11318
    {
11319
      names64 = att_names64;
11320
      names32 = att_names32;
11321
      names16 = att_names16;
11322
      names8 = att_names8;
11323
      names8rex = att_names8rex;
11324
      names_seg = att_names_seg;
11325
      names_mm = att_names_mm;
11326
      names_xmm = att_names_xmm;
11327
      names_ymm = att_names_ymm;
11328
      index64 = att_index64;
11329
      index32 = att_index32;
11330
      index16 = att_index16;
11331
      open_char = '(';
11332
      close_char =  ')';
11333
      separator_char = ',';
11334
      scale_char = ',';
11335
    }
11336
 
11337
  /* The output looks better if we put 7 bytes on a line, since that
11338
     puts most long word instructions on a single line.  Use 8 bytes
11339
     for Intel L1OM.  */
11340 158 khays
  if ((info->mach & bfd_mach_l1om) != 0)
11341 18 khays
    info->bytes_per_line = 8;
11342
  else
11343
    info->bytes_per_line = 7;
11344
 
11345
  info->private_data = &priv;
11346
  priv.max_fetched = priv.the_buffer;
11347
  priv.insn_start = pc;
11348
 
11349
  obuf[0] = 0;
11350
  for (i = 0; i < MAX_OPERANDS; ++i)
11351
    {
11352
      op_out[i][0] = 0;
11353
      op_index[i] = -1;
11354
    }
11355
 
11356
  the_info = info;
11357
  start_pc = pc;
11358
  start_codep = priv.the_buffer;
11359
  codep = priv.the_buffer;
11360
 
11361
  if (setjmp (priv.bailout) != 0)
11362
    {
11363
      const char *name;
11364
 
11365
      /* Getting here means we tried for data but didn't get it.  That
11366
         means we have an incomplete instruction of some sort.  Just
11367
         print the first byte as a prefix or a .byte pseudo-op.  */
11368
      if (codep > priv.the_buffer)
11369
        {
11370
          name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
11371
          if (name != NULL)
11372
            (*info->fprintf_func) (info->stream, "%s", name);
11373
          else
11374
            {
11375
              /* Just print the first byte as a .byte instruction.  */
11376
              (*info->fprintf_func) (info->stream, ".byte 0x%x",
11377
                                     (unsigned int) priv.the_buffer[0]);
11378
            }
11379
 
11380
          return 1;
11381
        }
11382
 
11383
      return -1;
11384
    }
11385
 
11386
  obufp = obuf;
11387
  sizeflag = priv.orig_sizeflag;
11388
 
11389
  if (!ckprefix () || rex_used)
11390
    {
11391
      /* Too many prefixes or unused REX prefixes.  */
11392
      for (i = 0;
11393 163 khays
           i < (int) ARRAY_SIZE (all_prefixes) && all_prefixes[i];
11394 18 khays
           i++)
11395
        (*info->fprintf_func) (info->stream, "%s",
11396
                               prefix_name (all_prefixes[i], sizeflag));
11397
      return 1;
11398
    }
11399
 
11400
  insn_codep = codep;
11401
 
11402
  FETCH_DATA (info, codep + 1);
11403
  two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
11404
 
11405
  if (((prefixes & PREFIX_FWAIT)
11406
       && ((*codep < 0xd8) || (*codep > 0xdf))))
11407
    {
11408
      (*info->fprintf_func) (info->stream, "fwait");
11409
      return 1;
11410
    }
11411
 
11412
  if (*codep == 0x0f)
11413
    {
11414
      unsigned char threebyte;
11415
      FETCH_DATA (info, codep + 2);
11416
      threebyte = *++codep;
11417
      dp = &dis386_twobyte[threebyte];
11418
      need_modrm = twobyte_has_modrm[*codep];
11419
      codep++;
11420
    }
11421
  else
11422
    {
11423
      dp = &dis386[*codep];
11424
      need_modrm = onebyte_has_modrm[*codep];
11425
      codep++;
11426
    }
11427
 
11428
  if ((prefixes & PREFIX_REPZ))
11429
    used_prefixes |= PREFIX_REPZ;
11430
  if ((prefixes & PREFIX_REPNZ))
11431
    used_prefixes |= PREFIX_REPNZ;
11432
  if ((prefixes & PREFIX_LOCK))
11433
    used_prefixes |= PREFIX_LOCK;
11434
 
11435
  default_prefixes = 0;
11436
  if (prefixes & PREFIX_ADDR)
11437
    {
11438
      sizeflag ^= AFLAG;
11439
      if (dp->op[2].bytemode != loop_jcxz_mode || intel_syntax)
11440
        {
11441
          if ((sizeflag & AFLAG) || address_mode == mode_64bit)
11442
            all_prefixes[last_addr_prefix] = ADDR32_PREFIX;
11443
          else
11444
            all_prefixes[last_addr_prefix] = ADDR16_PREFIX;
11445
          default_prefixes |= PREFIX_ADDR;
11446
        }
11447
    }
11448
 
11449
  if ((prefixes & PREFIX_DATA))
11450
    {
11451
      sizeflag ^= DFLAG;
11452
      if (dp->op[2].bytemode == cond_jump_mode
11453
          && dp->op[0].bytemode == v_mode
11454
          && !intel_syntax)
11455
        {
11456
          if (sizeflag & DFLAG)
11457
            all_prefixes[last_data_prefix] = DATA32_PREFIX;
11458
          else
11459
            all_prefixes[last_data_prefix] = DATA16_PREFIX;
11460
          default_prefixes |= PREFIX_DATA;
11461
        }
11462
      else if (rex & REX_W)
11463
        {
11464
          /* REX_W will override PREFIX_DATA.  */
11465
          default_prefixes |= PREFIX_DATA;
11466
        }
11467
    }
11468
 
11469
  if (need_modrm)
11470
    {
11471
      FETCH_DATA (info, codep + 1);
11472
      modrm.mod = (*codep >> 6) & 3;
11473
      modrm.reg = (*codep >> 3) & 7;
11474
      modrm.rm = *codep & 7;
11475
    }
11476
 
11477
  need_vex = 0;
11478
  need_vex_reg = 0;
11479
  vex_w_done = 0;
11480
 
11481
  if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
11482
    {
11483
      get_sib (info);
11484
      dofloat (sizeflag);
11485
    }
11486
  else
11487
    {
11488
      dp = get_valid_dis386 (dp, info);
11489
      if (dp != NULL && putop (dp->name, sizeflag) == 0)
11490
        {
11491
          get_sib (info);
11492
          for (i = 0; i < MAX_OPERANDS; ++i)
11493
            {
11494
              obufp = op_out[i];
11495
              op_ad = MAX_OPERANDS - 1 - i;
11496
              if (dp->op[i].rtn)
11497
                (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
11498
            }
11499
        }
11500
    }
11501
 
11502
  /* See if any prefixes were not used.  If so, print the first one
11503
     separately.  If we don't do this, we'll wind up printing an
11504
     instruction stream which does not precisely correspond to the
11505
     bytes we are disassembling.  */
11506
  if ((prefixes & ~(used_prefixes | default_prefixes)) != 0)
11507
    {
11508
      for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
11509
        if (all_prefixes[i])
11510
          {
11511
            const char *name;
11512
            name = prefix_name (all_prefixes[i], priv.orig_sizeflag);
11513
            if (name == NULL)
11514
              name = INTERNAL_DISASSEMBLER_ERROR;
11515
            (*info->fprintf_func) (info->stream, "%s", name);
11516
            return 1;
11517
          }
11518
    }
11519
 
11520
  /* Check if the REX prefix is used.  */
11521
  if (rex_ignored == 0 && (rex ^ rex_used) == 0)
11522
    all_prefixes[last_rex_prefix] = 0;
11523
 
11524
  /* Check if the SEG prefix is used.  */
11525
  if ((prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
11526
                   | PREFIX_FS | PREFIX_GS)) != 0
11527
      && (used_prefixes
11528
          & seg_prefix (all_prefixes[last_seg_prefix])) != 0)
11529
    all_prefixes[last_seg_prefix] = 0;
11530
 
11531
  /* Check if the ADDR prefix is used.  */
11532
  if ((prefixes & PREFIX_ADDR) != 0
11533
      && (used_prefixes & PREFIX_ADDR) != 0)
11534
    all_prefixes[last_addr_prefix] = 0;
11535
 
11536
  /* Check if the DATA prefix is used.  */
11537
  if ((prefixes & PREFIX_DATA) != 0
11538
      && (used_prefixes & PREFIX_DATA) != 0)
11539
    all_prefixes[last_data_prefix] = 0;
11540
 
11541
  prefix_length = 0;
11542
  for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
11543
    if (all_prefixes[i])
11544
      {
11545
        const char *name;
11546
        name = prefix_name (all_prefixes[i], sizeflag);
11547
        if (name == NULL)
11548
          abort ();
11549
        prefix_length += strlen (name) + 1;
11550
        (*info->fprintf_func) (info->stream, "%s ", name);
11551
      }
11552
 
11553
  /* Check maximum code length.  */
11554
  if ((codep - start_codep) > MAX_CODE_LENGTH)
11555
    {
11556
      (*info->fprintf_func) (info->stream, "(bad)");
11557
      return MAX_CODE_LENGTH;
11558
    }
11559
 
11560
  obufp = mnemonicendp;
11561
  for (i = strlen (obuf) + prefix_length; i < 6; i++)
11562
    oappend (" ");
11563
  oappend (" ");
11564
  (*info->fprintf_func) (info->stream, "%s", obuf);
11565
 
11566
  /* The enter and bound instructions are printed with operands in the same
11567
     order as the intel book; everything else is printed in reverse order.  */
11568
  if (intel_syntax || two_source_ops)
11569
    {
11570
      bfd_vma riprel;
11571
 
11572
      for (i = 0; i < MAX_OPERANDS; ++i)
11573
        op_txt[i] = op_out[i];
11574
 
11575
      for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
11576
        {
11577
          op_ad = op_index[i];
11578
          op_index[i] = op_index[MAX_OPERANDS - 1 - i];
11579
          op_index[MAX_OPERANDS - 1 - i] = op_ad;
11580
          riprel = op_riprel[i];
11581
          op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
11582
          op_riprel[MAX_OPERANDS - 1 - i] = riprel;
11583
        }
11584
    }
11585
  else
11586
    {
11587
      for (i = 0; i < MAX_OPERANDS; ++i)
11588
        op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
11589
    }
11590
 
11591
  needcomma = 0;
11592
  for (i = 0; i < MAX_OPERANDS; ++i)
11593
    if (*op_txt[i])
11594
      {
11595
        if (needcomma)
11596
          (*info->fprintf_func) (info->stream, ",");
11597
        if (op_index[i] != -1 && !op_riprel[i])
11598
          (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
11599
        else
11600
          (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
11601
        needcomma = 1;
11602
      }
11603
 
11604
  for (i = 0; i < MAX_OPERANDS; i++)
11605
    if (op_index[i] != -1 && op_riprel[i])
11606
      {
11607
        (*info->fprintf_func) (info->stream, "        # ");
11608
        (*info->print_address_func) ((bfd_vma) (start_pc + codep - start_codep
11609
                                                + op_address[op_index[i]]), info);
11610
        break;
11611
      }
11612
  return codep - priv.the_buffer;
11613
}
11614
 
11615
static const char *float_mem[] = {
11616
  /* d8 */
11617
  "fadd{s|}",
11618
  "fmul{s|}",
11619
  "fcom{s|}",
11620
  "fcomp{s|}",
11621
  "fsub{s|}",
11622
  "fsubr{s|}",
11623
  "fdiv{s|}",
11624
  "fdivr{s|}",
11625
  /* d9 */
11626
  "fld{s|}",
11627
  "(bad)",
11628
  "fst{s|}",
11629
  "fstp{s|}",
11630
  "fldenvIC",
11631
  "fldcw",
11632
  "fNstenvIC",
11633
  "fNstcw",
11634
  /* da */
11635
  "fiadd{l|}",
11636
  "fimul{l|}",
11637
  "ficom{l|}",
11638
  "ficomp{l|}",
11639
  "fisub{l|}",
11640
  "fisubr{l|}",
11641
  "fidiv{l|}",
11642
  "fidivr{l|}",
11643
  /* db */
11644
  "fild{l|}",
11645
  "fisttp{l|}",
11646
  "fist{l|}",
11647
  "fistp{l|}",
11648
  "(bad)",
11649
  "fld{t||t|}",
11650
  "(bad)",
11651
  "fstp{t||t|}",
11652
  /* dc */
11653
  "fadd{l|}",
11654
  "fmul{l|}",
11655
  "fcom{l|}",
11656
  "fcomp{l|}",
11657
  "fsub{l|}",
11658
  "fsubr{l|}",
11659
  "fdiv{l|}",
11660
  "fdivr{l|}",
11661
  /* dd */
11662
  "fld{l|}",
11663
  "fisttp{ll|}",
11664
  "fst{l||}",
11665
  "fstp{l|}",
11666
  "frstorIC",
11667
  "(bad)",
11668
  "fNsaveIC",
11669
  "fNstsw",
11670
  /* de */
11671
  "fiadd",
11672
  "fimul",
11673
  "ficom",
11674
  "ficomp",
11675
  "fisub",
11676
  "fisubr",
11677
  "fidiv",
11678
  "fidivr",
11679
  /* df */
11680
  "fild",
11681
  "fisttp",
11682
  "fist",
11683
  "fistp",
11684
  "fbld",
11685
  "fild{ll|}",
11686
  "fbstp",
11687
  "fistp{ll|}",
11688
};
11689
 
11690
static const unsigned char float_mem_mode[] = {
11691
  /* d8 */
11692
  d_mode,
11693
  d_mode,
11694
  d_mode,
11695
  d_mode,
11696
  d_mode,
11697
  d_mode,
11698
  d_mode,
11699
  d_mode,
11700
  /* d9 */
11701
  d_mode,
11702
  0,
11703
  d_mode,
11704
  d_mode,
11705
  0,
11706
  w_mode,
11707
  0,
11708
  w_mode,
11709
  /* da */
11710
  d_mode,
11711
  d_mode,
11712
  d_mode,
11713
  d_mode,
11714
  d_mode,
11715
  d_mode,
11716
  d_mode,
11717
  d_mode,
11718
  /* db */
11719
  d_mode,
11720
  d_mode,
11721
  d_mode,
11722
  d_mode,
11723
  0,
11724
  t_mode,
11725
  0,
11726
  t_mode,
11727
  /* dc */
11728
  q_mode,
11729
  q_mode,
11730
  q_mode,
11731
  q_mode,
11732
  q_mode,
11733
  q_mode,
11734
  q_mode,
11735
  q_mode,
11736
  /* dd */
11737
  q_mode,
11738
  q_mode,
11739
  q_mode,
11740
  q_mode,
11741
  0,
11742
  0,
11743
  0,
11744
  w_mode,
11745
  /* de */
11746
  w_mode,
11747
  w_mode,
11748
  w_mode,
11749
  w_mode,
11750
  w_mode,
11751
  w_mode,
11752
  w_mode,
11753
  w_mode,
11754
  /* df */
11755
  w_mode,
11756
  w_mode,
11757
  w_mode,
11758
  w_mode,
11759
  t_mode,
11760
  q_mode,
11761
  t_mode,
11762
  q_mode
11763
};
11764
 
11765
#define ST { OP_ST, 0 }
11766
#define STi { OP_STi, 0 }
11767
 
11768
#define FGRPd9_2 NULL, { { NULL, 0 } }
11769
#define FGRPd9_4 NULL, { { NULL, 1 } }
11770
#define FGRPd9_5 NULL, { { NULL, 2 } }
11771
#define FGRPd9_6 NULL, { { NULL, 3 } }
11772
#define FGRPd9_7 NULL, { { NULL, 4 } }
11773
#define FGRPda_5 NULL, { { NULL, 5 } }
11774
#define FGRPdb_4 NULL, { { NULL, 6 } }
11775
#define FGRPde_3 NULL, { { NULL, 7 } }
11776
#define FGRPdf_4 NULL, { { NULL, 8 } }
11777
 
11778
static const struct dis386 float_reg[][8] = {
11779
  /* d8 */
11780
  {
11781
    { "fadd",   { ST, STi } },
11782
    { "fmul",   { ST, STi } },
11783
    { "fcom",   { STi } },
11784
    { "fcomp",  { STi } },
11785
    { "fsub",   { ST, STi } },
11786
    { "fsubr",  { ST, STi } },
11787
    { "fdiv",   { ST, STi } },
11788
    { "fdivr",  { ST, STi } },
11789
  },
11790
  /* d9 */
11791
  {
11792
    { "fld",    { STi } },
11793
    { "fxch",   { STi } },
11794
    { FGRPd9_2 },
11795
    { Bad_Opcode },
11796
    { FGRPd9_4 },
11797
    { FGRPd9_5 },
11798
    { FGRPd9_6 },
11799
    { FGRPd9_7 },
11800
  },
11801
  /* da */
11802
  {
11803
    { "fcmovb", { ST, STi } },
11804
    { "fcmove", { ST, STi } },
11805
    { "fcmovbe",{ ST, STi } },
11806
    { "fcmovu", { ST, STi } },
11807
    { Bad_Opcode },
11808
    { FGRPda_5 },
11809
    { Bad_Opcode },
11810
    { Bad_Opcode },
11811
  },
11812
  /* db */
11813
  {
11814
    { "fcmovnb",{ ST, STi } },
11815
    { "fcmovne",{ ST, STi } },
11816
    { "fcmovnbe",{ ST, STi } },
11817
    { "fcmovnu",{ ST, STi } },
11818
    { FGRPdb_4 },
11819
    { "fucomi", { ST, STi } },
11820
    { "fcomi",  { ST, STi } },
11821
    { Bad_Opcode },
11822
  },
11823
  /* dc */
11824
  {
11825
    { "fadd",   { STi, ST } },
11826
    { "fmul",   { STi, ST } },
11827
    { Bad_Opcode },
11828
    { Bad_Opcode },
11829
    { "fsub!M", { STi, ST } },
11830
    { "fsubM",  { STi, ST } },
11831
    { "fdiv!M", { STi, ST } },
11832
    { "fdivM",  { STi, ST } },
11833
  },
11834
  /* dd */
11835
  {
11836
    { "ffree",  { STi } },
11837
    { Bad_Opcode },
11838
    { "fst",    { STi } },
11839
    { "fstp",   { STi } },
11840
    { "fucom",  { STi } },
11841
    { "fucomp", { STi } },
11842
    { Bad_Opcode },
11843
    { Bad_Opcode },
11844
  },
11845
  /* de */
11846
  {
11847
    { "faddp",  { STi, ST } },
11848
    { "fmulp",  { STi, ST } },
11849
    { Bad_Opcode },
11850
    { FGRPde_3 },
11851
    { "fsub!Mp", { STi, ST } },
11852
    { "fsubMp", { STi, ST } },
11853
    { "fdiv!Mp", { STi, ST } },
11854
    { "fdivMp", { STi, ST } },
11855
  },
11856
  /* df */
11857
  {
11858
    { "ffreep", { STi } },
11859
    { Bad_Opcode },
11860
    { Bad_Opcode },
11861
    { Bad_Opcode },
11862
    { FGRPdf_4 },
11863
    { "fucomip", { ST, STi } },
11864
    { "fcomip", { ST, STi } },
11865
    { Bad_Opcode },
11866
  },
11867
};
11868
 
11869
static char *fgrps[][8] = {
11870
  /* d9_2  0 */
11871
  {
11872
    "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
11873
  },
11874
 
11875
  /* d9_4  1 */
11876
  {
11877
    "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
11878
  },
11879
 
11880
  /* d9_5  2 */
11881
  {
11882
    "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
11883
  },
11884
 
11885
  /* d9_6  3 */
11886
  {
11887
    "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
11888
  },
11889
 
11890
  /* d9_7  4 */
11891
  {
11892
    "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
11893
  },
11894
 
11895
  /* da_5  5 */
11896
  {
11897
    "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
11898
  },
11899
 
11900
  /* db_4  6 */
11901
  {
11902
    "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
11903
    "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
11904
  },
11905
 
11906
  /* de_3  7 */
11907
  {
11908
    "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
11909
  },
11910
 
11911
  /* df_4  8 */
11912
  {
11913
    "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
11914
  },
11915
};
11916
 
11917
static void
11918
swap_operand (void)
11919
{
11920
  mnemonicendp[0] = '.';
11921
  mnemonicendp[1] = 's';
11922
  mnemonicendp += 2;
11923
}
11924
 
11925
static void
11926
OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
11927
               int sizeflag ATTRIBUTE_UNUSED)
11928
{
11929
  /* Skip mod/rm byte.  */
11930
  MODRM_CHECK;
11931
  codep++;
11932
}
11933
 
11934
static void
11935
dofloat (int sizeflag)
11936
{
11937
  const struct dis386 *dp;
11938
  unsigned char floatop;
11939
 
11940
  floatop = codep[-1];
11941
 
11942
  if (modrm.mod != 3)
11943
    {
11944
      int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
11945
 
11946
      putop (float_mem[fp_indx], sizeflag);
11947
      obufp = op_out[0];
11948
      op_ad = 2;
11949
      OP_E (float_mem_mode[fp_indx], sizeflag);
11950
      return;
11951
    }
11952
  /* Skip mod/rm byte.  */
11953
  MODRM_CHECK;
11954
  codep++;
11955
 
11956
  dp = &float_reg[floatop - 0xd8][modrm.reg];
11957
  if (dp->name == NULL)
11958
    {
11959
      putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
11960
 
11961
      /* Instruction fnstsw is only one with strange arg.  */
11962
      if (floatop == 0xdf && codep[-1] == 0xe0)
11963
        strcpy (op_out[0], names16[0]);
11964
    }
11965
  else
11966
    {
11967
      putop (dp->name, sizeflag);
11968
 
11969
      obufp = op_out[0];
11970
      op_ad = 2;
11971
      if (dp->op[0].rtn)
11972
        (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
11973
 
11974
      obufp = op_out[1];
11975
      op_ad = 1;
11976
      if (dp->op[1].rtn)
11977
        (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
11978
    }
11979
}
11980
 
11981
static void
11982
OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
11983
{
11984
  oappend ("%st" + intel_syntax);
11985
}
11986
 
11987
static void
11988
OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
11989
{
11990
  sprintf (scratchbuf, "%%st(%d)", modrm.rm);
11991
  oappend (scratchbuf + intel_syntax);
11992
}
11993
 
11994
/* Capital letters in template are macros.  */
11995
static int
11996
putop (const char *in_template, int sizeflag)
11997
{
11998
  const char *p;
11999
  int alt = 0;
12000
  int cond = 1;
12001
  unsigned int l = 0, len = 1;
12002
  char last[4];
12003
 
12004
#define SAVE_LAST(c)                    \
12005
  if (l < len && l < sizeof (last))     \
12006
    last[l++] = c;                      \
12007
  else                                  \
12008
    abort ();
12009
 
12010
  for (p = in_template; *p; p++)
12011
    {
12012
      switch (*p)
12013
        {
12014
        default:
12015
          *obufp++ = *p;
12016
          break;
12017
        case '%':
12018
          len++;
12019
          break;
12020
        case '!':
12021
          cond = 0;
12022
          break;
12023
        case '{':
12024
          alt = 0;
12025
          if (intel_syntax)
12026
            {
12027
              while (*++p != '|')
12028
                if (*p == '}' || *p == '\0')
12029
                  abort ();
12030
            }
12031
          /* Fall through.  */
12032
        case 'I':
12033
          alt = 1;
12034
          continue;
12035
        case '|':
12036
          while (*++p != '}')
12037
            {
12038
              if (*p == '\0')
12039
                abort ();
12040
            }
12041
          break;
12042
        case '}':
12043
          break;
12044
        case 'A':
12045
          if (intel_syntax)
12046
            break;
12047
          if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
12048
            *obufp++ = 'b';
12049
          break;
12050
        case 'B':
12051
          if (l == 0 && len == 1)
12052
            {
12053
case_B:
12054
              if (intel_syntax)
12055
                break;
12056
              if (sizeflag & SUFFIX_ALWAYS)
12057
                *obufp++ = 'b';
12058
            }
12059
          else
12060
            {
12061
              if (l != 1
12062
                  || len != 2
12063
                  || last[0] != 'L')
12064
                {
12065
                  SAVE_LAST (*p);
12066
                  break;
12067
                }
12068
 
12069
              if (address_mode == mode_64bit
12070
                  && !(prefixes & PREFIX_ADDR))
12071
                {
12072
                  *obufp++ = 'a';
12073
                  *obufp++ = 'b';
12074
                  *obufp++ = 's';
12075
                }
12076
 
12077
              goto case_B;
12078
            }
12079
          break;
12080
        case 'C':
12081
          if (intel_syntax && !alt)
12082
            break;
12083
          if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
12084
            {
12085
              if (sizeflag & DFLAG)
12086
                *obufp++ = intel_syntax ? 'd' : 'l';
12087
              else
12088
                *obufp++ = intel_syntax ? 'w' : 's';
12089
              used_prefixes |= (prefixes & PREFIX_DATA);
12090
            }
12091
          break;
12092
        case 'D':
12093
          if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
12094
            break;
12095
          USED_REX (REX_W);
12096
          if (modrm.mod == 3)
12097
            {
12098
              if (rex & REX_W)
12099
                *obufp++ = 'q';
12100
              else
12101
                {
12102
                  if (sizeflag & DFLAG)
12103
                    *obufp++ = intel_syntax ? 'd' : 'l';
12104
                  else
12105
                    *obufp++ = 'w';
12106
                  used_prefixes |= (prefixes & PREFIX_DATA);
12107
                }
12108
            }
12109
          else
12110
            *obufp++ = 'w';
12111
          break;
12112
        case 'E':               /* For jcxz/jecxz */
12113
          if (address_mode == mode_64bit)
12114
            {
12115
              if (sizeflag & AFLAG)
12116
                *obufp++ = 'r';
12117
              else
12118
                *obufp++ = 'e';
12119
            }
12120
          else
12121
            if (sizeflag & AFLAG)
12122
              *obufp++ = 'e';
12123
          used_prefixes |= (prefixes & PREFIX_ADDR);
12124
          break;
12125
        case 'F':
12126
          if (intel_syntax)
12127
            break;
12128
          if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
12129
            {
12130
              if (sizeflag & AFLAG)
12131
                *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
12132
              else
12133
                *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
12134
              used_prefixes |= (prefixes & PREFIX_ADDR);
12135
            }
12136
          break;
12137
        case 'G':
12138
          if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
12139
            break;
12140
          if ((rex & REX_W) || (sizeflag & DFLAG))
12141
            *obufp++ = 'l';
12142
          else
12143
            *obufp++ = 'w';
12144
          if (!(rex & REX_W))
12145
            used_prefixes |= (prefixes & PREFIX_DATA);
12146
          break;
12147
        case 'H':
12148
          if (intel_syntax)
12149
            break;
12150
          if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
12151
              || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
12152
            {
12153
              used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
12154
              *obufp++ = ',';
12155
              *obufp++ = 'p';
12156
              if (prefixes & PREFIX_DS)
12157
                *obufp++ = 't';
12158
              else
12159
                *obufp++ = 'n';
12160
            }
12161
          break;
12162
        case 'J':
12163
          if (intel_syntax)
12164
            break;
12165
          *obufp++ = 'l';
12166
          break;
12167
        case 'K':
12168
          USED_REX (REX_W);
12169
          if (rex & REX_W)
12170
            *obufp++ = 'q';
12171
          else
12172
            *obufp++ = 'd';
12173
          break;
12174
        case 'Z':
12175
          if (intel_syntax)
12176
            break;
12177
          if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
12178
            {
12179
              *obufp++ = 'q';
12180
              break;
12181
            }
12182
          /* Fall through.  */
12183
          goto case_L;
12184
        case 'L':
12185
          if (l != 0 || len != 1)
12186
            {
12187
              SAVE_LAST (*p);
12188
              break;
12189
            }
12190
case_L:
12191
          if (intel_syntax)
12192
            break;
12193
          if (sizeflag & SUFFIX_ALWAYS)
12194
            *obufp++ = 'l';
12195
          break;
12196
        case 'M':
12197
          if (intel_mnemonic != cond)
12198
            *obufp++ = 'r';
12199
          break;
12200
        case 'N':
12201
          if ((prefixes & PREFIX_FWAIT) == 0)
12202
            *obufp++ = 'n';
12203
          else
12204
            used_prefixes |= PREFIX_FWAIT;
12205
          break;
12206
        case 'O':
12207
          USED_REX (REX_W);
12208
          if (rex & REX_W)
12209
            *obufp++ = 'o';
12210
          else if (intel_syntax && (sizeflag & DFLAG))
12211
            *obufp++ = 'q';
12212
          else
12213
            *obufp++ = 'd';
12214
          if (!(rex & REX_W))
12215
            used_prefixes |= (prefixes & PREFIX_DATA);
12216
          break;
12217
        case 'T':
12218
          if (!intel_syntax
12219
              && address_mode == mode_64bit
12220
              && (sizeflag & DFLAG))
12221
            {
12222
              *obufp++ = 'q';
12223
              break;
12224
            }
12225
          /* Fall through.  */
12226
        case 'P':
12227
          if (intel_syntax)
12228
            {
12229
              if ((rex & REX_W) == 0
12230
                  && (prefixes & PREFIX_DATA))
12231
                {
12232
                  if ((sizeflag & DFLAG) == 0)
12233
                    *obufp++ = 'w';
12234
                   used_prefixes |= (prefixes & PREFIX_DATA);
12235
                }
12236
              break;
12237
            }
12238
          if ((prefixes & PREFIX_DATA)
12239
              || (rex & REX_W)
12240
              || (sizeflag & SUFFIX_ALWAYS))
12241
            {
12242
              USED_REX (REX_W);
12243
              if (rex & REX_W)
12244
                *obufp++ = 'q';
12245
              else
12246
                {
12247
                   if (sizeflag & DFLAG)
12248
                      *obufp++ = 'l';
12249
                   else
12250
                     *obufp++ = 'w';
12251
                   used_prefixes |= (prefixes & PREFIX_DATA);
12252
                }
12253
            }
12254
          break;
12255
        case 'U':
12256
          if (intel_syntax)
12257
            break;
12258
          if (address_mode == mode_64bit && (sizeflag & DFLAG))
12259
            {
12260
              if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
12261
                *obufp++ = 'q';
12262
              break;
12263
            }
12264
          /* Fall through.  */
12265
          goto case_Q;
12266
        case 'Q':
12267
          if (l == 0 && len == 1)
12268
            {
12269
case_Q:
12270
              if (intel_syntax && !alt)
12271
                break;
12272
              USED_REX (REX_W);
12273
              if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
12274
                {
12275
                  if (rex & REX_W)
12276
                    *obufp++ = 'q';
12277
                  else
12278
                    {
12279
                      if (sizeflag & DFLAG)
12280
                        *obufp++ = intel_syntax ? 'd' : 'l';
12281
                      else
12282
                        *obufp++ = 'w';
12283
                      used_prefixes |= (prefixes & PREFIX_DATA);
12284
                    }
12285
                }
12286
            }
12287
          else
12288
            {
12289
              if (l != 1 || len != 2 || last[0] != 'L')
12290
                {
12291
                  SAVE_LAST (*p);
12292
                  break;
12293
                }
12294
              if (intel_syntax
12295
                  || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
12296
                break;
12297
              if ((rex & REX_W))
12298
                {
12299
                  USED_REX (REX_W);
12300
                  *obufp++ = 'q';
12301
                }
12302
              else
12303
                *obufp++ = 'l';
12304
            }
12305
          break;
12306
        case 'R':
12307
          USED_REX (REX_W);
12308
          if (rex & REX_W)
12309
            *obufp++ = 'q';
12310
          else if (sizeflag & DFLAG)
12311
            {
12312
              if (intel_syntax)
12313
                  *obufp++ = 'd';
12314
              else
12315
                  *obufp++ = 'l';
12316
            }
12317
          else
12318
            *obufp++ = 'w';
12319
          if (intel_syntax && !p[1]
12320
              && ((rex & REX_W) || (sizeflag & DFLAG)))
12321
            *obufp++ = 'e';
12322
          if (!(rex & REX_W))
12323
            used_prefixes |= (prefixes & PREFIX_DATA);
12324
          break;
12325
        case 'V':
12326
          if (l == 0 && len == 1)
12327
            {
12328
              if (intel_syntax)
12329
                break;
12330
              if (address_mode == mode_64bit && (sizeflag & DFLAG))
12331
                {
12332
                  if (sizeflag & SUFFIX_ALWAYS)
12333
                    *obufp++ = 'q';
12334
                  break;
12335
                }
12336
            }
12337
          else
12338
            {
12339
              if (l != 1
12340
                  || len != 2
12341
                  || last[0] != 'L')
12342
                {
12343
                  SAVE_LAST (*p);
12344
                  break;
12345
                }
12346
 
12347
              if (rex & REX_W)
12348
                {
12349
                  *obufp++ = 'a';
12350
                  *obufp++ = 'b';
12351
                  *obufp++ = 's';
12352
                }
12353
            }
12354
          /* Fall through.  */
12355
          goto case_S;
12356
        case 'S':
12357
          if (l == 0 && len == 1)
12358
            {
12359
case_S:
12360
              if (intel_syntax)
12361
                break;
12362
              if (sizeflag & SUFFIX_ALWAYS)
12363
                {
12364
                  if (rex & REX_W)
12365
                    *obufp++ = 'q';
12366
                  else
12367
                    {
12368
                      if (sizeflag & DFLAG)
12369
                        *obufp++ = 'l';
12370
                      else
12371
                        *obufp++ = 'w';
12372
                      used_prefixes |= (prefixes & PREFIX_DATA);
12373
                    }
12374
                }
12375
            }
12376
          else
12377
            {
12378
              if (l != 1
12379
                  || len != 2
12380
                  || last[0] != 'L')
12381
                {
12382
                  SAVE_LAST (*p);
12383
                  break;
12384
                }
12385
 
12386
              if (address_mode == mode_64bit
12387
                  && !(prefixes & PREFIX_ADDR))
12388
                {
12389
                  *obufp++ = 'a';
12390
                  *obufp++ = 'b';
12391
                  *obufp++ = 's';
12392
                }
12393
 
12394
              goto case_S;
12395
            }
12396
          break;
12397
        case 'X':
12398
          if (l != 0 || len != 1)
12399
            {
12400
              SAVE_LAST (*p);
12401
              break;
12402
            }
12403
          if (need_vex && vex.prefix)
12404
            {
12405
              if (vex.prefix == DATA_PREFIX_OPCODE)
12406
                *obufp++ = 'd';
12407
              else
12408
                *obufp++ = 's';
12409
            }
12410
          else
12411
            {
12412
              if (prefixes & PREFIX_DATA)
12413
                *obufp++ = 'd';
12414
              else
12415
                *obufp++ = 's';
12416
              used_prefixes |= (prefixes & PREFIX_DATA);
12417
            }
12418
          break;
12419
        case 'Y':
12420
          if (l == 0 && len == 1)
12421
            {
12422
              if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
12423
                break;
12424
              if (rex & REX_W)
12425
                {
12426
                  USED_REX (REX_W);
12427
                  *obufp++ = 'q';
12428
                }
12429
              break;
12430
            }
12431
          else
12432
            {
12433
              if (l != 1 || len != 2 || last[0] != 'X')
12434
                {
12435
                  SAVE_LAST (*p);
12436
                  break;
12437
                }
12438
              if (!need_vex)
12439
                abort ();
12440
              if (intel_syntax
12441
                  || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
12442
                break;
12443
              switch (vex.length)
12444
                {
12445
                case 128:
12446
                  *obufp++ = 'x';
12447
                  break;
12448
                case 256:
12449
                  *obufp++ = 'y';
12450
                  break;
12451
                default:
12452
                  abort ();
12453
                }
12454
            }
12455
          break;
12456
        case 'W':
12457
          if (l == 0 && len == 1)
12458
            {
12459
              /* operand size flag for cwtl, cbtw */
12460
              USED_REX (REX_W);
12461
              if (rex & REX_W)
12462
                {
12463
                  if (intel_syntax)
12464
                    *obufp++ = 'd';
12465
                  else
12466
                    *obufp++ = 'l';
12467
                }
12468
              else if (sizeflag & DFLAG)
12469
                *obufp++ = 'w';
12470
              else
12471
                *obufp++ = 'b';
12472
              if (!(rex & REX_W))
12473
                used_prefixes |= (prefixes & PREFIX_DATA);
12474
            }
12475
          else
12476
            {
12477 148 khays
              if (l != 1
12478
                  || len != 2
12479
                  || (last[0] != 'X'
12480
                      && last[0] != 'L'))
12481 18 khays
                {
12482
                  SAVE_LAST (*p);
12483
                  break;
12484
                }
12485
              if (!need_vex)
12486
                abort ();
12487 148 khays
              if (last[0] == 'X')
12488
                *obufp++ = vex.w ? 'd': 's';
12489
              else
12490
                *obufp++ = vex.w ? 'q': 'd';
12491 18 khays
            }
12492
          break;
12493
        }
12494
      alt = 0;
12495
    }
12496
  *obufp = 0;
12497
  mnemonicendp = obufp;
12498
  return 0;
12499
}
12500
 
12501
static void
12502
oappend (const char *s)
12503
{
12504
  obufp = stpcpy (obufp, s);
12505
}
12506
 
12507
static void
12508
append_seg (void)
12509
{
12510
  if (prefixes & PREFIX_CS)
12511
    {
12512
      used_prefixes |= PREFIX_CS;
12513
      oappend ("%cs:" + intel_syntax);
12514
    }
12515
  if (prefixes & PREFIX_DS)
12516
    {
12517
      used_prefixes |= PREFIX_DS;
12518
      oappend ("%ds:" + intel_syntax);
12519
    }
12520
  if (prefixes & PREFIX_SS)
12521
    {
12522
      used_prefixes |= PREFIX_SS;
12523
      oappend ("%ss:" + intel_syntax);
12524
    }
12525
  if (prefixes & PREFIX_ES)
12526
    {
12527
      used_prefixes |= PREFIX_ES;
12528
      oappend ("%es:" + intel_syntax);
12529
    }
12530
  if (prefixes & PREFIX_FS)
12531
    {
12532
      used_prefixes |= PREFIX_FS;
12533
      oappend ("%fs:" + intel_syntax);
12534
    }
12535
  if (prefixes & PREFIX_GS)
12536
    {
12537
      used_prefixes |= PREFIX_GS;
12538
      oappend ("%gs:" + intel_syntax);
12539
    }
12540
}
12541
 
12542
static void
12543
OP_indirE (int bytemode, int sizeflag)
12544
{
12545
  if (!intel_syntax)
12546
    oappend ("*");
12547
  OP_E (bytemode, sizeflag);
12548
}
12549
 
12550
static void
12551
print_operand_value (char *buf, int hex, bfd_vma disp)
12552
{
12553
  if (address_mode == mode_64bit)
12554
    {
12555
      if (hex)
12556
        {
12557
          char tmp[30];
12558
          int i;
12559
          buf[0] = '0';
12560
          buf[1] = 'x';
12561
          sprintf_vma (tmp, disp);
12562
          for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
12563
          strcpy (buf + 2, tmp + i);
12564
        }
12565
      else
12566
        {
12567
          bfd_signed_vma v = disp;
12568
          char tmp[30];
12569
          int i;
12570
          if (v < 0)
12571
            {
12572
              *(buf++) = '-';
12573
              v = -disp;
12574
              /* Check for possible overflow on 0x8000000000000000.  */
12575
              if (v < 0)
12576
                {
12577
                  strcpy (buf, "9223372036854775808");
12578
                  return;
12579
                }
12580
            }
12581
          if (!v)
12582
            {
12583
              strcpy (buf, "0");
12584
              return;
12585
            }
12586
 
12587
          i = 0;
12588
          tmp[29] = 0;
12589
          while (v)
12590
            {
12591
              tmp[28 - i] = (v % 10) + '0';
12592
              v /= 10;
12593
              i++;
12594
            }
12595
          strcpy (buf, tmp + 29 - i);
12596
        }
12597
    }
12598
  else
12599
    {
12600
      if (hex)
12601
        sprintf (buf, "0x%x", (unsigned int) disp);
12602
      else
12603
        sprintf (buf, "%d", (int) disp);
12604
    }
12605
}
12606
 
12607
/* Put DISP in BUF as signed hex number.  */
12608
 
12609
static void
12610
print_displacement (char *buf, bfd_vma disp)
12611
{
12612
  bfd_signed_vma val = disp;
12613
  char tmp[30];
12614
  int i, j = 0;
12615
 
12616
  if (val < 0)
12617
    {
12618
      buf[j++] = '-';
12619
      val = -disp;
12620
 
12621
      /* Check for possible overflow.  */
12622
      if (val < 0)
12623
        {
12624
          switch (address_mode)
12625
            {
12626
            case mode_64bit:
12627
              strcpy (buf + j, "0x8000000000000000");
12628
              break;
12629
            case mode_32bit:
12630
              strcpy (buf + j, "0x80000000");
12631
              break;
12632
            case mode_16bit:
12633
              strcpy (buf + j, "0x8000");
12634
              break;
12635
            }
12636
          return;
12637
        }
12638
    }
12639
 
12640
  buf[j++] = '0';
12641
  buf[j++] = 'x';
12642
 
12643
  sprintf_vma (tmp, (bfd_vma) val);
12644
  for (i = 0; tmp[i] == '0'; i++)
12645
    continue;
12646
  if (tmp[i] == '\0')
12647
    i--;
12648
  strcpy (buf + j, tmp + i);
12649
}
12650
 
12651
static void
12652
intel_operand_size (int bytemode, int sizeflag)
12653
{
12654
  switch (bytemode)
12655
    {
12656
    case b_mode:
12657
    case b_swap_mode:
12658
    case dqb_mode:
12659
      oappend ("BYTE PTR ");
12660
      break;
12661
    case w_mode:
12662
    case dqw_mode:
12663
      oappend ("WORD PTR ");
12664
      break;
12665
    case stack_v_mode:
12666
      if (address_mode == mode_64bit && (sizeflag & DFLAG))
12667
        {
12668
          oappend ("QWORD PTR ");
12669
          break;
12670
        }
12671
      /* FALLTHRU */
12672
    case v_mode:
12673
    case v_swap_mode:
12674
    case dq_mode:
12675
      USED_REX (REX_W);
12676
      if (rex & REX_W)
12677
        oappend ("QWORD PTR ");
12678
      else
12679
        {
12680
          if ((sizeflag & DFLAG) || bytemode == dq_mode)
12681
            oappend ("DWORD PTR ");
12682
          else
12683
            oappend ("WORD PTR ");
12684
          used_prefixes |= (prefixes & PREFIX_DATA);
12685
        }
12686
      break;
12687
    case z_mode:
12688
      if ((rex & REX_W) || (sizeflag & DFLAG))
12689
        *obufp++ = 'D';
12690
      oappend ("WORD PTR ");
12691
      if (!(rex & REX_W))
12692
        used_prefixes |= (prefixes & PREFIX_DATA);
12693
      break;
12694
    case a_mode:
12695
      if (sizeflag & DFLAG)
12696
        oappend ("QWORD PTR ");
12697
      else
12698
        oappend ("DWORD PTR ");
12699
      used_prefixes |= (prefixes & PREFIX_DATA);
12700
      break;
12701
    case d_mode:
12702
    case d_scalar_mode:
12703
    case d_scalar_swap_mode:
12704
    case d_swap_mode:
12705
    case dqd_mode:
12706
      oappend ("DWORD PTR ");
12707
      break;
12708
    case q_mode:
12709
    case q_scalar_mode:
12710
    case q_scalar_swap_mode:
12711
    case q_swap_mode:
12712
      oappend ("QWORD PTR ");
12713
      break;
12714
    case m_mode:
12715
      if (address_mode == mode_64bit)
12716
        oappend ("QWORD PTR ");
12717
      else
12718
        oappend ("DWORD PTR ");
12719
      break;
12720
    case f_mode:
12721
      if (sizeflag & DFLAG)
12722
        oappend ("FWORD PTR ");
12723
      else
12724
        oappend ("DWORD PTR ");
12725
      used_prefixes |= (prefixes & PREFIX_DATA);
12726
      break;
12727
    case t_mode:
12728
      oappend ("TBYTE PTR ");
12729
      break;
12730
    case x_mode:
12731
    case x_swap_mode:
12732
      if (need_vex)
12733
        {
12734
          switch (vex.length)
12735
            {
12736
            case 128:
12737
              oappend ("XMMWORD PTR ");
12738
              break;
12739
            case 256:
12740
              oappend ("YMMWORD PTR ");
12741
              break;
12742
            default:
12743
              abort ();
12744
            }
12745
        }
12746
      else
12747
        oappend ("XMMWORD PTR ");
12748
      break;
12749
    case xmm_mode:
12750
      oappend ("XMMWORD PTR ");
12751
      break;
12752
    case xmmq_mode:
12753
      if (!need_vex)
12754
        abort ();
12755
 
12756
      switch (vex.length)
12757
        {
12758
        case 128:
12759
          oappend ("QWORD PTR ");
12760
          break;
12761
        case 256:
12762
          oappend ("XMMWORD PTR ");
12763
          break;
12764
        default:
12765
          abort ();
12766
        }
12767
      break;
12768 148 khays
    case xmm_mb_mode:
12769
      if (!need_vex)
12770
        abort ();
12771
 
12772
      switch (vex.length)
12773
        {
12774
        case 128:
12775
        case 256:
12776
          oappend ("BYTE PTR ");
12777
          break;
12778
        default:
12779
          abort ();
12780
        }
12781
      break;
12782
    case xmm_mw_mode:
12783
      if (!need_vex)
12784
        abort ();
12785
 
12786
      switch (vex.length)
12787
        {
12788
        case 128:
12789
        case 256:
12790
          oappend ("WORD PTR ");
12791
          break;
12792
        default:
12793
          abort ();
12794
        }
12795
      break;
12796
    case xmm_md_mode:
12797
      if (!need_vex)
12798
        abort ();
12799
 
12800
      switch (vex.length)
12801
        {
12802
        case 128:
12803
        case 256:
12804
          oappend ("DWORD PTR ");
12805
          break;
12806
        default:
12807
          abort ();
12808
        }
12809
      break;
12810
    case xmm_mq_mode:
12811
      if (!need_vex)
12812
        abort ();
12813
 
12814
      switch (vex.length)
12815
        {
12816
        case 128:
12817
        case 256:
12818
          oappend ("QWORD PTR ");
12819
          break;
12820
        default:
12821
          abort ();
12822
        }
12823
      break;
12824
    case xmmdw_mode:
12825
      if (!need_vex)
12826
        abort ();
12827
 
12828
      switch (vex.length)
12829
        {
12830
        case 128:
12831
          oappend ("WORD PTR ");
12832
          break;
12833
        case 256:
12834
          oappend ("DWORD PTR ");
12835
          break;
12836
        default:
12837
          abort ();
12838
        }
12839
      break;
12840
    case xmmqd_mode:
12841
      if (!need_vex)
12842
        abort ();
12843
 
12844
      switch (vex.length)
12845
        {
12846
        case 128:
12847
          oappend ("DWORD PTR ");
12848
          break;
12849
        case 256:
12850
          oappend ("QWORD PTR ");
12851
          break;
12852
        default:
12853
          abort ();
12854
        }
12855
      break;
12856 18 khays
    case ymmq_mode:
12857
      if (!need_vex)
12858
        abort ();
12859
 
12860
      switch (vex.length)
12861
        {
12862
        case 128:
12863
          oappend ("QWORD PTR ");
12864
          break;
12865
        case 256:
12866
          oappend ("YMMWORD PTR ");
12867
          break;
12868
        default:
12869
          abort ();
12870
        }
12871
      break;
12872 148 khays
    case ymmxmm_mode:
12873
      if (!need_vex)
12874
        abort ();
12875
 
12876
      switch (vex.length)
12877
        {
12878
        case 128:
12879
        case 256:
12880
          oappend ("XMMWORD PTR ");
12881
          break;
12882
        default:
12883
          abort ();
12884
        }
12885
      break;
12886 18 khays
    case o_mode:
12887
      oappend ("OWORD PTR ");
12888
      break;
12889
    case vex_w_dq_mode:
12890
    case vex_scalar_w_dq_mode:
12891 148 khays
    case vex_vsib_d_w_dq_mode:
12892
    case vex_vsib_q_w_dq_mode:
12893 18 khays
      if (!need_vex)
12894
        abort ();
12895
 
12896
      if (vex.w)
12897
        oappend ("QWORD PTR ");
12898
      else
12899
        oappend ("DWORD PTR ");
12900
      break;
12901
    default:
12902
      break;
12903
    }
12904
}
12905
 
12906
static void
12907
OP_E_register (int bytemode, int sizeflag)
12908
{
12909
  int reg = modrm.rm;
12910
  const char **names;
12911
 
12912
  USED_REX (REX_B);
12913
  if ((rex & REX_B))
12914
    reg += 8;
12915
 
12916
  if ((sizeflag & SUFFIX_ALWAYS)
12917
      && (bytemode == b_swap_mode || bytemode == v_swap_mode))
12918
    swap_operand ();
12919
 
12920
  switch (bytemode)
12921
    {
12922
    case b_mode:
12923
    case b_swap_mode:
12924
      USED_REX (0);
12925
      if (rex)
12926
        names = names8rex;
12927
      else
12928
        names = names8;
12929
      break;
12930
    case w_mode:
12931
      names = names16;
12932
      break;
12933
    case d_mode:
12934
      names = names32;
12935
      break;
12936
    case q_mode:
12937
      names = names64;
12938
      break;
12939
    case m_mode:
12940
      names = address_mode == mode_64bit ? names64 : names32;
12941
      break;
12942
    case stack_v_mode:
12943
      if (address_mode == mode_64bit && (sizeflag & DFLAG))
12944
        {
12945
          names = names64;
12946
          break;
12947
        }
12948
      bytemode = v_mode;
12949
      /* FALLTHRU */
12950
    case v_mode:
12951
    case v_swap_mode:
12952
    case dq_mode:
12953
    case dqb_mode:
12954
    case dqd_mode:
12955
    case dqw_mode:
12956
      USED_REX (REX_W);
12957
      if (rex & REX_W)
12958
        names = names64;
12959
      else
12960
        {
12961
          if ((sizeflag & DFLAG)
12962
              || (bytemode != v_mode
12963
                  && bytemode != v_swap_mode))
12964
            names = names32;
12965
          else
12966
            names = names16;
12967
          used_prefixes |= (prefixes & PREFIX_DATA);
12968
        }
12969
      break;
12970
    case 0:
12971
      return;
12972
    default:
12973
      oappend (INTERNAL_DISASSEMBLER_ERROR);
12974
      return;
12975
    }
12976
  oappend (names[reg]);
12977
}
12978
 
12979
static void
12980
OP_E_memory (int bytemode, int sizeflag)
12981
{
12982
  bfd_vma disp = 0;
12983
  int add = (rex & REX_B) ? 8 : 0;
12984
  int riprel = 0;
12985
 
12986
  USED_REX (REX_B);
12987
  if (intel_syntax)
12988
    intel_operand_size (bytemode, sizeflag);
12989
  append_seg ();
12990
 
12991
  if ((sizeflag & AFLAG) || address_mode == mode_64bit)
12992
    {
12993
      /* 32/64 bit address mode */
12994
      int havedisp;
12995
      int havesib;
12996
      int havebase;
12997
      int haveindex;
12998
      int needindex;
12999
      int base, rbase;
13000
      int vindex = 0;
13001
      int scale = 0;
13002 148 khays
      const char **indexes64 = names64;
13003
      const char **indexes32 = names32;
13004 18 khays
 
13005
      havesib = 0;
13006
      havebase = 1;
13007
      haveindex = 0;
13008
      base = modrm.rm;
13009
 
13010
      if (base == 4)
13011
        {
13012
          havesib = 1;
13013
          vindex = sib.index;
13014
          USED_REX (REX_X);
13015
          if (rex & REX_X)
13016
            vindex += 8;
13017 148 khays
          switch (bytemode)
13018
            {
13019
            case vex_vsib_d_w_dq_mode:
13020
            case vex_vsib_q_w_dq_mode:
13021
              if (!need_vex)
13022
                abort ();
13023
 
13024
              haveindex = 1;
13025
              switch (vex.length)
13026
                {
13027
                case 128:
13028
                  indexes64 = indexes32 = names_xmm;
13029
                  break;
13030
                case 256:
13031
                  if (!vex.w || bytemode == vex_vsib_q_w_dq_mode)
13032
                    indexes64 = indexes32 = names_ymm;
13033
                  else
13034
                    indexes64 = indexes32 = names_xmm;
13035
                  break;
13036
                default:
13037
                  abort ();
13038
                }
13039
              break;
13040
            default:
13041
              haveindex = vindex != 4;
13042
              break;
13043
            }
13044
          scale = sib.scale;
13045
          base = sib.base;
13046 18 khays
          codep++;
13047
        }
13048
      rbase = base + add;
13049
 
13050
      switch (modrm.mod)
13051
        {
13052
        case 0:
13053
          if (base == 5)
13054
            {
13055
              havebase = 0;
13056
              if (address_mode == mode_64bit && !havesib)
13057
                riprel = 1;
13058
              disp = get32s ();
13059
            }
13060
          break;
13061
        case 1:
13062
          FETCH_DATA (the_info, codep + 1);
13063
          disp = *codep++;
13064
          if ((disp & 0x80) != 0)
13065
            disp -= 0x100;
13066
          break;
13067
        case 2:
13068
          disp = get32s ();
13069
          break;
13070
        }
13071
 
13072
      /* In 32bit mode, we need index register to tell [offset] from
13073
         [eiz*1 + offset].  */
13074
      needindex = (havesib
13075
                   && !havebase
13076
                   && !haveindex
13077
                   && address_mode == mode_32bit);
13078
      havedisp = (havebase
13079
                  || needindex
13080
                  || (havesib && (haveindex || scale != 0)));
13081
 
13082
      if (!intel_syntax)
13083
        if (modrm.mod != 0 || base == 5)
13084
          {
13085
            if (havedisp || riprel)
13086
              print_displacement (scratchbuf, disp);
13087
            else
13088
              print_operand_value (scratchbuf, 1, disp);
13089
            oappend (scratchbuf);
13090
            if (riprel)
13091
              {
13092
                set_op (disp, 1);
13093
                oappend (sizeflag & AFLAG ? "(%rip)" : "(%eip)");
13094
              }
13095
          }
13096
 
13097
      if (havebase || haveindex || riprel)
13098
        used_prefixes |= PREFIX_ADDR;
13099
 
13100
      if (havedisp || (intel_syntax && riprel))
13101
        {
13102
          *obufp++ = open_char;
13103
          if (intel_syntax && riprel)
13104
            {
13105
              set_op (disp, 1);
13106
              oappend (sizeflag & AFLAG ? "rip" : "eip");
13107
            }
13108
          *obufp = '\0';
13109
          if (havebase)
13110
            oappend (address_mode == mode_64bit && (sizeflag & AFLAG)
13111
                     ? names64[rbase] : names32[rbase]);
13112
          if (havesib)
13113
            {
13114
              /* ESP/RSP won't allow index.  If base isn't ESP/RSP,
13115
                 print index to tell base + index from base.  */
13116
              if (scale != 0
13117
                  || needindex
13118
                  || haveindex
13119
                  || (havebase && base != ESP_REG_NUM))
13120
                {
13121
                  if (!intel_syntax || havebase)
13122
                    {
13123
                      *obufp++ = separator_char;
13124
                      *obufp = '\0';
13125
                    }
13126
                  if (haveindex)
13127
                    oappend (address_mode == mode_64bit
13128
                             && (sizeflag & AFLAG)
13129 148 khays
                             ? indexes64[vindex] : indexes32[vindex]);
13130 18 khays
                  else
13131
                    oappend (address_mode == mode_64bit
13132
                             && (sizeflag & AFLAG)
13133
                             ? index64 : index32);
13134
 
13135
                  *obufp++ = scale_char;
13136
                  *obufp = '\0';
13137
                  sprintf (scratchbuf, "%d", 1 << scale);
13138
                  oappend (scratchbuf);
13139
                }
13140
            }
13141
          if (intel_syntax
13142
              && (disp || modrm.mod != 0 || base == 5))
13143
            {
13144
              if (!havedisp || (bfd_signed_vma) disp >= 0)
13145
                {
13146
                  *obufp++ = '+';
13147
                  *obufp = '\0';
13148
                }
13149
              else if (modrm.mod != 1 && disp != -disp)
13150
                {
13151
                  *obufp++ = '-';
13152
                  *obufp = '\0';
13153
                  disp = - (bfd_signed_vma) disp;
13154
                }
13155
 
13156
              if (havedisp)
13157
                print_displacement (scratchbuf, disp);
13158
              else
13159
                print_operand_value (scratchbuf, 1, disp);
13160
              oappend (scratchbuf);
13161
            }
13162
 
13163
          *obufp++ = close_char;
13164
          *obufp = '\0';
13165
        }
13166
      else if (intel_syntax)
13167
        {
13168
          if (modrm.mod != 0 || base == 5)
13169
            {
13170
              if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
13171
                              | PREFIX_ES | PREFIX_FS | PREFIX_GS))
13172
                ;
13173
              else
13174
                {
13175
                  oappend (names_seg[ds_reg - es_reg]);
13176
                  oappend (":");
13177
                }
13178
              print_operand_value (scratchbuf, 1, disp);
13179
              oappend (scratchbuf);
13180
            }
13181
        }
13182
    }
13183
  else
13184
    {
13185
      /* 16 bit address mode */
13186
      used_prefixes |= prefixes & PREFIX_ADDR;
13187
      switch (modrm.mod)
13188
        {
13189
        case 0:
13190
          if (modrm.rm == 6)
13191
            {
13192
              disp = get16 ();
13193
              if ((disp & 0x8000) != 0)
13194
                disp -= 0x10000;
13195
            }
13196
          break;
13197
        case 1:
13198
          FETCH_DATA (the_info, codep + 1);
13199
          disp = *codep++;
13200
          if ((disp & 0x80) != 0)
13201
            disp -= 0x100;
13202
          break;
13203
        case 2:
13204
          disp = get16 ();
13205
          if ((disp & 0x8000) != 0)
13206
            disp -= 0x10000;
13207
          break;
13208
        }
13209
 
13210
      if (!intel_syntax)
13211
        if (modrm.mod != 0 || modrm.rm == 6)
13212
          {
13213
            print_displacement (scratchbuf, disp);
13214
            oappend (scratchbuf);
13215
          }
13216
 
13217
      if (modrm.mod != 0 || modrm.rm != 6)
13218
        {
13219
          *obufp++ = open_char;
13220
          *obufp = '\0';
13221
          oappend (index16[modrm.rm]);
13222
          if (intel_syntax
13223
              && (disp || modrm.mod != 0 || modrm.rm == 6))
13224
            {
13225
              if ((bfd_signed_vma) disp >= 0)
13226
                {
13227
                  *obufp++ = '+';
13228
                  *obufp = '\0';
13229
                }
13230
              else if (modrm.mod != 1)
13231
                {
13232
                  *obufp++ = '-';
13233
                  *obufp = '\0';
13234
                  disp = - (bfd_signed_vma) disp;
13235
                }
13236
 
13237
              print_displacement (scratchbuf, disp);
13238
              oappend (scratchbuf);
13239
            }
13240
 
13241
          *obufp++ = close_char;
13242
          *obufp = '\0';
13243
        }
13244
      else if (intel_syntax)
13245
        {
13246
          if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
13247
                          | PREFIX_ES | PREFIX_FS | PREFIX_GS))
13248
            ;
13249
          else
13250
            {
13251
              oappend (names_seg[ds_reg - es_reg]);
13252
              oappend (":");
13253
            }
13254
          print_operand_value (scratchbuf, 1, disp & 0xffff);
13255
          oappend (scratchbuf);
13256
        }
13257
    }
13258
}
13259
 
13260
static void
13261
OP_E (int bytemode, int sizeflag)
13262
{
13263
  /* Skip mod/rm byte.  */
13264
  MODRM_CHECK;
13265
  codep++;
13266
 
13267
  if (modrm.mod == 3)
13268
    OP_E_register (bytemode, sizeflag);
13269
  else
13270
    OP_E_memory (bytemode, sizeflag);
13271
}
13272
 
13273
static void
13274
OP_G (int bytemode, int sizeflag)
13275
{
13276
  int add = 0;
13277
  USED_REX (REX_R);
13278
  if (rex & REX_R)
13279
    add += 8;
13280
  switch (bytemode)
13281
    {
13282
    case b_mode:
13283
      USED_REX (0);
13284
      if (rex)
13285
        oappend (names8rex[modrm.reg + add]);
13286
      else
13287
        oappend (names8[modrm.reg + add]);
13288
      break;
13289
    case w_mode:
13290
      oappend (names16[modrm.reg + add]);
13291
      break;
13292
    case d_mode:
13293
      oappend (names32[modrm.reg + add]);
13294
      break;
13295
    case q_mode:
13296
      oappend (names64[modrm.reg + add]);
13297
      break;
13298
    case v_mode:
13299
    case dq_mode:
13300
    case dqb_mode:
13301
    case dqd_mode:
13302
    case dqw_mode:
13303
      USED_REX (REX_W);
13304
      if (rex & REX_W)
13305
        oappend (names64[modrm.reg + add]);
13306
      else
13307
        {
13308
          if ((sizeflag & DFLAG) || bytemode != v_mode)
13309
            oappend (names32[modrm.reg + add]);
13310
          else
13311
            oappend (names16[modrm.reg + add]);
13312
          used_prefixes |= (prefixes & PREFIX_DATA);
13313
        }
13314
      break;
13315
    case m_mode:
13316
      if (address_mode == mode_64bit)
13317
        oappend (names64[modrm.reg + add]);
13318
      else
13319
        oappend (names32[modrm.reg + add]);
13320
      break;
13321
    default:
13322
      oappend (INTERNAL_DISASSEMBLER_ERROR);
13323
      break;
13324
    }
13325
}
13326
 
13327
static bfd_vma
13328
get64 (void)
13329
{
13330
  bfd_vma x;
13331
#ifdef BFD64
13332
  unsigned int a;
13333
  unsigned int b;
13334
 
13335
  FETCH_DATA (the_info, codep + 8);
13336
  a = *codep++ & 0xff;
13337
  a |= (*codep++ & 0xff) << 8;
13338
  a |= (*codep++ & 0xff) << 16;
13339
  a |= (*codep++ & 0xff) << 24;
13340
  b = *codep++ & 0xff;
13341
  b |= (*codep++ & 0xff) << 8;
13342
  b |= (*codep++ & 0xff) << 16;
13343
  b |= (*codep++ & 0xff) << 24;
13344
  x = a + ((bfd_vma) b << 32);
13345
#else
13346
  abort ();
13347
  x = 0;
13348
#endif
13349
  return x;
13350
}
13351
 
13352
static bfd_signed_vma
13353
get32 (void)
13354
{
13355
  bfd_signed_vma x = 0;
13356
 
13357
  FETCH_DATA (the_info, codep + 4);
13358
  x = *codep++ & (bfd_signed_vma) 0xff;
13359
  x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
13360
  x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
13361
  x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
13362
  return x;
13363
}
13364
 
13365
static bfd_signed_vma
13366
get32s (void)
13367
{
13368
  bfd_signed_vma x = 0;
13369
 
13370
  FETCH_DATA (the_info, codep + 4);
13371
  x = *codep++ & (bfd_signed_vma) 0xff;
13372
  x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
13373
  x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
13374
  x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
13375
 
13376
  x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
13377
 
13378
  return x;
13379
}
13380
 
13381
static int
13382
get16 (void)
13383
{
13384
  int x = 0;
13385
 
13386
  FETCH_DATA (the_info, codep + 2);
13387
  x = *codep++ & 0xff;
13388
  x |= (*codep++ & 0xff) << 8;
13389
  return x;
13390
}
13391
 
13392
static void
13393
set_op (bfd_vma op, int riprel)
13394
{
13395
  op_index[op_ad] = op_ad;
13396
  if (address_mode == mode_64bit)
13397
    {
13398
      op_address[op_ad] = op;
13399
      op_riprel[op_ad] = riprel;
13400
    }
13401
  else
13402
    {
13403
      /* Mask to get a 32-bit address.  */
13404
      op_address[op_ad] = op & 0xffffffff;
13405
      op_riprel[op_ad] = riprel & 0xffffffff;
13406
    }
13407
}
13408
 
13409
static void
13410
OP_REG (int code, int sizeflag)
13411
{
13412
  const char *s;
13413
  int add;
13414
  USED_REX (REX_B);
13415
  if (rex & REX_B)
13416
    add = 8;
13417
  else
13418
    add = 0;
13419
 
13420
  switch (code)
13421
    {
13422
    case ax_reg: case cx_reg: case dx_reg: case bx_reg:
13423
    case sp_reg: case bp_reg: case si_reg: case di_reg:
13424
      s = names16[code - ax_reg + add];
13425
      break;
13426
    case es_reg: case ss_reg: case cs_reg:
13427
    case ds_reg: case fs_reg: case gs_reg:
13428
      s = names_seg[code - es_reg + add];
13429
      break;
13430
    case al_reg: case ah_reg: case cl_reg: case ch_reg:
13431
    case dl_reg: case dh_reg: case bl_reg: case bh_reg:
13432
      USED_REX (0);
13433
      if (rex)
13434
        s = names8rex[code - al_reg + add];
13435
      else
13436
        s = names8[code - al_reg];
13437
      break;
13438
    case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
13439
    case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
13440
      if (address_mode == mode_64bit && (sizeflag & DFLAG))
13441
        {
13442
          s = names64[code - rAX_reg + add];
13443
          break;
13444
        }
13445
      code += eAX_reg - rAX_reg;
13446
      /* Fall through.  */
13447
    case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
13448
    case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
13449
      USED_REX (REX_W);
13450
      if (rex & REX_W)
13451
        s = names64[code - eAX_reg + add];
13452
      else
13453
        {
13454
          if (sizeflag & DFLAG)
13455
            s = names32[code - eAX_reg + add];
13456
          else
13457
            s = names16[code - eAX_reg + add];
13458
          used_prefixes |= (prefixes & PREFIX_DATA);
13459
        }
13460
      break;
13461
    default:
13462
      s = INTERNAL_DISASSEMBLER_ERROR;
13463
      break;
13464
    }
13465
  oappend (s);
13466
}
13467
 
13468
static void
13469
OP_IMREG (int code, int sizeflag)
13470
{
13471
  const char *s;
13472
 
13473
  switch (code)
13474
    {
13475
    case indir_dx_reg:
13476
      if (intel_syntax)
13477
        s = "dx";
13478
      else
13479
        s = "(%dx)";
13480
      break;
13481
    case ax_reg: case cx_reg: case dx_reg: case bx_reg:
13482
    case sp_reg: case bp_reg: case si_reg: case di_reg:
13483
      s = names16[code - ax_reg];
13484
      break;
13485
    case es_reg: case ss_reg: case cs_reg:
13486
    case ds_reg: case fs_reg: case gs_reg:
13487
      s = names_seg[code - es_reg];
13488
      break;
13489
    case al_reg: case ah_reg: case cl_reg: case ch_reg:
13490
    case dl_reg: case dh_reg: case bl_reg: case bh_reg:
13491
      USED_REX (0);
13492
      if (rex)
13493
        s = names8rex[code - al_reg];
13494
      else
13495
        s = names8[code - al_reg];
13496
      break;
13497
    case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
13498
    case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
13499
      USED_REX (REX_W);
13500
      if (rex & REX_W)
13501
        s = names64[code - eAX_reg];
13502
      else
13503
        {
13504
          if (sizeflag & DFLAG)
13505
            s = names32[code - eAX_reg];
13506
          else
13507
            s = names16[code - eAX_reg];
13508
          used_prefixes |= (prefixes & PREFIX_DATA);
13509
        }
13510
      break;
13511
    case z_mode_ax_reg:
13512
      if ((rex & REX_W) || (sizeflag & DFLAG))
13513
        s = *names32;
13514
      else
13515
        s = *names16;
13516
      if (!(rex & REX_W))
13517
        used_prefixes |= (prefixes & PREFIX_DATA);
13518
      break;
13519
    default:
13520
      s = INTERNAL_DISASSEMBLER_ERROR;
13521
      break;
13522
    }
13523
  oappend (s);
13524
}
13525
 
13526
static void
13527
OP_I (int bytemode, int sizeflag)
13528
{
13529
  bfd_signed_vma op;
13530
  bfd_signed_vma mask = -1;
13531
 
13532
  switch (bytemode)
13533
    {
13534
    case b_mode:
13535
      FETCH_DATA (the_info, codep + 1);
13536
      op = *codep++;
13537
      mask = 0xff;
13538
      break;
13539
    case q_mode:
13540
      if (address_mode == mode_64bit)
13541
        {
13542
          op = get32s ();
13543
          break;
13544
        }
13545
      /* Fall through.  */
13546
    case v_mode:
13547
      USED_REX (REX_W);
13548
      if (rex & REX_W)
13549
        op = get32s ();
13550
      else
13551
        {
13552
          if (sizeflag & DFLAG)
13553
            {
13554
              op = get32 ();
13555
              mask = 0xffffffff;
13556
            }
13557
          else
13558
            {
13559
              op = get16 ();
13560
              mask = 0xfffff;
13561
            }
13562
          used_prefixes |= (prefixes & PREFIX_DATA);
13563
        }
13564
      break;
13565
    case w_mode:
13566
      mask = 0xfffff;
13567
      op = get16 ();
13568
      break;
13569
    case const_1_mode:
13570
      if (intel_syntax)
13571
        oappend ("1");
13572
      return;
13573
    default:
13574
      oappend (INTERNAL_DISASSEMBLER_ERROR);
13575
      return;
13576
    }
13577
 
13578
  op &= mask;
13579
  scratchbuf[0] = '$';
13580
  print_operand_value (scratchbuf + 1, 1, op);
13581
  oappend (scratchbuf + intel_syntax);
13582
  scratchbuf[0] = '\0';
13583
}
13584
 
13585
static void
13586
OP_I64 (int bytemode, int sizeflag)
13587
{
13588
  bfd_signed_vma op;
13589
  bfd_signed_vma mask = -1;
13590
 
13591
  if (address_mode != mode_64bit)
13592
    {
13593
      OP_I (bytemode, sizeflag);
13594
      return;
13595
    }
13596
 
13597
  switch (bytemode)
13598
    {
13599
    case b_mode:
13600
      FETCH_DATA (the_info, codep + 1);
13601
      op = *codep++;
13602
      mask = 0xff;
13603
      break;
13604
    case v_mode:
13605
      USED_REX (REX_W);
13606
      if (rex & REX_W)
13607
        op = get64 ();
13608
      else
13609
        {
13610
          if (sizeflag & DFLAG)
13611
            {
13612
              op = get32 ();
13613
              mask = 0xffffffff;
13614
            }
13615
          else
13616
            {
13617
              op = get16 ();
13618
              mask = 0xfffff;
13619
            }
13620
          used_prefixes |= (prefixes & PREFIX_DATA);
13621
        }
13622
      break;
13623
    case w_mode:
13624
      mask = 0xfffff;
13625
      op = get16 ();
13626
      break;
13627
    default:
13628
      oappend (INTERNAL_DISASSEMBLER_ERROR);
13629
      return;
13630
    }
13631
 
13632
  op &= mask;
13633
  scratchbuf[0] = '$';
13634
  print_operand_value (scratchbuf + 1, 1, op);
13635
  oappend (scratchbuf + intel_syntax);
13636
  scratchbuf[0] = '\0';
13637
}
13638
 
13639
static void
13640
OP_sI (int bytemode, int sizeflag)
13641
{
13642
  bfd_signed_vma op;
13643
 
13644
  switch (bytemode)
13645
    {
13646
    case b_mode:
13647
    case b_T_mode:
13648
      FETCH_DATA (the_info, codep + 1);
13649
      op = *codep++;
13650
      if ((op & 0x80) != 0)
13651
        op -= 0x100;
13652
      if (bytemode == b_T_mode)
13653
        {
13654
          if (address_mode != mode_64bit
13655
              || !(sizeflag & DFLAG))
13656
            {
13657
              if (sizeflag & DFLAG)
13658
                op &= 0xffffffff;
13659
              else
13660
                op &= 0xffff;
13661
          }
13662
        }
13663
      else
13664
        {
13665
          if (!(rex & REX_W))
13666
            {
13667
              if (sizeflag & DFLAG)
13668
                op &= 0xffffffff;
13669
              else
13670
                op &= 0xffff;
13671
            }
13672
        }
13673
      break;
13674
    case v_mode:
13675
      if (sizeflag & DFLAG)
13676
        op = get32s ();
13677
      else
13678
        op = get16 ();
13679
      break;
13680
    default:
13681
      oappend (INTERNAL_DISASSEMBLER_ERROR);
13682
      return;
13683
    }
13684
 
13685
  scratchbuf[0] = '$';
13686
  print_operand_value (scratchbuf + 1, 1, op);
13687
  oappend (scratchbuf + intel_syntax);
13688
}
13689
 
13690
static void
13691
OP_J (int bytemode, int sizeflag)
13692
{
13693
  bfd_vma disp;
13694
  bfd_vma mask = -1;
13695
  bfd_vma segment = 0;
13696
 
13697
  switch (bytemode)
13698
    {
13699
    case b_mode:
13700
      FETCH_DATA (the_info, codep + 1);
13701
      disp = *codep++;
13702
      if ((disp & 0x80) != 0)
13703
        disp -= 0x100;
13704
      break;
13705
    case v_mode:
13706
      USED_REX (REX_W);
13707
      if ((sizeflag & DFLAG) || (rex & REX_W))
13708
        disp = get32s ();
13709
      else
13710
        {
13711
          disp = get16 ();
13712
          if ((disp & 0x8000) != 0)
13713
            disp -= 0x10000;
13714
          /* In 16bit mode, address is wrapped around at 64k within
13715
             the same segment.  Otherwise, a data16 prefix on a jump
13716
             instruction means that the pc is masked to 16 bits after
13717
             the displacement is added!  */
13718
          mask = 0xffff;
13719
          if ((prefixes & PREFIX_DATA) == 0)
13720
            segment = ((start_pc + codep - start_codep)
13721
                       & ~((bfd_vma) 0xffff));
13722
        }
13723
      if (!(rex & REX_W))
13724
        used_prefixes |= (prefixes & PREFIX_DATA);
13725
      break;
13726
    default:
13727
      oappend (INTERNAL_DISASSEMBLER_ERROR);
13728
      return;
13729
    }
13730
  disp = ((start_pc + (codep - start_codep) + disp) & mask) | segment;
13731
  set_op (disp, 0);
13732
  print_operand_value (scratchbuf, 1, disp);
13733
  oappend (scratchbuf);
13734
}
13735
 
13736
static void
13737
OP_SEG (int bytemode, int sizeflag)
13738
{
13739
  if (bytemode == w_mode)
13740
    oappend (names_seg[modrm.reg]);
13741
  else
13742
    OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
13743
}
13744
 
13745
static void
13746
OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
13747
{
13748
  int seg, offset;
13749
 
13750
  if (sizeflag & DFLAG)
13751
    {
13752
      offset = get32 ();
13753
      seg = get16 ();
13754
    }
13755
  else
13756
    {
13757
      offset = get16 ();
13758
      seg = get16 ();
13759
    }
13760
  used_prefixes |= (prefixes & PREFIX_DATA);
13761
  if (intel_syntax)
13762
    sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
13763
  else
13764
    sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
13765
  oappend (scratchbuf);
13766
}
13767
 
13768
static void
13769
OP_OFF (int bytemode, int sizeflag)
13770
{
13771
  bfd_vma off;
13772
 
13773
  if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
13774
    intel_operand_size (bytemode, sizeflag);
13775
  append_seg ();
13776
 
13777
  if ((sizeflag & AFLAG) || address_mode == mode_64bit)
13778
    off = get32 ();
13779
  else
13780
    off = get16 ();
13781
 
13782
  if (intel_syntax)
13783
    {
13784
      if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
13785
                        | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
13786
        {
13787
          oappend (names_seg[ds_reg - es_reg]);
13788
          oappend (":");
13789
        }
13790
    }
13791
  print_operand_value (scratchbuf, 1, off);
13792
  oappend (scratchbuf);
13793
}
13794
 
13795
static void
13796
OP_OFF64 (int bytemode, int sizeflag)
13797
{
13798
  bfd_vma off;
13799
 
13800
  if (address_mode != mode_64bit
13801
      || (prefixes & PREFIX_ADDR))
13802
    {
13803
      OP_OFF (bytemode, sizeflag);
13804
      return;
13805
    }
13806
 
13807
  if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
13808
    intel_operand_size (bytemode, sizeflag);
13809
  append_seg ();
13810
 
13811
  off = get64 ();
13812
 
13813
  if (intel_syntax)
13814
    {
13815
      if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
13816
                        | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
13817
        {
13818
          oappend (names_seg[ds_reg - es_reg]);
13819
          oappend (":");
13820
        }
13821
    }
13822
  print_operand_value (scratchbuf, 1, off);
13823
  oappend (scratchbuf);
13824
}
13825
 
13826
static void
13827
ptr_reg (int code, int sizeflag)
13828
{
13829
  const char *s;
13830
 
13831
  *obufp++ = open_char;
13832
  used_prefixes |= (prefixes & PREFIX_ADDR);
13833
  if (address_mode == mode_64bit)
13834
    {
13835
      if (!(sizeflag & AFLAG))
13836
        s = names32[code - eAX_reg];
13837
      else
13838
        s = names64[code - eAX_reg];
13839
    }
13840
  else if (sizeflag & AFLAG)
13841
    s = names32[code - eAX_reg];
13842
  else
13843
    s = names16[code - eAX_reg];
13844
  oappend (s);
13845
  *obufp++ = close_char;
13846
  *obufp = 0;
13847
}
13848
 
13849
static void
13850
OP_ESreg (int code, int sizeflag)
13851
{
13852
  if (intel_syntax)
13853
    {
13854
      switch (codep[-1])
13855
        {
13856
        case 0x6d:      /* insw/insl */
13857
          intel_operand_size (z_mode, sizeflag);
13858
          break;
13859
        case 0xa5:      /* movsw/movsl/movsq */
13860
        case 0xa7:      /* cmpsw/cmpsl/cmpsq */
13861
        case 0xab:      /* stosw/stosl */
13862
        case 0xaf:      /* scasw/scasl */
13863
          intel_operand_size (v_mode, sizeflag);
13864
          break;
13865
        default:
13866
          intel_operand_size (b_mode, sizeflag);
13867
        }
13868
    }
13869
  oappend ("%es:" + intel_syntax);
13870
  ptr_reg (code, sizeflag);
13871
}
13872
 
13873
static void
13874
OP_DSreg (int code, int sizeflag)
13875
{
13876
  if (intel_syntax)
13877
    {
13878
      switch (codep[-1])
13879
        {
13880
        case 0x6f:      /* outsw/outsl */
13881
          intel_operand_size (z_mode, sizeflag);
13882
          break;
13883
        case 0xa5:      /* movsw/movsl/movsq */
13884
        case 0xa7:      /* cmpsw/cmpsl/cmpsq */
13885
        case 0xad:      /* lodsw/lodsl/lodsq */
13886
          intel_operand_size (v_mode, sizeflag);
13887
          break;
13888
        default:
13889
          intel_operand_size (b_mode, sizeflag);
13890
        }
13891
    }
13892
  if ((prefixes
13893
       & (PREFIX_CS
13894
          | PREFIX_DS
13895
          | PREFIX_SS
13896
          | PREFIX_ES
13897
          | PREFIX_FS
13898
          | PREFIX_GS)) == 0)
13899
    prefixes |= PREFIX_DS;
13900
  append_seg ();
13901
  ptr_reg (code, sizeflag);
13902
}
13903
 
13904
static void
13905
OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13906
{
13907
  int add;
13908
  if (rex & REX_R)
13909
    {
13910
      USED_REX (REX_R);
13911
      add = 8;
13912
    }
13913
  else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
13914
    {
13915
      all_prefixes[last_lock_prefix] = 0;
13916
      used_prefixes |= PREFIX_LOCK;
13917
      add = 8;
13918
    }
13919
  else
13920
    add = 0;
13921
  sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
13922
  oappend (scratchbuf + intel_syntax);
13923
}
13924
 
13925
static void
13926
OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13927
{
13928
  int add;
13929
  USED_REX (REX_R);
13930
  if (rex & REX_R)
13931
    add = 8;
13932
  else
13933
    add = 0;
13934
  if (intel_syntax)
13935
    sprintf (scratchbuf, "db%d", modrm.reg + add);
13936
  else
13937
    sprintf (scratchbuf, "%%db%d", modrm.reg + add);
13938
  oappend (scratchbuf);
13939
}
13940
 
13941
static void
13942
OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13943
{
13944
  sprintf (scratchbuf, "%%tr%d", modrm.reg);
13945
  oappend (scratchbuf + intel_syntax);
13946
}
13947
 
13948
static void
13949
OP_R (int bytemode, int sizeflag)
13950
{
13951
  if (modrm.mod == 3)
13952
    OP_E (bytemode, sizeflag);
13953
  else
13954
    BadOp ();
13955
}
13956
 
13957
static void
13958
OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13959
{
13960
  int reg = modrm.reg;
13961
  const char **names;
13962
 
13963
  used_prefixes |= (prefixes & PREFIX_DATA);
13964
  if (prefixes & PREFIX_DATA)
13965
    {
13966
      names = names_xmm;
13967
      USED_REX (REX_R);
13968
      if (rex & REX_R)
13969
        reg += 8;
13970
    }
13971
  else
13972
    names = names_mm;
13973
  oappend (names[reg]);
13974
}
13975
 
13976
static void
13977
OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13978
{
13979
  int reg = modrm.reg;
13980
  const char **names;
13981
 
13982
  USED_REX (REX_R);
13983
  if (rex & REX_R)
13984
    reg += 8;
13985
  if (need_vex
13986
      && bytemode != xmm_mode
13987
      && bytemode != scalar_mode)
13988
    {
13989
      switch (vex.length)
13990
        {
13991
        case 128:
13992
          names = names_xmm;
13993
          break;
13994
        case 256:
13995 148 khays
          if (vex.w || bytemode != vex_vsib_q_w_dq_mode)
13996
            names = names_ymm;
13997
          else
13998
            names = names_xmm;
13999 18 khays
          break;
14000
        default:
14001
          abort ();
14002
        }
14003
    }
14004
  else
14005
    names = names_xmm;
14006
  oappend (names[reg]);
14007
}
14008
 
14009
static void
14010
OP_EM (int bytemode, int sizeflag)
14011
{
14012
  int reg;
14013
  const char **names;
14014
 
14015
  if (modrm.mod != 3)
14016
    {
14017
      if (intel_syntax
14018
          && (bytemode == v_mode || bytemode == v_swap_mode))
14019
        {
14020
          bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
14021
          used_prefixes |= (prefixes & PREFIX_DATA);
14022
        }
14023
      OP_E (bytemode, sizeflag);
14024
      return;
14025
    }
14026
 
14027
  if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
14028
    swap_operand ();
14029
 
14030
  /* Skip mod/rm byte.  */
14031
  MODRM_CHECK;
14032
  codep++;
14033
  used_prefixes |= (prefixes & PREFIX_DATA);
14034
  reg = modrm.rm;
14035
  if (prefixes & PREFIX_DATA)
14036
    {
14037
      names = names_xmm;
14038
      USED_REX (REX_B);
14039
      if (rex & REX_B)
14040
        reg += 8;
14041
    }
14042
  else
14043
    names = names_mm;
14044
  oappend (names[reg]);
14045
}
14046
 
14047
/* cvt* are the only instructions in sse2 which have
14048
   both SSE and MMX operands and also have 0x66 prefix
14049
   in their opcode. 0x66 was originally used to differentiate
14050
   between SSE and MMX instruction(operands). So we have to handle the
14051
   cvt* separately using OP_EMC and OP_MXC */
14052
static void
14053
OP_EMC (int bytemode, int sizeflag)
14054
{
14055
  if (modrm.mod != 3)
14056
    {
14057
      if (intel_syntax && bytemode == v_mode)
14058
        {
14059
          bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
14060
          used_prefixes |= (prefixes & PREFIX_DATA);
14061
        }
14062
      OP_E (bytemode, sizeflag);
14063
      return;
14064
    }
14065
 
14066
  /* Skip mod/rm byte.  */
14067
  MODRM_CHECK;
14068
  codep++;
14069
  used_prefixes |= (prefixes & PREFIX_DATA);
14070
  oappend (names_mm[modrm.rm]);
14071
}
14072
 
14073
static void
14074
OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14075
{
14076
  used_prefixes |= (prefixes & PREFIX_DATA);
14077
  oappend (names_mm[modrm.reg]);
14078
}
14079
 
14080
static void
14081
OP_EX (int bytemode, int sizeflag)
14082
{
14083
  int reg;
14084
  const char **names;
14085
 
14086
  /* Skip mod/rm byte.  */
14087
  MODRM_CHECK;
14088
  codep++;
14089
 
14090
  if (modrm.mod != 3)
14091
    {
14092
      OP_E_memory (bytemode, sizeflag);
14093
      return;
14094
    }
14095
 
14096
  reg = modrm.rm;
14097
  USED_REX (REX_B);
14098
  if (rex & REX_B)
14099
    reg += 8;
14100
 
14101
  if ((sizeflag & SUFFIX_ALWAYS)
14102
      && (bytemode == x_swap_mode
14103
          || bytemode == d_swap_mode
14104
          || bytemode == d_scalar_swap_mode
14105
          || bytemode == q_swap_mode
14106
          || bytemode == q_scalar_swap_mode))
14107
    swap_operand ();
14108
 
14109
  if (need_vex
14110
      && bytemode != xmm_mode
14111 148 khays
      && bytemode != xmmdw_mode
14112
      && bytemode != xmmqd_mode
14113
      && bytemode != xmm_mb_mode
14114
      && bytemode != xmm_mw_mode
14115
      && bytemode != xmm_md_mode
14116
      && bytemode != xmm_mq_mode
14117 18 khays
      && bytemode != xmmq_mode
14118
      && bytemode != d_scalar_mode
14119
      && bytemode != d_scalar_swap_mode
14120
      && bytemode != q_scalar_mode
14121
      && bytemode != q_scalar_swap_mode
14122
      && bytemode != vex_scalar_w_dq_mode)
14123
    {
14124
      switch (vex.length)
14125
        {
14126
        case 128:
14127
          names = names_xmm;
14128
          break;
14129
        case 256:
14130
          names = names_ymm;
14131
          break;
14132
        default:
14133
          abort ();
14134
        }
14135
    }
14136
  else
14137
    names = names_xmm;
14138
  oappend (names[reg]);
14139
}
14140
 
14141
static void
14142
OP_MS (int bytemode, int sizeflag)
14143
{
14144
  if (modrm.mod == 3)
14145
    OP_EM (bytemode, sizeflag);
14146
  else
14147
    BadOp ();
14148
}
14149
 
14150
static void
14151
OP_XS (int bytemode, int sizeflag)
14152
{
14153
  if (modrm.mod == 3)
14154
    OP_EX (bytemode, sizeflag);
14155
  else
14156
    BadOp ();
14157
}
14158
 
14159
static void
14160
OP_M (int bytemode, int sizeflag)
14161
{
14162
  if (modrm.mod == 3)
14163
    /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
14164
    BadOp ();
14165
  else
14166
    OP_E (bytemode, sizeflag);
14167
}
14168
 
14169
static void
14170
OP_0f07 (int bytemode, int sizeflag)
14171
{
14172
  if (modrm.mod != 3 || modrm.rm != 0)
14173
    BadOp ();
14174
  else
14175
    OP_E (bytemode, sizeflag);
14176
}
14177
 
14178
/* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
14179
   32bit mode and "xchg %rax,%rax" in 64bit mode.  */
14180
 
14181
static void
14182
NOP_Fixup1 (int bytemode, int sizeflag)
14183
{
14184
  if ((prefixes & PREFIX_DATA) != 0
14185
      || (rex != 0
14186
          && rex != 0x48
14187
          && address_mode == mode_64bit))
14188
    OP_REG (bytemode, sizeflag);
14189
  else
14190
    strcpy (obuf, "nop");
14191
}
14192
 
14193
static void
14194
NOP_Fixup2 (int bytemode, int sizeflag)
14195
{
14196
  if ((prefixes & PREFIX_DATA) != 0
14197
      || (rex != 0
14198
          && rex != 0x48
14199
          && address_mode == mode_64bit))
14200
    OP_IMREG (bytemode, sizeflag);
14201
}
14202
 
14203
static const char *const Suffix3DNow[] = {
14204
/* 00 */        NULL,           NULL,           NULL,           NULL,
14205
/* 04 */        NULL,           NULL,           NULL,           NULL,
14206
/* 08 */        NULL,           NULL,           NULL,           NULL,
14207
/* 0C */        "pi2fw",        "pi2fd",        NULL,           NULL,
14208
/* 10 */        NULL,           NULL,           NULL,           NULL,
14209
/* 14 */        NULL,           NULL,           NULL,           NULL,
14210
/* 18 */        NULL,           NULL,           NULL,           NULL,
14211
/* 1C */        "pf2iw",        "pf2id",        NULL,           NULL,
14212
/* 20 */        NULL,           NULL,           NULL,           NULL,
14213
/* 24 */        NULL,           NULL,           NULL,           NULL,
14214
/* 28 */        NULL,           NULL,           NULL,           NULL,
14215
/* 2C */        NULL,           NULL,           NULL,           NULL,
14216
/* 30 */        NULL,           NULL,           NULL,           NULL,
14217
/* 34 */        NULL,           NULL,           NULL,           NULL,
14218
/* 38 */        NULL,           NULL,           NULL,           NULL,
14219
/* 3C */        NULL,           NULL,           NULL,           NULL,
14220
/* 40 */        NULL,           NULL,           NULL,           NULL,
14221
/* 44 */        NULL,           NULL,           NULL,           NULL,
14222
/* 48 */        NULL,           NULL,           NULL,           NULL,
14223
/* 4C */        NULL,           NULL,           NULL,           NULL,
14224
/* 50 */        NULL,           NULL,           NULL,           NULL,
14225
/* 54 */        NULL,           NULL,           NULL,           NULL,
14226
/* 58 */        NULL,           NULL,           NULL,           NULL,
14227
/* 5C */        NULL,           NULL,           NULL,           NULL,
14228
/* 60 */        NULL,           NULL,           NULL,           NULL,
14229
/* 64 */        NULL,           NULL,           NULL,           NULL,
14230
/* 68 */        NULL,           NULL,           NULL,           NULL,
14231
/* 6C */        NULL,           NULL,           NULL,           NULL,
14232
/* 70 */        NULL,           NULL,           NULL,           NULL,
14233
/* 74 */        NULL,           NULL,           NULL,           NULL,
14234
/* 78 */        NULL,           NULL,           NULL,           NULL,
14235
/* 7C */        NULL,           NULL,           NULL,           NULL,
14236
/* 80 */        NULL,           NULL,           NULL,           NULL,
14237
/* 84 */        NULL,           NULL,           NULL,           NULL,
14238
/* 88 */        NULL,           NULL,           "pfnacc",       NULL,
14239
/* 8C */        NULL,           NULL,           "pfpnacc",      NULL,
14240
/* 90 */        "pfcmpge",      NULL,           NULL,           NULL,
14241
/* 94 */        "pfmin",        NULL,           "pfrcp",        "pfrsqrt",
14242
/* 98 */        NULL,           NULL,           "pfsub",        NULL,
14243
/* 9C */        NULL,           NULL,           "pfadd",        NULL,
14244
/* A0 */        "pfcmpgt",      NULL,           NULL,           NULL,
14245
/* A4 */        "pfmax",        NULL,           "pfrcpit1",     "pfrsqit1",
14246
/* A8 */        NULL,           NULL,           "pfsubr",       NULL,
14247
/* AC */        NULL,           NULL,           "pfacc",        NULL,
14248
/* B0 */        "pfcmpeq",      NULL,           NULL,           NULL,
14249
/* B4 */        "pfmul",        NULL,           "pfrcpit2",     "pmulhrw",
14250
/* B8 */        NULL,           NULL,           NULL,           "pswapd",
14251
/* BC */        NULL,           NULL,           NULL,           "pavgusb",
14252
/* C0 */        NULL,           NULL,           NULL,           NULL,
14253
/* C4 */        NULL,           NULL,           NULL,           NULL,
14254
/* C8 */        NULL,           NULL,           NULL,           NULL,
14255
/* CC */        NULL,           NULL,           NULL,           NULL,
14256
/* D0 */        NULL,           NULL,           NULL,           NULL,
14257
/* D4 */        NULL,           NULL,           NULL,           NULL,
14258
/* D8 */        NULL,           NULL,           NULL,           NULL,
14259
/* DC */        NULL,           NULL,           NULL,           NULL,
14260
/* E0 */        NULL,           NULL,           NULL,           NULL,
14261
/* E4 */        NULL,           NULL,           NULL,           NULL,
14262
/* E8 */        NULL,           NULL,           NULL,           NULL,
14263
/* EC */        NULL,           NULL,           NULL,           NULL,
14264
/* F0 */        NULL,           NULL,           NULL,           NULL,
14265
/* F4 */        NULL,           NULL,           NULL,           NULL,
14266
/* F8 */        NULL,           NULL,           NULL,           NULL,
14267
/* FC */        NULL,           NULL,           NULL,           NULL,
14268
};
14269
 
14270
static void
14271
OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14272
{
14273
  const char *mnemonic;
14274
 
14275
  FETCH_DATA (the_info, codep + 1);
14276
  /* AMD 3DNow! instructions are specified by an opcode suffix in the
14277
     place where an 8-bit immediate would normally go.  ie. the last
14278
     byte of the instruction.  */
14279
  obufp = mnemonicendp;
14280
  mnemonic = Suffix3DNow[*codep++ & 0xff];
14281
  if (mnemonic)
14282
    oappend (mnemonic);
14283
  else
14284
    {
14285
      /* Since a variable sized modrm/sib chunk is between the start
14286
         of the opcode (0x0f0f) and the opcode suffix, we need to do
14287
         all the modrm processing first, and don't know until now that
14288
         we have a bad opcode.  This necessitates some cleaning up.  */
14289
      op_out[0][0] = '\0';
14290
      op_out[1][0] = '\0';
14291
      BadOp ();
14292
    }
14293
  mnemonicendp = obufp;
14294
}
14295
 
14296
static struct op simd_cmp_op[] =
14297
{
14298
  { STRING_COMMA_LEN ("eq") },
14299
  { STRING_COMMA_LEN ("lt") },
14300
  { STRING_COMMA_LEN ("le") },
14301
  { STRING_COMMA_LEN ("unord") },
14302
  { STRING_COMMA_LEN ("neq") },
14303
  { STRING_COMMA_LEN ("nlt") },
14304
  { STRING_COMMA_LEN ("nle") },
14305
  { STRING_COMMA_LEN ("ord") }
14306
};
14307
 
14308
static void
14309
CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14310
{
14311
  unsigned int cmp_type;
14312
 
14313
  FETCH_DATA (the_info, codep + 1);
14314
  cmp_type = *codep++ & 0xff;
14315
  if (cmp_type < ARRAY_SIZE (simd_cmp_op))
14316
    {
14317
      char suffix [3];
14318
      char *p = mnemonicendp - 2;
14319
      suffix[0] = p[0];
14320
      suffix[1] = p[1];
14321
      suffix[2] = '\0';
14322
      sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
14323
      mnemonicendp += simd_cmp_op[cmp_type].len;
14324
    }
14325
  else
14326
    {
14327
      /* We have a reserved extension byte.  Output it directly.  */
14328
      scratchbuf[0] = '$';
14329
      print_operand_value (scratchbuf + 1, 1, cmp_type);
14330
      oappend (scratchbuf + intel_syntax);
14331
      scratchbuf[0] = '\0';
14332
    }
14333
}
14334
 
14335
static void
14336
OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
14337
          int sizeflag ATTRIBUTE_UNUSED)
14338
{
14339
  /* mwait %eax,%ecx  */
14340
  if (!intel_syntax)
14341
    {
14342
      const char **names = (address_mode == mode_64bit
14343
                            ? names64 : names32);
14344
      strcpy (op_out[0], names[0]);
14345
      strcpy (op_out[1], names[1]);
14346
      two_source_ops = 1;
14347
    }
14348
  /* Skip mod/rm byte.  */
14349
  MODRM_CHECK;
14350
  codep++;
14351
}
14352
 
14353
static void
14354
OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
14355
            int sizeflag ATTRIBUTE_UNUSED)
14356
{
14357
  /* monitor %eax,%ecx,%edx"  */
14358
  if (!intel_syntax)
14359
    {
14360
      const char **op1_names;
14361
      const char **names = (address_mode == mode_64bit
14362
                            ? names64 : names32);
14363
 
14364
      if (!(prefixes & PREFIX_ADDR))
14365
        op1_names = (address_mode == mode_16bit
14366
                     ? names16 : names);
14367
      else
14368
        {
14369
          /* Remove "addr16/addr32".  */
14370
          all_prefixes[last_addr_prefix] = 0;
14371
          op1_names = (address_mode != mode_32bit
14372
                       ? names32 : names16);
14373
          used_prefixes |= PREFIX_ADDR;
14374
        }
14375
      strcpy (op_out[0], op1_names[0]);
14376
      strcpy (op_out[1], names[1]);
14377
      strcpy (op_out[2], names[2]);
14378
      two_source_ops = 1;
14379
    }
14380
  /* Skip mod/rm byte.  */
14381
  MODRM_CHECK;
14382
  codep++;
14383
}
14384
 
14385
static void
14386
BadOp (void)
14387
{
14388
  /* Throw away prefixes and 1st. opcode byte.  */
14389
  codep = insn_codep + 1;
14390
  oappend ("(bad)");
14391
}
14392
 
14393
static void
14394
REP_Fixup (int bytemode, int sizeflag)
14395
{
14396
  /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
14397
     lods and stos.  */
14398
  if (prefixes & PREFIX_REPZ)
14399
    all_prefixes[last_repz_prefix] = REP_PREFIX;
14400
 
14401
  switch (bytemode)
14402
    {
14403
    case al_reg:
14404
    case eAX_reg:
14405
    case indir_dx_reg:
14406
      OP_IMREG (bytemode, sizeflag);
14407
      break;
14408
    case eDI_reg:
14409
      OP_ESreg (bytemode, sizeflag);
14410
      break;
14411
    case eSI_reg:
14412
      OP_DSreg (bytemode, sizeflag);
14413
      break;
14414
    default:
14415
      abort ();
14416
      break;
14417
    }
14418
}
14419
 
14420 166 khays
/* Similar to OP_E.  But the 0xf2/0xf3 prefixes should be displayed as
14421
   "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
14422
 */
14423
 
14424 18 khays
static void
14425 166 khays
HLE_Fixup1 (int bytemode, int sizeflag)
14426
{
14427
  if (modrm.mod != 3
14428
      && (prefixes & PREFIX_LOCK) != 0)
14429
    {
14430
      if (prefixes & PREFIX_REPZ)
14431
        all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
14432
      if (prefixes & PREFIX_REPNZ)
14433
        all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
14434
    }
14435
 
14436
  OP_E (bytemode, sizeflag);
14437
}
14438
 
14439
/* Similar to OP_E.  But the 0xf2/0xf3 prefixes should be displayed as
14440
   "xacquire"/"xrelease" for memory operand.  No check for LOCK prefix.
14441
 */
14442
 
14443
static void
14444
HLE_Fixup2 (int bytemode, int sizeflag)
14445
{
14446
  if (modrm.mod != 3)
14447
    {
14448
      if (prefixes & PREFIX_REPZ)
14449
        all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
14450
      if (prefixes & PREFIX_REPNZ)
14451
        all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
14452
    }
14453
 
14454
  OP_E (bytemode, sizeflag);
14455
}
14456
 
14457
/* Similar to OP_E.  But the 0xf3 prefixes should be displayed as
14458
   "xrelease" for memory operand.  No check for LOCK prefix.   */
14459
 
14460
static void
14461
HLE_Fixup3 (int bytemode, int sizeflag)
14462
{
14463
  if (modrm.mod != 3
14464
      && last_repz_prefix > last_repnz_prefix
14465
      && (prefixes & PREFIX_REPZ) != 0)
14466
    all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
14467
 
14468
  OP_E (bytemode, sizeflag);
14469
}
14470
 
14471
static void
14472 18 khays
CMPXCHG8B_Fixup (int bytemode, int sizeflag)
14473
{
14474
  USED_REX (REX_W);
14475
  if (rex & REX_W)
14476
    {
14477
      /* Change cmpxchg8b to cmpxchg16b.  */
14478
      char *p = mnemonicendp - 2;
14479
      mnemonicendp = stpcpy (p, "16b");
14480
      bytemode = o_mode;
14481
    }
14482 166 khays
  else if ((prefixes & PREFIX_LOCK) != 0)
14483
    {
14484
      if (prefixes & PREFIX_REPZ)
14485
        all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
14486
      if (prefixes & PREFIX_REPNZ)
14487
        all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
14488
    }
14489
 
14490 18 khays
  OP_M (bytemode, sizeflag);
14491
}
14492
 
14493
static void
14494
XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
14495
{
14496
  const char **names;
14497
 
14498
  if (need_vex)
14499
    {
14500
      switch (vex.length)
14501
        {
14502
        case 128:
14503
          names = names_xmm;
14504
          break;
14505
        case 256:
14506
          names = names_ymm;
14507
          break;
14508
        default:
14509
          abort ();
14510
        }
14511
    }
14512
  else
14513
    names = names_xmm;
14514
  oappend (names[reg]);
14515
}
14516
 
14517
static void
14518
CRC32_Fixup (int bytemode, int sizeflag)
14519
{
14520
  /* Add proper suffix to "crc32".  */
14521
  char *p = mnemonicendp;
14522
 
14523
  switch (bytemode)
14524
    {
14525
    case b_mode:
14526
      if (intel_syntax)
14527
        goto skip;
14528
 
14529
      *p++ = 'b';
14530
      break;
14531
    case v_mode:
14532
      if (intel_syntax)
14533
        goto skip;
14534
 
14535
      USED_REX (REX_W);
14536
      if (rex & REX_W)
14537
        *p++ = 'q';
14538
      else
14539
        {
14540
          if (sizeflag & DFLAG)
14541
            *p++ = 'l';
14542
          else
14543
            *p++ = 'w';
14544
          used_prefixes |= (prefixes & PREFIX_DATA);
14545
        }
14546
      break;
14547
    default:
14548
      oappend (INTERNAL_DISASSEMBLER_ERROR);
14549
      break;
14550
    }
14551
  mnemonicendp = p;
14552
  *p = '\0';
14553
 
14554
skip:
14555
  if (modrm.mod == 3)
14556
    {
14557
      int add;
14558
 
14559
      /* Skip mod/rm byte.  */
14560
      MODRM_CHECK;
14561
      codep++;
14562
 
14563
      USED_REX (REX_B);
14564
      add = (rex & REX_B) ? 8 : 0;
14565
      if (bytemode == b_mode)
14566
        {
14567
          USED_REX (0);
14568
          if (rex)
14569
            oappend (names8rex[modrm.rm + add]);
14570
          else
14571
            oappend (names8[modrm.rm + add]);
14572
        }
14573
      else
14574
        {
14575
          USED_REX (REX_W);
14576
          if (rex & REX_W)
14577
            oappend (names64[modrm.rm + add]);
14578
          else if ((prefixes & PREFIX_DATA))
14579
            oappend (names16[modrm.rm + add]);
14580
          else
14581
            oappend (names32[modrm.rm + add]);
14582
        }
14583
    }
14584
  else
14585
    OP_E (bytemode, sizeflag);
14586
}
14587
 
14588
static void
14589
FXSAVE_Fixup (int bytemode, int sizeflag)
14590
{
14591
  /* Add proper suffix to "fxsave" and "fxrstor".  */
14592
  USED_REX (REX_W);
14593
  if (rex & REX_W)
14594
    {
14595
      char *p = mnemonicendp;
14596
      *p++ = '6';
14597
      *p++ = '4';
14598
      *p = '\0';
14599
      mnemonicendp = p;
14600
    }
14601
  OP_M (bytemode, sizeflag);
14602
}
14603
 
14604
/* Display the destination register operand for instructions with
14605
   VEX. */
14606
 
14607
static void
14608
OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
14609
{
14610
  int reg;
14611
  const char **names;
14612
 
14613
  if (!need_vex)
14614
    abort ();
14615
 
14616
  if (!need_vex_reg)
14617
    return;
14618
 
14619
  reg = vex.register_specifier;
14620
  if (bytemode == vex_scalar_mode)
14621
    {
14622
      oappend (names_xmm[reg]);
14623
      return;
14624
    }
14625
 
14626
  switch (vex.length)
14627
    {
14628
    case 128:
14629
      switch (bytemode)
14630
        {
14631
        case vex_mode:
14632
        case vex128_mode:
14633 148 khays
        case vex_vsib_q_w_dq_mode:
14634 18 khays
          names = names_xmm;
14635
          break;
14636
        case dq_mode:
14637
          if (vex.w)
14638
            names = names64;
14639
          else
14640
            names = names32;
14641
          break;
14642
        default:
14643
          abort ();
14644
          return;
14645
        }
14646
      break;
14647
    case 256:
14648
      switch (bytemode)
14649
        {
14650
        case vex_mode:
14651
        case vex256_mode:
14652 148 khays
          names = names_ymm;
14653 18 khays
          break;
14654 148 khays
        case vex_vsib_q_w_dq_mode:
14655
          names = vex.w ? names_ymm : names_xmm;
14656
          break;
14657 18 khays
        default:
14658
          abort ();
14659
          return;
14660
        }
14661
      break;
14662
    default:
14663
      abort ();
14664
      break;
14665
    }
14666
  oappend (names[reg]);
14667
}
14668
 
14669
/* Get the VEX immediate byte without moving codep.  */
14670
 
14671
static unsigned char
14672
get_vex_imm8 (int sizeflag, int opnum)
14673
{
14674
  int bytes_before_imm = 0;
14675
 
14676
  if (modrm.mod != 3)
14677
    {
14678
      /* There are SIB/displacement bytes.  */
14679
      if ((sizeflag & AFLAG) || address_mode == mode_64bit)
14680
        {
14681
          /* 32/64 bit address mode */
14682
          int base = modrm.rm;
14683
 
14684
          /* Check SIB byte.  */
14685
          if (base == 4)
14686
            {
14687
              FETCH_DATA (the_info, codep + 1);
14688
              base = *codep & 7;
14689
              /* When decoding the third source, don't increase
14690
                 bytes_before_imm as this has already been incremented
14691
                 by one in OP_E_memory while decoding the second
14692
                 source operand.  */
14693
              if (opnum == 0)
14694
                bytes_before_imm++;
14695
            }
14696
 
14697
          /* Don't increase bytes_before_imm when decoding the third source,
14698
             it has already been incremented by OP_E_memory while decoding
14699
             the second source operand.  */
14700
          if (opnum == 0)
14701
            {
14702
              switch (modrm.mod)
14703
                {
14704
                  case 0:
14705
                    /* When modrm.rm == 5 or modrm.rm == 4 and base in
14706
                       SIB == 5, there is a 4 byte displacement.  */
14707
                    if (base != 5)
14708
                      /* No displacement. */
14709
                      break;
14710
                  case 2:
14711
                    /* 4 byte displacement.  */
14712
                    bytes_before_imm += 4;
14713
                    break;
14714
                  case 1:
14715
                    /* 1 byte displacement.  */
14716
                    bytes_before_imm++;
14717
                    break;
14718
                }
14719
            }
14720
        }
14721
      else
14722
        {
14723
          /* 16 bit address mode */
14724
          /* Don't increase bytes_before_imm when decoding the third source,
14725
             it has already been incremented by OP_E_memory while decoding
14726
             the second source operand.  */
14727
          if (opnum == 0)
14728
            {
14729
              switch (modrm.mod)
14730
                {
14731
                case 0:
14732
                  /* When modrm.rm == 6, there is a 2 byte displacement.  */
14733
                  if (modrm.rm != 6)
14734
                    /* No displacement. */
14735
                    break;
14736
                case 2:
14737
                  /* 2 byte displacement.  */
14738
                  bytes_before_imm += 2;
14739
                  break;
14740
                case 1:
14741
                  /* 1 byte displacement: when decoding the third source,
14742
                     don't increase bytes_before_imm as this has already
14743
                     been incremented by one in OP_E_memory while decoding
14744
                     the second source operand.  */
14745
                  if (opnum == 0)
14746
                    bytes_before_imm++;
14747
 
14748
                  break;
14749
                }
14750
            }
14751
        }
14752
    }
14753
 
14754
  FETCH_DATA (the_info, codep + bytes_before_imm + 1);
14755
  return codep [bytes_before_imm];
14756
}
14757
 
14758
static void
14759
OP_EX_VexReg (int bytemode, int sizeflag, int reg)
14760
{
14761
  const char **names;
14762
 
14763
  if (reg == -1 && modrm.mod != 3)
14764
    {
14765
      OP_E_memory (bytemode, sizeflag);
14766
      return;
14767
    }
14768
  else
14769
    {
14770
      if (reg == -1)
14771
        {
14772
          reg = modrm.rm;
14773
          USED_REX (REX_B);
14774
          if (rex & REX_B)
14775
            reg += 8;
14776
        }
14777
      else if (reg > 7 && address_mode != mode_64bit)
14778
        BadOp ();
14779
    }
14780
 
14781
  switch (vex.length)
14782
    {
14783
    case 128:
14784
      names = names_xmm;
14785
      break;
14786
    case 256:
14787
      names = names_ymm;
14788
      break;
14789
    default:
14790
      abort ();
14791
    }
14792
  oappend (names[reg]);
14793
}
14794
 
14795
static void
14796
OP_EX_VexImmW (int bytemode, int sizeflag)
14797
{
14798
  int reg = -1;
14799
  static unsigned char vex_imm8;
14800
 
14801
  if (vex_w_done == 0)
14802
    {
14803
      vex_w_done = 1;
14804
 
14805
      /* Skip mod/rm byte.  */
14806
      MODRM_CHECK;
14807
      codep++;
14808
 
14809
      vex_imm8 = get_vex_imm8 (sizeflag, 0);
14810
 
14811
      if (vex.w)
14812
          reg = vex_imm8 >> 4;
14813
 
14814
      OP_EX_VexReg (bytemode, sizeflag, reg);
14815
    }
14816
  else if (vex_w_done == 1)
14817
    {
14818
      vex_w_done = 2;
14819
 
14820
      if (!vex.w)
14821
          reg = vex_imm8 >> 4;
14822
 
14823
      OP_EX_VexReg (bytemode, sizeflag, reg);
14824
    }
14825
  else
14826
    {
14827
      /* Output the imm8 directly.  */
14828
      scratchbuf[0] = '$';
14829
      print_operand_value (scratchbuf + 1, 1, vex_imm8 & 0xf);
14830
      oappend (scratchbuf + intel_syntax);
14831
      scratchbuf[0] = '\0';
14832
      codep++;
14833
    }
14834
}
14835
 
14836
static void
14837
OP_Vex_2src (int bytemode, int sizeflag)
14838
{
14839
  if (modrm.mod == 3)
14840
    {
14841
      int reg = modrm.rm;
14842
      USED_REX (REX_B);
14843
      if (rex & REX_B)
14844
        reg += 8;
14845
      oappend (names_xmm[reg]);
14846
    }
14847
  else
14848
    {
14849
      if (intel_syntax
14850
          && (bytemode == v_mode || bytemode == v_swap_mode))
14851
        {
14852
          bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
14853
          used_prefixes |= (prefixes & PREFIX_DATA);
14854
        }
14855
      OP_E (bytemode, sizeflag);
14856
    }
14857
}
14858
 
14859
static void
14860
OP_Vex_2src_1 (int bytemode, int sizeflag)
14861
{
14862
  if (modrm.mod == 3)
14863
    {
14864
      /* Skip mod/rm byte.   */
14865
      MODRM_CHECK;
14866
      codep++;
14867
    }
14868
 
14869
  if (vex.w)
14870
    oappend (names_xmm[vex.register_specifier]);
14871
  else
14872
    OP_Vex_2src (bytemode, sizeflag);
14873
}
14874
 
14875
static void
14876
OP_Vex_2src_2 (int bytemode, int sizeflag)
14877
{
14878
  if (vex.w)
14879
    OP_Vex_2src (bytemode, sizeflag);
14880
  else
14881
    oappend (names_xmm[vex.register_specifier]);
14882
}
14883
 
14884
static void
14885
OP_EX_VexW (int bytemode, int sizeflag)
14886
{
14887
  int reg = -1;
14888
 
14889
  if (!vex_w_done)
14890
    {
14891
      vex_w_done = 1;
14892
 
14893
      /* Skip mod/rm byte.  */
14894
      MODRM_CHECK;
14895
      codep++;
14896
 
14897
      if (vex.w)
14898
        reg = get_vex_imm8 (sizeflag, 0) >> 4;
14899
    }
14900
  else
14901
    {
14902
      if (!vex.w)
14903
        reg = get_vex_imm8 (sizeflag, 1) >> 4;
14904
    }
14905
 
14906
  OP_EX_VexReg (bytemode, sizeflag, reg);
14907
}
14908
 
14909
static void
14910
VEXI4_Fixup (int bytemode ATTRIBUTE_UNUSED,
14911
             int sizeflag ATTRIBUTE_UNUSED)
14912
{
14913
  /* Skip the immediate byte and check for invalid bits.  */
14914
  FETCH_DATA (the_info, codep + 1);
14915
  if (*codep++ & 0xf)
14916
    BadOp ();
14917
}
14918
 
14919
static void
14920
OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
14921
{
14922
  int reg;
14923
  const char **names;
14924
 
14925
  FETCH_DATA (the_info, codep + 1);
14926
  reg = *codep++;
14927
 
14928
  if (bytemode != x_mode)
14929
    abort ();
14930
 
14931
  if (reg & 0xf)
14932
      BadOp ();
14933
 
14934
  reg >>= 4;
14935
  if (reg > 7 && address_mode != mode_64bit)
14936
    BadOp ();
14937
 
14938
  switch (vex.length)
14939
    {
14940
    case 128:
14941
      names = names_xmm;
14942
      break;
14943
    case 256:
14944
      names = names_ymm;
14945
      break;
14946
    default:
14947
      abort ();
14948
    }
14949
  oappend (names[reg]);
14950
}
14951
 
14952
static void
14953
OP_XMM_VexW (int bytemode, int sizeflag)
14954
{
14955
  /* Turn off the REX.W bit since it is used for swapping operands
14956
     now.  */
14957
  rex &= ~REX_W;
14958
  OP_XMM (bytemode, sizeflag);
14959
}
14960
 
14961
static void
14962
OP_EX_Vex (int bytemode, int sizeflag)
14963
{
14964
  if (modrm.mod != 3)
14965
    {
14966
      if (vex.register_specifier != 0)
14967
        BadOp ();
14968
      need_vex_reg = 0;
14969
    }
14970
  OP_EX (bytemode, sizeflag);
14971
}
14972
 
14973
static void
14974
OP_XMM_Vex (int bytemode, int sizeflag)
14975
{
14976
  if (modrm.mod != 3)
14977
    {
14978
      if (vex.register_specifier != 0)
14979
        BadOp ();
14980
      need_vex_reg = 0;
14981
    }
14982
  OP_XMM (bytemode, sizeflag);
14983
}
14984
 
14985
static void
14986
VZERO_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14987
{
14988
  switch (vex.length)
14989
    {
14990
    case 128:
14991
      mnemonicendp = stpcpy (obuf, "vzeroupper");
14992
      break;
14993
    case 256:
14994
      mnemonicendp = stpcpy (obuf, "vzeroall");
14995
      break;
14996
    default:
14997
      abort ();
14998
    }
14999
}
15000
 
15001
static struct op vex_cmp_op[] =
15002
{
15003
  { STRING_COMMA_LEN ("eq") },
15004
  { STRING_COMMA_LEN ("lt") },
15005
  { STRING_COMMA_LEN ("le") },
15006
  { STRING_COMMA_LEN ("unord") },
15007
  { STRING_COMMA_LEN ("neq") },
15008
  { STRING_COMMA_LEN ("nlt") },
15009
  { STRING_COMMA_LEN ("nle") },
15010
  { STRING_COMMA_LEN ("ord") },
15011
  { STRING_COMMA_LEN ("eq_uq") },
15012
  { STRING_COMMA_LEN ("nge") },
15013
  { STRING_COMMA_LEN ("ngt") },
15014
  { STRING_COMMA_LEN ("false") },
15015
  { STRING_COMMA_LEN ("neq_oq") },
15016
  { STRING_COMMA_LEN ("ge") },
15017
  { STRING_COMMA_LEN ("gt") },
15018
  { STRING_COMMA_LEN ("true") },
15019
  { STRING_COMMA_LEN ("eq_os") },
15020
  { STRING_COMMA_LEN ("lt_oq") },
15021
  { STRING_COMMA_LEN ("le_oq") },
15022
  { STRING_COMMA_LEN ("unord_s") },
15023
  { STRING_COMMA_LEN ("neq_us") },
15024
  { STRING_COMMA_LEN ("nlt_uq") },
15025
  { STRING_COMMA_LEN ("nle_uq") },
15026
  { STRING_COMMA_LEN ("ord_s") },
15027
  { STRING_COMMA_LEN ("eq_us") },
15028
  { STRING_COMMA_LEN ("nge_uq") },
15029
  { STRING_COMMA_LEN ("ngt_uq") },
15030
  { STRING_COMMA_LEN ("false_os") },
15031
  { STRING_COMMA_LEN ("neq_os") },
15032
  { STRING_COMMA_LEN ("ge_oq") },
15033
  { STRING_COMMA_LEN ("gt_oq") },
15034
  { STRING_COMMA_LEN ("true_us") },
15035
};
15036
 
15037
static void
15038
VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15039
{
15040
  unsigned int cmp_type;
15041
 
15042
  FETCH_DATA (the_info, codep + 1);
15043
  cmp_type = *codep++ & 0xff;
15044
  if (cmp_type < ARRAY_SIZE (vex_cmp_op))
15045
    {
15046
      char suffix [3];
15047
      char *p = mnemonicendp - 2;
15048
      suffix[0] = p[0];
15049
      suffix[1] = p[1];
15050
      suffix[2] = '\0';
15051
      sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
15052
      mnemonicendp += vex_cmp_op[cmp_type].len;
15053
    }
15054
  else
15055
    {
15056
      /* We have a reserved extension byte.  Output it directly.  */
15057
      scratchbuf[0] = '$';
15058
      print_operand_value (scratchbuf + 1, 1, cmp_type);
15059
      oappend (scratchbuf + intel_syntax);
15060
      scratchbuf[0] = '\0';
15061
    }
15062
}
15063
 
15064
static const struct op pclmul_op[] =
15065
{
15066
  { STRING_COMMA_LEN ("lql") },
15067
  { STRING_COMMA_LEN ("hql") },
15068
  { STRING_COMMA_LEN ("lqh") },
15069
  { STRING_COMMA_LEN ("hqh") }
15070
};
15071
 
15072
static void
15073
PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
15074
              int sizeflag ATTRIBUTE_UNUSED)
15075
{
15076
  unsigned int pclmul_type;
15077
 
15078
  FETCH_DATA (the_info, codep + 1);
15079
  pclmul_type = *codep++ & 0xff;
15080
  switch (pclmul_type)
15081
    {
15082
    case 0x10:
15083
      pclmul_type = 2;
15084
      break;
15085
    case 0x11:
15086
      pclmul_type = 3;
15087
      break;
15088
    default:
15089
      break;
15090
    }
15091
  if (pclmul_type < ARRAY_SIZE (pclmul_op))
15092
    {
15093
      char suffix [4];
15094
      char *p = mnemonicendp - 3;
15095
      suffix[0] = p[0];
15096
      suffix[1] = p[1];
15097
      suffix[2] = p[2];
15098
      suffix[3] = '\0';
15099
      sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
15100
      mnemonicendp += pclmul_op[pclmul_type].len;
15101
    }
15102
  else
15103
    {
15104
      /* We have a reserved extension byte.  Output it directly.  */
15105
      scratchbuf[0] = '$';
15106
      print_operand_value (scratchbuf + 1, 1, pclmul_type);
15107
      oappend (scratchbuf + intel_syntax);
15108
      scratchbuf[0] = '\0';
15109
    }
15110
}
15111
 
15112
static void
15113
MOVBE_Fixup (int bytemode, int sizeflag)
15114
{
15115
  /* Add proper suffix to "movbe".  */
15116
  char *p = mnemonicendp;
15117
 
15118
  switch (bytemode)
15119
    {
15120
    case v_mode:
15121
      if (intel_syntax)
15122
        goto skip;
15123
 
15124
      USED_REX (REX_W);
15125
      if (sizeflag & SUFFIX_ALWAYS)
15126
        {
15127
          if (rex & REX_W)
15128
            *p++ = 'q';
15129
          else
15130
            {
15131
              if (sizeflag & DFLAG)
15132
                *p++ = 'l';
15133
              else
15134
                *p++ = 'w';
15135
              used_prefixes |= (prefixes & PREFIX_DATA);
15136
            }
15137
        }
15138
      break;
15139
    default:
15140
      oappend (INTERNAL_DISASSEMBLER_ERROR);
15141
      break;
15142
    }
15143
  mnemonicendp = p;
15144
  *p = '\0';
15145
 
15146
skip:
15147
  OP_M (bytemode, sizeflag);
15148
}
15149
 
15150
static void
15151
OP_LWPCB_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15152
{
15153
  int reg;
15154
  const char **names;
15155
 
15156
  /* Skip mod/rm byte.  */
15157
  MODRM_CHECK;
15158
  codep++;
15159
 
15160
  if (vex.w)
15161
    names = names64;
15162
  else
15163
    names = names32;
15164
 
15165
  reg = modrm.rm;
15166
  USED_REX (REX_B);
15167
  if (rex & REX_B)
15168
    reg += 8;
15169
 
15170
  oappend (names[reg]);
15171
}
15172
 
15173
static void
15174
OP_LWP_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15175
{
15176
  const char **names;
15177
 
15178
  if (vex.w)
15179
    names = names64;
15180
  else
15181
    names = names32;
15182
 
15183
  oappend (names[vex.register_specifier]);
15184
}
15185
 

powered by: WebSVN 2.1.0

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