Coverage Report

Created: 2023-06-29 07:13

/src/binutils-gdb/opcodes/i386-dis.c
Line
Count
Source (jump to first uncovered line)
1
/* Print i386 instructions for GDB, the GNU debugger.
2
   Copyright (C) 1988-2023 Free Software Foundation, Inc.
3
4
   This file is part of the GNU opcodes library.
5
6
   This library is free software; you can redistribute it and/or modify
7
   it under the terms of the GNU General Public License as published by
8
   the Free Software Foundation; either version 3, or (at your option)
9
   any later version.
10
11
   It is distributed in the hope that it will be useful, but WITHOUT
12
   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13
   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
14
   License for more details.
15
16
   You should have received a copy of the GNU General Public License
17
   along with this program; if not, write to the Free Software
18
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19
   MA 02110-1301, USA.  */
20
21
22
/* 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu)
23
   July 1988
24
    modified by John Hassey (hassey@dg-rtp.dg.com)
25
    x86-64 support added by Jan Hubicka (jh@suse.cz)
26
    VIA PadLock support by Michal Ludvig (mludvig@suse.cz).  */
27
28
/* The main tables describing the instructions is essentially a copy
29
   of the "Opcode Map" chapter (Appendix A) of the Intel 80386
30
   Programmers Manual.  Usually, there is a capital letter, followed
31
   by a small letter.  The capital letter tell the addressing mode,
32
   and the small letter tells about the operand size.  Refer to
33
   the Intel manual for details.  */
34
35
#include "sysdep.h"
36
#include "disassemble.h"
37
#include "opintl.h"
38
#include "opcode/i386.h"
39
#include "libiberty.h"
40
#include "safe-ctype.h"
41
42
typedef struct instr_info instr_info;
43
44
static bool dofloat (instr_info *, int);
45
static int putop (instr_info *, const char *, int);
46
static void oappend_with_style (instr_info *, const char *,
47
        enum disassembler_style);
48
49
static bool OP_E (instr_info *, int, int);
50
static bool OP_E_memory (instr_info *, int, int);
51
static bool OP_indirE (instr_info *, int, int);
52
static bool OP_G (instr_info *, int, int);
53
static bool OP_ST (instr_info *, int, int);
54
static bool OP_STi (instr_info *, int, int);
55
static bool OP_Skip_MODRM (instr_info *, int, int);
56
static bool OP_REG (instr_info *, int, int);
57
static bool OP_IMREG (instr_info *, int, int);
58
static bool OP_I (instr_info *, int, int);
59
static bool OP_I64 (instr_info *, int, int);
60
static bool OP_sI (instr_info *, int, int);
61
static bool OP_J (instr_info *, int, int);
62
static bool OP_SEG (instr_info *, int, int);
63
static bool OP_DIR (instr_info *, int, int);
64
static bool OP_OFF (instr_info *, int, int);
65
static bool OP_OFF64 (instr_info *, int, int);
66
static bool OP_ESreg (instr_info *, int, int);
67
static bool OP_DSreg (instr_info *, int, int);
68
static bool OP_C (instr_info *, int, int);
69
static bool OP_D (instr_info *, int, int);
70
static bool OP_T (instr_info *, int, int);
71
static bool OP_MMX (instr_info *, int, int);
72
static bool OP_XMM (instr_info *, int, int);
73
static bool OP_EM (instr_info *, int, int);
74
static bool OP_EX (instr_info *, int, int);
75
static bool OP_EMC (instr_info *, int,int);
76
static bool OP_MXC (instr_info *, int,int);
77
static bool OP_MS (instr_info *, int, int);
78
static bool OP_XS (instr_info *, int, int);
79
static bool OP_M (instr_info *, int, int);
80
static bool OP_VEX (instr_info *, int, int);
81
static bool OP_VexR (instr_info *, int, int);
82
static bool OP_VexW (instr_info *, int, int);
83
static bool OP_Rounding (instr_info *, int, int);
84
static bool OP_REG_VexI4 (instr_info *, int, int);
85
static bool OP_VexI4 (instr_info *, int, int);
86
static bool OP_0f07 (instr_info *, int, int);
87
static bool OP_Monitor (instr_info *, int, int);
88
static bool OP_Mwait (instr_info *, int, int);
89
90
static bool PCLMUL_Fixup (instr_info *, int, int);
91
static bool VPCMP_Fixup (instr_info *, int, int);
92
static bool VPCOM_Fixup (instr_info *, int, int);
93
static bool NOP_Fixup (instr_info *, int, int);
94
static bool OP_3DNowSuffix (instr_info *, int, int);
95
static bool CMP_Fixup (instr_info *, int, int);
96
static bool REP_Fixup (instr_info *, int, int);
97
static bool SEP_Fixup (instr_info *, int, int);
98
static bool BND_Fixup (instr_info *, int, int);
99
static bool NOTRACK_Fixup (instr_info *, int, int);
100
static bool HLE_Fixup1 (instr_info *, int, int);
101
static bool HLE_Fixup2 (instr_info *, int, int);
102
static bool HLE_Fixup3 (instr_info *, int, int);
103
static bool CMPXCHG8B_Fixup (instr_info *, int, int);
104
static bool XMM_Fixup (instr_info *, int, int);
105
static bool FXSAVE_Fixup (instr_info *, int, int);
106
static bool MOVSXD_Fixup (instr_info *, int, int);
107
static bool DistinctDest_Fixup (instr_info *, int, int);
108
static bool PREFETCHI_Fixup (instr_info *, int, int);
109
110
static void ATTRIBUTE_PRINTF_3 i386_dis_printf (const disassemble_info *,
111
            enum disassembler_style,
112
            const char *, ...);
113
114
/* This character is used to encode style information within the output
115
   buffers.  See oappend_insert_style for more details.  */
116
420M
#define STYLE_MARKER_CHAR '\002'
117
118
/* The maximum operand buffer size.  */
119
#define MAX_OPERAND_BUFFER_SIZE 128
120
121
enum address_mode
122
{
123
  mode_16bit,
124
  mode_32bit,
125
  mode_64bit
126
};
127
128
static const char *prefix_name (enum address_mode, uint8_t, int);
129
130
enum x86_64_isa
131
{
132
  amd64 = 1,
133
  intel64
134
};
135
136
struct instr_info
137
{
138
  enum address_mode address_mode;
139
140
  /* Flags for the prefixes for the current instruction.  See below.  */
141
  int prefixes;
142
143
  /* REX prefix the current instruction.  See below.  */
144
  uint8_t rex;
145
  /* Bits of REX we've already used.  */
146
  uint8_t rex_used;
147
148
  bool need_modrm;
149
  bool need_vex;
150
  bool has_sib;
151
152
  /* Flags for ins->prefixes which we somehow handled when printing the
153
     current instruction.  */
154
  int used_prefixes;
155
156
  /* Flags for EVEX bits which we somehow handled when printing the
157
     current instruction.  */
158
  int evex_used;
159
160
  char obuf[MAX_OPERAND_BUFFER_SIZE];
161
  char *obufp;
162
  char *mnemonicendp;
163
  const uint8_t *start_codep;
164
  uint8_t *codep;
165
  const uint8_t *end_codep;
166
  unsigned char nr_prefixes;
167
  signed char last_lock_prefix;
168
  signed char last_repz_prefix;
169
  signed char last_repnz_prefix;
170
  signed char last_data_prefix;
171
  signed char last_addr_prefix;
172
  signed char last_rex_prefix;
173
  signed char last_seg_prefix;
174
  signed char fwait_prefix;
175
  /* The active segment register prefix.  */
176
  unsigned char active_seg_prefix;
177
178
20.9M
#define MAX_CODE_LENGTH 15
179
  /* We can up to 14 ins->prefixes since the maximum instruction length is
180
     15bytes.  */
181
  uint8_t all_prefixes[MAX_CODE_LENGTH - 1];
182
  disassemble_info *info;
183
184
  struct
185
  {
186
    int mod;
187
    int reg;
188
    int rm;
189
  }
190
  modrm;
191
192
  struct
193
  {
194
    int scale;
195
    int index;
196
    int base;
197
  }
198
  sib;
199
200
  struct
201
  {
202
    int register_specifier;
203
    int length;
204
    int prefix;
205
    int mask_register_specifier;
206
    int ll;
207
    bool w;
208
    bool evex;
209
    bool r;
210
    bool v;
211
    bool zeroing;
212
    bool b;
213
    bool no_broadcast;
214
  }
215
  vex;
216
217
  /* Remember if the current op is a jump instruction.  */
218
  bool op_is_jump;
219
220
  bool two_source_ops;
221
222
  unsigned char op_ad;
223
  signed char op_index[MAX_OPERANDS];
224
  bool op_riprel[MAX_OPERANDS];
225
  char *op_out[MAX_OPERANDS];
226
  bfd_vma op_address[MAX_OPERANDS];
227
  bfd_vma start_pc;
228
229
  /* On the 386's of 1988, the maximum length of an instruction is 15 bytes.
230
   *   (see topic "Redundant ins->prefixes" in the "Differences from 8086"
231
   *   section of the "Virtual 8086 Mode" chapter.)
232
   * 'pc' should be the address of this instruction, it will
233
   *   be used to print the target address if this is a relative jump or call
234
   * The function returns the length of this instruction in bytes.
235
   */
236
  char intel_syntax;
237
  bool intel_mnemonic;
238
  char open_char;
239
  char close_char;
240
  char separator_char;
241
  char scale_char;
242
243
  enum x86_64_isa isa64;
244
};
245
246
struct dis_private {
247
  bfd_vma insn_start;
248
  int orig_sizeflag;
249
250
  /* Indexes first byte not fetched.  */
251
  unsigned int fetched;
252
  uint8_t the_buffer[2 * MAX_CODE_LENGTH - 1];
253
};
254
255
/* Mark parts used in the REX prefix.  When we are testing for
256
   empty prefix (for 8bit register REX extension), just mask it
257
   out.  Otherwise test for REX bit is excuse for existence of REX
258
   only in case value is nonzero.  */
259
#define USED_REX(value)         \
260
13.5M
  {             \
261
13.5M
    if (value)           \
262
13.5M
      {             \
263
13.0M
  if ((ins->rex & value))       \
264
13.0M
    ins->rex_used |= (value) | REX_OPCODE; \
265
13.0M
      }              \
266
13.5M
    else            \
267
13.5M
      ins->rex_used |= REX_OPCODE;     \
268
13.5M
  }
269
270
271
23.0k
#define EVEX_b_used 1
272
90.7k
#define EVEX_len_used 2
273
274
/* Flags stored in PREFIXES.  */
275
692k
#define PREFIX_REPZ 1
276
1.28M
#define PREFIX_REPNZ 2
277
12.1M
#define PREFIX_CS 4
278
9.70M
#define PREFIX_SS 8
279
11.9M
#define PREFIX_DS 0x10
280
9.70M
#define PREFIX_ES 0x20
281
9.81M
#define PREFIX_FS 0x40
282
9.82M
#define PREFIX_GS 0x80
283
2.08M
#define PREFIX_LOCK 0x100
284
24.3M
#define PREFIX_DATA 0x200
285
23.6M
#define PREFIX_ADDR 0x400
286
9.80M
#define PREFIX_FWAIT 0x800
287
288
/* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
289
   to ADDR (exclusive) are valid.  Returns true for success, false
290
   on error.  */
291
static bool
292
fetch_code (struct disassemble_info *info, const uint8_t *until)
293
30.8M
{
294
30.8M
  int status = -1;
295
30.8M
  struct dis_private *priv = info->private_data;
296
30.8M
  bfd_vma start = priv->insn_start + priv->fetched;
297
30.8M
  uint8_t *fetch_end = priv->the_buffer + priv->fetched;
298
30.8M
  ptrdiff_t needed = until - fetch_end;
299
300
30.8M
  if (needed <= 0)
301
9.78M
    return true;
302
303
21.0M
  if (priv->fetched + (size_t) needed <= ARRAY_SIZE (priv->the_buffer))
304
21.0M
    status = (*info->read_memory_func) (start, fetch_end, needed, info);
305
21.0M
  if (status != 0)
306
13.3k
    {
307
      /* If we did manage to read at least one byte, then
308
   print_insn_i386 will do something sensible.  Otherwise, print
309
   an error.  We do that here because this is where we know
310
   STATUS.  */
311
13.3k
      if (!priv->fetched)
312
612
  (*info->memory_error_func) (status, start, info);
313
13.3k
      return false;
314
13.3k
    }
315
316
20.9M
  priv->fetched += needed;
317
20.9M
  return true;
318
21.0M
}
319
320
static bool
321
fetch_modrm (instr_info *ins)
322
5.38M
{
323
5.38M
  if (!fetch_code (ins->info, ins->codep + 1))
324
3.97k
    return false;
325
326
5.38M
  ins->modrm.mod = (*ins->codep >> 6) & 3;
327
5.38M
  ins->modrm.reg = (*ins->codep >> 3) & 7;
328
5.38M
  ins->modrm.rm = *ins->codep & 7;
329
330
5.38M
  return true;
331
5.38M
}
332
333
static int
334
fetch_error (const instr_info *ins)
335
13.3k
{
336
  /* Getting here means we tried for data but didn't get it.  That
337
     means we have an incomplete instruction of some sort.  Just
338
     print the first byte as a prefix or a .byte pseudo-op.  */
339
13.3k
  const struct dis_private *priv = ins->info->private_data;
340
13.3k
  const char *name = NULL;
341
342
13.3k
  if (ins->codep <= priv->the_buffer)
343
612
    return -1;
344
345
12.7k
  if (ins->prefixes || ins->fwait_prefix >= 0 || (ins->rex & REX_OPCODE))
346
2.67k
    name = prefix_name (ins->address_mode, priv->the_buffer[0],
347
2.67k
      priv->orig_sizeflag);
348
12.7k
  if (name != NULL)
349
2.67k
    i386_dis_printf (ins->info, dis_style_mnemonic, "%s", name);
350
10.0k
  else
351
10.0k
    {
352
      /* Just print the first byte as a .byte instruction.  */
353
10.0k
      i386_dis_printf (ins->info, dis_style_assembler_directive, ".byte ");
354
10.0k
      i386_dis_printf (ins->info, dis_style_immediate, "%#x",
355
10.0k
           (unsigned int) priv->the_buffer[0]);
356
10.0k
    }
357
358
12.7k
  return 1;
359
13.3k
}
360
361
/* Possible values for prefix requirement.  */
362
41.5k
#define PREFIX_IGNORED_SHIFT  16
363
11.0k
#define PREFIX_IGNORED_REPZ (PREFIX_REPZ << PREFIX_IGNORED_SHIFT)
364
11.0k
#define PREFIX_IGNORED_REPNZ  (PREFIX_REPNZ << PREFIX_IGNORED_SHIFT)
365
11.0k
#define PREFIX_IGNORED_DATA (PREFIX_DATA << PREFIX_IGNORED_SHIFT)
366
#define PREFIX_IGNORED_ADDR (PREFIX_ADDR << PREFIX_IGNORED_SHIFT)
367
#define PREFIX_IGNORED_LOCK (PREFIX_LOCK << PREFIX_IGNORED_SHIFT)
368
369
/* Opcode prefixes.  */
370
50.2k
#define PREFIX_OPCODE   (PREFIX_REPZ \
371
50.2k
         | PREFIX_REPNZ \
372
50.2k
         | PREFIX_DATA)
373
374
/* Prefixes ignored.  */
375
11.0k
#define PREFIX_IGNORED    (PREFIX_IGNORED_REPZ \
376
11.0k
         | PREFIX_IGNORED_REPNZ \
377
11.0k
         | PREFIX_IGNORED_DATA)
378
379
#define XX { NULL, 0 }
380
#define Bad_Opcode NULL, { { NULL, 0 } }, 0
381
382
#define Eb { OP_E, b_mode }
383
#define Ebnd { OP_E, bnd_mode }
384
#define EbS { OP_E, b_swap_mode }
385
#define EbndS { OP_E, bnd_swap_mode }
386
#define Ev { OP_E, v_mode }
387
#define Eva { OP_E, va_mode }
388
#define Ev_bnd { OP_E, v_bnd_mode }
389
#define EvS { OP_E, v_swap_mode }
390
#define Ed { OP_E, d_mode }
391
#define Edq { OP_E, dq_mode }
392
#define Edb { OP_E, db_mode }
393
#define Edw { OP_E, dw_mode }
394
#define Eq { OP_E, q_mode }
395
#define indirEv { OP_indirE, indir_v_mode }
396
#define indirEp { OP_indirE, f_mode }
397
#define stackEv { OP_E, stack_v_mode }
398
#define Em { OP_E, m_mode }
399
#define Ew { OP_E, w_mode }
400
#define M { OP_M, 0 }   /* lea, lgdt, etc. */
401
#define Ma { OP_M, a_mode }
402
#define Mb { OP_M, b_mode }
403
#define Md { OP_M, d_mode }
404
#define Mdq { OP_M, dq_mode }
405
#define Mo { OP_M, o_mode }
406
#define Mp { OP_M, f_mode }   /* 32 or 48 bit memory operand for LDS, LES etc */
407
#define Mq { OP_M, q_mode }
408
#define Mv { OP_M, v_mode }
409
#define Mv_bnd { OP_M, v_bndmk_mode }
410
#define Mw { OP_M, w_mode }
411
#define Mx { OP_M, x_mode }
412
#define Mxmm { OP_M, xmm_mode }
413
#define Gb { OP_G, b_mode }
414
#define Gbnd { OP_G, bnd_mode }
415
#define Gv { OP_G, v_mode }
416
#define Gd { OP_G, d_mode }
417
#define Gdq { OP_G, dq_mode }
418
#define Gm { OP_G, m_mode }
419
#define Gva { OP_G, va_mode }
420
#define Gw { OP_G, w_mode }
421
#define Ib { OP_I, b_mode }
422
#define sIb { OP_sI, b_mode } /* sign extened byte */
423
#define sIbT { OP_sI, b_T_mode } /* sign extened byte like 'T' */
424
#define Iv { OP_I, v_mode }
425
#define sIv { OP_sI, v_mode }
426
#define Iv64 { OP_I64, v_mode }
427
#define Id { OP_I, d_mode }
428
#define Iw { OP_I, w_mode }
429
#define I1 { OP_I, const_1_mode }
430
#define Jb { OP_J, b_mode }
431
#define Jv { OP_J, v_mode }
432
#define Jdqw { OP_J, dqw_mode }
433
#define Cm { OP_C, m_mode }
434
#define Dm { OP_D, m_mode }
435
#define Td { OP_T, d_mode }
436
#define Skip_MODRM { OP_Skip_MODRM, 0 }
437
438
#define RMeAX { OP_REG, eAX_reg }
439
#define RMeBX { OP_REG, eBX_reg }
440
#define RMeCX { OP_REG, eCX_reg }
441
#define RMeDX { OP_REG, eDX_reg }
442
#define RMeSP { OP_REG, eSP_reg }
443
#define RMeBP { OP_REG, eBP_reg }
444
#define RMeSI { OP_REG, eSI_reg }
445
#define RMeDI { OP_REG, eDI_reg }
446
#define RMrAX { OP_REG, rAX_reg }
447
#define RMrBX { OP_REG, rBX_reg }
448
#define RMrCX { OP_REG, rCX_reg }
449
#define RMrDX { OP_REG, rDX_reg }
450
#define RMrSP { OP_REG, rSP_reg }
451
#define RMrBP { OP_REG, rBP_reg }
452
#define RMrSI { OP_REG, rSI_reg }
453
#define RMrDI { OP_REG, rDI_reg }
454
#define RMAL { OP_REG, al_reg }
455
#define RMCL { OP_REG, cl_reg }
456
#define RMDL { OP_REG, dl_reg }
457
#define RMBL { OP_REG, bl_reg }
458
#define RMAH { OP_REG, ah_reg }
459
#define RMCH { OP_REG, ch_reg }
460
#define RMDH { OP_REG, dh_reg }
461
#define RMBH { OP_REG, bh_reg }
462
#define RMAX { OP_REG, ax_reg }
463
#define RMDX { OP_REG, dx_reg }
464
465
#define eAX { OP_IMREG, eAX_reg }
466
#define AL { OP_IMREG, al_reg }
467
#define CL { OP_IMREG, cl_reg }
468
#define zAX { OP_IMREG, z_mode_ax_reg }
469
#define indirDX { OP_IMREG, indir_dx_reg }
470
471
#define Sw { OP_SEG, w_mode }
472
#define Sv { OP_SEG, v_mode }
473
#define Ap { OP_DIR, 0 }
474
#define Ob { OP_OFF64, b_mode }
475
#define Ov { OP_OFF64, v_mode }
476
#define Xb { OP_DSreg, eSI_reg }
477
#define Xv { OP_DSreg, eSI_reg }
478
#define Xz { OP_DSreg, eSI_reg }
479
#define Yb { OP_ESreg, eDI_reg }
480
#define Yv { OP_ESreg, eDI_reg }
481
#define DSBX { OP_DSreg, eBX_reg }
482
483
#define es { OP_REG, es_reg }
484
#define ss { OP_REG, ss_reg }
485
#define cs { OP_REG, cs_reg }
486
#define ds { OP_REG, ds_reg }
487
#define fs { OP_REG, fs_reg }
488
#define gs { OP_REG, gs_reg }
489
490
#define MX { OP_MMX, 0 }
491
#define XM { OP_XMM, 0 }
492
#define XMScalar { OP_XMM, scalar_mode }
493
#define XMGatherD { OP_XMM, vex_vsib_d_w_dq_mode }
494
#define XMGatherQ { OP_XMM, vex_vsib_q_w_dq_mode }
495
#define XMM { OP_XMM, xmm_mode }
496
#define TMM { OP_XMM, tmm_mode }
497
#define XMxmmq { OP_XMM, xmmq_mode }
498
#define EM { OP_EM, v_mode }
499
#define EMS { OP_EM, v_swap_mode }
500
#define EMd { OP_EM, d_mode }
501
#define EMx { OP_EM, x_mode }
502
#define EXbwUnit { OP_EX, bw_unit_mode }
503
#define EXb { OP_EX, b_mode }
504
#define EXw { OP_EX, w_mode }
505
#define EXd { OP_EX, d_mode }
506
#define EXdS { OP_EX, d_swap_mode }
507
#define EXwS { OP_EX, w_swap_mode }
508
#define EXq { OP_EX, q_mode }
509
#define EXqS { OP_EX, q_swap_mode }
510
#define EXdq { OP_EX, dq_mode }
511
#define EXx { OP_EX, x_mode }
512
#define EXxh { OP_EX, xh_mode }
513
#define EXxS { OP_EX, x_swap_mode }
514
#define EXxmm { OP_EX, xmm_mode }
515
#define EXymm { OP_EX, ymm_mode }
516
#define EXtmm { OP_EX, tmm_mode }
517
#define EXxmmq { OP_EX, xmmq_mode }
518
#define EXxmmqh { OP_EX, evex_half_bcst_xmmqh_mode }
519
#define EXEvexHalfBcstXmmq { OP_EX, evex_half_bcst_xmmq_mode }
520
#define EXxmmdw { OP_EX, xmmdw_mode }
521
#define EXxmmqd { OP_EX, xmmqd_mode }
522
#define EXxmmqdh { OP_EX, evex_half_bcst_xmmqdh_mode }
523
#define EXymmq { OP_EX, ymmq_mode }
524
#define EXEvexXGscat { OP_EX, evex_x_gscat_mode }
525
#define EXEvexXNoBcst { OP_EX, evex_x_nobcst_mode }
526
#define MS { OP_MS, v_mode }
527
#define XS { OP_XS, v_mode }
528
#define EMCq { OP_EMC, q_mode }
529
#define MXC { OP_MXC, 0 }
530
#define OPSUF { OP_3DNowSuffix, 0 }
531
#define SEP { SEP_Fixup, 0 }
532
#define CMP { CMP_Fixup, 0 }
533
#define XMM0 { XMM_Fixup, 0 }
534
#define FXSAVE { FXSAVE_Fixup, 0 }
535
536
#define Vex { OP_VEX, x_mode }
537
#define VexW { OP_VexW, x_mode }
538
#define VexScalar { OP_VEX, scalar_mode }
539
#define VexScalarR { OP_VexR, scalar_mode }
540
#define VexGatherD { OP_VEX, vex_vsib_d_w_dq_mode }
541
#define VexGatherQ { OP_VEX, vex_vsib_q_w_dq_mode }
542
#define VexGdq { OP_VEX, dq_mode }
543
#define VexTmm { OP_VEX, tmm_mode }
544
#define XMVexI4 { OP_REG_VexI4, x_mode }
545
#define XMVexScalarI4 { OP_REG_VexI4, scalar_mode }
546
#define VexI4 { OP_VexI4, 0 }
547
#define PCLMUL { PCLMUL_Fixup, 0 }
548
#define VPCMP { VPCMP_Fixup, 0 }
549
#define VPCOM { VPCOM_Fixup, 0 }
550
551
#define EXxEVexR { OP_Rounding, evex_rounding_mode }
552
#define EXxEVexR64 { OP_Rounding, evex_rounding_64_mode }
553
#define EXxEVexS { OP_Rounding, evex_sae_mode }
554
555
#define MaskG { OP_G, mask_mode }
556
#define MaskE { OP_E, mask_mode }
557
#define MaskBDE { OP_E, mask_bd_mode }
558
#define MaskVex { OP_VEX, mask_mode }
559
560
#define MVexVSIBDWpX { OP_M, vex_vsib_d_w_dq_mode }
561
#define MVexVSIBQWpX { OP_M, vex_vsib_q_w_dq_mode }
562
563
#define MVexSIBMEM { OP_M, vex_sibmem_mode }
564
565
/* Used handle "rep" prefix for string instructions.  */
566
#define Xbr { REP_Fixup, eSI_reg }
567
#define Xvr { REP_Fixup, eSI_reg }
568
#define Ybr { REP_Fixup, eDI_reg }
569
#define Yvr { REP_Fixup, eDI_reg }
570
#define Yzr { REP_Fixup, eDI_reg }
571
#define indirDXr { REP_Fixup, indir_dx_reg }
572
#define ALr { REP_Fixup, al_reg }
573
#define eAXr { REP_Fixup, eAX_reg }
574
575
/* Used handle HLE prefix for lockable instructions.  */
576
#define Ebh1 { HLE_Fixup1, b_mode }
577
#define Evh1 { HLE_Fixup1, v_mode }
578
#define Ebh2 { HLE_Fixup2, b_mode }
579
#define Evh2 { HLE_Fixup2, v_mode }
580
#define Ebh3 { HLE_Fixup3, b_mode }
581
#define Evh3 { HLE_Fixup3, v_mode }
582
583
#define BND { BND_Fixup, 0 }
584
#define NOTRACK { NOTRACK_Fixup, 0 }
585
586
#define cond_jump_flag { NULL, cond_jump_mode }
587
#define loop_jcxz_flag { NULL, loop_jcxz_mode }
588
589
/* bits in sizeflag */
590
6.62M
#define SUFFIX_ALWAYS 4
591
22.6M
#define AFLAG 2
592
14.1M
#define DFLAG 1
593
594
enum
595
{
596
  /* byte operand */
597
  b_mode = 1,
598
  /* byte operand with operand swapped */
599
  b_swap_mode,
600
  /* byte operand, sign extend like 'T' suffix */
601
  b_T_mode,
602
  /* operand size depends on prefixes */
603
  v_mode,
604
  /* operand size depends on prefixes with operand swapped */
605
  v_swap_mode,
606
  /* operand size depends on address prefix */
607
  va_mode,
608
  /* word operand */
609
  w_mode,
610
  /* double word operand  */
611
  d_mode,
612
  /* word operand with operand swapped  */
613
  w_swap_mode,
614
  /* double word operand with operand swapped */
615
  d_swap_mode,
616
  /* quad word operand */
617
  q_mode,
618
  /* quad word operand with operand swapped */
619
  q_swap_mode,
620
  /* ten-byte operand */
621
  t_mode,
622
  /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand.  In EVEX with
623
     broadcast enabled.  */
624
  x_mode,
625
  /* Similar to x_mode, but with different EVEX mem shifts.  */
626
  evex_x_gscat_mode,
627
  /* Similar to x_mode, but with yet different EVEX mem shifts.  */
628
  bw_unit_mode,
629
  /* Similar to x_mode, but with disabled broadcast.  */
630
  evex_x_nobcst_mode,
631
  /* Similar to x_mode, but with operands swapped and disabled broadcast
632
     in EVEX.  */
633
  x_swap_mode,
634
  /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand.  In EVEX with
635
     broadcast of 16bit enabled.  */
636
  xh_mode,
637
  /* 16-byte XMM operand */
638
  xmm_mode,
639
  /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
640
     memory operand (depending on vector length).  Broadcast isn't
641
     allowed.  */
642
  xmmq_mode,
643
  /* Same as xmmq_mode, but broadcast is allowed.  */
644
  evex_half_bcst_xmmq_mode,
645
  /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
646
     memory operand (depending on vector length).  16bit broadcast.  */
647
  evex_half_bcst_xmmqh_mode,
648
  /* 16-byte XMM, word, double word or quad word operand.  */
649
  xmmdw_mode,
650
  /* 16-byte XMM, double word, quad word operand or xmm word operand.  */
651
  xmmqd_mode,
652
  /* 16-byte XMM, double word, quad word operand or xmm word operand.
653
     16bit broadcast.  */
654
  evex_half_bcst_xmmqdh_mode,
655
  /* 32-byte YMM operand */
656
  ymm_mode,
657
  /* quad word, ymmword or zmmword memory operand.  */
658
  ymmq_mode,
659
  /* TMM operand */
660
  tmm_mode,
661
  /* d_mode in 32bit, q_mode in 64bit mode.  */
662
  m_mode,
663
  /* pair of v_mode operands */
664
  a_mode,
665
  cond_jump_mode,
666
  loop_jcxz_mode,
667
  movsxd_mode,
668
  v_bnd_mode,
669
  /* like v_bnd_mode in 32bit, no RIP-rel in 64bit mode.  */
670
  v_bndmk_mode,
671
  /* operand size depends on REX.W / VEX.W.  */
672
  dq_mode,
673
  /* Displacements like v_mode without considering Intel64 ISA.  */
674
  dqw_mode,
675
  /* bounds operand */
676
  bnd_mode,
677
  /* bounds operand with operand swapped */
678
  bnd_swap_mode,
679
  /* 4- or 6-byte pointer operand */
680
  f_mode,
681
  const_1_mode,
682
  /* v_mode for indirect branch opcodes.  */
683
  indir_v_mode,
684
  /* v_mode for stack-related opcodes.  */
685
  stack_v_mode,
686
  /* non-quad operand size depends on prefixes */
687
  z_mode,
688
  /* 16-byte operand */
689
  o_mode,
690
  /* registers like d_mode, memory like b_mode.  */
691
  db_mode,
692
  /* registers like d_mode, memory like w_mode.  */
693
  dw_mode,
694
695
  /* Operand size depends on the VEX.W bit, with VSIB dword indices.  */
696
  vex_vsib_d_w_dq_mode,
697
  /* Operand size depends on the VEX.W bit, with VSIB qword indices.  */
698
  vex_vsib_q_w_dq_mode,
699
  /* mandatory non-vector SIB.  */
700
  vex_sibmem_mode,
701
702
  /* scalar, ignore vector length.  */
703
  scalar_mode,
704
705
  /* Static rounding.  */
706
  evex_rounding_mode,
707
  /* Static rounding, 64-bit mode only.  */
708
  evex_rounding_64_mode,
709
  /* Supress all exceptions.  */
710
  evex_sae_mode,
711
712
  /* Mask register operand.  */
713
  mask_mode,
714
  /* Mask register operand.  */
715
  mask_bd_mode,
716
717
  es_reg,
718
  cs_reg,
719
  ss_reg,
720
  ds_reg,
721
  fs_reg,
722
  gs_reg,
723
724
  eAX_reg,
725
  eCX_reg,
726
  eDX_reg,
727
  eBX_reg,
728
  eSP_reg,
729
  eBP_reg,
730
  eSI_reg,
731
  eDI_reg,
732
733
  al_reg,
734
  cl_reg,
735
  dl_reg,
736
  bl_reg,
737
  ah_reg,
738
  ch_reg,
739
  dh_reg,
740
  bh_reg,
741
742
  ax_reg,
743
  cx_reg,
744
  dx_reg,
745
  bx_reg,
746
  sp_reg,
747
  bp_reg,
748
  si_reg,
749
  di_reg,
750
751
  rAX_reg,
752
  rCX_reg,
753
  rDX_reg,
754
  rBX_reg,
755
  rSP_reg,
756
  rBP_reg,
757
  rSI_reg,
758
  rDI_reg,
759
760
  z_mode_ax_reg,
761
  indir_dx_reg
762
};
763
764
enum
765
{
766
  FLOATCODE = 1,
767
  USE_REG_TABLE,
768
  USE_MOD_TABLE,
769
  USE_RM_TABLE,
770
  USE_PREFIX_TABLE,
771
  USE_X86_64_TABLE,
772
  USE_3BYTE_TABLE,
773
  USE_XOP_8F_TABLE,
774
  USE_VEX_C4_TABLE,
775
  USE_VEX_C5_TABLE,
776
  USE_VEX_LEN_TABLE,
777
  USE_VEX_W_TABLE,
778
  USE_EVEX_TABLE,
779
  USE_EVEX_LEN_TABLE
780
};
781
782
#define FLOAT     NULL, { { NULL, FLOATCODE } }, 0
783
784
#define DIS386(T, I)    NULL, { { NULL, (T)}, { NULL,  (I) } }, 0
785
#define DIS386_PREFIX(T, I, P)    NULL, { { NULL, (T)}, { NULL,  (I) } }, P
786
#define REG_TABLE(I)    DIS386 (USE_REG_TABLE, (I))
787
#define MOD_TABLE(I)    DIS386 (USE_MOD_TABLE, (I))
788
#define RM_TABLE(I)   DIS386 (USE_RM_TABLE, (I))
789
#define PREFIX_TABLE(I)   DIS386 (USE_PREFIX_TABLE, (I))
790
#define X86_64_TABLE(I)   DIS386 (USE_X86_64_TABLE, (I))
791
#define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
792
#define THREE_BYTE_TABLE_PREFIX(I, P) DIS386_PREFIX (USE_3BYTE_TABLE, (I), P)
793
#define XOP_8F_TABLE(I)   DIS386 (USE_XOP_8F_TABLE, (I))
794
#define VEX_C4_TABLE(I)   DIS386 (USE_VEX_C4_TABLE, (I))
795
#define VEX_C5_TABLE(I)   DIS386 (USE_VEX_C5_TABLE, (I))
796
#define VEX_LEN_TABLE(I)  DIS386 (USE_VEX_LEN_TABLE, (I))
797
#define VEX_W_TABLE(I)    DIS386 (USE_VEX_W_TABLE, (I))
798
#define EVEX_TABLE(I)   DIS386 (USE_EVEX_TABLE, (I))
799
#define EVEX_LEN_TABLE(I) DIS386 (USE_EVEX_LEN_TABLE, (I))
800
801
enum
802
{
803
  REG_80 = 0,
804
  REG_81,
805
  REG_83,
806
  REG_8F,
807
  REG_C0,
808
  REG_C1,
809
  REG_C6,
810
  REG_C7,
811
  REG_D0,
812
  REG_D1,
813
  REG_D2,
814
  REG_D3,
815
  REG_F6,
816
  REG_F7,
817
  REG_FE,
818
  REG_FF,
819
  REG_0F00,
820
  REG_0F01,
821
  REG_0F0D,
822
  REG_0F18,
823
  REG_0F1C_P_0_MOD_0,
824
  REG_0F1E_P_1_MOD_3,
825
  REG_0F38D8_PREFIX_1,
826
  REG_0F3A0F_PREFIX_1_MOD_3,
827
  REG_0F71_MOD_0,
828
  REG_0F72_MOD_0,
829
  REG_0F73_MOD_0,
830
  REG_0FA6,
831
  REG_0FA7,
832
  REG_0FAE,
833
  REG_0FBA,
834
  REG_0FC7,
835
  REG_VEX_0F71_M_0,
836
  REG_VEX_0F72_M_0,
837
  REG_VEX_0F73_M_0,
838
  REG_VEX_0FAE,
839
  REG_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0,
840
  REG_VEX_0F38F3_L_0,
841
842
  REG_XOP_09_01_L_0,
843
  REG_XOP_09_02_L_0,
844
  REG_XOP_09_12_M_1_L_0,
845
  REG_XOP_0A_12_L_0,
846
847
  REG_EVEX_0F71,
848
  REG_EVEX_0F72,
849
  REG_EVEX_0F73,
850
  REG_EVEX_0F38C6_M_0_L_2,
851
  REG_EVEX_0F38C7_M_0_L_2
852
};
853
854
enum
855
{
856
  MOD_62_32BIT = 0,
857
  MOD_8D,
858
  MOD_C4_32BIT,
859
  MOD_C5_32BIT,
860
  MOD_C6_REG_7,
861
  MOD_C7_REG_7,
862
  MOD_FF_REG_3,
863
  MOD_FF_REG_5,
864
  MOD_0F01_REG_0,
865
  MOD_0F01_REG_1,
866
  MOD_0F01_REG_2,
867
  MOD_0F01_REG_3,
868
  MOD_0F01_REG_5,
869
  MOD_0F01_REG_7,
870
  MOD_0F02,
871
  MOD_0F03,
872
  MOD_0F12_PREFIX_0,
873
  MOD_0F12_PREFIX_2,
874
  MOD_0F13,
875
  MOD_0F16_PREFIX_0,
876
  MOD_0F16_PREFIX_2,
877
  MOD_0F17,
878
  MOD_0F18_REG_0,
879
  MOD_0F18_REG_1,
880
  MOD_0F18_REG_2,
881
  MOD_0F18_REG_3,
882
  MOD_0F18_REG_6,
883
  MOD_0F18_REG_7,
884
  MOD_0F1A_PREFIX_0,
885
  MOD_0F1B_PREFIX_0,
886
  MOD_0F1B_PREFIX_1,
887
  MOD_0F1C_PREFIX_0,
888
  MOD_0F1E_PREFIX_1,
889
  MOD_0F2B_PREFIX_0,
890
  MOD_0F2B_PREFIX_1,
891
  MOD_0F2B_PREFIX_2,
892
  MOD_0F2B_PREFIX_3,
893
  MOD_0F50,
894
  MOD_0F71,
895
  MOD_0F72,
896
  MOD_0F73,
897
  MOD_0FAE_REG_0,
898
  MOD_0FAE_REG_1,
899
  MOD_0FAE_REG_2,
900
  MOD_0FAE_REG_3,
901
  MOD_0FAE_REG_4,
902
  MOD_0FAE_REG_5,
903
  MOD_0FAE_REG_6,
904
  MOD_0FAE_REG_7,
905
  MOD_0FB2,
906
  MOD_0FB4,
907
  MOD_0FB5,
908
  MOD_0FC3,
909
  MOD_0FC7_REG_3,
910
  MOD_0FC7_REG_4,
911
  MOD_0FC7_REG_5,
912
  MOD_0FC7_REG_6,
913
  MOD_0FC7_REG_7,
914
  MOD_0FD7,
915
  MOD_0FE7_PREFIX_2,
916
  MOD_0FF0_PREFIX_3,
917
  MOD_0F382A,
918
  MOD_0F38DC_PREFIX_1,
919
  MOD_0F38DD_PREFIX_1,
920
  MOD_0F38DE_PREFIX_1,
921
  MOD_0F38DF_PREFIX_1,
922
  MOD_0F38F5,
923
  MOD_0F38F6_PREFIX_0,
924
  MOD_0F38F8_PREFIX_1,
925
  MOD_0F38F8_PREFIX_2,
926
  MOD_0F38F8_PREFIX_3,
927
  MOD_0F38F9,
928
  MOD_0F38FA_PREFIX_1,
929
  MOD_0F38FB_PREFIX_1,
930
  MOD_0F3A0F_PREFIX_1,
931
932
  MOD_VEX_0F12_PREFIX_0,
933
  MOD_VEX_0F12_PREFIX_2,
934
  MOD_VEX_0F13,
935
  MOD_VEX_0F16_PREFIX_0,
936
  MOD_VEX_0F16_PREFIX_2,
937
  MOD_VEX_0F17,
938
  MOD_VEX_0F2B,
939
  MOD_VEX_0F41_L_1,
940
  MOD_VEX_0F42_L_1,
941
  MOD_VEX_0F44_L_0,
942
  MOD_VEX_0F45_L_1,
943
  MOD_VEX_0F46_L_1,
944
  MOD_VEX_0F47_L_1,
945
  MOD_VEX_0F4A_L_1,
946
  MOD_VEX_0F4B_L_1,
947
  MOD_VEX_0F50,
948
  MOD_VEX_0F71,
949
  MOD_VEX_0F72,
950
  MOD_VEX_0F73,
951
  MOD_VEX_0F91_L_0,
952
  MOD_VEX_0F92_L_0,
953
  MOD_VEX_0F93_L_0,
954
  MOD_VEX_0F98_L_0,
955
  MOD_VEX_0F99_L_0,
956
  MOD_VEX_0FAE_REG_2,
957
  MOD_VEX_0FAE_REG_3,
958
  MOD_VEX_0FD7,
959
  MOD_VEX_0FE7,
960
  MOD_VEX_0FF0_PREFIX_3,
961
  MOD_VEX_0F381A,
962
  MOD_VEX_0F382A,
963
  MOD_VEX_0F382C,
964
  MOD_VEX_0F382D,
965
  MOD_VEX_0F382E,
966
  MOD_VEX_0F382F,
967
  MOD_VEX_0F3849_X86_64_L_0_W_0,
968
  MOD_VEX_0F384B_X86_64_L_0_W_0,
969
  MOD_VEX_0F385A,
970
  MOD_VEX_0F385C_X86_64,
971
  MOD_VEX_0F385E_X86_64,
972
  MOD_VEX_0F386C_X86_64,
973
  MOD_VEX_0F388C,
974
  MOD_VEX_0F388E,
975
  MOD_VEX_0F3A30_L_0,
976
  MOD_VEX_0F3A31_L_0,
977
  MOD_VEX_0F3A32_L_0,
978
  MOD_VEX_0F3A33_L_0,
979
980
  MOD_XOP_09_12,
981
982
  MOD_EVEX_0F381A,
983
  MOD_EVEX_0F381B,
984
  MOD_EVEX_0F3828_P_1,
985
  MOD_EVEX_0F382A_P_1_W_1,
986
  MOD_EVEX_0F3838_P_1,
987
  MOD_EVEX_0F383A_P_1_W_0,
988
  MOD_EVEX_0F385A,
989
  MOD_EVEX_0F385B,
990
  MOD_EVEX_0F387A_W_0,
991
  MOD_EVEX_0F387B_W_0,
992
  MOD_EVEX_0F387C,
993
  MOD_EVEX_0F38C6,
994
  MOD_EVEX_0F38C7,
995
};
996
997
enum
998
{
999
  RM_C6_REG_7 = 0,
1000
  RM_C7_REG_7,
1001
  RM_0F01_REG_0,
1002
  RM_0F01_REG_1,
1003
  RM_0F01_REG_2,
1004
  RM_0F01_REG_3,
1005
  RM_0F01_REG_5_MOD_3,
1006
  RM_0F01_REG_7_MOD_3,
1007
  RM_0F1E_P_1_MOD_3_REG_7,
1008
  RM_0FAE_REG_6_MOD_3_P_0,
1009
  RM_0FAE_REG_7_MOD_3,
1010
  RM_0F3A0F_P_1_MOD_3_REG_0,
1011
1012
  RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0_R_0,
1013
  RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_3,
1014
};
1015
1016
enum
1017
{
1018
  PREFIX_90 = 0,
1019
  PREFIX_0F00_REG_6_X86_64,
1020
  PREFIX_0F01_REG_0_MOD_3_RM_6,
1021
  PREFIX_0F01_REG_1_RM_2,
1022
  PREFIX_0F01_REG_1_RM_4,
1023
  PREFIX_0F01_REG_1_RM_5,
1024
  PREFIX_0F01_REG_1_RM_6,
1025
  PREFIX_0F01_REG_1_RM_7,
1026
  PREFIX_0F01_REG_3_RM_1,
1027
  PREFIX_0F01_REG_5_MOD_0,
1028
  PREFIX_0F01_REG_5_MOD_3_RM_0,
1029
  PREFIX_0F01_REG_5_MOD_3_RM_1,
1030
  PREFIX_0F01_REG_5_MOD_3_RM_2,
1031
  PREFIX_0F01_REG_5_MOD_3_RM_4,
1032
  PREFIX_0F01_REG_5_MOD_3_RM_5,
1033
  PREFIX_0F01_REG_5_MOD_3_RM_6,
1034
  PREFIX_0F01_REG_5_MOD_3_RM_7,
1035
  PREFIX_0F01_REG_7_MOD_3_RM_2,
1036
  PREFIX_0F01_REG_7_MOD_3_RM_5,
1037
  PREFIX_0F01_REG_7_MOD_3_RM_6,
1038
  PREFIX_0F01_REG_7_MOD_3_RM_7,
1039
  PREFIX_0F09,
1040
  PREFIX_0F10,
1041
  PREFIX_0F11,
1042
  PREFIX_0F12,
1043
  PREFIX_0F16,
1044
  PREFIX_0F18_REG_6_MOD_0_X86_64,
1045
  PREFIX_0F18_REG_7_MOD_0_X86_64,
1046
  PREFIX_0F1A,
1047
  PREFIX_0F1B,
1048
  PREFIX_0F1C,
1049
  PREFIX_0F1E,
1050
  PREFIX_0F2A,
1051
  PREFIX_0F2B,
1052
  PREFIX_0F2C,
1053
  PREFIX_0F2D,
1054
  PREFIX_0F2E,
1055
  PREFIX_0F2F,
1056
  PREFIX_0F51,
1057
  PREFIX_0F52,
1058
  PREFIX_0F53,
1059
  PREFIX_0F58,
1060
  PREFIX_0F59,
1061
  PREFIX_0F5A,
1062
  PREFIX_0F5B,
1063
  PREFIX_0F5C,
1064
  PREFIX_0F5D,
1065
  PREFIX_0F5E,
1066
  PREFIX_0F5F,
1067
  PREFIX_0F60,
1068
  PREFIX_0F61,
1069
  PREFIX_0F62,
1070
  PREFIX_0F6F,
1071
  PREFIX_0F70,
1072
  PREFIX_0F78,
1073
  PREFIX_0F79,
1074
  PREFIX_0F7C,
1075
  PREFIX_0F7D,
1076
  PREFIX_0F7E,
1077
  PREFIX_0F7F,
1078
  PREFIX_0FAE_REG_0_MOD_3,
1079
  PREFIX_0FAE_REG_1_MOD_3,
1080
  PREFIX_0FAE_REG_2_MOD_3,
1081
  PREFIX_0FAE_REG_3_MOD_3,
1082
  PREFIX_0FAE_REG_4_MOD_0,
1083
  PREFIX_0FAE_REG_4_MOD_3,
1084
  PREFIX_0FAE_REG_5_MOD_3,
1085
  PREFIX_0FAE_REG_6_MOD_0,
1086
  PREFIX_0FAE_REG_6_MOD_3,
1087
  PREFIX_0FAE_REG_7_MOD_0,
1088
  PREFIX_0FB8,
1089
  PREFIX_0FBC,
1090
  PREFIX_0FBD,
1091
  PREFIX_0FC2,
1092
  PREFIX_0FC7_REG_6_MOD_0,
1093
  PREFIX_0FC7_REG_6_MOD_3,
1094
  PREFIX_0FC7_REG_7_MOD_3,
1095
  PREFIX_0FD0,
1096
  PREFIX_0FD6,
1097
  PREFIX_0FE6,
1098
  PREFIX_0FE7,
1099
  PREFIX_0FF0,
1100
  PREFIX_0FF7,
1101
  PREFIX_0F38D8,
1102
  PREFIX_0F38DC,
1103
  PREFIX_0F38DD,
1104
  PREFIX_0F38DE,
1105
  PREFIX_0F38DF,
1106
  PREFIX_0F38F0,
1107
  PREFIX_0F38F1,
1108
  PREFIX_0F38F6,
1109
  PREFIX_0F38F8,
1110
  PREFIX_0F38FA,
1111
  PREFIX_0F38FB,
1112
  PREFIX_0F38FC,
1113
  PREFIX_0F3A0F,
1114
  PREFIX_VEX_0F10,
1115
  PREFIX_VEX_0F11,
1116
  PREFIX_VEX_0F12,
1117
  PREFIX_VEX_0F16,
1118
  PREFIX_VEX_0F2A,
1119
  PREFIX_VEX_0F2C,
1120
  PREFIX_VEX_0F2D,
1121
  PREFIX_VEX_0F2E,
1122
  PREFIX_VEX_0F2F,
1123
  PREFIX_VEX_0F41_L_1_M_1_W_0,
1124
  PREFIX_VEX_0F41_L_1_M_1_W_1,
1125
  PREFIX_VEX_0F42_L_1_M_1_W_0,
1126
  PREFIX_VEX_0F42_L_1_M_1_W_1,
1127
  PREFIX_VEX_0F44_L_0_M_1_W_0,
1128
  PREFIX_VEX_0F44_L_0_M_1_W_1,
1129
  PREFIX_VEX_0F45_L_1_M_1_W_0,
1130
  PREFIX_VEX_0F45_L_1_M_1_W_1,
1131
  PREFIX_VEX_0F46_L_1_M_1_W_0,
1132
  PREFIX_VEX_0F46_L_1_M_1_W_1,
1133
  PREFIX_VEX_0F47_L_1_M_1_W_0,
1134
  PREFIX_VEX_0F47_L_1_M_1_W_1,
1135
  PREFIX_VEX_0F4A_L_1_M_1_W_0,
1136
  PREFIX_VEX_0F4A_L_1_M_1_W_1,
1137
  PREFIX_VEX_0F4B_L_1_M_1_W_0,
1138
  PREFIX_VEX_0F4B_L_1_M_1_W_1,
1139
  PREFIX_VEX_0F51,
1140
  PREFIX_VEX_0F52,
1141
  PREFIX_VEX_0F53,
1142
  PREFIX_VEX_0F58,
1143
  PREFIX_VEX_0F59,
1144
  PREFIX_VEX_0F5A,
1145
  PREFIX_VEX_0F5B,
1146
  PREFIX_VEX_0F5C,
1147
  PREFIX_VEX_0F5D,
1148
  PREFIX_VEX_0F5E,
1149
  PREFIX_VEX_0F5F,
1150
  PREFIX_VEX_0F6F,
1151
  PREFIX_VEX_0F70,
1152
  PREFIX_VEX_0F7C,
1153
  PREFIX_VEX_0F7D,
1154
  PREFIX_VEX_0F7E,
1155
  PREFIX_VEX_0F7F,
1156
  PREFIX_VEX_0F90_L_0_W_0,
1157
  PREFIX_VEX_0F90_L_0_W_1,
1158
  PREFIX_VEX_0F91_L_0_M_0_W_0,
1159
  PREFIX_VEX_0F91_L_0_M_0_W_1,
1160
  PREFIX_VEX_0F92_L_0_M_1_W_0,
1161
  PREFIX_VEX_0F92_L_0_M_1_W_1,
1162
  PREFIX_VEX_0F93_L_0_M_1_W_0,
1163
  PREFIX_VEX_0F93_L_0_M_1_W_1,
1164
  PREFIX_VEX_0F98_L_0_M_1_W_0,
1165
  PREFIX_VEX_0F98_L_0_M_1_W_1,
1166
  PREFIX_VEX_0F99_L_0_M_1_W_0,
1167
  PREFIX_VEX_0F99_L_0_M_1_W_1,
1168
  PREFIX_VEX_0FC2,
1169
  PREFIX_VEX_0FD0,
1170
  PREFIX_VEX_0FE6,
1171
  PREFIX_VEX_0FF0,
1172
  PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_0,
1173
  PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_1,
1174
  PREFIX_VEX_0F384B_X86_64_L_0_W_0_M_0,
1175
  PREFIX_VEX_0F3850_W_0,
1176
  PREFIX_VEX_0F3851_W_0,
1177
  PREFIX_VEX_0F385C_X86_64_M_1_L_0_W_0,
1178
  PREFIX_VEX_0F385E_X86_64_M_1_L_0_W_0,
1179
  PREFIX_VEX_0F386C_X86_64_M_1_L_0_W_0,
1180
  PREFIX_VEX_0F3872,
1181
  PREFIX_VEX_0F38B0_W_0,
1182
  PREFIX_VEX_0F38B1_W_0,
1183
  PREFIX_VEX_0F38F5_L_0,
1184
  PREFIX_VEX_0F38F6_L_0,
1185
  PREFIX_VEX_0F38F7_L_0,
1186
  PREFIX_VEX_0F3AF0_L_0,
1187
1188
  PREFIX_EVEX_0F5B,
1189
  PREFIX_EVEX_0F6F,
1190
  PREFIX_EVEX_0F70,
1191
  PREFIX_EVEX_0F78,
1192
  PREFIX_EVEX_0F79,
1193
  PREFIX_EVEX_0F7A,
1194
  PREFIX_EVEX_0F7B,
1195
  PREFIX_EVEX_0F7E,
1196
  PREFIX_EVEX_0F7F,
1197
  PREFIX_EVEX_0FC2,
1198
  PREFIX_EVEX_0FE6,
1199
  PREFIX_EVEX_0F3810,
1200
  PREFIX_EVEX_0F3811,
1201
  PREFIX_EVEX_0F3812,
1202
  PREFIX_EVEX_0F3813,
1203
  PREFIX_EVEX_0F3814,
1204
  PREFIX_EVEX_0F3815,
1205
  PREFIX_EVEX_0F3820,
1206
  PREFIX_EVEX_0F3821,
1207
  PREFIX_EVEX_0F3822,
1208
  PREFIX_EVEX_0F3823,
1209
  PREFIX_EVEX_0F3824,
1210
  PREFIX_EVEX_0F3825,
1211
  PREFIX_EVEX_0F3826,
1212
  PREFIX_EVEX_0F3827,
1213
  PREFIX_EVEX_0F3828,
1214
  PREFIX_EVEX_0F3829,
1215
  PREFIX_EVEX_0F382A,
1216
  PREFIX_EVEX_0F3830,
1217
  PREFIX_EVEX_0F3831,
1218
  PREFIX_EVEX_0F3832,
1219
  PREFIX_EVEX_0F3833,
1220
  PREFIX_EVEX_0F3834,
1221
  PREFIX_EVEX_0F3835,
1222
  PREFIX_EVEX_0F3838,
1223
  PREFIX_EVEX_0F3839,
1224
  PREFIX_EVEX_0F383A,
1225
  PREFIX_EVEX_0F3852,
1226
  PREFIX_EVEX_0F3853,
1227
  PREFIX_EVEX_0F3868,
1228
  PREFIX_EVEX_0F3872,
1229
  PREFIX_EVEX_0F389A,
1230
  PREFIX_EVEX_0F389B,
1231
  PREFIX_EVEX_0F38AA,
1232
  PREFIX_EVEX_0F38AB,
1233
1234
  PREFIX_EVEX_0F3A08,
1235
  PREFIX_EVEX_0F3A0A,
1236
  PREFIX_EVEX_0F3A26,
1237
  PREFIX_EVEX_0F3A27,
1238
  PREFIX_EVEX_0F3A56,
1239
  PREFIX_EVEX_0F3A57,
1240
  PREFIX_EVEX_0F3A66,
1241
  PREFIX_EVEX_0F3A67,
1242
  PREFIX_EVEX_0F3AC2,
1243
1244
  PREFIX_EVEX_MAP5_10,
1245
  PREFIX_EVEX_MAP5_11,
1246
  PREFIX_EVEX_MAP5_1D,
1247
  PREFIX_EVEX_MAP5_2A,
1248
  PREFIX_EVEX_MAP5_2C,
1249
  PREFIX_EVEX_MAP5_2D,
1250
  PREFIX_EVEX_MAP5_2E,
1251
  PREFIX_EVEX_MAP5_2F,
1252
  PREFIX_EVEX_MAP5_51,
1253
  PREFIX_EVEX_MAP5_58,
1254
  PREFIX_EVEX_MAP5_59,
1255
  PREFIX_EVEX_MAP5_5A,
1256
  PREFIX_EVEX_MAP5_5B,
1257
  PREFIX_EVEX_MAP5_5C,
1258
  PREFIX_EVEX_MAP5_5D,
1259
  PREFIX_EVEX_MAP5_5E,
1260
  PREFIX_EVEX_MAP5_5F,
1261
  PREFIX_EVEX_MAP5_78,
1262
  PREFIX_EVEX_MAP5_79,
1263
  PREFIX_EVEX_MAP5_7A,
1264
  PREFIX_EVEX_MAP5_7B,
1265
  PREFIX_EVEX_MAP5_7C,
1266
  PREFIX_EVEX_MAP5_7D,
1267
1268
  PREFIX_EVEX_MAP6_13,
1269
  PREFIX_EVEX_MAP6_56,
1270
  PREFIX_EVEX_MAP6_57,
1271
  PREFIX_EVEX_MAP6_D6,
1272
  PREFIX_EVEX_MAP6_D7,
1273
};
1274
1275
enum
1276
{
1277
  X86_64_06 = 0,
1278
  X86_64_07,
1279
  X86_64_0E,
1280
  X86_64_16,
1281
  X86_64_17,
1282
  X86_64_1E,
1283
  X86_64_1F,
1284
  X86_64_27,
1285
  X86_64_2F,
1286
  X86_64_37,
1287
  X86_64_3F,
1288
  X86_64_60,
1289
  X86_64_61,
1290
  X86_64_62,
1291
  X86_64_63,
1292
  X86_64_6D,
1293
  X86_64_6F,
1294
  X86_64_82,
1295
  X86_64_9A,
1296
  X86_64_C2,
1297
  X86_64_C3,
1298
  X86_64_C4,
1299
  X86_64_C5,
1300
  X86_64_CE,
1301
  X86_64_D4,
1302
  X86_64_D5,
1303
  X86_64_E8,
1304
  X86_64_E9,
1305
  X86_64_EA,
1306
  X86_64_0F00_REG_6,
1307
  X86_64_0F01_REG_0,
1308
  X86_64_0F01_REG_0_MOD_3_RM_6_P_1,
1309
  X86_64_0F01_REG_0_MOD_3_RM_6_P_3,
1310
  X86_64_0F01_REG_1,
1311
  X86_64_0F01_REG_1_RM_2_PREFIX_1,
1312
  X86_64_0F01_REG_1_RM_2_PREFIX_3,
1313
  X86_64_0F01_REG_1_RM_5_PREFIX_2,
1314
  X86_64_0F01_REG_1_RM_6_PREFIX_2,
1315
  X86_64_0F01_REG_1_RM_7_PREFIX_2,
1316
  X86_64_0F01_REG_2,
1317
  X86_64_0F01_REG_3,
1318
  X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1,
1319
  X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1,
1320
  X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1,
1321
  X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1,
1322
  X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_1,
1323
  X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1,
1324
  X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3,
1325
  X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1,
1326
  X86_64_0F18_REG_6_MOD_0,
1327
  X86_64_0F18_REG_7_MOD_0,
1328
  X86_64_0F24,
1329
  X86_64_0F26,
1330
  X86_64_0FC7_REG_6_MOD_3_PREFIX_1,
1331
1332
  X86_64_VEX_0F3849,
1333
  X86_64_VEX_0F384B,
1334
  X86_64_VEX_0F385C,
1335
  X86_64_VEX_0F385E,
1336
  X86_64_VEX_0F386C,
1337
  X86_64_VEX_0F38E0,
1338
  X86_64_VEX_0F38E1,
1339
  X86_64_VEX_0F38E2,
1340
  X86_64_VEX_0F38E3,
1341
  X86_64_VEX_0F38E4,
1342
  X86_64_VEX_0F38E5,
1343
  X86_64_VEX_0F38E6,
1344
  X86_64_VEX_0F38E7,
1345
  X86_64_VEX_0F38E8,
1346
  X86_64_VEX_0F38E9,
1347
  X86_64_VEX_0F38EA,
1348
  X86_64_VEX_0F38EB,
1349
  X86_64_VEX_0F38EC,
1350
  X86_64_VEX_0F38ED,
1351
  X86_64_VEX_0F38EE,
1352
  X86_64_VEX_0F38EF,
1353
};
1354
1355
enum
1356
{
1357
  THREE_BYTE_0F38 = 0,
1358
  THREE_BYTE_0F3A
1359
};
1360
1361
enum
1362
{
1363
  XOP_08 = 0,
1364
  XOP_09,
1365
  XOP_0A
1366
};
1367
1368
enum
1369
{
1370
  VEX_0F = 0,
1371
  VEX_0F38,
1372
  VEX_0F3A
1373
};
1374
1375
enum
1376
{
1377
  EVEX_0F = 0,
1378
  EVEX_0F38,
1379
  EVEX_0F3A,
1380
  EVEX_MAP5,
1381
  EVEX_MAP6,
1382
};
1383
1384
enum
1385
{
1386
  VEX_LEN_0F12_P_0_M_0 = 0,
1387
  VEX_LEN_0F12_P_0_M_1,
1388
#define VEX_LEN_0F12_P_2_M_0 VEX_LEN_0F12_P_0_M_0
1389
  VEX_LEN_0F13_M_0,
1390
  VEX_LEN_0F16_P_0_M_0,
1391
  VEX_LEN_0F16_P_0_M_1,
1392
#define VEX_LEN_0F16_P_2_M_0 VEX_LEN_0F16_P_0_M_0
1393
  VEX_LEN_0F17_M_0,
1394
  VEX_LEN_0F41,
1395
  VEX_LEN_0F42,
1396
  VEX_LEN_0F44,
1397
  VEX_LEN_0F45,
1398
  VEX_LEN_0F46,
1399
  VEX_LEN_0F47,
1400
  VEX_LEN_0F4A,
1401
  VEX_LEN_0F4B,
1402
  VEX_LEN_0F6E,
1403
  VEX_LEN_0F77,
1404
  VEX_LEN_0F7E_P_1,
1405
  VEX_LEN_0F7E_P_2,
1406
  VEX_LEN_0F90,
1407
  VEX_LEN_0F91,
1408
  VEX_LEN_0F92,
1409
  VEX_LEN_0F93,
1410
  VEX_LEN_0F98,
1411
  VEX_LEN_0F99,
1412
  VEX_LEN_0FAE_R_2_M_0,
1413
  VEX_LEN_0FAE_R_3_M_0,
1414
  VEX_LEN_0FC4,
1415
  VEX_LEN_0FC5,
1416
  VEX_LEN_0FD6,
1417
  VEX_LEN_0FF7,
1418
  VEX_LEN_0F3816,
1419
  VEX_LEN_0F3819,
1420
  VEX_LEN_0F381A_M_0,
1421
  VEX_LEN_0F3836,
1422
  VEX_LEN_0F3841,
1423
  VEX_LEN_0F3849_X86_64,
1424
  VEX_LEN_0F384B_X86_64,
1425
  VEX_LEN_0F385A_M_0,
1426
  VEX_LEN_0F385C_X86_64_M_1,
1427
  VEX_LEN_0F385E_X86_64_M_1,
1428
  VEX_LEN_0F386C_X86_64_M_1,
1429
  VEX_LEN_0F38DB,
1430
  VEX_LEN_0F38F2,
1431
  VEX_LEN_0F38F3,
1432
  VEX_LEN_0F38F5,
1433
  VEX_LEN_0F38F6,
1434
  VEX_LEN_0F38F7,
1435
  VEX_LEN_0F3A00,
1436
  VEX_LEN_0F3A01,
1437
  VEX_LEN_0F3A06,
1438
  VEX_LEN_0F3A14,
1439
  VEX_LEN_0F3A15,
1440
  VEX_LEN_0F3A16,
1441
  VEX_LEN_0F3A17,
1442
  VEX_LEN_0F3A18,
1443
  VEX_LEN_0F3A19,
1444
  VEX_LEN_0F3A20,
1445
  VEX_LEN_0F3A21,
1446
  VEX_LEN_0F3A22,
1447
  VEX_LEN_0F3A30,
1448
  VEX_LEN_0F3A31,
1449
  VEX_LEN_0F3A32,
1450
  VEX_LEN_0F3A33,
1451
  VEX_LEN_0F3A38,
1452
  VEX_LEN_0F3A39,
1453
  VEX_LEN_0F3A41,
1454
  VEX_LEN_0F3A46,
1455
  VEX_LEN_0F3A60,
1456
  VEX_LEN_0F3A61,
1457
  VEX_LEN_0F3A62,
1458
  VEX_LEN_0F3A63,
1459
  VEX_LEN_0F3ADF,
1460
  VEX_LEN_0F3AF0,
1461
  VEX_LEN_0FXOP_08_85,
1462
  VEX_LEN_0FXOP_08_86,
1463
  VEX_LEN_0FXOP_08_87,
1464
  VEX_LEN_0FXOP_08_8E,
1465
  VEX_LEN_0FXOP_08_8F,
1466
  VEX_LEN_0FXOP_08_95,
1467
  VEX_LEN_0FXOP_08_96,
1468
  VEX_LEN_0FXOP_08_97,
1469
  VEX_LEN_0FXOP_08_9E,
1470
  VEX_LEN_0FXOP_08_9F,
1471
  VEX_LEN_0FXOP_08_A3,
1472
  VEX_LEN_0FXOP_08_A6,
1473
  VEX_LEN_0FXOP_08_B6,
1474
  VEX_LEN_0FXOP_08_C0,
1475
  VEX_LEN_0FXOP_08_C1,
1476
  VEX_LEN_0FXOP_08_C2,
1477
  VEX_LEN_0FXOP_08_C3,
1478
  VEX_LEN_0FXOP_08_CC,
1479
  VEX_LEN_0FXOP_08_CD,
1480
  VEX_LEN_0FXOP_08_CE,
1481
  VEX_LEN_0FXOP_08_CF,
1482
  VEX_LEN_0FXOP_08_EC,
1483
  VEX_LEN_0FXOP_08_ED,
1484
  VEX_LEN_0FXOP_08_EE,
1485
  VEX_LEN_0FXOP_08_EF,
1486
  VEX_LEN_0FXOP_09_01,
1487
  VEX_LEN_0FXOP_09_02,
1488
  VEX_LEN_0FXOP_09_12_M_1,
1489
  VEX_LEN_0FXOP_09_82_W_0,
1490
  VEX_LEN_0FXOP_09_83_W_0,
1491
  VEX_LEN_0FXOP_09_90,
1492
  VEX_LEN_0FXOP_09_91,
1493
  VEX_LEN_0FXOP_09_92,
1494
  VEX_LEN_0FXOP_09_93,
1495
  VEX_LEN_0FXOP_09_94,
1496
  VEX_LEN_0FXOP_09_95,
1497
  VEX_LEN_0FXOP_09_96,
1498
  VEX_LEN_0FXOP_09_97,
1499
  VEX_LEN_0FXOP_09_98,
1500
  VEX_LEN_0FXOP_09_99,
1501
  VEX_LEN_0FXOP_09_9A,
1502
  VEX_LEN_0FXOP_09_9B,
1503
  VEX_LEN_0FXOP_09_C1,
1504
  VEX_LEN_0FXOP_09_C2,
1505
  VEX_LEN_0FXOP_09_C3,
1506
  VEX_LEN_0FXOP_09_C6,
1507
  VEX_LEN_0FXOP_09_C7,
1508
  VEX_LEN_0FXOP_09_CB,
1509
  VEX_LEN_0FXOP_09_D1,
1510
  VEX_LEN_0FXOP_09_D2,
1511
  VEX_LEN_0FXOP_09_D3,
1512
  VEX_LEN_0FXOP_09_D6,
1513
  VEX_LEN_0FXOP_09_D7,
1514
  VEX_LEN_0FXOP_09_DB,
1515
  VEX_LEN_0FXOP_09_E1,
1516
  VEX_LEN_0FXOP_09_E2,
1517
  VEX_LEN_0FXOP_09_E3,
1518
  VEX_LEN_0FXOP_0A_12,
1519
};
1520
1521
enum
1522
{
1523
  EVEX_LEN_0F3816 = 0,
1524
  EVEX_LEN_0F3819,
1525
  EVEX_LEN_0F381A_M_0,
1526
  EVEX_LEN_0F381B_M_0,
1527
  EVEX_LEN_0F3836,
1528
  EVEX_LEN_0F385A_M_0,
1529
  EVEX_LEN_0F385B_M_0,
1530
  EVEX_LEN_0F38C6_M_0,
1531
  EVEX_LEN_0F38C7_M_0,
1532
  EVEX_LEN_0F3A00,
1533
  EVEX_LEN_0F3A01,
1534
  EVEX_LEN_0F3A18,
1535
  EVEX_LEN_0F3A19,
1536
  EVEX_LEN_0F3A1A,
1537
  EVEX_LEN_0F3A1B,
1538
  EVEX_LEN_0F3A23,
1539
  EVEX_LEN_0F3A38,
1540
  EVEX_LEN_0F3A39,
1541
  EVEX_LEN_0F3A3A,
1542
  EVEX_LEN_0F3A3B,
1543
  EVEX_LEN_0F3A43
1544
};
1545
1546
enum
1547
{
1548
  VEX_W_0F41_L_1_M_1 = 0,
1549
  VEX_W_0F42_L_1_M_1,
1550
  VEX_W_0F44_L_0_M_1,
1551
  VEX_W_0F45_L_1_M_1,
1552
  VEX_W_0F46_L_1_M_1,
1553
  VEX_W_0F47_L_1_M_1,
1554
  VEX_W_0F4A_L_1_M_1,
1555
  VEX_W_0F4B_L_1_M_1,
1556
  VEX_W_0F90_L_0,
1557
  VEX_W_0F91_L_0_M_0,
1558
  VEX_W_0F92_L_0_M_1,
1559
  VEX_W_0F93_L_0_M_1,
1560
  VEX_W_0F98_L_0_M_1,
1561
  VEX_W_0F99_L_0_M_1,
1562
  VEX_W_0F380C,
1563
  VEX_W_0F380D,
1564
  VEX_W_0F380E,
1565
  VEX_W_0F380F,
1566
  VEX_W_0F3813,
1567
  VEX_W_0F3816_L_1,
1568
  VEX_W_0F3818,
1569
  VEX_W_0F3819_L_1,
1570
  VEX_W_0F381A_M_0_L_1,
1571
  VEX_W_0F382C_M_0,
1572
  VEX_W_0F382D_M_0,
1573
  VEX_W_0F382E_M_0,
1574
  VEX_W_0F382F_M_0,
1575
  VEX_W_0F3836,
1576
  VEX_W_0F3846,
1577
  VEX_W_0F3849_X86_64_L_0,
1578
  VEX_W_0F384B_X86_64_L_0,
1579
  VEX_W_0F3850,
1580
  VEX_W_0F3851,
1581
  VEX_W_0F3852,
1582
  VEX_W_0F3853,
1583
  VEX_W_0F3858,
1584
  VEX_W_0F3859,
1585
  VEX_W_0F385A_M_0_L_0,
1586
  VEX_W_0F385C_X86_64_M_1_L_0,
1587
  VEX_W_0F385E_X86_64_M_1_L_0,
1588
  VEX_W_0F386C_X86_64_M_1_L_0,
1589
  VEX_W_0F3872_P_1,
1590
  VEX_W_0F3878,
1591
  VEX_W_0F3879,
1592
  VEX_W_0F38B0,
1593
  VEX_W_0F38B1,
1594
  VEX_W_0F38B4,
1595
  VEX_W_0F38B5,
1596
  VEX_W_0F38CF,
1597
  VEX_W_0F3A00_L_1,
1598
  VEX_W_0F3A01_L_1,
1599
  VEX_W_0F3A02,
1600
  VEX_W_0F3A04,
1601
  VEX_W_0F3A05,
1602
  VEX_W_0F3A06_L_1,
1603
  VEX_W_0F3A18_L_1,
1604
  VEX_W_0F3A19_L_1,
1605
  VEX_W_0F3A1D,
1606
  VEX_W_0F3A38_L_1,
1607
  VEX_W_0F3A39_L_1,
1608
  VEX_W_0F3A46_L_1,
1609
  VEX_W_0F3A4A,
1610
  VEX_W_0F3A4B,
1611
  VEX_W_0F3A4C,
1612
  VEX_W_0F3ACE,
1613
  VEX_W_0F3ACF,
1614
1615
  VEX_W_0FXOP_08_85_L_0,
1616
  VEX_W_0FXOP_08_86_L_0,
1617
  VEX_W_0FXOP_08_87_L_0,
1618
  VEX_W_0FXOP_08_8E_L_0,
1619
  VEX_W_0FXOP_08_8F_L_0,
1620
  VEX_W_0FXOP_08_95_L_0,
1621
  VEX_W_0FXOP_08_96_L_0,
1622
  VEX_W_0FXOP_08_97_L_0,
1623
  VEX_W_0FXOP_08_9E_L_0,
1624
  VEX_W_0FXOP_08_9F_L_0,
1625
  VEX_W_0FXOP_08_A6_L_0,
1626
  VEX_W_0FXOP_08_B6_L_0,
1627
  VEX_W_0FXOP_08_C0_L_0,
1628
  VEX_W_0FXOP_08_C1_L_0,
1629
  VEX_W_0FXOP_08_C2_L_0,
1630
  VEX_W_0FXOP_08_C3_L_0,
1631
  VEX_W_0FXOP_08_CC_L_0,
1632
  VEX_W_0FXOP_08_CD_L_0,
1633
  VEX_W_0FXOP_08_CE_L_0,
1634
  VEX_W_0FXOP_08_CF_L_0,
1635
  VEX_W_0FXOP_08_EC_L_0,
1636
  VEX_W_0FXOP_08_ED_L_0,
1637
  VEX_W_0FXOP_08_EE_L_0,
1638
  VEX_W_0FXOP_08_EF_L_0,
1639
1640
  VEX_W_0FXOP_09_80,
1641
  VEX_W_0FXOP_09_81,
1642
  VEX_W_0FXOP_09_82,
1643
  VEX_W_0FXOP_09_83,
1644
  VEX_W_0FXOP_09_C1_L_0,
1645
  VEX_W_0FXOP_09_C2_L_0,
1646
  VEX_W_0FXOP_09_C3_L_0,
1647
  VEX_W_0FXOP_09_C6_L_0,
1648
  VEX_W_0FXOP_09_C7_L_0,
1649
  VEX_W_0FXOP_09_CB_L_0,
1650
  VEX_W_0FXOP_09_D1_L_0,
1651
  VEX_W_0FXOP_09_D2_L_0,
1652
  VEX_W_0FXOP_09_D3_L_0,
1653
  VEX_W_0FXOP_09_D6_L_0,
1654
  VEX_W_0FXOP_09_D7_L_0,
1655
  VEX_W_0FXOP_09_DB_L_0,
1656
  VEX_W_0FXOP_09_E1_L_0,
1657
  VEX_W_0FXOP_09_E2_L_0,
1658
  VEX_W_0FXOP_09_E3_L_0,
1659
1660
  EVEX_W_0F5B_P_0,
1661
  EVEX_W_0F62,
1662
  EVEX_W_0F66,
1663
  EVEX_W_0F6A,
1664
  EVEX_W_0F6B,
1665
  EVEX_W_0F6C,
1666
  EVEX_W_0F6D,
1667
  EVEX_W_0F6F_P_1,
1668
  EVEX_W_0F6F_P_2,
1669
  EVEX_W_0F6F_P_3,
1670
  EVEX_W_0F70_P_2,
1671
  EVEX_W_0F72_R_2,
1672
  EVEX_W_0F72_R_6,
1673
  EVEX_W_0F73_R_2,
1674
  EVEX_W_0F73_R_6,
1675
  EVEX_W_0F76,
1676
  EVEX_W_0F78_P_0,
1677
  EVEX_W_0F78_P_2,
1678
  EVEX_W_0F79_P_0,
1679
  EVEX_W_0F79_P_2,
1680
  EVEX_W_0F7A_P_1,
1681
  EVEX_W_0F7A_P_2,
1682
  EVEX_W_0F7A_P_3,
1683
  EVEX_W_0F7B_P_2,
1684
  EVEX_W_0F7E_P_1,
1685
  EVEX_W_0F7F_P_1,
1686
  EVEX_W_0F7F_P_2,
1687
  EVEX_W_0F7F_P_3,
1688
  EVEX_W_0FD2,
1689
  EVEX_W_0FD3,
1690
  EVEX_W_0FD4,
1691
  EVEX_W_0FD6,
1692
  EVEX_W_0FE6_P_1,
1693
  EVEX_W_0FE7,
1694
  EVEX_W_0FF2,
1695
  EVEX_W_0FF3,
1696
  EVEX_W_0FF4,
1697
  EVEX_W_0FFA,
1698
  EVEX_W_0FFB,
1699
  EVEX_W_0FFE,
1700
1701
  EVEX_W_0F3810_P_1,
1702
  EVEX_W_0F3810_P_2,
1703
  EVEX_W_0F3811_P_1,
1704
  EVEX_W_0F3811_P_2,
1705
  EVEX_W_0F3812_P_1,
1706
  EVEX_W_0F3812_P_2,
1707
  EVEX_W_0F3813_P_1,
1708
  EVEX_W_0F3814_P_1,
1709
  EVEX_W_0F3815_P_1,
1710
  EVEX_W_0F3819_L_n,
1711
  EVEX_W_0F381A_M_0_L_n,
1712
  EVEX_W_0F381B_M_0_L_2,
1713
  EVEX_W_0F381E,
1714
  EVEX_W_0F381F,
1715
  EVEX_W_0F3820_P_1,
1716
  EVEX_W_0F3821_P_1,
1717
  EVEX_W_0F3822_P_1,
1718
  EVEX_W_0F3823_P_1,
1719
  EVEX_W_0F3824_P_1,
1720
  EVEX_W_0F3825_P_1,
1721
  EVEX_W_0F3825_P_2,
1722
  EVEX_W_0F3828_P_2,
1723
  EVEX_W_0F3829_P_2,
1724
  EVEX_W_0F382A_P_1,
1725
  EVEX_W_0F382A_P_2,
1726
  EVEX_W_0F382B,
1727
  EVEX_W_0F3830_P_1,
1728
  EVEX_W_0F3831_P_1,
1729
  EVEX_W_0F3832_P_1,
1730
  EVEX_W_0F3833_P_1,
1731
  EVEX_W_0F3834_P_1,
1732
  EVEX_W_0F3835_P_1,
1733
  EVEX_W_0F3835_P_2,
1734
  EVEX_W_0F3837,
1735
  EVEX_W_0F383A_P_1,
1736
  EVEX_W_0F3859,
1737
  EVEX_W_0F385A_M_0_L_n,
1738
  EVEX_W_0F385B_M_0_L_2,
1739
  EVEX_W_0F3870,
1740
  EVEX_W_0F3872_P_2,
1741
  EVEX_W_0F387A,
1742
  EVEX_W_0F387B,
1743
  EVEX_W_0F3883,
1744
1745
  EVEX_W_0F3A18_L_n,
1746
  EVEX_W_0F3A19_L_n,
1747
  EVEX_W_0F3A1A_L_2,
1748
  EVEX_W_0F3A1B_L_2,
1749
  EVEX_W_0F3A21,
1750
  EVEX_W_0F3A23_L_n,
1751
  EVEX_W_0F3A38_L_n,
1752
  EVEX_W_0F3A39_L_n,
1753
  EVEX_W_0F3A3A_L_2,
1754
  EVEX_W_0F3A3B_L_2,
1755
  EVEX_W_0F3A42,
1756
  EVEX_W_0F3A43_L_n,
1757
  EVEX_W_0F3A70,
1758
  EVEX_W_0F3A72,
1759
1760
  EVEX_W_MAP5_5B_P_0,
1761
  EVEX_W_MAP5_7A_P_3,
1762
};
1763
1764
typedef bool (*op_rtn) (instr_info *ins, int bytemode, int sizeflag);
1765
1766
struct dis386 {
1767
  const char *name;
1768
  struct
1769
    {
1770
      op_rtn rtn;
1771
      int bytemode;
1772
    } op[MAX_OPERANDS];
1773
  unsigned int prefix_requirement;
1774
};
1775
1776
/* Upper case letters in the instruction names here are macros.
1777
   'A' => print 'b' if no register operands or suffix_always is true
1778
   'B' => print 'b' if suffix_always is true
1779
   'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
1780
    size prefix
1781
   'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
1782
    suffix_always is true
1783
   'E' => print 'e' if 32-bit form of jcxz
1784
   'F' => print 'w' or 'l' depending on address size prefix (loop insns)
1785
   'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
1786
   'H' => print ",pt" or ",pn" branch hint
1787
   'I' unused.
1788
   'J' unused.
1789
   'K' => print 'd' or 'q' if rex prefix is present.
1790
   'L' unused.
1791
   'M' => print 'r' if intel_mnemonic is false.
1792
   'N' => print 'n' if instruction has no wait "prefix"
1793
   'O' => print 'd' or 'o' (or 'q' in Intel mode)
1794
   'P' => behave as 'T' except with register operand outside of suffix_always
1795
    mode
1796
   'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
1797
    is true
1798
   'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
1799
   'S' => print 'w', 'l' or 'q' if suffix_always is true
1800
   'T' => print 'w', 'l'/'d', or 'q' if instruction has an operand size
1801
    prefix or if suffix_always is true.
1802
   'U' unused.
1803
   'V' unused.
1804
   'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
1805
   'X' => print 's', 'd' depending on data16 prefix (for XMM)
1806
   'Y' unused.
1807
   'Z' => print 'q' in 64bit mode and 'l' otherwise, if suffix_always is true.
1808
   '!' => change condition from true to false or from false to true.
1809
   '%' => add 1 upper case letter to the macro.
1810
   '^' => print 'w', 'l', or 'q' (Intel64 ISA only) depending on operand size
1811
    prefix or suffix_always is true (lcall/ljmp).
1812
   '@' => in 64bit mode for Intel64 ISA or if instruction
1813
    has no operand sizing prefix, print 'q' if suffix_always is true or
1814
    nothing otherwise; behave as 'P' in all other cases
1815
1816
   2 upper case letter macros:
1817
   "XY" => print 'x' or 'y' if suffix_always is true or no register
1818
     operands and no broadcast.
1819
   "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
1820
     register operands and no broadcast.
1821
   "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
1822
   "XD" => print 'd' if !EVEX or EVEX.W=1, EVEX.W=0 is not a valid encoding
1823
   "XH" => print 'h' if EVEX.W=0, EVEX.W=1 is not a valid encoding (for FP16)
1824
   "XS" => print 's' if !EVEX or EVEX.W=0, EVEX.W=1 is not a valid encoding
1825
   "XV" => print "{vex} " pseudo prefix
1826
   "XE" => print "{evex} " pseudo prefix if no EVEX-specific functionality is
1827
     is used by an EVEX-encoded (AVX512VL) instruction.
1828
   "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand, cond
1829
     being false, or no operand at all in 64bit mode, or if suffix_always
1830
     is true.
1831
   "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
1832
   "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
1833
   "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
1834
   "DQ" => print 'd' or 'q' depending on the VEX.W bit
1835
   "BW" => print 'b' or 'w' depending on the VEX.W bit
1836
   "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
1837
     an operand size prefix, or suffix_always is true.  print
1838
     'q' if rex prefix is present.
1839
1840
   Many of the above letters print nothing in Intel mode.  See "putop"
1841
   for the details.
1842
1843
   Braces '{' and '}', and vertical bars '|', indicate alternative
1844
   mnemonic strings for AT&T and Intel.  */
1845
1846
static const struct dis386 dis386[] = {
1847
  /* 00 */
1848
  { "addB",   { Ebh1, Gb }, 0 },
1849
  { "addS",   { Evh1, Gv }, 0 },
1850
  { "addB",   { Gb, EbS }, 0 },
1851
  { "addS",   { Gv, EvS }, 0 },
1852
  { "addB",   { AL, Ib }, 0 },
1853
  { "addS",   { eAX, Iv }, 0 },
1854
  { X86_64_TABLE (X86_64_06) },
1855
  { X86_64_TABLE (X86_64_07) },
1856
  /* 08 */
1857
  { "orB",    { Ebh1, Gb }, 0 },
1858
  { "orS",    { Evh1, Gv }, 0 },
1859
  { "orB",    { Gb, EbS }, 0 },
1860
  { "orS",    { Gv, EvS }, 0 },
1861
  { "orB",    { AL, Ib }, 0 },
1862
  { "orS",    { eAX, Iv }, 0 },
1863
  { X86_64_TABLE (X86_64_0E) },
1864
  { Bad_Opcode }, /* 0x0f extended opcode escape */
1865
  /* 10 */
1866
  { "adcB",   { Ebh1, Gb }, 0 },
1867
  { "adcS",   { Evh1, Gv }, 0 },
1868
  { "adcB",   { Gb, EbS }, 0 },
1869
  { "adcS",   { Gv, EvS }, 0 },
1870
  { "adcB",   { AL, Ib }, 0 },
1871
  { "adcS",   { eAX, Iv }, 0 },
1872
  { X86_64_TABLE (X86_64_16) },
1873
  { X86_64_TABLE (X86_64_17) },
1874
  /* 18 */
1875
  { "sbbB",   { Ebh1, Gb }, 0 },
1876
  { "sbbS",   { Evh1, Gv }, 0 },
1877
  { "sbbB",   { Gb, EbS }, 0 },
1878
  { "sbbS",   { Gv, EvS }, 0 },
1879
  { "sbbB",   { AL, Ib }, 0 },
1880
  { "sbbS",   { eAX, Iv }, 0 },
1881
  { X86_64_TABLE (X86_64_1E) },
1882
  { X86_64_TABLE (X86_64_1F) },
1883
  /* 20 */
1884
  { "andB",   { Ebh1, Gb }, 0 },
1885
  { "andS",   { Evh1, Gv }, 0 },
1886
  { "andB",   { Gb, EbS }, 0 },
1887
  { "andS",   { Gv, EvS }, 0 },
1888
  { "andB",   { AL, Ib }, 0 },
1889
  { "andS",   { eAX, Iv }, 0 },
1890
  { Bad_Opcode }, /* SEG ES prefix */
1891
  { X86_64_TABLE (X86_64_27) },
1892
  /* 28 */
1893
  { "subB",   { Ebh1, Gb }, 0 },
1894
  { "subS",   { Evh1, Gv }, 0 },
1895
  { "subB",   { Gb, EbS }, 0 },
1896
  { "subS",   { Gv, EvS }, 0 },
1897
  { "subB",   { AL, Ib }, 0 },
1898
  { "subS",   { eAX, Iv }, 0 },
1899
  { Bad_Opcode }, /* SEG CS prefix */
1900
  { X86_64_TABLE (X86_64_2F) },
1901
  /* 30 */
1902
  { "xorB",   { Ebh1, Gb }, 0 },
1903
  { "xorS",   { Evh1, Gv }, 0 },
1904
  { "xorB",   { Gb, EbS }, 0 },
1905
  { "xorS",   { Gv, EvS }, 0 },
1906
  { "xorB",   { AL, Ib }, 0 },
1907
  { "xorS",   { eAX, Iv }, 0 },
1908
  { Bad_Opcode }, /* SEG SS prefix */
1909
  { X86_64_TABLE (X86_64_37) },
1910
  /* 38 */
1911
  { "cmpB",   { Eb, Gb }, 0 },
1912
  { "cmpS",   { Ev, Gv }, 0 },
1913
  { "cmpB",   { Gb, EbS }, 0 },
1914
  { "cmpS",   { Gv, EvS }, 0 },
1915
  { "cmpB",   { AL, Ib }, 0 },
1916
  { "cmpS",   { eAX, Iv }, 0 },
1917
  { Bad_Opcode }, /* SEG DS prefix */
1918
  { X86_64_TABLE (X86_64_3F) },
1919
  /* 40 */
1920
  { "inc{S|}",    { RMeAX }, 0 },
1921
  { "inc{S|}",    { RMeCX }, 0 },
1922
  { "inc{S|}",    { RMeDX }, 0 },
1923
  { "inc{S|}",    { RMeBX }, 0 },
1924
  { "inc{S|}",    { RMeSP }, 0 },
1925
  { "inc{S|}",    { RMeBP }, 0 },
1926
  { "inc{S|}",    { RMeSI }, 0 },
1927
  { "inc{S|}",    { RMeDI }, 0 },
1928
  /* 48 */
1929
  { "dec{S|}",    { RMeAX }, 0 },
1930
  { "dec{S|}",    { RMeCX }, 0 },
1931
  { "dec{S|}",    { RMeDX }, 0 },
1932
  { "dec{S|}",    { RMeBX }, 0 },
1933
  { "dec{S|}",    { RMeSP }, 0 },
1934
  { "dec{S|}",    { RMeBP }, 0 },
1935
  { "dec{S|}",    { RMeSI }, 0 },
1936
  { "dec{S|}",    { RMeDI }, 0 },
1937
  /* 50 */
1938
  { "push{!P|}",    { RMrAX }, 0 },
1939
  { "push{!P|}",    { RMrCX }, 0 },
1940
  { "push{!P|}",    { RMrDX }, 0 },
1941
  { "push{!P|}",    { RMrBX }, 0 },
1942
  { "push{!P|}",    { RMrSP }, 0 },
1943
  { "push{!P|}",    { RMrBP }, 0 },
1944
  { "push{!P|}",    { RMrSI }, 0 },
1945
  { "push{!P|}",    { RMrDI }, 0 },
1946
  /* 58 */
1947
  { "pop{!P|}",   { RMrAX }, 0 },
1948
  { "pop{!P|}",   { RMrCX }, 0 },
1949
  { "pop{!P|}",   { RMrDX }, 0 },
1950
  { "pop{!P|}",   { RMrBX }, 0 },
1951
  { "pop{!P|}",   { RMrSP }, 0 },
1952
  { "pop{!P|}",   { RMrBP }, 0 },
1953
  { "pop{!P|}",   { RMrSI }, 0 },
1954
  { "pop{!P|}",   { RMrDI }, 0 },
1955
  /* 60 */
1956
  { X86_64_TABLE (X86_64_60) },
1957
  { X86_64_TABLE (X86_64_61) },
1958
  { X86_64_TABLE (X86_64_62) },
1959
  { X86_64_TABLE (X86_64_63) },
1960
  { Bad_Opcode }, /* seg fs */
1961
  { Bad_Opcode }, /* seg gs */
1962
  { Bad_Opcode }, /* op size prefix */
1963
  { Bad_Opcode }, /* adr size prefix */
1964
  /* 68 */
1965
  { "pushP",    { sIv }, 0 },
1966
  { "imulS",    { Gv, Ev, Iv }, 0 },
1967
  { "pushP",    { sIbT }, 0 },
1968
  { "imulS",    { Gv, Ev, sIb }, 0 },
1969
  { "ins{b|}",    { Ybr, indirDX }, 0 },
1970
  { X86_64_TABLE (X86_64_6D) },
1971
  { "outs{b|}",   { indirDXr, Xb }, 0 },
1972
  { X86_64_TABLE (X86_64_6F) },
1973
  /* 70 */
1974
  { "joH",    { Jb, BND, cond_jump_flag }, 0 },
1975
  { "jnoH",   { Jb, BND, cond_jump_flag }, 0 },
1976
  { "jbH",    { Jb, BND, cond_jump_flag }, 0 },
1977
  { "jaeH",   { Jb, BND, cond_jump_flag }, 0 },
1978
  { "jeH",    { Jb, BND, cond_jump_flag }, 0 },
1979
  { "jneH",   { Jb, BND, cond_jump_flag }, 0 },
1980
  { "jbeH",   { Jb, BND, cond_jump_flag }, 0 },
1981
  { "jaH",    { Jb, BND, cond_jump_flag }, 0 },
1982
  /* 78 */
1983
  { "jsH",    { Jb, BND, cond_jump_flag }, 0 },
1984
  { "jnsH",   { Jb, BND, cond_jump_flag }, 0 },
1985
  { "jpH",    { Jb, BND, cond_jump_flag }, 0 },
1986
  { "jnpH",   { Jb, BND, cond_jump_flag }, 0 },
1987
  { "jlH",    { Jb, BND, cond_jump_flag }, 0 },
1988
  { "jgeH",   { Jb, BND, cond_jump_flag }, 0 },
1989
  { "jleH",   { Jb, BND, cond_jump_flag }, 0 },
1990
  { "jgH",    { Jb, BND, cond_jump_flag }, 0 },
1991
  /* 80 */
1992
  { REG_TABLE (REG_80) },
1993
  { REG_TABLE (REG_81) },
1994
  { X86_64_TABLE (X86_64_82) },
1995
  { REG_TABLE (REG_83) },
1996
  { "testB",    { Eb, Gb }, 0 },
1997
  { "testS",    { Ev, Gv }, 0 },
1998
  { "xchgB",    { Ebh2, Gb }, 0 },
1999
  { "xchgS",    { Evh2, Gv }, 0 },
2000
  /* 88 */
2001
  { "movB",   { Ebh3, Gb }, 0 },
2002
  { "movS",   { Evh3, Gv }, 0 },
2003
  { "movB",   { Gb, EbS }, 0 },
2004
  { "movS",   { Gv, EvS }, 0 },
2005
  { "movD",   { Sv, Sw }, 0 },
2006
  { MOD_TABLE (MOD_8D) },
2007
  { "movD",   { Sw, Sv }, 0 },
2008
  { REG_TABLE (REG_8F) },
2009
  /* 90 */
2010
  { PREFIX_TABLE (PREFIX_90) },
2011
  { "xchgS",    { RMeCX, eAX }, 0 },
2012
  { "xchgS",    { RMeDX, eAX }, 0 },
2013
  { "xchgS",    { RMeBX, eAX }, 0 },
2014
  { "xchgS",    { RMeSP, eAX }, 0 },
2015
  { "xchgS",    { RMeBP, eAX }, 0 },
2016
  { "xchgS",    { RMeSI, eAX }, 0 },
2017
  { "xchgS",    { RMeDI, eAX }, 0 },
2018
  /* 98 */
2019
  { "cW{t|}R",    { XX }, 0 },
2020
  { "cR{t|}O",    { XX }, 0 },
2021
  { X86_64_TABLE (X86_64_9A) },
2022
  { Bad_Opcode }, /* fwait */
2023
  { "pushfP",   { XX }, 0 },
2024
  { "popfP",    { XX }, 0 },
2025
  { "sahf",   { XX }, 0 },
2026
  { "lahf",   { XX }, 0 },
2027
  /* a0 */
2028
  { "mov%LB",   { AL, Ob }, 0 },
2029
  { "mov%LS",   { eAX, Ov }, 0 },
2030
  { "mov%LB",   { Ob, AL }, 0 },
2031
  { "mov%LS",   { Ov, eAX }, 0 },
2032
  { "movs{b|}",   { Ybr, Xb }, 0 },
2033
  { "movs{R|}",   { Yvr, Xv }, 0 },
2034
  { "cmps{b|}",   { Xb, Yb }, 0 },
2035
  { "cmps{R|}",   { Xv, Yv }, 0 },
2036
  /* a8 */
2037
  { "testB",    { AL, Ib }, 0 },
2038
  { "testS",    { eAX, Iv }, 0 },
2039
  { "stosB",    { Ybr, AL }, 0 },
2040
  { "stosS",    { Yvr, eAX }, 0 },
2041
  { "lodsB",    { ALr, Xb }, 0 },
2042
  { "lodsS",    { eAXr, Xv }, 0 },
2043
  { "scasB",    { AL, Yb }, 0 },
2044
  { "scasS",    { eAX, Yv }, 0 },
2045
  /* b0 */
2046
  { "movB",   { RMAL, Ib }, 0 },
2047
  { "movB",   { RMCL, Ib }, 0 },
2048
  { "movB",   { RMDL, Ib }, 0 },
2049
  { "movB",   { RMBL, Ib }, 0 },
2050
  { "movB",   { RMAH, Ib }, 0 },
2051
  { "movB",   { RMCH, Ib }, 0 },
2052
  { "movB",   { RMDH, Ib }, 0 },
2053
  { "movB",   { RMBH, Ib }, 0 },
2054
  /* b8 */
2055
  { "mov%LV",   { RMeAX, Iv64 }, 0 },
2056
  { "mov%LV",   { RMeCX, Iv64 }, 0 },
2057
  { "mov%LV",   { RMeDX, Iv64 }, 0 },
2058
  { "mov%LV",   { RMeBX, Iv64 }, 0 },
2059
  { "mov%LV",   { RMeSP, Iv64 }, 0 },
2060
  { "mov%LV",   { RMeBP, Iv64 }, 0 },
2061
  { "mov%LV",   { RMeSI, Iv64 }, 0 },
2062
  { "mov%LV",   { RMeDI, Iv64 }, 0 },
2063
  /* c0 */
2064
  { REG_TABLE (REG_C0) },
2065
  { REG_TABLE (REG_C1) },
2066
  { X86_64_TABLE (X86_64_C2) },
2067
  { X86_64_TABLE (X86_64_C3) },
2068
  { X86_64_TABLE (X86_64_C4) },
2069
  { X86_64_TABLE (X86_64_C5) },
2070
  { REG_TABLE (REG_C6) },
2071
  { REG_TABLE (REG_C7) },
2072
  /* c8 */
2073
  { "enterP",   { Iw, Ib }, 0 },
2074
  { "leaveP",   { XX }, 0 },
2075
  { "{l|}ret{|f}%LP", { Iw }, 0 },
2076
  { "{l|}ret{|f}%LP", { XX }, 0 },
2077
  { "int3",   { XX }, 0 },
2078
  { "int",    { Ib }, 0 },
2079
  { X86_64_TABLE (X86_64_CE) },
2080
  { "iret%LP",    { XX }, 0 },
2081
  /* d0 */
2082
  { REG_TABLE (REG_D0) },
2083
  { REG_TABLE (REG_D1) },
2084
  { REG_TABLE (REG_D2) },
2085
  { REG_TABLE (REG_D3) },
2086
  { X86_64_TABLE (X86_64_D4) },
2087
  { X86_64_TABLE (X86_64_D5) },
2088
  { Bad_Opcode },
2089
  { "xlat",   { DSBX }, 0 },
2090
  /* d8 */
2091
  { FLOAT },
2092
  { FLOAT },
2093
  { FLOAT },
2094
  { FLOAT },
2095
  { FLOAT },
2096
  { FLOAT },
2097
  { FLOAT },
2098
  { FLOAT },
2099
  /* e0 */
2100
  { "loopneFH",   { Jb, XX, loop_jcxz_flag }, 0 },
2101
  { "loopeFH",    { Jb, XX, loop_jcxz_flag }, 0 },
2102
  { "loopFH",   { Jb, XX, loop_jcxz_flag }, 0 },
2103
  { "jEcxzH",   { Jb, XX, loop_jcxz_flag }, 0 },
2104
  { "inB",    { AL, Ib }, 0 },
2105
  { "inG",    { zAX, Ib }, 0 },
2106
  { "outB",   { Ib, AL }, 0 },
2107
  { "outG",   { Ib, zAX }, 0 },
2108
  /* e8 */
2109
  { X86_64_TABLE (X86_64_E8) },
2110
  { X86_64_TABLE (X86_64_E9) },
2111
  { X86_64_TABLE (X86_64_EA) },
2112
  { "jmp",    { Jb, BND }, 0 },
2113
  { "inB",    { AL, indirDX }, 0 },
2114
  { "inG",    { zAX, indirDX }, 0 },
2115
  { "outB",   { indirDX, AL }, 0 },
2116
  { "outG",   { indirDX, zAX }, 0 },
2117
  /* f0 */
2118
  { Bad_Opcode }, /* lock prefix */
2119
  { "int1",   { XX }, 0 },
2120
  { Bad_Opcode }, /* repne */
2121
  { Bad_Opcode }, /* repz */
2122
  { "hlt",    { XX }, 0 },
2123
  { "cmc",    { XX }, 0 },
2124
  { REG_TABLE (REG_F6) },
2125
  { REG_TABLE (REG_F7) },
2126
  /* f8 */
2127
  { "clc",    { XX }, 0 },
2128
  { "stc",    { XX }, 0 },
2129
  { "cli",    { XX }, 0 },
2130
  { "sti",    { XX }, 0 },
2131
  { "cld",    { XX }, 0 },
2132
  { "std",    { XX }, 0 },
2133
  { REG_TABLE (REG_FE) },
2134
  { REG_TABLE (REG_FF) },
2135
};
2136
2137
static const struct dis386 dis386_twobyte[] = {
2138
  /* 00 */
2139
  { REG_TABLE (REG_0F00 ) },
2140
  { REG_TABLE (REG_0F01 ) },
2141
  { MOD_TABLE (MOD_0F02) },
2142
  { MOD_TABLE (MOD_0F03) },
2143
  { Bad_Opcode },
2144
  { "syscall",    { XX }, 0 },
2145
  { "clts",   { XX }, 0 },
2146
  { "sysret%LQ",    { XX }, 0 },
2147
  /* 08 */
2148
  { "invd",   { XX }, 0 },
2149
  { PREFIX_TABLE (PREFIX_0F09) },
2150
  { Bad_Opcode },
2151
  { "ud2",    { XX }, 0 },
2152
  { Bad_Opcode },
2153
  { REG_TABLE (REG_0F0D) },
2154
  { "femms",    { XX }, 0 },
2155
  { "",     { MX, EM, OPSUF }, 0 }, /* See OP_3DNowSuffix.  */
2156
  /* 10 */
2157
  { PREFIX_TABLE (PREFIX_0F10) },
2158
  { PREFIX_TABLE (PREFIX_0F11) },
2159
  { PREFIX_TABLE (PREFIX_0F12) },
2160
  { MOD_TABLE (MOD_0F13) },
2161
  { "unpcklpX",   { XM, EXx }, PREFIX_OPCODE },
2162
  { "unpckhpX",   { XM, EXx }, PREFIX_OPCODE },
2163
  { PREFIX_TABLE (PREFIX_0F16) },
2164
  { MOD_TABLE (MOD_0F17) },
2165
  /* 18 */
2166
  { REG_TABLE (REG_0F18) },
2167
  { "nopQ",   { Ev }, 0 },
2168
  { PREFIX_TABLE (PREFIX_0F1A) },
2169
  { PREFIX_TABLE (PREFIX_0F1B) },
2170
  { PREFIX_TABLE (PREFIX_0F1C) },
2171
  { "nopQ",   { Ev }, 0 },
2172
  { PREFIX_TABLE (PREFIX_0F1E) },
2173
  { "nopQ",   { Ev }, 0 },
2174
  /* 20 */
2175
  { "movZ",   { Em, Cm }, 0 },
2176
  { "movZ",   { Em, Dm }, 0 },
2177
  { "movZ",   { Cm, Em }, 0 },
2178
  { "movZ",   { Dm, Em }, 0 },
2179
  { X86_64_TABLE (X86_64_0F24) },
2180
  { Bad_Opcode },
2181
  { X86_64_TABLE (X86_64_0F26) },
2182
  { Bad_Opcode },
2183
  /* 28 */
2184
  { "movapX",   { XM, EXx }, PREFIX_OPCODE },
2185
  { "movapX",   { EXxS, XM }, PREFIX_OPCODE },
2186
  { PREFIX_TABLE (PREFIX_0F2A) },
2187
  { PREFIX_TABLE (PREFIX_0F2B) },
2188
  { PREFIX_TABLE (PREFIX_0F2C) },
2189
  { PREFIX_TABLE (PREFIX_0F2D) },
2190
  { PREFIX_TABLE (PREFIX_0F2E) },
2191
  { PREFIX_TABLE (PREFIX_0F2F) },
2192
  /* 30 */
2193
  { "wrmsr",    { XX }, 0 },
2194
  { "rdtsc",    { XX }, 0 },
2195
  { "rdmsr",    { XX }, 0 },
2196
  { "rdpmc",    { XX }, 0 },
2197
  { "sysenter",   { SEP }, 0 },
2198
  { "sysexit%LQ", { SEP }, 0 },
2199
  { Bad_Opcode },
2200
  { "getsec",   { XX }, 0 },
2201
  /* 38 */
2202
  { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F38, PREFIX_OPCODE) },
2203
  { Bad_Opcode },
2204
  { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F3A, PREFIX_OPCODE) },
2205
  { Bad_Opcode },
2206
  { Bad_Opcode },
2207
  { Bad_Opcode },
2208
  { Bad_Opcode },
2209
  { Bad_Opcode },
2210
  /* 40 */
2211
  { "cmovoS",   { Gv, Ev }, 0 },
2212
  { "cmovnoS",    { Gv, Ev }, 0 },
2213
  { "cmovbS",   { Gv, Ev }, 0 },
2214
  { "cmovaeS",    { Gv, Ev }, 0 },
2215
  { "cmoveS",   { Gv, Ev }, 0 },
2216
  { "cmovneS",    { Gv, Ev }, 0 },
2217
  { "cmovbeS",    { Gv, Ev }, 0 },
2218
  { "cmovaS",   { Gv, Ev }, 0 },
2219
  /* 48 */
2220
  { "cmovsS",   { Gv, Ev }, 0 },
2221
  { "cmovnsS",    { Gv, Ev }, 0 },
2222
  { "cmovpS",   { Gv, Ev }, 0 },
2223
  { "cmovnpS",    { Gv, Ev }, 0 },
2224
  { "cmovlS",   { Gv, Ev }, 0 },
2225
  { "cmovgeS",    { Gv, Ev }, 0 },
2226
  { "cmovleS",    { Gv, Ev }, 0 },
2227
  { "cmovgS",   { Gv, Ev }, 0 },
2228
  /* 50 */
2229
  { MOD_TABLE (MOD_0F50) },
2230
  { PREFIX_TABLE (PREFIX_0F51) },
2231
  { PREFIX_TABLE (PREFIX_0F52) },
2232
  { PREFIX_TABLE (PREFIX_0F53) },
2233
  { "andpX",    { XM, EXx }, PREFIX_OPCODE },
2234
  { "andnpX",   { XM, EXx }, PREFIX_OPCODE },
2235
  { "orpX",   { XM, EXx }, PREFIX_OPCODE },
2236
  { "xorpX",    { XM, EXx }, PREFIX_OPCODE },
2237
  /* 58 */
2238
  { PREFIX_TABLE (PREFIX_0F58) },
2239
  { PREFIX_TABLE (PREFIX_0F59) },
2240
  { PREFIX_TABLE (PREFIX_0F5A) },
2241
  { PREFIX_TABLE (PREFIX_0F5B) },
2242
  { PREFIX_TABLE (PREFIX_0F5C) },
2243
  { PREFIX_TABLE (PREFIX_0F5D) },
2244
  { PREFIX_TABLE (PREFIX_0F5E) },
2245
  { PREFIX_TABLE (PREFIX_0F5F) },
2246
  /* 60 */
2247
  { PREFIX_TABLE (PREFIX_0F60) },
2248
  { PREFIX_TABLE (PREFIX_0F61) },
2249
  { PREFIX_TABLE (PREFIX_0F62) },
2250
  { "packsswb",   { MX, EM }, PREFIX_OPCODE },
2251
  { "pcmpgtb",    { MX, EM }, PREFIX_OPCODE },
2252
  { "pcmpgtw",    { MX, EM }, PREFIX_OPCODE },
2253
  { "pcmpgtd",    { MX, EM }, PREFIX_OPCODE },
2254
  { "packuswb",   { MX, EM }, PREFIX_OPCODE },
2255
  /* 68 */
2256
  { "punpckhbw",  { MX, EM }, PREFIX_OPCODE },
2257
  { "punpckhwd",  { MX, EM }, PREFIX_OPCODE },
2258
  { "punpckhdq",  { MX, EM }, PREFIX_OPCODE },
2259
  { "packssdw",   { MX, EM }, PREFIX_OPCODE },
2260
  { "punpcklqdq", { XM, EXx }, PREFIX_DATA },
2261
  { "punpckhqdq", { XM, EXx }, PREFIX_DATA },
2262
  { "movK",   { MX, Edq }, PREFIX_OPCODE },
2263
  { PREFIX_TABLE (PREFIX_0F6F) },
2264
  /* 70 */
2265
  { PREFIX_TABLE (PREFIX_0F70) },
2266
  { MOD_TABLE (MOD_0F71) },
2267
  { MOD_TABLE (MOD_0F72) },
2268
  { MOD_TABLE (MOD_0F73) },
2269
  { "pcmpeqb",    { MX, EM }, PREFIX_OPCODE },
2270
  { "pcmpeqw",    { MX, EM }, PREFIX_OPCODE },
2271
  { "pcmpeqd",    { MX, EM }, PREFIX_OPCODE },
2272
  { "emms",   { XX }, PREFIX_OPCODE },
2273
  /* 78 */
2274
  { PREFIX_TABLE (PREFIX_0F78) },
2275
  { PREFIX_TABLE (PREFIX_0F79) },
2276
  { Bad_Opcode },
2277
  { Bad_Opcode },
2278
  { PREFIX_TABLE (PREFIX_0F7C) },
2279
  { PREFIX_TABLE (PREFIX_0F7D) },
2280
  { PREFIX_TABLE (PREFIX_0F7E) },
2281
  { PREFIX_TABLE (PREFIX_0F7F) },
2282
  /* 80 */
2283
  { "joH",    { Jv, BND, cond_jump_flag }, 0 },
2284
  { "jnoH",   { Jv, BND, cond_jump_flag }, 0 },
2285
  { "jbH",    { Jv, BND, cond_jump_flag }, 0 },
2286
  { "jaeH",   { Jv, BND, cond_jump_flag }, 0 },
2287
  { "jeH",    { Jv, BND, cond_jump_flag }, 0 },
2288
  { "jneH",   { Jv, BND, cond_jump_flag }, 0 },
2289
  { "jbeH",   { Jv, BND, cond_jump_flag }, 0 },
2290
  { "jaH",    { Jv, BND, cond_jump_flag }, 0 },
2291
  /* 88 */
2292
  { "jsH",    { Jv, BND, cond_jump_flag }, 0 },
2293
  { "jnsH",   { Jv, BND, cond_jump_flag }, 0 },
2294
  { "jpH",    { Jv, BND, cond_jump_flag }, 0 },
2295
  { "jnpH",   { Jv, BND, cond_jump_flag }, 0 },
2296
  { "jlH",    { Jv, BND, cond_jump_flag }, 0 },
2297
  { "jgeH",   { Jv, BND, cond_jump_flag }, 0 },
2298
  { "jleH",   { Jv, BND, cond_jump_flag }, 0 },
2299
  { "jgH",    { Jv, BND, cond_jump_flag }, 0 },
2300
  /* 90 */
2301
  { "seto",   { Eb }, 0 },
2302
  { "setno",    { Eb }, 0 },
2303
  { "setb",   { Eb }, 0 },
2304
  { "setae",    { Eb }, 0 },
2305
  { "sete",   { Eb }, 0 },
2306
  { "setne",    { Eb }, 0 },
2307
  { "setbe",    { Eb }, 0 },
2308
  { "seta",   { Eb }, 0 },
2309
  /* 98 */
2310
  { "sets",   { Eb }, 0 },
2311
  { "setns",    { Eb }, 0 },
2312
  { "setp",   { Eb }, 0 },
2313
  { "setnp",    { Eb }, 0 },
2314
  { "setl",   { Eb }, 0 },
2315
  { "setge",    { Eb }, 0 },
2316
  { "setle",    { Eb }, 0 },
2317
  { "setg",   { Eb }, 0 },
2318
  /* a0 */
2319
  { "pushP",    { fs }, 0 },
2320
  { "popP",   { fs }, 0 },
2321
  { "cpuid",    { XX }, 0 },
2322
  { "btS",    { Ev, Gv }, 0 },
2323
  { "shldS",    { Ev, Gv, Ib }, 0 },
2324
  { "shldS",    { Ev, Gv, CL }, 0 },
2325
  { REG_TABLE (REG_0FA6) },
2326
  { REG_TABLE (REG_0FA7) },
2327
  /* a8 */
2328
  { "pushP",    { gs }, 0 },
2329
  { "popP",   { gs }, 0 },
2330
  { "rsm",    { XX }, 0 },
2331
  { "btsS",   { Evh1, Gv }, 0 },
2332
  { "shrdS",    { Ev, Gv, Ib }, 0 },
2333
  { "shrdS",    { Ev, Gv, CL }, 0 },
2334
  { REG_TABLE (REG_0FAE) },
2335
  { "imulS",    { Gv, Ev }, 0 },
2336
  /* b0 */
2337
  { "cmpxchgB",   { Ebh1, Gb }, 0 },
2338
  { "cmpxchgS",   { Evh1, Gv }, 0 },
2339
  { MOD_TABLE (MOD_0FB2) },
2340
  { "btrS",   { Evh1, Gv }, 0 },
2341
  { MOD_TABLE (MOD_0FB4) },
2342
  { MOD_TABLE (MOD_0FB5) },
2343
  { "movz{bR|x}", { Gv, Eb }, 0 },
2344
  { "movz{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movzww ! */
2345
  /* b8 */
2346
  { PREFIX_TABLE (PREFIX_0FB8) },
2347
  { "ud1S",   { Gv, Ev }, 0 },
2348
  { REG_TABLE (REG_0FBA) },
2349
  { "btcS",   { Evh1, Gv }, 0 },
2350
  { PREFIX_TABLE (PREFIX_0FBC) },
2351
  { PREFIX_TABLE (PREFIX_0FBD) },
2352
  { "movs{bR|x}", { Gv, Eb }, 0 },
2353
  { "movs{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movsww ! */
2354
  /* c0 */
2355
  { "xaddB",    { Ebh1, Gb }, 0 },
2356
  { "xaddS",    { Evh1, Gv }, 0 },
2357
  { PREFIX_TABLE (PREFIX_0FC2) },
2358
  { MOD_TABLE (MOD_0FC3) },
2359
  { "pinsrw",   { MX, Edw, Ib }, PREFIX_OPCODE },
2360
  { "pextrw",   { Gd, MS, Ib }, PREFIX_OPCODE },
2361
  { "shufpX",   { XM, EXx, Ib }, PREFIX_OPCODE },
2362
  { REG_TABLE (REG_0FC7) },
2363
  /* c8 */
2364
  { "bswap",    { RMeAX }, 0 },
2365
  { "bswap",    { RMeCX }, 0 },
2366
  { "bswap",    { RMeDX }, 0 },
2367
  { "bswap",    { RMeBX }, 0 },
2368
  { "bswap",    { RMeSP }, 0 },
2369
  { "bswap",    { RMeBP }, 0 },
2370
  { "bswap",    { RMeSI }, 0 },
2371
  { "bswap",    { RMeDI }, 0 },
2372
  /* d0 */
2373
  { PREFIX_TABLE (PREFIX_0FD0) },
2374
  { "psrlw",    { MX, EM }, PREFIX_OPCODE },
2375
  { "psrld",    { MX, EM }, PREFIX_OPCODE },
2376
  { "psrlq",    { MX, EM }, PREFIX_OPCODE },
2377
  { "paddq",    { MX, EM }, PREFIX_OPCODE },
2378
  { "pmullw",   { MX, EM }, PREFIX_OPCODE },
2379
  { PREFIX_TABLE (PREFIX_0FD6) },
2380
  { MOD_TABLE (MOD_0FD7) },
2381
  /* d8 */
2382
  { "psubusb",    { MX, EM }, PREFIX_OPCODE },
2383
  { "psubusw",    { MX, EM }, PREFIX_OPCODE },
2384
  { "pminub",   { MX, EM }, PREFIX_OPCODE },
2385
  { "pand",   { MX, EM }, PREFIX_OPCODE },
2386
  { "paddusb",    { MX, EM }, PREFIX_OPCODE },
2387
  { "paddusw",    { MX, EM }, PREFIX_OPCODE },
2388
  { "pmaxub",   { MX, EM }, PREFIX_OPCODE },
2389
  { "pandn",    { MX, EM }, PREFIX_OPCODE },
2390
  /* e0 */
2391
  { "pavgb",    { MX, EM }, PREFIX_OPCODE },
2392
  { "psraw",    { MX, EM }, PREFIX_OPCODE },
2393
  { "psrad",    { MX, EM }, PREFIX_OPCODE },
2394
  { "pavgw",    { MX, EM }, PREFIX_OPCODE },
2395
  { "pmulhuw",    { MX, EM }, PREFIX_OPCODE },
2396
  { "pmulhw",   { MX, EM }, PREFIX_OPCODE },
2397
  { PREFIX_TABLE (PREFIX_0FE6) },
2398
  { PREFIX_TABLE (PREFIX_0FE7) },
2399
  /* e8 */
2400
  { "psubsb",   { MX, EM }, PREFIX_OPCODE },
2401
  { "psubsw",   { MX, EM }, PREFIX_OPCODE },
2402
  { "pminsw",   { MX, EM }, PREFIX_OPCODE },
2403
  { "por",    { MX, EM }, PREFIX_OPCODE },
2404
  { "paddsb",   { MX, EM }, PREFIX_OPCODE },
2405
  { "paddsw",   { MX, EM }, PREFIX_OPCODE },
2406
  { "pmaxsw",   { MX, EM }, PREFIX_OPCODE },
2407
  { "pxor",   { MX, EM }, PREFIX_OPCODE },
2408
  /* f0 */
2409
  { PREFIX_TABLE (PREFIX_0FF0) },
2410
  { "psllw",    { MX, EM }, PREFIX_OPCODE },
2411
  { "pslld",    { MX, EM }, PREFIX_OPCODE },
2412
  { "psllq",    { MX, EM }, PREFIX_OPCODE },
2413
  { "pmuludq",    { MX, EM }, PREFIX_OPCODE },
2414
  { "pmaddwd",    { MX, EM }, PREFIX_OPCODE },
2415
  { "psadbw",   { MX, EM }, PREFIX_OPCODE },
2416
  { PREFIX_TABLE (PREFIX_0FF7) },
2417
  /* f8 */
2418
  { "psubb",    { MX, EM }, PREFIX_OPCODE },
2419
  { "psubw",    { MX, EM }, PREFIX_OPCODE },
2420
  { "psubd",    { MX, EM }, PREFIX_OPCODE },
2421
  { "psubq",    { MX, EM }, PREFIX_OPCODE },
2422
  { "paddb",    { MX, EM }, PREFIX_OPCODE },
2423
  { "paddw",    { MX, EM }, PREFIX_OPCODE },
2424
  { "paddd",    { MX, EM }, PREFIX_OPCODE },
2425
  { "ud0S",   { Gv, Ev }, 0 },
2426
};
2427
2428
static const bool onebyte_has_modrm[256] = {
2429
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2430
  /*       -------------------------------        */
2431
  /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2432
  /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2433
  /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2434
  /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2435
  /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2436
  /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2437
  /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2438
  /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2439
  /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2440
  /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2441
  /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2442
  /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2443
  /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2444
  /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2445
  /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2446
  /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1  /* f0 */
2447
  /*       -------------------------------        */
2448
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2449
};
2450
2451
static const bool twobyte_has_modrm[256] = {
2452
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2453
  /*       -------------------------------        */
2454
  /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
2455
  /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
2456
  /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
2457
  /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
2458
  /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
2459
  /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2460
  /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
2461
  /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
2462
  /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2463
  /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
2464
  /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
2465
  /* b0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bf */
2466
  /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
2467
  /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
2468
  /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
2469
  /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1  /* ff */
2470
  /*       -------------------------------        */
2471
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2472
};
2473
2474
2475
struct op
2476
  {
2477
    const char *name;
2478
    unsigned int len;
2479
  };
2480
2481
/* If we are accessing mod/rm/reg without need_modrm set, then the
2482
   values are stale.  Hitting this abort likely indicates that you
2483
   need to update onebyte_has_modrm or twobyte_has_modrm.  */
2484
4.75M
#define MODRM_CHECK  if (!ins->need_modrm) abort ()
2485
2486
static const char intel_index16[][6] = {
2487
  "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2488
};
2489
2490
static const char att_names64[][8] = {
2491
  "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
2492
  "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
2493
};
2494
static const char att_names32[][8] = {
2495
  "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
2496
  "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
2497
};
2498
static const char att_names16[][8] = {
2499
  "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
2500
  "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
2501
};
2502
static const char att_names8[][8] = {
2503
  "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
2504
};
2505
static const char att_names8rex[][8] = {
2506
  "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
2507
  "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
2508
};
2509
static const char att_names_seg[][4] = {
2510
  "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
2511
};
2512
static const char att_index64[] = "%riz";
2513
static const char att_index32[] = "%eiz";
2514
static const char att_index16[][8] = {
2515
  "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
2516
};
2517
2518
static const char att_names_mm[][8] = {
2519
  "%mm0", "%mm1", "%mm2", "%mm3",
2520
  "%mm4", "%mm5", "%mm6", "%mm7"
2521
};
2522
2523
static const char att_names_bnd[][8] = {
2524
  "%bnd0", "%bnd1", "%bnd2", "%bnd3"
2525
};
2526
2527
static const char att_names_xmm[][8] = {
2528
  "%xmm0", "%xmm1", "%xmm2", "%xmm3",
2529
  "%xmm4", "%xmm5", "%xmm6", "%xmm7",
2530
  "%xmm8", "%xmm9", "%xmm10", "%xmm11",
2531
  "%xmm12", "%xmm13", "%xmm14", "%xmm15",
2532
  "%xmm16", "%xmm17", "%xmm18", "%xmm19",
2533
  "%xmm20", "%xmm21", "%xmm22", "%xmm23",
2534
  "%xmm24", "%xmm25", "%xmm26", "%xmm27",
2535
  "%xmm28", "%xmm29", "%xmm30", "%xmm31"
2536
};
2537
2538
static const char att_names_ymm[][8] = {
2539
  "%ymm0", "%ymm1", "%ymm2", "%ymm3",
2540
  "%ymm4", "%ymm5", "%ymm6", "%ymm7",
2541
  "%ymm8", "%ymm9", "%ymm10", "%ymm11",
2542
  "%ymm12", "%ymm13", "%ymm14", "%ymm15",
2543
  "%ymm16", "%ymm17", "%ymm18", "%ymm19",
2544
  "%ymm20", "%ymm21", "%ymm22", "%ymm23",
2545
  "%ymm24", "%ymm25", "%ymm26", "%ymm27",
2546
  "%ymm28", "%ymm29", "%ymm30", "%ymm31"
2547
};
2548
2549
static const char att_names_zmm[][8] = {
2550
  "%zmm0", "%zmm1", "%zmm2", "%zmm3",
2551
  "%zmm4", "%zmm5", "%zmm6", "%zmm7",
2552
  "%zmm8", "%zmm9", "%zmm10", "%zmm11",
2553
  "%zmm12", "%zmm13", "%zmm14", "%zmm15",
2554
  "%zmm16", "%zmm17", "%zmm18", "%zmm19",
2555
  "%zmm20", "%zmm21", "%zmm22", "%zmm23",
2556
  "%zmm24", "%zmm25", "%zmm26", "%zmm27",
2557
  "%zmm28", "%zmm29", "%zmm30", "%zmm31"
2558
};
2559
2560
static const char att_names_tmm[][8] = {
2561
  "%tmm0", "%tmm1", "%tmm2", "%tmm3",
2562
  "%tmm4", "%tmm5", "%tmm6", "%tmm7"
2563
};
2564
2565
static const char att_names_mask[][8] = {
2566
  "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
2567
};
2568
2569
static const char *const names_rounding[] =
2570
{
2571
  "{rn-",
2572
  "{rd-",
2573
  "{ru-",
2574
  "{rz-"
2575
};
2576
2577
static const struct dis386 reg_table[][8] = {
2578
  /* REG_80 */
2579
  {
2580
    { "addA", { Ebh1, Ib }, 0 },
2581
    { "orA",  { Ebh1, Ib }, 0 },
2582
    { "adcA", { Ebh1, Ib }, 0 },
2583
    { "sbbA", { Ebh1, Ib }, 0 },
2584
    { "andA", { Ebh1, Ib }, 0 },
2585
    { "subA", { Ebh1, Ib }, 0 },
2586
    { "xorA", { Ebh1, Ib }, 0 },
2587
    { "cmpA", { Eb, Ib }, 0 },
2588
  },
2589
  /* REG_81 */
2590
  {
2591
    { "addQ", { Evh1, Iv }, 0 },
2592
    { "orQ",  { Evh1, Iv }, 0 },
2593
    { "adcQ", { Evh1, Iv }, 0 },
2594
    { "sbbQ", { Evh1, Iv }, 0 },
2595
    { "andQ", { Evh1, Iv }, 0 },
2596
    { "subQ", { Evh1, Iv }, 0 },
2597
    { "xorQ", { Evh1, Iv }, 0 },
2598
    { "cmpQ", { Ev, Iv }, 0 },
2599
  },
2600
  /* REG_83 */
2601
  {
2602
    { "addQ", { Evh1, sIb }, 0 },
2603
    { "orQ",  { Evh1, sIb }, 0 },
2604
    { "adcQ", { Evh1, sIb }, 0 },
2605
    { "sbbQ", { Evh1, sIb }, 0 },
2606
    { "andQ", { Evh1, sIb }, 0 },
2607
    { "subQ", { Evh1, sIb }, 0 },
2608
    { "xorQ", { Evh1, sIb }, 0 },
2609
    { "cmpQ", { Ev, sIb }, 0 },
2610
  },
2611
  /* REG_8F */
2612
  {
2613
    { "pop{P|}", { stackEv }, 0 },
2614
    { XOP_8F_TABLE (XOP_09) },
2615
    { Bad_Opcode },
2616
    { Bad_Opcode },
2617
    { Bad_Opcode },
2618
    { XOP_8F_TABLE (XOP_09) },
2619
  },
2620
  /* REG_C0 */
2621
  {
2622
    { "rolA", { Eb, Ib }, 0 },
2623
    { "rorA", { Eb, Ib }, 0 },
2624
    { "rclA", { Eb, Ib }, 0 },
2625
    { "rcrA", { Eb, Ib }, 0 },
2626
    { "shlA", { Eb, Ib }, 0 },
2627
    { "shrA", { Eb, Ib }, 0 },
2628
    { "shlA", { Eb, Ib }, 0 },
2629
    { "sarA", { Eb, Ib }, 0 },
2630
  },
2631
  /* REG_C1 */
2632
  {
2633
    { "rolQ", { Ev, Ib }, 0 },
2634
    { "rorQ", { Ev, Ib }, 0 },
2635
    { "rclQ", { Ev, Ib }, 0 },
2636
    { "rcrQ", { Ev, Ib }, 0 },
2637
    { "shlQ", { Ev, Ib }, 0 },
2638
    { "shrQ", { Ev, Ib }, 0 },
2639
    { "shlQ", { Ev, Ib }, 0 },
2640
    { "sarQ", { Ev, Ib }, 0 },
2641
  },
2642
  /* REG_C6 */
2643
  {
2644
    { "movA", { Ebh3, Ib }, 0 },
2645
    { Bad_Opcode },
2646
    { Bad_Opcode },
2647
    { Bad_Opcode },
2648
    { Bad_Opcode },
2649
    { Bad_Opcode },
2650
    { Bad_Opcode },
2651
    { MOD_TABLE (MOD_C6_REG_7) },
2652
  },
2653
  /* REG_C7 */
2654
  {
2655
    { "movQ", { Evh3, Iv }, 0 },
2656
    { Bad_Opcode },
2657
    { Bad_Opcode },
2658
    { Bad_Opcode },
2659
    { Bad_Opcode },
2660
    { Bad_Opcode },
2661
    { Bad_Opcode },
2662
    { MOD_TABLE (MOD_C7_REG_7) },
2663
  },
2664
  /* REG_D0 */
2665
  {
2666
    { "rolA", { Eb, I1 }, 0 },
2667
    { "rorA", { Eb, I1 }, 0 },
2668
    { "rclA", { Eb, I1 }, 0 },
2669
    { "rcrA", { Eb, I1 }, 0 },
2670
    { "shlA", { Eb, I1 }, 0 },
2671
    { "shrA", { Eb, I1 }, 0 },
2672
    { "shlA", { Eb, I1 }, 0 },
2673
    { "sarA", { Eb, I1 }, 0 },
2674
  },
2675
  /* REG_D1 */
2676
  {
2677
    { "rolQ", { Ev, I1 }, 0 },
2678
    { "rorQ", { Ev, I1 }, 0 },
2679
    { "rclQ", { Ev, I1 }, 0 },
2680
    { "rcrQ", { Ev, I1 }, 0 },
2681
    { "shlQ", { Ev, I1 }, 0 },
2682
    { "shrQ", { Ev, I1 }, 0 },
2683
    { "shlQ", { Ev, I1 }, 0 },
2684
    { "sarQ", { Ev, I1 }, 0 },
2685
  },
2686
  /* REG_D2 */
2687
  {
2688
    { "rolA", { Eb, CL }, 0 },
2689
    { "rorA", { Eb, CL }, 0 },
2690
    { "rclA", { Eb, CL }, 0 },
2691
    { "rcrA", { Eb, CL }, 0 },
2692
    { "shlA", { Eb, CL }, 0 },
2693
    { "shrA", { Eb, CL }, 0 },
2694
    { "shlA", { Eb, CL }, 0 },
2695
    { "sarA", { Eb, CL }, 0 },
2696
  },
2697
  /* REG_D3 */
2698
  {
2699
    { "rolQ", { Ev, CL }, 0 },
2700
    { "rorQ", { Ev, CL }, 0 },
2701
    { "rclQ", { Ev, CL }, 0 },
2702
    { "rcrQ", { Ev, CL }, 0 },
2703
    { "shlQ", { Ev, CL }, 0 },
2704
    { "shrQ", { Ev, CL }, 0 },
2705
    { "shlQ", { Ev, CL }, 0 },
2706
    { "sarQ", { Ev, CL }, 0 },
2707
  },
2708
  /* REG_F6 */
2709
  {
2710
    { "testA",  { Eb, Ib }, 0 },
2711
    { "testA",  { Eb, Ib }, 0 },
2712
    { "notA", { Ebh1 }, 0 },
2713
    { "negA", { Ebh1 }, 0 },
2714
    { "mulA", { Eb }, 0 },  /* Don't print the implicit %al register,  */
2715
    { "imulA",  { Eb }, 0 },  /* to distinguish these opcodes from other */
2716
    { "divA", { Eb }, 0 },  /* mul/imul opcodes.  Do the same for div  */
2717
    { "idivA",  { Eb }, 0 },  /* and idiv for consistency.       */
2718
  },
2719
  /* REG_F7 */
2720
  {
2721
    { "testQ",  { Ev, Iv }, 0 },
2722
    { "testQ",  { Ev, Iv }, 0 },
2723
    { "notQ", { Evh1 }, 0 },
2724
    { "negQ", { Evh1 }, 0 },
2725
    { "mulQ", { Ev }, 0 },  /* Don't print the implicit register.  */
2726
    { "imulQ",  { Ev }, 0 },
2727
    { "divQ", { Ev }, 0 },
2728
    { "idivQ",  { Ev }, 0 },
2729
  },
2730
  /* REG_FE */
2731
  {
2732
    { "incA", { Ebh1 }, 0 },
2733
    { "decA", { Ebh1 }, 0 },
2734
  },
2735
  /* REG_FF */
2736
  {
2737
    { "incQ", { Evh1 }, 0 },
2738
    { "decQ", { Evh1 }, 0 },
2739
    { "call{@|}", { NOTRACK, indirEv, BND }, 0 },
2740
    { MOD_TABLE (MOD_FF_REG_3) },
2741
    { "jmp{@|}", { NOTRACK, indirEv, BND }, 0 },
2742
    { MOD_TABLE (MOD_FF_REG_5) },
2743
    { "push{P|}", { stackEv }, 0 },
2744
    { Bad_Opcode },
2745
  },
2746
  /* REG_0F00 */
2747
  {
2748
    { "sldtD",  { Sv }, 0 },
2749
    { "strD", { Sv }, 0 },
2750
    { "lldt", { Ew }, 0 },
2751
    { "ltr",  { Ew }, 0 },
2752
    { "verr", { Ew }, 0 },
2753
    { "verw", { Ew }, 0 },
2754
    { X86_64_TABLE (X86_64_0F00_REG_6) },
2755
    { Bad_Opcode },
2756
  },
2757
  /* REG_0F01 */
2758
  {
2759
    { MOD_TABLE (MOD_0F01_REG_0) },
2760
    { MOD_TABLE (MOD_0F01_REG_1) },
2761
    { MOD_TABLE (MOD_0F01_REG_2) },
2762
    { MOD_TABLE (MOD_0F01_REG_3) },
2763
    { "smswD",  { Sv }, 0 },
2764
    { MOD_TABLE (MOD_0F01_REG_5) },
2765
    { "lmsw", { Ew }, 0 },
2766
    { MOD_TABLE (MOD_0F01_REG_7) },
2767
  },
2768
  /* REG_0F0D */
2769
  {
2770
    { "prefetch", { Mb }, 0 },
2771
    { "prefetchw",  { Mb }, 0 },
2772
    { "prefetchwt1",  { Mb }, 0 },
2773
    { "prefetch", { Mb }, 0 },
2774
    { "prefetch", { Mb }, 0 },
2775
    { "prefetch", { Mb }, 0 },
2776
    { "prefetch", { Mb }, 0 },
2777
    { "prefetch", { Mb }, 0 },
2778
  },
2779
  /* REG_0F18 */
2780
  {
2781
    { MOD_TABLE (MOD_0F18_REG_0) },
2782
    { MOD_TABLE (MOD_0F18_REG_1) },
2783
    { MOD_TABLE (MOD_0F18_REG_2) },
2784
    { MOD_TABLE (MOD_0F18_REG_3) },
2785
    { "nopQ",   { Ev }, 0 },
2786
    { "nopQ",   { Ev }, 0 },
2787
    { MOD_TABLE (MOD_0F18_REG_6) },
2788
    { MOD_TABLE (MOD_0F18_REG_7) },
2789
  },
2790
  /* REG_0F1C_P_0_MOD_0 */
2791
  {
2792
    { "cldemote", { Mb }, 0 },
2793
    { "nopQ",   { Ev }, 0 },
2794
    { "nopQ",   { Ev }, 0 },
2795
    { "nopQ",   { Ev }, 0 },
2796
    { "nopQ",   { Ev }, 0 },
2797
    { "nopQ",   { Ev }, 0 },
2798
    { "nopQ",   { Ev }, 0 },
2799
    { "nopQ",   { Ev }, 0 },
2800
  },
2801
  /* REG_0F1E_P_1_MOD_3 */
2802
  {
2803
    { "nopQ",   { Ev }, PREFIX_IGNORED },
2804
    { "rdsspK",   { Edq }, 0 },
2805
    { "nopQ",   { Ev }, PREFIX_IGNORED },
2806
    { "nopQ",   { Ev }, PREFIX_IGNORED },
2807
    { "nopQ",   { Ev }, PREFIX_IGNORED },
2808
    { "nopQ",   { Ev }, PREFIX_IGNORED },
2809
    { "nopQ",   { Ev }, PREFIX_IGNORED },
2810
    { RM_TABLE (RM_0F1E_P_1_MOD_3_REG_7) },
2811
  },
2812
  /* REG_0F38D8_PREFIX_1 */
2813
  {
2814
    { "aesencwide128kl",  { M }, 0 },
2815
    { "aesdecwide128kl",  { M }, 0 },
2816
    { "aesencwide256kl",  { M }, 0 },
2817
    { "aesdecwide256kl",  { M }, 0 },
2818
  },
2819
  /* REG_0F3A0F_PREFIX_1_MOD_3 */
2820
  {
2821
    { RM_TABLE (RM_0F3A0F_P_1_MOD_3_REG_0) },
2822
  },
2823
  /* REG_0F71_MOD_0 */
2824
  {
2825
    { Bad_Opcode },
2826
    { Bad_Opcode },
2827
    { "psrlw",    { MS, Ib }, PREFIX_OPCODE },
2828
    { Bad_Opcode },
2829
    { "psraw",    { MS, Ib }, PREFIX_OPCODE },
2830
    { Bad_Opcode },
2831
    { "psllw",    { MS, Ib }, PREFIX_OPCODE },
2832
  },
2833
  /* REG_0F72_MOD_0 */
2834
  {
2835
    { Bad_Opcode },
2836
    { Bad_Opcode },
2837
    { "psrld",    { MS, Ib }, PREFIX_OPCODE },
2838
    { Bad_Opcode },
2839
    { "psrad",    { MS, Ib }, PREFIX_OPCODE },
2840
    { Bad_Opcode },
2841
    { "pslld",    { MS, Ib }, PREFIX_OPCODE },
2842
  },
2843
  /* REG_0F73_MOD_0 */
2844
  {
2845
    { Bad_Opcode },
2846
    { Bad_Opcode },
2847
    { "psrlq",    { MS, Ib }, PREFIX_OPCODE },
2848
    { "psrldq",   { XS, Ib }, PREFIX_DATA },
2849
    { Bad_Opcode },
2850
    { Bad_Opcode },
2851
    { "psllq",    { MS, Ib }, PREFIX_OPCODE },
2852
    { "pslldq",   { XS, Ib }, PREFIX_DATA },
2853
  },
2854
  /* REG_0FA6 */
2855
  {
2856
    { "montmul",  { { OP_0f07, 0 } }, 0 },
2857
    { "xsha1",    { { OP_0f07, 0 } }, 0 },
2858
    { "xsha256",  { { OP_0f07, 0 } }, 0 },
2859
  },
2860
  /* REG_0FA7 */
2861
  {
2862
    { "xstore-rng", { { OP_0f07, 0 } }, 0 },
2863
    { "xcrypt-ecb", { { OP_0f07, 0 } }, 0 },
2864
    { "xcrypt-cbc", { { OP_0f07, 0 } }, 0 },
2865
    { "xcrypt-ctr", { { OP_0f07, 0 } }, 0 },
2866
    { "xcrypt-cfb", { { OP_0f07, 0 } }, 0 },
2867
    { "xcrypt-ofb", { { OP_0f07, 0 } }, 0 },
2868
  },
2869
  /* REG_0FAE */
2870
  {
2871
    { MOD_TABLE (MOD_0FAE_REG_0) },
2872
    { MOD_TABLE (MOD_0FAE_REG_1) },
2873
    { MOD_TABLE (MOD_0FAE_REG_2) },
2874
    { MOD_TABLE (MOD_0FAE_REG_3) },
2875
    { MOD_TABLE (MOD_0FAE_REG_4) },
2876
    { MOD_TABLE (MOD_0FAE_REG_5) },
2877
    { MOD_TABLE (MOD_0FAE_REG_6) },
2878
    { MOD_TABLE (MOD_0FAE_REG_7) },
2879
  },
2880
  /* REG_0FBA */
2881
  {
2882
    { Bad_Opcode },
2883
    { Bad_Opcode },
2884
    { Bad_Opcode },
2885
    { Bad_Opcode },
2886
    { "btQ",  { Ev, Ib }, 0 },
2887
    { "btsQ", { Evh1, Ib }, 0 },
2888
    { "btrQ", { Evh1, Ib }, 0 },
2889
    { "btcQ", { Evh1, Ib }, 0 },
2890
  },
2891
  /* REG_0FC7 */
2892
  {
2893
    { Bad_Opcode },
2894
    { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } }, 0 },
2895
    { Bad_Opcode },
2896
    { MOD_TABLE (MOD_0FC7_REG_3) },
2897
    { MOD_TABLE (MOD_0FC7_REG_4) },
2898
    { MOD_TABLE (MOD_0FC7_REG_5) },
2899
    { MOD_TABLE (MOD_0FC7_REG_6) },
2900
    { MOD_TABLE (MOD_0FC7_REG_7) },
2901
  },
2902
  /* REG_VEX_0F71_M_0 */
2903
  {
2904
    { Bad_Opcode },
2905
    { Bad_Opcode },
2906
    { "vpsrlw",   { Vex, XS, Ib }, PREFIX_DATA },
2907
    { Bad_Opcode },
2908
    { "vpsraw",   { Vex, XS, Ib }, PREFIX_DATA },
2909
    { Bad_Opcode },
2910
    { "vpsllw",   { Vex, XS, Ib }, PREFIX_DATA },
2911
  },
2912
  /* REG_VEX_0F72_M_0 */
2913
  {
2914
    { Bad_Opcode },
2915
    { Bad_Opcode },
2916
    { "vpsrld",   { Vex, XS, Ib }, PREFIX_DATA },
2917
    { Bad_Opcode },
2918
    { "vpsrad",   { Vex, XS, Ib }, PREFIX_DATA },
2919
    { Bad_Opcode },
2920
    { "vpslld",   { Vex, XS, Ib }, PREFIX_DATA },
2921
  },
2922
  /* REG_VEX_0F73_M_0 */
2923
  {
2924
    { Bad_Opcode },
2925
    { Bad_Opcode },
2926
    { "vpsrlq",   { Vex, XS, Ib }, PREFIX_DATA },
2927
    { "vpsrldq",  { Vex, XS, Ib }, PREFIX_DATA },
2928
    { Bad_Opcode },
2929
    { Bad_Opcode },
2930
    { "vpsllq",   { Vex, XS, Ib }, PREFIX_DATA },
2931
    { "vpslldq",  { Vex, XS, Ib }, PREFIX_DATA },
2932
  },
2933
  /* REG_VEX_0FAE */
2934
  {
2935
    { Bad_Opcode },
2936
    { Bad_Opcode },
2937
    { MOD_TABLE (MOD_VEX_0FAE_REG_2) },
2938
    { MOD_TABLE (MOD_VEX_0FAE_REG_3) },
2939
  },
2940
  /* REG_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0 */
2941
  {
2942
    { RM_TABLE (RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0_R_0) },
2943
  },
2944
  /* REG_VEX_0F38F3_L_0 */
2945
  {
2946
    { Bad_Opcode },
2947
    { "blsrS",    { VexGdq, Edq }, PREFIX_OPCODE },
2948
    { "blsmskS",  { VexGdq, Edq }, PREFIX_OPCODE },
2949
    { "blsiS",    { VexGdq, Edq }, PREFIX_OPCODE },
2950
  },
2951
  /* REG_XOP_09_01_L_0 */
2952
  {
2953
    { Bad_Opcode },
2954
    { "blcfill",  { VexGdq, Edq }, 0 },
2955
    { "blsfill",  { VexGdq, Edq }, 0 },
2956
    { "blcs", { VexGdq, Edq }, 0 },
2957
    { "tzmsk",  { VexGdq, Edq }, 0 },
2958
    { "blcic",  { VexGdq, Edq }, 0 },
2959
    { "blsic",  { VexGdq, Edq }, 0 },
2960
    { "t1mskc", { VexGdq, Edq }, 0 },
2961
  },
2962
  /* REG_XOP_09_02_L_0 */
2963
  {
2964
    { Bad_Opcode },
2965
    { "blcmsk", { VexGdq, Edq }, 0 },
2966
    { Bad_Opcode },
2967
    { Bad_Opcode },
2968
    { Bad_Opcode },
2969
    { Bad_Opcode },
2970
    { "blci", { VexGdq, Edq }, 0 },
2971
  },
2972
  /* REG_XOP_09_12_M_1_L_0 */
2973
  {
2974
    { "llwpcb", { Edq }, 0 },
2975
    { "slwpcb", { Edq }, 0 },
2976
  },
2977
  /* REG_XOP_0A_12_L_0 */
2978
  {
2979
    { "lwpins", { VexGdq, Ed, Id }, 0 },
2980
    { "lwpval", { VexGdq, Ed, Id }, 0 },
2981
  },
2982
2983
#include "i386-dis-evex-reg.h"
2984
};
2985
2986
static const struct dis386 prefix_table[][4] = {
2987
  /* PREFIX_90 */
2988
  {
2989
    { "xchgS", { { NOP_Fixup, 0 }, { NOP_Fixup, 1 } }, 0 },
2990
    { "pause", { XX }, 0 },
2991
    { "xchgS", { { NOP_Fixup, 0 }, { NOP_Fixup, 1 } }, 0 },
2992
    { NULL, { { NULL, 0 } }, PREFIX_IGNORED }
2993
  },
2994
2995
  /* PREFIX_0F00_REG_6_X86_64 */
2996
  {
2997
    { Bad_Opcode },
2998
    { Bad_Opcode },
2999
    { Bad_Opcode },
3000
    { "lkgs",  { Ew }, 0 },
3001
  },
3002
3003
  /* PREFIX_0F01_REG_0_MOD_3_RM_6 */
3004
  {
3005
    { "wrmsrns",        { Skip_MODRM }, 0 },
3006
    { X86_64_TABLE (X86_64_0F01_REG_0_MOD_3_RM_6_P_1) },
3007
    { Bad_Opcode },
3008
    { X86_64_TABLE (X86_64_0F01_REG_0_MOD_3_RM_6_P_3) },
3009
  },
3010
3011
  /* PREFIX_0F01_REG_1_RM_2 */
3012
  {
3013
    { "clac",   { Skip_MODRM }, 0 },
3014
    { X86_64_TABLE (X86_64_0F01_REG_1_RM_2_PREFIX_1) },
3015
    { Bad_Opcode },
3016
    { X86_64_TABLE (X86_64_0F01_REG_1_RM_2_PREFIX_3)},
3017
  },
3018
3019
  /* PREFIX_0F01_REG_1_RM_4 */
3020
  {
3021
    { Bad_Opcode },
3022
    { Bad_Opcode },
3023
    { "tdcall",   { Skip_MODRM }, 0 },
3024
    { Bad_Opcode },
3025
  },
3026
3027
  /* PREFIX_0F01_REG_1_RM_5 */
3028
  {
3029
    { Bad_Opcode },
3030
    { Bad_Opcode },
3031
    { X86_64_TABLE (X86_64_0F01_REG_1_RM_5_PREFIX_2) },
3032
    { Bad_Opcode },
3033
  },
3034
3035
  /* PREFIX_0F01_REG_1_RM_6 */
3036
  {
3037
    { Bad_Opcode },
3038
    { Bad_Opcode },
3039
    { X86_64_TABLE (X86_64_0F01_REG_1_RM_6_PREFIX_2) },
3040
    { Bad_Opcode },
3041
  },
3042
3043
  /* PREFIX_0F01_REG_1_RM_7 */
3044
  {
3045
    { "encls",    { Skip_MODRM }, 0 },
3046
    { Bad_Opcode },
3047
    { X86_64_TABLE (X86_64_0F01_REG_1_RM_7_PREFIX_2) },
3048
    { Bad_Opcode },
3049
  },
3050
3051
  /* PREFIX_0F01_REG_3_RM_1 */
3052
  {
3053
    { "vmmcall",  { Skip_MODRM }, 0 },
3054
    { "vmgexit",  { Skip_MODRM }, 0 },
3055
    { Bad_Opcode },
3056
    { "vmgexit",  { Skip_MODRM }, 0 },
3057
  },
3058
3059
  /* PREFIX_0F01_REG_5_MOD_0 */
3060
  {
3061
    { Bad_Opcode },
3062
    { "rstorssp", { Mq }, PREFIX_OPCODE },
3063
  },
3064
3065
  /* PREFIX_0F01_REG_5_MOD_3_RM_0 */
3066
  {
3067
    { "serialize",  { Skip_MODRM }, PREFIX_OPCODE },
3068
    { "setssbsy", { Skip_MODRM }, PREFIX_OPCODE },
3069
    { Bad_Opcode },
3070
    { "xsusldtrk",  { Skip_MODRM }, PREFIX_OPCODE },
3071
  },
3072
3073
  /* PREFIX_0F01_REG_5_MOD_3_RM_1 */
3074
  {
3075
    { Bad_Opcode },
3076
    { Bad_Opcode },
3077
    { Bad_Opcode },
3078
    { "xresldtrk",     { Skip_MODRM }, PREFIX_OPCODE },
3079
  },
3080
3081
  /* PREFIX_0F01_REG_5_MOD_3_RM_2 */
3082
  {
3083
    { Bad_Opcode },
3084
    { "saveprevssp",  { Skip_MODRM }, PREFIX_OPCODE },
3085
  },
3086
3087
  /* PREFIX_0F01_REG_5_MOD_3_RM_4 */
3088
  {
3089
    { Bad_Opcode },
3090
    { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1) },
3091
  },
3092
3093
  /* PREFIX_0F01_REG_5_MOD_3_RM_5 */
3094
  {
3095
    { Bad_Opcode },
3096
    { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1) },
3097
  },
3098
3099
  /* PREFIX_0F01_REG_5_MOD_3_RM_6 */
3100
  {
3101
    { "rdpkru", { Skip_MODRM }, 0 },
3102
    { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1) },
3103
  },
3104
3105
  /* PREFIX_0F01_REG_5_MOD_3_RM_7 */
3106
  {
3107
    { "wrpkru", { Skip_MODRM }, 0 },
3108
    { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1) },
3109
  },
3110
3111
  /* PREFIX_0F01_REG_7_MOD_3_RM_2 */
3112
  {
3113
    { "monitorx", { { OP_Monitor, 0 } }, 0  },
3114
    { "mcommit",  { Skip_MODRM }, 0 },
3115
  },
3116
3117
  /* PREFIX_0F01_REG_7_MOD_3_RM_5 */
3118
  {
3119
    { "rdpru", { Skip_MODRM }, 0 },
3120
    { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_1) },
3121
  },
3122
3123
  /* PREFIX_0F01_REG_7_MOD_3_RM_6 */
3124
  {
3125
    { "invlpgb",        { Skip_MODRM }, 0 },
3126
    { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1) },
3127
    { Bad_Opcode },
3128
    { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3) },
3129
  },
3130
3131
  /* PREFIX_0F01_REG_7_MOD_3_RM_7 */
3132
  {
3133
    { "tlbsync",        { Skip_MODRM }, 0 },
3134
    { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1) },
3135
    { Bad_Opcode },
3136
    { "pvalidate",      { Skip_MODRM }, 0 },
3137
  },
3138
3139
  /* PREFIX_0F09 */
3140
  {
3141
    { "wbinvd",   { XX }, 0 },
3142
    { "wbnoinvd", { XX }, 0 },
3143
  },
3144
3145
  /* PREFIX_0F10 */
3146
  {
3147
    { "movups", { XM, EXx }, PREFIX_OPCODE },
3148
    { "movss",  { XM, EXd }, PREFIX_OPCODE },
3149
    { "movupd", { XM, EXx }, PREFIX_OPCODE },
3150
    { "movsd",  { XM, EXq }, PREFIX_OPCODE },
3151
  },
3152
3153
  /* PREFIX_0F11 */
3154
  {
3155
    { "movups", { EXxS, XM }, PREFIX_OPCODE },
3156
    { "movss",  { EXdS, XM }, PREFIX_OPCODE },
3157
    { "movupd", { EXxS, XM }, PREFIX_OPCODE },
3158
    { "movsd",  { EXqS, XM }, PREFIX_OPCODE },
3159
  },
3160
3161
  /* PREFIX_0F12 */
3162
  {
3163
    { MOD_TABLE (MOD_0F12_PREFIX_0) },
3164
    { "movsldup", { XM, EXx }, PREFIX_OPCODE },
3165
    { MOD_TABLE (MOD_0F12_PREFIX_2) },
3166
    { "movddup", { XM, EXq }, PREFIX_OPCODE },
3167
  },
3168
3169
  /* PREFIX_0F16 */
3170
  {
3171
    { MOD_TABLE (MOD_0F16_PREFIX_0) },
3172
    { "movshdup", { XM, EXx }, PREFIX_OPCODE },
3173
    { MOD_TABLE (MOD_0F16_PREFIX_2) },
3174
  },
3175
3176
  /* PREFIX_0F18_REG_6_MOD_0_X86_64 */
3177
  {
3178
    { "prefetchit1",  { { PREFETCHI_Fixup, b_mode } }, 0 },
3179
    { "nopQ",   { Ev }, 0 },
3180
    { "nopQ",   { Ev }, 0 },
3181
    { "nopQ",   { Ev }, 0 },
3182
  },
3183
3184
  /* PREFIX_0F18_REG_7_MOD_0_X86_64 */
3185
  {
3186
    { "prefetchit0",  { { PREFETCHI_Fixup, b_mode } }, 0 },
3187
    { "nopQ",   { Ev }, 0 },
3188
    { "nopQ",   { Ev }, 0 },
3189
    { "nopQ",   { Ev }, 0 },
3190
  },
3191
3192
  /* PREFIX_0F1A */
3193
  {
3194
    { MOD_TABLE (MOD_0F1A_PREFIX_0) },
3195
    { "bndcl",  { Gbnd, Ev_bnd }, 0 },
3196
    { "bndmov", { Gbnd, Ebnd }, 0 },
3197
    { "bndcu",  { Gbnd, Ev_bnd }, 0 },
3198
  },
3199
3200
  /* PREFIX_0F1B */
3201
  {
3202
    { MOD_TABLE (MOD_0F1B_PREFIX_0) },
3203
    { MOD_TABLE (MOD_0F1B_PREFIX_1) },
3204
    { "bndmov", { EbndS, Gbnd }, 0 },
3205
    { "bndcn",  { Gbnd, Ev_bnd }, 0 },
3206
  },
3207
3208
  /* PREFIX_0F1C */
3209
  {
3210
    { MOD_TABLE (MOD_0F1C_PREFIX_0) },
3211
    { "nopQ", { Ev }, PREFIX_IGNORED },
3212
    { "nopQ", { Ev }, 0 },
3213
    { "nopQ", { Ev }, PREFIX_IGNORED },
3214
  },
3215
3216
  /* PREFIX_0F1E */
3217
  {
3218
    { "nopQ", { Ev }, 0 },
3219
    { MOD_TABLE (MOD_0F1E_PREFIX_1) },
3220
    { "nopQ", { Ev }, 0 },
3221
    { NULL, { XX }, PREFIX_IGNORED },
3222
  },
3223
3224
  /* PREFIX_0F2A */
3225
  {
3226
    { "cvtpi2ps", { XM, EMCq }, PREFIX_OPCODE },
3227
    { "cvtsi2ss{%LQ|}", { XM, Edq }, PREFIX_OPCODE },
3228
    { "cvtpi2pd", { XM, EMCq }, PREFIX_OPCODE },
3229
    { "cvtsi2sd{%LQ|}", { XM, Edq }, 0 },
3230
  },
3231
3232
  /* PREFIX_0F2B */
3233
  {
3234
    { MOD_TABLE (MOD_0F2B_PREFIX_0) },
3235
    { MOD_TABLE (MOD_0F2B_PREFIX_1) },
3236
    { MOD_TABLE (MOD_0F2B_PREFIX_2) },
3237
    { MOD_TABLE (MOD_0F2B_PREFIX_3) },
3238
  },
3239
3240
  /* PREFIX_0F2C */
3241
  {
3242
    { "cvttps2pi", { MXC, EXq }, PREFIX_OPCODE },
3243
    { "cvttss2si", { Gdq, EXd }, PREFIX_OPCODE },
3244
    { "cvttpd2pi", { MXC, EXx }, PREFIX_OPCODE },
3245
    { "cvttsd2si", { Gdq, EXq }, PREFIX_OPCODE },
3246
  },
3247
3248
  /* PREFIX_0F2D */
3249
  {
3250
    { "cvtps2pi", { MXC, EXq }, PREFIX_OPCODE },
3251
    { "cvtss2si", { Gdq, EXd }, PREFIX_OPCODE },
3252
    { "cvtpd2pi", { MXC, EXx }, PREFIX_OPCODE },
3253
    { "cvtsd2si", { Gdq, EXq }, PREFIX_OPCODE },
3254
  },
3255
3256
  /* PREFIX_0F2E */
3257
  {
3258
    { "ucomiss",{ XM, EXd }, 0 },
3259
    { Bad_Opcode },
3260
    { "ucomisd",{ XM, EXq }, 0 },
3261
  },
3262
3263
  /* PREFIX_0F2F */
3264
  {
3265
    { "comiss", { XM, EXd }, 0 },
3266
    { Bad_Opcode },
3267
    { "comisd", { XM, EXq }, 0 },
3268
  },
3269
3270
  /* PREFIX_0F51 */
3271
  {
3272
    { "sqrtps", { XM, EXx }, PREFIX_OPCODE },
3273
    { "sqrtss", { XM, EXd }, PREFIX_OPCODE },
3274
    { "sqrtpd", { XM, EXx }, PREFIX_OPCODE },
3275
    { "sqrtsd", { XM, EXq }, PREFIX_OPCODE },
3276
  },
3277
3278
  /* PREFIX_0F52 */
3279
  {
3280
    { "rsqrtps",{ XM, EXx }, PREFIX_OPCODE },
3281
    { "rsqrtss",{ XM, EXd }, PREFIX_OPCODE },
3282
  },
3283
3284
  /* PREFIX_0F53 */
3285
  {
3286
    { "rcpps",  { XM, EXx }, PREFIX_OPCODE },
3287
    { "rcpss",  { XM, EXd }, PREFIX_OPCODE },
3288
  },
3289
3290
  /* PREFIX_0F58 */
3291
  {
3292
    { "addps", { XM, EXx }, PREFIX_OPCODE },
3293
    { "addss", { XM, EXd }, PREFIX_OPCODE },
3294
    { "addpd", { XM, EXx }, PREFIX_OPCODE },
3295
    { "addsd", { XM, EXq }, PREFIX_OPCODE },
3296
  },
3297
3298
  /* PREFIX_0F59 */
3299
  {
3300
    { "mulps",  { XM, EXx }, PREFIX_OPCODE },
3301
    { "mulss",  { XM, EXd }, PREFIX_OPCODE },
3302
    { "mulpd",  { XM, EXx }, PREFIX_OPCODE },
3303
    { "mulsd",  { XM, EXq }, PREFIX_OPCODE },
3304
  },
3305
3306
  /* PREFIX_0F5A */
3307
  {
3308
    { "cvtps2pd", { XM, EXq }, PREFIX_OPCODE },
3309
    { "cvtss2sd", { XM, EXd }, PREFIX_OPCODE },
3310
    { "cvtpd2ps", { XM, EXx }, PREFIX_OPCODE },
3311
    { "cvtsd2ss", { XM, EXq }, PREFIX_OPCODE },
3312
  },
3313
3314
  /* PREFIX_0F5B */
3315
  {
3316
    { "cvtdq2ps", { XM, EXx }, PREFIX_OPCODE },
3317
    { "cvttps2dq", { XM, EXx }, PREFIX_OPCODE },
3318
    { "cvtps2dq", { XM, EXx }, PREFIX_OPCODE },
3319
  },
3320
3321
  /* PREFIX_0F5C */
3322
  {
3323
    { "subps",  { XM, EXx }, PREFIX_OPCODE },
3324
    { "subss",  { XM, EXd }, PREFIX_OPCODE },
3325
    { "subpd",  { XM, EXx }, PREFIX_OPCODE },
3326
    { "subsd",  { XM, EXq }, PREFIX_OPCODE },
3327
  },
3328
3329
  /* PREFIX_0F5D */
3330
  {
3331
    { "minps",  { XM, EXx }, PREFIX_OPCODE },
3332
    { "minss",  { XM, EXd }, PREFIX_OPCODE },
3333
    { "minpd",  { XM, EXx }, PREFIX_OPCODE },
3334
    { "minsd",  { XM, EXq }, PREFIX_OPCODE },
3335
  },
3336
3337
  /* PREFIX_0F5E */
3338
  {
3339
    { "divps",  { XM, EXx }, PREFIX_OPCODE },
3340
    { "divss",  { XM, EXd }, PREFIX_OPCODE },
3341
    { "divpd",  { XM, EXx }, PREFIX_OPCODE },
3342
    { "divsd",  { XM, EXq }, PREFIX_OPCODE },
3343
  },
3344
3345
  /* PREFIX_0F5F */
3346
  {
3347
    { "maxps",  { XM, EXx }, PREFIX_OPCODE },
3348
    { "maxss",  { XM, EXd }, PREFIX_OPCODE },
3349
    { "maxpd",  { XM, EXx }, PREFIX_OPCODE },
3350
    { "maxsd",  { XM, EXq }, PREFIX_OPCODE },
3351
  },
3352
3353
  /* PREFIX_0F60 */
3354
  {
3355
    { "punpcklbw",{ MX, EMd }, PREFIX_OPCODE },
3356
    { Bad_Opcode },
3357
    { "punpcklbw",{ MX, EMx }, PREFIX_OPCODE },
3358
  },
3359
3360
  /* PREFIX_0F61 */
3361
  {
3362
    { "punpcklwd",{ MX, EMd }, PREFIX_OPCODE },
3363
    { Bad_Opcode },
3364
    { "punpcklwd",{ MX, EMx }, PREFIX_OPCODE },
3365
  },
3366
3367
  /* PREFIX_0F62 */
3368
  {
3369
    { "punpckldq",{ MX, EMd }, PREFIX_OPCODE },
3370
    { Bad_Opcode },
3371
    { "punpckldq",{ MX, EMx }, PREFIX_OPCODE },
3372
  },
3373
3374
  /* PREFIX_0F6F */
3375
  {
3376
    { "movq", { MX, EM }, PREFIX_OPCODE },
3377
    { "movdqu", { XM, EXx }, PREFIX_OPCODE },
3378
    { "movdqa", { XM, EXx }, PREFIX_OPCODE },
3379
  },
3380
3381
  /* PREFIX_0F70 */
3382
  {
3383
    { "pshufw", { MX, EM, Ib }, PREFIX_OPCODE },
3384
    { "pshufhw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3385
    { "pshufd", { XM, EXx, Ib }, PREFIX_OPCODE },
3386
    { "pshuflw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3387
  },
3388
3389
  /* PREFIX_0F78 */
3390
  {
3391
    {"vmread",  { Em, Gm }, 0 },
3392
    { Bad_Opcode },
3393
    {"extrq", { XS, Ib, Ib }, 0 },
3394
    {"insertq", { XM, XS, Ib, Ib }, 0 },
3395
  },
3396
3397
  /* PREFIX_0F79 */
3398
  {
3399
    {"vmwrite", { Gm, Em }, 0 },
3400
    { Bad_Opcode },
3401
    {"extrq", { XM, XS }, 0 },
3402
    {"insertq", { XM, XS }, 0 },
3403
  },
3404
3405
  /* PREFIX_0F7C */
3406
  {
3407
    { Bad_Opcode },
3408
    { Bad_Opcode },
3409
    { "haddpd", { XM, EXx }, PREFIX_OPCODE },
3410
    { "haddps", { XM, EXx }, PREFIX_OPCODE },
3411
  },
3412
3413
  /* PREFIX_0F7D */
3414
  {
3415
    { Bad_Opcode },
3416
    { Bad_Opcode },
3417
    { "hsubpd", { XM, EXx }, PREFIX_OPCODE },
3418
    { "hsubps", { XM, EXx }, PREFIX_OPCODE },
3419
  },
3420
3421
  /* PREFIX_0F7E */
3422
  {
3423
    { "movK", { Edq, MX }, PREFIX_OPCODE },
3424
    { "movq", { XM, EXq }, PREFIX_OPCODE },
3425
    { "movK", { Edq, XM }, PREFIX_OPCODE },
3426
  },
3427
3428
  /* PREFIX_0F7F */
3429
  {
3430
    { "movq", { EMS, MX }, PREFIX_OPCODE },
3431
    { "movdqu", { EXxS, XM }, PREFIX_OPCODE },
3432
    { "movdqa", { EXxS, XM }, PREFIX_OPCODE },
3433
  },
3434
3435
  /* PREFIX_0FAE_REG_0_MOD_3 */
3436
  {
3437
    { Bad_Opcode },
3438
    { "rdfsbase", { Ev }, 0 },
3439
  },
3440
3441
  /* PREFIX_0FAE_REG_1_MOD_3 */
3442
  {
3443
    { Bad_Opcode },
3444
    { "rdgsbase", { Ev }, 0 },
3445
  },
3446
3447
  /* PREFIX_0FAE_REG_2_MOD_3 */
3448
  {
3449
    { Bad_Opcode },
3450
    { "wrfsbase", { Ev }, 0 },
3451
  },
3452
3453
  /* PREFIX_0FAE_REG_3_MOD_3 */
3454
  {
3455
    { Bad_Opcode },
3456
    { "wrgsbase", { Ev }, 0 },
3457
  },
3458
3459
  /* PREFIX_0FAE_REG_4_MOD_0 */
3460
  {
3461
    { "xsave",  { FXSAVE }, 0 },
3462
    { "ptwrite{%LQ|}", { Edq }, 0 },
3463
  },
3464
3465
  /* PREFIX_0FAE_REG_4_MOD_3 */
3466
  {
3467
    { Bad_Opcode },
3468
    { "ptwrite{%LQ|}", { Edq }, 0 },
3469
  },
3470
3471
  /* PREFIX_0FAE_REG_5_MOD_3 */
3472
  {
3473
    { "lfence",   { Skip_MODRM }, 0 },
3474
    { "incsspK",  { Edq }, PREFIX_OPCODE },
3475
  },
3476
3477
  /* PREFIX_0FAE_REG_6_MOD_0 */
3478
  {
3479
    { "xsaveopt", { FXSAVE }, PREFIX_OPCODE },
3480
    { "clrssbsy", { Mq }, PREFIX_OPCODE },
3481
    { "clwb", { Mb }, PREFIX_OPCODE },
3482
  },
3483
3484
  /* PREFIX_0FAE_REG_6_MOD_3 */
3485
  {
3486
    { RM_TABLE (RM_0FAE_REG_6_MOD_3_P_0) },
3487
    { "umonitor", { Eva }, PREFIX_OPCODE },
3488
    { "tpause", { Edq }, PREFIX_OPCODE },
3489
    { "umwait", { Edq }, PREFIX_OPCODE },
3490
  },
3491
3492
  /* PREFIX_0FAE_REG_7_MOD_0 */
3493
  {
3494
    { "clflush",  { Mb }, 0 },
3495
    { Bad_Opcode },
3496
    { "clflushopt", { Mb }, 0 },
3497
  },
3498
3499
  /* PREFIX_0FB8 */
3500
  {
3501
    { Bad_Opcode },
3502
    { "popcntS", { Gv, Ev }, 0 },
3503
  },
3504
3505
  /* PREFIX_0FBC */
3506
  {
3507
    { "bsfS", { Gv, Ev }, 0 },
3508
    { "tzcntS", { Gv, Ev }, 0 },
3509
    { "bsfS", { Gv, Ev }, 0 },
3510
  },
3511
3512
  /* PREFIX_0FBD */
3513
  {
3514
    { "bsrS", { Gv, Ev }, 0 },
3515
    { "lzcntS", { Gv, Ev }, 0 },
3516
    { "bsrS", { Gv, Ev }, 0 },
3517
  },
3518
3519
  /* PREFIX_0FC2 */
3520
  {
3521
    { "cmpps",  { XM, EXx, CMP }, PREFIX_OPCODE },
3522
    { "cmpss",  { XM, EXd, CMP }, PREFIX_OPCODE },
3523
    { "cmppd",  { XM, EXx, CMP }, PREFIX_OPCODE },
3524
    { "cmpsd",  { XM, EXq, CMP }, PREFIX_OPCODE },
3525
  },
3526
3527
  /* PREFIX_0FC7_REG_6_MOD_0 */
3528
  {
3529
    { "vmptrld",{ Mq }, 0 },
3530
    { "vmxon",  { Mq }, 0 },
3531
    { "vmclear",{ Mq }, 0 },
3532
  },
3533
3534
  /* PREFIX_0FC7_REG_6_MOD_3 */
3535
  {
3536
    { "rdrand", { Ev }, 0 },
3537
    { X86_64_TABLE (X86_64_0FC7_REG_6_MOD_3_PREFIX_1) },
3538
    { "rdrand", { Ev }, 0 }
3539
  },
3540
3541
  /* PREFIX_0FC7_REG_7_MOD_3 */
3542
  {
3543
    { "rdseed", { Ev }, 0 },
3544
    { "rdpid",  { Em }, 0 },
3545
    { "rdseed", { Ev }, 0 },
3546
  },
3547
3548
  /* PREFIX_0FD0 */
3549
  {
3550
    { Bad_Opcode },
3551
    { Bad_Opcode },
3552
    { "addsubpd", { XM, EXx }, 0 },
3553
    { "addsubps", { XM, EXx }, 0 },
3554
  },
3555
3556
  /* PREFIX_0FD6 */
3557
  {
3558
    { Bad_Opcode },
3559
    { "movq2dq",{ XM, MS }, 0 },
3560
    { "movq", { EXqS, XM }, 0 },
3561
    { "movdq2q",{ MX, XS }, 0 },
3562
  },
3563
3564
  /* PREFIX_0FE6 */
3565
  {
3566
    { Bad_Opcode },
3567
    { "cvtdq2pd", { XM, EXq }, PREFIX_OPCODE },
3568
    { "cvttpd2dq", { XM, EXx }, PREFIX_OPCODE },
3569
    { "cvtpd2dq", { XM, EXx }, PREFIX_OPCODE },
3570
  },
3571
3572
  /* PREFIX_0FE7 */
3573
  {
3574
    { "movntq", { Mq, MX }, PREFIX_OPCODE },
3575
    { Bad_Opcode },
3576
    { MOD_TABLE (MOD_0FE7_PREFIX_2) },
3577
  },
3578
3579
  /* PREFIX_0FF0 */
3580
  {
3581
    { Bad_Opcode },
3582
    { Bad_Opcode },
3583
    { Bad_Opcode },
3584
    { MOD_TABLE (MOD_0FF0_PREFIX_3) },
3585
  },
3586
3587
  /* PREFIX_0FF7 */
3588
  {
3589
    { "maskmovq", { MX, MS }, PREFIX_OPCODE },
3590
    { Bad_Opcode },
3591
    { "maskmovdqu", { XM, XS }, PREFIX_OPCODE },
3592
  },
3593
3594
  /* PREFIX_0F38D8 */
3595
  {
3596
    { Bad_Opcode },
3597
    { REG_TABLE (REG_0F38D8_PREFIX_1) },
3598
  },
3599
3600
  /* PREFIX_0F38DC */
3601
  {
3602
    { Bad_Opcode },
3603
    { MOD_TABLE (MOD_0F38DC_PREFIX_1) },
3604
    { "aesenc", { XM, EXx }, 0 },
3605
  },
3606
3607
  /* PREFIX_0F38DD */
3608
  {
3609
    { Bad_Opcode },
3610
    { MOD_TABLE (MOD_0F38DD_PREFIX_1) },
3611
    { "aesenclast", { XM, EXx }, 0 },
3612
  },
3613
3614
  /* PREFIX_0F38DE */
3615
  {
3616
    { Bad_Opcode },
3617
    { MOD_TABLE (MOD_0F38DE_PREFIX_1) },
3618
    { "aesdec", { XM, EXx }, 0 },
3619
  },
3620
3621
  /* PREFIX_0F38DF */
3622
  {
3623
    { Bad_Opcode },
3624
    { MOD_TABLE (MOD_0F38DF_PREFIX_1) },
3625
    { "aesdeclast", { XM, EXx }, 0 },
3626
  },
3627
3628
  /* PREFIX_0F38F0 */
3629
  {
3630
    { "movbeS", { Gv, Mv }, PREFIX_OPCODE },
3631
    { Bad_Opcode },
3632
    { "movbeS", { Gv, Mv }, PREFIX_OPCODE },
3633
    { "crc32A", { Gdq, Eb }, PREFIX_OPCODE },
3634
  },
3635
3636
  /* PREFIX_0F38F1 */
3637
  {
3638
    { "movbeS", { Mv, Gv }, PREFIX_OPCODE },
3639
    { Bad_Opcode },
3640
    { "movbeS", { Mv, Gv }, PREFIX_OPCODE },
3641
    { "crc32Q", { Gdq, Ev }, PREFIX_OPCODE },
3642
  },
3643
3644
  /* PREFIX_0F38F6 */
3645
  {
3646
    { MOD_TABLE (MOD_0F38F6_PREFIX_0) },
3647
    { "adoxS",  { Gdq, Edq}, PREFIX_OPCODE },
3648
    { "adcxS",  { Gdq, Edq}, PREFIX_OPCODE },
3649
    { Bad_Opcode },
3650
  },
3651
3652
  /* PREFIX_0F38F8 */
3653
  {
3654
    { Bad_Opcode },
3655
    { MOD_TABLE (MOD_0F38F8_PREFIX_1) },
3656
    { MOD_TABLE (MOD_0F38F8_PREFIX_2) },
3657
    { MOD_TABLE (MOD_0F38F8_PREFIX_3) },
3658
  },
3659
  /* PREFIX_0F38FA */
3660
  {
3661
    { Bad_Opcode },
3662
    { MOD_TABLE (MOD_0F38FA_PREFIX_1) },
3663
  },
3664
3665
  /* PREFIX_0F38FB */
3666
  {
3667
    { Bad_Opcode },
3668
    { MOD_TABLE (MOD_0F38FB_PREFIX_1) },
3669
  },
3670
3671
  /* PREFIX_0F38FC */
3672
  {
3673
    { "aadd", { Mdq, Gdq }, 0 },
3674
    { "axor", { Mdq, Gdq }, 0 },
3675
    { "aand", { Mdq, Gdq }, 0 },
3676
    { "aor",  { Mdq, Gdq }, 0 },
3677
  },
3678
3679
  /* PREFIX_0F3A0F */
3680
  {
3681
    { Bad_Opcode },
3682
    { MOD_TABLE (MOD_0F3A0F_PREFIX_1)},
3683
  },
3684
3685
  /* PREFIX_VEX_0F10 */
3686
  {
3687
    { "%XEvmovupX", { XM, EXEvexXNoBcst }, 0 },
3688
    { "%XEvmovs%XS",  { XMScalar, VexScalarR, EXd }, 0 },
3689
    { "%XEvmovupX", { XM, EXEvexXNoBcst }, 0 },
3690
    { "%XEvmovs%XD",  { XMScalar, VexScalarR, EXq }, 0 },
3691
  },
3692
3693
  /* PREFIX_VEX_0F11 */
3694
  {
3695
    { "%XEvmovupX", { EXxS, XM }, 0 },
3696
    { "%XEvmovs%XS",  { EXdS, VexScalarR, XMScalar }, 0 },
3697
    { "%XEvmovupX", { EXxS, XM }, 0 },
3698
    { "%XEvmovs%XD",  { EXqS, VexScalarR, XMScalar }, 0 },
3699
  },
3700
3701
  /* PREFIX_VEX_0F12 */
3702
  {
3703
    { MOD_TABLE (MOD_VEX_0F12_PREFIX_0) },
3704
    { "%XEvmov%XSldup", { XM, EXEvexXNoBcst }, 0 },
3705
    { MOD_TABLE (MOD_VEX_0F12_PREFIX_2) },
3706
    { "%XEvmov%XDdup",  { XM, EXymmq }, 0 },
3707
  },
3708
3709
  /* PREFIX_VEX_0F16 */
3710
  {
3711
    { MOD_TABLE (MOD_VEX_0F16_PREFIX_0) },
3712
    { "%XEvmov%XShdup", { XM, EXEvexXNoBcst }, 0 },
3713
    { MOD_TABLE (MOD_VEX_0F16_PREFIX_2) },
3714
  },
3715
3716
  /* PREFIX_VEX_0F2A */
3717
  {
3718
    { Bad_Opcode },
3719
    { "%XEvcvtsi2ss{%LQ|}", { XMScalar, VexScalar, EXxEVexR, Edq }, 0 },
3720
    { Bad_Opcode },
3721
    { "%XEvcvtsi2sd{%LQ|}", { XMScalar, VexScalar, EXxEVexR64, Edq }, 0 },
3722
  },
3723
3724
  /* PREFIX_VEX_0F2C */
3725
  {
3726
    { Bad_Opcode },
3727
    { "%XEvcvttss2si",  { Gdq, EXd, EXxEVexS }, 0 },
3728
    { Bad_Opcode },
3729
    { "%XEvcvttsd2si",  { Gdq, EXq, EXxEVexS }, 0 },
3730
  },
3731
3732
  /* PREFIX_VEX_0F2D */
3733
  {
3734
    { Bad_Opcode },
3735
    { "%XEvcvtss2si", { Gdq, EXd, EXxEVexR }, 0 },
3736
    { Bad_Opcode },
3737
    { "%XEvcvtsd2si", { Gdq, EXq, EXxEVexR }, 0 },
3738
  },
3739
3740
  /* PREFIX_VEX_0F2E */
3741
  {
3742
    { "%XEvucomisX",  { XMScalar, EXd, EXxEVexS }, 0 },
3743
    { Bad_Opcode },
3744
    { "%XEvucomisX",  { XMScalar, EXq, EXxEVexS }, 0 },
3745
  },
3746
3747
  /* PREFIX_VEX_0F2F */
3748
  {
3749
    { "%XEvcomisX", { XMScalar, EXd, EXxEVexS }, 0 },
3750
    { Bad_Opcode },
3751
    { "%XEvcomisX", { XMScalar, EXq, EXxEVexS }, 0 },
3752
  },
3753
3754
  /* PREFIX_VEX_0F41_L_1_M_1_W_0 */
3755
  {
3756
    { "kandw",          { MaskG, MaskVex, MaskE }, 0 },
3757
    { Bad_Opcode },
3758
    { "kandb",          { MaskG, MaskVex, MaskE }, 0 },
3759
  },
3760
3761
  /* PREFIX_VEX_0F41_L_1_M_1_W_1 */
3762
  {
3763
    { "kandq",          { MaskG, MaskVex, MaskE }, 0 },
3764
    { Bad_Opcode },
3765
    { "kandd",          { MaskG, MaskVex, MaskE }, 0 },
3766
  },
3767
3768
  /* PREFIX_VEX_0F42_L_1_M_1_W_0 */
3769
  {
3770
    { "kandnw",         { MaskG, MaskVex, MaskE }, 0 },
3771
    { Bad_Opcode },
3772
    { "kandnb",         { MaskG, MaskVex, MaskE }, 0 },
3773
  },
3774
3775
  /* PREFIX_VEX_0F42_L_1_M_1_W_1 */
3776
  {
3777
    { "kandnq",         { MaskG, MaskVex, MaskE }, 0 },
3778
    { Bad_Opcode },
3779
    { "kandnd",         { MaskG, MaskVex, MaskE }, 0 },
3780
  },
3781
3782
  /* PREFIX_VEX_0F44_L_0_M_1_W_0 */
3783
  {
3784
    { "knotw",          { MaskG, MaskE }, 0 },
3785
    { Bad_Opcode },
3786
    { "knotb",          { MaskG, MaskE }, 0 },
3787
  },
3788
3789
  /* PREFIX_VEX_0F44_L_0_M_1_W_1 */
3790
  {
3791
    { "knotq",          { MaskG, MaskE }, 0 },
3792
    { Bad_Opcode },
3793
    { "knotd",          { MaskG, MaskE }, 0 },
3794
  },
3795
3796
  /* PREFIX_VEX_0F45_L_1_M_1_W_0 */
3797
  {
3798
    { "korw",       { MaskG, MaskVex, MaskE }, 0 },
3799
    { Bad_Opcode },
3800
    { "korb",       { MaskG, MaskVex, MaskE }, 0 },
3801
  },
3802
3803
  /* PREFIX_VEX_0F45_L_1_M_1_W_1 */
3804
  {
3805
    { "korq",       { MaskG, MaskVex, MaskE }, 0 },
3806
    { Bad_Opcode },
3807
    { "kord",       { MaskG, MaskVex, MaskE }, 0 },
3808
  },
3809
3810
  /* PREFIX_VEX_0F46_L_1_M_1_W_0 */
3811
  {
3812
    { "kxnorw",     { MaskG, MaskVex, MaskE }, 0 },
3813
    { Bad_Opcode },
3814
    { "kxnorb",     { MaskG, MaskVex, MaskE }, 0 },
3815
  },
3816
3817
  /* PREFIX_VEX_0F46_L_1_M_1_W_1 */
3818
  {
3819
    { "kxnorq",     { MaskG, MaskVex, MaskE }, 0 },
3820
    { Bad_Opcode },
3821
    { "kxnord",     { MaskG, MaskVex, MaskE }, 0 },
3822
  },
3823
3824
  /* PREFIX_VEX_0F47_L_1_M_1_W_0 */
3825
  {
3826
    { "kxorw",      { MaskG, MaskVex, MaskE }, 0 },
3827
    { Bad_Opcode },
3828
    { "kxorb",      { MaskG, MaskVex, MaskE }, 0 },
3829
  },
3830
3831
  /* PREFIX_VEX_0F47_L_1_M_1_W_1 */
3832
  {
3833
    { "kxorq",      { MaskG, MaskVex, MaskE }, 0 },
3834
    { Bad_Opcode },
3835
    { "kxord",      { MaskG, MaskVex, MaskE }, 0 },
3836
  },
3837
3838
  /* PREFIX_VEX_0F4A_L_1_M_1_W_0 */
3839
  {
3840
    { "kaddw",          { MaskG, MaskVex, MaskE }, 0 },
3841
    { Bad_Opcode },
3842
    { "kaddb",          { MaskG, MaskVex, MaskE }, 0 },
3843
  },
3844
3845
  /* PREFIX_VEX_0F4A_L_1_M_1_W_1 */
3846
  {
3847
    { "kaddq",          { MaskG, MaskVex, MaskE }, 0 },
3848
    { Bad_Opcode },
3849
    { "kaddd",          { MaskG, MaskVex, MaskE }, 0 },
3850
  },
3851
3852
  /* PREFIX_VEX_0F4B_L_1_M_1_W_0 */
3853
  {
3854
    { "kunpckwd",   { MaskG, MaskVex, MaskE }, 0 },
3855
    { Bad_Opcode },
3856
    { "kunpckbw",   { MaskG, MaskVex, MaskE }, 0 },
3857
  },
3858
3859
  /* PREFIX_VEX_0F4B_L_1_M_1_W_1 */
3860
  {
3861
    { "kunpckdq",   { MaskG, MaskVex, MaskE }, 0 },
3862
  },
3863
3864
  /* PREFIX_VEX_0F51 */
3865
  {
3866
    { "%XEvsqrtpX", { XM, EXx, EXxEVexR }, 0 },
3867
    { "%XEvsqrts%XS", { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
3868
    { "%XEvsqrtpX", { XM, EXx, EXxEVexR }, 0 },
3869
    { "%XEvsqrts%XD", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3870
  },
3871
3872
  /* PREFIX_VEX_0F52 */
3873
  {
3874
    { "vrsqrtps", { XM, EXx }, 0 },
3875
    { "vrsqrtss", { XMScalar, VexScalar, EXd }, 0 },
3876
  },
3877
3878
  /* PREFIX_VEX_0F53 */
3879
  {
3880
    { "vrcpps",   { XM, EXx }, 0 },
3881
    { "vrcpss",   { XMScalar, VexScalar, EXd }, 0 },
3882
  },
3883
3884
  /* PREFIX_VEX_0F58 */
3885
  {
3886
    { "%XEvaddpX",  { XM, Vex, EXx, EXxEVexR }, 0 },
3887
    { "%XEvadds%XS",  { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
3888
    { "%XEvaddpX",  { XM, Vex, EXx, EXxEVexR }, 0 },
3889
    { "%XEvadds%XD",  { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3890
  },
3891
3892
  /* PREFIX_VEX_0F59 */
3893
  {
3894
    { "%XEvmulpX",  { XM, Vex, EXx, EXxEVexR }, 0 },
3895
    { "%XEvmuls%XS",  { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
3896
    { "%XEvmulpX",  { XM, Vex, EXx, EXxEVexR }, 0 },
3897
    { "%XEvmuls%XD",  { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3898
  },
3899
3900
  /* PREFIX_VEX_0F5A */
3901
  {
3902
    { "%XEvcvtp%XS2pd", { XM, EXEvexHalfBcstXmmq, EXxEVexS }, 0 },
3903
    { "%XEvcvts%XS2sd", { XMScalar, VexScalar, EXd, EXxEVexS }, 0 },
3904
    { "%XEvcvtp%XD2ps%XY", { XMxmmq, EXx, EXxEVexR }, 0 },
3905
    { "%XEvcvts%XD2ss", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3906
  },
3907
3908
  /* PREFIX_VEX_0F5B */
3909
  {
3910
    { "vcvtdq2ps",  { XM, EXx }, 0 },
3911
    { "vcvttps2dq", { XM, EXx }, 0 },
3912
    { "vcvtps2dq",  { XM, EXx }, 0 },
3913
  },
3914
3915
  /* PREFIX_VEX_0F5C */
3916
  {
3917
    { "%XEvsubpX",  { XM, Vex, EXx, EXxEVexR }, 0 },
3918
    { "%XEvsubs%XS",  { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
3919
    { "%XEvsubpX",  { XM, Vex, EXx, EXxEVexR }, 0 },
3920
    { "%XEvsubs%XD",  { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3921
  },
3922
3923
  /* PREFIX_VEX_0F5D */
3924
  {
3925
    { "%XEvminpX",  { XM, Vex, EXx, EXxEVexS }, 0 },
3926
    { "%XEvmins%XS",  { XMScalar, VexScalar, EXd, EXxEVexS }, 0 },
3927
    { "%XEvminpX",  { XM, Vex, EXx, EXxEVexS }, 0 },
3928
    { "%XEvmins%XD",  { XMScalar, VexScalar, EXq, EXxEVexS }, 0 },
3929
  },
3930
3931
  /* PREFIX_VEX_0F5E */
3932
  {
3933
    { "%XEvdivpX",  { XM, Vex, EXx, EXxEVexR }, 0 },
3934
    { "%XEvdivs%XS",  { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
3935
    { "%XEvdivpX",  { XM, Vex, EXx, EXxEVexR }, 0 },
3936
    { "%XEvdivs%XD",  { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3937
  },
3938
3939
  /* PREFIX_VEX_0F5F */
3940
  {
3941
    { "%XEvmaxpX",  { XM, Vex, EXx, EXxEVexS }, 0 },
3942
    { "%XEvmaxs%XS",  { XMScalar, VexScalar, EXd, EXxEVexS }, 0 },
3943
    { "%XEvmaxpX",  { XM, Vex, EXx, EXxEVexS }, 0 },
3944
    { "%XEvmaxs%XD",  { XMScalar, VexScalar, EXq, EXxEVexS }, 0 },
3945
  },
3946
3947
  /* PREFIX_VEX_0F6F */
3948
  {
3949
    { Bad_Opcode },
3950
    { "vmovdqu",  { XM, EXx }, 0 },
3951
    { "vmovdqa",  { XM, EXx }, 0 },
3952
  },
3953
3954
  /* PREFIX_VEX_0F70 */
3955
  {
3956
    { Bad_Opcode },
3957
    { "vpshufhw", { XM, EXx, Ib }, 0 },
3958
    { "vpshufd",  { XM, EXx, Ib }, 0 },
3959
    { "vpshuflw", { XM, EXx, Ib }, 0 },
3960
  },
3961
3962
  /* PREFIX_VEX_0F7C */
3963
  {
3964
    { Bad_Opcode },
3965
    { Bad_Opcode },
3966
    { "vhaddpd",  { XM, Vex, EXx }, 0 },
3967
    { "vhaddps",  { XM, Vex, EXx }, 0 },
3968
  },
3969
3970
  /* PREFIX_VEX_0F7D */
3971
  {
3972
    { Bad_Opcode },
3973
    { Bad_Opcode },
3974
    { "vhsubpd",  { XM, Vex, EXx }, 0 },
3975
    { "vhsubps",  { XM, Vex, EXx }, 0 },
3976
  },
3977
3978
  /* PREFIX_VEX_0F7E */
3979
  {
3980
    { Bad_Opcode },
3981
    { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1) },
3982
    { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2) },
3983
  },
3984
3985
  /* PREFIX_VEX_0F7F */
3986
  {
3987
    { Bad_Opcode },
3988
    { "vmovdqu",  { EXxS, XM }, 0 },
3989
    { "vmovdqa",  { EXxS, XM }, 0 },
3990
  },
3991
3992
  /* PREFIX_VEX_0F90_L_0_W_0 */
3993
  {
3994
    { "kmovw",    { MaskG, MaskE }, 0 },
3995
    { Bad_Opcode },
3996
    { "kmovb",    { MaskG, MaskBDE }, 0 },
3997
  },
3998
3999
  /* PREFIX_VEX_0F90_L_0_W_1 */
4000
  {
4001
    { "kmovq",    { MaskG, MaskE }, 0 },
4002
    { Bad_Opcode },
4003
    { "kmovd",    { MaskG, MaskBDE }, 0 },
4004
  },
4005
4006
  /* PREFIX_VEX_0F91_L_0_M_0_W_0 */
4007
  {
4008
    { "kmovw",    { Ew, MaskG }, 0 },
4009
    { Bad_Opcode },
4010
    { "kmovb",    { Eb, MaskG }, 0 },
4011
  },
4012
4013
  /* PREFIX_VEX_0F91_L_0_M_0_W_1 */
4014
  {
4015
    { "kmovq",    { Eq, MaskG }, 0 },
4016
    { Bad_Opcode },
4017
    { "kmovd",    { Ed, MaskG }, 0 },
4018
  },
4019
4020
  /* PREFIX_VEX_0F92_L_0_M_1_W_0 */
4021
  {
4022
    { "kmovw",    { MaskG, Edq }, 0 },
4023
    { Bad_Opcode },
4024
    { "kmovb",    { MaskG, Edq }, 0 },
4025
    { "kmovd",    { MaskG, Edq }, 0 },
4026
  },
4027
4028
  /* PREFIX_VEX_0F92_L_0_M_1_W_1 */
4029
  {
4030
    { Bad_Opcode },
4031
    { Bad_Opcode },
4032
    { Bad_Opcode },
4033
    { "kmovK",    { MaskG, Edq }, 0 },
4034
  },
4035
4036
  /* PREFIX_VEX_0F93_L_0_M_1_W_0 */
4037
  {
4038
    { "kmovw",    { Gdq, MaskE }, 0 },
4039
    { Bad_Opcode },
4040
    { "kmovb",    { Gdq, MaskE }, 0 },
4041
    { "kmovd",    { Gdq, MaskE }, 0 },
4042
  },
4043
4044
  /* PREFIX_VEX_0F93_L_0_M_1_W_1 */
4045
  {
4046
    { Bad_Opcode },
4047
    { Bad_Opcode },
4048
    { Bad_Opcode },
4049
    { "kmovK",    { Gdq, MaskE }, 0 },
4050
  },
4051
4052
  /* PREFIX_VEX_0F98_L_0_M_1_W_0 */
4053
  {
4054
    { "kortestw", { MaskG, MaskE }, 0 },
4055
    { Bad_Opcode },
4056
    { "kortestb", { MaskG, MaskE }, 0 },
4057
  },
4058
4059
  /* PREFIX_VEX_0F98_L_0_M_1_W_1 */
4060
  {
4061
    { "kortestq", { MaskG, MaskE }, 0 },
4062
    { Bad_Opcode },
4063
    { "kortestd", { MaskG, MaskE }, 0 },
4064
  },
4065
4066
  /* PREFIX_VEX_0F99_L_0_M_1_W_0 */
4067
  {
4068
    { "ktestw", { MaskG, MaskE }, 0 },
4069
    { Bad_Opcode },
4070
    { "ktestb", { MaskG, MaskE }, 0 },
4071
  },
4072
4073
  /* PREFIX_VEX_0F99_L_0_M_1_W_1 */
4074
  {
4075
    { "ktestq", { MaskG, MaskE }, 0 },
4076
    { Bad_Opcode },
4077
    { "ktestd", { MaskG, MaskE }, 0 },
4078
  },
4079
4080
  /* PREFIX_VEX_0FC2 */
4081
  {
4082
    { "vcmpps",   { XM, Vex, EXx, CMP }, 0 },
4083
    { "vcmpss",   { XMScalar, VexScalar, EXd, CMP }, 0 },
4084
    { "vcmppd",   { XM, Vex, EXx, CMP }, 0 },
4085
    { "vcmpsd",   { XMScalar, VexScalar, EXq, CMP }, 0 },
4086
  },
4087
4088
  /* PREFIX_VEX_0FD0 */
4089
  {
4090
    { Bad_Opcode },
4091
    { Bad_Opcode },
4092
    { "vaddsubpd",  { XM, Vex, EXx }, 0 },
4093
    { "vaddsubps",  { XM, Vex, EXx }, 0 },
4094
  },
4095
4096
  /* PREFIX_VEX_0FE6 */
4097
  {
4098
    { Bad_Opcode },
4099
    { "vcvtdq2pd",  { XM, EXxmmq }, 0 },
4100
    { "vcvttpd2dq%XY",  { XMM, EXx }, 0 },
4101
    { "vcvtpd2dq%XY", { XMM, EXx }, 0 },
4102
  },
4103
4104
  /* PREFIX_VEX_0FF0 */
4105
  {
4106
    { Bad_Opcode },
4107
    { Bad_Opcode },
4108
    { Bad_Opcode },
4109
    { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3) },
4110
  },
4111
4112
  /* PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_0 */
4113
  {
4114
    { "ldtilecfg", { M }, 0 },
4115
    { Bad_Opcode },
4116
    { "sttilecfg", { M }, 0 },
4117
  },
4118
4119
  /* PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_1 */
4120
  {
4121
    { REG_TABLE (REG_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0) },
4122
    { Bad_Opcode },
4123
    { Bad_Opcode },
4124
    { RM_TABLE (RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_3) },
4125
  },
4126
4127
  /* PREFIX_VEX_0F384B_X86_64_L_0_W_0_M_0 */
4128
  {
4129
    { Bad_Opcode },
4130
    { "tilestored", { MVexSIBMEM, TMM }, 0 },
4131
    { "tileloaddt1",  { TMM, MVexSIBMEM }, 0 },
4132
    { "tileloadd",  { TMM, MVexSIBMEM }, 0 },
4133
  },
4134
4135
  /* PREFIX_VEX_0F3850_W_0 */
4136
  {
4137
    { "vpdpbuud", { XM, Vex, EXx }, 0 },
4138
    { "vpdpbsud", { XM, Vex, EXx }, 0 },
4139
    { "%XVvpdpbusd",  { XM, Vex, EXx }, 0 },
4140
    { "vpdpbssd", { XM, Vex, EXx }, 0 },
4141
  },
4142
4143
  /* PREFIX_VEX_0F3851_W_0 */
4144
  {
4145
    { "vpdpbuuds",  { XM, Vex, EXx }, 0 },
4146
    { "vpdpbsuds",  { XM, Vex, EXx }, 0 },
4147
    { "%XVvpdpbusds", { XM, Vex, EXx }, 0 },
4148
    { "vpdpbssds",  { XM, Vex, EXx }, 0 },
4149
  },
4150
  /* PREFIX_VEX_0F385C_X86_64_M_1_L_0_W_0 */
4151
  {
4152
    { Bad_Opcode },
4153
    { "tdpbf16ps", { TMM, EXtmm, VexTmm }, 0 },
4154
    { Bad_Opcode },
4155
    { "tdpfp16ps", { TMM, EXtmm, VexTmm }, 0 },
4156
  },
4157
4158
  /* PREFIX_VEX_0F385E_X86_64_M_1_L_0_W_0 */
4159
  {
4160
    { "tdpbuud", {TMM, EXtmm, VexTmm }, 0 },
4161
    { "tdpbsud", {TMM, EXtmm, VexTmm }, 0 },
4162
    { "tdpbusd", {TMM, EXtmm, VexTmm }, 0 },
4163
    { "tdpbssd", {TMM, EXtmm, VexTmm }, 0 },
4164
  },
4165
4166
  /* PREFIX_VEX_0F386C_X86_64_M_1_L_0_W_0 */
4167
  {
4168
    { "tcmmrlfp16ps", { TMM, EXtmm, VexTmm }, 0 },
4169
    { Bad_Opcode },
4170
    { "tcmmimfp16ps", { TMM, EXtmm, VexTmm }, 0 },
4171
  },
4172
4173
  /* PREFIX_VEX_0F3872 */
4174
  {
4175
    { Bad_Opcode },
4176
    { VEX_W_TABLE (VEX_W_0F3872_P_1) },
4177
  },
4178
4179
  /* PREFIX_VEX_0F38B0_W_0 */
4180
  {
4181
    { "vcvtneoph2ps", { XM, Mx }, 0 },
4182
    { "vcvtneebf162ps", { XM, Mx }, 0 },
4183
    { "vcvtneeph2ps", { XM, Mx }, 0 },
4184
    { "vcvtneobf162ps", { XM, Mx }, 0 },
4185
  },
4186
4187
  /* PREFIX_VEX_0F38B1_W_0 */
4188
  {
4189
    { Bad_Opcode },
4190
    { "vbcstnebf162ps", { XM, Mw }, 0 },
4191
    { "vbcstnesh2ps", { XM, Mw }, 0 },
4192
  },
4193
 
4194
  /* PREFIX_VEX_0F38F5_L_0 */
4195
  {
4196
    { "bzhiS",    { Gdq, Edq, VexGdq }, 0 },
4197
    { "pextS",    { Gdq, VexGdq, Edq }, 0 },
4198
    { Bad_Opcode },
4199
    { "pdepS",    { Gdq, VexGdq, Edq }, 0 },
4200
  },
4201
4202
  /* PREFIX_VEX_0F38F6_L_0 */
4203
  {
4204
    { Bad_Opcode },
4205
    { Bad_Opcode },
4206
    { Bad_Opcode },
4207
    { "mulxS",    { Gdq, VexGdq, Edq }, 0 },
4208
  },
4209
4210
  /* PREFIX_VEX_0F38F7_L_0 */
4211
  {
4212
    { "bextrS",   { Gdq, Edq, VexGdq }, 0 },
4213
    { "sarxS",    { Gdq, Edq, VexGdq }, 0 },
4214
    { "shlxS",    { Gdq, Edq, VexGdq }, 0 },
4215
    { "shrxS",    { Gdq, Edq, VexGdq }, 0 },
4216
  },
4217
4218
  /* PREFIX_VEX_0F3AF0_L_0 */
4219
  {
4220
    { Bad_Opcode },
4221
    { Bad_Opcode },
4222
    { Bad_Opcode },
4223
    { "rorxS",    { Gdq, Edq, Ib }, 0 },
4224
  },
4225
4226
#include "i386-dis-evex-prefix.h"
4227
};
4228
4229
static const struct dis386 x86_64_table[][2] = {
4230
  /* X86_64_06 */
4231
  {
4232
    { "pushP", { es }, 0 },
4233
  },
4234
4235
  /* X86_64_07 */
4236
  {
4237
    { "popP", { es }, 0 },
4238
  },
4239
4240
  /* X86_64_0E */
4241
  {
4242
    { "pushP", { cs }, 0 },
4243
  },
4244
4245
  /* X86_64_16 */
4246
  {
4247
    { "pushP", { ss }, 0 },
4248
  },
4249
4250
  /* X86_64_17 */
4251
  {
4252
    { "popP", { ss }, 0 },
4253
  },
4254
4255
  /* X86_64_1E */
4256
  {
4257
    { "pushP", { ds }, 0 },
4258
  },
4259
4260
  /* X86_64_1F */
4261
  {
4262
    { "popP", { ds }, 0 },
4263
  },
4264
4265
  /* X86_64_27 */
4266
  {
4267
    { "daa", { XX }, 0 },
4268
  },
4269
4270
  /* X86_64_2F */
4271
  {
4272
    { "das", { XX }, 0 },
4273
  },
4274
4275
  /* X86_64_37 */
4276
  {
4277
    { "aaa", { XX }, 0 },
4278
  },
4279
4280
  /* X86_64_3F */
4281
  {
4282
    { "aas", { XX }, 0 },
4283
  },
4284
4285
  /* X86_64_60 */
4286
  {
4287
    { "pushaP", { XX }, 0 },
4288
  },
4289
4290
  /* X86_64_61 */
4291
  {
4292
    { "popaP", { XX }, 0 },
4293
  },
4294
4295
  /* X86_64_62 */
4296
  {
4297
    { MOD_TABLE (MOD_62_32BIT) },
4298
    { EVEX_TABLE (EVEX_0F) },
4299
  },
4300
4301
  /* X86_64_63 */
4302
  {
4303
    { "arpl", { Ew, Gw }, 0 },
4304
    { "movs", { Gv, { MOVSXD_Fixup, movsxd_mode } }, 0 },
4305
  },
4306
4307
  /* X86_64_6D */
4308
  {
4309
    { "ins{R|}", { Yzr, indirDX }, 0 },
4310
    { "ins{G|}", { Yzr, indirDX }, 0 },
4311
  },
4312
4313
  /* X86_64_6F */
4314
  {
4315
    { "outs{R|}", { indirDXr, Xz }, 0 },
4316
    { "outs{G|}", { indirDXr, Xz }, 0 },
4317
  },
4318
4319
  /* X86_64_82 */
4320
  {
4321
    /* Opcode 0x82 is an alias of opcode 0x80 in 32-bit mode.  */
4322
    { REG_TABLE (REG_80) },
4323
  },
4324
4325
  /* X86_64_9A */
4326
  {
4327
    { "{l|}call{P|}", { Ap }, 0 },
4328
  },
4329
4330
  /* X86_64_C2 */
4331
  {
4332
    { "retP",   { Iw, BND }, 0 },
4333
    { "ret@",   { Iw, BND }, 0 },
4334
  },
4335
4336
  /* X86_64_C3 */
4337
  {
4338
    { "retP",   { BND }, 0 },
4339
    { "ret@",   { BND }, 0 },
4340
  },
4341
4342
  /* X86_64_C4 */
4343
  {
4344
    { MOD_TABLE (MOD_C4_32BIT) },
4345
    { VEX_C4_TABLE (VEX_0F) },
4346
  },
4347
4348
  /* X86_64_C5 */
4349
  {
4350
    { MOD_TABLE (MOD_C5_32BIT) },
4351
    { VEX_C5_TABLE (VEX_0F) },
4352
  },
4353
4354
  /* X86_64_CE */
4355
  {
4356
    { "into", { XX }, 0 },
4357
  },
4358
4359
  /* X86_64_D4 */
4360
  {
4361
    { "aam", { Ib }, 0 },
4362
  },
4363
4364
  /* X86_64_D5 */
4365
  {
4366
    { "aad", { Ib }, 0 },
4367
  },
4368
4369
  /* X86_64_E8 */
4370
  {
4371
    { "callP",    { Jv, BND }, 0 },
4372
    { "call@",    { Jv, BND }, 0 }
4373
  },
4374
4375
  /* X86_64_E9 */
4376
  {
4377
    { "jmpP",   { Jv, BND }, 0 },
4378
    { "jmp@",   { Jv, BND }, 0 }
4379
  },
4380
4381
  /* X86_64_EA */
4382
  {
4383
    { "{l|}jmp{P|}", { Ap }, 0 },
4384
  },
4385
4386
  /* X86_64_0F00_REG_6 */
4387
  {
4388
    { Bad_Opcode },
4389
    { PREFIX_TABLE (PREFIX_0F00_REG_6_X86_64) },
4390
  },
4391
4392
  /* X86_64_0F01_REG_0 */
4393
  {
4394
    { "sgdt{Q|Q}", { M }, 0 },
4395
    { "sgdt", { M }, 0 },
4396
  },
4397
4398
  /* X86_64_0F01_REG_0_MOD_3_RM_6_P_1 */
4399
  {
4400
    { Bad_Opcode },
4401
    { "wrmsrlist",  { Skip_MODRM }, 0 },
4402
  },
4403
4404
  /* X86_64_0F01_REG_0_MOD_3_RM_6_P_3 */
4405
  {
4406
    { Bad_Opcode },
4407
    { "rdmsrlist",  { Skip_MODRM }, 0 },
4408
  },
4409
4410
  /* X86_64_0F01_REG_1 */
4411
  {
4412
    { "sidt{Q|Q}", { M }, 0 },
4413
    { "sidt", { M }, 0 },
4414
  },
4415
4416
  /* X86_64_0F01_REG_1_RM_2_PREFIX_1 */
4417
  {
4418
    { Bad_Opcode },
4419
    { "eretu",    { Skip_MODRM }, 0 },
4420
  },
4421
4422
  /* X86_64_0F01_REG_1_RM_2_PREFIX_3 */
4423
  {
4424
    { Bad_Opcode },
4425
    { "erets",    { Skip_MODRM }, 0 },
4426
  },
4427
4428
  /* X86_64_0F01_REG_1_RM_5_PREFIX_2 */
4429
  {
4430
    { Bad_Opcode },
4431
    { "seamret",  { Skip_MODRM }, 0 },
4432
  },
4433
4434
  /* X86_64_0F01_REG_1_RM_6_PREFIX_2 */
4435
  {
4436
    { Bad_Opcode },
4437
    { "seamops",  { Skip_MODRM }, 0 },
4438
  },
4439
4440
  /* X86_64_0F01_REG_1_RM_7_PREFIX_2 */
4441
  {
4442
    { Bad_Opcode },
4443
    { "seamcall", { Skip_MODRM }, 0 },
4444
  },
4445
4446
  /* X86_64_0F01_REG_2 */
4447
  {
4448
    { "lgdt{Q|Q}", { M }, 0 },
4449
    { "lgdt", { M }, 0 },
4450
  },
4451
4452
  /* X86_64_0F01_REG_3 */
4453
  {
4454
    { "lidt{Q|Q}", { M }, 0 },
4455
    { "lidt", { M }, 0 },
4456
  },
4457
4458
  /* X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1 */
4459
  {
4460
    { Bad_Opcode },
4461
    { "uiret",  { Skip_MODRM }, 0 },
4462
  },
4463
4464
  /* X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1 */
4465
  {
4466
    { Bad_Opcode },
4467
    { "testui", { Skip_MODRM }, 0 },
4468
  },
4469
4470
  /* X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1 */
4471
  {
4472
    { Bad_Opcode },
4473
    { "clui", { Skip_MODRM }, 0 },
4474
  },
4475
4476
  /* X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1 */
4477
  {
4478
    { Bad_Opcode },
4479
    { "stui", { Skip_MODRM }, 0 },
4480
  },
4481
4482
  /* X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_1 */
4483
  {
4484
    { Bad_Opcode },
4485
    { "rmpquery", { Skip_MODRM }, 0 },
4486
  },
4487
4488
  /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1 */
4489
  {
4490
    { Bad_Opcode },
4491
    { "rmpadjust",  { Skip_MODRM }, 0 },
4492
  },
4493
4494
  /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3 */
4495
  {
4496
    { Bad_Opcode },
4497
    { "rmpupdate",  { Skip_MODRM }, 0 },
4498
  },
4499
4500
  /* X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1 */
4501
  {
4502
    { Bad_Opcode },
4503
    { "psmash", { Skip_MODRM }, 0 },
4504
  },
4505
4506
  /* X86_64_0F18_REG_6_MOD_0 */
4507
  {
4508
    { "nopQ",   { Ev }, 0 },
4509
    { PREFIX_TABLE (PREFIX_0F18_REG_6_MOD_0_X86_64) },
4510
  },
4511
4512
  /* X86_64_0F18_REG_7_MOD_0 */
4513
  {
4514
    { "nopQ",   { Ev }, 0 },
4515
    { PREFIX_TABLE (PREFIX_0F18_REG_7_MOD_0_X86_64) },
4516
  },
4517
4518
  {
4519
    /* X86_64_0F24 */
4520
    { "movZ",   { Em, Td }, 0 },
4521
  },
4522
4523
  {
4524
    /* X86_64_0F26 */
4525
    { "movZ",   { Td, Em }, 0 },
4526
  },
4527
4528
  /* X86_64_0FC7_REG_6_MOD_3_PREFIX_1 */
4529
  {
4530
    { Bad_Opcode },
4531
    { "senduipi", { Eq }, 0 },
4532
  },
4533
4534
  /* X86_64_VEX_0F3849 */
4535
  {
4536
    { Bad_Opcode },
4537
    { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64) },
4538
  },
4539
4540
  /* X86_64_VEX_0F384B */
4541
  {
4542
    { Bad_Opcode },
4543
    { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64) },
4544
  },
4545
4546
  /* X86_64_VEX_0F385C */
4547
  {
4548
    { Bad_Opcode },
4549
    { MOD_TABLE (MOD_VEX_0F385C_X86_64) },
4550
  },
4551
4552
  /* X86_64_VEX_0F385E */
4553
  {
4554
    { Bad_Opcode },
4555
    { MOD_TABLE (MOD_VEX_0F385E_X86_64) },
4556
  },
4557
4558
  /* X86_64_VEX_0F386C */
4559
  {
4560
    { Bad_Opcode },
4561
    { MOD_TABLE (MOD_VEX_0F386C_X86_64) },
4562
  },
4563
4564
  /* X86_64_VEX_0F38E0 */
4565
  {
4566
    { Bad_Opcode },
4567
    { "cmpoxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4568
  },
4569
4570
  /* X86_64_VEX_0F38E1 */
4571
  {
4572
    { Bad_Opcode },
4573
    { "cmpnoxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4574
  },
4575
4576
  /* X86_64_VEX_0F38E2 */
4577
  {
4578
    { Bad_Opcode },
4579
    { "cmpbxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4580
  },
4581
4582
  /* X86_64_VEX_0F38E3 */
4583
  {
4584
    { Bad_Opcode },
4585
    { "cmpnbxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4586
  },
4587
4588
  /* X86_64_VEX_0F38E4 */
4589
  {
4590
    { Bad_Opcode },
4591
    { "cmpzxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4592
  },
4593
4594
  /* X86_64_VEX_0F38E5 */
4595
  {
4596
    { Bad_Opcode },
4597
    { "cmpnzxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4598
  },
4599
4600
  /* X86_64_VEX_0F38E6 */
4601
  {
4602
    { Bad_Opcode },
4603
    { "cmpbexadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4604
  },
4605
4606
  /* X86_64_VEX_0F38E7 */
4607
  {
4608
    { Bad_Opcode },
4609
    { "cmpnbexadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4610
  },
4611
4612
  /* X86_64_VEX_0F38E8 */
4613
  {
4614
    { Bad_Opcode },
4615
    { "cmpsxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4616
  },
4617
4618
  /* X86_64_VEX_0F38E9 */
4619
  {
4620
    { Bad_Opcode },
4621
    { "cmpnsxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4622
  },
4623
4624
  /* X86_64_VEX_0F38EA */
4625
  {
4626
    { Bad_Opcode },
4627
    { "cmppxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4628
  },
4629
4630
  /* X86_64_VEX_0F38EB */
4631
  {
4632
    { Bad_Opcode },
4633
    { "cmpnpxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4634
  },
4635
4636
  /* X86_64_VEX_0F38EC */
4637
  {
4638
    { Bad_Opcode },
4639
    { "cmplxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4640
  },
4641
4642
  /* X86_64_VEX_0F38ED */
4643
  {
4644
    { Bad_Opcode },
4645
    { "cmpnlxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4646
  },
4647
4648
  /* X86_64_VEX_0F38EE */
4649
  {
4650
    { Bad_Opcode },
4651
    { "cmplexadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4652
  },
4653
4654
  /* X86_64_VEX_0F38EF */
4655
  {
4656
    { Bad_Opcode },
4657
    { "cmpnlexadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4658
  },
4659
};
4660
4661
static const struct dis386 three_byte_table[][256] = {
4662
4663
  /* THREE_BYTE_0F38 */
4664
  {
4665
    /* 00 */
4666
    { "pshufb",   { MX, EM }, PREFIX_OPCODE },
4667
    { "phaddw",   { MX, EM }, PREFIX_OPCODE },
4668
    { "phaddd",   { MX, EM }, PREFIX_OPCODE },
4669
    { "phaddsw",  { MX, EM }, PREFIX_OPCODE },
4670
    { "pmaddubsw",  { MX, EM }, PREFIX_OPCODE },
4671
    { "phsubw",   { MX, EM }, PREFIX_OPCODE },
4672
    { "phsubd",   { MX, EM }, PREFIX_OPCODE },
4673
    { "phsubsw",  { MX, EM }, PREFIX_OPCODE },
4674
    /* 08 */
4675
    { "psignb",   { MX, EM }, PREFIX_OPCODE },
4676
    { "psignw",   { MX, EM }, PREFIX_OPCODE },
4677
    { "psignd",   { MX, EM }, PREFIX_OPCODE },
4678
    { "pmulhrsw", { MX, EM }, PREFIX_OPCODE },
4679
    { Bad_Opcode },
4680
    { Bad_Opcode },
4681
    { Bad_Opcode },
4682
    { Bad_Opcode },
4683
    /* 10 */
4684
    { "pblendvb", { XM, EXx, XMM0 }, PREFIX_DATA },
4685
    { Bad_Opcode },
4686
    { Bad_Opcode },
4687
    { Bad_Opcode },
4688
    { "blendvps", { XM, EXx, XMM0 }, PREFIX_DATA },
4689
    { "blendvpd", { XM, EXx, XMM0 }, PREFIX_DATA },
4690
    { Bad_Opcode },
4691
    { "ptest",  { XM, EXx }, PREFIX_DATA },
4692
    /* 18 */
4693
    { Bad_Opcode },
4694
    { Bad_Opcode },
4695
    { Bad_Opcode },
4696
    { Bad_Opcode },
4697
    { "pabsb",    { MX, EM }, PREFIX_OPCODE },
4698
    { "pabsw",    { MX, EM }, PREFIX_OPCODE },
4699
    { "pabsd",    { MX, EM }, PREFIX_OPCODE },
4700
    { Bad_Opcode },
4701
    /* 20 */
4702
    { "pmovsxbw", { XM, EXq }, PREFIX_DATA },
4703
    { "pmovsxbd", { XM, EXd }, PREFIX_DATA },
4704
    { "pmovsxbq", { XM, EXw }, PREFIX_DATA },
4705
    { "pmovsxwd", { XM, EXq }, PREFIX_DATA },
4706
    { "pmovsxwq", { XM, EXd }, PREFIX_DATA },
4707
    { "pmovsxdq", { XM, EXq }, PREFIX_DATA },
4708
    { Bad_Opcode },
4709
    { Bad_Opcode },
4710
    /* 28 */
4711
    { "pmuldq", { XM, EXx }, PREFIX_DATA },
4712
    { "pcmpeqq", { XM, EXx }, PREFIX_DATA },
4713
    { MOD_TABLE (MOD_0F382A) },
4714
    { "packusdw", { XM, EXx }, PREFIX_DATA },
4715
    { Bad_Opcode },
4716
    { Bad_Opcode },
4717
    { Bad_Opcode },
4718
    { Bad_Opcode },
4719
    /* 30 */
4720
    { "pmovzxbw", { XM, EXq }, PREFIX_DATA },
4721
    { "pmovzxbd", { XM, EXd }, PREFIX_DATA },
4722
    { "pmovzxbq", { XM, EXw }, PREFIX_DATA },
4723
    { "pmovzxwd", { XM, EXq }, PREFIX_DATA },
4724
    { "pmovzxwq", { XM, EXd }, PREFIX_DATA },
4725
    { "pmovzxdq", { XM, EXq }, PREFIX_DATA },
4726
    { Bad_Opcode },
4727
    { "pcmpgtq", { XM, EXx }, PREFIX_DATA },
4728
    /* 38 */
4729
    { "pminsb", { XM, EXx }, PREFIX_DATA },
4730
    { "pminsd", { XM, EXx }, PREFIX_DATA },
4731
    { "pminuw", { XM, EXx }, PREFIX_DATA },
4732
    { "pminud", { XM, EXx }, PREFIX_DATA },
4733
    { "pmaxsb", { XM, EXx }, PREFIX_DATA },
4734
    { "pmaxsd", { XM, EXx }, PREFIX_DATA },
4735
    { "pmaxuw", { XM, EXx }, PREFIX_DATA },
4736
    { "pmaxud", { XM, EXx }, PREFIX_DATA },
4737
    /* 40 */
4738
    { "pmulld", { XM, EXx }, PREFIX_DATA },
4739
    { "phminposuw", { XM, EXx }, PREFIX_DATA },
4740
    { Bad_Opcode },
4741
    { Bad_Opcode },
4742
    { Bad_Opcode },
4743
    { Bad_Opcode },
4744
    { Bad_Opcode },
4745
    { Bad_Opcode },
4746
    /* 48 */
4747
    { Bad_Opcode },
4748
    { Bad_Opcode },
4749
    { Bad_Opcode },
4750
    { Bad_Opcode },
4751
    { Bad_Opcode },
4752
    { Bad_Opcode },
4753
    { Bad_Opcode },
4754
    { Bad_Opcode },
4755
    /* 50 */
4756
    { Bad_Opcode },
4757
    { Bad_Opcode },
4758
    { Bad_Opcode },
4759
    { Bad_Opcode },
4760
    { Bad_Opcode },
4761
    { Bad_Opcode },
4762
    { Bad_Opcode },
4763
    { Bad_Opcode },
4764
    /* 58 */
4765
    { Bad_Opcode },
4766
    { Bad_Opcode },
4767
    { Bad_Opcode },
4768
    { Bad_Opcode },
4769
    { Bad_Opcode },
4770
    { Bad_Opcode },
4771
    { Bad_Opcode },
4772
    { Bad_Opcode },
4773
    /* 60 */
4774
    { Bad_Opcode },
4775
    { Bad_Opcode },
4776
    { Bad_Opcode },
4777
    { Bad_Opcode },
4778
    { Bad_Opcode },
4779
    { Bad_Opcode },
4780
    { Bad_Opcode },
4781
    { Bad_Opcode },
4782
    /* 68 */
4783
    { Bad_Opcode },
4784
    { Bad_Opcode },
4785
    { Bad_Opcode },
4786
    { Bad_Opcode },
4787
    { Bad_Opcode },
4788
    { Bad_Opcode },
4789
    { Bad_Opcode },
4790
    { Bad_Opcode },
4791
    /* 70 */
4792
    { Bad_Opcode },
4793
    { Bad_Opcode },
4794
    { Bad_Opcode },
4795
    { Bad_Opcode },
4796
    { Bad_Opcode },
4797
    { Bad_Opcode },
4798
    { Bad_Opcode },
4799
    { Bad_Opcode },
4800
    /* 78 */
4801
    { Bad_Opcode },
4802
    { Bad_Opcode },
4803
    { Bad_Opcode },
4804
    { Bad_Opcode },
4805
    { Bad_Opcode },
4806
    { Bad_Opcode },
4807
    { Bad_Opcode },
4808
    { Bad_Opcode },
4809
    /* 80 */
4810
    { "invept", { Gm, Mo }, PREFIX_DATA },
4811
    { "invvpid", { Gm, Mo }, PREFIX_DATA },
4812
    { "invpcid", { Gm, M }, PREFIX_DATA },
4813
    { Bad_Opcode },
4814
    { Bad_Opcode },
4815
    { Bad_Opcode },
4816
    { Bad_Opcode },
4817
    { Bad_Opcode },
4818
    /* 88 */
4819
    { Bad_Opcode },
4820
    { Bad_Opcode },
4821
    { Bad_Opcode },
4822
    { Bad_Opcode },
4823
    { Bad_Opcode },
4824
    { Bad_Opcode },
4825
    { Bad_Opcode },
4826
    { Bad_Opcode },
4827
    /* 90 */
4828
    { Bad_Opcode },
4829
    { Bad_Opcode },
4830
    { Bad_Opcode },
4831
    { Bad_Opcode },
4832
    { Bad_Opcode },
4833
    { Bad_Opcode },
4834
    { Bad_Opcode },
4835
    { Bad_Opcode },
4836
    /* 98 */
4837
    { Bad_Opcode },
4838
    { Bad_Opcode },
4839
    { Bad_Opcode },
4840
    { Bad_Opcode },
4841
    { Bad_Opcode },
4842
    { Bad_Opcode },
4843
    { Bad_Opcode },
4844
    { Bad_Opcode },
4845
    /* a0 */
4846
    { Bad_Opcode },
4847
    { Bad_Opcode },
4848
    { Bad_Opcode },
4849
    { Bad_Opcode },
4850
    { Bad_Opcode },
4851
    { Bad_Opcode },
4852
    { Bad_Opcode },
4853
    { Bad_Opcode },
4854
    /* a8 */
4855
    { Bad_Opcode },
4856
    { Bad_Opcode },
4857
    { Bad_Opcode },
4858
    { Bad_Opcode },
4859
    { Bad_Opcode },
4860
    { Bad_Opcode },
4861
    { Bad_Opcode },
4862
    { Bad_Opcode },
4863
    /* b0 */
4864
    { Bad_Opcode },
4865
    { Bad_Opcode },
4866
    { Bad_Opcode },
4867
    { Bad_Opcode },
4868
    { Bad_Opcode },
4869
    { Bad_Opcode },
4870
    { Bad_Opcode },
4871
    { Bad_Opcode },
4872
    /* b8 */
4873
    { Bad_Opcode },
4874
    { Bad_Opcode },
4875
    { Bad_Opcode },
4876
    { Bad_Opcode },
4877
    { Bad_Opcode },
4878
    { Bad_Opcode },
4879
    { Bad_Opcode },
4880
    { Bad_Opcode },
4881
    /* c0 */
4882
    { Bad_Opcode },
4883
    { Bad_Opcode },
4884
    { Bad_Opcode },
4885
    { Bad_Opcode },
4886
    { Bad_Opcode },
4887
    { Bad_Opcode },
4888
    { Bad_Opcode },
4889
    { Bad_Opcode },
4890
    /* c8 */
4891
    { "sha1nexte", { XM, EXxmm }, PREFIX_OPCODE },
4892
    { "sha1msg1", { XM, EXxmm }, PREFIX_OPCODE },
4893
    { "sha1msg2", { XM, EXxmm }, PREFIX_OPCODE },
4894
    { "sha256rnds2", { XM, EXxmm, XMM0 }, PREFIX_OPCODE },
4895
    { "sha256msg1", { XM, EXxmm }, PREFIX_OPCODE },
4896
    { "sha256msg2", { XM, EXxmm }, PREFIX_OPCODE },
4897
    { Bad_Opcode },
4898
    { "gf2p8mulb", { XM, EXxmm }, PREFIX_DATA },
4899
    /* d0 */
4900
    { Bad_Opcode },
4901
    { Bad_Opcode },
4902
    { Bad_Opcode },
4903
    { Bad_Opcode },
4904
    { Bad_Opcode },
4905
    { Bad_Opcode },
4906
    { Bad_Opcode },
4907
    { Bad_Opcode },
4908
    /* d8 */
4909
    { PREFIX_TABLE (PREFIX_0F38D8) },
4910
    { Bad_Opcode },
4911
    { Bad_Opcode },
4912
    { "aesimc", { XM, EXx }, PREFIX_DATA },
4913
    { PREFIX_TABLE (PREFIX_0F38DC) },
4914
    { PREFIX_TABLE (PREFIX_0F38DD) },
4915
    { PREFIX_TABLE (PREFIX_0F38DE) },
4916
    { PREFIX_TABLE (PREFIX_0F38DF) },
4917
    /* e0 */
4918
    { Bad_Opcode },
4919
    { Bad_Opcode },
4920
    { Bad_Opcode },
4921
    { Bad_Opcode },
4922
    { Bad_Opcode },
4923
    { Bad_Opcode },
4924
    { Bad_Opcode },
4925
    { Bad_Opcode },
4926
    /* e8 */
4927
    { Bad_Opcode },
4928
    { Bad_Opcode },
4929
    { Bad_Opcode },
4930
    { Bad_Opcode },
4931
    { Bad_Opcode },
4932
    { Bad_Opcode },
4933
    { Bad_Opcode },
4934
    { Bad_Opcode },
4935
    /* f0 */
4936
    { PREFIX_TABLE (PREFIX_0F38F0) },
4937
    { PREFIX_TABLE (PREFIX_0F38F1) },
4938
    { Bad_Opcode },
4939
    { Bad_Opcode },
4940
    { Bad_Opcode },
4941
    { MOD_TABLE (MOD_0F38F5) },
4942
    { PREFIX_TABLE (PREFIX_0F38F6) },
4943
    { Bad_Opcode },
4944
    /* f8 */
4945
    { PREFIX_TABLE (PREFIX_0F38F8) },
4946
    { MOD_TABLE (MOD_0F38F9) },
4947
    { PREFIX_TABLE (PREFIX_0F38FA) },
4948
    { PREFIX_TABLE (PREFIX_0F38FB) },
4949
    { PREFIX_TABLE (PREFIX_0F38FC) },
4950
    { Bad_Opcode },
4951
    { Bad_Opcode },
4952
    { Bad_Opcode },
4953
  },
4954
  /* THREE_BYTE_0F3A */
4955
  {
4956
    /* 00 */
4957
    { Bad_Opcode },
4958
    { Bad_Opcode },
4959
    { Bad_Opcode },
4960
    { Bad_Opcode },
4961
    { Bad_Opcode },
4962
    { Bad_Opcode },
4963
    { Bad_Opcode },
4964
    { Bad_Opcode },
4965
    /* 08 */
4966
    { "roundps", { XM, EXx, Ib }, PREFIX_DATA },
4967
    { "roundpd", { XM, EXx, Ib }, PREFIX_DATA },
4968
    { "roundss", { XM, EXd, Ib }, PREFIX_DATA },
4969
    { "roundsd", { XM, EXq, Ib }, PREFIX_DATA },
4970
    { "blendps", { XM, EXx, Ib }, PREFIX_DATA },
4971
    { "blendpd", { XM, EXx, Ib }, PREFIX_DATA },
4972
    { "pblendw", { XM, EXx, Ib }, PREFIX_DATA },
4973
    { "palignr",  { MX, EM, Ib }, PREFIX_OPCODE },
4974
    /* 10 */
4975
    { Bad_Opcode },
4976
    { Bad_Opcode },
4977
    { Bad_Opcode },
4978
    { Bad_Opcode },
4979
    { "pextrb", { Edb, XM, Ib }, PREFIX_DATA },
4980
    { "pextrw", { Edw, XM, Ib }, PREFIX_DATA },
4981
    { "pextrK", { Edq, XM, Ib }, PREFIX_DATA },
4982
    { "extractps", { Ed, XM, Ib }, PREFIX_DATA },
4983
    /* 18 */
4984
    { Bad_Opcode },
4985
    { Bad_Opcode },
4986
    { Bad_Opcode },
4987
    { Bad_Opcode },
4988
    { Bad_Opcode },
4989
    { Bad_Opcode },
4990
    { Bad_Opcode },
4991
    { Bad_Opcode },
4992
    /* 20 */
4993
    { "pinsrb", { XM, Edb, Ib }, PREFIX_DATA },
4994
    { "insertps", { XM, EXd, Ib }, PREFIX_DATA },
4995
    { "pinsrK", { XM, Edq, Ib }, PREFIX_DATA },
4996
    { Bad_Opcode },
4997
    { Bad_Opcode },
4998
    { Bad_Opcode },
4999
    { Bad_Opcode },
5000
    { Bad_Opcode },
5001
    /* 28 */
5002
    { Bad_Opcode },
5003
    { Bad_Opcode },
5004
    { Bad_Opcode },
5005
    { Bad_Opcode },
5006
    { Bad_Opcode },
5007
    { Bad_Opcode },
5008
    { Bad_Opcode },
5009
    { Bad_Opcode },
5010
    /* 30 */
5011
    { Bad_Opcode },
5012
    { Bad_Opcode },
5013
    { Bad_Opcode },
5014
    { Bad_Opcode },
5015
    { Bad_Opcode },
5016
    { Bad_Opcode },
5017
    { Bad_Opcode },
5018
    { Bad_Opcode },
5019
    /* 38 */
5020
    { Bad_Opcode },
5021
    { Bad_Opcode },
5022
    { Bad_Opcode },
5023
    { Bad_Opcode },
5024
    { Bad_Opcode },
5025
    { Bad_Opcode },
5026
    { Bad_Opcode },
5027
    { Bad_Opcode },
5028
    /* 40 */
5029
    { "dpps", { XM, EXx, Ib }, PREFIX_DATA },
5030
    { "dppd", { XM, EXx, Ib }, PREFIX_DATA },
5031
    { "mpsadbw", { XM, EXx, Ib }, PREFIX_DATA },
5032
    { Bad_Opcode },
5033
    { "pclmulqdq", { XM, EXx, PCLMUL }, PREFIX_DATA },
5034
    { Bad_Opcode },
5035
    { Bad_Opcode },
5036
    { Bad_Opcode },
5037
    /* 48 */
5038
    { Bad_Opcode },
5039
    { Bad_Opcode },
5040
    { Bad_Opcode },
5041
    { Bad_Opcode },
5042
    { Bad_Opcode },
5043
    { Bad_Opcode },
5044
    { Bad_Opcode },
5045
    { Bad_Opcode },
5046
    /* 50 */
5047
    { Bad_Opcode },
5048
    { Bad_Opcode },
5049
    { Bad_Opcode },
5050
    { Bad_Opcode },
5051
    { Bad_Opcode },
5052
    { Bad_Opcode },
5053
    { Bad_Opcode },
5054
    { Bad_Opcode },
5055
    /* 58 */
5056
    { Bad_Opcode },
5057
    { Bad_Opcode },
5058
    { Bad_Opcode },
5059
    { Bad_Opcode },
5060
    { Bad_Opcode },
5061
    { Bad_Opcode },
5062
    { Bad_Opcode },
5063
    { Bad_Opcode },
5064
    /* 60 */
5065
    { "pcmpestrm!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
5066
    { "pcmpestri!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
5067
    { "pcmpistrm", { XM, EXx, Ib }, PREFIX_DATA },
5068
    { "pcmpistri", { XM, EXx, Ib }, PREFIX_DATA },
5069
    { Bad_Opcode },
5070
    { Bad_Opcode },
5071
    { Bad_Opcode },
5072
    { Bad_Opcode },
5073
    /* 68 */
5074
    { Bad_Opcode },
5075
    { Bad_Opcode },
5076
    { Bad_Opcode },
5077
    { Bad_Opcode },
5078
    { Bad_Opcode },
5079
    { Bad_Opcode },
5080
    { Bad_Opcode },
5081
    { Bad_Opcode },
5082
    /* 70 */
5083
    { Bad_Opcode },
5084
    { Bad_Opcode },
5085
    { Bad_Opcode },
5086
    { Bad_Opcode },
5087
    { Bad_Opcode },
5088
    { Bad_Opcode },
5089
    { Bad_Opcode },
5090
    { Bad_Opcode },
5091
    /* 78 */
5092
    { Bad_Opcode },
5093
    { Bad_Opcode },
5094
    { Bad_Opcode },
5095
    { Bad_Opcode },
5096
    { Bad_Opcode },
5097
    { Bad_Opcode },
5098
    { Bad_Opcode },
5099
    { Bad_Opcode },
5100
    /* 80 */
5101
    { Bad_Opcode },
5102
    { Bad_Opcode },
5103
    { Bad_Opcode },
5104
    { Bad_Opcode },
5105
    { Bad_Opcode },
5106
    { Bad_Opcode },
5107
    { Bad_Opcode },
5108
    { Bad_Opcode },
5109
    /* 88 */
5110
    { Bad_Opcode },
5111
    { Bad_Opcode },
5112
    { Bad_Opcode },
5113
    { Bad_Opcode },
5114
    { Bad_Opcode },
5115
    { Bad_Opcode },
5116
    { Bad_Opcode },
5117
    { Bad_Opcode },
5118
    /* 90 */
5119
    { Bad_Opcode },
5120
    { Bad_Opcode },
5121
    { Bad_Opcode },
5122
    { Bad_Opcode },
5123
    { Bad_Opcode },
5124
    { Bad_Opcode },
5125
    { Bad_Opcode },
5126
    { Bad_Opcode },
5127
    /* 98 */
5128
    { Bad_Opcode },
5129
    { Bad_Opcode },
5130
    { Bad_Opcode },
5131
    { Bad_Opcode },
5132
    { Bad_Opcode },
5133
    { Bad_Opcode },
5134
    { Bad_Opcode },
5135
    { Bad_Opcode },
5136
    /* a0 */
5137
    { Bad_Opcode },
5138
    { Bad_Opcode },
5139
    { Bad_Opcode },
5140
    { Bad_Opcode },
5141
    { Bad_Opcode },
5142
    { Bad_Opcode },
5143
    { Bad_Opcode },
5144
    { Bad_Opcode },
5145
    /* a8 */
5146
    { Bad_Opcode },
5147
    { Bad_Opcode },
5148
    { Bad_Opcode },
5149
    { Bad_Opcode },
5150
    { Bad_Opcode },
5151
    { Bad_Opcode },
5152
    { Bad_Opcode },
5153
    { Bad_Opcode },
5154
    /* b0 */
5155
    { Bad_Opcode },
5156
    { Bad_Opcode },
5157
    { Bad_Opcode },
5158
    { Bad_Opcode },
5159
    { Bad_Opcode },
5160
    { Bad_Opcode },
5161
    { Bad_Opcode },
5162
    { Bad_Opcode },
5163
    /* b8 */
5164
    { Bad_Opcode },
5165
    { Bad_Opcode },
5166
    { Bad_Opcode },
5167
    { Bad_Opcode },
5168
    { Bad_Opcode },
5169
    { Bad_Opcode },
5170
    { Bad_Opcode },
5171
    { Bad_Opcode },
5172
    /* c0 */
5173
    { Bad_Opcode },
5174
    { Bad_Opcode },
5175
    { Bad_Opcode },
5176
    { Bad_Opcode },
5177
    { Bad_Opcode },
5178
    { Bad_Opcode },
5179
    { Bad_Opcode },
5180
    { Bad_Opcode },
5181
    /* c8 */
5182
    { Bad_Opcode },
5183
    { Bad_Opcode },
5184
    { Bad_Opcode },
5185
    { Bad_Opcode },
5186
    { "sha1rnds4", { XM, EXxmm, Ib }, PREFIX_OPCODE },
5187
    { Bad_Opcode },
5188
    { "gf2p8affineqb", { XM, EXxmm, Ib }, PREFIX_DATA },
5189
    { "gf2p8affineinvqb", { XM, EXxmm, Ib }, PREFIX_DATA },
5190
    /* d0 */
5191
    { Bad_Opcode },
5192
    { Bad_Opcode },
5193
    { Bad_Opcode },
5194
    { Bad_Opcode },
5195
    { Bad_Opcode },
5196
    { Bad_Opcode },
5197
    { Bad_Opcode },
5198
    { Bad_Opcode },
5199
    /* d8 */
5200
    { Bad_Opcode },
5201
    { Bad_Opcode },
5202
    { Bad_Opcode },
5203
    { Bad_Opcode },
5204
    { Bad_Opcode },
5205
    { Bad_Opcode },
5206
    { Bad_Opcode },
5207
    { "aeskeygenassist", { XM, EXx, Ib }, PREFIX_DATA },
5208
    /* e0 */
5209
    { Bad_Opcode },
5210
    { Bad_Opcode },
5211
    { Bad_Opcode },
5212
    { Bad_Opcode },
5213
    { Bad_Opcode },
5214
    { Bad_Opcode },
5215
    { Bad_Opcode },
5216
    { Bad_Opcode },
5217
    /* e8 */
5218
    { Bad_Opcode },
5219
    { Bad_Opcode },
5220
    { Bad_Opcode },
5221
    { Bad_Opcode },
5222
    { Bad_Opcode },
5223
    { Bad_Opcode },
5224
    { Bad_Opcode },
5225
    { Bad_Opcode },
5226
    /* f0 */
5227
    { PREFIX_TABLE (PREFIX_0F3A0F) },
5228
    { Bad_Opcode },
5229
    { Bad_Opcode },
5230
    { Bad_Opcode },
5231
    { Bad_Opcode },
5232
    { Bad_Opcode },
5233
    { Bad_Opcode },
5234
    { Bad_Opcode },
5235
    /* f8 */
5236
    { Bad_Opcode },
5237
    { Bad_Opcode },
5238
    { Bad_Opcode },
5239
    { Bad_Opcode },
5240
    { Bad_Opcode },
5241
    { Bad_Opcode },
5242
    { Bad_Opcode },
5243
    { Bad_Opcode },
5244
  },
5245
};
5246
5247
static const struct dis386 xop_table[][256] = {
5248
  /* XOP_08 */
5249
  {
5250
    /* 00 */
5251
    { Bad_Opcode },
5252
    { Bad_Opcode },
5253
    { Bad_Opcode },
5254
    { Bad_Opcode },
5255
    { Bad_Opcode },
5256
    { Bad_Opcode },
5257
    { Bad_Opcode },
5258
    { Bad_Opcode },
5259
    /* 08 */
5260
    { Bad_Opcode },
5261
    { Bad_Opcode },
5262
    { Bad_Opcode },
5263
    { Bad_Opcode },
5264
    { Bad_Opcode },
5265
    { Bad_Opcode },
5266
    { Bad_Opcode },
5267
    { Bad_Opcode },
5268
    /* 10 */
5269
    { Bad_Opcode },
5270
    { Bad_Opcode },
5271
    { Bad_Opcode },
5272
    { Bad_Opcode },
5273
    { Bad_Opcode },
5274
    { Bad_Opcode },
5275
    { Bad_Opcode },
5276
    { Bad_Opcode },
5277
    /* 18 */
5278
    { Bad_Opcode },
5279
    { Bad_Opcode },
5280
    { Bad_Opcode },
5281
    { Bad_Opcode },
5282
    { Bad_Opcode },
5283
    { Bad_Opcode },
5284
    { Bad_Opcode },
5285
    { Bad_Opcode },
5286
    /* 20 */
5287
    { Bad_Opcode },
5288
    { Bad_Opcode },
5289
    { Bad_Opcode },
5290
    { Bad_Opcode },
5291
    { Bad_Opcode },
5292
    { Bad_Opcode },
5293
    { Bad_Opcode },
5294
    { Bad_Opcode },
5295
    /* 28 */
5296
    { Bad_Opcode },
5297
    { Bad_Opcode },
5298
    { Bad_Opcode },
5299
    { Bad_Opcode },
5300
    { Bad_Opcode },
5301
    { Bad_Opcode },
5302
    { Bad_Opcode },
5303
    { Bad_Opcode },
5304
    /* 30 */
5305
    { Bad_Opcode },
5306
    { Bad_Opcode },
5307
    { Bad_Opcode },
5308
    { Bad_Opcode },
5309
    { Bad_Opcode },
5310
    { Bad_Opcode },
5311
    { Bad_Opcode },
5312
    { Bad_Opcode },
5313
    /* 38 */
5314
    { Bad_Opcode },
5315
    { Bad_Opcode },
5316
    { Bad_Opcode },
5317
    { Bad_Opcode },
5318
    { Bad_Opcode },
5319
    { Bad_Opcode },
5320
    { Bad_Opcode },
5321
    { Bad_Opcode },
5322
    /* 40 */
5323
    { Bad_Opcode },
5324
    { Bad_Opcode },
5325
    { Bad_Opcode },
5326
    { Bad_Opcode },
5327
    { Bad_Opcode },
5328
    { Bad_Opcode },
5329
    { Bad_Opcode },
5330
    { Bad_Opcode },
5331
    /* 48 */
5332
    { Bad_Opcode },
5333
    { Bad_Opcode },
5334
    { Bad_Opcode },
5335
    { Bad_Opcode },
5336
    { Bad_Opcode },
5337
    { Bad_Opcode },
5338
    { Bad_Opcode },
5339
    { Bad_Opcode },
5340
    /* 50 */
5341
    { Bad_Opcode },
5342
    { Bad_Opcode },
5343
    { Bad_Opcode },
5344
    { Bad_Opcode },
5345
    { Bad_Opcode },
5346
    { Bad_Opcode },
5347
    { Bad_Opcode },
5348
    { Bad_Opcode },
5349
    /* 58 */
5350
    { Bad_Opcode },
5351
    { Bad_Opcode },
5352
    { Bad_Opcode },
5353
    { Bad_Opcode },
5354
    { Bad_Opcode },
5355
    { Bad_Opcode },
5356
    { Bad_Opcode },
5357
    { Bad_Opcode },
5358
    /* 60 */
5359
    { Bad_Opcode },
5360
    { Bad_Opcode },
5361
    { Bad_Opcode },
5362
    { Bad_Opcode },
5363
    { Bad_Opcode },
5364
    { Bad_Opcode },
5365
    { Bad_Opcode },
5366
    { Bad_Opcode },
5367
    /* 68 */
5368
    { Bad_Opcode },
5369
    { Bad_Opcode },
5370
    { Bad_Opcode },
5371
    { Bad_Opcode },
5372
    { Bad_Opcode },
5373
    { Bad_Opcode },
5374
    { Bad_Opcode },
5375
    { Bad_Opcode },
5376
    /* 70 */
5377
    { Bad_Opcode },
5378
    { Bad_Opcode },
5379
    { Bad_Opcode },
5380
    { Bad_Opcode },
5381
    { Bad_Opcode },
5382
    { Bad_Opcode },
5383
    { Bad_Opcode },
5384
    { Bad_Opcode },
5385
    /* 78 */
5386
    { Bad_Opcode },
5387
    { Bad_Opcode },
5388
    { Bad_Opcode },
5389
    { Bad_Opcode },
5390
    { Bad_Opcode },
5391
    { Bad_Opcode },
5392
    { Bad_Opcode },
5393
    { Bad_Opcode },
5394
    /* 80 */
5395
    { Bad_Opcode },
5396
    { Bad_Opcode },
5397
    { Bad_Opcode },
5398
    { Bad_Opcode },
5399
    { Bad_Opcode },
5400
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_85) },
5401
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_86) },
5402
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_87) },
5403
    /* 88 */
5404
    { Bad_Opcode },
5405
    { Bad_Opcode },
5406
    { Bad_Opcode },
5407
    { Bad_Opcode },
5408
    { Bad_Opcode },
5409
    { Bad_Opcode },
5410
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_8E) },
5411
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_8F) },
5412
    /* 90 */
5413
    { Bad_Opcode },
5414
    { Bad_Opcode },
5415
    { Bad_Opcode },
5416
    { Bad_Opcode },
5417
    { Bad_Opcode },
5418
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_95) },
5419
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_96) },
5420
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_97) },
5421
    /* 98 */
5422
    { Bad_Opcode },
5423
    { Bad_Opcode },
5424
    { Bad_Opcode },
5425
    { Bad_Opcode },
5426
    { Bad_Opcode },
5427
    { Bad_Opcode },
5428
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_9E) },
5429
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_9F) },
5430
    /* a0 */
5431
    { Bad_Opcode },
5432
    { Bad_Opcode },
5433
    { "vpcmov",   { XM, Vex, EXx, XMVexI4 }, 0 },
5434
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_A3) },
5435
    { Bad_Opcode },
5436
    { Bad_Opcode },
5437
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_A6) },
5438
    { Bad_Opcode },
5439
    /* a8 */
5440
    { Bad_Opcode },
5441
    { Bad_Opcode },
5442
    { Bad_Opcode },
5443
    { Bad_Opcode },
5444
    { Bad_Opcode },
5445
    { Bad_Opcode },
5446
    { Bad_Opcode },
5447
    { Bad_Opcode },
5448
    /* b0 */
5449
    { Bad_Opcode },
5450
    { Bad_Opcode },
5451
    { Bad_Opcode },
5452
    { Bad_Opcode },
5453
    { Bad_Opcode },
5454
    { Bad_Opcode },
5455
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_B6) },
5456
    { Bad_Opcode },
5457
    /* b8 */
5458
    { Bad_Opcode },
5459
    { Bad_Opcode },
5460
    { Bad_Opcode },
5461
    { Bad_Opcode },
5462
    { Bad_Opcode },
5463
    { Bad_Opcode },
5464
    { Bad_Opcode },
5465
    { Bad_Opcode },
5466
    /* c0 */
5467
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C0) },
5468
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C1) },
5469
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C2) },
5470
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C3) },
5471
    { Bad_Opcode },
5472
    { Bad_Opcode },
5473
    { Bad_Opcode },
5474
    { Bad_Opcode },
5475
    /* c8 */
5476
    { Bad_Opcode },
5477
    { Bad_Opcode },
5478
    { Bad_Opcode },
5479
    { Bad_Opcode },
5480
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CC) },
5481
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CD) },
5482
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CE) },
5483
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CF) },
5484
    /* d0 */
5485
    { Bad_Opcode },
5486
    { Bad_Opcode },
5487
    { Bad_Opcode },
5488
    { Bad_Opcode },
5489
    { Bad_Opcode },
5490
    { Bad_Opcode },
5491
    { Bad_Opcode },
5492
    { Bad_Opcode },
5493
    /* d8 */
5494
    { Bad_Opcode },
5495
    { Bad_Opcode },
5496
    { Bad_Opcode },
5497
    { Bad_Opcode },
5498
    { Bad_Opcode },
5499
    { Bad_Opcode },
5500
    { Bad_Opcode },
5501
    { Bad_Opcode },
5502
    /* e0 */
5503
    { Bad_Opcode },
5504
    { Bad_Opcode },
5505
    { Bad_Opcode },
5506
    { Bad_Opcode },
5507
    { Bad_Opcode },
5508
    { Bad_Opcode },
5509
    { Bad_Opcode },
5510
    { Bad_Opcode },
5511
    /* e8 */
5512
    { Bad_Opcode },
5513
    { Bad_Opcode },
5514
    { Bad_Opcode },
5515
    { Bad_Opcode },
5516
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EC) },
5517
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_ED) },
5518
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EE) },
5519
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EF) },
5520
    /* f0 */
5521
    { Bad_Opcode },
5522
    { Bad_Opcode },
5523
    { Bad_Opcode },
5524
    { Bad_Opcode },
5525
    { Bad_Opcode },
5526
    { Bad_Opcode },
5527
    { Bad_Opcode },
5528
    { Bad_Opcode },
5529
    /* f8 */
5530
    { Bad_Opcode },
5531
    { Bad_Opcode },
5532
    { Bad_Opcode },
5533
    { Bad_Opcode },
5534
    { Bad_Opcode },
5535
    { Bad_Opcode },
5536
    { Bad_Opcode },
5537
    { Bad_Opcode },
5538
  },
5539
  /* XOP_09 */
5540
  {
5541
    /* 00 */
5542
    { Bad_Opcode },
5543
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_01) },
5544
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_02) },
5545
    { Bad_Opcode },
5546
    { Bad_Opcode },
5547
    { Bad_Opcode },
5548
    { Bad_Opcode },
5549
    { Bad_Opcode },
5550
    /* 08 */
5551
    { Bad_Opcode },
5552
    { Bad_Opcode },
5553
    { Bad_Opcode },
5554
    { Bad_Opcode },
5555
    { Bad_Opcode },
5556
    { Bad_Opcode },
5557
    { Bad_Opcode },
5558
    { Bad_Opcode },
5559
    /* 10 */
5560
    { Bad_Opcode },
5561
    { Bad_Opcode },
5562
    { MOD_TABLE (MOD_XOP_09_12) },
5563
    { Bad_Opcode },
5564
    { Bad_Opcode },
5565
    { Bad_Opcode },
5566
    { Bad_Opcode },
5567
    { Bad_Opcode },
5568
    /* 18 */
5569
    { Bad_Opcode },
5570
    { Bad_Opcode },
5571
    { Bad_Opcode },
5572
    { Bad_Opcode },
5573
    { Bad_Opcode },
5574
    { Bad_Opcode },
5575
    { Bad_Opcode },
5576
    { Bad_Opcode },
5577
    /* 20 */
5578
    { Bad_Opcode },
5579
    { Bad_Opcode },
5580
    { Bad_Opcode },
5581
    { Bad_Opcode },
5582
    { Bad_Opcode },
5583
    { Bad_Opcode },
5584
    { Bad_Opcode },
5585
    { Bad_Opcode },
5586
    /* 28 */
5587
    { Bad_Opcode },
5588
    { Bad_Opcode },
5589
    { Bad_Opcode },
5590
    { Bad_Opcode },
5591
    { Bad_Opcode },
5592
    { Bad_Opcode },
5593
    { Bad_Opcode },
5594
    { Bad_Opcode },
5595
    /* 30 */
5596
    { Bad_Opcode },
5597
    { Bad_Opcode },
5598
    { Bad_Opcode },
5599
    { Bad_Opcode },
5600
    { Bad_Opcode },
5601
    { Bad_Opcode },
5602
    { Bad_Opcode },
5603
    { Bad_Opcode },
5604
    /* 38 */
5605
    { Bad_Opcode },
5606
    { Bad_Opcode },
5607
    { Bad_Opcode },
5608
    { Bad_Opcode },
5609
    { Bad_Opcode },
5610
    { Bad_Opcode },
5611
    { Bad_Opcode },
5612
    { Bad_Opcode },
5613
    /* 40 */
5614
    { Bad_Opcode },
5615
    { Bad_Opcode },
5616
    { Bad_Opcode },
5617
    { Bad_Opcode },
5618
    { Bad_Opcode },
5619
    { Bad_Opcode },
5620
    { Bad_Opcode },
5621
    { Bad_Opcode },
5622
    /* 48 */
5623
    { Bad_Opcode },
5624
    { Bad_Opcode },
5625
    { Bad_Opcode },
5626
    { Bad_Opcode },
5627
    { Bad_Opcode },
5628
    { Bad_Opcode },
5629
    { Bad_Opcode },
5630
    { Bad_Opcode },
5631
    /* 50 */
5632
    { Bad_Opcode },
5633
    { Bad_Opcode },
5634
    { Bad_Opcode },
5635
    { Bad_Opcode },
5636
    { Bad_Opcode },
5637
    { Bad_Opcode },
5638
    { Bad_Opcode },
5639
    { Bad_Opcode },
5640
    /* 58 */
5641
    { Bad_Opcode },
5642
    { Bad_Opcode },
5643
    { Bad_Opcode },
5644
    { Bad_Opcode },
5645
    { Bad_Opcode },
5646
    { Bad_Opcode },
5647
    { Bad_Opcode },
5648
    { Bad_Opcode },
5649
    /* 60 */
5650
    { Bad_Opcode },
5651
    { Bad_Opcode },
5652
    { Bad_Opcode },
5653
    { Bad_Opcode },
5654
    { Bad_Opcode },
5655
    { Bad_Opcode },
5656
    { Bad_Opcode },
5657
    { Bad_Opcode },
5658
    /* 68 */
5659
    { Bad_Opcode },
5660
    { Bad_Opcode },
5661
    { Bad_Opcode },
5662
    { Bad_Opcode },
5663
    { Bad_Opcode },
5664
    { Bad_Opcode },
5665
    { Bad_Opcode },
5666
    { Bad_Opcode },
5667
    /* 70 */
5668
    { Bad_Opcode },
5669
    { Bad_Opcode },
5670
    { Bad_Opcode },
5671
    { Bad_Opcode },
5672
    { Bad_Opcode },
5673
    { Bad_Opcode },
5674
    { Bad_Opcode },
5675
    { Bad_Opcode },
5676
    /* 78 */
5677
    { Bad_Opcode },
5678
    { Bad_Opcode },
5679
    { Bad_Opcode },
5680
    { Bad_Opcode },
5681
    { Bad_Opcode },
5682
    { Bad_Opcode },
5683
    { Bad_Opcode },
5684
    { Bad_Opcode },
5685
    /* 80 */
5686
    { VEX_W_TABLE (VEX_W_0FXOP_09_80) },
5687
    { VEX_W_TABLE (VEX_W_0FXOP_09_81) },
5688
    { VEX_W_TABLE (VEX_W_0FXOP_09_82) },
5689
    { VEX_W_TABLE (VEX_W_0FXOP_09_83) },
5690
    { Bad_Opcode },
5691
    { Bad_Opcode },
5692
    { Bad_Opcode },
5693
    { Bad_Opcode },
5694
    /* 88 */
5695
    { Bad_Opcode },
5696
    { Bad_Opcode },
5697
    { Bad_Opcode },
5698
    { Bad_Opcode },
5699
    { Bad_Opcode },
5700
    { Bad_Opcode },
5701
    { Bad_Opcode },
5702
    { Bad_Opcode },
5703
    /* 90 */
5704
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_90) },
5705
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_91) },
5706
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_92) },
5707
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_93) },
5708
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_94) },
5709
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_95) },
5710
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_96) },
5711
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_97) },
5712
    /* 98 */
5713
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_98) },
5714
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_99) },
5715
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_9A) },
5716
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_9B) },
5717
    { Bad_Opcode },
5718
    { Bad_Opcode },
5719
    { Bad_Opcode },
5720
    { Bad_Opcode },
5721
    /* a0 */
5722
    { Bad_Opcode },
5723
    { Bad_Opcode },
5724
    { Bad_Opcode },
5725
    { Bad_Opcode },
5726
    { Bad_Opcode },
5727
    { Bad_Opcode },
5728
    { Bad_Opcode },
5729
    { Bad_Opcode },
5730
    /* a8 */
5731
    { Bad_Opcode },
5732
    { Bad_Opcode },
5733
    { Bad_Opcode },
5734
    { Bad_Opcode },
5735
    { Bad_Opcode },
5736
    { Bad_Opcode },
5737
    { Bad_Opcode },
5738
    { Bad_Opcode },
5739
    /* b0 */
5740
    { Bad_Opcode },
5741
    { Bad_Opcode },
5742
    { Bad_Opcode },
5743
    { Bad_Opcode },
5744
    { Bad_Opcode },
5745
    { Bad_Opcode },
5746
    { Bad_Opcode },
5747
    { Bad_Opcode },
5748
    /* b8 */
5749
    { Bad_Opcode },
5750
    { Bad_Opcode },
5751
    { Bad_Opcode },
5752
    { Bad_Opcode },
5753
    { Bad_Opcode },
5754
    { Bad_Opcode },
5755
    { Bad_Opcode },
5756
    { Bad_Opcode },
5757
    /* c0 */
5758
    { Bad_Opcode },
5759
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C1) },
5760
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C2) },
5761
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C3) },
5762
    { Bad_Opcode },
5763
    { Bad_Opcode },
5764
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C6) },
5765
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C7) },
5766
    /* c8 */
5767
    { Bad_Opcode },
5768
    { Bad_Opcode },
5769
    { Bad_Opcode },
5770
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_CB) },
5771
    { Bad_Opcode },
5772
    { Bad_Opcode },
5773
    { Bad_Opcode },
5774
    { Bad_Opcode },
5775
    /* d0 */
5776
    { Bad_Opcode },
5777
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D1) },
5778
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D2) },
5779
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D3) },
5780
    { Bad_Opcode },
5781
    { Bad_Opcode },
5782
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D6) },
5783
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D7) },
5784
    /* d8 */
5785
    { Bad_Opcode },
5786
    { Bad_Opcode },
5787
    { Bad_Opcode },
5788
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_DB) },
5789
    { Bad_Opcode },
5790
    { Bad_Opcode },
5791
    { Bad_Opcode },
5792
    { Bad_Opcode },
5793
    /* e0 */
5794
    { Bad_Opcode },
5795
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E1) },
5796
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E2) },
5797
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E3) },
5798
    { Bad_Opcode },
5799
    { Bad_Opcode },
5800
    { Bad_Opcode },
5801
    { Bad_Opcode },
5802
    /* e8 */
5803
    { Bad_Opcode },
5804
    { Bad_Opcode },
5805
    { Bad_Opcode },
5806
    { Bad_Opcode },
5807
    { Bad_Opcode },
5808
    { Bad_Opcode },
5809
    { Bad_Opcode },
5810
    { Bad_Opcode },
5811
    /* f0 */
5812
    { Bad_Opcode },
5813
    { Bad_Opcode },
5814
    { Bad_Opcode },
5815
    { Bad_Opcode },
5816
    { Bad_Opcode },
5817
    { Bad_Opcode },
5818
    { Bad_Opcode },
5819
    { Bad_Opcode },
5820
    /* f8 */
5821
    { Bad_Opcode },
5822
    { Bad_Opcode },
5823
    { Bad_Opcode },
5824
    { Bad_Opcode },
5825
    { Bad_Opcode },
5826
    { Bad_Opcode },
5827
    { Bad_Opcode },
5828
    { Bad_Opcode },
5829
  },
5830
  /* XOP_0A */
5831
  {
5832
    /* 00 */
5833
    { Bad_Opcode },
5834
    { Bad_Opcode },
5835
    { Bad_Opcode },
5836
    { Bad_Opcode },
5837
    { Bad_Opcode },
5838
    { Bad_Opcode },
5839
    { Bad_Opcode },
5840
    { Bad_Opcode },
5841
    /* 08 */
5842
    { Bad_Opcode },
5843
    { Bad_Opcode },
5844
    { Bad_Opcode },
5845
    { Bad_Opcode },
5846
    { Bad_Opcode },
5847
    { Bad_Opcode },
5848
    { Bad_Opcode },
5849
    { Bad_Opcode },
5850
    /* 10 */
5851
    { "bextrS", { Gdq, Edq, Id }, 0 },
5852
    { Bad_Opcode },
5853
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_0A_12) },
5854
    { Bad_Opcode },
5855
    { Bad_Opcode },
5856
    { Bad_Opcode },
5857
    { Bad_Opcode },
5858
    { Bad_Opcode },
5859
    /* 18 */
5860
    { Bad_Opcode },
5861
    { Bad_Opcode },
5862
    { Bad_Opcode },
5863
    { Bad_Opcode },
5864
    { Bad_Opcode },
5865
    { Bad_Opcode },
5866
    { Bad_Opcode },
5867
    { Bad_Opcode },
5868
    /* 20 */
5869
    { Bad_Opcode },
5870
    { Bad_Opcode },
5871
    { Bad_Opcode },
5872
    { Bad_Opcode },
5873
    { Bad_Opcode },
5874
    { Bad_Opcode },
5875
    { Bad_Opcode },
5876
    { Bad_Opcode },
5877
    /* 28 */
5878
    { Bad_Opcode },
5879
    { Bad_Opcode },
5880
    { Bad_Opcode },
5881
    { Bad_Opcode },
5882
    { Bad_Opcode },
5883
    { Bad_Opcode },
5884
    { Bad_Opcode },
5885
    { Bad_Opcode },
5886
    /* 30 */
5887
    { Bad_Opcode },
5888
    { Bad_Opcode },
5889
    { Bad_Opcode },
5890
    { Bad_Opcode },
5891
    { Bad_Opcode },
5892
    { Bad_Opcode },
5893
    { Bad_Opcode },
5894
    { Bad_Opcode },
5895
    /* 38 */
5896
    { Bad_Opcode },
5897
    { Bad_Opcode },
5898
    { Bad_Opcode },
5899
    { Bad_Opcode },
5900
    { Bad_Opcode },
5901
    { Bad_Opcode },
5902
    { Bad_Opcode },
5903
    { Bad_Opcode },
5904
    /* 40 */
5905
    { Bad_Opcode },
5906
    { Bad_Opcode },
5907
    { Bad_Opcode },
5908
    { Bad_Opcode },
5909
    { Bad_Opcode },
5910
    { Bad_Opcode },
5911
    { Bad_Opcode },
5912
    { Bad_Opcode },
5913
    /* 48 */
5914
    { Bad_Opcode },
5915
    { Bad_Opcode },
5916
    { Bad_Opcode },
5917
    { Bad_Opcode },
5918
    { Bad_Opcode },
5919
    { Bad_Opcode },
5920
    { Bad_Opcode },
5921
    { Bad_Opcode },
5922
    /* 50 */
5923
    { Bad_Opcode },
5924
    { Bad_Opcode },
5925
    { Bad_Opcode },
5926
    { Bad_Opcode },
5927
    { Bad_Opcode },
5928
    { Bad_Opcode },
5929
    { Bad_Opcode },
5930
    { Bad_Opcode },
5931
    /* 58 */
5932
    { Bad_Opcode },
5933
    { Bad_Opcode },
5934
    { Bad_Opcode },
5935
    { Bad_Opcode },
5936
    { Bad_Opcode },
5937
    { Bad_Opcode },
5938
    { Bad_Opcode },
5939
    { Bad_Opcode },
5940
    /* 60 */
5941
    { Bad_Opcode },
5942
    { Bad_Opcode },
5943
    { Bad_Opcode },
5944
    { Bad_Opcode },
5945
    { Bad_Opcode },
5946
    { Bad_Opcode },
5947
    { Bad_Opcode },
5948
    { Bad_Opcode },
5949
    /* 68 */
5950
    { Bad_Opcode },
5951
    { Bad_Opcode },
5952
    { Bad_Opcode },
5953
    { Bad_Opcode },
5954
    { Bad_Opcode },
5955
    { Bad_Opcode },
5956
    { Bad_Opcode },
5957
    { Bad_Opcode },
5958
    /* 70 */
5959
    { Bad_Opcode },
5960
    { Bad_Opcode },
5961
    { Bad_Opcode },
5962
    { Bad_Opcode },
5963
    { Bad_Opcode },
5964
    { Bad_Opcode },
5965
    { Bad_Opcode },
5966
    { Bad_Opcode },
5967
    /* 78 */
5968
    { Bad_Opcode },
5969
    { Bad_Opcode },
5970
    { Bad_Opcode },
5971
    { Bad_Opcode },
5972
    { Bad_Opcode },
5973
    { Bad_Opcode },
5974
    { Bad_Opcode },
5975
    { Bad_Opcode },
5976
    /* 80 */
5977
    { Bad_Opcode },
5978
    { Bad_Opcode },
5979
    { Bad_Opcode },
5980
    { Bad_Opcode },
5981
    { Bad_Opcode },
5982
    { Bad_Opcode },
5983
    { Bad_Opcode },
5984
    { Bad_Opcode },
5985
    /* 88 */
5986
    { Bad_Opcode },
5987
    { Bad_Opcode },
5988
    { Bad_Opcode },
5989
    { Bad_Opcode },
5990
    { Bad_Opcode },
5991
    { Bad_Opcode },
5992
    { Bad_Opcode },
5993
    { Bad_Opcode },
5994
    /* 90 */
5995
    { Bad_Opcode },
5996
    { Bad_Opcode },
5997
    { Bad_Opcode },
5998
    { Bad_Opcode },
5999
    { Bad_Opcode },
6000
    { Bad_Opcode },
6001
    { Bad_Opcode },
6002
    { Bad_Opcode },
6003
    /* 98 */
6004
    { Bad_Opcode },
6005
    { Bad_Opcode },
6006
    { Bad_Opcode },
6007
    { Bad_Opcode },
6008
    { Bad_Opcode },
6009
    { Bad_Opcode },
6010
    { Bad_Opcode },
6011
    { Bad_Opcode },
6012
    /* a0 */
6013
    { Bad_Opcode },
6014
    { Bad_Opcode },
6015
    { Bad_Opcode },
6016
    { Bad_Opcode },
6017
    { Bad_Opcode },
6018
    { Bad_Opcode },
6019
    { Bad_Opcode },
6020
    { Bad_Opcode },
6021
    /* a8 */
6022
    { Bad_Opcode },
6023
    { Bad_Opcode },
6024
    { Bad_Opcode },
6025
    { Bad_Opcode },
6026
    { Bad_Opcode },
6027
    { Bad_Opcode },
6028
    { Bad_Opcode },
6029
    { Bad_Opcode },
6030
    /* b0 */
6031
    { Bad_Opcode },
6032
    { Bad_Opcode },
6033
    { Bad_Opcode },
6034
    { Bad_Opcode },
6035
    { Bad_Opcode },
6036
    { Bad_Opcode },
6037
    { Bad_Opcode },
6038
    { Bad_Opcode },
6039
    /* b8 */
6040
    { Bad_Opcode },
6041
    { Bad_Opcode },
6042
    { Bad_Opcode },
6043
    { Bad_Opcode },
6044
    { Bad_Opcode },
6045
    { Bad_Opcode },
6046
    { Bad_Opcode },
6047
    { Bad_Opcode },
6048
    /* c0 */
6049
    { Bad_Opcode },
6050
    { Bad_Opcode },
6051
    { Bad_Opcode },
6052
    { Bad_Opcode },
6053
    { Bad_Opcode },
6054
    { Bad_Opcode },
6055
    { Bad_Opcode },
6056
    { Bad_Opcode },
6057
    /* c8 */
6058
    { Bad_Opcode },
6059
    { Bad_Opcode },
6060
    { Bad_Opcode },
6061
    { Bad_Opcode },
6062
    { Bad_Opcode },
6063
    { Bad_Opcode },
6064
    { Bad_Opcode },
6065
    { Bad_Opcode },
6066
    /* d0 */
6067
    { Bad_Opcode },
6068
    { Bad_Opcode },
6069
    { Bad_Opcode },
6070
    { Bad_Opcode },
6071
    { Bad_Opcode },
6072
    { Bad_Opcode },
6073
    { Bad_Opcode },
6074
    { Bad_Opcode },
6075
    /* d8 */
6076
    { Bad_Opcode },
6077
    { Bad_Opcode },
6078
    { Bad_Opcode },
6079
    { Bad_Opcode },
6080
    { Bad_Opcode },
6081
    { Bad_Opcode },
6082
    { Bad_Opcode },
6083
    { Bad_Opcode },
6084
    /* e0 */
6085
    { Bad_Opcode },
6086
    { Bad_Opcode },
6087
    { Bad_Opcode },
6088
    { Bad_Opcode },
6089
    { Bad_Opcode },
6090
    { Bad_Opcode },
6091
    { Bad_Opcode },
6092
    { Bad_Opcode },
6093
    /* e8 */
6094
    { Bad_Opcode },
6095
    { Bad_Opcode },
6096
    { Bad_Opcode },
6097
    { Bad_Opcode },
6098
    { Bad_Opcode },
6099
    { Bad_Opcode },
6100
    { Bad_Opcode },
6101
    { Bad_Opcode },
6102
    /* f0 */
6103
    { Bad_Opcode },
6104
    { Bad_Opcode },
6105
    { Bad_Opcode },
6106
    { Bad_Opcode },
6107
    { Bad_Opcode },
6108
    { Bad_Opcode },
6109
    { Bad_Opcode },
6110
    { Bad_Opcode },
6111
    /* f8 */
6112
    { Bad_Opcode },
6113
    { Bad_Opcode },
6114
    { Bad_Opcode },
6115
    { Bad_Opcode },
6116
    { Bad_Opcode },
6117
    { Bad_Opcode },
6118
    { Bad_Opcode },
6119
    { Bad_Opcode },
6120
  },
6121
};
6122
6123
static const struct dis386 vex_table[][256] = {
6124
  /* VEX_0F */
6125
  {
6126
    /* 00 */
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
    /* 08 */
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
    /* 10 */
6145
    { PREFIX_TABLE (PREFIX_VEX_0F10) },
6146
    { PREFIX_TABLE (PREFIX_VEX_0F11) },
6147
    { PREFIX_TABLE (PREFIX_VEX_0F12) },
6148
    { MOD_TABLE (MOD_VEX_0F13) },
6149
    { "vunpcklpX",  { XM, Vex, EXx }, PREFIX_OPCODE },
6150
    { "vunpckhpX",  { XM, Vex, EXx }, PREFIX_OPCODE },
6151
    { PREFIX_TABLE (PREFIX_VEX_0F16) },
6152
    { MOD_TABLE (MOD_VEX_0F17) },
6153
    /* 18 */
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
    /* 20 */
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
    /* 28 */
6172
    { "vmovapX",  { XM, EXx }, PREFIX_OPCODE },
6173
    { "vmovapX",  { EXxS, XM }, PREFIX_OPCODE },
6174
    { PREFIX_TABLE (PREFIX_VEX_0F2A) },
6175
    { MOD_TABLE (MOD_VEX_0F2B) },
6176
    { PREFIX_TABLE (PREFIX_VEX_0F2C) },
6177
    { PREFIX_TABLE (PREFIX_VEX_0F2D) },
6178
    { PREFIX_TABLE (PREFIX_VEX_0F2E) },
6179
    { PREFIX_TABLE (PREFIX_VEX_0F2F) },
6180
    /* 30 */
6181
    { Bad_Opcode },
6182
    { Bad_Opcode },
6183
    { Bad_Opcode },
6184
    { Bad_Opcode },
6185
    { Bad_Opcode },
6186
    { Bad_Opcode },
6187
    { Bad_Opcode },
6188
    { Bad_Opcode },
6189
    /* 38 */
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
    /* 40 */
6199
    { Bad_Opcode },
6200
    { VEX_LEN_TABLE (VEX_LEN_0F41) },
6201
    { VEX_LEN_TABLE (VEX_LEN_0F42) },
6202
    { Bad_Opcode },
6203
    { VEX_LEN_TABLE (VEX_LEN_0F44) },
6204
    { VEX_LEN_TABLE (VEX_LEN_0F45) },
6205
    { VEX_LEN_TABLE (VEX_LEN_0F46) },
6206
    { VEX_LEN_TABLE (VEX_LEN_0F47) },
6207
    /* 48 */
6208
    { Bad_Opcode },
6209
    { Bad_Opcode },
6210
    { VEX_LEN_TABLE (VEX_LEN_0F4A) },
6211
    { VEX_LEN_TABLE (VEX_LEN_0F4B) },
6212
    { Bad_Opcode },
6213
    { Bad_Opcode },
6214
    { Bad_Opcode },
6215
    { Bad_Opcode },
6216
    /* 50 */
6217
    { MOD_TABLE (MOD_VEX_0F50) },
6218
    { PREFIX_TABLE (PREFIX_VEX_0F51) },
6219
    { PREFIX_TABLE (PREFIX_VEX_0F52) },
6220
    { PREFIX_TABLE (PREFIX_VEX_0F53) },
6221
    { "vandpX",   { XM, Vex, EXx }, PREFIX_OPCODE },
6222
    { "vandnpX",  { XM, Vex, EXx }, PREFIX_OPCODE },
6223
    { "vorpX",    { XM, Vex, EXx }, PREFIX_OPCODE },
6224
    { "vxorpX",   { XM, Vex, EXx }, PREFIX_OPCODE },
6225
    /* 58 */
6226
    { PREFIX_TABLE (PREFIX_VEX_0F58) },
6227
    { PREFIX_TABLE (PREFIX_VEX_0F59) },
6228
    { PREFIX_TABLE (PREFIX_VEX_0F5A) },
6229
    { PREFIX_TABLE (PREFIX_VEX_0F5B) },
6230
    { PREFIX_TABLE (PREFIX_VEX_0F5C) },
6231
    { PREFIX_TABLE (PREFIX_VEX_0F5D) },
6232
    { PREFIX_TABLE (PREFIX_VEX_0F5E) },
6233
    { PREFIX_TABLE (PREFIX_VEX_0F5F) },
6234
    /* 60 */
6235
    { "vpunpcklbw", { XM, Vex, EXx }, PREFIX_DATA },
6236
    { "vpunpcklwd", { XM, Vex, EXx }, PREFIX_DATA },
6237
    { "vpunpckldq", { XM, Vex, EXx }, PREFIX_DATA },
6238
    { "vpacksswb",  { XM, Vex, EXx }, PREFIX_DATA },
6239
    { "vpcmpgtb", { XM, Vex, EXx }, PREFIX_DATA },
6240
    { "vpcmpgtw", { XM, Vex, EXx }, PREFIX_DATA },
6241
    { "vpcmpgtd", { XM, Vex, EXx }, PREFIX_DATA },
6242
    { "vpackuswb",  { XM, Vex, EXx }, PREFIX_DATA },
6243
    /* 68 */
6244
    { "vpunpckhbw", { XM, Vex, EXx }, PREFIX_DATA },
6245
    { "vpunpckhwd", { XM, Vex, EXx }, PREFIX_DATA },
6246
    { "vpunpckhdq", { XM, Vex, EXx }, PREFIX_DATA },
6247
    { "vpackssdw",  { XM, Vex, EXx }, PREFIX_DATA },
6248
    { "vpunpcklqdq",  { XM, Vex, EXx }, PREFIX_DATA },
6249
    { "vpunpckhqdq",  { XM, Vex, EXx }, PREFIX_DATA },
6250
    { VEX_LEN_TABLE (VEX_LEN_0F6E) },
6251
    { PREFIX_TABLE (PREFIX_VEX_0F6F) },
6252
    /* 70 */
6253
    { PREFIX_TABLE (PREFIX_VEX_0F70) },
6254
    { MOD_TABLE (MOD_VEX_0F71) },
6255
    { MOD_TABLE (MOD_VEX_0F72) },
6256
    { MOD_TABLE (MOD_VEX_0F73) },
6257
    { "vpcmpeqb", { XM, Vex, EXx }, PREFIX_DATA },
6258
    { "vpcmpeqw", { XM, Vex, EXx }, PREFIX_DATA },
6259
    { "vpcmpeqd", { XM, Vex, EXx }, PREFIX_DATA },
6260
    { VEX_LEN_TABLE (VEX_LEN_0F77) },
6261
    /* 78 */
6262
    { Bad_Opcode },
6263
    { Bad_Opcode },
6264
    { Bad_Opcode },
6265
    { Bad_Opcode },
6266
    { PREFIX_TABLE (PREFIX_VEX_0F7C) },
6267
    { PREFIX_TABLE (PREFIX_VEX_0F7D) },
6268
    { PREFIX_TABLE (PREFIX_VEX_0F7E) },
6269
    { PREFIX_TABLE (PREFIX_VEX_0F7F) },
6270
    /* 80 */
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
    /* 88 */
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
    /* 90 */
6289
    { VEX_LEN_TABLE (VEX_LEN_0F90) },
6290
    { VEX_LEN_TABLE (VEX_LEN_0F91) },
6291
    { VEX_LEN_TABLE (VEX_LEN_0F92) },
6292
    { VEX_LEN_TABLE (VEX_LEN_0F93) },
6293
    { Bad_Opcode },
6294
    { Bad_Opcode },
6295
    { Bad_Opcode },
6296
    { Bad_Opcode },
6297
    /* 98 */
6298
    { VEX_LEN_TABLE (VEX_LEN_0F98) },
6299
    { VEX_LEN_TABLE (VEX_LEN_0F99) },
6300
    { Bad_Opcode },
6301
    { Bad_Opcode },
6302
    { Bad_Opcode },
6303
    { Bad_Opcode },
6304
    { Bad_Opcode },
6305
    { Bad_Opcode },
6306
    /* a0 */
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
    /* a8 */
6316
    { Bad_Opcode },
6317
    { Bad_Opcode },
6318
    { Bad_Opcode },
6319
    { Bad_Opcode },
6320
    { Bad_Opcode },
6321
    { Bad_Opcode },
6322
    { REG_TABLE (REG_VEX_0FAE) },
6323
    { Bad_Opcode },
6324
    /* b0 */
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
    /* b8 */
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
    /* c0 */
6343
    { Bad_Opcode },
6344
    { Bad_Opcode },
6345
    { PREFIX_TABLE (PREFIX_VEX_0FC2) },
6346
    { Bad_Opcode },
6347
    { VEX_LEN_TABLE (VEX_LEN_0FC4) },
6348
    { VEX_LEN_TABLE (VEX_LEN_0FC5) },
6349
    { "vshufpX",  { XM, Vex, EXx, Ib }, PREFIX_OPCODE },
6350
    { Bad_Opcode },
6351
    /* c8 */
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
    /* d0 */
6361
    { PREFIX_TABLE (PREFIX_VEX_0FD0) },
6362
    { "vpsrlw",   { XM, Vex, EXxmm }, PREFIX_DATA },
6363
    { "vpsrld",   { XM, Vex, EXxmm }, PREFIX_DATA },
6364
    { "vpsrlq",   { XM, Vex, EXxmm }, PREFIX_DATA },
6365
    { "vpaddq",   { XM, Vex, EXx }, PREFIX_DATA },
6366
    { "vpmullw",  { XM, Vex, EXx }, PREFIX_DATA },
6367
    { VEX_LEN_TABLE (VEX_LEN_0FD6) },
6368
    { MOD_TABLE (MOD_VEX_0FD7) },
6369
    /* d8 */
6370
    { "vpsubusb", { XM, Vex, EXx }, PREFIX_DATA },
6371
    { "vpsubusw", { XM, Vex, EXx }, PREFIX_DATA },
6372
    { "vpminub",  { XM, Vex, EXx }, PREFIX_DATA },
6373
    { "vpand",    { XM, Vex, EXx }, PREFIX_DATA },
6374
    { "vpaddusb", { XM, Vex, EXx }, PREFIX_DATA },
6375
    { "vpaddusw", { XM, Vex, EXx }, PREFIX_DATA },
6376
    { "vpmaxub",  { XM, Vex, EXx }, PREFIX_DATA },
6377
    { "vpandn",   { XM, Vex, EXx }, PREFIX_DATA },
6378
    /* e0 */
6379
    { "vpavgb",   { XM, Vex, EXx }, PREFIX_DATA },
6380
    { "vpsraw",   { XM, Vex, EXxmm }, PREFIX_DATA },
6381
    { "vpsrad",   { XM, Vex, EXxmm }, PREFIX_DATA },
6382
    { "vpavgw",   { XM, Vex, EXx }, PREFIX_DATA },
6383
    { "vpmulhuw", { XM, Vex, EXx }, PREFIX_DATA },
6384
    { "vpmulhw",  { XM, Vex, EXx }, PREFIX_DATA },
6385
    { PREFIX_TABLE (PREFIX_VEX_0FE6) },
6386
    { MOD_TABLE (MOD_VEX_0FE7) },
6387
    /* e8 */
6388
    { "vpsubsb",  { XM, Vex, EXx }, PREFIX_DATA },
6389
    { "vpsubsw",  { XM, Vex, EXx }, PREFIX_DATA },
6390
    { "vpminsw",  { XM, Vex, EXx }, PREFIX_DATA },
6391
    { "vpor",   { XM, Vex, EXx }, PREFIX_DATA },
6392
    { "vpaddsb",  { XM, Vex, EXx }, PREFIX_DATA },
6393
    { "vpaddsw",  { XM, Vex, EXx }, PREFIX_DATA },
6394
    { "vpmaxsw",  { XM, Vex, EXx }, PREFIX_DATA },
6395
    { "vpxor",    { XM, Vex, EXx }, PREFIX_DATA },
6396
    /* f0 */
6397
    { PREFIX_TABLE (PREFIX_VEX_0FF0) },
6398
    { "vpsllw",   { XM, Vex, EXxmm }, PREFIX_DATA },
6399
    { "vpslld",   { XM, Vex, EXxmm }, PREFIX_DATA },
6400
    { "vpsllq",   { XM, Vex, EXxmm }, PREFIX_DATA },
6401
    { "vpmuludq", { XM, Vex, EXx }, PREFIX_DATA },
6402
    { "vpmaddwd", { XM, Vex, EXx }, PREFIX_DATA },
6403
    { "vpsadbw",  { XM, Vex, EXx }, PREFIX_DATA },
6404
    { VEX_LEN_TABLE (VEX_LEN_0FF7) },
6405
    /* f8 */
6406
    { "vpsubb",   { XM, Vex, EXx }, PREFIX_DATA },
6407
    { "vpsubw",   { XM, Vex, EXx }, PREFIX_DATA },
6408
    { "vpsubd",   { XM, Vex, EXx }, PREFIX_DATA },
6409
    { "vpsubq",   { XM, Vex, EXx }, PREFIX_DATA },
6410
    { "vpaddb",   { XM, Vex, EXx }, PREFIX_DATA },
6411
    { "vpaddw",   { XM, Vex, EXx }, PREFIX_DATA },
6412
    { "vpaddd",   { XM, Vex, EXx }, PREFIX_DATA },
6413
    { Bad_Opcode },
6414
  },
6415
  /* VEX_0F38 */
6416
  {
6417
    /* 00 */
6418
    { "vpshufb",  { XM, Vex, EXx }, PREFIX_DATA },
6419
    { "vphaddw",  { XM, Vex, EXx }, PREFIX_DATA },
6420
    { "vphaddd",  { XM, Vex, EXx }, PREFIX_DATA },
6421
    { "vphaddsw", { XM, Vex, EXx }, PREFIX_DATA },
6422
    { "vpmaddubsw", { XM, Vex, EXx }, PREFIX_DATA },
6423
    { "vphsubw",  { XM, Vex, EXx }, PREFIX_DATA },
6424
    { "vphsubd",  { XM, Vex, EXx }, PREFIX_DATA },
6425
    { "vphsubsw", { XM, Vex, EXx }, PREFIX_DATA },
6426
    /* 08 */
6427
    { "vpsignb",  { XM, Vex, EXx }, PREFIX_DATA },
6428
    { "vpsignw",  { XM, Vex, EXx }, PREFIX_DATA },
6429
    { "vpsignd",  { XM, Vex, EXx }, PREFIX_DATA },
6430
    { "vpmulhrsw",  { XM, Vex, EXx }, PREFIX_DATA },
6431
    { VEX_W_TABLE (VEX_W_0F380C) },
6432
    { VEX_W_TABLE (VEX_W_0F380D) },
6433
    { VEX_W_TABLE (VEX_W_0F380E) },
6434
    { VEX_W_TABLE (VEX_W_0F380F) },
6435
    /* 10 */
6436
    { Bad_Opcode },
6437
    { Bad_Opcode },
6438
    { Bad_Opcode },
6439
    { VEX_W_TABLE (VEX_W_0F3813) },
6440
    { Bad_Opcode },
6441
    { Bad_Opcode },
6442
    { VEX_LEN_TABLE (VEX_LEN_0F3816) },
6443
    { "vptest",   { XM, EXx }, PREFIX_DATA },
6444
    /* 18 */
6445
    { VEX_W_TABLE (VEX_W_0F3818) },
6446
    { VEX_LEN_TABLE (VEX_LEN_0F3819) },
6447
    { MOD_TABLE (MOD_VEX_0F381A) },
6448
    { Bad_Opcode },
6449
    { "vpabsb",   { XM, EXx }, PREFIX_DATA },
6450
    { "vpabsw",   { XM, EXx }, PREFIX_DATA },
6451
    { "vpabsd",   { XM, EXx }, PREFIX_DATA },
6452
    { Bad_Opcode },
6453
    /* 20 */
6454
    { "vpmovsxbw",  { XM, EXxmmq }, PREFIX_DATA },
6455
    { "vpmovsxbd",  { XM, EXxmmqd }, PREFIX_DATA },
6456
    { "vpmovsxbq",  { XM, EXxmmdw }, PREFIX_DATA },
6457
    { "vpmovsxwd",  { XM, EXxmmq }, PREFIX_DATA },
6458
    { "vpmovsxwq",  { XM, EXxmmqd }, PREFIX_DATA },
6459
    { "vpmovsxdq",  { XM, EXxmmq }, PREFIX_DATA },
6460
    { Bad_Opcode },
6461
    { Bad_Opcode },
6462
    /* 28 */
6463
    { "vpmuldq",  { XM, Vex, EXx }, PREFIX_DATA },
6464
    { "vpcmpeqq", { XM, Vex, EXx }, PREFIX_DATA },
6465
    { MOD_TABLE (MOD_VEX_0F382A) },
6466
    { "vpackusdw",  { XM, Vex, EXx }, PREFIX_DATA },
6467
    { MOD_TABLE (MOD_VEX_0F382C) },
6468
    { MOD_TABLE (MOD_VEX_0F382D) },
6469
    { MOD_TABLE (MOD_VEX_0F382E) },
6470
    { MOD_TABLE (MOD_VEX_0F382F) },
6471
    /* 30 */
6472
    { "vpmovzxbw",  { XM, EXxmmq }, PREFIX_DATA },
6473
    { "vpmovzxbd",  { XM, EXxmmqd }, PREFIX_DATA },
6474
    { "vpmovzxbq",  { XM, EXxmmdw }, PREFIX_DATA },
6475
    { "vpmovzxwd",  { XM, EXxmmq }, PREFIX_DATA },
6476
    { "vpmovzxwq",  { XM, EXxmmqd }, PREFIX_DATA },
6477
    { "vpmovzxdq",  { XM, EXxmmq }, PREFIX_DATA },
6478
    { VEX_LEN_TABLE (VEX_LEN_0F3836) },
6479
    { "vpcmpgtq", { XM, Vex, EXx }, PREFIX_DATA },
6480
    /* 38 */
6481
    { "vpminsb",  { XM, Vex, EXx }, PREFIX_DATA },
6482
    { "vpminsd",  { XM, Vex, EXx }, PREFIX_DATA },
6483
    { "vpminuw",  { XM, Vex, EXx }, PREFIX_DATA },
6484
    { "vpminud",  { XM, Vex, EXx }, PREFIX_DATA },
6485
    { "vpmaxsb",  { XM, Vex, EXx }, PREFIX_DATA },
6486
    { "vpmaxsd",  { XM, Vex, EXx }, PREFIX_DATA },
6487
    { "vpmaxuw",  { XM, Vex, EXx }, PREFIX_DATA },
6488
    { "vpmaxud",  { XM, Vex, EXx }, PREFIX_DATA },
6489
    /* 40 */
6490
    { "vpmulld",  { XM, Vex, EXx }, PREFIX_DATA },
6491
    { VEX_LEN_TABLE (VEX_LEN_0F3841) },
6492
    { Bad_Opcode },
6493
    { Bad_Opcode },
6494
    { Bad_Opcode },
6495
    { "vpsrlv%DQ", { XM, Vex, EXx }, PREFIX_DATA },
6496
    { VEX_W_TABLE (VEX_W_0F3846) },
6497
    { "vpsllv%DQ", { XM, Vex, EXx }, PREFIX_DATA },
6498
    /* 48 */
6499
    { Bad_Opcode },
6500
    { X86_64_TABLE (X86_64_VEX_0F3849) },
6501
    { Bad_Opcode },
6502
    { X86_64_TABLE (X86_64_VEX_0F384B) },
6503
    { Bad_Opcode },
6504
    { Bad_Opcode },
6505
    { Bad_Opcode },
6506
    { Bad_Opcode },
6507
    /* 50 */
6508
    { VEX_W_TABLE (VEX_W_0F3850) },
6509
    { VEX_W_TABLE (VEX_W_0F3851) },
6510
    { VEX_W_TABLE (VEX_W_0F3852) },
6511
    { VEX_W_TABLE (VEX_W_0F3853) },
6512
    { Bad_Opcode },
6513
    { Bad_Opcode },
6514
    { Bad_Opcode },
6515
    { Bad_Opcode },
6516
    /* 58 */
6517
    { VEX_W_TABLE (VEX_W_0F3858) },
6518
    { VEX_W_TABLE (VEX_W_0F3859) },
6519
    { MOD_TABLE (MOD_VEX_0F385A) },
6520
    { Bad_Opcode },
6521
    { X86_64_TABLE (X86_64_VEX_0F385C) },
6522
    { Bad_Opcode },
6523
    { X86_64_TABLE (X86_64_VEX_0F385E) },
6524
    { Bad_Opcode },
6525
    /* 60 */
6526
    { Bad_Opcode },
6527
    { Bad_Opcode },
6528
    { Bad_Opcode },
6529
    { Bad_Opcode },
6530
    { Bad_Opcode },
6531
    { Bad_Opcode },
6532
    { Bad_Opcode },
6533
    { Bad_Opcode },
6534
    /* 68 */
6535
    { Bad_Opcode },
6536
    { Bad_Opcode },
6537
    { Bad_Opcode },
6538
    { Bad_Opcode },
6539
    { X86_64_TABLE (X86_64_VEX_0F386C) },
6540
    { Bad_Opcode },
6541
    { Bad_Opcode },
6542
    { Bad_Opcode },
6543
    /* 70 */
6544
    { Bad_Opcode },
6545
    { Bad_Opcode },
6546
    { PREFIX_TABLE (PREFIX_VEX_0F3872) },
6547
    { Bad_Opcode },
6548
    { Bad_Opcode },
6549
    { Bad_Opcode },
6550
    { Bad_Opcode },
6551
    { Bad_Opcode },
6552
    /* 78 */
6553
    { VEX_W_TABLE (VEX_W_0F3878) },
6554
    { VEX_W_TABLE (VEX_W_0F3879) },
6555
    { Bad_Opcode },
6556
    { Bad_Opcode },
6557
    { Bad_Opcode },
6558
    { Bad_Opcode },
6559
    { Bad_Opcode },
6560
    { Bad_Opcode },
6561
    /* 80 */
6562
    { Bad_Opcode },
6563
    { Bad_Opcode },
6564
    { Bad_Opcode },
6565
    { Bad_Opcode },
6566
    { Bad_Opcode },
6567
    { Bad_Opcode },
6568
    { Bad_Opcode },
6569
    { Bad_Opcode },
6570
    /* 88 */
6571
    { Bad_Opcode },
6572
    { Bad_Opcode },
6573
    { Bad_Opcode },
6574
    { Bad_Opcode },
6575
    { MOD_TABLE (MOD_VEX_0F388C) },
6576
    { Bad_Opcode },
6577
    { MOD_TABLE (MOD_VEX_0F388E) },
6578
    { Bad_Opcode },
6579
    /* 90 */
6580
    { "vpgatherd%DQ", { XM, MVexVSIBDWpX, VexGatherD }, PREFIX_DATA },
6581
    { "vpgatherq%DQ", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, PREFIX_DATA },
6582
    { "vgatherdp%XW", { XM, MVexVSIBDWpX, VexGatherD }, PREFIX_DATA },
6583
    { "vgatherqp%XW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, PREFIX_DATA },
6584
    { Bad_Opcode },
6585
    { Bad_Opcode },
6586
    { "vfmaddsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6587
    { "vfmsubadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6588
    /* 98 */
6589
    { "vfmadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6590
    { "vfmadd132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6591
    { "vfmsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6592
    { "vfmsub132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6593
    { "vfnmadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6594
    { "vfnmadd132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6595
    { "vfnmsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6596
    { "vfnmsub132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6597
    /* a0 */
6598
    { Bad_Opcode },
6599
    { Bad_Opcode },
6600
    { Bad_Opcode },
6601
    { Bad_Opcode },
6602
    { Bad_Opcode },
6603
    { Bad_Opcode },
6604
    { "vfmaddsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6605
    { "vfmsubadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6606
    /* a8 */
6607
    { "vfmadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6608
    { "vfmadd213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6609
    { "vfmsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6610
    { "vfmsub213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6611
    { "vfnmadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6612
    { "vfnmadd213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6613
    { "vfnmsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6614
    { "vfnmsub213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6615
    /* b0 */
6616
    { VEX_W_TABLE (VEX_W_0F38B0) },
6617
    { VEX_W_TABLE (VEX_W_0F38B1) },
6618
    { Bad_Opcode },
6619
    { Bad_Opcode },
6620
    { VEX_W_TABLE (VEX_W_0F38B4) },
6621
    { VEX_W_TABLE (VEX_W_0F38B5) },
6622
    { "vfmaddsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6623
    { "vfmsubadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6624
    /* b8 */
6625
    { "vfmadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6626
    { "vfmadd231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6627
    { "vfmsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6628
    { "vfmsub231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6629
    { "vfnmadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6630
    { "vfnmadd231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6631
    { "vfnmsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6632
    { "vfnmsub231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6633
    /* c0 */
6634
    { Bad_Opcode },
6635
    { Bad_Opcode },
6636
    { Bad_Opcode },
6637
    { Bad_Opcode },
6638
    { Bad_Opcode },
6639
    { Bad_Opcode },
6640
    { Bad_Opcode },
6641
    { Bad_Opcode },
6642
    /* c8 */
6643
    { Bad_Opcode },
6644
    { Bad_Opcode },
6645
    { Bad_Opcode },
6646
    { Bad_Opcode },
6647
    { Bad_Opcode },
6648
    { Bad_Opcode },
6649
    { Bad_Opcode },
6650
    { VEX_W_TABLE (VEX_W_0F38CF) },
6651
    /* d0 */
6652
    { Bad_Opcode },
6653
    { Bad_Opcode },
6654
    { Bad_Opcode },
6655
    { Bad_Opcode },
6656
    { Bad_Opcode },
6657
    { Bad_Opcode },
6658
    { Bad_Opcode },
6659
    { Bad_Opcode },
6660
    /* d8 */
6661
    { Bad_Opcode },
6662
    { Bad_Opcode },
6663
    { Bad_Opcode },
6664
    { VEX_LEN_TABLE (VEX_LEN_0F38DB) },
6665
    { "vaesenc",  { XM, Vex, EXx }, PREFIX_DATA },
6666
    { "vaesenclast",  { XM, Vex, EXx }, PREFIX_DATA },
6667
    { "vaesdec",  { XM, Vex, EXx }, PREFIX_DATA },
6668
    { "vaesdeclast",  { XM, Vex, EXx }, PREFIX_DATA },
6669
    /* e0 */
6670
    { X86_64_TABLE (X86_64_VEX_0F38E0) },
6671
    { X86_64_TABLE (X86_64_VEX_0F38E1) },
6672
    { X86_64_TABLE (X86_64_VEX_0F38E2) },
6673
    { X86_64_TABLE (X86_64_VEX_0F38E3) },
6674
    { X86_64_TABLE (X86_64_VEX_0F38E4) },
6675
    { X86_64_TABLE (X86_64_VEX_0F38E5) },
6676
    { X86_64_TABLE (X86_64_VEX_0F38E6) },
6677
    { X86_64_TABLE (X86_64_VEX_0F38E7) },
6678
    /* e8 */
6679
    { X86_64_TABLE (X86_64_VEX_0F38E8) },
6680
    { X86_64_TABLE (X86_64_VEX_0F38E9) },
6681
    { X86_64_TABLE (X86_64_VEX_0F38EA) },
6682
    { X86_64_TABLE (X86_64_VEX_0F38EB) },
6683
    { X86_64_TABLE (X86_64_VEX_0F38EC) },
6684
    { X86_64_TABLE (X86_64_VEX_0F38ED) },
6685
    { X86_64_TABLE (X86_64_VEX_0F38EE) },
6686
    { X86_64_TABLE (X86_64_VEX_0F38EF) },
6687
    /* f0 */
6688
    { Bad_Opcode },
6689
    { Bad_Opcode },
6690
    { VEX_LEN_TABLE (VEX_LEN_0F38F2) },
6691
    { VEX_LEN_TABLE (VEX_LEN_0F38F3) },
6692
    { Bad_Opcode },
6693
    { VEX_LEN_TABLE (VEX_LEN_0F38F5) },
6694
    { VEX_LEN_TABLE (VEX_LEN_0F38F6) },
6695
    { VEX_LEN_TABLE (VEX_LEN_0F38F7) },
6696
    /* f8 */
6697
    { Bad_Opcode },
6698
    { Bad_Opcode },
6699
    { Bad_Opcode },
6700
    { Bad_Opcode },
6701
    { Bad_Opcode },
6702
    { Bad_Opcode },
6703
    { Bad_Opcode },
6704
    { Bad_Opcode },
6705
  },
6706
  /* VEX_0F3A */
6707
  {
6708
    /* 00 */
6709
    { VEX_LEN_TABLE (VEX_LEN_0F3A00) },
6710
    { VEX_LEN_TABLE (VEX_LEN_0F3A01) },
6711
    { VEX_W_TABLE (VEX_W_0F3A02) },
6712
    { Bad_Opcode },
6713
    { VEX_W_TABLE (VEX_W_0F3A04) },
6714
    { VEX_W_TABLE (VEX_W_0F3A05) },
6715
    { VEX_LEN_TABLE (VEX_LEN_0F3A06) },
6716
    { Bad_Opcode },
6717
    /* 08 */
6718
    { "vroundps", { XM, EXx, Ib }, PREFIX_DATA },
6719
    { "vroundpd", { XM, EXx, Ib }, PREFIX_DATA },
6720
    { "vroundss", { XMScalar, VexScalar, EXd, Ib }, PREFIX_DATA },
6721
    { "vroundsd", { XMScalar, VexScalar, EXq, Ib }, PREFIX_DATA },
6722
    { "vblendps", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6723
    { "vblendpd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6724
    { "vpblendw", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6725
    { "vpalignr", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6726
    /* 10 */
6727
    { Bad_Opcode },
6728
    { Bad_Opcode },
6729
    { Bad_Opcode },
6730
    { Bad_Opcode },
6731
    { VEX_LEN_TABLE (VEX_LEN_0F3A14) },
6732
    { VEX_LEN_TABLE (VEX_LEN_0F3A15) },
6733
    { VEX_LEN_TABLE (VEX_LEN_0F3A16) },
6734
    { VEX_LEN_TABLE (VEX_LEN_0F3A17) },
6735
    /* 18 */
6736
    { VEX_LEN_TABLE (VEX_LEN_0F3A18) },
6737
    { VEX_LEN_TABLE (VEX_LEN_0F3A19) },
6738
    { Bad_Opcode },
6739
    { Bad_Opcode },
6740
    { Bad_Opcode },
6741
    { VEX_W_TABLE (VEX_W_0F3A1D) },
6742
    { Bad_Opcode },
6743
    { Bad_Opcode },
6744
    /* 20 */
6745
    { VEX_LEN_TABLE (VEX_LEN_0F3A20) },
6746
    { VEX_LEN_TABLE (VEX_LEN_0F3A21) },
6747
    { VEX_LEN_TABLE (VEX_LEN_0F3A22) },
6748
    { Bad_Opcode },
6749
    { Bad_Opcode },
6750
    { Bad_Opcode },
6751
    { Bad_Opcode },
6752
    { Bad_Opcode },
6753
    /* 28 */
6754
    { Bad_Opcode },
6755
    { Bad_Opcode },
6756
    { Bad_Opcode },
6757
    { Bad_Opcode },
6758
    { Bad_Opcode },
6759
    { Bad_Opcode },
6760
    { Bad_Opcode },
6761
    { Bad_Opcode },
6762
    /* 30 */
6763
    { VEX_LEN_TABLE (VEX_LEN_0F3A30) },
6764
    { VEX_LEN_TABLE (VEX_LEN_0F3A31) },
6765
    { VEX_LEN_TABLE (VEX_LEN_0F3A32) },
6766
    { VEX_LEN_TABLE (VEX_LEN_0F3A33) },
6767
    { Bad_Opcode },
6768
    { Bad_Opcode },
6769
    { Bad_Opcode },
6770
    { Bad_Opcode },
6771
    /* 38 */
6772
    { VEX_LEN_TABLE (VEX_LEN_0F3A38) },
6773
    { VEX_LEN_TABLE (VEX_LEN_0F3A39) },
6774
    { Bad_Opcode },
6775
    { Bad_Opcode },
6776
    { Bad_Opcode },
6777
    { Bad_Opcode },
6778
    { Bad_Opcode },
6779
    { Bad_Opcode },
6780
    /* 40 */
6781
    { "vdpps",    { XM, Vex, EXx, Ib }, PREFIX_DATA },
6782
    { VEX_LEN_TABLE (VEX_LEN_0F3A41) },
6783
    { "vmpsadbw", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6784
    { Bad_Opcode },
6785
    { "vpclmulqdq", { XM, Vex, EXx, PCLMUL }, PREFIX_DATA },
6786
    { Bad_Opcode },
6787
    { VEX_LEN_TABLE (VEX_LEN_0F3A46) },
6788
    { Bad_Opcode },
6789
    /* 48 */
6790
    { "vpermil2ps", { XM, Vex, EXx, XMVexI4, VexI4 }, PREFIX_DATA },
6791
    { "vpermil2pd", { XM, Vex, EXx, XMVexI4, VexI4 }, PREFIX_DATA },
6792
    { VEX_W_TABLE (VEX_W_0F3A4A) },
6793
    { VEX_W_TABLE (VEX_W_0F3A4B) },
6794
    { VEX_W_TABLE (VEX_W_0F3A4C) },
6795
    { Bad_Opcode },
6796
    { Bad_Opcode },
6797
    { Bad_Opcode },
6798
    /* 50 */
6799
    { Bad_Opcode },
6800
    { Bad_Opcode },
6801
    { Bad_Opcode },
6802
    { Bad_Opcode },
6803
    { Bad_Opcode },
6804
    { Bad_Opcode },
6805
    { Bad_Opcode },
6806
    { Bad_Opcode },
6807
    /* 58 */
6808
    { Bad_Opcode },
6809
    { Bad_Opcode },
6810
    { Bad_Opcode },
6811
    { Bad_Opcode },
6812
    { "vfmaddsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6813
    { "vfmaddsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6814
    { "vfmsubaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6815
    { "vfmsubaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6816
    /* 60 */
6817
    { VEX_LEN_TABLE (VEX_LEN_0F3A60) },
6818
    { VEX_LEN_TABLE (VEX_LEN_0F3A61) },
6819
    { VEX_LEN_TABLE (VEX_LEN_0F3A62) },
6820
    { VEX_LEN_TABLE (VEX_LEN_0F3A63) },
6821
    { Bad_Opcode },
6822
    { Bad_Opcode },
6823
    { Bad_Opcode },
6824
    { Bad_Opcode },
6825
    /* 68 */
6826
    { "vfmaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6827
    { "vfmaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6828
    { "vfmaddss", { XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA },
6829
    { "vfmaddsd", { XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA },
6830
    { "vfmsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6831
    { "vfmsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6832
    { "vfmsubss", { XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA },
6833
    { "vfmsubsd", { XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA },
6834
    /* 70 */
6835
    { Bad_Opcode },
6836
    { Bad_Opcode },
6837
    { Bad_Opcode },
6838
    { Bad_Opcode },
6839
    { Bad_Opcode },
6840
    { Bad_Opcode },
6841
    { Bad_Opcode },
6842
    { Bad_Opcode },
6843
    /* 78 */
6844
    { "vfnmaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6845
    { "vfnmaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6846
    { "vfnmaddss",  { XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA },
6847
    { "vfnmaddsd",  { XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA },
6848
    { "vfnmsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6849
    { "vfnmsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6850
    { "vfnmsubss",  { XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA },
6851
    { "vfnmsubsd",  { XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA },
6852
    /* 80 */
6853
    { Bad_Opcode },
6854
    { Bad_Opcode },
6855
    { Bad_Opcode },
6856
    { Bad_Opcode },
6857
    { Bad_Opcode },
6858
    { Bad_Opcode },
6859
    { Bad_Opcode },
6860
    { Bad_Opcode },
6861
    /* 88 */
6862
    { Bad_Opcode },
6863
    { Bad_Opcode },
6864
    { Bad_Opcode },
6865
    { Bad_Opcode },
6866
    { Bad_Opcode },
6867
    { Bad_Opcode },
6868
    { Bad_Opcode },
6869
    { Bad_Opcode },
6870
    /* 90 */
6871
    { Bad_Opcode },
6872
    { Bad_Opcode },
6873
    { Bad_Opcode },
6874
    { Bad_Opcode },
6875
    { Bad_Opcode },
6876
    { Bad_Opcode },
6877
    { Bad_Opcode },
6878
    { Bad_Opcode },
6879
    /* 98 */
6880
    { Bad_Opcode },
6881
    { Bad_Opcode },
6882
    { Bad_Opcode },
6883
    { Bad_Opcode },
6884
    { Bad_Opcode },
6885
    { Bad_Opcode },
6886
    { Bad_Opcode },
6887
    { Bad_Opcode },
6888
    /* a0 */
6889
    { Bad_Opcode },
6890
    { Bad_Opcode },
6891
    { Bad_Opcode },
6892
    { Bad_Opcode },
6893
    { Bad_Opcode },
6894
    { Bad_Opcode },
6895
    { Bad_Opcode },
6896
    { Bad_Opcode },
6897
    /* a8 */
6898
    { Bad_Opcode },
6899
    { Bad_Opcode },
6900
    { Bad_Opcode },
6901
    { Bad_Opcode },
6902
    { Bad_Opcode },
6903
    { Bad_Opcode },
6904
    { Bad_Opcode },
6905
    { Bad_Opcode },
6906
    /* b0 */
6907
    { Bad_Opcode },
6908
    { Bad_Opcode },
6909
    { Bad_Opcode },
6910
    { Bad_Opcode },
6911
    { Bad_Opcode },
6912
    { Bad_Opcode },
6913
    { Bad_Opcode },
6914
    { Bad_Opcode },
6915
    /* b8 */
6916
    { Bad_Opcode },
6917
    { Bad_Opcode },
6918
    { Bad_Opcode },
6919
    { Bad_Opcode },
6920
    { Bad_Opcode },
6921
    { Bad_Opcode },
6922
    { Bad_Opcode },
6923
    { Bad_Opcode },
6924
    /* c0 */
6925
    { Bad_Opcode },
6926
    { Bad_Opcode },
6927
    { Bad_Opcode },
6928
    { Bad_Opcode },
6929
    { Bad_Opcode },
6930
    { Bad_Opcode },
6931
    { Bad_Opcode },
6932
    { Bad_Opcode },
6933
    /* c8 */
6934
    { Bad_Opcode },
6935
    { Bad_Opcode },
6936
    { Bad_Opcode },
6937
    { Bad_Opcode },
6938
    { Bad_Opcode },
6939
    { Bad_Opcode },
6940
    { VEX_W_TABLE (VEX_W_0F3ACE) },
6941
    { VEX_W_TABLE (VEX_W_0F3ACF) },
6942
    /* d0 */
6943
    { Bad_Opcode },
6944
    { Bad_Opcode },
6945
    { Bad_Opcode },
6946
    { Bad_Opcode },
6947
    { Bad_Opcode },
6948
    { Bad_Opcode },
6949
    { Bad_Opcode },
6950
    { Bad_Opcode },
6951
    /* d8 */
6952
    { Bad_Opcode },
6953
    { Bad_Opcode },
6954
    { Bad_Opcode },
6955
    { Bad_Opcode },
6956
    { Bad_Opcode },
6957
    { Bad_Opcode },
6958
    { Bad_Opcode },
6959
    { VEX_LEN_TABLE (VEX_LEN_0F3ADF) },
6960
    /* e0 */
6961
    { Bad_Opcode },
6962
    { Bad_Opcode },
6963
    { Bad_Opcode },
6964
    { Bad_Opcode },
6965
    { Bad_Opcode },
6966
    { Bad_Opcode },
6967
    { Bad_Opcode },
6968
    { Bad_Opcode },
6969
    /* e8 */
6970
    { Bad_Opcode },
6971
    { Bad_Opcode },
6972
    { Bad_Opcode },
6973
    { Bad_Opcode },
6974
    { Bad_Opcode },
6975
    { Bad_Opcode },
6976
    { Bad_Opcode },
6977
    { Bad_Opcode },
6978
    /* f0 */
6979
    { VEX_LEN_TABLE (VEX_LEN_0F3AF0) },
6980
    { Bad_Opcode },
6981
    { Bad_Opcode },
6982
    { Bad_Opcode },
6983
    { Bad_Opcode },
6984
    { Bad_Opcode },
6985
    { Bad_Opcode },
6986
    { Bad_Opcode },
6987
    /* f8 */
6988
    { Bad_Opcode },
6989
    { Bad_Opcode },
6990
    { Bad_Opcode },
6991
    { Bad_Opcode },
6992
    { Bad_Opcode },
6993
    { Bad_Opcode },
6994
    { Bad_Opcode },
6995
    { Bad_Opcode },
6996
  },
6997
};
6998
6999
#include "i386-dis-evex.h"
7000
7001
static const struct dis386 vex_len_table[][2] = {
7002
  /* VEX_LEN_0F12_P_0_M_0 / VEX_LEN_0F12_P_2_M_0 */
7003
  {
7004
    { "%XEvmovlpX", { XM, Vex, EXq }, 0 },
7005
  },
7006
7007
  /* VEX_LEN_0F12_P_0_M_1 */
7008
  {
7009
    { "%XEvmovhlp%XS",  { XM, Vex, EXq }, 0 },
7010
  },
7011
7012
  /* VEX_LEN_0F13_M_0 */
7013
  {
7014
    { "%XEvmovlpX", { EXq, XM }, PREFIX_OPCODE },
7015
  },
7016
7017
  /* VEX_LEN_0F16_P_0_M_0 / VEX_LEN_0F16_P_2_M_0 */
7018
  {
7019
    { "%XEvmovhpX", { XM, Vex, EXq }, 0 },
7020
  },
7021
7022
  /* VEX_LEN_0F16_P_0_M_1 */
7023
  {
7024
    { "%XEvmovlhp%XS",  { XM, Vex, EXq }, 0 },
7025
  },
7026
7027
  /* VEX_LEN_0F17_M_0 */
7028
  {
7029
    { "%XEvmovhpX", { EXq, XM }, PREFIX_OPCODE },
7030
  },
7031
7032
  /* VEX_LEN_0F41 */
7033
  {
7034
    { Bad_Opcode },
7035
    { MOD_TABLE (MOD_VEX_0F41_L_1) },
7036
  },
7037
7038
  /* VEX_LEN_0F42 */
7039
  {
7040
    { Bad_Opcode },
7041
    { MOD_TABLE (MOD_VEX_0F42_L_1) },
7042
  },
7043
7044
  /* VEX_LEN_0F44 */
7045
  {
7046
    { MOD_TABLE (MOD_VEX_0F44_L_0) },
7047
  },
7048
7049
  /* VEX_LEN_0F45 */
7050
  {
7051
    { Bad_Opcode },
7052
    { MOD_TABLE (MOD_VEX_0F45_L_1) },
7053
  },
7054
7055
  /* VEX_LEN_0F46 */
7056
  {
7057
    { Bad_Opcode },
7058
    { MOD_TABLE (MOD_VEX_0F46_L_1) },
7059
  },
7060
7061
  /* VEX_LEN_0F47 */
7062
  {
7063
    { Bad_Opcode },
7064
    { MOD_TABLE (MOD_VEX_0F47_L_1) },
7065
  },
7066
7067
  /* VEX_LEN_0F4A */
7068
  {
7069
    { Bad_Opcode },
7070
    { MOD_TABLE (MOD_VEX_0F4A_L_1) },
7071
  },
7072
7073
  /* VEX_LEN_0F4B */
7074
  {
7075
    { Bad_Opcode },
7076
    { MOD_TABLE (MOD_VEX_0F4B_L_1) },
7077
  },
7078
7079
  /* VEX_LEN_0F6E */
7080
  {
7081
    { "%XEvmovK", { XMScalar, Edq }, PREFIX_DATA },
7082
  },
7083
7084
  /* VEX_LEN_0F77 */
7085
  {
7086
    { "vzeroupper", { XX }, 0 },
7087
    { "vzeroall", { XX }, 0 },
7088
  },
7089
7090
  /* VEX_LEN_0F7E_P_1 */
7091
  {
7092
    { "%XEvmovq", { XMScalar, EXq }, 0 },
7093
  },
7094
7095
  /* VEX_LEN_0F7E_P_2 */
7096
  {
7097
    { "%XEvmovK", { Edq, XMScalar }, 0 },
7098
  },
7099
7100
  /* VEX_LEN_0F90 */
7101
  {
7102
    { VEX_W_TABLE (VEX_W_0F90_L_0) },
7103
  },
7104
7105
  /* VEX_LEN_0F91 */
7106
  {
7107
    { MOD_TABLE (MOD_VEX_0F91_L_0) },
7108
  },
7109
7110
  /* VEX_LEN_0F92 */
7111
  {
7112
    { MOD_TABLE (MOD_VEX_0F92_L_0) },
7113
  },
7114
7115
  /* VEX_LEN_0F93 */
7116
  {
7117
    { MOD_TABLE (MOD_VEX_0F93_L_0) },
7118
  },
7119
7120
  /* VEX_LEN_0F98 */
7121
  {
7122
    { MOD_TABLE (MOD_VEX_0F98_L_0) },
7123
  },
7124
7125
  /* VEX_LEN_0F99 */
7126
  {
7127
    { MOD_TABLE (MOD_VEX_0F99_L_0) },
7128
  },
7129
7130
  /* VEX_LEN_0FAE_R_2_M_0 */
7131
  {
7132
    { "vldmxcsr", { Md }, 0 },
7133
  },
7134
7135
  /* VEX_LEN_0FAE_R_3_M_0 */
7136
  {
7137
    { "vstmxcsr", { Md }, 0 },
7138
  },
7139
7140
  /* VEX_LEN_0FC4 */
7141
  {
7142
    { "%XEvpinsrw", { XM, Vex, Edw, Ib }, PREFIX_DATA },
7143
  },
7144
7145
  /* VEX_LEN_0FC5 */
7146
  {
7147
    { "%XEvpextrw", { Gd, XS, Ib }, PREFIX_DATA },
7148
  },
7149
7150
  /* VEX_LEN_0FD6 */
7151
  {
7152
    { "%XEvmovq", { EXqS, XMScalar }, PREFIX_DATA },
7153
  },
7154
7155
  /* VEX_LEN_0FF7 */
7156
  {
7157
    { "vmaskmovdqu",  { XM, XS }, PREFIX_DATA },
7158
  },
7159
7160
  /* VEX_LEN_0F3816 */
7161
  {
7162
    { Bad_Opcode },
7163
    { VEX_W_TABLE (VEX_W_0F3816_L_1) },
7164
  },
7165
7166
  /* VEX_LEN_0F3819 */
7167
  {
7168
    { Bad_Opcode },
7169
    { VEX_W_TABLE (VEX_W_0F3819_L_1) },
7170
  },
7171
7172
  /* VEX_LEN_0F381A_M_0 */
7173
  {
7174
    { Bad_Opcode },
7175
    { VEX_W_TABLE (VEX_W_0F381A_M_0_L_1) },
7176
  },
7177
7178
  /* VEX_LEN_0F3836 */
7179
  {
7180
    { Bad_Opcode },
7181
    { VEX_W_TABLE (VEX_W_0F3836) },
7182
  },
7183
7184
  /* VEX_LEN_0F3841 */
7185
  {
7186
    { "vphminposuw",  { XM, EXx }, PREFIX_DATA },
7187
  },
7188
7189
  /* VEX_LEN_0F3849_X86_64 */
7190
  {
7191
    { VEX_W_TABLE (VEX_W_0F3849_X86_64_L_0) },
7192
  },
7193
7194
  /* VEX_LEN_0F384B_X86_64 */
7195
  {
7196
    { VEX_W_TABLE (VEX_W_0F384B_X86_64_L_0) },
7197
  },
7198
7199
  /* VEX_LEN_0F385A_M_0 */
7200
  {
7201
    { Bad_Opcode },
7202
    { VEX_W_TABLE (VEX_W_0F385A_M_0_L_0) },
7203
  },
7204
7205
  /* VEX_LEN_0F385C_X86_64_M_1 */
7206
  {
7207
    { VEX_W_TABLE (VEX_W_0F385C_X86_64_M_1_L_0) },
7208
  },
7209
7210
  /* VEX_LEN_0F385E_X86_64_M_1 */
7211
  {
7212
    { VEX_W_TABLE (VEX_W_0F385E_X86_64_M_1_L_0) },
7213
  },
7214
7215
  /* VEX_LEN_0F386C_X86_64_M_1 */
7216
  {
7217
    { VEX_W_TABLE (VEX_W_0F386C_X86_64_M_1_L_0) },
7218
  },
7219
7220
  /* VEX_LEN_0F38DB */
7221
  {
7222
    { "vaesimc",  { XM, EXx }, PREFIX_DATA },
7223
  },
7224
7225
  /* VEX_LEN_0F38F2 */
7226
  {
7227
    { "andnS",    { Gdq, VexGdq, Edq }, PREFIX_OPCODE },
7228
  },
7229
7230
  /* VEX_LEN_0F38F3 */
7231
  {
7232
    { REG_TABLE(REG_VEX_0F38F3_L_0) },
7233
  },
7234
7235
  /* VEX_LEN_0F38F5 */
7236
  {
7237
    { PREFIX_TABLE(PREFIX_VEX_0F38F5_L_0) },
7238
  },
7239
7240
  /* VEX_LEN_0F38F6 */
7241
  {
7242
    { PREFIX_TABLE(PREFIX_VEX_0F38F6_L_0) },
7243
  },
7244
7245
  /* VEX_LEN_0F38F7 */
7246
  {
7247
    { PREFIX_TABLE(PREFIX_VEX_0F38F7_L_0) },
7248
  },
7249
7250
  /* VEX_LEN_0F3A00 */
7251
  {
7252
    { Bad_Opcode },
7253
    { VEX_W_TABLE (VEX_W_0F3A00_L_1) },
7254
  },
7255
7256
  /* VEX_LEN_0F3A01 */
7257
  {
7258
    { Bad_Opcode },
7259
    { VEX_W_TABLE (VEX_W_0F3A01_L_1) },
7260
  },
7261
7262
  /* VEX_LEN_0F3A06 */
7263
  {
7264
    { Bad_Opcode },
7265
    { VEX_W_TABLE (VEX_W_0F3A06_L_1) },
7266
  },
7267
7268
  /* VEX_LEN_0F3A14 */
7269
  {
7270
    { "%XEvpextrb", { Edb, XM, Ib }, PREFIX_DATA },
7271
  },
7272
7273
  /* VEX_LEN_0F3A15 */
7274
  {
7275
    { "%XEvpextrw", { Edw, XM, Ib }, PREFIX_DATA },
7276
  },
7277
7278
  /* VEX_LEN_0F3A16  */
7279
  {
7280
    { "%XEvpextrK", { Edq, XM, Ib }, PREFIX_DATA },
7281
  },
7282
7283
  /* VEX_LEN_0F3A17 */
7284
  {
7285
    { "%XEvextractps",  { Ed, XM, Ib }, PREFIX_DATA },
7286
  },
7287
7288
  /* VEX_LEN_0F3A18 */
7289
  {
7290
    { Bad_Opcode },
7291
    { VEX_W_TABLE (VEX_W_0F3A18_L_1) },
7292
  },
7293
7294
  /* VEX_LEN_0F3A19 */
7295
  {
7296
    { Bad_Opcode },
7297
    { VEX_W_TABLE (VEX_W_0F3A19_L_1) },
7298
  },
7299
7300
  /* VEX_LEN_0F3A20 */
7301
  {
7302
    { "%XEvpinsrb", { XM, Vex, Edb, Ib }, PREFIX_DATA },
7303
  },
7304
7305
  /* VEX_LEN_0F3A21 */
7306
  {
7307
    { "%XEvinsertps", { XM, Vex, EXd, Ib }, PREFIX_DATA },
7308
  },
7309
7310
  /* VEX_LEN_0F3A22 */
7311
  {
7312
    { "%XEvpinsrK", { XM, Vex, Edq, Ib }, PREFIX_DATA },
7313
  },
7314
7315
  /* VEX_LEN_0F3A30 */
7316
  {
7317
    { MOD_TABLE (MOD_VEX_0F3A30_L_0) },
7318
  },
7319
7320
  /* VEX_LEN_0F3A31 */
7321
  {
7322
    { MOD_TABLE (MOD_VEX_0F3A31_L_0) },
7323
  },
7324
7325
  /* VEX_LEN_0F3A32 */
7326
  {
7327
    { MOD_TABLE (MOD_VEX_0F3A32_L_0) },
7328
  },
7329
7330
  /* VEX_LEN_0F3A33 */
7331
  {
7332
    { MOD_TABLE (MOD_VEX_0F3A33_L_0) },
7333
  },
7334
7335
  /* VEX_LEN_0F3A38 */
7336
  {
7337
    { Bad_Opcode },
7338
    { VEX_W_TABLE (VEX_W_0F3A38_L_1) },
7339
  },
7340
7341
  /* VEX_LEN_0F3A39 */
7342
  {
7343
    { Bad_Opcode },
7344
    { VEX_W_TABLE (VEX_W_0F3A39_L_1) },
7345
  },
7346
7347
  /* VEX_LEN_0F3A41 */
7348
  {
7349
    { "vdppd",    { XM, Vex, EXx, Ib }, PREFIX_DATA },
7350
  },
7351
7352
  /* VEX_LEN_0F3A46 */
7353
  {
7354
    { Bad_Opcode },
7355
    { VEX_W_TABLE (VEX_W_0F3A46_L_1) },
7356
  },
7357
7358
  /* VEX_LEN_0F3A60 */
7359
  {
7360
    { "vpcmpestrm!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
7361
  },
7362
7363
  /* VEX_LEN_0F3A61 */
7364
  {
7365
    { "vpcmpestri!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
7366
  },
7367
7368
  /* VEX_LEN_0F3A62 */
7369
  {
7370
    { "vpcmpistrm", { XM, EXx, Ib }, PREFIX_DATA },
7371
  },
7372
7373
  /* VEX_LEN_0F3A63 */
7374
  {
7375
    { "vpcmpistri", { XM, EXx, Ib }, PREFIX_DATA },
7376
  },
7377
7378
  /* VEX_LEN_0F3ADF */
7379
  {
7380
    { "vaeskeygenassist", { XM, EXx, Ib }, PREFIX_DATA },
7381
  },
7382
7383
  /* VEX_LEN_0F3AF0 */
7384
  {
7385
    { PREFIX_TABLE (PREFIX_VEX_0F3AF0_L_0) },
7386
  },
7387
7388
  /* VEX_LEN_0FXOP_08_85 */
7389
  {
7390
    { VEX_W_TABLE (VEX_W_0FXOP_08_85_L_0) },
7391
  },
7392
7393
  /* VEX_LEN_0FXOP_08_86 */
7394
  {
7395
    { VEX_W_TABLE (VEX_W_0FXOP_08_86_L_0) },
7396
  },
7397
7398
  /* VEX_LEN_0FXOP_08_87 */
7399
  {
7400
    { VEX_W_TABLE (VEX_W_0FXOP_08_87_L_0) },
7401
  },
7402
7403
  /* VEX_LEN_0FXOP_08_8E */
7404
  {
7405
    { VEX_W_TABLE (VEX_W_0FXOP_08_8E_L_0) },
7406
  },
7407
7408
  /* VEX_LEN_0FXOP_08_8F */
7409
  {
7410
    { VEX_W_TABLE (VEX_W_0FXOP_08_8F_L_0) },
7411
  },
7412
7413
  /* VEX_LEN_0FXOP_08_95 */
7414
  {
7415
    { VEX_W_TABLE (VEX_W_0FXOP_08_95_L_0) },
7416
  },
7417
7418
  /* VEX_LEN_0FXOP_08_96 */
7419
  {
7420
    { VEX_W_TABLE (VEX_W_0FXOP_08_96_L_0) },
7421
  },
7422
7423
  /* VEX_LEN_0FXOP_08_97 */
7424
  {
7425
    { VEX_W_TABLE (VEX_W_0FXOP_08_97_L_0) },
7426
  },
7427
7428
  /* VEX_LEN_0FXOP_08_9E */
7429
  {
7430
    { VEX_W_TABLE (VEX_W_0FXOP_08_9E_L_0) },
7431
  },
7432
7433
  /* VEX_LEN_0FXOP_08_9F */
7434
  {
7435
    { VEX_W_TABLE (VEX_W_0FXOP_08_9F_L_0) },
7436
  },
7437
7438
  /* VEX_LEN_0FXOP_08_A3 */
7439
  {
7440
    { "vpperm",   { XM, Vex, EXx, XMVexI4 }, 0 },
7441
  },
7442
7443
  /* VEX_LEN_0FXOP_08_A6 */
7444
  {
7445
    { VEX_W_TABLE (VEX_W_0FXOP_08_A6_L_0) },
7446
  },
7447
7448
  /* VEX_LEN_0FXOP_08_B6 */
7449
  {
7450
    { VEX_W_TABLE (VEX_W_0FXOP_08_B6_L_0) },
7451
  },
7452
7453
  /* VEX_LEN_0FXOP_08_C0 */
7454
  {
7455
    { VEX_W_TABLE (VEX_W_0FXOP_08_C0_L_0) },
7456
  },
7457
7458
  /* VEX_LEN_0FXOP_08_C1 */
7459
  {
7460
    { VEX_W_TABLE (VEX_W_0FXOP_08_C1_L_0) },
7461
  },
7462
7463
  /* VEX_LEN_0FXOP_08_C2 */
7464
  {
7465
    { VEX_W_TABLE (VEX_W_0FXOP_08_C2_L_0) },
7466
  },
7467
7468
  /* VEX_LEN_0FXOP_08_C3 */
7469
  {
7470
    { VEX_W_TABLE (VEX_W_0FXOP_08_C3_L_0) },
7471
  },
7472
7473
  /* VEX_LEN_0FXOP_08_CC */
7474
  {
7475
    { VEX_W_TABLE (VEX_W_0FXOP_08_CC_L_0) },
7476
  },
7477
7478
  /* VEX_LEN_0FXOP_08_CD */
7479
  {
7480
    { VEX_W_TABLE (VEX_W_0FXOP_08_CD_L_0) },
7481
  },
7482
7483
  /* VEX_LEN_0FXOP_08_CE */
7484
  {
7485
    { VEX_W_TABLE (VEX_W_0FXOP_08_CE_L_0) },
7486
  },
7487
7488
  /* VEX_LEN_0FXOP_08_CF */
7489
  {
7490
    { VEX_W_TABLE (VEX_W_0FXOP_08_CF_L_0) },
7491
  },
7492
7493
  /* VEX_LEN_0FXOP_08_EC */
7494
  {
7495
    { VEX_W_TABLE (VEX_W_0FXOP_08_EC_L_0) },
7496
  },
7497
7498
  /* VEX_LEN_0FXOP_08_ED */
7499
  {
7500
    { VEX_W_TABLE (VEX_W_0FXOP_08_ED_L_0) },
7501
  },
7502
7503
  /* VEX_LEN_0FXOP_08_EE */
7504
  {
7505
    { VEX_W_TABLE (VEX_W_0FXOP_08_EE_L_0) },
7506
  },
7507
7508
  /* VEX_LEN_0FXOP_08_EF */
7509
  {
7510
    { VEX_W_TABLE (VEX_W_0FXOP_08_EF_L_0) },
7511
  },
7512
7513
  /* VEX_LEN_0FXOP_09_01 */
7514
  {
7515
    { REG_TABLE (REG_XOP_09_01_L_0) },
7516
  },
7517
7518
  /* VEX_LEN_0FXOP_09_02 */
7519
  {
7520
    { REG_TABLE (REG_XOP_09_02_L_0) },
7521
  },
7522
7523
  /* VEX_LEN_0FXOP_09_12_M_1 */
7524
  {
7525
    { REG_TABLE (REG_XOP_09_12_M_1_L_0) },
7526
  },
7527
7528
  /* VEX_LEN_0FXOP_09_82_W_0 */
7529
  {
7530
    { "vfrczss",  { XM, EXd }, 0 },
7531
  },
7532
7533
  /* VEX_LEN_0FXOP_09_83_W_0 */
7534
  {
7535
    { "vfrczsd",  { XM, EXq }, 0 },
7536
  },
7537
7538
  /* VEX_LEN_0FXOP_09_90 */
7539
  {
7540
    { "vprotb",   { XM, EXx, VexW }, 0 },
7541
  },
7542
7543
  /* VEX_LEN_0FXOP_09_91 */
7544
  {
7545
    { "vprotw",   { XM, EXx, VexW }, 0 },
7546
  },
7547
7548
  /* VEX_LEN_0FXOP_09_92 */
7549
  {
7550
    { "vprotd",   { XM, EXx, VexW }, 0 },
7551
  },
7552
7553
  /* VEX_LEN_0FXOP_09_93 */
7554
  {
7555
    { "vprotq",   { XM, EXx, VexW }, 0 },
7556
  },
7557
7558
  /* VEX_LEN_0FXOP_09_94 */
7559
  {
7560
    { "vpshlb",   { XM, EXx, VexW }, 0 },
7561
  },
7562
7563
  /* VEX_LEN_0FXOP_09_95 */
7564
  {
7565
    { "vpshlw",   { XM, EXx, VexW }, 0 },
7566
  },
7567
7568
  /* VEX_LEN_0FXOP_09_96 */
7569
  {
7570
    { "vpshld",   { XM, EXx, VexW }, 0 },
7571
  },
7572
7573
  /* VEX_LEN_0FXOP_09_97 */
7574
  {
7575
    { "vpshlq",   { XM, EXx, VexW }, 0 },
7576
  },
7577
7578
  /* VEX_LEN_0FXOP_09_98 */
7579
  {
7580
    { "vpshab",   { XM, EXx, VexW }, 0 },
7581
  },
7582
7583
  /* VEX_LEN_0FXOP_09_99 */
7584
  {
7585
    { "vpshaw",   { XM, EXx, VexW }, 0 },
7586
  },
7587
7588
  /* VEX_LEN_0FXOP_09_9A */
7589
  {
7590
    { "vpshad",   { XM, EXx, VexW }, 0 },
7591
  },
7592
7593
  /* VEX_LEN_0FXOP_09_9B */
7594
  {
7595
    { "vpshaq",   { XM, EXx, VexW }, 0 },
7596
  },
7597
7598
  /* VEX_LEN_0FXOP_09_C1 */
7599
  {
7600
    { VEX_W_TABLE (VEX_W_0FXOP_09_C1_L_0) },
7601
  },
7602
7603
  /* VEX_LEN_0FXOP_09_C2 */
7604
  {
7605
    { VEX_W_TABLE (VEX_W_0FXOP_09_C2_L_0) },
7606
  },
7607
7608
  /* VEX_LEN_0FXOP_09_C3 */
7609
  {
7610
    { VEX_W_TABLE (VEX_W_0FXOP_09_C3_L_0) },
7611
  },
7612
7613
  /* VEX_LEN_0FXOP_09_C6 */
7614
  {
7615
    { VEX_W_TABLE (VEX_W_0FXOP_09_C6_L_0) },
7616
  },
7617
7618
  /* VEX_LEN_0FXOP_09_C7 */
7619
  {
7620
    { VEX_W_TABLE (VEX_W_0FXOP_09_C7_L_0) },
7621
  },
7622
7623
  /* VEX_LEN_0FXOP_09_CB */
7624
  {
7625
    { VEX_W_TABLE (VEX_W_0FXOP_09_CB_L_0) },
7626
  },
7627
7628
  /* VEX_LEN_0FXOP_09_D1 */
7629
  {
7630
    { VEX_W_TABLE (VEX_W_0FXOP_09_D1_L_0) },
7631
  },
7632
7633
  /* VEX_LEN_0FXOP_09_D2 */
7634
  {
7635
    { VEX_W_TABLE (VEX_W_0FXOP_09_D2_L_0) },
7636
  },
7637
7638
  /* VEX_LEN_0FXOP_09_D3 */
7639
  {
7640
    { VEX_W_TABLE (VEX_W_0FXOP_09_D3_L_0) },
7641
  },
7642
7643
  /* VEX_LEN_0FXOP_09_D6 */
7644
  {
7645
    { VEX_W_TABLE (VEX_W_0FXOP_09_D6_L_0) },
7646
  },
7647
7648
  /* VEX_LEN_0FXOP_09_D7 */
7649
  {
7650
    { VEX_W_TABLE (VEX_W_0FXOP_09_D7_L_0) },
7651
  },
7652
7653
  /* VEX_LEN_0FXOP_09_DB */
7654
  {
7655
    { VEX_W_TABLE (VEX_W_0FXOP_09_DB_L_0) },
7656
  },
7657
7658
  /* VEX_LEN_0FXOP_09_E1 */
7659
  {
7660
    { VEX_W_TABLE (VEX_W_0FXOP_09_E1_L_0) },
7661
  },
7662
7663
  /* VEX_LEN_0FXOP_09_E2 */
7664
  {
7665
    { VEX_W_TABLE (VEX_W_0FXOP_09_E2_L_0) },
7666
  },
7667
7668
  /* VEX_LEN_0FXOP_09_E3 */
7669
  {
7670
    { VEX_W_TABLE (VEX_W_0FXOP_09_E3_L_0) },
7671
  },
7672
7673
  /* VEX_LEN_0FXOP_0A_12 */
7674
  {
7675
    { REG_TABLE (REG_XOP_0A_12_L_0) },
7676
  },
7677
};
7678
7679
#include "i386-dis-evex-len.h"
7680
7681
static const struct dis386 vex_w_table[][2] = {
7682
  {
7683
    /* VEX_W_0F41_L_1_M_1 */
7684
    { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_M_1_W_0) },
7685
    { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_M_1_W_1) },
7686
  },
7687
  {
7688
    /* VEX_W_0F42_L_1_M_1 */
7689
    { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_M_1_W_0) },
7690
    { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_M_1_W_1) },
7691
  },
7692
  {
7693
    /* VEX_W_0F44_L_0_M_1 */
7694
    { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_M_1_W_0) },
7695
    { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_M_1_W_1) },
7696
  },
7697
  {
7698
    /* VEX_W_0F45_L_1_M_1 */
7699
    { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_M_1_W_0) },
7700
    { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_M_1_W_1) },
7701
  },
7702
  {
7703
    /* VEX_W_0F46_L_1_M_1 */
7704
    { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_M_1_W_0) },
7705
    { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_M_1_W_1) },
7706
  },
7707
  {
7708
    /* VEX_W_0F47_L_1_M_1 */
7709
    { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_M_1_W_0) },
7710
    { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_M_1_W_1) },
7711
  },
7712
  {
7713
    /* VEX_W_0F4A_L_1_M_1 */
7714
    { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_M_1_W_0) },
7715
    { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_M_1_W_1) },
7716
  },
7717
  {
7718
    /* VEX_W_0F4B_L_1_M_1 */
7719
    { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_M_1_W_0) },
7720
    { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_M_1_W_1) },
7721
  },
7722
  {
7723
    /* VEX_W_0F90_L_0 */
7724
    { PREFIX_TABLE (PREFIX_VEX_0F90_L_0_W_0) },
7725
    { PREFIX_TABLE (PREFIX_VEX_0F90_L_0_W_1) },
7726
  },
7727
  {
7728
    /* VEX_W_0F91_L_0_M_0 */
7729
    { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_M_0_W_0) },
7730
    { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_M_0_W_1) },
7731
  },
7732
  {
7733
    /* VEX_W_0F92_L_0_M_1 */
7734
    { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_M_1_W_0) },
7735
    { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_M_1_W_1) },
7736
  },
7737
  {
7738
    /* VEX_W_0F93_L_0_M_1 */
7739
    { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_M_1_W_0) },
7740
    { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_M_1_W_1) },
7741
  },
7742
  {
7743
    /* VEX_W_0F98_L_0_M_1 */
7744
    { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_M_1_W_0) },
7745
    { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_M_1_W_1) },
7746
  },
7747
  {
7748
    /* VEX_W_0F99_L_0_M_1 */
7749
    { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_M_1_W_0) },
7750
    { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_M_1_W_1) },
7751
  },
7752
  {
7753
    /* VEX_W_0F380C  */
7754
    { "%XEvpermilps", { XM, Vex, EXx }, PREFIX_DATA },
7755
  },
7756
  {
7757
    /* VEX_W_0F380D  */
7758
    { "vpermilpd",  { XM, Vex, EXx }, PREFIX_DATA },
7759
  },
7760
  {
7761
    /* VEX_W_0F380E  */
7762
    { "vtestps",  { XM, EXx }, PREFIX_DATA },
7763
  },
7764
  {
7765
    /* VEX_W_0F380F  */
7766
    { "vtestpd",  { XM, EXx }, PREFIX_DATA },
7767
  },
7768
  {
7769
    /* VEX_W_0F3813 */
7770
    { "vcvtph2ps", { XM, EXxmmq }, PREFIX_DATA },
7771
  },
7772
  {
7773
    /* VEX_W_0F3816_L_1  */
7774
    { "vpermps",  { XM, Vex, EXx }, PREFIX_DATA },
7775
  },
7776
  {
7777
    /* VEX_W_0F3818 */
7778
    { "%XEvbroadcastss",  { XM, EXd }, PREFIX_DATA },
7779
  },
7780
  {
7781
    /* VEX_W_0F3819_L_1 */
7782
    { "vbroadcastsd", { XM, EXq }, PREFIX_DATA },
7783
  },
7784
  {
7785
    /* VEX_W_0F381A_M_0_L_1 */
7786
    { "vbroadcastf128", { XM, Mxmm }, PREFIX_DATA },
7787
  },
7788
  {
7789
    /* VEX_W_0F382C_M_0 */
7790
    { "vmaskmovps", { XM, Vex, Mx }, PREFIX_DATA },
7791
  },
7792
  {
7793
    /* VEX_W_0F382D_M_0 */
7794
    { "vmaskmovpd", { XM, Vex, Mx }, PREFIX_DATA },
7795
  },
7796
  {
7797
    /* VEX_W_0F382E_M_0 */
7798
    { "vmaskmovps", { Mx, Vex, XM }, PREFIX_DATA },
7799
  },
7800
  {
7801
    /* VEX_W_0F382F_M_0 */
7802
    { "vmaskmovpd", { Mx, Vex, XM }, PREFIX_DATA },
7803
  },
7804
  {
7805
    /* VEX_W_0F3836  */
7806
    { "vpermd",   { XM, Vex, EXx }, PREFIX_DATA },
7807
  },
7808
  {
7809
    /* VEX_W_0F3846 */
7810
    { "vpsravd",  { XM, Vex, EXx }, PREFIX_DATA },
7811
  },
7812
  {
7813
    /* VEX_W_0F3849_X86_64_L_0 */
7814
    { MOD_TABLE (MOD_VEX_0F3849_X86_64_L_0_W_0) },
7815
  },
7816
  {
7817
    /* VEX_W_0F384B_X86_64_L_0 */
7818
    { MOD_TABLE (MOD_VEX_0F384B_X86_64_L_0_W_0) },
7819
  },
7820
  {
7821
    /* VEX_W_0F3850 */
7822
    { PREFIX_TABLE (PREFIX_VEX_0F3850_W_0) },
7823
  },
7824
  {
7825
    /* VEX_W_0F3851 */
7826
    { PREFIX_TABLE (PREFIX_VEX_0F3851_W_0) },
7827
  },
7828
  {
7829
    /* VEX_W_0F3852 */
7830
    { "%XVvpdpwssd",  { XM, Vex, EXx }, PREFIX_DATA },
7831
  },
7832
  {
7833
    /* VEX_W_0F3853 */
7834
    { "%XVvpdpwssds", { XM, Vex, EXx }, PREFIX_DATA },
7835
  },
7836
  {
7837
    /* VEX_W_0F3858 */
7838
    { "%XEvpbroadcastd", { XM, EXd }, PREFIX_DATA },
7839
  },
7840
  {
7841
    /* VEX_W_0F3859 */
7842
    { "vpbroadcastq", { XM, EXq }, PREFIX_DATA },
7843
  },
7844
  {
7845
    /* VEX_W_0F385A_M_0_L_0 */
7846
    { "vbroadcasti128", { XM, Mxmm }, PREFIX_DATA },
7847
  },
7848
  {
7849
    /* VEX_W_0F385C_X86_64_M_1_L_0 */
7850
    { PREFIX_TABLE (PREFIX_VEX_0F385C_X86_64_M_1_L_0_W_0) },
7851
  },
7852
  {
7853
    /* VEX_W_0F385E_X86_64_M_1_L_0 */
7854
    { PREFIX_TABLE (PREFIX_VEX_0F385E_X86_64_M_1_L_0_W_0) },
7855
  },
7856
  {
7857
    /* VEX_W_0F386C_X86_64_M_1_L_0 */
7858
    { PREFIX_TABLE (PREFIX_VEX_0F386C_X86_64_M_1_L_0_W_0) },
7859
  },
7860
  {
7861
    /* VEX_W_0F3872_P_1 */
7862
    { "%XVvcvtneps2bf16%XY", { XMM, EXx }, 0 },
7863
  },
7864
  {
7865
    /* VEX_W_0F3878 */
7866
    { "%XEvpbroadcastb",  { XM, EXb }, PREFIX_DATA },
7867
  },
7868
  {
7869
    /* VEX_W_0F3879 */
7870
    { "%XEvpbroadcastw",  { XM, EXw }, PREFIX_DATA },
7871
  },
7872
  {
7873
    /* VEX_W_0F38B0 */
7874
    { PREFIX_TABLE (PREFIX_VEX_0F38B0_W_0) },
7875
  },
7876
  {
7877
    /* VEX_W_0F38B1 */
7878
    { PREFIX_TABLE (PREFIX_VEX_0F38B1_W_0) },
7879
  },
7880
  {
7881
    /* VEX_W_0F38B4 */
7882
    { Bad_Opcode },
7883
    { "%XVvpmadd52luq", { XM, Vex, EXx }, PREFIX_DATA },
7884
  },
7885
  {
7886
    /* VEX_W_0F38B5 */
7887
    { Bad_Opcode },
7888
    { "%XVvpmadd52huq", { XM, Vex, EXx }, PREFIX_DATA },
7889
  },
7890
  {
7891
    /* VEX_W_0F38CF */
7892
    { "%XEvgf2p8mulb", { XM, Vex, EXx }, PREFIX_DATA },
7893
  },
7894
  {
7895
    /* VEX_W_0F3A00_L_1 */
7896
    { Bad_Opcode },
7897
    { "%XEvpermq",    { XM, EXx, Ib }, PREFIX_DATA },
7898
  },
7899
  {
7900
    /* VEX_W_0F3A01_L_1 */
7901
    { Bad_Opcode },
7902
    { "%XEvpermpd", { XM, EXx, Ib }, PREFIX_DATA },
7903
  },
7904
  {
7905
    /* VEX_W_0F3A02 */
7906
    { "vpblendd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
7907
  },
7908
  {
7909
    /* VEX_W_0F3A04 */
7910
    { "%XEvpermilps", { XM, EXx, Ib }, PREFIX_DATA },
7911
  },
7912
  {
7913
    /* VEX_W_0F3A05 */
7914
    { "vpermilpd",  { XM, EXx, Ib }, PREFIX_DATA },
7915
  },
7916
  {
7917
    /* VEX_W_0F3A06_L_1 */
7918
    { "vperm2f128", { XM, Vex, EXx, Ib }, PREFIX_DATA },
7919
  },
7920
  {
7921
    /* VEX_W_0F3A18_L_1 */
7922
    { "vinsertf128",  { XM, Vex, EXxmm, Ib }, PREFIX_DATA },
7923
  },
7924
  {
7925
    /* VEX_W_0F3A19_L_1 */
7926
    { "vextractf128", { EXxmm, XM, Ib }, PREFIX_DATA },
7927
  },
7928
  {
7929
    /* VEX_W_0F3A1D */
7930
    { "%XEvcvtps2ph", { EXxmmq, XM, EXxEVexS, Ib }, PREFIX_DATA },
7931
  },
7932
  {
7933
    /* VEX_W_0F3A38_L_1 */
7934
    { "vinserti128",  { XM, Vex, EXxmm, Ib }, PREFIX_DATA },
7935
  },
7936
  {
7937
    /* VEX_W_0F3A39_L_1 */
7938
    { "vextracti128", { EXxmm, XM, Ib }, PREFIX_DATA },
7939
  },
7940
  {
7941
    /* VEX_W_0F3A46_L_1 */
7942
    { "vperm2i128", { XM, Vex, EXx, Ib }, PREFIX_DATA },
7943
  },
7944
  {
7945
    /* VEX_W_0F3A4A */
7946
    { "vblendvps",  { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7947
  },
7948
  {
7949
    /* VEX_W_0F3A4B */
7950
    { "vblendvpd",  { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7951
  },
7952
  {
7953
    /* VEX_W_0F3A4C */
7954
    { "vpblendvb",  { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7955
  },
7956
  {
7957
    /* VEX_W_0F3ACE */
7958
    { Bad_Opcode },
7959
    { "%XEvgf2p8affineqb", { XM, Vex, EXx, Ib }, PREFIX_DATA },
7960
  },
7961
  {
7962
    /* VEX_W_0F3ACF */
7963
    { Bad_Opcode },
7964
    { "%XEvgf2p8affineinvqb",  { XM, Vex, EXx, Ib }, PREFIX_DATA },
7965
  },
7966
  /* VEX_W_0FXOP_08_85_L_0 */
7967
  {
7968
    { "vpmacssww",  { XM, Vex, EXx, XMVexI4 }, 0 },
7969
  },
7970
  /* VEX_W_0FXOP_08_86_L_0 */
7971
  {
7972
    { "vpmacsswd",  { XM, Vex, EXx, XMVexI4 }, 0 },
7973
  },
7974
  /* VEX_W_0FXOP_08_87_L_0 */
7975
  {
7976
    { "vpmacssdql",   { XM, Vex, EXx, XMVexI4 }, 0 },
7977
  },
7978
  /* VEX_W_0FXOP_08_8E_L_0 */
7979
  {
7980
    { "vpmacssdd",  { XM, Vex, EXx, XMVexI4 }, 0 },
7981
  },
7982
  /* VEX_W_0FXOP_08_8F_L_0 */
7983
  {
7984
    { "vpmacssdqh",   { XM, Vex, EXx, XMVexI4 }, 0 },
7985
  },
7986
  /* VEX_W_0FXOP_08_95_L_0 */
7987
  {
7988
    { "vpmacsww",   { XM, Vex, EXx, XMVexI4 }, 0 },
7989
  },
7990
  /* VEX_W_0FXOP_08_96_L_0 */
7991
  {
7992
    { "vpmacswd",   { XM, Vex, EXx, XMVexI4 }, 0 },
7993
  },
7994
  /* VEX_W_0FXOP_08_97_L_0 */
7995
  {
7996
    { "vpmacsdql",  { XM, Vex, EXx, XMVexI4 }, 0 },
7997
  },
7998
  /* VEX_W_0FXOP_08_9E_L_0 */
7999
  {
8000
    { "vpmacsdd",   { XM, Vex, EXx, XMVexI4 }, 0 },
8001
  },
8002
  /* VEX_W_0FXOP_08_9F_L_0 */
8003
  {
8004
    { "vpmacsdqh",  { XM, Vex, EXx, XMVexI4 }, 0 },
8005
  },
8006
  /* VEX_W_0FXOP_08_A6_L_0 */
8007
  {
8008
    { "vpmadcsswd",   { XM, Vex, EXx, XMVexI4 }, 0 },
8009
  },
8010
  /* VEX_W_0FXOP_08_B6_L_0 */
8011
  {
8012
    { "vpmadcswd",  { XM, Vex, EXx, XMVexI4 }, 0 },
8013
  },
8014
  /* VEX_W_0FXOP_08_C0_L_0 */
8015
  {
8016
    { "vprotb",   { XM, EXx, Ib }, 0 },
8017
  },
8018
  /* VEX_W_0FXOP_08_C1_L_0 */
8019
  {
8020
    { "vprotw",   { XM, EXx, Ib }, 0 },
8021
  },
8022
  /* VEX_W_0FXOP_08_C2_L_0 */
8023
  {
8024
    { "vprotd",   { XM, EXx, Ib }, 0 },
8025
  },
8026
  /* VEX_W_0FXOP_08_C3_L_0 */
8027
  {
8028
    { "vprotq",   { XM, EXx, Ib }, 0 },
8029
  },
8030
  /* VEX_W_0FXOP_08_CC_L_0 */
8031
  {
8032
     { "vpcomb",  { XM, Vex, EXx, VPCOM }, 0 },
8033
  },
8034
  /* VEX_W_0FXOP_08_CD_L_0 */
8035
  {
8036
     { "vpcomw",  { XM, Vex, EXx, VPCOM }, 0 },
8037
  },
8038
  /* VEX_W_0FXOP_08_CE_L_0 */
8039
  {
8040
     { "vpcomd",  { XM, Vex, EXx, VPCOM }, 0 },
8041
  },
8042
  /* VEX_W_0FXOP_08_CF_L_0 */
8043
  {
8044
     { "vpcomq",  { XM, Vex, EXx, VPCOM }, 0 },
8045
  },
8046
  /* VEX_W_0FXOP_08_EC_L_0 */
8047
  {
8048
     { "vpcomub", { XM, Vex, EXx, VPCOM }, 0 },
8049
  },
8050
  /* VEX_W_0FXOP_08_ED_L_0 */
8051
  {
8052
     { "vpcomuw", { XM, Vex, EXx, VPCOM }, 0 },
8053
  },
8054
  /* VEX_W_0FXOP_08_EE_L_0 */
8055
  {
8056
     { "vpcomud", { XM, Vex, EXx, VPCOM }, 0 },
8057
  },
8058
  /* VEX_W_0FXOP_08_EF_L_0 */
8059
  {
8060
     { "vpcomuq", { XM, Vex, EXx, VPCOM }, 0 },
8061
  },
8062
  /* VEX_W_0FXOP_09_80 */
8063
  {
8064
    { "vfrczps",  { XM, EXx }, 0 },
8065
  },
8066
  /* VEX_W_0FXOP_09_81 */
8067
  {
8068
    { "vfrczpd",  { XM, EXx }, 0 },
8069
  },
8070
  /* VEX_W_0FXOP_09_82 */
8071
  {
8072
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_82_W_0) },
8073
  },
8074
  /* VEX_W_0FXOP_09_83 */
8075
  {
8076
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_83_W_0) },
8077
  },
8078
  /* VEX_W_0FXOP_09_C1_L_0 */
8079
  {
8080
    { "vphaddbw", { XM, EXxmm }, 0 },
8081
  },
8082
  /* VEX_W_0FXOP_09_C2_L_0 */
8083
  {
8084
    { "vphaddbd", { XM, EXxmm }, 0 },
8085
  },
8086
  /* VEX_W_0FXOP_09_C3_L_0 */
8087
  {
8088
    { "vphaddbq", { XM, EXxmm }, 0 },
8089
  },
8090
  /* VEX_W_0FXOP_09_C6_L_0 */
8091
  {
8092
    { "vphaddwd", { XM, EXxmm }, 0 },
8093
  },
8094
  /* VEX_W_0FXOP_09_C7_L_0 */
8095
  {
8096
    { "vphaddwq", { XM, EXxmm }, 0 },
8097
  },
8098
  /* VEX_W_0FXOP_09_CB_L_0 */
8099
  {
8100
    { "vphadddq", { XM, EXxmm }, 0 },
8101
  },
8102
  /* VEX_W_0FXOP_09_D1_L_0 */
8103
  {
8104
    { "vphaddubw",  { XM, EXxmm }, 0 },
8105
  },
8106
  /* VEX_W_0FXOP_09_D2_L_0 */
8107
  {
8108
    { "vphaddubd",  { XM, EXxmm }, 0 },
8109
  },
8110
  /* VEX_W_0FXOP_09_D3_L_0 */
8111
  {
8112
    { "vphaddubq",  { XM, EXxmm }, 0 },
8113
  },
8114
  /* VEX_W_0FXOP_09_D6_L_0 */
8115
  {
8116
    { "vphadduwd",  { XM, EXxmm }, 0 },
8117
  },
8118
  /* VEX_W_0FXOP_09_D7_L_0 */
8119
  {
8120
    { "vphadduwq",  { XM, EXxmm }, 0 },
8121
  },
8122
  /* VEX_W_0FXOP_09_DB_L_0 */
8123
  {
8124
    { "vphaddudq",  { XM, EXxmm }, 0 },
8125
  },
8126
  /* VEX_W_0FXOP_09_E1_L_0 */
8127
  {
8128
    { "vphsubbw", { XM, EXxmm }, 0 },
8129
  },
8130
  /* VEX_W_0FXOP_09_E2_L_0 */
8131
  {
8132
    { "vphsubwd", { XM, EXxmm }, 0 },
8133
  },
8134
  /* VEX_W_0FXOP_09_E3_L_0 */
8135
  {
8136
    { "vphsubdq", { XM, EXxmm }, 0 },
8137
  },
8138
8139
#include "i386-dis-evex-w.h"
8140
};
8141
8142
static const struct dis386 mod_table[][2] = {
8143
  {
8144
    /* MOD_62_32BIT */
8145
    { "bound{S|}",  { Gv, Ma }, 0 },
8146
    { EVEX_TABLE (EVEX_0F) },
8147
  },
8148
  {
8149
    /* MOD_8D */
8150
    { "leaS",   { Gv, M }, 0 },
8151
  },
8152
  {
8153
    /* MOD_C4_32BIT */
8154
    { "lesS",   { Gv, Mp }, 0 },
8155
    { VEX_C4_TABLE (VEX_0F) },
8156
  },
8157
  {
8158
    /* MOD_C5_32BIT */
8159
    { "ldsS",   { Gv, Mp }, 0 },
8160
    { VEX_C5_TABLE (VEX_0F) },
8161
  },
8162
  {
8163
    /* MOD_C6_REG_7 */
8164
    { Bad_Opcode },
8165
    { RM_TABLE (RM_C6_REG_7) },
8166
  },
8167
  {
8168
    /* MOD_C7_REG_7 */
8169
    { Bad_Opcode },
8170
    { RM_TABLE (RM_C7_REG_7) },
8171
  },
8172
  {
8173
    /* MOD_FF_REG_3 */
8174
    { "{l|}call^", { indirEp }, 0 },
8175
  },
8176
  {
8177
    /* MOD_FF_REG_5 */
8178
    { "{l|}jmp^", { indirEp }, 0 },
8179
  },
8180
  {
8181
    /* MOD_0F01_REG_0 */
8182
    { X86_64_TABLE (X86_64_0F01_REG_0) },
8183
    { RM_TABLE (RM_0F01_REG_0) },
8184
  },
8185
  {
8186
    /* MOD_0F01_REG_1 */
8187
    { X86_64_TABLE (X86_64_0F01_REG_1) },
8188
    { RM_TABLE (RM_0F01_REG_1) },
8189
  },
8190
  {
8191
    /* MOD_0F01_REG_2 */
8192
    { X86_64_TABLE (X86_64_0F01_REG_2) },
8193
    { RM_TABLE (RM_0F01_REG_2) },
8194
  },
8195
  {
8196
    /* MOD_0F01_REG_3 */
8197
    { X86_64_TABLE (X86_64_0F01_REG_3) },
8198
    { RM_TABLE (RM_0F01_REG_3) },
8199
  },
8200
  {
8201
    /* MOD_0F01_REG_5 */
8202
    { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_0) },
8203
    { RM_TABLE (RM_0F01_REG_5_MOD_3) },
8204
  },
8205
  {
8206
    /* MOD_0F01_REG_7 */
8207
    { "invlpg",   { Mb }, 0 },
8208
    { RM_TABLE (RM_0F01_REG_7_MOD_3) },
8209
  },
8210
  {
8211
    /* MOD_0F02 */
8212
    { "larS",   { Gv, Mw }, 0 },
8213
    { "larS",   { Gv, Ev }, 0 },
8214
  },
8215
  {
8216
    /* MOD_0F03 */
8217
    { "lslS",   { Gv, Mw }, 0 },
8218
    { "lslS",   { Gv, Ev }, 0 },
8219
  },
8220
  {
8221
    /* MOD_0F12_PREFIX_0 */
8222
    { "movlpX",   { XM, EXq }, 0 },
8223
    { "movhlps",  { XM, EXq }, 0 },
8224
  },
8225
  {
8226
    /* MOD_0F12_PREFIX_2 */
8227
    { "movlpX", { XM, EXq }, 0 },
8228
  },
8229
  {
8230
    /* MOD_0F13 */
8231
    { "movlpX",   { EXq, XM }, PREFIX_OPCODE },
8232
  },
8233
  {
8234
    /* MOD_0F16_PREFIX_0 */
8235
    { "movhpX",   { XM, EXq }, 0 },
8236
    { "movlhps",  { XM, EXq }, 0 },
8237
  },
8238
  {
8239
    /* MOD_0F16_PREFIX_2 */
8240
    { "movhpX", { XM, EXq }, 0 },
8241
  },
8242
  {
8243
    /* MOD_0F17 */
8244
    { "movhpX",   { EXq, XM }, PREFIX_OPCODE },
8245
  },
8246
  {
8247
    /* MOD_0F18_REG_0 */
8248
    { "prefetchnta",  { Mb }, 0 },
8249
    { "nopQ",   { Ev }, 0 },
8250
  },
8251
  {
8252
    /* MOD_0F18_REG_1 */
8253
    { "prefetcht0", { Mb }, 0 },
8254
    { "nopQ",   { Ev }, 0 },
8255
  },
8256
  {
8257
    /* MOD_0F18_REG_2 */
8258
    { "prefetcht1", { Mb }, 0 },
8259
    { "nopQ",   { Ev }, 0 },
8260
  },
8261
  {
8262
    /* MOD_0F18_REG_3 */
8263
    { "prefetcht2", { Mb }, 0 },
8264
    { "nopQ",   { Ev }, 0 },
8265
  },
8266
  {
8267
    /* MOD_0F18_REG_6 */
8268
    { X86_64_TABLE (X86_64_0F18_REG_6_MOD_0) },
8269
    { "nopQ",   { Ev }, 0 },
8270
  },
8271
  {
8272
    /* MOD_0F18_REG_7 */
8273
    { X86_64_TABLE (X86_64_0F18_REG_7_MOD_0) },
8274
    { "nopQ",   { Ev }, 0 },
8275
  },
8276
  {
8277
    /* MOD_0F1A_PREFIX_0 */
8278
    { "bndldx",   { Gbnd, Mv_bnd }, 0 },
8279
    { "nopQ",   { Ev }, 0 },
8280
  },
8281
  {
8282
    /* MOD_0F1B_PREFIX_0 */
8283
    { "bndstx",   { Mv_bnd, Gbnd }, 0 },
8284
    { "nopQ",   { Ev }, 0 },
8285
  },
8286
  {
8287
    /* MOD_0F1B_PREFIX_1 */
8288
    { "bndmk",    { Gbnd, Mv_bnd }, 0 },
8289
    { "nopQ",   { Ev }, PREFIX_IGNORED },
8290
  },
8291
  {
8292
    /* MOD_0F1C_PREFIX_0 */
8293
    { REG_TABLE (REG_0F1C_P_0_MOD_0) },
8294
    { "nopQ",   { Ev }, 0 },
8295
  },
8296
  {
8297
    /* MOD_0F1E_PREFIX_1 */
8298
    { "nopQ",   { Ev }, PREFIX_IGNORED },
8299
    { REG_TABLE (REG_0F1E_P_1_MOD_3) },
8300
  },
8301
  {
8302
    /* MOD_0F2B_PREFIX_0 */
8303
    {"movntps",   { Mx, XM }, PREFIX_OPCODE },
8304
  },
8305
  {
8306
    /* MOD_0F2B_PREFIX_1 */
8307
    {"movntss",   { Md, XM }, PREFIX_OPCODE },
8308
  },
8309
  {
8310
    /* MOD_0F2B_PREFIX_2 */
8311
    {"movntpd",   { Mx, XM }, PREFIX_OPCODE },
8312
  },
8313
  {
8314
    /* MOD_0F2B_PREFIX_3 */
8315
    {"movntsd",   { Mq, XM }, PREFIX_OPCODE },
8316
  },
8317
  {
8318
    /* MOD_0F50 */
8319
    { Bad_Opcode },
8320
    { "movmskpX", { Gdq, XS }, PREFIX_OPCODE },
8321
  },
8322
  {
8323
    /* MOD_0F71 */
8324
    { Bad_Opcode },
8325
    { REG_TABLE (REG_0F71_MOD_0) },
8326
  },
8327
  {
8328
    /* MOD_0F72 */
8329
    { Bad_Opcode },
8330
    { REG_TABLE (REG_0F72_MOD_0) },
8331
  },
8332
  {
8333
    /* MOD_0F73 */
8334
    { Bad_Opcode },
8335
    { REG_TABLE (REG_0F73_MOD_0) },
8336
  },
8337
  {
8338
    /* MOD_0FAE_REG_0 */
8339
    { "fxsave",   { FXSAVE }, 0 },
8340
    { PREFIX_TABLE (PREFIX_0FAE_REG_0_MOD_3) },
8341
  },
8342
  {
8343
    /* MOD_0FAE_REG_1 */
8344
    { "fxrstor",  { FXSAVE }, 0 },
8345
    { PREFIX_TABLE (PREFIX_0FAE_REG_1_MOD_3) },
8346
  },
8347
  {
8348
    /* MOD_0FAE_REG_2 */
8349
    { "ldmxcsr",  { Md }, 0 },
8350
    { PREFIX_TABLE (PREFIX_0FAE_REG_2_MOD_3) },
8351
  },
8352
  {
8353
    /* MOD_0FAE_REG_3 */
8354
    { "stmxcsr",  { Md }, 0 },
8355
    { PREFIX_TABLE (PREFIX_0FAE_REG_3_MOD_3) },
8356
  },
8357
  {
8358
    /* MOD_0FAE_REG_4 */
8359
    { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_0) },
8360
    { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_3) },
8361
  },
8362
  {
8363
    /* MOD_0FAE_REG_5 */
8364
    { "xrstor",   { FXSAVE }, PREFIX_OPCODE },
8365
    { PREFIX_TABLE (PREFIX_0FAE_REG_5_MOD_3) },
8366
  },
8367
  {
8368
    /* MOD_0FAE_REG_6 */
8369
    { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_0) },
8370
    { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_3) },
8371
  },
8372
  {
8373
    /* MOD_0FAE_REG_7 */
8374
    { PREFIX_TABLE (PREFIX_0FAE_REG_7_MOD_0) },
8375
    { RM_TABLE (RM_0FAE_REG_7_MOD_3) },
8376
  },
8377
  {
8378
    /* MOD_0FB2 */
8379
    { "lssS",   { Gv, Mp }, 0 },
8380
  },
8381
  {
8382
    /* MOD_0FB4 */
8383
    { "lfsS",   { Gv, Mp }, 0 },
8384
  },
8385
  {
8386
    /* MOD_0FB5 */
8387
    { "lgsS",   { Gv, Mp }, 0 },
8388
  },
8389
  {
8390
    /* MOD_0FC3 */
8391
    { "movntiS", { Edq, Gdq }, PREFIX_OPCODE },
8392
  },
8393
  {
8394
    /* MOD_0FC7_REG_3 */
8395
    { "xrstors",  { FXSAVE }, 0 },
8396
  },
8397
  {
8398
    /* MOD_0FC7_REG_4 */
8399
    { "xsavec",   { FXSAVE }, 0 },
8400
  },
8401
  {
8402
    /* MOD_0FC7_REG_5 */
8403
    { "xsaves",   { FXSAVE }, 0 },
8404
  },
8405
  {
8406
    /* MOD_0FC7_REG_6 */
8407
    { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_0) },
8408
    { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_3) }
8409
  },
8410
  {
8411
    /* MOD_0FC7_REG_7 */
8412
    { "vmptrst",  { Mq }, 0 },
8413
    { PREFIX_TABLE (PREFIX_0FC7_REG_7_MOD_3) }
8414
  },
8415
  {
8416
    /* MOD_0FD7 */
8417
    { Bad_Opcode },
8418
    { "pmovmskb", { Gdq, MS }, 0 },
8419
  },
8420
  {
8421
    /* MOD_0FE7_PREFIX_2 */
8422
    { "movntdq",  { Mx, XM }, 0 },
8423
  },
8424
  {
8425
    /* MOD_0FF0_PREFIX_3 */
8426
    { "lddqu",    { XM, M }, 0 },
8427
  },
8428
  {
8429
    /* MOD_0F382A */
8430
    { "movntdqa", { XM, Mx }, PREFIX_DATA },
8431
  },
8432
  {
8433
    /* MOD_0F38DC_PREFIX_1 */
8434
    { "aesenc128kl",    { XM, M }, 0 },
8435
    { "loadiwkey",      { XM, EXx }, 0 },
8436
  },
8437
  {
8438
    /* MOD_0F38DD_PREFIX_1 */
8439
    { "aesdec128kl",    { XM, M }, 0 },
8440
  },
8441
  {
8442
    /* MOD_0F38DE_PREFIX_1 */
8443
    { "aesenc256kl",    { XM, M }, 0 },
8444
  },
8445
  {
8446
    /* MOD_0F38DF_PREFIX_1 */
8447
    { "aesdec256kl",    { XM, M }, 0 },
8448
  },
8449
  {
8450
    /* MOD_0F38F5 */
8451
    { "wrussK",   { M, Gdq }, PREFIX_DATA },
8452
  },
8453
  {
8454
    /* MOD_0F38F6_PREFIX_0 */
8455
    { "wrssK",    { M, Gdq }, PREFIX_OPCODE },
8456
  },
8457
  {
8458
    /* MOD_0F38F8_PREFIX_1 */
8459
    { "enqcmds",  { Gva, M }, PREFIX_OPCODE },
8460
  },
8461
  {
8462
    /* MOD_0F38F8_PREFIX_2 */
8463
    { "movdir64b",  { Gva, M }, PREFIX_OPCODE },
8464
  },
8465
  {
8466
    /* MOD_0F38F8_PREFIX_3 */
8467
    { "enqcmd",   { Gva, M }, PREFIX_OPCODE },
8468
  },
8469
  {
8470
    /* MOD_0F38F9 */
8471
    { "movdiri",  { Edq, Gdq }, PREFIX_OPCODE },
8472
  },
8473
  {
8474
    /* MOD_0F38FA_PREFIX_1 */
8475
    { Bad_Opcode },
8476
    { "encodekey128", { Gd, Ed }, 0 },
8477
  },
8478
  {
8479
    /* MOD_0F38FB_PREFIX_1 */
8480
    { Bad_Opcode },
8481
    { "encodekey256", { Gd, Ed }, 0 },
8482
  },
8483
  {
8484
    /* MOD_0F3A0F_PREFIX_1 */
8485
    { Bad_Opcode },
8486
    { REG_TABLE (REG_0F3A0F_PREFIX_1_MOD_3) },
8487
  },
8488
  {
8489
    /* MOD_VEX_0F12_PREFIX_0 */
8490
    { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0) },
8491
    { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1) },
8492
  },
8493
  {
8494
    /* MOD_VEX_0F12_PREFIX_2 */
8495
    { VEX_LEN_TABLE (VEX_LEN_0F12_P_2_M_0) },
8496
  },
8497
  {
8498
    /* MOD_VEX_0F13 */
8499
    { VEX_LEN_TABLE (VEX_LEN_0F13_M_0) },
8500
  },
8501
  {
8502
    /* MOD_VEX_0F16_PREFIX_0 */
8503
    { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0) },
8504
    { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1) },
8505
  },
8506
  {
8507
    /* MOD_VEX_0F16_PREFIX_2 */
8508
    { VEX_LEN_TABLE (VEX_LEN_0F16_P_2_M_0) },
8509
  },
8510
  {
8511
    /* MOD_VEX_0F17 */
8512
    { VEX_LEN_TABLE (VEX_LEN_0F17_M_0) },
8513
  },
8514
  {
8515
    /* MOD_VEX_0F2B */
8516
    { "%XEvmovntpX",  { Mx, XM }, PREFIX_OPCODE },
8517
  },
8518
  {
8519
    /* MOD_VEX_0F41_L_1 */
8520
    { Bad_Opcode },
8521
    { VEX_W_TABLE (VEX_W_0F41_L_1_M_1) },
8522
  },
8523
  {
8524
    /* MOD_VEX_0F42_L_1 */
8525
    { Bad_Opcode },
8526
    { VEX_W_TABLE (VEX_W_0F42_L_1_M_1) },
8527
  },
8528
  {
8529
    /* MOD_VEX_0F44_L_0 */
8530
    { Bad_Opcode },
8531
    { VEX_W_TABLE (VEX_W_0F44_L_0_M_1) },
8532
  },
8533
  {
8534
    /* MOD_VEX_0F45_L_1 */
8535
    { Bad_Opcode },
8536
    { VEX_W_TABLE (VEX_W_0F45_L_1_M_1) },
8537
  },
8538
  {
8539
    /* MOD_VEX_0F46_L_1 */
8540
    { Bad_Opcode },
8541
    { VEX_W_TABLE (VEX_W_0F46_L_1_M_1) },
8542
  },
8543
  {
8544
    /* MOD_VEX_0F47_L_1 */
8545
    { Bad_Opcode },
8546
    { VEX_W_TABLE (VEX_W_0F47_L_1_M_1) },
8547
  },
8548
  {
8549
    /* MOD_VEX_0F4A_L_1 */
8550
    { Bad_Opcode },
8551
    { VEX_W_TABLE (VEX_W_0F4A_L_1_M_1) },
8552
  },
8553
  {
8554
    /* MOD_VEX_0F4B_L_1 */
8555
    { Bad_Opcode },
8556
    { VEX_W_TABLE (VEX_W_0F4B_L_1_M_1) },
8557
  },
8558
  {
8559
    /* MOD_VEX_0F50 */
8560
    { Bad_Opcode },
8561
    { "vmovmskpX",  { Gdq, XS }, PREFIX_OPCODE },
8562
  },
8563
  {
8564
    /* MOD_VEX_0F71 */
8565
    { Bad_Opcode },
8566
    { REG_TABLE (REG_VEX_0F71_M_0) },
8567
  },
8568
  {
8569
    /* MOD_VEX_0F72 */
8570
    { Bad_Opcode },
8571
    { REG_TABLE (REG_VEX_0F72_M_0) },
8572
  },
8573
  {
8574
    /* MOD_VEX_0F73 */
8575
    { Bad_Opcode },
8576
    { REG_TABLE (REG_VEX_0F73_M_0) },
8577
  },
8578
  {
8579
    /* MOD_VEX_0F91_L_0 */
8580
    { VEX_W_TABLE (VEX_W_0F91_L_0_M_0) },
8581
  },
8582
  {
8583
    /* MOD_VEX_0F92_L_0 */
8584
    { Bad_Opcode },
8585
    { VEX_W_TABLE (VEX_W_0F92_L_0_M_1) },
8586
  },
8587
  {
8588
    /* MOD_VEX_0F93_L_0 */
8589
    { Bad_Opcode },
8590
    { VEX_W_TABLE (VEX_W_0F93_L_0_M_1) },
8591
  },
8592
  {
8593
    /* MOD_VEX_0F98_L_0 */
8594
    { Bad_Opcode },
8595
    { VEX_W_TABLE (VEX_W_0F98_L_0_M_1) },
8596
  },
8597
  {
8598
    /* MOD_VEX_0F99_L_0 */
8599
    { Bad_Opcode },
8600
    { VEX_W_TABLE (VEX_W_0F99_L_0_M_1) },
8601
  },
8602
  {
8603
    /* MOD_VEX_0FAE_REG_2 */
8604
    { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0) },
8605
  },
8606
  {
8607
    /* MOD_VEX_0FAE_REG_3 */
8608
    { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0) },
8609
  },
8610
  {
8611
    /* MOD_VEX_0FD7 */
8612
    { Bad_Opcode },
8613
    { "vpmovmskb",  { Gdq, XS }, PREFIX_DATA },
8614
  },
8615
  {
8616
    /* MOD_VEX_0FE7 */
8617
    { "vmovntdq", { Mx, XM }, PREFIX_DATA },
8618
  },
8619
  {
8620
    /* MOD_VEX_0FF0_PREFIX_3 */
8621
    { "vlddqu",   { XM, M }, 0 },
8622
  },
8623
  {
8624
    /* MOD_VEX_0F381A */
8625
    { VEX_LEN_TABLE (VEX_LEN_0F381A_M_0) },
8626
  },
8627
  {
8628
    /* MOD_VEX_0F382A */
8629
    { "vmovntdqa",  { XM, Mx }, PREFIX_DATA },
8630
  },
8631
  {
8632
    /* MOD_VEX_0F382C */
8633
    { VEX_W_TABLE (VEX_W_0F382C_M_0) },
8634
  },
8635
  {
8636
    /* MOD_VEX_0F382D */
8637
    { VEX_W_TABLE (VEX_W_0F382D_M_0) },
8638
  },
8639
  {
8640
    /* MOD_VEX_0F382E */
8641
    { VEX_W_TABLE (VEX_W_0F382E_M_0) },
8642
  },
8643
  {
8644
    /* MOD_VEX_0F382F */
8645
    { VEX_W_TABLE (VEX_W_0F382F_M_0) },
8646
  },
8647
  {
8648
    /* MOD_VEX_0F3849_X86_64_L_0_W_0 */
8649
    { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_0) },
8650
    { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_1) },
8651
  },
8652
  {
8653
    /* MOD_VEX_0F384B_X86_64_L_0_W_0 */
8654
    { PREFIX_TABLE (PREFIX_VEX_0F384B_X86_64_L_0_W_0_M_0) },
8655
  },
8656
  {
8657
    /* MOD_VEX_0F385A */
8658
    { VEX_LEN_TABLE (VEX_LEN_0F385A_M_0) },
8659
  },
8660
  {
8661
    /* MOD_VEX_0F385C_X86_64 */
8662
    { Bad_Opcode },
8663
    { VEX_LEN_TABLE (VEX_LEN_0F385C_X86_64_M_1) },
8664
  },
8665
  {
8666
    /* MOD_VEX_0F385E_X86_64 */
8667
    { Bad_Opcode },
8668
    { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_M_1) },
8669
  },
8670
  {
8671
    /* MOD_VEX_0F386C_X86_64 */
8672
    { Bad_Opcode },
8673
    { VEX_LEN_TABLE (VEX_LEN_0F386C_X86_64_M_1) },
8674
  },
8675
  {
8676
    /* MOD_VEX_0F388C */
8677
    { "vpmaskmov%DQ", { XM, Vex, Mx }, PREFIX_DATA },
8678
  },
8679
  {
8680
    /* MOD_VEX_0F388E */
8681
    { "vpmaskmov%DQ", { Mx, Vex, XM }, PREFIX_DATA },
8682
  },
8683
  {
8684
    /* MOD_VEX_0F3A30_L_0 */
8685
    { Bad_Opcode },
8686
    { "kshiftr%BW", { MaskG, MaskE, Ib }, PREFIX_DATA },
8687
  },
8688
  {
8689
    /* MOD_VEX_0F3A31_L_0 */
8690
    { Bad_Opcode },
8691
    { "kshiftr%DQ", { MaskG, MaskE, Ib }, PREFIX_DATA },
8692
  },
8693
  {
8694
    /* MOD_VEX_0F3A32_L_0 */
8695
    { Bad_Opcode },
8696
    { "kshiftl%BW", { MaskG, MaskE, Ib }, PREFIX_DATA },
8697
  },
8698
  {
8699
    /* MOD_VEX_0F3A33_L_0 */
8700
    { Bad_Opcode },
8701
    { "kshiftl%DQ", { MaskG, MaskE, Ib }, PREFIX_DATA },
8702
  },
8703
  {
8704
    /* MOD_XOP_09_12 */
8705
    { Bad_Opcode },
8706
    { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_12_M_1) },
8707
  },
8708
8709
#include "i386-dis-evex-mod.h"
8710
};
8711
8712
static const struct dis386 rm_table[][8] = {
8713
  {
8714
    /* RM_C6_REG_7 */
8715
    { "xabort",   { Skip_MODRM, Ib }, 0 },
8716
  },
8717
  {
8718
    /* RM_C7_REG_7 */
8719
    { "xbeginT",  { Skip_MODRM, Jdqw }, 0 },
8720
  },
8721
  {
8722
    /* RM_0F01_REG_0 */
8723
    { "enclv",    { Skip_MODRM }, 0 },
8724
    { "vmcall",   { Skip_MODRM }, 0 },
8725
    { "vmlaunch", { Skip_MODRM }, 0 },
8726
    { "vmresume", { Skip_MODRM }, 0 },
8727
    { "vmxoff",   { Skip_MODRM }, 0 },
8728
    { "pconfig",  { Skip_MODRM }, 0 },
8729
    { PREFIX_TABLE (PREFIX_0F01_REG_0_MOD_3_RM_6) },
8730
  },
8731
  {
8732
    /* RM_0F01_REG_1 */
8733
    { "monitor",  { { OP_Monitor, 0 } }, 0 },
8734
    { "mwait",    { { OP_Mwait, 0 } }, 0 },
8735
    { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_2) },
8736
    { "stac",   { Skip_MODRM }, 0 },
8737
    { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_4) },
8738
    { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_5) },
8739
    { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_6) },
8740
    { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_7) },
8741
  },
8742
  {
8743
    /* RM_0F01_REG_2 */
8744
    { "xgetbv",   { Skip_MODRM }, 0 },
8745
    { "xsetbv",   { Skip_MODRM }, 0 },
8746
    { Bad_Opcode },
8747
    { Bad_Opcode },
8748
    { "vmfunc",   { Skip_MODRM }, 0 },
8749
    { "xend",   { Skip_MODRM }, 0 },
8750
    { "xtest",    { Skip_MODRM }, 0 },
8751
    { "enclu",    { Skip_MODRM }, 0 },
8752
  },
8753
  {
8754
    /* RM_0F01_REG_3 */
8755
    { "vmrun",    { Skip_MODRM }, 0 },
8756
    { PREFIX_TABLE (PREFIX_0F01_REG_3_RM_1) },
8757
    { "vmload",   { Skip_MODRM }, 0 },
8758
    { "vmsave",   { Skip_MODRM }, 0 },
8759
    { "stgi",   { Skip_MODRM }, 0 },
8760
    { "clgi",   { Skip_MODRM }, 0 },
8761
    { "skinit",   { Skip_MODRM }, 0 },
8762
    { "invlpga",  { Skip_MODRM }, 0 },
8763
  },
8764
  {
8765
    /* RM_0F01_REG_5_MOD_3 */
8766
    { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_0) },
8767
    { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_1) },
8768
    { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_2) },
8769
    { Bad_Opcode },
8770
    { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_4) },
8771
    { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_5) },
8772
    { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_6) },
8773
    { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_7) },
8774
  },
8775
  {
8776
    /* RM_0F01_REG_7_MOD_3 */
8777
    { "swapgs",   { Skip_MODRM }, 0  },
8778
    { "rdtscp",   { Skip_MODRM }, 0  },
8779
    { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_2) },
8780
    { "mwaitx",   { { OP_Mwait, eBX_reg } }, PREFIX_OPCODE },
8781
    { "clzero",   { Skip_MODRM }, 0  },
8782
    { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_5) },
8783
    { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_6) },
8784
    { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_7) },
8785
  },
8786
  {
8787
    /* RM_0F1E_P_1_MOD_3_REG_7 */
8788
    { "nopQ",   { Ev }, PREFIX_IGNORED },
8789
    { "nopQ",   { Ev }, PREFIX_IGNORED },
8790
    { "endbr64",  { Skip_MODRM }, 0 },
8791
    { "endbr32",  { Skip_MODRM }, 0 },
8792
    { "nopQ",   { Ev }, PREFIX_IGNORED },
8793
    { "nopQ",   { Ev }, PREFIX_IGNORED },
8794
    { "nopQ",   { Ev }, PREFIX_IGNORED },
8795
    { "nopQ",   { Ev }, PREFIX_IGNORED },
8796
  },
8797
  {
8798
    /* RM_0FAE_REG_6_MOD_3 */
8799
    { "mfence",   { Skip_MODRM }, 0 },
8800
  },
8801
  {
8802
    /* RM_0FAE_REG_7_MOD_3 */
8803
    { "sfence",   { Skip_MODRM }, 0 },
8804
  },
8805
  {
8806
    /* RM_0F3A0F_P_1_MOD_3_REG_0 */
8807
    { "hreset",   { Skip_MODRM, Ib }, 0 },
8808
  },
8809
  {
8810
    /* RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0_R_0 */
8811
    { "tilerelease",  { Skip_MODRM }, 0 },
8812
  },
8813
  {
8814
    /* RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_3 */
8815
    { "tilezero", { TMM, Skip_MODRM }, 0 },
8816
  },
8817
};
8818
8819
0
#define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
8820
8821
/* The values used here must be non-zero, fit in 'unsigned char', and not be
8822
   in conflict with actual prefix opcodes.  */
8823
2.36k
#define REP_PREFIX  0x01
8824
3.96k
#define XACQUIRE_PREFIX 0x02
8825
3.58k
#define XRELEASE_PREFIX 0x03
8826
5.62k
#define BND_PREFIX  0x04
8827
4.19k
#define NOTRACK_PREFIX  0x05
8828
8829
static enum {
8830
  ckp_okay,
8831
  ckp_bogus,
8832
  ckp_fetch_error,
8833
}
8834
ckprefix (instr_info *ins)
8835
9.89M
{
8836
9.89M
  int i, length;
8837
9.89M
  uint8_t newrex;
8838
8839
9.89M
  i = 0;
8840
9.89M
  length = 0;
8841
  /* The maximum instruction length is 15bytes.  */
8842
11.3M
  while (length < MAX_CODE_LENGTH - 1)
8843
11.3M
    {
8844
11.3M
      if (!fetch_code (ins->info, ins->codep + 1))
8845
1.81k
  return ckp_fetch_error;
8846
11.3M
      newrex = 0;
8847
11.3M
      switch (*ins->codep)
8848
11.3M
  {
8849
  /* REX prefixes family.  */
8850
31.6k
  case 0x40:
8851
143k
  case 0x41:
8852
178k
  case 0x42:
8853
209k
  case 0x43:
8854
277k
  case 0x44:
8855
336k
  case 0x45:
8856
363k
  case 0x46:
8857
390k
  case 0x47:
8858
689k
  case 0x48:
8859
776k
  case 0x49:
8860
806k
  case 0x4a:
8861
835k
  case 0x4b:
8862
938k
  case 0x4c:
8863
976k
  case 0x4d:
8864
1.02M
  case 0x4e:
8865
1.04M
  case 0x4f:
8866
1.04M
    if (ins->address_mode == mode_64bit)
8867
941k
      newrex = *ins->codep;
8868
107k
    else
8869
107k
      return ckp_okay;
8870
941k
    ins->last_rex_prefix = i;
8871
941k
    break;
8872
32.0k
  case 0xf3:
8873
32.0k
    ins->prefixes |= PREFIX_REPZ;
8874
32.0k
    ins->last_repz_prefix = i;
8875
32.0k
    break;
8876
48.0k
  case 0xf2:
8877
48.0k
    ins->prefixes |= PREFIX_REPNZ;
8878
48.0k
    ins->last_repnz_prefix = i;
8879
48.0k
    break;
8880
28.6k
  case 0xf0:
8881
28.6k
    ins->prefixes |= PREFIX_LOCK;
8882
28.6k
    ins->last_lock_prefix = i;
8883
28.6k
    break;
8884
58.7k
  case 0x2e:
8885
58.7k
    ins->prefixes |= PREFIX_CS;
8886
58.7k
    ins->last_seg_prefix = i;
8887
58.7k
    if (ins->address_mode != mode_64bit)
8888
10.8k
      ins->active_seg_prefix = PREFIX_CS;
8889
58.7k
    break;
8890
25.0k
  case 0x36:
8891
25.0k
    ins->prefixes |= PREFIX_SS;
8892
25.0k
    ins->last_seg_prefix = i;
8893
25.0k
    if (ins->address_mode != mode_64bit)
8894
6.98k
      ins->active_seg_prefix = PREFIX_SS;
8895
25.0k
    break;
8896
32.2k
  case 0x3e:
8897
32.2k
    ins->prefixes |= PREFIX_DS;
8898
32.2k
    ins->last_seg_prefix = i;
8899
32.2k
    if (ins->address_mode != mode_64bit)
8900
15.3k
      ins->active_seg_prefix = PREFIX_DS;
8901
32.2k
    break;
8902
25.1k
  case 0x26:
8903
25.1k
    ins->prefixes |= PREFIX_ES;
8904
25.1k
    ins->last_seg_prefix = i;
8905
25.1k
    if (ins->address_mode != mode_64bit)
8906
7.27k
      ins->active_seg_prefix = PREFIX_ES;
8907
25.1k
    break;
8908
57.4k
  case 0x64:
8909
57.4k
    ins->prefixes |= PREFIX_FS;
8910
57.4k
    ins->last_seg_prefix = i;
8911
57.4k
    ins->active_seg_prefix = PREFIX_FS;
8912
57.4k
    break;
8913
64.6k
  case 0x65:
8914
64.6k
    ins->prefixes |= PREFIX_GS;
8915
64.6k
    ins->last_seg_prefix = i;
8916
64.6k
    ins->active_seg_prefix = PREFIX_GS;
8917
64.6k
    break;
8918
115k
  case 0x66:
8919
115k
    ins->prefixes |= PREFIX_DATA;
8920
115k
    ins->last_data_prefix = i;
8921
115k
    break;
8922
73.1k
  case 0x67:
8923
73.1k
    ins->prefixes |= PREFIX_ADDR;
8924
73.1k
    ins->last_addr_prefix = i;
8925
73.1k
    break;
8926
21.4k
  case FWAIT_OPCODE:
8927
    /* fwait is really an instruction.  If there are prefixes
8928
       before the fwait, they belong to the fwait, *not* to the
8929
       following instruction.  */
8930
21.4k
    ins->fwait_prefix = i;
8931
21.4k
    if (ins->prefixes || ins->rex)
8932
4.94k
      {
8933
4.94k
        ins->prefixes |= PREFIX_FWAIT;
8934
4.94k
        ins->codep++;
8935
        /* This ensures that the previous REX prefixes are noticed
8936
     as unused prefixes, as in the return case below.  */
8937
4.94k
        return ins->rex ? ckp_bogus : ckp_okay;
8938
4.94k
      }
8939
16.4k
    ins->prefixes = PREFIX_FWAIT;
8940
16.4k
    break;
8941
9.67M
  default:
8942
9.67M
    return ckp_okay;
8943
11.3M
  }
8944
      /* Rex is ignored when followed by another prefix.  */
8945
1.51M
      if (ins->rex)
8946
106k
  return ckp_bogus;
8947
1.41M
      if (*ins->codep != FWAIT_OPCODE)
8948
1.39M
  ins->all_prefixes[i++] = *ins->codep;
8949
1.41M
      ins->rex = newrex;
8950
1.41M
      ins->codep++;
8951
1.41M
      length++;
8952
1.41M
    }
8953
2.77k
  return ckp_bogus;
8954
9.89M
}
8955
8956
/* Return the name of the prefix byte PREF, or NULL if PREF is not a
8957
   prefix byte.  */
8958
8959
static const char *
8960
prefix_name (enum address_mode mode, uint8_t pref, int sizeflag)
8961
637k
{
8962
637k
  static const char *rexes [16] =
8963
637k
    {
8964
637k
      "rex",    /* 0x40 */
8965
637k
      "rex.B",    /* 0x41 */
8966
637k
      "rex.X",    /* 0x42 */
8967
637k
      "rex.XB",   /* 0x43 */
8968
637k
      "rex.R",    /* 0x44 */
8969
637k
      "rex.RB",   /* 0x45 */
8970
637k
      "rex.RX",   /* 0x46 */
8971
637k
      "rex.RXB",  /* 0x47 */
8972
637k
      "rex.W",    /* 0x48 */
8973
637k
      "rex.WB",   /* 0x49 */
8974
637k
      "rex.WX",   /* 0x4a */
8975
637k
      "rex.WXB",  /* 0x4b */
8976
637k
      "rex.WR",   /* 0x4c */
8977
637k
      "rex.WRB",  /* 0x4d */
8978
637k
      "rex.WRX",  /* 0x4e */
8979
637k
      "rex.WRXB", /* 0x4f */
8980
637k
    };
8981
8982
637k
  switch (pref)
8983
637k
    {
8984
    /* REX prefixes family.  */
8985
15.4k
    case 0x40:
8986
30.6k
    case 0x41:
8987
48.9k
    case 0x42:
8988
66.2k
    case 0x43:
8989
84.3k
    case 0x44:
8990
103k
    case 0x45:
8991
119k
    case 0x46:
8992
136k
    case 0x47:
8993
153k
    case 0x48:
8994
172k
    case 0x49:
8995
193k
    case 0x4a:
8996
211k
    case 0x4b:
8997
227k
    case 0x4c:
8998
242k
    case 0x4d:
8999
263k
    case 0x4e:
9000
281k
    case 0x4f:
9001
281k
      return rexes [pref - 0x40];
9002
24.3k
    case 0xf3:
9003
24.3k
      return "repz";
9004
36.9k
    case 0xf2:
9005
36.9k
      return "repnz";
9006
25.9k
    case 0xf0:
9007
25.9k
      return "lock";
9008
48.3k
    case 0x2e:
9009
48.3k
      return "cs";
9010
21.2k
    case 0x36:
9011
21.2k
      return "ss";
9012
23.5k
    case 0x3e:
9013
23.5k
      return "ds";
9014
19.5k
    case 0x26:
9015
19.5k
      return "es";
9016
34.1k
    case 0x64:
9017
34.1k
      return "fs";
9018
40.5k
    case 0x65:
9019
40.5k
      return "gs";
9020
36.2k
    case 0x66:
9021
36.2k
      return (sizeflag & DFLAG) ? "data16" : "data32";
9022
35.7k
    case 0x67:
9023
35.7k
      if (mode == mode_64bit)
9024
26.4k
  return (sizeflag & AFLAG) ? "addr32" : "addr64";
9025
9.33k
      else
9026
9.33k
  return (sizeflag & AFLAG) ? "addr16" : "addr32";
9027
77
    case FWAIT_OPCODE:
9028
77
      return "fwait";
9029
1.18k
    case REP_PREFIX:
9030
1.18k
      return "rep";
9031
1.98k
    case XACQUIRE_PREFIX:
9032
1.98k
      return "xacquire";
9033
1.78k
    case XRELEASE_PREFIX:
9034
1.78k
      return "xrelease";
9035
2.81k
    case BND_PREFIX:
9036
2.81k
      return "bnd";
9037
2.09k
    case NOTRACK_PREFIX:
9038
2.09k
      return "notrack";
9039
0
    default:
9040
0
      return NULL;
9041
637k
    }
9042
637k
}
9043
9044
void
9045
print_i386_disassembler_options (FILE *stream)
9046
0
{
9047
0
  fprintf (stream, _("\n\
9048
0
The following i386/x86-64 specific disassembler options are supported for use\n\
9049
0
with the -M switch (multiple options should be separated by commas):\n"));
9050
9051
0
  fprintf (stream, _("  x86-64      Disassemble in 64bit mode\n"));
9052
0
  fprintf (stream, _("  i386        Disassemble in 32bit mode\n"));
9053
0
  fprintf (stream, _("  i8086       Disassemble in 16bit mode\n"));
9054
0
  fprintf (stream, _("  att         Display instruction in AT&T syntax\n"));
9055
0
  fprintf (stream, _("  intel       Display instruction in Intel syntax\n"));
9056
0
  fprintf (stream, _("  att-mnemonic\n"
9057
0
         "              Display instruction in AT&T mnemonic\n"));
9058
0
  fprintf (stream, _("  intel-mnemonic\n"
9059
0
         "              Display instruction in Intel mnemonic\n"));
9060
0
  fprintf (stream, _("  addr64      Assume 64bit address size\n"));
9061
0
  fprintf (stream, _("  addr32      Assume 32bit address size\n"));
9062
0
  fprintf (stream, _("  addr16      Assume 16bit address size\n"));
9063
0
  fprintf (stream, _("  data32      Assume 32bit data size\n"));
9064
0
  fprintf (stream, _("  data16      Assume 16bit data size\n"));
9065
0
  fprintf (stream, _("  suffix      Always display instruction suffix in AT&T syntax\n"));
9066
0
  fprintf (stream, _("  amd64       Display instruction in AMD64 ISA\n"));
9067
0
  fprintf (stream, _("  intel64     Display instruction in Intel64 ISA\n"));
9068
0
}
9069
9070
/* Bad opcode.  */
9071
static const struct dis386 bad_opcode = { "(bad)", { XX }, 0 };
9072
9073
/* Fetch error indicator.  */
9074
static const struct dis386 err_opcode = { NULL, { XX }, 0 };
9075
9076
/* Get a pointer to struct dis386 with a valid name.  */
9077
9078
static const struct dis386 *
9079
get_valid_dis386 (const struct dis386 *dp, instr_info *ins)
9080
11.1M
{
9081
11.1M
  int vindex, vex_table_index;
9082
9083
11.1M
  if (dp->name != NULL)
9084
6.29M
    return dp;
9085
9086
4.83M
  switch (dp->op[0].bytemode)
9087
4.83M
    {
9088
1.05M
    case USE_REG_TABLE:
9089
1.05M
      dp = &reg_table[dp->op[1].bytemode][ins->modrm.reg];
9090
1.05M
      break;
9091
9092
177k
    case USE_MOD_TABLE:
9093
177k
      vindex = ins->modrm.mod == 0x3 ? 1 : 0;
9094
177k
      dp = &mod_table[dp->op[1].bytemode][vindex];
9095
177k
      break;
9096
9097
5.08k
    case USE_RM_TABLE:
9098
5.08k
      dp = &rm_table[dp->op[1].bytemode][ins->modrm.rm];
9099
5.08k
      break;
9100
9101
142k
    case USE_PREFIX_TABLE:
9102
142k
      if (ins->need_vex)
9103
35.9k
  {
9104
    /* The prefix in VEX is implicit.  */
9105
35.9k
    switch (ins->vex.prefix)
9106
35.9k
      {
9107
5.22k
      case 0:
9108
5.22k
        vindex = 0;
9109
5.22k
        break;
9110
9.55k
      case REPE_PREFIX_OPCODE:
9111
9.55k
        vindex = 1;
9112
9.55k
        break;
9113
13.0k
      case DATA_PREFIX_OPCODE:
9114
13.0k
        vindex = 2;
9115
13.0k
        break;
9116
8.15k
      case REPNE_PREFIX_OPCODE:
9117
8.15k
        vindex = 3;
9118
8.15k
        break;
9119
0
      default:
9120
0
        abort ();
9121
0
        break;
9122
35.9k
      }
9123
35.9k
  }
9124
106k
      else
9125
106k
  {
9126
106k
    int last_prefix = -1;
9127
106k
    int prefix = 0;
9128
106k
    vindex = 0;
9129
    /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
9130
       When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
9131
       last one wins.  */
9132
106k
    if ((ins->prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
9133
8.43k
      {
9134
8.43k
        if (ins->last_repz_prefix > ins->last_repnz_prefix)
9135
3.12k
    {
9136
3.12k
      vindex = 1;
9137
3.12k
      prefix = PREFIX_REPZ;
9138
3.12k
      last_prefix = ins->last_repz_prefix;
9139
3.12k
    }
9140
5.31k
        else
9141
5.31k
    {
9142
5.31k
      vindex = 3;
9143
5.31k
      prefix = PREFIX_REPNZ;
9144
5.31k
      last_prefix = ins->last_repnz_prefix;
9145
5.31k
    }
9146
9147
        /* Check if prefix should be ignored.  */
9148
8.43k
        if ((((prefix_table[dp->op[1].bytemode][vindex].prefix_requirement
9149
8.43k
         & PREFIX_IGNORED) >> PREFIX_IGNORED_SHIFT)
9150
8.43k
       & prefix) != 0
9151
8.43k
      && !prefix_table[dp->op[1].bytemode][vindex].name)
9152
609
    vindex = 0;
9153
8.43k
      }
9154
9155
106k
    if (vindex == 0 && (ins->prefixes & PREFIX_DATA) != 0)
9156
7.84k
      {
9157
7.84k
        vindex = 2;
9158
7.84k
        prefix = PREFIX_DATA;
9159
7.84k
        last_prefix = ins->last_data_prefix;
9160
7.84k
      }
9161
9162
106k
    if (vindex != 0)
9163
15.6k
      {
9164
15.6k
        ins->used_prefixes |= prefix;
9165
15.6k
        ins->all_prefixes[last_prefix] = 0;
9166
15.6k
      }
9167
106k
  }
9168
142k
      dp = &prefix_table[dp->op[1].bytemode][vindex];
9169
142k
      break;
9170
9171
1.73M
    case USE_X86_64_TABLE:
9172
1.73M
      vindex = ins->address_mode == mode_64bit ? 1 : 0;
9173
1.73M
      dp = &x86_64_table[dp->op[1].bytemode][vindex];
9174
1.73M
      break;
9175
9176
3.03k
    case USE_3BYTE_TABLE:
9177
3.03k
      if (!fetch_code (ins->info, ins->codep + 2))
9178
8
  return &err_opcode;
9179
3.02k
      vindex = *ins->codep++;
9180
3.02k
      dp = &three_byte_table[dp->op[1].bytemode][vindex];
9181
3.02k
      ins->end_codep = ins->codep;
9182
3.02k
      if (!fetch_modrm (ins))
9183
0
  return &err_opcode;
9184
3.02k
      break;
9185
9186
18.5k
    case USE_VEX_LEN_TABLE:
9187
18.5k
      if (!ins->need_vex)
9188
0
  abort ();
9189
9190
18.5k
      switch (ins->vex.length)
9191
18.5k
  {
9192
14.0k
  case 128:
9193
14.0k
    vindex = 0;
9194
14.0k
    break;
9195
538
  case 512:
9196
    /* This allows re-using in particular table entries where only
9197
       128-bit operand size (VEX.L=0 / EVEX.L'L=0) are valid.  */
9198
538
    if (ins->vex.evex)
9199
538
      {
9200
4.42k
  case 256:
9201
4.42k
        vindex = 1;
9202
4.42k
        break;
9203
538
      }
9204
  /* Fall through.  */
9205
0
  default:
9206
0
    abort ();
9207
0
    break;
9208
18.5k
  }
9209
9210
18.5k
      dp = &vex_len_table[dp->op[1].bytemode][vindex];
9211
18.5k
      break;
9212
9213
1.66k
    case USE_EVEX_LEN_TABLE:
9214
1.66k
      if (!ins->vex.evex)
9215
0
  abort ();
9216
9217
1.66k
      switch (ins->vex.length)
9218
1.66k
  {
9219
457
  case 128:
9220
457
    vindex = 0;
9221
457
    break;
9222
612
  case 256:
9223
612
    vindex = 1;
9224
612
    break;
9225
592
  case 512:
9226
592
    vindex = 2;
9227
592
    break;
9228
0
  default:
9229
0
    abort ();
9230
0
    break;
9231
1.66k
  }
9232
9233
1.66k
      dp = &evex_len_table[dp->op[1].bytemode][vindex];
9234
1.66k
      break;
9235
9236
10.1k
    case USE_XOP_8F_TABLE:
9237
10.1k
      if (!fetch_code (ins->info, ins->codep + 3))
9238
18
  return &err_opcode;
9239
10.1k
      ins->rex = ~(*ins->codep >> 5) & 0x7;
9240
9241
      /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm".  */
9242
10.1k
      switch ((*ins->codep & 0x1f))
9243
10.1k
  {
9244
2.60k
  default:
9245
2.60k
    dp = &bad_opcode;
9246
2.60k
    return dp;
9247
2.62k
  case 0x8:
9248
2.62k
    vex_table_index = XOP_08;
9249
2.62k
    break;
9250
2.90k
  case 0x9:
9251
2.90k
    vex_table_index = XOP_09;
9252
2.90k
    break;
9253
1.99k
  case 0xa:
9254
1.99k
    vex_table_index = XOP_0A;
9255
1.99k
    break;
9256
10.1k
  }
9257
7.51k
      ins->codep++;
9258
7.51k
      ins->vex.w = *ins->codep & 0x80;
9259
7.51k
      if (ins->vex.w && ins->address_mode == mode_64bit)
9260
2.35k
  ins->rex |= REX_W;
9261
9262
7.51k
      ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf;
9263
7.51k
      if (ins->address_mode != mode_64bit)
9264
2.06k
  {
9265
    /* In 16/32-bit mode REX_B is silently ignored.  */
9266
2.06k
    ins->rex &= ~REX_B;
9267
2.06k
  }
9268
9269
7.51k
      ins->vex.length = (*ins->codep & 0x4) ? 256 : 128;
9270
7.51k
      switch ((*ins->codep & 0x3))
9271
7.51k
  {
9272
6.80k
  case 0:
9273
6.80k
    break;
9274
102
  case 1:
9275
102
    ins->vex.prefix = DATA_PREFIX_OPCODE;
9276
102
    break;
9277
415
  case 2:
9278
415
    ins->vex.prefix = REPE_PREFIX_OPCODE;
9279
415
    break;
9280
192
  case 3:
9281
192
    ins->vex.prefix = REPNE_PREFIX_OPCODE;
9282
192
    break;
9283
7.51k
  }
9284
7.51k
      ins->need_vex = true;
9285
7.51k
      ins->codep++;
9286
7.51k
      vindex = *ins->codep++;
9287
7.51k
      dp = &xop_table[vex_table_index][vindex];
9288
9289
7.51k
      ins->end_codep = ins->codep;
9290
7.51k
      if (!fetch_modrm (ins))
9291
2
  return &err_opcode;
9292
9293
      /* No XOP encoding so far allows for a non-zero embedded prefix. Avoid
9294
   having to decode the bits for every otherwise valid encoding.  */
9295
7.51k
      if (ins->vex.prefix)
9296
708
  return &bad_opcode;
9297
6.80k
      break;
9298
9299
43.3k
    case USE_VEX_C4_TABLE:
9300
      /* VEX prefix.  */
9301
43.3k
      if (!fetch_code (ins->info, ins->codep + 3))
9302
18
  return &err_opcode;
9303
43.3k
      ins->rex = ~(*ins->codep >> 5) & 0x7;
9304
43.3k
      switch ((*ins->codep & 0x1f))
9305
43.3k
  {
9306
20.8k
  default:
9307
20.8k
    dp = &bad_opcode;
9308
20.8k
    return dp;
9309
2.64k
  case 0x1:
9310
2.64k
    vex_table_index = VEX_0F;
9311
2.64k
    break;
9312
14.7k
  case 0x2:
9313
14.7k
    vex_table_index = VEX_0F38;
9314
14.7k
    break;
9315
5.02k
  case 0x3:
9316
5.02k
    vex_table_index = VEX_0F3A;
9317
5.02k
    break;
9318
43.3k
  }
9319
22.4k
      ins->codep++;
9320
22.4k
      ins->vex.w = *ins->codep & 0x80;
9321
22.4k
      if (ins->address_mode == mode_64bit)
9322
19.1k
  {
9323
19.1k
    if (ins->vex.w)
9324
7.49k
      ins->rex |= REX_W;
9325
19.1k
  }
9326
3.32k
      else
9327
3.32k
  {
9328
    /* For the 3-byte VEX prefix in 32-bit mode, the REX_B bit
9329
       is ignored, other REX bits are 0 and the highest bit in
9330
       VEX.vvvv is also ignored (but we mustn't clear it here).  */
9331
3.32k
    ins->rex = 0;
9332
3.32k
  }
9333
22.4k
      ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf;
9334
22.4k
      ins->vex.length = (*ins->codep & 0x4) ? 256 : 128;
9335
22.4k
      switch ((*ins->codep & 0x3))
9336
22.4k
  {
9337
7.63k
  case 0:
9338
7.63k
    break;
9339
5.51k
  case 1:
9340
5.51k
    ins->vex.prefix = DATA_PREFIX_OPCODE;
9341
5.51k
    break;
9342
7.20k
  case 2:
9343
7.20k
    ins->vex.prefix = REPE_PREFIX_OPCODE;
9344
7.20k
    break;
9345
2.09k
  case 3:
9346
2.09k
    ins->vex.prefix = REPNE_PREFIX_OPCODE;
9347
2.09k
    break;
9348
22.4k
  }
9349
22.4k
      ins->need_vex = true;
9350
22.4k
      ins->codep++;
9351
22.4k
      vindex = *ins->codep++;
9352
22.4k
      dp = &vex_table[vex_table_index][vindex];
9353
22.4k
      ins->end_codep = ins->codep;
9354
      /* There is no MODRM byte for VEX0F 77.  */
9355
22.4k
      if ((vex_table_index != VEX_0F || vindex != 0x77)
9356
22.4k
    && !fetch_modrm (ins))
9357
2
  return &err_opcode;
9358
22.4k
      break;
9359
9360
24.5k
    case USE_VEX_C5_TABLE:
9361
      /* VEX prefix.  */
9362
24.5k
      if (!fetch_code (ins->info, ins->codep + 2))
9363
8
  return &err_opcode;
9364
24.5k
      ins->rex = (*ins->codep & 0x80) ? 0 : REX_R;
9365
9366
      /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in
9367
   VEX.vvvv is 1.  */
9368
24.5k
      ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf;
9369
24.5k
      ins->vex.length = (*ins->codep & 0x4) ? 256 : 128;
9370
24.5k
      switch ((*ins->codep & 0x3))
9371
24.5k
  {
9372
5.20k
  case 0:
9373
5.20k
    break;
9374
8.14k
  case 1:
9375
8.14k
    ins->vex.prefix = DATA_PREFIX_OPCODE;
9376
8.14k
    break;
9377
2.71k
  case 2:
9378
2.71k
    ins->vex.prefix = REPE_PREFIX_OPCODE;
9379
2.71k
    break;
9380
8.50k
  case 3:
9381
8.50k
    ins->vex.prefix = REPNE_PREFIX_OPCODE;
9382
8.50k
    break;
9383
24.5k
  }
9384
24.5k
      ins->need_vex = true;
9385
24.5k
      ins->codep++;
9386
24.5k
      vindex = *ins->codep++;
9387
24.5k
      dp = &vex_table[dp->op[1].bytemode][vindex];
9388
24.5k
      ins->end_codep = ins->codep;
9389
      /* There is no MODRM byte for VEX 77.  */
9390
24.5k
      if (vindex != 0x77 && !fetch_modrm (ins))
9391
14
  return &err_opcode;
9392
24.5k
      break;
9393
9394
24.5k
    case USE_VEX_W_TABLE:
9395
15.5k
      if (!ins->need_vex)
9396
0
  abort ();
9397
9398
15.5k
      dp = &vex_w_table[dp->op[1].bytemode][ins->vex.w];
9399
15.5k
      break;
9400
9401
84.3k
    case USE_EVEX_TABLE:
9402
84.3k
      ins->two_source_ops = false;
9403
      /* EVEX prefix.  */
9404
84.3k
      ins->vex.evex = true;
9405
84.3k
      if (!fetch_code (ins->info, ins->codep + 4))
9406
118
  return &err_opcode;
9407
      /* The first byte after 0x62.  */
9408
84.2k
      ins->rex = ~(*ins->codep >> 5) & 0x7;
9409
84.2k
      ins->vex.r = *ins->codep & 0x10;
9410
84.2k
      switch ((*ins->codep & 0xf))
9411
84.2k
  {
9412
21.3k
  default:
9413
21.3k
    return &bad_opcode;
9414
13.5k
  case 0x1:
9415
13.5k
    vex_table_index = EVEX_0F;
9416
13.5k
    break;
9417
18.6k
  case 0x2:
9418
18.6k
    vex_table_index = EVEX_0F38;
9419
18.6k
    break;
9420
12.6k
  case 0x3:
9421
12.6k
    vex_table_index = EVEX_0F3A;
9422
12.6k
    break;
9423
7.42k
  case 0x5:
9424
7.42k
    vex_table_index = EVEX_MAP5;
9425
7.42k
    break;
9426
10.5k
  case 0x6:
9427
10.5k
    vex_table_index = EVEX_MAP6;
9428
10.5k
    break;
9429
84.2k
  }
9430
9431
      /* The second byte after 0x62.  */
9432
62.8k
      ins->codep++;
9433
62.8k
      ins->vex.w = *ins->codep & 0x80;
9434
62.8k
      if (ins->vex.w && ins->address_mode == mode_64bit)
9435
18.4k
  ins->rex |= REX_W;
9436
9437
62.8k
      ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf;
9438
9439
      /* The U bit.  */
9440
62.8k
      if (!(*ins->codep & 0x4))
9441
11.6k
  return &bad_opcode;
9442
9443
51.2k
      switch ((*ins->codep & 0x3))
9444
51.2k
  {
9445
7.63k
  case 0:
9446
7.63k
    break;
9447
14.0k
  case 1:
9448
14.0k
    ins->vex.prefix = DATA_PREFIX_OPCODE;
9449
14.0k
    break;
9450
16.5k
  case 2:
9451
16.5k
    ins->vex.prefix = REPE_PREFIX_OPCODE;
9452
16.5k
    break;
9453
12.9k
  case 3:
9454
12.9k
    ins->vex.prefix = REPNE_PREFIX_OPCODE;
9455
12.9k
    break;
9456
51.2k
  }
9457
9458
      /* The third byte after 0x62.  */
9459
51.2k
      ins->codep++;
9460
9461
      /* Remember the static rounding bits.  */
9462
51.2k
      ins->vex.ll = (*ins->codep >> 5) & 3;
9463
51.2k
      ins->vex.b = *ins->codep & 0x10;
9464
9465
51.2k
      ins->vex.v = *ins->codep & 0x8;
9466
51.2k
      ins->vex.mask_register_specifier = *ins->codep & 0x7;
9467
51.2k
      ins->vex.zeroing = *ins->codep & 0x80;
9468
9469
51.2k
      if (ins->address_mode != mode_64bit)
9470
7.78k
  {
9471
    /* In 16/32-bit mode silently ignore following bits.  */
9472
7.78k
    ins->rex &= ~REX_B;
9473
7.78k
    ins->vex.r = true;
9474
7.78k
  }
9475
9476
51.2k
      ins->need_vex = true;
9477
51.2k
      ins->codep++;
9478
51.2k
      vindex = *ins->codep++;
9479
51.2k
      dp = &evex_table[vex_table_index][vindex];
9480
51.2k
      ins->end_codep = ins->codep;
9481
51.2k
      if (!fetch_modrm (ins))
9482
82
  return &err_opcode;
9483
9484
      /* Set vector length.  */
9485
51.1k
      if (ins->modrm.mod == 3 && ins->vex.b)
9486
5.57k
  ins->vex.length = 512;
9487
45.5k
      else
9488
45.5k
  {
9489
45.5k
    switch (ins->vex.ll)
9490
45.5k
      {
9491
11.0k
      case 0x0:
9492
11.0k
        ins->vex.length = 128;
9493
11.0k
        break;
9494
14.8k
      case 0x1:
9495
14.8k
        ins->vex.length = 256;
9496
14.8k
        break;
9497
17.1k
      case 0x2:
9498
17.1k
        ins->vex.length = 512;
9499
17.1k
        break;
9500
2.57k
      default:
9501
2.57k
        return &bad_opcode;
9502
45.5k
      }
9503
45.5k
  }
9504
48.5k
      break;
9505
9506
1.51M
    case 0:
9507
1.51M
      dp = &bad_opcode;
9508
1.51M
      break;
9509
9510
0
    default:
9511
0
      abort ();
9512
4.83M
    }
9513
9514
4.77M
  if (dp->name != NULL)
9515
2.94M
    return dp;
9516
1.82M
  else
9517
1.82M
    return get_valid_dis386 (dp, ins);
9518
4.77M
}
9519
9520
static bool
9521
get_sib (instr_info *ins, int sizeflag)
9522
9.76M
{
9523
  /* If modrm.mod == 3, operand must be register.  */
9524
9.76M
  if (ins->need_modrm
9525
9.76M
      && ((sizeflag & AFLAG) || ins->address_mode == mode_64bit)
9526
9.76M
      && ins->modrm.mod != 3
9527
9.76M
      && ins->modrm.rm == 4)
9528
316k
    {
9529
316k
      if (!fetch_code (ins->info, ins->codep + 2))
9530
306
  return false;
9531
315k
      ins->sib.index = (ins->codep[1] >> 3) & 7;
9532
315k
      ins->sib.scale = (ins->codep[1] >> 6) & 3;
9533
315k
      ins->sib.base = ins->codep[1] & 7;
9534
315k
      ins->has_sib = true;
9535
315k
    }
9536
9.44M
  else
9537
9.44M
    ins->has_sib = false;
9538
9539
9.76M
  return true;
9540
9.76M
}
9541
9542
/* Like oappend_with_style (below) but always with text style.  */
9543
9544
static void
9545
oappend (instr_info *ins, const char *s)
9546
1.10M
{
9547
1.10M
  oappend_with_style (ins, s, dis_style_text);
9548
1.10M
}
9549
9550
/* Like oappend (above), but S is a string starting with '%'.  In
9551
   Intel syntax, the '%' is elided.  */
9552
9553
static void
9554
oappend_register (instr_info *ins, const char *s)
9555
11.4M
{
9556
11.4M
  oappend_with_style (ins, s + ins->intel_syntax, dis_style_register);
9557
11.4M
}
9558
9559
/* Wrap around a call to INS->info->fprintf_styled_func, printing FMT.
9560
   STYLE is the default style to use in the fprintf_styled_func calls,
9561
   however, FMT might include embedded style markers (see oappend_style),
9562
   these embedded markers are not printed, but instead change the style
9563
   used in the next fprintf_styled_func call.  */
9564
9565
static void ATTRIBUTE_PRINTF_3
9566
i386_dis_printf (const disassemble_info *info, enum disassembler_style style,
9567
     const char *fmt, ...)
9568
28.7M
{
9569
28.7M
  va_list ap;
9570
28.7M
  enum disassembler_style curr_style = style;
9571
28.7M
  const char *start, *curr;
9572
28.7M
  char staging_area[40];
9573
9574
28.7M
  va_start (ap, fmt);
9575
  /* In particular print_insn()'s processing of op_txt[] can hand rather long
9576
     strings here.  Bypass vsnprintf() in such cases to avoid capacity issues
9577
     with the staging area.  */
9578
28.7M
  if (strcmp (fmt, "%s"))
9579
16.3M
    {
9580
16.3M
      int res = vsnprintf (staging_area, sizeof (staging_area), fmt, ap);
9581
9582
16.3M
      va_end (ap);
9583
9584
16.3M
      if (res < 0)
9585
0
  return;
9586
9587
16.3M
      if ((size_t) res >= sizeof (staging_area))
9588
0
  abort ();
9589
9590
16.3M
      start = curr = staging_area;
9591
16.3M
    }
9592
12.4M
  else
9593
12.4M
    {
9594
12.4M
      start = curr = va_arg (ap, const char *);
9595
12.4M
      va_end (ap);
9596
12.4M
    }
9597
9598
28.7M
  do
9599
200M
    {
9600
200M
      if (*curr == '\0'
9601
200M
    || (*curr == STYLE_MARKER_CHAR
9602
171M
        && ISXDIGIT (*(curr + 1))
9603
171M
        && *(curr + 2) == STYLE_MARKER_CHAR))
9604
53.5M
  {
9605
    /* Output content between our START position and CURR.  */
9606
53.5M
    int len = curr - start;
9607
53.5M
    int n = (*info->fprintf_styled_func) (info->stream, curr_style,
9608
53.5M
            "%.*s", len, start);
9609
53.5M
    if (n < 0)
9610
0
      break;
9611
9612
53.5M
    if (*curr == '\0')
9613
28.7M
      break;
9614
9615
    /* Skip over the initial STYLE_MARKER_CHAR.  */
9616
24.7M
    ++curr;
9617
9618
    /* Update the CURR_STYLE.  As there are less than 16 styles, it
9619
       is possible, that if the input is corrupted in some way, that
9620
       we might set CURR_STYLE to an invalid value.  Don't worry
9621
       though, we check for this situation.  */
9622
24.7M
    if (*curr >= '0' && *curr <= '9')
9623
24.7M
      curr_style = (enum disassembler_style) (*curr - '0');
9624
0
    else if (*curr >= 'a' && *curr <= 'f')
9625
0
      curr_style = (enum disassembler_style) (*curr - 'a' + 10);
9626
0
    else
9627
0
      curr_style = dis_style_text;
9628
9629
    /* Check for an invalid style having been selected.  This should
9630
       never happen, but it doesn't hurt to be a little paranoid.  */
9631
24.7M
    if (curr_style > dis_style_comment_start)
9632
0
      curr_style = dis_style_text;
9633
9634
    /* Skip the hex character, and the closing STYLE_MARKER_CHAR.  */
9635
24.7M
    curr += 2;
9636
9637
    /* Reset the START to after the style marker.  */
9638
24.7M
    start = curr;
9639
24.7M
  }
9640
146M
      else
9641
146M
  ++curr;
9642
200M
    }
9643
28.7M
  while (true);
9644
28.7M
}
9645
9646
static int
9647
print_insn (bfd_vma pc, disassemble_info *info, int intel_syntax)
9648
9.89M
{
9649
9.89M
  const struct dis386 *dp;
9650
9.89M
  int i;
9651
9.89M
  int ret;
9652
9.89M
  char *op_txt[MAX_OPERANDS];
9653
9.89M
  int needcomma;
9654
9.89M
  bool intel_swap_2_3;
9655
9.89M
  int sizeflag, orig_sizeflag;
9656
9.89M
  const char *p;
9657
9.89M
  struct dis_private priv;
9658
9.89M
  int prefix_length;
9659
9.89M
  int op_count;
9660
9.89M
  instr_info ins = {
9661
9.89M
    .info = info,
9662
9.89M
    .intel_syntax = intel_syntax >= 0
9663
9.89M
        ? intel_syntax
9664
9.89M
        : (info->mach & bfd_mach_i386_intel_syntax) != 0,
9665
9.89M
    .intel_mnemonic = !SYSV386_COMPAT,
9666
9.89M
    .op_index[0 ... MAX_OPERANDS - 1] = -1,
9667
9.89M
    .start_pc = pc,
9668
9.89M
    .start_codep = priv.the_buffer,
9669
9.89M
    .codep = priv.the_buffer,
9670
9.89M
    .obufp = ins.obuf,
9671
9.89M
    .last_lock_prefix = -1,
9672
9.89M
    .last_repz_prefix = -1,
9673
9.89M
    .last_repnz_prefix = -1,
9674
9.89M
    .last_data_prefix = -1,
9675
9.89M
    .last_addr_prefix = -1,
9676
9.89M
    .last_rex_prefix = -1,
9677
9.89M
    .last_seg_prefix = -1,
9678
9.89M
    .fwait_prefix = -1,
9679
9.89M
  };
9680
9.89M
  char op_out[MAX_OPERANDS][MAX_OPERAND_BUFFER_SIZE];
9681
9682
9.89M
  priv.orig_sizeflag = AFLAG | DFLAG;
9683
9.89M
  if ((info->mach & bfd_mach_i386_i386) != 0)
9684
2.06M
    ins.address_mode = mode_32bit;
9685
7.82M
  else if (info->mach == bfd_mach_i386_i8086)
9686
361k
    {
9687
361k
      ins.address_mode = mode_16bit;
9688
361k
      priv.orig_sizeflag = 0;
9689
361k
    }
9690
7.46M
  else
9691
7.46M
    ins.address_mode = mode_64bit;
9692
9693
10.6M
  for (p = info->disassembler_options; p != NULL;)
9694
720k
    {
9695
720k
      if (startswith (p, "amd64"))
9696
1.61k
  ins.isa64 = amd64;
9697
719k
      else if (startswith (p, "intel64"))
9698
4.03k
  ins.isa64 = intel64;
9699
715k
      else if (startswith (p, "x86-64"))
9700
4.10k
  {
9701
4.10k
    ins.address_mode = mode_64bit;
9702
4.10k
    priv.orig_sizeflag |= AFLAG | DFLAG;
9703
4.10k
  }
9704
710k
      else if (startswith (p, "i386"))
9705
3.85k
  {
9706
3.85k
    ins.address_mode = mode_32bit;
9707
3.85k
    priv.orig_sizeflag |= AFLAG | DFLAG;
9708
3.85k
  }
9709
707k
      else if (startswith (p, "i8086"))
9710
26.7k
  {
9711
26.7k
    ins.address_mode = mode_16bit;
9712
26.7k
    priv.orig_sizeflag &= ~(AFLAG | DFLAG);
9713
26.7k
  }
9714
680k
      else if (startswith (p, "intel"))
9715
40.9k
  {
9716
40.9k
    ins.intel_syntax = 1;
9717
40.9k
    if (startswith (p + 5, "-mnemonic"))
9718
928
      ins.intel_mnemonic = true;
9719
40.9k
  }
9720
639k
      else if (startswith (p, "att"))
9721
6.52k
  {
9722
6.52k
    ins.intel_syntax = 0;
9723
6.52k
    if (startswith (p + 3, "-mnemonic"))
9724
362
      ins.intel_mnemonic = false;
9725
6.52k
  }
9726
632k
      else if (startswith (p, "addr"))
9727
109k
  {
9728
109k
    if (ins.address_mode == mode_64bit)
9729
99.0k
      {
9730
99.0k
        if (p[4] == '3' && p[5] == '2')
9731
51.1k
    priv.orig_sizeflag &= ~AFLAG;
9732
47.9k
        else if (p[4] == '6' && p[5] == '4')
9733
760
    priv.orig_sizeflag |= AFLAG;
9734
99.0k
      }
9735
9.96k
    else
9736
9.96k
      {
9737
9.96k
        if (p[4] == '1' && p[5] == '6')
9738
506
    priv.orig_sizeflag &= ~AFLAG;
9739
9.46k
        else if (p[4] == '3' && p[5] == '2')
9740
1.05k
    priv.orig_sizeflag |= AFLAG;
9741
9.96k
      }
9742
109k
  }
9743
523k
      else if (startswith (p, "data"))
9744
30.2k
  {
9745
30.2k
    if (p[4] == '1' && p[5] == '6')
9746
7.42k
      priv.orig_sizeflag &= ~DFLAG;
9747
22.8k
    else if (p[4] == '3' && p[5] == '2')
9748
564
      priv.orig_sizeflag |= DFLAG;
9749
30.2k
  }
9750
493k
      else if (startswith (p, "suffix"))
9751
20.5k
  priv.orig_sizeflag |= SUFFIX_ALWAYS;
9752
9753
720k
      p = strchr (p, ',');
9754
720k
      if (p != NULL)
9755
351k
  p++;
9756
720k
    }
9757
9758
9.89M
  if (ins.address_mode == mode_64bit && sizeof (bfd_vma) < 8)
9759
0
    {
9760
0
      i386_dis_printf (info, dis_style_text, _("64-bit address is disabled"));
9761
0
      return -1;
9762
0
    }
9763
9764
9.89M
  if (ins.intel_syntax)
9765
1.03M
    {
9766
1.03M
      ins.open_char = '[';
9767
1.03M
      ins.close_char = ']';
9768
1.03M
      ins.separator_char = '+';
9769
1.03M
      ins.scale_char = '*';
9770
1.03M
    }
9771
8.85M
  else
9772
8.85M
    {
9773
8.85M
      ins.open_char = '(';
9774
8.85M
      ins.close_char =  ')';
9775
8.85M
      ins.separator_char = ',';
9776
8.85M
      ins.scale_char = ',';
9777
8.85M
    }
9778
9779
  /* The output looks better if we put 7 bytes on a line, since that
9780
     puts most long word instructions on a single line.  */
9781
9.89M
  info->bytes_per_line = 7;
9782
9783
9.89M
  info->private_data = &priv;
9784
9.89M
  priv.fetched = 0;
9785
9.89M
  priv.insn_start = pc;
9786
9787
59.3M
  for (i = 0; i < MAX_OPERANDS; ++i)
9788
49.4M
    {
9789
49.4M
      op_out[i][0] = 0;
9790
49.4M
      ins.op_out[i] = op_out[i];
9791
49.4M
    }
9792
9793
9.89M
  sizeflag = priv.orig_sizeflag;
9794
9795
9.89M
  switch (ckprefix (&ins))
9796
9.89M
    {
9797
9.78M
    case ckp_okay:
9798
9.78M
      break;
9799
9800
111k
    case ckp_bogus:
9801
      /* Too many prefixes or unused REX prefixes.  */
9802
111k
      for (i = 0;
9803
262k
     i < (int) ARRAY_SIZE (ins.all_prefixes) && ins.all_prefixes[i];
9804
151k
     i++)
9805
151k
  i386_dis_printf (info, dis_style_mnemonic, "%s%s",
9806
151k
       (i == 0 ? "" : " "),
9807
151k
       prefix_name (ins.address_mode, ins.all_prefixes[i],
9808
151k
              sizeflag));
9809
111k
      ret = i;
9810
111k
      goto out;
9811
9812
1.81k
    case ckp_fetch_error:
9813
1.81k
      goto fetch_error_out;
9814
9.89M
    }
9815
9816
9.78M
  ins.nr_prefixes = ins.codep - ins.start_codep;
9817
9818
9.78M
  if (!fetch_code (info, ins.codep + 1))
9819
33
    {
9820
13.3k
    fetch_error_out:
9821
13.3k
      ret = fetch_error (&ins);
9822
13.3k
      goto out;
9823
33
    }
9824
9825
9.78M
  ins.two_source_ops = (*ins.codep == 0x62 || *ins.codep == 0xc8);
9826
9827
9.78M
  if ((ins.prefixes & PREFIX_FWAIT)
9828
9.78M
      && (*ins.codep < 0xd8 || *ins.codep > 0xdf))
9829
15.5k
    {
9830
      /* Handle ins.prefixes before fwait.  */
9831
16.6k
      for (i = 0; i < ins.fwait_prefix && ins.all_prefixes[i];
9832
15.5k
     i++)
9833
1.06k
  i386_dis_printf (info, dis_style_mnemonic, "%s ",
9834
1.06k
       prefix_name (ins.address_mode, ins.all_prefixes[i],
9835
1.06k
              sizeflag));
9836
15.5k
      i386_dis_printf (info, dis_style_mnemonic, "fwait");
9837
15.5k
      ret = i + 1;
9838
15.5k
      goto out;
9839
15.5k
    }
9840
9841
9.76M
  if (*ins.codep == 0x0f)
9842
245k
    {
9843
245k
      unsigned char threebyte;
9844
9845
245k
      ins.codep++;
9846
245k
      if (!fetch_code (info, ins.codep + 1))
9847
98
  goto fetch_error_out;
9848
245k
      threebyte = *ins.codep;
9849
245k
      dp = &dis386_twobyte[threebyte];
9850
245k
      ins.need_modrm = twobyte_has_modrm[threebyte];
9851
245k
      ins.codep++;
9852
245k
    }
9853
9.52M
  else
9854
9.52M
    {
9855
9.52M
      dp = &dis386[*ins.codep];
9856
9.52M
      ins.need_modrm = onebyte_has_modrm[*ins.codep];
9857
9.52M
      ins.codep++;
9858
9.52M
    }
9859
9860
  /* Save sizeflag for printing the extra ins.prefixes later before updating
9861
     it for mnemonic and operand processing.  The prefix names depend
9862
     only on the address mode.  */
9863
9.76M
  orig_sizeflag = sizeflag;
9864
9.76M
  if (ins.prefixes & PREFIX_ADDR)
9865
43.7k
    sizeflag ^= AFLAG;
9866
9.76M
  if ((ins.prefixes & PREFIX_DATA))
9867
98.5k
    sizeflag ^= DFLAG;
9868
9869
9.76M
  ins.end_codep = ins.codep;
9870
9.76M
  if (ins.need_modrm && !fetch_modrm (&ins))
9871
3.87k
    goto fetch_error_out;
9872
9873
9.76M
  if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
9874
457k
    {
9875
457k
      if (!get_sib (&ins, sizeflag)
9876
457k
    || !dofloat (&ins, sizeflag))
9877
36
  goto fetch_error_out;
9878
457k
    }
9879
9.30M
  else
9880
9.30M
    {
9881
9.30M
      dp = get_valid_dis386 (dp, &ins);
9882
9.30M
      if (dp == &err_opcode)
9883
270
  goto fetch_error_out;
9884
9.30M
      if (dp != NULL && putop (&ins, dp->name, sizeflag) == 0)
9885
9.30M
  {
9886
9.30M
    if (!get_sib (&ins, sizeflag))
9887
304
      goto fetch_error_out;
9888
55.7M
    for (i = 0; i < MAX_OPERANDS; ++i)
9889
46.4M
      {
9890
46.4M
        ins.obufp = ins.op_out[i];
9891
46.4M
        ins.op_ad = MAX_OPERANDS - 1 - i;
9892
46.4M
        if (dp->op[i].rtn
9893
46.4M
      && !dp->op[i].rtn (&ins, dp->op[i].bytemode, sizeflag))
9894
6.88k
    goto fetch_error_out;
9895
        /* For EVEX instruction after the last operand masking
9896
     should be printed.  */
9897
46.4M
        if (i == 0 && ins.vex.evex)
9898
84.1k
    {
9899
      /* Don't print {%k0}.  */
9900
84.1k
      if (ins.vex.mask_register_specifier)
9901
42.3k
        {
9902
42.3k
          const char *reg_name
9903
42.3k
      = att_names_mask[ins.vex.mask_register_specifier];
9904
9905
42.3k
          oappend (&ins, "{");
9906
42.3k
          oappend_register (&ins, reg_name);
9907
42.3k
          oappend (&ins, "}");
9908
42.3k
        }
9909
84.1k
      if (ins.vex.zeroing)
9910
15.1k
        oappend (&ins, "{z}");
9911
9912
      /* S/G insns require a mask and don't allow
9913
         zeroing-masking.  */
9914
84.1k
      if ((dp->op[0].bytemode == vex_vsib_d_w_dq_mode
9915
84.1k
           || dp->op[0].bytemode == vex_vsib_q_w_dq_mode)
9916
84.1k
          && (ins.vex.mask_register_specifier == 0
9917
4.66k
        || ins.vex.zeroing))
9918
2.91k
        oappend (&ins, "/(bad)");
9919
84.1k
    }
9920
46.4M
      }
9921
9922
    /* Check whether rounding control was enabled for an insn not
9923
       supporting it.  */
9924
9.29M
    if (ins.modrm.mod == 3 && ins.vex.b
9925
9.29M
        && !(ins.evex_used & EVEX_b_used))
9926
2.78k
      {
9927
9.05k
        for (i = 0; i < MAX_OPERANDS; ++i)
9928
9.05k
    {
9929
9.05k
      ins.obufp = ins.op_out[i];
9930
9.05k
      if (*ins.obufp)
9931
6.26k
        continue;
9932
2.78k
      oappend (&ins, names_rounding[ins.vex.ll]);
9933
2.78k
      oappend (&ins, "bad}");
9934
2.78k
      break;
9935
9.05k
    }
9936
2.78k
      }
9937
9.29M
  }
9938
9.30M
    }
9939
9940
  /* Clear instruction information.  */
9941
9.75M
  info->insn_info_valid = 0;
9942
9.75M
  info->branch_delay_insns = 0;
9943
9.75M
  info->data_size = 0;
9944
9.75M
  info->insn_type = dis_noninsn;
9945
9.75M
  info->target = 0;
9946
9.75M
  info->target2 = 0;
9947
9948
  /* Reset jump operation indicator.  */
9949
9.75M
  ins.op_is_jump = false;
9950
9.75M
  {
9951
9.75M
    int jump_detection = 0;
9952
9953
    /* Extract flags.  */
9954
58.5M
    for (i = 0; i < MAX_OPERANDS; ++i)
9955
48.7M
      {
9956
48.7M
  if ((dp->op[i].rtn == OP_J)
9957
48.7M
      || (dp->op[i].rtn == OP_indirE))
9958
997k
    jump_detection |= 1;
9959
47.7M
  else if ((dp->op[i].rtn == BND_Fixup)
9960
47.7M
     || (!dp->op[i].rtn && !dp->op[i].bytemode))
9961
34.6M
    jump_detection |= 2;
9962
13.1M
  else if ((dp->op[i].bytemode == cond_jump_mode)
9963
13.1M
     || (dp->op[i].bytemode == loop_jcxz_mode))
9964
646k
    jump_detection |= 4;
9965
48.7M
      }
9966
9967
    /* Determine if this is a jump or branch.  */
9968
9.75M
    if ((jump_detection & 0x3) == 0x3)
9969
997k
      {
9970
997k
  ins.op_is_jump = true;
9971
997k
  if (jump_detection & 0x4)
9972
646k
    info->insn_type = dis_condbranch;
9973
351k
  else
9974
351k
    info->insn_type = (dp->name && !strncmp (dp->name, "call", 4))
9975
351k
      ? dis_jsr : dis_branch;
9976
997k
      }
9977
9.75M
  }
9978
9979
  /* If VEX.vvvv and EVEX.vvvv are unused, they must be all 1s, which
9980
     are all 0s in inverted form.  */
9981
9.75M
  if (ins.need_vex && ins.vex.register_specifier != 0)
9982
53.1k
    {
9983
53.1k
      i386_dis_printf (info, dis_style_text, "(bad)");
9984
53.1k
      ret = ins.end_codep - priv.the_buffer;
9985
53.1k
      goto out;
9986
53.1k
    }
9987
9988
  /* If EVEX.z is set, there must be an actual mask register in use.  */
9989
9.70M
  if (ins.vex.zeroing && ins.vex.mask_register_specifier == 0)
9990
1.31k
    {
9991
1.31k
      i386_dis_printf (info, dis_style_text, "(bad)");
9992
1.31k
      ret = ins.end_codep - priv.the_buffer;
9993
1.31k
      goto out;
9994
1.31k
    }
9995
9996
9.70M
  switch (dp->prefix_requirement)
9997
9.70M
    {
9998
28.5k
    case PREFIX_DATA:
9999
      /* If only the data prefix is marked as mandatory, its absence renders
10000
   the encoding invalid.  Most other PREFIX_OPCODE rules still apply.  */
10001
28.5k
      if (ins.need_vex ? !ins.vex.prefix : !(ins.prefixes & PREFIX_DATA))
10002
8.95k
  {
10003
8.95k
    i386_dis_printf (info, dis_style_text, "(bad)");
10004
8.95k
    ret = ins.end_codep - priv.the_buffer;
10005
8.95k
    goto out;
10006
8.95k
  }
10007
19.6k
      ins.used_prefixes |= PREFIX_DATA;
10008
      /* Fall through.  */
10009
47.6k
    case PREFIX_OPCODE:
10010
      /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
10011
   unused, opcode is invalid.  Since the PREFIX_DATA prefix may be
10012
   used by putop and MMX/SSE operand and may be overridden by the
10013
   PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
10014
   separately.  */
10015
47.6k
      if (((ins.need_vex
10016
47.6k
      ? ins.vex.prefix == REPE_PREFIX_OPCODE
10017
21.2k
        || ins.vex.prefix == REPNE_PREFIX_OPCODE
10018
47.6k
      : (ins.prefixes
10019
26.4k
         & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
10020
47.6k
     && (ins.used_prefixes
10021
18.3k
         & (PREFIX_REPZ | PREFIX_REPNZ)) == 0)
10022
47.6k
    || (((ins.need_vex
10023
32.4k
    ? ins.vex.prefix == DATA_PREFIX_OPCODE
10024
32.4k
    : ((ins.prefixes
10025
25.3k
        & (PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA))
10026
25.3k
       == PREFIX_DATA))
10027
32.4k
         && (ins.used_prefixes & PREFIX_DATA) == 0))
10028
47.6k
    || (ins.vex.evex && dp->prefix_requirement != PREFIX_DATA
10029
31.2k
        && !ins.vex.w != !(ins.used_prefixes & PREFIX_DATA)))
10030
16.6k
  {
10031
16.6k
    i386_dis_printf (info, dis_style_text, "(bad)");
10032
16.6k
    ret = ins.end_codep - priv.the_buffer;
10033
16.6k
    goto out;
10034
16.6k
  }
10035
30.9k
      break;
10036
10037
30.9k
    case PREFIX_IGNORED:
10038
      /* Zap data size and rep prefixes from used_prefixes and reinstate their
10039
   origins in all_prefixes.  */
10040
2.61k
      ins.used_prefixes &= ~PREFIX_OPCODE;
10041
2.61k
      if (ins.last_data_prefix >= 0)
10042
1.07k
  ins.all_prefixes[ins.last_data_prefix] = 0x66;
10043
2.61k
      if (ins.last_repz_prefix >= 0)
10044
868
  ins.all_prefixes[ins.last_repz_prefix] = 0xf3;
10045
2.61k
      if (ins.last_repnz_prefix >= 0)
10046
1.75k
  ins.all_prefixes[ins.last_repnz_prefix] = 0xf2;
10047
2.61k
      break;
10048
9.70M
    }
10049
10050
  /* Check if the REX prefix is used.  */
10051
9.67M
  if ((ins.rex ^ ins.rex_used) == 0
10052
9.67M
      && !ins.need_vex && ins.last_rex_prefix >= 0)
10053
563k
    ins.all_prefixes[ins.last_rex_prefix] = 0;
10054
10055
  /* Check if the SEG prefix is used.  */
10056
9.67M
  if ((ins.prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
10057
9.67M
           | PREFIX_FS | PREFIX_GS)) != 0
10058
9.67M
      && (ins.used_prefixes & ins.active_seg_prefix) != 0)
10059
57.3k
    ins.all_prefixes[ins.last_seg_prefix] = 0;
10060
10061
  /* Check if the ADDR prefix is used.  */
10062
9.67M
  if ((ins.prefixes & PREFIX_ADDR) != 0
10063
9.67M
      && (ins.used_prefixes & PREFIX_ADDR) != 0)
10064
17.0k
    ins.all_prefixes[ins.last_addr_prefix] = 0;
10065
10066
  /* Check if the DATA prefix is used.  */
10067
9.67M
  if ((ins.prefixes & PREFIX_DATA) != 0
10068
9.67M
      && (ins.used_prefixes & PREFIX_DATA) != 0
10069
9.67M
      && !ins.need_vex)
10070
67.0k
    ins.all_prefixes[ins.last_data_prefix] = 0;
10071
10072
  /* Print the extra ins.prefixes.  */
10073
9.67M
  prefix_length = 0;
10074
145M
  for (i = 0; i < (int) ARRAY_SIZE (ins.all_prefixes); i++)
10075
135M
    if (ins.all_prefixes[i])
10076
482k
      {
10077
482k
  const char *name = prefix_name (ins.address_mode, ins.all_prefixes[i],
10078
482k
          orig_sizeflag);
10079
10080
482k
  if (name == NULL)
10081
0
    abort ();
10082
482k
  prefix_length += strlen (name) + 1;
10083
482k
  i386_dis_printf (info, dis_style_mnemonic, "%s ", name);
10084
482k
      }
10085
10086
  /* Check maximum code length.  */
10087
9.67M
  if ((ins.codep - ins.start_codep) > MAX_CODE_LENGTH)
10088
2.08k
    {
10089
2.08k
      i386_dis_printf (info, dis_style_text, "(bad)");
10090
2.08k
      ret = MAX_CODE_LENGTH;
10091
2.08k
      goto out;
10092
2.08k
    }
10093
10094
  /* Calculate the number of operands this instruction has.  */
10095
9.67M
  op_count = 0;
10096
58.0M
  for (i = 0; i < MAX_OPERANDS; ++i)
10097
48.3M
    if (*ins.op_out[i] != '\0')
10098
13.3M
      ++op_count;
10099
10100
  /* Calculate the number of spaces to print after the mnemonic.  */
10101
9.67M
  ins.obufp = ins.mnemonicendp;
10102
9.67M
  if (op_count > 0)
10103
7.65M
    {
10104
7.65M
      i = strlen (ins.obuf) + prefix_length;
10105
7.65M
      if (i < 7)
10106
7.01M
  i = 7 - i;
10107
634k
      else
10108
634k
  i = 1;
10109
7.65M
    }
10110
2.02M
  else
10111
2.02M
    i = 0;
10112
10113
  /* Print the instruction mnemonic along with any trailing whitespace.  */
10114
9.67M
  i386_dis_printf (info, dis_style_mnemonic, "%s%*s", ins.obuf, i, "");
10115
10116
  /* The enter and bound instructions are printed with operands in the same
10117
     order as the intel book; everything else is printed in reverse order.  */
10118
9.67M
  intel_swap_2_3 = false;
10119
9.67M
  if (ins.intel_syntax || ins.two_source_ops)
10120
988k
    {
10121
5.92M
      for (i = 0; i < MAX_OPERANDS; ++i)
10122
4.94M
  op_txt[i] = ins.op_out[i];
10123
10124
988k
      if (ins.intel_syntax && dp && dp->op[2].rtn == OP_Rounding
10125
988k
          && dp->op[3].rtn == OP_E && dp->op[4].rtn == NULL)
10126
482
  {
10127
482
    op_txt[2] = ins.op_out[3];
10128
482
    op_txt[3] = ins.op_out[2];
10129
482
    intel_swap_2_3 = true;
10130
482
  }
10131
10132
2.96M
      for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
10133
1.97M
  {
10134
1.97M
    bool riprel;
10135
10136
1.97M
    ins.op_ad = ins.op_index[i];
10137
1.97M
    ins.op_index[i] = ins.op_index[MAX_OPERANDS - 1 - i];
10138
1.97M
    ins.op_index[MAX_OPERANDS - 1 - i] = ins.op_ad;
10139
1.97M
    riprel = ins.op_riprel[i];
10140
1.97M
    ins.op_riprel[i] = ins.op_riprel[MAX_OPERANDS - 1 - i];
10141
1.97M
    ins.op_riprel[MAX_OPERANDS - 1 - i] = riprel;
10142
1.97M
  }
10143
988k
    }
10144
8.68M
  else
10145
8.68M
    {
10146
52.1M
      for (i = 0; i < MAX_OPERANDS; ++i)
10147
43.4M
  op_txt[MAX_OPERANDS - 1 - i] = ins.op_out[i];
10148
8.68M
    }
10149
10150
9.67M
  needcomma = 0;
10151
58.0M
  for (i = 0; i < MAX_OPERANDS; ++i)
10152
48.3M
    if (*op_txt[i])
10153
13.3M
      {
10154
  /* In Intel syntax embedded rounding / SAE are not separate operands.
10155
     Instead they're attached to the prior register operand.  Simply
10156
     suppress emission of the comma to achieve that effect.  */
10157
13.3M
  switch (i & -(ins.intel_syntax && dp))
10158
13.3M
    {
10159
14.4k
    case 2:
10160
14.4k
      if (dp->op[2].rtn == OP_Rounding && !intel_swap_2_3)
10161
198
        needcomma = 0;
10162
14.4k
      break;
10163
2.47k
    case 3:
10164
2.47k
      if (dp->op[3].rtn == OP_Rounding || intel_swap_2_3)
10165
501
        needcomma = 0;
10166
2.47k
      break;
10167
13.3M
    }
10168
13.3M
  if (needcomma)
10169
5.74M
    i386_dis_printf (info, dis_style_text, ",");
10170
13.3M
  if (ins.op_index[i] != -1 && !ins.op_riprel[i])
10171
927k
    {
10172
927k
      bfd_vma target = (bfd_vma) ins.op_address[ins.op_index[i]];
10173
10174
927k
      if (ins.op_is_jump)
10175
927k
        {
10176
927k
    info->insn_info_valid = 1;
10177
927k
    info->branch_delay_insns = 0;
10178
927k
    info->data_size = 0;
10179
927k
    info->target = target;
10180
927k
    info->target2 = 0;
10181
927k
        }
10182
927k
      (*info->print_address_func) (target, info);
10183
927k
    }
10184
12.4M
  else
10185
12.4M
    i386_dis_printf (info, dis_style_text, "%s", op_txt[i]);
10186
13.3M
  needcomma = 1;
10187
13.3M
      }
10188
10189
57.8M
  for (i = 0; i < MAX_OPERANDS; i++)
10190
48.2M
    if (ins.op_index[i] != -1 && ins.op_riprel[i])
10191
146k
      {
10192
146k
  i386_dis_printf (info, dis_style_comment_start, "        # ");
10193
146k
  (*info->print_address_func)
10194
146k
    ((bfd_vma)(ins.start_pc + (ins.codep - ins.start_codep)
10195
146k
         + ins.op_address[ins.op_index[i]]),
10196
146k
    info);
10197
146k
  break;
10198
146k
      }
10199
9.67M
  ret = ins.codep - priv.the_buffer;
10200
9.89M
 out:
10201
9.89M
  info->private_data = NULL;
10202
9.89M
  return ret;
10203
9.67M
}
10204
10205
/* Here for backwards compatibility.  When gdb stops using
10206
   print_insn_i386_att and print_insn_i386_intel these functions can
10207
   disappear, and print_insn_i386 be merged into print_insn.  */
10208
int
10209
print_insn_i386_att (bfd_vma pc, disassemble_info *info)
10210
0
{
10211
0
  return print_insn (pc, info, 0);
10212
0
}
10213
10214
int
10215
print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
10216
0
{
10217
0
  return print_insn (pc, info, 1);
10218
0
}
10219
10220
int
10221
print_insn_i386 (bfd_vma pc, disassemble_info *info)
10222
9.89M
{
10223
9.89M
  return print_insn (pc, info, -1);
10224
9.89M
}
10225
10226
static const char *float_mem[] = {
10227
  /* d8 */
10228
  "fadd{s|}",
10229
  "fmul{s|}",
10230
  "fcom{s|}",
10231
  "fcomp{s|}",
10232
  "fsub{s|}",
10233
  "fsubr{s|}",
10234
  "fdiv{s|}",
10235
  "fdivr{s|}",
10236
  /* d9 */
10237
  "fld{s|}",
10238
  "(bad)",
10239
  "fst{s|}",
10240
  "fstp{s|}",
10241
  "fldenv{C|C}",
10242
  "fldcw",
10243
  "fNstenv{C|C}",
10244
  "fNstcw",
10245
  /* da */
10246
  "fiadd{l|}",
10247
  "fimul{l|}",
10248
  "ficom{l|}",
10249
  "ficomp{l|}",
10250
  "fisub{l|}",
10251
  "fisubr{l|}",
10252
  "fidiv{l|}",
10253
  "fidivr{l|}",
10254
  /* db */
10255
  "fild{l|}",
10256
  "fisttp{l|}",
10257
  "fist{l|}",
10258
  "fistp{l|}",
10259
  "(bad)",
10260
  "fld{t|}",
10261
  "(bad)",
10262
  "fstp{t|}",
10263
  /* dc */
10264
  "fadd{l|}",
10265
  "fmul{l|}",
10266
  "fcom{l|}",
10267
  "fcomp{l|}",
10268
  "fsub{l|}",
10269
  "fsubr{l|}",
10270
  "fdiv{l|}",
10271
  "fdivr{l|}",
10272
  /* dd */
10273
  "fld{l|}",
10274
  "fisttp{ll|}",
10275
  "fst{l||}",
10276
  "fstp{l|}",
10277
  "frstor{C|C}",
10278
  "(bad)",
10279
  "fNsave{C|C}",
10280
  "fNstsw",
10281
  /* de */
10282
  "fiadd{s|}",
10283
  "fimul{s|}",
10284
  "ficom{s|}",
10285
  "ficomp{s|}",
10286
  "fisub{s|}",
10287
  "fisubr{s|}",
10288
  "fidiv{s|}",
10289
  "fidivr{s|}",
10290
  /* df */
10291
  "fild{s|}",
10292
  "fisttp{s|}",
10293
  "fist{s|}",
10294
  "fistp{s|}",
10295
  "fbld",
10296
  "fild{ll|}",
10297
  "fbstp",
10298
  "fistp{ll|}",
10299
};
10300
10301
static const unsigned char float_mem_mode[] = {
10302
  /* d8 */
10303
  d_mode,
10304
  d_mode,
10305
  d_mode,
10306
  d_mode,
10307
  d_mode,
10308
  d_mode,
10309
  d_mode,
10310
  d_mode,
10311
  /* d9 */
10312
  d_mode,
10313
  0,
10314
  d_mode,
10315
  d_mode,
10316
  0,
10317
  w_mode,
10318
  0,
10319
  w_mode,
10320
  /* da */
10321
  d_mode,
10322
  d_mode,
10323
  d_mode,
10324
  d_mode,
10325
  d_mode,
10326
  d_mode,
10327
  d_mode,
10328
  d_mode,
10329
  /* db */
10330
  d_mode,
10331
  d_mode,
10332
  d_mode,
10333
  d_mode,
10334
  0,
10335
  t_mode,
10336
  0,
10337
  t_mode,
10338
  /* dc */
10339
  q_mode,
10340
  q_mode,
10341
  q_mode,
10342
  q_mode,
10343
  q_mode,
10344
  q_mode,
10345
  q_mode,
10346
  q_mode,
10347
  /* dd */
10348
  q_mode,
10349
  q_mode,
10350
  q_mode,
10351
  q_mode,
10352
  0,
10353
  0,
10354
  0,
10355
  w_mode,
10356
  /* de */
10357
  w_mode,
10358
  w_mode,
10359
  w_mode,
10360
  w_mode,
10361
  w_mode,
10362
  w_mode,
10363
  w_mode,
10364
  w_mode,
10365
  /* df */
10366
  w_mode,
10367
  w_mode,
10368
  w_mode,
10369
  w_mode,
10370
  t_mode,
10371
  q_mode,
10372
  t_mode,
10373
  q_mode
10374
};
10375
10376
#define ST { OP_ST, 0 }
10377
#define STi { OP_STi, 0 }
10378
10379
#define FGRPd9_2 NULL, { { NULL, 1 } }, 0
10380
#define FGRPd9_4 NULL, { { NULL, 2 } }, 0
10381
#define FGRPd9_5 NULL, { { NULL, 3 } }, 0
10382
#define FGRPd9_6 NULL, { { NULL, 4 } }, 0
10383
#define FGRPd9_7 NULL, { { NULL, 5 } }, 0
10384
#define FGRPda_5 NULL, { { NULL, 6 } }, 0
10385
#define FGRPdb_4 NULL, { { NULL, 7 } }, 0
10386
#define FGRPde_3 NULL, { { NULL, 8 } }, 0
10387
#define FGRPdf_4 NULL, { { NULL, 9 } }, 0
10388
10389
static const struct dis386 float_reg[][8] = {
10390
  /* d8 */
10391
  {
10392
    { "fadd", { ST, STi }, 0 },
10393
    { "fmul", { ST, STi }, 0 },
10394
    { "fcom", { STi }, 0 },
10395
    { "fcomp",  { STi }, 0 },
10396
    { "fsub", { ST, STi }, 0 },
10397
    { "fsubr",  { ST, STi }, 0 },
10398
    { "fdiv", { ST, STi }, 0 },
10399
    { "fdivr",  { ST, STi }, 0 },
10400
  },
10401
  /* d9 */
10402
  {
10403
    { "fld",  { STi }, 0 },
10404
    { "fxch", { STi }, 0 },
10405
    { FGRPd9_2 },
10406
    { Bad_Opcode },
10407
    { FGRPd9_4 },
10408
    { FGRPd9_5 },
10409
    { FGRPd9_6 },
10410
    { FGRPd9_7 },
10411
  },
10412
  /* da */
10413
  {
10414
    { "fcmovb", { ST, STi }, 0 },
10415
    { "fcmove", { ST, STi }, 0 },
10416
    { "fcmovbe",{ ST, STi }, 0 },
10417
    { "fcmovu", { ST, STi }, 0 },
10418
    { Bad_Opcode },
10419
    { FGRPda_5 },
10420
    { Bad_Opcode },
10421
    { Bad_Opcode },
10422
  },
10423
  /* db */
10424
  {
10425
    { "fcmovnb",{ ST, STi }, 0 },
10426
    { "fcmovne",{ ST, STi }, 0 },
10427
    { "fcmovnbe",{ ST, STi }, 0 },
10428
    { "fcmovnu",{ ST, STi }, 0 },
10429
    { FGRPdb_4 },
10430
    { "fucomi", { ST, STi }, 0 },
10431
    { "fcomi",  { ST, STi }, 0 },
10432
    { Bad_Opcode },
10433
  },
10434
  /* dc */
10435
  {
10436
    { "fadd", { STi, ST }, 0 },
10437
    { "fmul", { STi, ST }, 0 },
10438
    { Bad_Opcode },
10439
    { Bad_Opcode },
10440
    { "fsub{!M|r}", { STi, ST }, 0 },
10441
    { "fsub{M|}", { STi, ST }, 0 },
10442
    { "fdiv{!M|r}", { STi, ST }, 0 },
10443
    { "fdiv{M|}", { STi, ST }, 0 },
10444
  },
10445
  /* dd */
10446
  {
10447
    { "ffree",  { STi }, 0 },
10448
    { Bad_Opcode },
10449
    { "fst",  { STi }, 0 },
10450
    { "fstp", { STi }, 0 },
10451
    { "fucom",  { STi }, 0 },
10452
    { "fucomp", { STi }, 0 },
10453
    { Bad_Opcode },
10454
    { Bad_Opcode },
10455
  },
10456
  /* de */
10457
  {
10458
    { "faddp",  { STi, ST }, 0 },
10459
    { "fmulp",  { STi, ST }, 0 },
10460
    { Bad_Opcode },
10461
    { FGRPde_3 },
10462
    { "fsub{!M|r}p",  { STi, ST }, 0 },
10463
    { "fsub{M|}p",  { STi, ST }, 0 },
10464
    { "fdiv{!M|r}p",  { STi, ST }, 0 },
10465
    { "fdiv{M|}p",  { STi, ST }, 0 },
10466
  },
10467
  /* df */
10468
  {
10469
    { "ffreep", { STi }, 0 },
10470
    { Bad_Opcode },
10471
    { Bad_Opcode },
10472
    { Bad_Opcode },
10473
    { FGRPdf_4 },
10474
    { "fucomip", { ST, STi }, 0 },
10475
    { "fcomip", { ST, STi }, 0 },
10476
    { Bad_Opcode },
10477
  },
10478
};
10479
10480
static const char *const fgrps[][8] = {
10481
  /* Bad opcode 0 */
10482
  {
10483
    "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10484
  },
10485
10486
  /* d9_2  1 */
10487
  {
10488
    "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10489
  },
10490
10491
  /* d9_4  2 */
10492
  {
10493
    "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
10494
  },
10495
10496
  /* d9_5  3 */
10497
  {
10498
    "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
10499
  },
10500
10501
  /* d9_6  4 */
10502
  {
10503
    "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
10504
  },
10505
10506
  /* d9_7  5 */
10507
  {
10508
    "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
10509
  },
10510
10511
  /* da_5  6 */
10512
  {
10513
    "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10514
  },
10515
10516
  /* db_4  7 */
10517
  {
10518
    "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
10519
    "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
10520
  },
10521
10522
  /* de_3  8 */
10523
  {
10524
    "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10525
  },
10526
10527
  /* df_4  9 */
10528
  {
10529
    "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10530
  },
10531
};
10532
10533
static void
10534
swap_operand (instr_info *ins)
10535
1.84k
{
10536
1.84k
  ins->mnemonicendp[0] = '.';
10537
1.84k
  ins->mnemonicendp[1] = 's';
10538
1.84k
  ins->mnemonicendp[2] = '\0';
10539
1.84k
  ins->mnemonicendp += 2;
10540
1.84k
}
10541
10542
static bool
10543
OP_Skip_MODRM (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
10544
         int sizeflag ATTRIBUTE_UNUSED)
10545
511
{
10546
  /* Skip mod/rm byte.  */
10547
511
  MODRM_CHECK;
10548
511
  ins->codep++;
10549
511
  return true;
10550
511
}
10551
10552
static bool
10553
dofloat (instr_info *ins, int sizeflag)
10554
457k
{
10555
457k
  const struct dis386 *dp;
10556
457k
  unsigned char floatop = ins->codep[-1];
10557
10558
457k
  if (ins->modrm.mod != 3)
10559
67.4k
    {
10560
67.4k
      int fp_indx = (floatop - 0xd8) * 8 + ins->modrm.reg;
10561
10562
67.4k
      putop (ins, float_mem[fp_indx], sizeflag);
10563
67.4k
      ins->obufp = ins->op_out[0];
10564
67.4k
      ins->op_ad = 2;
10565
67.4k
      return OP_E (ins, float_mem_mode[fp_indx], sizeflag);
10566
67.4k
    }
10567
  /* Skip mod/rm byte.  */
10568
390k
  MODRM_CHECK;
10569
390k
  ins->codep++;
10570
10571
390k
  dp = &float_reg[floatop - 0xd8][ins->modrm.reg];
10572
390k
  if (dp->name == NULL)
10573
22.7k
    {
10574
22.7k
      putop (ins, fgrps[dp->op[0].bytemode][ins->modrm.rm], sizeflag);
10575
10576
      /* Instruction fnstsw is only one with strange arg.  */
10577
22.7k
      if (floatop == 0xdf && ins->codep[-1] == 0xe0)
10578
1.45k
  strcpy (ins->op_out[0], att_names16[0] + ins->intel_syntax);
10579
22.7k
    }
10580
367k
  else
10581
367k
    {
10582
367k
      putop (ins, dp->name, sizeflag);
10583
10584
367k
      ins->obufp = ins->op_out[0];
10585
367k
      ins->op_ad = 2;
10586
367k
      if (dp->op[0].rtn
10587
367k
    && !dp->op[0].rtn (ins, dp->op[0].bytemode, sizeflag))
10588
0
  return false;
10589
10590
367k
      ins->obufp = ins->op_out[1];
10591
367k
      ins->op_ad = 1;
10592
367k
      if (dp->op[1].rtn
10593
367k
    && !dp->op[1].rtn (ins, dp->op[1].bytemode, sizeflag))
10594
0
  return false;
10595
367k
    }
10596
390k
  return true;
10597
390k
}
10598
10599
static bool
10600
OP_ST (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
10601
       int sizeflag ATTRIBUTE_UNUSED)
10602
358k
{
10603
358k
  oappend_register (ins, "%st");
10604
358k
  return true;
10605
358k
}
10606
10607
static bool
10608
OP_STi (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
10609
  int sizeflag ATTRIBUTE_UNUSED)
10610
367k
{
10611
367k
  char scratch[8];
10612
367k
  int res = snprintf (scratch, ARRAY_SIZE (scratch), "%%st(%d)", ins->modrm.rm);
10613
10614
367k
  if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
10615
0
    abort ();
10616
367k
  oappend_register (ins, scratch);
10617
367k
  return true;
10618
367k
}
10619
10620
/* Capital letters in template are macros.  */
10621
static int
10622
putop (instr_info *ins, const char *in_template, int sizeflag)
10623
9.76M
{
10624
9.76M
  const char *p;
10625
9.76M
  int alt = 0;
10626
9.76M
  int cond = 1;
10627
9.76M
  unsigned int l = 0, len = 0;
10628
9.76M
  char last[4];
10629
10630
56.1M
  for (p = in_template; *p; p++)
10631
46.4M
    {
10632
46.4M
      if (len > l)
10633
290k
  {
10634
290k
    if (l >= sizeof (last) || !ISUPPER (*p))
10635
0
      abort ();
10636
290k
    last[l++] = *p;
10637
290k
    continue;
10638
290k
  }
10639
46.1M
      switch (*p)
10640
46.1M
  {
10641
35.8M
  default:
10642
35.8M
    *ins->obufp++ = *p;
10643
35.8M
    break;
10644
290k
  case '%':
10645
290k
    len++;
10646
290k
    break;
10647
429k
  case '!':
10648
429k
    cond = 0;
10649
429k
    break;
10650
1.24M
  case '{':
10651
1.24M
    if (ins->intel_syntax)
10652
133k
      {
10653
314k
        while (*++p != '|')
10654
180k
    if (*p == '}' || *p == '\0')
10655
0
      abort ();
10656
133k
        alt = 1;
10657
133k
      }
10658
1.24M
    break;
10659
1.24M
  case '|':
10660
1.15M
    while (*++p != '}')
10661
45.5k
      {
10662
45.5k
        if (*p == '\0')
10663
0
    abort ();
10664
45.5k
      }
10665
1.10M
    break;
10666
1.10M
  case '}':
10667
133k
    alt = 0;
10668
133k
    break;
10669
168k
  case 'A':
10670
168k
    if (ins->intel_syntax)
10671
10.6k
      break;
10672
158k
    if ((ins->need_modrm && ins->modrm.mod != 3)
10673
158k
        || (sizeflag & SUFFIX_ALWAYS))
10674
119k
      *ins->obufp++ = 'b';
10675
158k
    break;
10676
2.49M
  case 'B':
10677
2.49M
    if (l == 0)
10678
2.47M
      {
10679
2.49M
      case_B:
10680
2.49M
        if (ins->intel_syntax)
10681
274k
    break;
10682
2.22M
        if (sizeflag & SUFFIX_ALWAYS)
10683
3.82k
    *ins->obufp++ = 'b';
10684
2.22M
      }
10685
24.8k
    else if (l == 1 && last[0] == 'L')
10686
24.8k
      {
10687
24.8k
        if (ins->address_mode == mode_64bit
10688
24.8k
      && !(ins->prefixes & PREFIX_ADDR))
10689
18.6k
    {
10690
18.6k
      *ins->obufp++ = 'a';
10691
18.6k
      *ins->obufp++ = 'b';
10692
18.6k
      *ins->obufp++ = 's';
10693
18.6k
    }
10694
10695
24.8k
        goto case_B;
10696
24.8k
      }
10697
0
    else
10698
0
      abort ();
10699
2.22M
    break;
10700
2.22M
  case 'C':
10701
4.45k
    if (ins->intel_syntax && !alt)
10702
0
      break;
10703
4.45k
    if ((ins->prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
10704
883
      {
10705
883
        if (sizeflag & DFLAG)
10706
360
    *ins->obufp++ = ins->intel_syntax ? 'd' : 'l';
10707
523
        else
10708
523
    *ins->obufp++ = ins->intel_syntax ? 'w' : 's';
10709
883
        ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
10710
883
      }
10711
4.45k
    break;
10712
30.1k
  case 'D':
10713
30.1k
    if (l == 1)
10714
5.68k
      {
10715
5.68k
        switch (last[0])
10716
5.68k
        {
10717
5.68k
        case 'X':
10718
5.68k
    if (!ins->vex.evex || ins->vex.w)
10719
5.24k
      *ins->obufp++ = 'd';
10720
445
    else
10721
445
      oappend (ins, "{bad}");
10722
5.68k
    break;
10723
0
        default:
10724
0
    abort ();
10725
5.68k
        }
10726
5.68k
        break;
10727
5.68k
      }
10728
24.4k
    if (l)
10729
0
      abort ();
10730
24.4k
    if (ins->intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
10731
23.5k
      break;
10732
902
    USED_REX (REX_W);
10733
902
    if (ins->modrm.mod == 3)
10734
694
      {
10735
694
        if (ins->rex & REX_W)
10736
208
    *ins->obufp++ = 'q';
10737
486
        else
10738
486
    {
10739
486
      if (sizeflag & DFLAG)
10740
190
        *ins->obufp++ = ins->intel_syntax ? 'd' : 'l';
10741
296
      else
10742
296
        *ins->obufp++ = 'w';
10743
486
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
10744
486
    }
10745
694
      }
10746
208
    else
10747
208
      *ins->obufp++ = 'w';
10748
902
    break;
10749
34.3k
  case 'E':
10750
34.3k
    if (l == 1)
10751
21.1k
      {
10752
21.1k
        switch (last[0])
10753
21.1k
    {
10754
21.1k
    case 'X':
10755
21.1k
      if (!ins->vex.evex || ins->vex.b || ins->vex.ll >= 2
10756
21.1k
          || !ins->vex.r
10757
21.1k
          || (ins->modrm.mod == 3 && (ins->rex & REX_X))
10758
21.1k
          || !ins->vex.v || ins->vex.mask_register_specifier)
10759
19.8k
        break;
10760
      /* AVX512 extends a number of V*D insns to also have V*Q variants,
10761
         merely distinguished by EVEX.W.  Look for a use of the
10762
         respective macro.  */
10763
1.26k
      if (ins->vex.w)
10764
765
        {
10765
765
          const char *pct = strchr (p + 1, '%');
10766
10767
765
          if (pct != NULL && pct[1] == 'D' && pct[2] == 'Q')
10768
294
      break;
10769
765
        }
10770
972
      *ins->obufp++ = '{';
10771
972
      *ins->obufp++ = 'e';
10772
972
      *ins->obufp++ = 'v';
10773
972
      *ins->obufp++ = 'e';
10774
972
      *ins->obufp++ = 'x';
10775
972
      *ins->obufp++ = '}';
10776
972
      *ins->obufp++ = ' ';
10777
972
      break;
10778
0
    default:
10779
0
      abort ();
10780
21.1k
    }
10781
21.1k
    break;
10782
21.1k
      }
10783
    /* For jcxz/jecxz */
10784
13.2k
    if (ins->address_mode == mode_64bit)
10785
10.0k
      {
10786
10.0k
        if (sizeflag & AFLAG)
10787
9.46k
    *ins->obufp++ = 'r';
10788
596
        else
10789
596
    *ins->obufp++ = 'e';
10790
10.0k
      }
10791
3.18k
    else
10792
3.18k
      if (sizeflag & AFLAG)
10793
2.01k
        *ins->obufp++ = 'e';
10794
13.2k
    ins->used_prefixes |= (ins->prefixes & PREFIX_ADDR);
10795
13.2k
    break;
10796
40.8k
  case 'F':
10797
40.8k
    if (ins->intel_syntax)
10798
8.21k
      break;
10799
32.6k
    if ((ins->prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
10800
810
      {
10801
810
        if (sizeflag & AFLAG)
10802
288
    *ins->obufp++ = ins->address_mode == mode_64bit ? 'q' : 'l';
10803
522
        else
10804
522
    *ins->obufp++ = ins->address_mode == mode_64bit ? 'l' : 'w';
10805
810
        ins->used_prefixes |= (ins->prefixes & PREFIX_ADDR);
10806
810
      }
10807
32.6k
    break;
10808
105k
  case 'G':
10809
105k
    if (ins->intel_syntax || (ins->obufp[-1] != 's'
10810
88.1k
            && !(sizeflag & SUFFIX_ALWAYS)))
10811
57.9k
      break;
10812
47.2k
    if ((ins->rex & REX_W) || (sizeflag & DFLAG))
10813
46.1k
      *ins->obufp++ = 'l';
10814
1.01k
    else
10815
1.01k
      *ins->obufp++ = 'w';
10816
47.2k
    if (!(ins->rex & REX_W))
10817
44.5k
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
10818
47.2k
    break;
10819
659k
  case 'H':
10820
659k
    if (l == 0)
10821
647k
      {
10822
647k
        if (ins->intel_syntax)
10823
51.4k
          break;
10824
596k
        if ((ins->prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
10825
596k
      || (ins->prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
10826
3.92k
    {
10827
3.92k
      ins->used_prefixes |= ins->prefixes & (PREFIX_CS | PREFIX_DS);
10828
3.92k
      *ins->obufp++ = ',';
10829
3.92k
      *ins->obufp++ = 'p';
10830
10831
      /* Set active_seg_prefix even if not set in 64-bit mode
10832
         because here it is a valid branch hint. */
10833
3.92k
      if (ins->prefixes & PREFIX_DS)
10834
999
        {
10835
999
          ins->active_seg_prefix = PREFIX_DS;
10836
999
          *ins->obufp++ = 't';
10837
999
        }
10838
2.92k
      else
10839
2.92k
        {
10840
2.92k
          ins->active_seg_prefix = PREFIX_CS;
10841
2.92k
          *ins->obufp++ = 'n';
10842
2.92k
        }
10843
3.92k
    }
10844
596k
      }
10845
11.7k
    else if (l == 1 && last[0] == 'X')
10846
11.7k
      {
10847
11.7k
        if (!ins->vex.w)
10848
6.50k
    *ins->obufp++ = 'h';
10849
5.25k
        else
10850
5.25k
    oappend (ins, "{bad}");
10851
11.7k
      }
10852
0
    else
10853
0
      abort ();
10854
607k
    break;
10855
607k
  case 'K':
10856
811
    USED_REX (REX_W);
10857
811
    if (ins->rex & REX_W)
10858
349
      *ins->obufp++ = 'q';
10859
462
    else
10860
462
      *ins->obufp++ = 'd';
10861
811
    break;
10862
0
  case 'L':
10863
0
    abort ();
10864
2.89k
  case 'M':
10865
2.89k
    if (ins->intel_mnemonic != cond)
10866
2.03k
      *ins->obufp++ = 'r';
10867
2.89k
    break;
10868
4.44k
  case 'N':
10869
4.44k
    if ((ins->prefixes & PREFIX_FWAIT) == 0)
10870
4.03k
      *ins->obufp++ = 'n';
10871
412
    else
10872
412
      ins->used_prefixes |= PREFIX_FWAIT;
10873
4.44k
    break;
10874
13.6k
  case 'O':
10875
13.6k
    USED_REX (REX_W);
10876
13.6k
    if (ins->rex & REX_W)
10877
1.17k
      *ins->obufp++ = 'o';
10878
12.4k
    else if (ins->intel_syntax && (sizeflag & DFLAG))
10879
2.28k
      *ins->obufp++ = 'q';
10880
10.1k
    else
10881
10.1k
      *ins->obufp++ = 'd';
10882
13.6k
    if (!(ins->rex & REX_W))
10883
12.4k
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
10884
13.6k
    break;
10885
226k
  case '@':
10886
226k
    if (ins->address_mode == mode_64bit
10887
226k
        && (ins->isa64 == intel64 || (ins->rex & REX_W)
10888
209k
      || !(ins->prefixes & PREFIX_DATA)))
10889
207k
      {
10890
207k
        if (sizeflag & SUFFIX_ALWAYS)
10891
224
    *ins->obufp++ = 'q';
10892
207k
        break;
10893
207k
      }
10894
    /* Fall through.  */
10895
790k
  case 'P':
10896
790k
    if (l == 0)
10897
758k
      {
10898
758k
        if ((ins->modrm.mod == 3 || !cond)
10899
758k
      && !(sizeflag & SUFFIX_ALWAYS))
10900
435k
    break;
10901
    /* Fall through.  */
10902
323k
  case 'T':
10903
323k
        if ((!(ins->rex & REX_W) && (ins->prefixes & PREFIX_DATA))
10904
323k
      || ((sizeflag & SUFFIX_ALWAYS)
10905
318k
          && ins->address_mode != mode_64bit))
10906
5.44k
    {
10907
5.44k
      *ins->obufp++ = (sizeflag & DFLAG)
10908
5.44k
          ? ins->intel_syntax ? 'd' : 'l' : 'w';
10909
5.44k
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
10910
5.44k
    }
10911
317k
        else if (sizeflag & SUFFIX_ALWAYS)
10912
768
    *ins->obufp++ = 'q';
10913
323k
      }
10914
31.9k
    else if (l == 1 && last[0] == 'L')
10915
31.9k
      {
10916
31.9k
        if ((ins->prefixes & PREFIX_DATA)
10917
31.9k
      || (ins->rex & REX_W)
10918
31.9k
      || (sizeflag & SUFFIX_ALWAYS))
10919
3.72k
    {
10920
3.72k
      USED_REX (REX_W);
10921
3.72k
      if (ins->rex & REX_W)
10922
1.14k
        *ins->obufp++ = 'q';
10923
2.58k
      else
10924
2.58k
        {
10925
2.58k
          if (sizeflag & DFLAG)
10926
1.36k
      *ins->obufp++ = ins->intel_syntax ? 'd' : 'l';
10927
1.21k
          else
10928
1.21k
      *ins->obufp++ = 'w';
10929
2.58k
          ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
10930
2.58k
        }
10931
3.72k
    }
10932
31.9k
      }
10933
0
    else
10934
0
      abort ();
10935
354k
    break;
10936
367k
  case 'Q':
10937
367k
    if (l == 0)
10938
355k
      {
10939
355k
        if (ins->intel_syntax && !alt)
10940
25.2k
    break;
10941
330k
        USED_REX (REX_W);
10942
330k
        if ((ins->need_modrm && ins->modrm.mod != 3)
10943
330k
      || (sizeflag & SUFFIX_ALWAYS))
10944
154k
    {
10945
154k
      if (ins->rex & REX_W)
10946
10.5k
        *ins->obufp++ = 'q';
10947
143k
      else
10948
143k
        {
10949
143k
          if (sizeflag & DFLAG)
10950
126k
      *ins->obufp++ = ins->intel_syntax ? 'd' : 'l';
10951
16.9k
          else
10952
16.9k
      *ins->obufp++ = 'w';
10953
143k
          ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
10954
143k
        }
10955
154k
    }
10956
330k
      }
10957
12.1k
    else if (l == 1 && last[0] == 'D')
10958
8.92k
      *ins->obufp++ = ins->vex.w ? 'q' : 'd';
10959
3.19k
    else if (l == 1 && last[0] == 'L')
10960
3.19k
      {
10961
3.19k
        if (cond ? ins->modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)
10962
3.19k
           : ins->address_mode != mode_64bit)
10963
1.13k
    break;
10964
2.06k
        if ((ins->rex & REX_W))
10965
217
    {
10966
217
      USED_REX (REX_W);
10967
217
      *ins->obufp++ = 'q';
10968
217
    }
10969
1.84k
        else if ((ins->address_mode == mode_64bit && cond)
10970
1.84k
          || (sizeflag & SUFFIX_ALWAYS))
10971
1.03k
    *ins->obufp++ = ins->intel_syntax? 'd' : 'l';
10972
2.06k
      }
10973
0
    else
10974
0
      abort ();
10975
341k
    break;
10976
341k
  case 'R':
10977
97.8k
    USED_REX (REX_W);
10978
97.8k
    if (ins->rex & REX_W)
10979
3.77k
      *ins->obufp++ = 'q';
10980
94.0k
    else if (sizeflag & DFLAG)
10981
84.4k
      {
10982
84.4k
        if (ins->intel_syntax)
10983
5.60k
      *ins->obufp++ = 'd';
10984
78.8k
        else
10985
78.8k
      *ins->obufp++ = 'l';
10986
84.4k
      }
10987
9.65k
    else
10988
9.65k
      *ins->obufp++ = 'w';
10989
97.8k
    if (ins->intel_syntax && !p[1]
10990
97.8k
        && ((ins->rex & REX_W) || (sizeflag & DFLAG)))
10991
3.75k
      *ins->obufp++ = 'e';
10992
97.8k
    if (!(ins->rex & REX_W))
10993
94.0k
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
10994
97.8k
    break;
10995
1.84M
  case 'S':
10996
1.84M
    if (l == 0)
10997
1.81M
      {
10998
1.98M
      case_S:
10999
1.98M
        if (ins->intel_syntax)
11000
139k
    break;
11001
1.84M
        if (sizeflag & SUFFIX_ALWAYS)
11002
1.83k
    {
11003
1.83k
      if (ins->rex & REX_W)
11004
274
        *ins->obufp++ = 'q';
11005
1.56k
      else
11006
1.56k
        {
11007
1.56k
          if (sizeflag & DFLAG)
11008
1.34k
      *ins->obufp++ = 'l';
11009
218
          else
11010
218
      *ins->obufp++ = 'w';
11011
1.56k
          ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11012
1.56k
        }
11013
1.83k
    }
11014
1.84M
        break;
11015
1.98M
      }
11016
29.3k
    if (l != 1)
11017
0
      abort ();
11018
29.3k
    switch (last[0])
11019
29.3k
      {
11020
27.0k
      case 'L':
11021
27.0k
        if (ins->address_mode == mode_64bit
11022
27.0k
      && !(ins->prefixes & PREFIX_ADDR))
11023
13.5k
    {
11024
13.5k
      *ins->obufp++ = 'a';
11025
13.5k
      *ins->obufp++ = 'b';
11026
13.5k
      *ins->obufp++ = 's';
11027
13.5k
    }
11028
11029
27.0k
        goto case_S;
11030
2.27k
      case 'X':
11031
2.27k
        if (!ins->vex.evex || !ins->vex.w)
11032
1.76k
    *ins->obufp++ = 's';
11033
510
        else
11034
510
    oappend (ins, "{bad}");
11035
2.27k
        break;
11036
0
      default:
11037
0
        abort ();
11038
29.3k
      }
11039
2.27k
    break;
11040
138k
  case 'V':
11041
138k
    if (l == 0)
11042
0
      abort ();
11043
138k
    else if (l == 1)
11044
138k
      {
11045
138k
        switch (last[0])
11046
138k
    {
11047
952
    case 'X':
11048
952
      if (ins->vex.evex)
11049
304
        break;
11050
648
      *ins->obufp++ = '{';
11051
648
      *ins->obufp++ = 'v';
11052
648
      *ins->obufp++ = 'e';
11053
648
      *ins->obufp++ = 'x';
11054
648
      *ins->obufp++ = '}';
11055
648
      *ins->obufp++ = ' ';
11056
648
      break;
11057
137k
    case 'L':
11058
137k
      if (ins->rex & REX_W)
11059
4.00k
        {
11060
4.00k
          *ins->obufp++ = 'a';
11061
4.00k
          *ins->obufp++ = 'b';
11062
4.00k
          *ins->obufp++ = 's';
11063
4.00k
        }
11064
137k
      goto case_S;
11065
0
    default:
11066
0
      abort ();
11067
138k
    }
11068
138k
      }
11069
0
    else
11070
0
      abort ();
11071
952
    break;
11072
27.8k
  case 'W':
11073
27.8k
    if (l == 0)
11074
17.8k
      {
11075
        /* operand size flag for cwtl, cbtw */
11076
17.8k
        USED_REX (REX_W);
11077
17.8k
        if (ins->rex & REX_W)
11078
2.11k
    {
11079
2.11k
      if (ins->intel_syntax)
11080
438
        *ins->obufp++ = 'd';
11081
1.68k
      else
11082
1.68k
        *ins->obufp++ = 'l';
11083
2.11k
    }
11084
15.7k
        else if (sizeflag & DFLAG)
11085
13.6k
    *ins->obufp++ = 'w';
11086
2.12k
        else
11087
2.12k
    *ins->obufp++ = 'b';
11088
17.8k
        if (!(ins->rex & REX_W))
11089
15.7k
    ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11090
17.8k
      }
11091
10.0k
    else if (l == 1)
11092
10.0k
      {
11093
10.0k
        if (!ins->need_vex)
11094
0
    abort ();
11095
10.0k
        if (last[0] == 'X')
11096
8.39k
    *ins->obufp++ = ins->vex.w ? 'd': 's';
11097
1.64k
        else if (last[0] == 'B')
11098
1.64k
    *ins->obufp++ = ins->vex.w ? 'w': 'b';
11099
0
        else
11100
0
    abort ();
11101
10.0k
      }
11102
0
    else
11103
0
      abort ();
11104
27.8k
    break;
11105
27.8k
  case 'X':
11106
8.22k
    if (l != 0)
11107
0
      abort ();
11108
8.22k
    if (ins->need_vex
11109
8.22k
        ? ins->vex.prefix == DATA_PREFIX_OPCODE
11110
8.22k
        : ins->prefixes & PREFIX_DATA)
11111
2.31k
      {
11112
2.31k
        *ins->obufp++ = 'd';
11113
2.31k
        ins->used_prefixes |= PREFIX_DATA;
11114
2.31k
      }
11115
5.91k
    else
11116
5.91k
      *ins->obufp++ = 's';
11117
8.22k
    break;
11118
3.76k
  case 'Y':
11119
3.76k
    if (l == 1 && last[0] == 'X')
11120
3.76k
      {
11121
3.76k
        if (!ins->need_vex)
11122
0
    abort ();
11123
3.76k
        if (ins->intel_syntax
11124
3.76k
      || ((ins->modrm.mod == 3 || ins->vex.b)
11125
2.07k
          && !(sizeflag & SUFFIX_ALWAYS)))
11126
2.59k
    break;
11127
1.16k
        switch (ins->vex.length)
11128
1.16k
    {
11129
513
    case 128:
11130
513
      *ins->obufp++ = 'x';
11131
513
      break;
11132
446
    case 256:
11133
446
      *ins->obufp++ = 'y';
11134
446
      break;
11135
210
    case 512:
11136
210
      if (!ins->vex.evex)
11137
0
    default:
11138
0
        abort ();
11139
1.16k
    }
11140
1.16k
      }
11141
0
    else
11142
0
      abort ();
11143
1.16k
    break;
11144
5.96k
  case 'Z':
11145
5.96k
    if (l == 0)
11146
3.95k
      {
11147
        /* These insns ignore ModR/M.mod: Force it to 3 for OP_E().  */
11148
3.95k
        ins->modrm.mod = 3;
11149
3.95k
        if (!ins->intel_syntax && (sizeflag & SUFFIX_ALWAYS))
11150
202
    *ins->obufp++ = ins->address_mode == mode_64bit ? 'q' : 'l';
11151
3.95k
      }
11152
2.01k
    else if (l == 1 && last[0] == 'X')
11153
2.01k
      {
11154
2.01k
        if (!ins->vex.evex)
11155
0
    abort ();
11156
2.01k
        if (ins->intel_syntax
11157
2.01k
      || ((ins->modrm.mod == 3 || ins->vex.b)
11158
1.43k
          && !(sizeflag & SUFFIX_ALWAYS)))
11159
980
    break;
11160
1.03k
        switch (ins->vex.length)
11161
1.03k
    {
11162
391
    case 128:
11163
391
      *ins->obufp++ = 'x';
11164
391
      break;
11165
260
    case 256:
11166
260
      *ins->obufp++ = 'y';
11167
260
      break;
11168
380
    case 512:
11169
380
      *ins->obufp++ = 'z';
11170
380
      break;
11171
0
    default:
11172
0
      abort ();
11173
1.03k
    }
11174
1.03k
      }
11175
0
    else
11176
0
      abort ();
11177
4.98k
    break;
11178
16.6k
  case '^':
11179
16.6k
    if (ins->intel_syntax)
11180
6.13k
      break;
11181
10.5k
    if (ins->isa64 == intel64 && (ins->rex & REX_W))
11182
190
      {
11183
190
        USED_REX (REX_W);
11184
190
        *ins->obufp++ = 'q';
11185
190
        break;
11186
190
      }
11187
10.3k
    if ((ins->prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
11188
928
      {
11189
928
        if (sizeflag & DFLAG)
11190
606
    *ins->obufp++ = 'l';
11191
322
        else
11192
322
    *ins->obufp++ = 'w';
11193
928
        ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11194
928
      }
11195
10.3k
    break;
11196
46.1M
  }
11197
11198
46.1M
      if (len == l)
11199
45.8M
  len = l = 0;
11200
46.1M
    }
11201
9.76M
  *ins->obufp = 0;
11202
9.76M
  ins->mnemonicendp = ins->obufp;
11203
9.76M
  return 0;
11204
9.76M
}
11205
11206
/* Add a style marker to *INS->obufp that encodes STYLE.  This assumes that
11207
   the buffer pointed to by INS->obufp has space.  A style marker is made
11208
   from the STYLE_MARKER_CHAR followed by STYLE converted to a single hex
11209
   digit, followed by another STYLE_MARKER_CHAR.  This function assumes
11210
   that the number of styles is not greater than 16.  */
11211
11212
static void
11213
oappend_insert_style (instr_info *ins, enum disassembler_style style)
11214
26.2M
{
11215
26.2M
  unsigned num = (unsigned) style;
11216
11217
  /* We currently assume that STYLE can be encoded as a single hex
11218
     character.  If more styles are added then this might start to fail,
11219
     and we'll need to expand this code.  */
11220
26.2M
  if (num > 0xf)
11221
0
    abort ();
11222
11223
26.2M
  *ins->obufp++ = STYLE_MARKER_CHAR;
11224
26.2M
  *ins->obufp++ = (num < 10 ? ('0' + num)
11225
26.2M
       : ((num < 16) ? ('a' + (num - 10)) : '0'));
11226
26.2M
  *ins->obufp++ = STYLE_MARKER_CHAR;
11227
11228
  /* This final null character is not strictly necessary, after inserting a
11229
     style marker we should always be inserting some additional content.
11230
     However, having the buffer null terminated doesn't cost much, and make
11231
     it easier to debug what's going on.  Also, if we do ever forget to add
11232
     any additional content after this style marker, then the buffer will
11233
     still be well formed.  */
11234
26.2M
  *ins->obufp = '\0';
11235
26.2M
}
11236
11237
static void
11238
oappend_with_style (instr_info *ins, const char *s,
11239
        enum disassembler_style style)
11240
16.2M
{
11241
16.2M
  oappend_insert_style (ins, style);
11242
16.2M
  ins->obufp = stpcpy (ins->obufp, s);
11243
16.2M
}
11244
11245
/* Add a single character C to the buffer pointer to by INS->obufp, marking
11246
   the style for the character as STYLE.  */
11247
11248
static void
11249
oappend_char_with_style (instr_info *ins, const char c,
11250
       enum disassembler_style style)
11251
10.0M
{
11252
10.0M
  oappend_insert_style (ins, style);
11253
10.0M
  *ins->obufp++ = c;
11254
10.0M
  *ins->obufp = '\0';
11255
10.0M
}
11256
11257
/* Like oappend_char_with_style, but always uses dis_style_text.  */
11258
11259
static void
11260
oappend_char (instr_info *ins, const char c)
11261
8.36M
{
11262
8.36M
  oappend_char_with_style (ins, c, dis_style_text);
11263
8.36M
}
11264
11265
static void
11266
append_seg (instr_info *ins)
11267
3.70M
{
11268
  /* Only print the active segment register.  */
11269
3.70M
  if (!ins->active_seg_prefix)
11270
3.47M
    return;
11271
11272
229k
  ins->used_prefixes |= ins->active_seg_prefix;
11273
229k
  switch (ins->active_seg_prefix)
11274
229k
    {
11275
3.53k
    case PREFIX_CS:
11276
3.53k
      oappend_register (ins, att_names_seg[1]);
11277
3.53k
      break;
11278
180k
    case PREFIX_DS:
11279
180k
      oappend_register (ins, att_names_seg[3]);
11280
180k
      break;
11281
2.01k
    case PREFIX_SS:
11282
2.01k
      oappend_register (ins, att_names_seg[2]);
11283
2.01k
      break;
11284
1.69k
    case PREFIX_ES:
11285
1.69k
      oappend_register (ins, att_names_seg[0]);
11286
1.69k
      break;
11287
20.2k
    case PREFIX_FS:
11288
20.2k
      oappend_register (ins, att_names_seg[4]);
11289
20.2k
      break;
11290
21.6k
    case PREFIX_GS:
11291
21.6k
      oappend_register (ins, att_names_seg[5]);
11292
21.6k
      break;
11293
0
    default:
11294
0
      break;
11295
229k
    }
11296
229k
  oappend_char (ins, ':');
11297
229k
}
11298
11299
static bool
11300
OP_indirE (instr_info *ins, int bytemode, int sizeflag)
11301
70.3k
{
11302
70.3k
  if (!ins->intel_syntax)
11303
56.0k
    oappend (ins, "*");
11304
70.3k
  return OP_E (ins, bytemode, sizeflag);
11305
70.3k
}
11306
11307
static void
11308
print_operand_value (instr_info *ins, bfd_vma disp,
11309
         enum disassembler_style style)
11310
2.27M
{
11311
2.27M
  char tmp[30];
11312
11313
2.27M
  if (ins->address_mode != mode_64bit)
11314
682k
    disp &= 0xffffffff;
11315
2.27M
  sprintf (tmp, "0x%" PRIx64, (uint64_t) disp);
11316
2.27M
  oappend_with_style (ins, tmp, style);
11317
2.27M
}
11318
11319
/* Like oappend, but called for immediate operands.  */
11320
11321
static void
11322
oappend_immediate (instr_info *ins, bfd_vma imm)
11323
1.25M
{
11324
1.25M
  if (!ins->intel_syntax)
11325
1.12M
    oappend_char_with_style (ins, '$', dis_style_immediate);
11326
1.25M
  print_operand_value (ins, imm, dis_style_immediate);
11327
1.25M
}
11328
11329
/* Put DISP in BUF as signed hex number.  */
11330
11331
static void
11332
print_displacement (instr_info *ins, bfd_signed_vma val)
11333
1.28M
{
11334
1.28M
  char tmp[30];
11335
11336
1.28M
  if (val < 0)
11337
332k
    {
11338
332k
      oappend_char_with_style (ins, '-', dis_style_address_offset);
11339
332k
      val = (bfd_vma) 0 - val;
11340
11341
      /* Check for possible overflow.  */
11342
332k
      if (val < 0)
11343
0
  {
11344
0
    switch (ins->address_mode)
11345
0
      {
11346
0
      case mode_64bit:
11347
0
        oappend_with_style (ins, "0x8000000000000000",
11348
0
          dis_style_address_offset);
11349
0
        break;
11350
0
      case mode_32bit:
11351
0
        oappend_with_style (ins, "0x80000000",
11352
0
          dis_style_address_offset);
11353
0
        break;
11354
0
      case mode_16bit:
11355
0
        oappend_with_style (ins, "0x8000",
11356
0
          dis_style_address_offset);
11357
0
        break;
11358
0
      }
11359
0
    return;
11360
0
  }
11361
332k
    }
11362
11363
1.28M
  sprintf (tmp, "0x%" PRIx64, (int64_t) val);
11364
1.28M
  oappend_with_style (ins, tmp, dis_style_address_offset);
11365
1.28M
}
11366
11367
static void
11368
intel_operand_size (instr_info *ins, int bytemode, int sizeflag)
11369
406k
{
11370
406k
  if (ins->vex.b)
11371
4.85k
    {
11372
4.85k
      if (!ins->vex.no_broadcast)
11373
4.40k
  switch (bytemode)
11374
4.40k
    {
11375
1.24k
    case x_mode:
11376
1.69k
    case evex_half_bcst_xmmq_mode:
11377
1.69k
      if (ins->vex.w)
11378
543
        oappend (ins, "QWORD BCST ");
11379
1.15k
      else
11380
1.15k
        oappend (ins, "DWORD BCST ");
11381
1.69k
      break;
11382
362
    case xh_mode:
11383
728
    case evex_half_bcst_xmmqh_mode:
11384
1.04k
    case evex_half_bcst_xmmqdh_mode:
11385
1.04k
      oappend (ins, "WORD BCST ");
11386
1.04k
      break;
11387
1.66k
    default:
11388
1.66k
      ins->vex.no_broadcast = true;
11389
1.66k
      break;
11390
4.40k
    }
11391
4.85k
      return;
11392
4.85k
    }
11393
401k
  switch (bytemode)
11394
401k
    {
11395
199k
    case b_mode:
11396
218k
    case b_swap_mode:
11397
218k
    case db_mode:
11398
218k
      oappend (ins, "BYTE PTR ");
11399
218k
      break;
11400
6.93k
    case w_mode:
11401
7.13k
    case w_swap_mode:
11402
7.69k
    case dw_mode:
11403
7.69k
      oappend (ins, "WORD PTR ");
11404
7.69k
      break;
11405
5.75k
    case indir_v_mode:
11406
5.75k
      if (ins->address_mode == mode_64bit && ins->isa64 == intel64)
11407
198
  {
11408
198
    oappend (ins, "QWORD PTR ");
11409
198
    break;
11410
198
  }
11411
      /* Fall through.  */
11412
8.84k
    case stack_v_mode:
11413
8.84k
      if (ins->address_mode == mode_64bit && ((sizeflag & DFLAG)
11414
6.35k
                || (ins->rex & REX_W)))
11415
5.74k
  {
11416
5.74k
    oappend (ins, "QWORD PTR ");
11417
5.74k
    break;
11418
5.74k
  }
11419
      /* Fall through.  */
11420
82.9k
    case v_mode:
11421
104k
    case v_swap_mode:
11422
105k
    case dq_mode:
11423
105k
      USED_REX (REX_W);
11424
105k
      if (ins->rex & REX_W)
11425
2.64k
  oappend (ins, "QWORD PTR ");
11426
102k
      else if (bytemode == dq_mode)
11427
459
  oappend (ins, "DWORD PTR ");
11428
102k
      else
11429
102k
  {
11430
102k
    if (sizeflag & DFLAG)
11431
98.9k
      oappend (ins, "DWORD PTR ");
11432
3.38k
    else
11433
3.38k
      oappend (ins, "WORD PTR ");
11434
102k
    ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11435
102k
  }
11436
105k
      break;
11437
11.2k
    case z_mode:
11438
11.2k
      if ((ins->rex & REX_W) || (sizeflag & DFLAG))
11439
10.4k
  *ins->obufp++ = 'D';
11440
11.2k
      oappend (ins, "WORD PTR ");
11441
11.2k
      if (!(ins->rex & REX_W))
11442
10.6k
  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11443
11.2k
      break;
11444
2.62k
    case a_mode:
11445
2.62k
      if (sizeflag & DFLAG)
11446
2.24k
  oappend (ins, "QWORD PTR ");
11447
385
      else
11448
385
  oappend (ins, "DWORD PTR ");
11449
2.62k
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11450
2.62k
      break;
11451
2.04k
    case movsxd_mode:
11452
2.04k
      if (!(sizeflag & DFLAG) && ins->isa64 == intel64)
11453
190
  oappend (ins, "WORD PTR ");
11454
1.85k
      else
11455
1.85k
  oappend (ins, "DWORD PTR ");
11456
2.04k
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11457
2.04k
      break;
11458
3.81k
    case d_mode:
11459
4.13k
    case d_swap_mode:
11460
4.13k
      oappend (ins, "DWORD PTR ");
11461
4.13k
      break;
11462
7.81k
    case q_mode:
11463
8.15k
    case q_swap_mode:
11464
8.15k
      oappend (ins, "QWORD PTR ");
11465
8.15k
      break;
11466
509
    case m_mode:
11467
509
      if (ins->address_mode == mode_64bit)
11468
308
  oappend (ins, "QWORD PTR ");
11469
201
      else
11470
201
  oappend (ins, "DWORD PTR ");
11471
509
      break;
11472
9.25k
    case f_mode:
11473
9.25k
      if (sizeflag & DFLAG)
11474
8.55k
  oappend (ins, "FWORD PTR ");
11475
691
      else
11476
691
  oappend (ins, "DWORD PTR ");
11477
9.25k
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11478
9.25k
      break;
11479
908
    case t_mode:
11480
908
      oappend (ins, "TBYTE PTR ");
11481
908
      break;
11482
8.40k
    case x_mode:
11483
9.18k
    case xh_mode:
11484
9.75k
    case x_swap_mode:
11485
9.95k
    case evex_x_gscat_mode:
11486
10.5k
    case evex_x_nobcst_mode:
11487
10.7k
    case bw_unit_mode:
11488
10.7k
      if (ins->need_vex)
11489
8.33k
  {
11490
8.33k
    switch (ins->vex.length)
11491
8.33k
      {
11492
3.05k
      case 128:
11493
3.05k
        oappend (ins, "XMMWORD PTR ");
11494
3.05k
        break;
11495
2.26k
      case 256:
11496
2.26k
        oappend (ins, "YMMWORD PTR ");
11497
2.26k
        break;
11498
3.01k
      case 512:
11499
3.01k
        oappend (ins, "ZMMWORD PTR ");
11500
3.01k
        break;
11501
0
      default:
11502
0
        abort ();
11503
8.33k
      }
11504
8.33k
  }
11505
2.43k
      else
11506
2.43k
  oappend (ins, "XMMWORD PTR ");
11507
10.7k
      break;
11508
10.7k
    case xmm_mode:
11509
516
      oappend (ins, "XMMWORD PTR ");
11510
516
      break;
11511
252
    case ymm_mode:
11512
252
      oappend (ins, "YMMWORD PTR ");
11513
252
      break;
11514
516
    case xmmq_mode:
11515
727
    case evex_half_bcst_xmmqh_mode:
11516
955
    case evex_half_bcst_xmmq_mode:
11517
955
      if (!ins->need_vex)
11518
0
  abort ();
11519
11520
955
      switch (ins->vex.length)
11521
955
  {
11522
308
  case 128:
11523
308
    oappend (ins, "QWORD PTR ");
11524
308
    break;
11525
373
  case 256:
11526
373
    oappend (ins, "XMMWORD PTR ");
11527
373
    break;
11528
274
  case 512:
11529
274
    oappend (ins, "YMMWORD PTR ");
11530
274
    break;
11531
0
  default:
11532
0
    abort ();
11533
955
  }
11534
955
      break;
11535
955
    case xmmdw_mode:
11536
747
      if (!ins->need_vex)
11537
0
  abort ();
11538
11539
747
      switch (ins->vex.length)
11540
747
  {
11541
271
  case 128:
11542
271
    oappend (ins, "WORD PTR ");
11543
271
    break;
11544
259
  case 256:
11545
259
    oappend (ins, "DWORD PTR ");
11546
259
    break;
11547
217
  case 512:
11548
217
    oappend (ins, "QWORD PTR ");
11549
217
    break;
11550
0
  default:
11551
0
    abort ();
11552
747
  }
11553
747
      break;
11554
1.05k
    case xmmqd_mode:
11555
1.25k
    case evex_half_bcst_xmmqdh_mode:
11556
1.25k
      if (!ins->need_vex)
11557
0
  abort ();
11558
11559
1.25k
      switch (ins->vex.length)
11560
1.25k
  {
11561
238
  case 128:
11562
238
    oappend (ins, "DWORD PTR ");
11563
238
    break;
11564
710
  case 256:
11565
710
    oappend (ins, "QWORD PTR ");
11566
710
    break;
11567
306
  case 512:
11568
306
    oappend (ins, "XMMWORD PTR ");
11569
306
    break;
11570
0
  default:
11571
0
    abort ();
11572
1.25k
  }
11573
1.25k
      break;
11574
2.02k
    case ymmq_mode:
11575
2.02k
      if (!ins->need_vex)
11576
0
  abort ();
11577
11578
2.02k
      switch (ins->vex.length)
11579
2.02k
  {
11580
1.30k
  case 128:
11581
1.30k
    oappend (ins, "QWORD PTR ");
11582
1.30k
    break;
11583
304
  case 256:
11584
304
    oappend (ins, "YMMWORD PTR ");
11585
304
    break;
11586
419
  case 512:
11587
419
    oappend (ins, "ZMMWORD PTR ");
11588
419
    break;
11589
0
  default:
11590
0
    abort ();
11591
2.02k
  }
11592
2.02k
      break;
11593
2.02k
    case o_mode:
11594
413
      oappend (ins, "OWORD PTR ");
11595
413
      break;
11596
786
    case vex_vsib_d_w_dq_mode:
11597
1.92k
    case vex_vsib_q_w_dq_mode:
11598
1.92k
      if (!ins->need_vex)
11599
0
  abort ();
11600
1.92k
      if (ins->vex.w)
11601
765
  oappend (ins, "QWORD PTR ");
11602
1.15k
      else
11603
1.15k
  oappend (ins, "DWORD PTR ");
11604
1.92k
      break;
11605
670
    case mask_bd_mode:
11606
670
      if (!ins->need_vex || ins->vex.length != 128)
11607
0
  abort ();
11608
670
      if (ins->vex.w)
11609
430
  oappend (ins, "DWORD PTR ");
11610
240
      else
11611
240
  oappend (ins, "BYTE PTR ");
11612
670
      break;
11613
529
    case mask_mode:
11614
529
      if (!ins->need_vex)
11615
0
  abort ();
11616
529
      if (ins->vex.w)
11617
289
  oappend (ins, "QWORD PTR ");
11618
240
      else
11619
240
  oappend (ins, "WORD PTR ");
11620
529
      break;
11621
560
    case v_bnd_mode:
11622
1.30k
    case v_bndmk_mode:
11623
5.10k
    default:
11624
5.10k
      break;
11625
401k
    }
11626
401k
}
11627
11628
static void
11629
print_register (instr_info *ins, unsigned int reg, unsigned int rexmask,
11630
    int bytemode, int sizeflag)
11631
4.36M
{
11632
4.36M
  const char (*names)[8];
11633
11634
4.36M
  USED_REX (rexmask);
11635
4.36M
  if (ins->rex & rexmask)
11636
262k
    reg += 8;
11637
11638
4.36M
  switch (bytemode)
11639
4.36M
    {
11640
2.29M
    case b_mode:
11641
2.32M
    case b_swap_mode:
11642
2.32M
      if (reg & 4)
11643
503k
  USED_REX (0);
11644
2.32M
      if (ins->rex)
11645
53.1k
  names = att_names8rex;
11646
2.27M
      else
11647
2.27M
  names = att_names8;
11648
2.32M
      break;
11649
12.9k
    case w_mode:
11650
12.9k
      names = att_names16;
11651
12.9k
      break;
11652
3.81k
    case d_mode:
11653
4.43k
    case dw_mode:
11654
4.63k
    case db_mode:
11655
4.63k
      names = att_names32;
11656
4.63k
      break;
11657
317
    case q_mode:
11658
317
      names = att_names64;
11659
317
      break;
11660
4.59k
    case m_mode:
11661
5.14k
    case v_bnd_mode:
11662
5.14k
      names = ins->address_mode == mode_64bit ? att_names64 : att_names32;
11663
5.14k
      break;
11664
6.06k
    case bnd_mode:
11665
6.50k
    case bnd_swap_mode:
11666
6.50k
      if (reg > 0x3)
11667
3.37k
  {
11668
3.37k
    oappend (ins, "(bad)");
11669
3.37k
    return;
11670
3.37k
  }
11671
3.13k
      names = att_names_bnd;
11672
3.13k
      break;
11673
12.6k
    case indir_v_mode:
11674
12.6k
      if (ins->address_mode == mode_64bit && ins->isa64 == intel64)
11675
190
  {
11676
190
    names = att_names64;
11677
190
    break;
11678
190
  }
11679
      /* Fall through.  */
11680
17.8k
    case stack_v_mode:
11681
17.8k
      if (ins->address_mode == mode_64bit && ((sizeflag & DFLAG)
11682
11.0k
                || (ins->rex & REX_W)))
11683
10.3k
  {
11684
10.3k
    names = att_names64;
11685
10.3k
    break;
11686
10.3k
  }
11687
7.43k
      bytemode = v_mode;
11688
      /* Fall through.  */
11689
1.84M
    case v_mode:
11690
1.97M
    case v_swap_mode:
11691
1.98M
    case dq_mode:
11692
1.98M
      USED_REX (REX_W);
11693
1.98M
      if (ins->rex & REX_W)
11694
562k
  names = att_names64;
11695
1.42M
      else if (bytemode != v_mode && bytemode != v_swap_mode)
11696
1.88k
  names = att_names32;
11697
1.41M
      else
11698
1.41M
  {
11699
1.41M
    if (sizeflag & DFLAG)
11700
1.34M
      names = att_names32;
11701
76.4k
    else
11702
76.4k
      names = att_names16;
11703
1.41M
    ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11704
1.41M
  }
11705
1.98M
      break;
11706
7.79k
    case movsxd_mode:
11707
7.79k
      if (!(sizeflag & DFLAG) && ins->isa64 == intel64)
11708
190
  names = att_names16;
11709
7.60k
      else
11710
7.60k
  names = att_names32;
11711
7.79k
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11712
7.79k
      break;
11713
1.39k
    case va_mode:
11714
1.39k
      names = (ins->address_mode == mode_64bit
11715
1.39k
         ? att_names64 : att_names32);
11716
1.39k
      if (!(ins->prefixes & PREFIX_ADDR))
11717
1.09k
  names = (ins->address_mode == mode_16bit
11718
1.09k
         ? att_names16 : names);
11719
305
      else
11720
305
  {
11721
    /* Remove "addr16/addr32".  */
11722
305
    ins->all_prefixes[ins->last_addr_prefix] = 0;
11723
305
    names = (ins->address_mode != mode_32bit
11724
305
           ? att_names32 : att_names16);
11725
305
    ins->used_prefixes |= PREFIX_ADDR;
11726
305
  }
11727
1.39k
      break;
11728
824
    case mask_bd_mode:
11729
7.87k
    case mask_mode:
11730
7.87k
      if (reg > 0x7)
11731
2.93k
  {
11732
2.93k
    oappend (ins, "(bad)");
11733
2.93k
    return;
11734
2.93k
  }
11735
4.93k
      names = att_names_mask;
11736
4.93k
      break;
11737
701
    case 0:
11738
701
      return;
11739
0
    default:
11740
0
      oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
11741
0
      return;
11742
4.36M
    }
11743
4.36M
  oappend_register (ins, names[reg]);
11744
4.36M
}
11745
11746
static bool
11747
get8s (instr_info *ins, bfd_vma *res)
11748
1.52M
{
11749
1.52M
  if (!fetch_code (ins->info, ins->codep + 1))
11750
1.74k
    return false;
11751
1.52M
  *res = ((bfd_vma) *ins->codep++ ^ 0x80) - 0x80;
11752
1.52M
  return true;
11753
1.52M
}
11754
11755
static bool
11756
get16 (instr_info *ins, bfd_vma *res)
11757
91.0k
{
11758
91.0k
  if (!fetch_code (ins->info, ins->codep + 2))
11759
894
    return false;
11760
90.1k
  *res = *ins->codep++;
11761
90.1k
  *res |= (bfd_vma) *ins->codep++ << 8;
11762
90.1k
  return true;
11763
91.0k
}
11764
11765
static bool
11766
get16s (instr_info *ins, bfd_vma *res)
11767
22.7k
{
11768
22.7k
  if (!get16 (ins, res))
11769
320
    return false;
11770
22.4k
  *res = (*res ^ 0x8000) - 0x8000;
11771
22.4k
  return true;
11772
22.7k
}
11773
11774
static bool
11775
get32 (instr_info *ins, bfd_vma *res)
11776
1.36M
{
11777
1.36M
  if (!fetch_code (ins->info, ins->codep + 4))
11778
3.15k
    return false;
11779
1.36M
  *res = *ins->codep++;
11780
1.36M
  *res |= (bfd_vma) *ins->codep++ << 8;
11781
1.36M
  *res |= (bfd_vma) *ins->codep++ << 16;
11782
1.36M
  *res |= (bfd_vma) *ins->codep++ << 24;
11783
1.36M
  return true;
11784
1.36M
}
11785
11786
static bool
11787
get32s (instr_info *ins, bfd_vma *res)
11788
941k
{
11789
941k
  if (!get32 (ins, res))
11790
1.64k
    return false;
11791
11792
939k
  *res = (*res ^ ((bfd_vma) 1 << 31)) - ((bfd_vma) 1 << 31);
11793
11794
939k
  return true;
11795
941k
}
11796
11797
static bool
11798
get64 (instr_info *ins, uint64_t *res)
11799
36.2k
{
11800
36.2k
  unsigned int a;
11801
36.2k
  unsigned int b;
11802
11803
36.2k
  if (!fetch_code (ins->info, ins->codep + 8))
11804
328
    return false;
11805
35.8k
  a = *ins->codep++;
11806
35.8k
  a |= (unsigned int) *ins->codep++ << 8;
11807
35.8k
  a |= (unsigned int) *ins->codep++ << 16;
11808
35.8k
  a |= (unsigned int) *ins->codep++ << 24;
11809
35.8k
  b = *ins->codep++;
11810
35.8k
  b |= (unsigned int) *ins->codep++ << 8;
11811
35.8k
  b |= (unsigned int) *ins->codep++ << 16;
11812
35.8k
  b |= (unsigned int) *ins->codep++ << 24;
11813
35.8k
  *res = a + ((uint64_t) b << 32);
11814
35.8k
  return true;
11815
36.2k
}
11816
11817
static void
11818
set_op (instr_info *ins, bfd_vma op, bool riprel)
11819
1.07M
{
11820
1.07M
  ins->op_index[ins->op_ad] = ins->op_ad;
11821
1.07M
  if (ins->address_mode == mode_64bit)
11822
793k
    ins->op_address[ins->op_ad] = op;
11823
281k
  else /* Mask to get a 32-bit address.  */
11824
281k
    ins->op_address[ins->op_ad] = op & 0xffffffff;
11825
1.07M
  ins->op_riprel[ins->op_ad] = riprel;
11826
1.07M
}
11827
11828
static bool
11829
BadOp (instr_info *ins)
11830
31.6k
{
11831
  /* Throw away prefixes and 1st. opcode byte.  */
11832
31.6k
  struct dis_private *priv = ins->info->private_data;
11833
11834
31.6k
  ins->codep = priv->the_buffer + ins->nr_prefixes + 1;
11835
31.6k
  ins->obufp = stpcpy (ins->obufp, "(bad)");
11836
31.6k
  return true;
11837
31.6k
}
11838
11839
static bool
11840
OP_E_memory (instr_info *ins, int bytemode, int sizeflag)
11841
3.46M
{
11842
3.46M
  int add = (ins->rex & REX_B) ? 8 : 0;
11843
3.46M
  int riprel = 0;
11844
3.46M
  int shift;
11845
11846
3.46M
  if (ins->vex.evex)
11847
33.1k
    {
11848
33.1k
      switch (bytemode)
11849
33.1k
  {
11850
205
  case dw_mode:
11851
862
  case w_mode:
11852
1.08k
  case w_swap_mode:
11853
1.08k
    shift = 1;
11854
1.08k
    break;
11855
273
  case db_mode:
11856
669
  case b_mode:
11857
669
    shift = 0;
11858
669
    break;
11859
604
  case dq_mode:
11860
604
    if (ins->address_mode != mode_64bit)
11861
325
      {
11862
1.36k
  case d_mode:
11863
1.73k
  case d_swap_mode:
11864
1.73k
        shift = 2;
11865
1.73k
        break;
11866
1.36k
      }
11867
      /* fall through */
11868
2.56k
  case vex_vsib_d_w_dq_mode:
11869
4.66k
  case vex_vsib_q_w_dq_mode:
11870
4.99k
  case evex_x_gscat_mode:
11871
4.99k
    shift = ins->vex.w ? 3 : 2;
11872
4.99k
    break;
11873
2.76k
  case xh_mode:
11874
3.58k
  case evex_half_bcst_xmmqh_mode:
11875
4.62k
  case evex_half_bcst_xmmqdh_mode:
11876
4.62k
    if (ins->vex.b)
11877
3.08k
      {
11878
3.08k
        shift = ins->vex.w ? 2 : 1;
11879
3.08k
        break;
11880
3.08k
      }
11881
    /* Fall through.  */
11882
14.1k
  case x_mode:
11883
15.4k
  case evex_half_bcst_xmmq_mode:
11884
15.4k
    if (ins->vex.b)
11885
6.89k
      {
11886
6.89k
        shift = ins->vex.w ? 3 : 2;
11887
6.89k
        break;
11888
6.89k
      }
11889
    /* Fall through.  */
11890
9.08k
  case xmmqd_mode:
11891
9.52k
  case xmmdw_mode:
11892
10.0k
  case xmmq_mode:
11893
11.2k
  case ymmq_mode:
11894
11.9k
  case evex_x_nobcst_mode:
11895
12.2k
  case x_swap_mode:
11896
12.2k
    switch (ins->vex.length)
11897
12.2k
      {
11898
3.08k
      case 128:
11899
3.08k
        shift = 4;
11900
3.08k
        break;
11901
3.17k
      case 256:
11902
3.17k
        shift = 5;
11903
3.17k
        break;
11904
5.98k
      case 512:
11905
5.98k
        shift = 6;
11906
5.98k
        break;
11907
0
      default:
11908
0
        abort ();
11909
12.2k
      }
11910
    /* Make necessary corrections to shift for modes that need it.  */
11911
12.2k
    if (bytemode == xmmq_mode
11912
12.2k
        || bytemode == evex_half_bcst_xmmqh_mode
11913
12.2k
        || bytemode == evex_half_bcst_xmmq_mode
11914
12.2k
        || (bytemode == ymmq_mode && ins->vex.length == 128))
11915
1.38k
      shift -= 1;
11916
10.8k
    else if (bytemode == xmmqd_mode
11917
10.8k
             || bytemode == evex_half_bcst_xmmqdh_mode)
11918
704
      shift -= 2;
11919
10.1k
    else if (bytemode == xmmdw_mode)
11920
447
      shift -= 3;
11921
12.2k
    break;
11922
278
  case ymm_mode:
11923
278
    shift = 5;
11924
278
    break;
11925
305
  case xmm_mode:
11926
305
    shift = 4;
11927
305
    break;
11928
584
  case q_mode:
11929
962
  case q_swap_mode:
11930
962
    shift = 3;
11931
962
    break;
11932
869
  case bw_unit_mode:
11933
869
    shift = ins->vex.w ? 1 : 0;
11934
869
    break;
11935
0
  default:
11936
0
    abort ();
11937
33.1k
  }
11938
33.1k
    }
11939
3.43M
  else
11940
3.43M
    shift = 0;
11941
11942
3.46M
  USED_REX (REX_B);
11943
3.46M
  if (ins->intel_syntax)
11944
347k
    intel_operand_size (ins, bytemode, sizeflag);
11945
3.46M
  append_seg (ins);
11946
11947
3.46M
  if ((sizeflag & AFLAG) || ins->address_mode == mode_64bit)
11948
3.33M
    {
11949
      /* 32/64 bit address mode */
11950
3.33M
      bfd_vma disp = 0;
11951
3.33M
      int havedisp;
11952
3.33M
      int havebase;
11953
3.33M
      int needindex;
11954
3.33M
      int needaddr32;
11955
3.33M
      int base, rbase;
11956
3.33M
      int vindex = 0;
11957
3.33M
      int scale = 0;
11958
3.33M
      int addr32flag = !((sizeflag & AFLAG)
11959
3.33M
       || bytemode == v_bnd_mode
11960
3.33M
       || bytemode == v_bndmk_mode
11961
3.33M
       || bytemode == bnd_mode
11962
3.33M
       || bytemode == bnd_swap_mode);
11963
3.33M
      bool check_gather = false;
11964
3.33M
      const char (*indexes)[8] = NULL;
11965
11966
3.33M
      havebase = 1;
11967
3.33M
      base = ins->modrm.rm;
11968
11969
3.33M
      if (base == 4)
11970
304k
  {
11971
304k
    vindex = ins->sib.index;
11972
304k
    USED_REX (REX_X);
11973
304k
    if (ins->rex & REX_X)
11974
8.36k
      vindex += 8;
11975
304k
    switch (bytemode)
11976
304k
      {
11977
1.71k
      case vex_vsib_d_w_dq_mode:
11978
3.81k
      case vex_vsib_q_w_dq_mode:
11979
3.81k
        if (!ins->need_vex)
11980
0
    abort ();
11981
3.81k
        if (ins->vex.evex)
11982
2.53k
    {
11983
2.53k
      if (!ins->vex.v)
11984
1.78k
        vindex += 16;
11985
2.53k
      check_gather = ins->obufp == ins->op_out[1];
11986
2.53k
    }
11987
11988
3.81k
        switch (ins->vex.length)
11989
3.81k
    {
11990
407
    case 128:
11991
407
      indexes = att_names_xmm;
11992
407
      break;
11993
1.83k
    case 256:
11994
1.83k
      if (!ins->vex.w
11995
1.83k
          || bytemode == vex_vsib_q_w_dq_mode)
11996
1.23k
        indexes = att_names_ymm;
11997
596
      else
11998
596
        indexes = att_names_xmm;
11999
1.83k
      break;
12000
1.57k
    case 512:
12001
1.57k
      if (!ins->vex.w
12002
1.57k
          || bytemode == vex_vsib_q_w_dq_mode)
12003
1.06k
        indexes = att_names_zmm;
12004
513
      else
12005
513
        indexes = att_names_ymm;
12006
1.57k
      break;
12007
0
    default:
12008
0
      abort ();
12009
3.81k
    }
12010
3.81k
        break;
12011
300k
      default:
12012
300k
        if (vindex != 4)
12013
170k
    indexes = ins->address_mode == mode_64bit && !addr32flag
12014
170k
        ? att_names64 : att_names32;
12015
300k
        break;
12016
304k
      }
12017
304k
    scale = ins->sib.scale;
12018
304k
    base = ins->sib.base;
12019
304k
    ins->codep++;
12020
304k
  }
12021
3.02M
      else
12022
3.02M
  {
12023
    /* Check for mandatory SIB.  */
12024
3.02M
    if (bytemode == vex_vsib_d_w_dq_mode
12025
3.02M
        || bytemode == vex_vsib_q_w_dq_mode
12026
3.02M
        || bytemode == vex_sibmem_mode)
12027
3.68k
      {
12028
3.68k
        oappend (ins, "(bad)");
12029
3.68k
        return true;
12030
3.68k
      }
12031
3.02M
  }
12032
3.32M
      rbase = base + add;
12033
12034
3.32M
      switch (ins->modrm.mod)
12035
3.32M
  {
12036
2.23M
  case 0:
12037
2.23M
    if (base == 5)
12038
190k
      {
12039
190k
        havebase = 0;
12040
190k
        if (ins->address_mode == mode_64bit && !ins->has_sib)
12041
147k
    riprel = 1;
12042
190k
        if (!get32s (ins, &disp))
12043
393
    return false;
12044
190k
        if (riprel && bytemode == v_bndmk_mode)
12045
202
    {
12046
202
      oappend (ins, "(bad)");
12047
202
      return true;
12048
202
    }
12049
190k
      }
12050
2.23M
    break;
12051
2.23M
  case 1:
12052
727k
    if (!get8s (ins, &disp))
12053
826
      return false;
12054
726k
    if (ins->vex.evex && shift > 0)
12055
15.0k
      disp <<= shift;
12056
726k
    break;
12057
361k
  case 2:
12058
361k
    if (!get32s (ins, &disp))
12059
938
      return false;
12060
360k
    break;
12061
3.32M
  }
12062
12063
3.32M
      needindex = 0;
12064
3.32M
      needaddr32 = 0;
12065
3.32M
      if (ins->has_sib
12066
3.32M
    && !havebase
12067
3.32M
    && !indexes
12068
3.32M
    && ins->address_mode != mode_16bit)
12069
2.16k
  {
12070
2.16k
    if (ins->address_mode == mode_64bit)
12071
1.74k
      {
12072
1.74k
        if (addr32flag)
12073
605
    {
12074
      /* Without base nor index registers, zero-extend the
12075
         lower 32-bit displacement to 64 bits.  */
12076
605
      disp &= 0xffffffff;
12077
605
      needindex = 1;
12078
605
    }
12079
1.74k
        needaddr32 = 1;
12080
1.74k
      }
12081
416
    else
12082
416
      {
12083
        /* In 32-bit mode, we need index register to tell [offset]
12084
     from [eiz*1 + offset].  */
12085
416
        needindex = 1;
12086
416
      }
12087
2.16k
  }
12088
12089
3.32M
      havedisp = (havebase
12090
3.32M
      || needindex
12091
3.32M
      || (ins->has_sib && (indexes || scale != 0)));
12092
12093
3.32M
      if (!ins->intel_syntax)
12094
2.98M
  if (ins->modrm.mod != 0 || base == 5)
12095
1.17M
    {
12096
1.17M
      if (havedisp || riprel)
12097
1.14M
        print_displacement (ins, disp);
12098
29.5k
      else
12099
29.5k
        print_operand_value (ins, disp, dis_style_address_offset);
12100
1.17M
      if (riprel)
12101
141k
        {
12102
141k
    set_op (ins, disp, true);
12103
141k
    oappend_char (ins, '(');
12104
141k
    oappend_with_style (ins, !addr32flag ? "%rip" : "%eip",
12105
141k
            dis_style_register);
12106
141k
    oappend_char (ins, ')');
12107
141k
        }
12108
1.17M
    }
12109
12110
3.32M
      if ((havebase || indexes || needindex || needaddr32 || riprel)
12111
3.32M
    && (ins->address_mode != mode_64bit
12112
3.29M
        || ((bytemode != v_bnd_mode)
12113
2.44M
      && (bytemode != v_bndmk_mode)
12114
2.44M
      && (bytemode != bnd_mode)
12115
2.44M
      && (bytemode != bnd_swap_mode))))
12116
3.29M
  ins->used_prefixes |= PREFIX_ADDR;
12117
12118
3.32M
      if (havedisp || (ins->intel_syntax && riprel))
12119
3.15M
  {
12120
3.15M
    oappend_char (ins, ins->open_char);
12121
3.15M
    if (ins->intel_syntax && riprel)
12122
5.89k
      {
12123
5.89k
        set_op (ins, disp, true);
12124
5.89k
        oappend_with_style (ins, !addr32flag ? "rip" : "eip",
12125
5.89k
          dis_style_register);
12126
5.89k
      }
12127
3.15M
    if (havebase)
12128
3.13M
      oappend_register
12129
3.13M
        (ins,
12130
3.13M
         (ins->address_mode == mode_64bit && !addr32flag
12131
3.13M
    ? att_names64 : att_names32)[rbase]);
12132
3.15M
    if (ins->has_sib)
12133
303k
      {
12134
        /* ESP/RSP won't allow index.  If base isn't ESP/RSP,
12135
     print index to tell base + index from base.  */
12136
303k
        if (scale != 0
12137
303k
      || needindex
12138
303k
      || indexes
12139
303k
      || (havebase && base != ESP_REG_NUM))
12140
199k
    {
12141
199k
      if (!ins->intel_syntax || havebase)
12142
198k
        oappend_char (ins, ins->separator_char);
12143
199k
      if (indexes)
12144
174k
        {
12145
174k
          if (ins->address_mode == mode_64bit || vindex < 16)
12146
173k
      oappend_register (ins, indexes[vindex]);
12147
832
          else
12148
832
      oappend (ins, "(bad)");
12149
174k
        }
12150
25.2k
      else
12151
25.2k
        oappend_register (ins,
12152
25.2k
              ins->address_mode == mode_64bit
12153
25.2k
              && !addr32flag
12154
25.2k
              ? att_index64
12155
25.2k
              : att_index32);
12156
12157
199k
      oappend_char (ins, ins->scale_char);
12158
199k
      oappend_char_with_style (ins, '0' + (1 << scale),
12159
199k
             dis_style_immediate);
12160
199k
    }
12161
303k
      }
12162
3.15M
    if (ins->intel_syntax
12163
3.15M
        && (disp || ins->modrm.mod != 0 || base == 5))
12164
100k
      {
12165
100k
        if (!havedisp || (bfd_signed_vma) disp >= 0)
12166
66.7k
      oappend_char (ins, '+');
12167
100k
        if (havedisp)
12168
94.4k
    print_displacement (ins, disp);
12169
5.89k
        else
12170
5.89k
    print_operand_value (ins, disp, dis_style_address_offset);
12171
100k
      }
12172
12173
3.15M
    oappend_char (ins, ins->close_char);
12174
12175
3.15M
    if (check_gather)
12176
1.91k
      {
12177
        /* Both XMM/YMM/ZMM registers must be distinct.  */
12178
1.91k
        int modrm_reg = ins->modrm.reg;
12179
12180
1.91k
        if (ins->rex & REX_R)
12181
717
          modrm_reg += 8;
12182
1.91k
        if (!ins->vex.r)
12183
435
          modrm_reg += 16;
12184
1.91k
        if (vindex == modrm_reg)
12185
214
    oappend (ins, "/(bad)");
12186
1.91k
      }
12187
3.15M
  }
12188
174k
      else if (ins->intel_syntax)
12189
3.89k
  {
12190
3.89k
    if (ins->modrm.mod != 0 || base == 5)
12191
3.89k
      {
12192
3.89k
        if (!ins->active_seg_prefix)
12193
3.35k
    {
12194
3.35k
      oappend_register (ins, att_names_seg[ds_reg - es_reg]);
12195
3.35k
      oappend (ins, ":");
12196
3.35k
    }
12197
3.89k
        print_operand_value (ins, disp, dis_style_text);
12198
3.89k
      }
12199
3.89k
  }
12200
3.32M
    }
12201
136k
  else if (bytemode == v_bnd_mode
12202
136k
     || bytemode == v_bndmk_mode
12203
136k
     || bytemode == bnd_mode
12204
136k
     || bytemode == bnd_swap_mode
12205
136k
     || bytemode == vex_vsib_d_w_dq_mode
12206
136k
     || bytemode == vex_vsib_q_w_dq_mode)
12207
2.65k
    {
12208
2.65k
      oappend (ins, "(bad)");
12209
2.65k
      return true;
12210
2.65k
    }
12211
133k
  else
12212
133k
    {
12213
      /* 16 bit address mode */
12214
133k
      bfd_vma disp = 0;
12215
12216
133k
      ins->used_prefixes |= ins->prefixes & PREFIX_ADDR;
12217
133k
      switch (ins->modrm.mod)
12218
133k
  {
12219
92.5k
  case 0:
12220
92.5k
    if (ins->modrm.rm == 6)
12221
4.35k
      {
12222
18.9k
  case 2:
12223
18.9k
        if (!get16s (ins, &disp))
12224
246
    return false;
12225
18.9k
      }
12226
106k
    break;
12227
106k
  case 1:
12228
26.2k
    if (!get8s (ins, &disp))
12229
142
      return false;
12230
26.1k
    if (ins->vex.evex && shift > 0)
12231
881
      disp <<= shift;
12232
26.1k
    break;
12233
133k
  }
12234
12235
133k
      if (!ins->intel_syntax)
12236
126k
  if (ins->modrm.mod != 0 || ins->modrm.rm == 6)
12237
42.6k
    print_displacement (ins, disp);
12238
12239
133k
      if (ins->modrm.mod != 0 || ins->modrm.rm != 6)
12240
128k
  {
12241
128k
    oappend_char (ins, ins->open_char);
12242
128k
    oappend (ins, ins->intel_syntax ? intel_index16[ins->modrm.rm]
12243
128k
            : att_index16[ins->modrm.rm]);
12244
128k
    if (ins->intel_syntax
12245
128k
        && (disp || ins->modrm.mod != 0 || ins->modrm.rm == 6))
12246
1.55k
      {
12247
1.55k
        if ((bfd_signed_vma) disp >= 0)
12248
1.06k
    oappend_char (ins, '+');
12249
1.55k
        print_displacement (ins, disp);
12250
1.55k
      }
12251
12252
128k
    oappend_char (ins, ins->close_char);
12253
128k
  }
12254
4.30k
      else if (ins->intel_syntax)
12255
619
  {
12256
619
    if (!ins->active_seg_prefix)
12257
249
      {
12258
249
        oappend_register (ins, att_names_seg[ds_reg - es_reg]);
12259
249
        oappend (ins, ":");
12260
249
      }
12261
619
    print_operand_value (ins, disp & 0xffff, dis_style_text);
12262
619
  }
12263
133k
    }
12264
3.45M
  if (ins->vex.b)
12265
14.7k
    {
12266
14.7k
      ins->evex_used |= EVEX_b_used;
12267
12268
      /* Broadcast can only ever be valid for memory sources.  */
12269
14.7k
      if (ins->obufp == ins->op_out[0])
12270
0
  ins->vex.no_broadcast = true;
12271
12272
14.7k
      if (!ins->vex.no_broadcast
12273
14.7k
    && (!ins->intel_syntax || !(ins->evex_used & EVEX_len_used)))
12274
9.72k
  {
12275
9.72k
    if (bytemode == xh_mode)
12276
1.40k
      {
12277
1.40k
        switch (ins->vex.length)
12278
1.40k
    {
12279
270
    case 128:
12280
270
      oappend (ins, "{1to8}");
12281
270
      break;
12282
820
    case 256:
12283
820
      oappend (ins, "{1to16}");
12284
820
      break;
12285
314
    case 512:
12286
314
      oappend (ins, "{1to32}");
12287
314
      break;
12288
0
    default:
12289
0
      abort ();
12290
1.40k
    }
12291
1.40k
      }
12292
8.32k
    else if (bytemode == q_mode
12293
8.32k
       || bytemode == ymmq_mode)
12294
571
      ins->vex.no_broadcast = true;
12295
7.75k
    else if (ins->vex.w
12296
7.75k
       || bytemode == evex_half_bcst_xmmqdh_mode
12297
7.75k
       || bytemode == evex_half_bcst_xmmq_mode)
12298
5.57k
      {
12299
5.57k
        switch (ins->vex.length)
12300
5.57k
    {
12301
771
    case 128:
12302
771
      oappend (ins, "{1to2}");
12303
771
      break;
12304
2.41k
    case 256:
12305
2.41k
      oappend (ins, "{1to4}");
12306
2.41k
      break;
12307
2.39k
    case 512:
12308
2.39k
      oappend (ins, "{1to8}");
12309
2.39k
      break;
12310
0
    default:
12311
0
      abort ();
12312
5.57k
    }
12313
5.57k
      }
12314
2.17k
    else if (bytemode == x_mode
12315
2.17k
       || bytemode == evex_half_bcst_xmmqh_mode)
12316
1.22k
      {
12317
1.22k
        switch (ins->vex.length)
12318
1.22k
    {
12319
379
    case 128:
12320
379
      oappend (ins, "{1to4}");
12321
379
      break;
12322
334
    case 256:
12323
334
      oappend (ins, "{1to8}");
12324
334
      break;
12325
509
    case 512:
12326
509
      oappend (ins, "{1to16}");
12327
509
      break;
12328
0
    default:
12329
0
      abort ();
12330
1.22k
    }
12331
1.22k
      }
12332
957
    else
12333
957
      ins->vex.no_broadcast = true;
12334
9.72k
  }
12335
14.7k
      if (ins->vex.no_broadcast)
12336
4.13k
  oappend (ins, "{bad}");
12337
14.7k
    }
12338
12339
3.45M
  return true;
12340
3.45M
}
12341
12342
static bool
12343
OP_E (instr_info *ins, int bytemode, int sizeflag)
12344
4.27M
{
12345
  /* Skip mod/rm byte.  */
12346
4.27M
  MODRM_CHECK;
12347
4.27M
  ins->codep++;
12348
12349
4.27M
  if (ins->modrm.mod == 3)
12350
862k
    {
12351
862k
      if ((sizeflag & SUFFIX_ALWAYS)
12352
862k
    && (bytemode == b_swap_mode
12353
4.01k
        || bytemode == bnd_swap_mode
12354
4.01k
        || bytemode == v_swap_mode))
12355
696
  swap_operand (ins);
12356
12357
862k
      print_register (ins, ins->modrm.rm, REX_B, bytemode, sizeflag);
12358
862k
      return true;
12359
862k
    }
12360
12361
3.41M
  return OP_E_memory (ins, bytemode, sizeflag);
12362
4.27M
}
12363
12364
static bool
12365
OP_G (instr_info *ins, int bytemode, int sizeflag)
12366
3.50M
{
12367
3.50M
  if (ins->vex.evex && !ins->vex.r && ins->address_mode == mode_64bit)
12368
2.96k
    oappend (ins, "(bad)");
12369
3.50M
  else
12370
3.50M
    print_register (ins, ins->modrm.reg, REX_R, bytemode, sizeflag);
12371
3.50M
  return true;
12372
3.50M
}
12373
12374
static bool
12375
OP_REG (instr_info *ins, int code, int sizeflag)
12376
938k
{
12377
938k
  const char *s;
12378
938k
  int add;
12379
12380
938k
  switch (code)
12381
938k
    {
12382
36.4k
    case es_reg: case ss_reg: case cs_reg:
12383
46.6k
    case ds_reg: case fs_reg: case gs_reg:
12384
46.6k
      oappend_register (ins, att_names_seg[code - es_reg]);
12385
46.6k
      return true;
12386
938k
    }
12387
12388
891k
  USED_REX (REX_B);
12389
891k
  if (ins->rex & REX_B)
12390
51.4k
    add = 8;
12391
839k
  else
12392
839k
    add = 0;
12393
12394
891k
  switch (code)
12395
891k
    {
12396
0
    case ax_reg: case cx_reg: case dx_reg: case bx_reg:
12397
0
    case sp_reg: case bp_reg: case si_reg: case di_reg:
12398
0
      s = att_names16[code - ax_reg + add];
12399
0
      break;
12400
37.9k
    case ah_reg: case ch_reg: case dh_reg: case bh_reg:
12401
37.9k
      USED_REX (0);
12402
      /* Fall through.  */
12403
79.1k
    case al_reg: case cl_reg: case dl_reg: case bl_reg:
12404
79.1k
      if (ins->rex)
12405
3.63k
  s = att_names8rex[code - al_reg + add];
12406
75.5k
      else
12407
75.5k
  s = att_names8[code - al_reg];
12408
79.1k
      break;
12409
216k
    case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
12410
477k
    case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
12411
477k
      if (ins->address_mode == mode_64bit
12412
477k
    && ((sizeflag & DFLAG) || (ins->rex & REX_W)))
12413
305k
  {
12414
305k
    s = att_names64[code - rAX_reg + add];
12415
305k
    break;
12416
305k
  }
12417
171k
      code += eAX_reg - rAX_reg;
12418
      /* Fall through.  */
12419
342k
    case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
12420
506k
    case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
12421
506k
      USED_REX (REX_W);
12422
506k
      if (ins->rex & REX_W)
12423
5.89k
  s = att_names64[code - eAX_reg + add];
12424
500k
      else
12425
500k
  {
12426
500k
    if (sizeflag & DFLAG)
12427
442k
      s = att_names32[code - eAX_reg + add];
12428
57.7k
    else
12429
57.7k
      s = att_names16[code - eAX_reg + add];
12430
500k
    ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12431
500k
  }
12432
506k
      break;
12433
0
    default:
12434
0
      oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
12435
0
      return true;
12436
891k
    }
12437
891k
  oappend_register (ins, s);
12438
891k
  return true;
12439
891k
}
12440
12441
static bool
12442
OP_IMREG (instr_info *ins, int code, int sizeflag)
12443
1.11M
{
12444
1.11M
  const char *s;
12445
12446
1.11M
  switch (code)
12447
1.11M
    {
12448
369k
    case indir_dx_reg:
12449
369k
      if (!ins->intel_syntax)
12450
339k
  {
12451
339k
    oappend (ins, "(%dx)");
12452
339k
    return true;
12453
339k
  }
12454
30.3k
      s = att_names16[dx_reg - ax_reg];
12455
30.3k
      break;
12456
325k
    case al_reg: case cl_reg:
12457
325k
      s = att_names8[code - al_reg];
12458
325k
      break;
12459
364k
    case eAX_reg:
12460
364k
      USED_REX (REX_W);
12461
364k
      if (ins->rex & REX_W)
12462
10.4k
  {
12463
10.4k
    s = *att_names64;
12464
10.4k
    break;
12465
10.4k
  }
12466
      /* Fall through.  */
12467
412k
    case z_mode_ax_reg:
12468
412k
      if ((ins->rex & REX_W) || (sizeflag & DFLAG))
12469
376k
  s = *att_names32;
12470
35.8k
      else
12471
35.8k
  s = *att_names16;
12472
412k
      if (!(ins->rex & REX_W))
12473
411k
  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12474
412k
      break;
12475
0
    default:
12476
0
      oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
12477
0
      return true;
12478
1.11M
    }
12479
778k
  oappend_register (ins, s);
12480
778k
  return true;
12481
1.11M
}
12482
12483
static bool
12484
OP_I (instr_info *ins, int bytemode, int sizeflag)
12485
1.04M
{
12486
1.04M
  bfd_vma op;
12487
12488
1.04M
  switch (bytemode)
12489
1.04M
    {
12490
542k
    case b_mode:
12491
542k
      if (!fetch_code (ins->info, ins->codep + 1))
12492
685
  return false;
12493
542k
      op = *ins->codep++;
12494
542k
      break;
12495
451k
    case v_mode:
12496
451k
      USED_REX (REX_W);
12497
451k
      if (ins->rex & REX_W)
12498
19.4k
  {
12499
19.4k
    if (!get32s (ins, &op))
12500
22
      return false;
12501
19.4k
  }
12502
431k
      else
12503
431k
  {
12504
431k
    ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12505
431k
    if (sizeflag & DFLAG)
12506
407k
      {
12507
409k
    case d_mode:
12508
409k
        if (!get32 (ins, &op))
12509
1.35k
    return false;
12510
409k
      }
12511
23.8k
    else
12512
23.8k
      {
12513
        /* Fall through.  */
12514
54.7k
    case w_mode:
12515
54.7k
        if (!get16 (ins, &op))
12516
246
    return false;
12517
54.7k
      }
12518
431k
  }
12519
481k
      break;
12520
481k
    case const_1_mode:
12521
21.8k
      if (ins->intel_syntax)
12522
3.16k
  oappend (ins, "1");
12523
21.8k
      return true;
12524
0
    default:
12525
0
      oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
12526
0
      return true;
12527
1.04M
    }
12528
12529
1.02M
  oappend_immediate (ins, op);
12530
1.02M
  return true;
12531
1.04M
}
12532
12533
static bool
12534
OP_I64 (instr_info *ins, int bytemode, int sizeflag)
12535
137k
{
12536
137k
  uint64_t op;
12537
12538
137k
  if (bytemode != v_mode || ins->address_mode != mode_64bit
12539
137k
      || !(ins->rex & REX_W))
12540
133k
    return OP_I (ins, bytemode, sizeflag);
12541
12542
4.00k
  USED_REX (REX_W);
12543
12544
4.00k
  if (!get64 (ins, &op))
12545
13
    return false;
12546
12547
3.98k
  oappend_immediate (ins, op);
12548
3.98k
  return true;
12549
4.00k
}
12550
12551
static bool
12552
OP_sI (instr_info *ins, int bytemode, int sizeflag)
12553
221k
{
12554
221k
  bfd_vma op;
12555
12556
221k
  switch (bytemode)
12557
221k
    {
12558
153k
    case b_mode:
12559
185k
    case b_T_mode:
12560
185k
      if (!get8s (ins, &op))
12561
134
  return false;
12562
185k
      if (bytemode == b_T_mode)
12563
32.7k
  {
12564
32.7k
    if (ins->address_mode != mode_64bit
12565
32.7k
        || !((sizeflag & DFLAG) || (ins->rex & REX_W)))
12566
20.6k
      {
12567
        /* The operand-size prefix is overridden by a REX prefix.  */
12568
20.6k
        if ((sizeflag & DFLAG) || (ins->rex & REX_W))
12569
12.1k
    op &= 0xffffffff;
12570
8.42k
        else
12571
8.42k
    op &= 0xffff;
12572
20.6k
    }
12573
32.7k
  }
12574
152k
      else
12575
152k
  {
12576
152k
    if (!(ins->rex & REX_W))
12577
118k
      {
12578
118k
        if (sizeflag & DFLAG)
12579
112k
    op &= 0xffffffff;
12580
6.53k
        else
12581
6.53k
    op &= 0xffff;
12582
118k
      }
12583
152k
  }
12584
185k
      break;
12585
35.5k
    case v_mode:
12586
      /* The operand-size prefix is overridden by a REX prefix.  */
12587
35.5k
      if (!(sizeflag & DFLAG) && !(ins->rex & REX_W))
12588
2.17k
  {
12589
2.17k
    if (!get16 (ins, &op))
12590
64
      return false;
12591
2.17k
  }
12592
33.3k
      else if (!get32s (ins, &op))
12593
122
  return false;
12594
35.3k
      break;
12595
35.3k
    default:
12596
0
      oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
12597
0
      return true;
12598
221k
    }
12599
12600
221k
  oappend_immediate (ins, op);
12601
221k
  return true;
12602
221k
}
12603
12604
static bool
12605
OP_J (instr_info *ins, int bytemode, int sizeflag)
12606
928k
{
12607
928k
  bfd_vma disp;
12608
928k
  bfd_vma mask = -1;
12609
928k
  bfd_vma segment = 0;
12610
12611
928k
  switch (bytemode)
12612
928k
    {
12613
587k
    case b_mode:
12614
587k
      if (!get8s (ins, &disp))
12615
639
  return false;
12616
587k
      break;
12617
587k
    case v_mode:
12618
340k
    case dqw_mode:
12619
340k
      if ((sizeflag & DFLAG)
12620
340k
    || (ins->address_mode == mode_64bit
12621
4.26k
        && ((ins->isa64 == intel64 && bytemode != dqw_mode)
12622
1.36k
      || (ins->rex & REX_W))))
12623
336k
  {
12624
336k
    if (!get32s (ins, &disp))
12625
166
      return false;
12626
336k
  }
12627
3.84k
      else
12628
3.84k
  {
12629
3.84k
    if (!get16s (ins, &disp))
12630
74
      return false;
12631
    /* In 16bit mode, address is wrapped around at 64k within
12632
       the same segment.  Otherwise, a data16 prefix on a jump
12633
       instruction means that the pc is masked to 16 bits after
12634
       the displacement is added!  */
12635
3.77k
    mask = 0xffff;
12636
3.77k
    if ((ins->prefixes & PREFIX_DATA) == 0)
12637
3.27k
      segment = ((ins->start_pc + (ins->codep - ins->start_codep))
12638
3.27k
           & ~((bfd_vma) 0xffff));
12639
3.77k
  }
12640
340k
      if (ins->address_mode != mode_64bit
12641
340k
    || (ins->isa64 != intel64 && !(ins->rex & REX_W)))
12642
339k
  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12643
340k
      break;
12644
0
    default:
12645
0
      oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
12646
0
      return true;
12647
928k
    }
12648
927k
  disp = ((ins->start_pc + (ins->codep - ins->start_codep) + disp) & mask)
12649
927k
   | segment;
12650
927k
  set_op (ins, disp, false);
12651
927k
  print_operand_value (ins, disp, dis_style_text);
12652
927k
  return true;
12653
928k
}
12654
12655
static bool
12656
OP_SEG (instr_info *ins, int bytemode, int sizeflag)
12657
45.5k
{
12658
45.5k
  if (bytemode == w_mode)
12659
21.0k
    {
12660
21.0k
      oappend_register (ins, att_names_seg[ins->modrm.reg]);
12661
21.0k
      return true;
12662
21.0k
    }
12663
24.4k
  return OP_E (ins, ins->modrm.mod == 3 ? bytemode : w_mode, sizeflag);
12664
45.5k
}
12665
12666
static bool
12667
OP_DIR (instr_info *ins, int dummy ATTRIBUTE_UNUSED, int sizeflag)
12668
4.19k
{
12669
4.19k
  bfd_vma seg, offset;
12670
4.19k
  int res;
12671
4.19k
  char scratch[24];
12672
12673
4.19k
  if (sizeflag & DFLAG)
12674
2.46k
    {
12675
2.46k
      if (!get32 (ins, &offset))
12676
2.41k
  return false;;
12677
2.41k
    }
12678
1.72k
  else if (!get16 (ins, &offset))
12679
71
    return false;
12680
4.07k
  if (!get16 (ins, &seg))
12681
4.02k
    return false;;
12682
4.02k
  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12683
12684
4.02k
  res = snprintf (scratch, ARRAY_SIZE (scratch),
12685
4.02k
      ins->intel_syntax ? "0x%x:0x%x" : "$0x%x,$0x%x",
12686
4.02k
      (unsigned) seg, (unsigned) offset);
12687
4.02k
  if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
12688
0
    abort ();
12689
4.02k
  oappend (ins, scratch);
12690
4.02k
  return true;
12691
4.02k
}
12692
12693
static bool
12694
OP_OFF (instr_info *ins, int bytemode, int sizeflag)
12695
19.6k
{
12696
19.6k
  bfd_vma off;
12697
12698
19.6k
  if (ins->intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12699
398
    intel_operand_size (ins, bytemode, sizeflag);
12700
19.6k
  append_seg (ins);
12701
12702
19.6k
  if ((sizeflag & AFLAG) || ins->address_mode == mode_64bit)
12703
14.0k
    {
12704
14.0k
      if (!get32 (ins, &off))
12705
111
  return false;
12706
14.0k
    }
12707
5.59k
  else
12708
5.59k
    {
12709
5.59k
      if (!get16 (ins, &off))
12710
136
  return false;
12711
5.59k
    }
12712
12713
19.4k
  if (ins->intel_syntax)
12714
4.43k
    {
12715
4.43k
      if (!ins->active_seg_prefix)
12716
4.01k
  {
12717
4.01k
    oappend_register (ins, att_names_seg[ds_reg - es_reg]);
12718
4.01k
    oappend (ins, ":");
12719
4.01k
  }
12720
4.43k
    }
12721
19.4k
  print_operand_value (ins, off, dis_style_address_offset);
12722
19.4k
  return true;
12723
19.6k
}
12724
12725
static bool
12726
OP_OFF64 (instr_info *ins, int bytemode, int sizeflag)
12727
51.8k
{
12728
51.8k
  uint64_t off;
12729
12730
51.8k
  if (ins->address_mode != mode_64bit
12731
51.8k
      || (ins->prefixes & PREFIX_ADDR))
12732
19.6k
    return OP_OFF (ins, bytemode, sizeflag);
12733
12734
32.2k
  if (ins->intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12735
210
    intel_operand_size (ins, bytemode, sizeflag);
12736
32.2k
  append_seg (ins);
12737
12738
32.2k
  if (!get64 (ins, &off))
12739
315
    return false;
12740
12741
31.9k
  if (ins->intel_syntax)
12742
5.84k
    {
12743
5.84k
      if (!ins->active_seg_prefix)
12744
5.53k
  {
12745
5.53k
    oappend_register (ins, att_names_seg[ds_reg - es_reg]);
12746
5.53k
    oappend (ins, ":");
12747
5.53k
  }
12748
5.84k
    }
12749
31.9k
  print_operand_value (ins, off, dis_style_address_offset);
12750
31.9k
  return true;
12751
32.2k
}
12752
12753
static void
12754
ptr_reg (instr_info *ins, int code, int sizeflag)
12755
507k
{
12756
507k
  const char *s;
12757
12758
507k
  *ins->obufp++ = ins->open_char;
12759
507k
  ins->used_prefixes |= (ins->prefixes & PREFIX_ADDR);
12760
507k
  if (ins->address_mode == mode_64bit)
12761
410k
    {
12762
410k
      if (!(sizeflag & AFLAG))
12763
3.91k
  s = att_names32[code - eAX_reg];
12764
406k
      else
12765
406k
  s = att_names64[code - eAX_reg];
12766
410k
    }
12767
96.9k
  else if (sizeflag & AFLAG)
12768
75.3k
    s = att_names32[code - eAX_reg];
12769
21.5k
  else
12770
21.5k
    s = att_names16[code - eAX_reg];
12771
507k
  oappend_register (ins, s);
12772
507k
  oappend_char (ins, ins->close_char);
12773
507k
}
12774
12775
static bool
12776
OP_ESreg (instr_info *ins, int code, int sizeflag)
12777
324k
{
12778
324k
  if (ins->intel_syntax)
12779
28.9k
    {
12780
28.9k
      switch (ins->codep[-1])
12781
28.9k
  {
12782
4.07k
  case 0x6d:  /* insw/insl */
12783
4.07k
    intel_operand_size (ins, z_mode, sizeflag);
12784
4.07k
    break;
12785
3.08k
  case 0xa5:  /* movsw/movsl/movsq */
12786
7.17k
  case 0xa7:  /* cmpsw/cmpsl/cmpsq */
12787
10.9k
  case 0xab:  /* stosw/stosl */
12788
13.2k
  case 0xaf:  /* scasw/scasl */
12789
13.2k
    intel_operand_size (ins, v_mode, sizeflag);
12790
13.2k
    break;
12791
11.6k
  default:
12792
11.6k
    intel_operand_size (ins, b_mode, sizeflag);
12793
28.9k
  }
12794
28.9k
    }
12795
324k
  oappend_register (ins, att_names_seg[0]);
12796
324k
  oappend_char (ins, ':');
12797
324k
  ptr_reg (ins, code, sizeflag);
12798
324k
  return true;
12799
324k
}
12800
12801
static bool
12802
OP_DSreg (instr_info *ins, int code, int sizeflag)
12803
182k
{
12804
182k
  if (ins->intel_syntax)
12805
29.3k
    {
12806
29.3k
      switch (ins->codep[-1])
12807
29.3k
  {
12808
7.20k
  case 0x6f:  /* outsw/outsl */
12809
7.20k
    intel_operand_size (ins, z_mode, sizeflag);
12810
7.20k
    break;
12811
3.08k
  case 0xa5:  /* movsw/movsl/movsq */
12812
7.17k
  case 0xa7:  /* cmpsw/cmpsl/cmpsq */
12813
9.74k
  case 0xad:  /* lodsw/lodsl/lodsq */
12814
9.74k
    intel_operand_size (ins, v_mode, sizeflag);
12815
9.74k
    break;
12816
12.4k
  default:
12817
12.4k
    intel_operand_size (ins, b_mode, sizeflag);
12818
29.3k
  }
12819
29.3k
    }
12820
  /* Set ins->active_seg_prefix to PREFIX_DS if it is unset so that the
12821
     default segment register DS is printed.  */
12822
182k
  if (!ins->active_seg_prefix)
12823
176k
    ins->active_seg_prefix = PREFIX_DS;
12824
182k
  append_seg (ins);
12825
182k
  ptr_reg (ins, code, sizeflag);
12826
182k
  return true;
12827
182k
}
12828
12829
static bool
12830
OP_C (instr_info *ins, int dummy ATTRIBUTE_UNUSED,
12831
      int sizeflag ATTRIBUTE_UNUSED)
12832
2.35k
{
12833
2.35k
  int add, res;
12834
2.35k
  char scratch[8];
12835
12836
2.35k
  if (ins->rex & REX_R)
12837
623
    {
12838
623
      USED_REX (REX_R);
12839
623
      add = 8;
12840
623
    }
12841
1.72k
  else if (ins->address_mode != mode_64bit && (ins->prefixes & PREFIX_LOCK))
12842
891
    {
12843
891
      ins->all_prefixes[ins->last_lock_prefix] = 0;
12844
891
      ins->used_prefixes |= PREFIX_LOCK;
12845
891
      add = 8;
12846
891
    }
12847
837
  else
12848
837
    add = 0;
12849
2.35k
  res = snprintf (scratch, ARRAY_SIZE (scratch), "%%cr%d",
12850
2.35k
      ins->modrm.reg + add);
12851
2.35k
  if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
12852
0
    abort ();
12853
2.35k
  oappend_register (ins, scratch);
12854
2.35k
  return true;
12855
2.35k
}
12856
12857
static bool
12858
OP_D (instr_info *ins, int dummy ATTRIBUTE_UNUSED,
12859
      int sizeflag ATTRIBUTE_UNUSED)
12860
1.13k
{
12861
1.13k
  int add, res;
12862
1.13k
  char scratch[8];
12863
12864
1.13k
  USED_REX (REX_R);
12865
1.13k
  if (ins->rex & REX_R)
12866
359
    add = 8;
12867
778
  else
12868
778
    add = 0;
12869
1.13k
  res = snprintf (scratch, ARRAY_SIZE (scratch),
12870
1.13k
      ins->intel_syntax ? "dr%d" : "%%db%d",
12871
1.13k
      ins->modrm.reg + add);
12872
1.13k
  if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
12873
0
    abort ();
12874
1.13k
  oappend (ins, scratch);
12875
1.13k
  return true;
12876
1.13k
}
12877
12878
static bool
12879
OP_T (instr_info *ins, int dummy ATTRIBUTE_UNUSED,
12880
      int sizeflag ATTRIBUTE_UNUSED)
12881
462
{
12882
462
  int res;
12883
462
  char scratch[8];
12884
12885
462
  res = snprintf (scratch, ARRAY_SIZE (scratch), "%%tr%d", ins->modrm.reg);
12886
462
  if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
12887
0
    abort ();
12888
462
  oappend_register (ins, scratch);
12889
462
  return true;
12890
462
}
12891
12892
static bool
12893
OP_MMX (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
12894
  int sizeflag ATTRIBUTE_UNUSED)
12895
31.4k
{
12896
31.4k
  int reg = ins->modrm.reg;
12897
31.4k
  const char (*names)[8];
12898
12899
31.4k
  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12900
31.4k
  if (ins->prefixes & PREFIX_DATA)
12901
1.43k
    {
12902
1.43k
      names = att_names_xmm;
12903
1.43k
      USED_REX (REX_R);
12904
1.43k
      if (ins->rex & REX_R)
12905
495
  reg += 8;
12906
1.43k
    }
12907
29.9k
  else
12908
29.9k
    names = att_names_mm;
12909
31.4k
  oappend_register (ins, names[reg]);
12910
31.4k
  return true;
12911
31.4k
}
12912
12913
static void
12914
print_vector_reg (instr_info *ins, unsigned int reg, int bytemode)
12915
103k
{
12916
103k
  const char (*names)[8];
12917
12918
103k
  if (bytemode == xmmq_mode
12919
103k
      || bytemode == evex_half_bcst_xmmqh_mode
12920
103k
      || bytemode == evex_half_bcst_xmmq_mode)
12921
3.10k
    {
12922
3.10k
      switch (ins->vex.length)
12923
3.10k
  {
12924
1.75k
  case 128:
12925
1.99k
  case 256:
12926
1.99k
    names = att_names_xmm;
12927
1.99k
    break;
12928
1.11k
  case 512:
12929
1.11k
    names = att_names_ymm;
12930
1.11k
    ins->evex_used |= EVEX_len_used;
12931
1.11k
    break;
12932
0
  default:
12933
0
    abort ();
12934
3.10k
  }
12935
3.10k
    }
12936
100k
  else if (bytemode == ymm_mode)
12937
295
    names = att_names_ymm;
12938
99.7k
  else if (bytemode == tmm_mode)
12939
5.29k
    {
12940
5.29k
      if (reg >= 8)
12941
2.92k
  {
12942
2.92k
    oappend (ins, "(bad)");
12943
2.92k
    return;
12944
2.92k
  }
12945
2.37k
      names = att_names_tmm;
12946
2.37k
    }
12947
94.4k
  else if (ins->need_vex
12948
94.4k
     && bytemode != xmm_mode
12949
94.4k
     && bytemode != scalar_mode
12950
94.4k
     && bytemode != xmmdw_mode
12951
94.4k
     && bytemode != xmmqd_mode
12952
94.4k
     && bytemode != evex_half_bcst_xmmqdh_mode
12953
94.4k
     && bytemode != w_swap_mode
12954
94.4k
     && bytemode != b_mode
12955
94.4k
     && bytemode != w_mode
12956
94.4k
     && bytemode != d_mode
12957
94.4k
     && bytemode != q_mode)
12958
60.7k
    {
12959
60.7k
      ins->evex_used |= EVEX_len_used;
12960
60.7k
      switch (ins->vex.length)
12961
60.7k
  {
12962
26.1k
  case 128:
12963
26.1k
    names = att_names_xmm;
12964
26.1k
    break;
12965
19.2k
  case 256:
12966
19.2k
    if (ins->vex.w
12967
19.2k
        || bytemode != vex_vsib_q_w_dq_mode)
12968
17.9k
      names = att_names_ymm;
12969
1.36k
    else
12970
1.36k
      names = att_names_xmm;
12971
19.2k
    break;
12972
15.2k
  case 512:
12973
15.2k
    if (ins->vex.w
12974
15.2k
        || bytemode != vex_vsib_q_w_dq_mode)
12975
14.4k
      names = att_names_zmm;
12976
809
    else
12977
809
      names = att_names_ymm;
12978
15.2k
    break;
12979
0
  default:
12980
0
    abort ();
12981
60.7k
  }
12982
60.7k
    }
12983
33.7k
  else
12984
33.7k
    names = att_names_xmm;
12985
100k
  oappend_register (ins, names[reg]);
12986
100k
}
12987
12988
static bool
12989
OP_XMM (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
12990
81.2k
{
12991
81.2k
  unsigned int reg = ins->modrm.reg;
12992
12993
81.2k
  USED_REX (REX_R);
12994
81.2k
  if (ins->rex & REX_R)
12995
30.6k
    reg += 8;
12996
81.2k
  if (ins->vex.evex)
12997
33.2k
    {
12998
33.2k
      if (!ins->vex.r)
12999
18.2k
  reg += 16;
13000
33.2k
    }
13001
13002
81.2k
  if (bytemode == tmm_mode)
13003
2.74k
    ins->modrm.reg = reg;
13004
78.5k
  else if (bytemode == scalar_mode)
13005
8.89k
    ins->vex.no_broadcast = true;
13006
13007
81.2k
  print_vector_reg (ins, reg, bytemode);
13008
81.2k
  return true;
13009
81.2k
}
13010
13011
static bool
13012
OP_EM (instr_info *ins, int bytemode, int sizeflag)
13013
31.5k
{
13014
31.5k
  int reg;
13015
31.5k
  const char (*names)[8];
13016
13017
31.5k
  if (ins->modrm.mod != 3)
13018
26.8k
    {
13019
26.8k
      if (ins->intel_syntax
13020
26.8k
    && (bytemode == v_mode || bytemode == v_swap_mode))
13021
5.00k
  {
13022
5.00k
    bytemode = (ins->prefixes & PREFIX_DATA) ? x_mode : q_mode;
13023
5.00k
    ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13024
5.00k
  }
13025
26.8k
      return OP_E (ins, bytemode, sizeflag);
13026
26.8k
    }
13027
13028
4.63k
  if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
13029
190
    swap_operand (ins);
13030
13031
  /* Skip mod/rm byte.  */
13032
4.63k
  MODRM_CHECK;
13033
4.63k
  ins->codep++;
13034
4.63k
  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13035
4.63k
  reg = ins->modrm.rm;
13036
4.63k
  if (ins->prefixes & PREFIX_DATA)
13037
1.78k
    {
13038
1.78k
      names = att_names_xmm;
13039
1.78k
      USED_REX (REX_B);
13040
1.78k
      if (ins->rex & REX_B)
13041
1.22k
  reg += 8;
13042
1.78k
    }
13043
2.85k
  else
13044
2.85k
    names = att_names_mm;
13045
4.63k
  oappend_register (ins, names[reg]);
13046
4.63k
  return true;
13047
4.63k
}
13048
13049
/* cvt* are the only instructions in sse2 which have
13050
   both SSE and MMX operands and also have 0x66 prefix
13051
   in their opcode. 0x66 was originally used to differentiate
13052
   between SSE and MMX instruction(operands). So we have to handle the
13053
   cvt* separately using OP_EMC and OP_MXC */
13054
static bool
13055
OP_EMC (instr_info *ins, int bytemode, int sizeflag)
13056
1.41k
{
13057
1.41k
  if (ins->modrm.mod != 3)
13058
743
    {
13059
743
      if (ins->intel_syntax && bytemode == v_mode)
13060
0
  {
13061
0
    bytemode = (ins->prefixes & PREFIX_DATA) ? x_mode : q_mode;
13062
0
    ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13063
0
  }
13064
743
      return OP_E (ins, bytemode, sizeflag);
13065
743
    }
13066
13067
  /* Skip mod/rm byte.  */
13068
674
  MODRM_CHECK;
13069
674
  ins->codep++;
13070
674
  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13071
674
  oappend_register (ins, att_names_mm[ins->modrm.rm]);
13072
674
  return true;
13073
674
}
13074
13075
static bool
13076
OP_MXC (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13077
  int sizeflag ATTRIBUTE_UNUSED)
13078
482
{
13079
482
  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13080
482
  oappend_register (ins, att_names_mm[ins->modrm.reg]);
13081
482
  return true;
13082
482
}
13083
13084
static bool
13085
OP_EX (instr_info *ins, int bytemode, int sizeflag)
13086
73.7k
{
13087
73.7k
  int reg;
13088
13089
  /* Skip mod/rm byte.  */
13090
73.7k
  MODRM_CHECK;
13091
73.7k
  ins->codep++;
13092
13093
73.7k
  if (bytemode == dq_mode)
13094
507
    bytemode = ins->vex.w ? q_mode : d_mode;
13095
13096
73.7k
  if (ins->modrm.mod != 3)
13097
51.9k
    return OP_E_memory (ins, bytemode, sizeflag);
13098
13099
21.8k
  reg = ins->modrm.rm;
13100
21.8k
  USED_REX (REX_B);
13101
21.8k
  if (ins->rex & REX_B)
13102
6.41k
    reg += 8;
13103
21.8k
  if (ins->vex.evex)
13104
6.47k
    {
13105
6.47k
      USED_REX (REX_X);
13106
6.47k
      if ((ins->rex & REX_X))
13107
1.94k
  reg += 16;
13108
6.47k
    }
13109
13110
21.8k
  if ((sizeflag & SUFFIX_ALWAYS)
13111
21.8k
      && (bytemode == x_swap_mode
13112
2.60k
    || bytemode == w_swap_mode
13113
2.60k
    || bytemode == d_swap_mode
13114
2.60k
    || bytemode == q_swap_mode))
13115
958
    swap_operand (ins);
13116
13117
21.8k
  if (bytemode == tmm_mode)
13118
2.55k
    ins->modrm.rm = reg;
13119
13120
21.8k
  print_vector_reg (ins, reg, bytemode);
13121
21.8k
  return true;
13122
73.7k
}
13123
13124
static bool
13125
OP_MS (instr_info *ins, int bytemode, int sizeflag)
13126
3.23k
{
13127
3.23k
  if (ins->modrm.mod == 3)
13128
1.41k
    return OP_EM (ins, bytemode, sizeflag);
13129
1.81k
  return BadOp (ins);
13130
3.23k
}
13131
13132
static bool
13133
OP_XS (instr_info *ins, int bytemode, int sizeflag)
13134
816
{
13135
816
  if (ins->modrm.mod == 3)
13136
546
    return OP_EX (ins, bytemode, sizeflag);
13137
270
  return BadOp (ins);
13138
816
}
13139
13140
static bool
13141
OP_M (instr_info *ins, int bytemode, int sizeflag)
13142
136k
{
13143
136k
  if (ins->modrm.mod == 3)
13144
    /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
13145
3.25k
    return BadOp (ins);
13146
133k
  return OP_E (ins, bytemode, sizeflag);
13147
136k
}
13148
13149
static bool
13150
OP_0f07 (instr_info *ins, int bytemode, int sizeflag)
13151
3.24k
{
13152
3.24k
  if (ins->modrm.mod != 3 || ins->modrm.rm != 0)
13153
2.54k
    return BadOp (ins);
13154
701
  return OP_E (ins, bytemode, sizeflag);
13155
3.24k
}
13156
13157
/* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
13158
   32bit mode and "xchg %rax,%rax" in 64bit mode.  */
13159
13160
static bool
13161
NOP_Fixup (instr_info *ins, int opnd, int sizeflag)
13162
156k
{
13163
156k
  if ((ins->prefixes & PREFIX_DATA) == 0 && (ins->rex & REX_B) == 0)
13164
147k
    {
13165
147k
      ins->mnemonicendp = stpcpy (ins->obuf, "nop");
13166
147k
      return true;
13167
147k
    }
13168
9.23k
  if (opnd == 0)
13169
4.61k
    return OP_REG (ins, eAX_reg, sizeflag);
13170
4.61k
  return OP_IMREG (ins, eAX_reg, sizeflag);
13171
9.23k
}
13172
13173
static const char *const Suffix3DNow[] = {
13174
/* 00 */  NULL,   NULL,   NULL,   NULL,
13175
/* 04 */  NULL,   NULL,   NULL,   NULL,
13176
/* 08 */  NULL,   NULL,   NULL,   NULL,
13177
/* 0C */  "pi2fw",  "pi2fd",  NULL,   NULL,
13178
/* 10 */  NULL,   NULL,   NULL,   NULL,
13179
/* 14 */  NULL,   NULL,   NULL,   NULL,
13180
/* 18 */  NULL,   NULL,   NULL,   NULL,
13181
/* 1C */  "pf2iw",  "pf2id",  NULL,   NULL,
13182
/* 20 */  NULL,   NULL,   NULL,   NULL,
13183
/* 24 */  NULL,   NULL,   NULL,   NULL,
13184
/* 28 */  NULL,   NULL,   NULL,   NULL,
13185
/* 2C */  NULL,   NULL,   NULL,   NULL,
13186
/* 30 */  NULL,   NULL,   NULL,   NULL,
13187
/* 34 */  NULL,   NULL,   NULL,   NULL,
13188
/* 38 */  NULL,   NULL,   NULL,   NULL,
13189
/* 3C */  NULL,   NULL,   NULL,   NULL,
13190
/* 40 */  NULL,   NULL,   NULL,   NULL,
13191
/* 44 */  NULL,   NULL,   NULL,   NULL,
13192
/* 48 */  NULL,   NULL,   NULL,   NULL,
13193
/* 4C */  NULL,   NULL,   NULL,   NULL,
13194
/* 50 */  NULL,   NULL,   NULL,   NULL,
13195
/* 54 */  NULL,   NULL,   NULL,   NULL,
13196
/* 58 */  NULL,   NULL,   NULL,   NULL,
13197
/* 5C */  NULL,   NULL,   NULL,   NULL,
13198
/* 60 */  NULL,   NULL,   NULL,   NULL,
13199
/* 64 */  NULL,   NULL,   NULL,   NULL,
13200
/* 68 */  NULL,   NULL,   NULL,   NULL,
13201
/* 6C */  NULL,   NULL,   NULL,   NULL,
13202
/* 70 */  NULL,   NULL,   NULL,   NULL,
13203
/* 74 */  NULL,   NULL,   NULL,   NULL,
13204
/* 78 */  NULL,   NULL,   NULL,   NULL,
13205
/* 7C */  NULL,   NULL,   NULL,   NULL,
13206
/* 80 */  NULL,   NULL,   NULL,   NULL,
13207
/* 84 */  NULL,   NULL,   NULL,   NULL,
13208
/* 88 */  NULL,   NULL,   "pfnacc", NULL,
13209
/* 8C */  NULL,   NULL,   "pfpnacc",  NULL,
13210
/* 90 */  "pfcmpge",  NULL,   NULL,   NULL,
13211
/* 94 */  "pfmin",  NULL,   "pfrcp",  "pfrsqrt",
13212
/* 98 */  NULL,   NULL,   "pfsub",  NULL,
13213
/* 9C */  NULL,   NULL,   "pfadd",  NULL,
13214
/* A0 */  "pfcmpgt",  NULL,   NULL,   NULL,
13215
/* A4 */  "pfmax",  NULL,   "pfrcpit1", "pfrsqit1",
13216
/* A8 */  NULL,   NULL,   "pfsubr", NULL,
13217
/* AC */  NULL,   NULL,   "pfacc",  NULL,
13218
/* B0 */  "pfcmpeq",  NULL,   NULL,   NULL,
13219
/* B4 */  "pfmul",  NULL,   "pfrcpit2", "pmulhrw",
13220
/* B8 */  NULL,   NULL,   NULL,   "pswapd",
13221
/* BC */  NULL,   NULL,   NULL,   "pavgusb",
13222
/* C0 */  NULL,   NULL,   NULL,   NULL,
13223
/* C4 */  NULL,   NULL,   NULL,   NULL,
13224
/* C8 */  NULL,   NULL,   NULL,   NULL,
13225
/* CC */  NULL,   NULL,   NULL,   NULL,
13226
/* D0 */  NULL,   NULL,   NULL,   NULL,
13227
/* D4 */  NULL,   NULL,   NULL,   NULL,
13228
/* D8 */  NULL,   NULL,   NULL,   NULL,
13229
/* DC */  NULL,   NULL,   NULL,   NULL,
13230
/* E0 */  NULL,   NULL,   NULL,   NULL,
13231
/* E4 */  NULL,   NULL,   NULL,   NULL,
13232
/* E8 */  NULL,   NULL,   NULL,   NULL,
13233
/* EC */  NULL,   NULL,   NULL,   NULL,
13234
/* F0 */  NULL,   NULL,   NULL,   NULL,
13235
/* F4 */  NULL,   NULL,   NULL,   NULL,
13236
/* F8 */  NULL,   NULL,   NULL,   NULL,
13237
/* FC */  NULL,   NULL,   NULL,   NULL,
13238
};
13239
13240
static bool
13241
OP_3DNowSuffix (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13242
    int sizeflag ATTRIBUTE_UNUSED)
13243
24.0k
{
13244
24.0k
  const char *mnemonic;
13245
13246
24.0k
  if (!fetch_code (ins->info, ins->codep + 1))
13247
65
    return false;
13248
  /* AMD 3DNow! instructions are specified by an opcode suffix in the
13249
     place where an 8-bit immediate would normally go.  ie. the last
13250
     byte of the instruction.  */
13251
24.0k
  ins->obufp = ins->mnemonicendp;
13252
24.0k
  mnemonic = Suffix3DNow[*ins->codep++];
13253
24.0k
  if (mnemonic)
13254
417
    ins->obufp = stpcpy (ins->obufp, mnemonic);
13255
23.5k
  else
13256
23.5k
    {
13257
      /* Since a variable sized ins->modrm/ins->sib chunk is between the start
13258
   of the opcode (0x0f0f) and the opcode suffix, we need to do
13259
   all the ins->modrm processing first, and don't know until now that
13260
   we have a bad opcode.  This necessitates some cleaning up.  */
13261
23.5k
      ins->op_out[0][0] = '\0';
13262
23.5k
      ins->op_out[1][0] = '\0';
13263
23.5k
      BadOp (ins);
13264
23.5k
    }
13265
24.0k
  ins->mnemonicendp = ins->obufp;
13266
24.0k
  return true;
13267
24.0k
}
13268
13269
static const struct op simd_cmp_op[] =
13270
{
13271
  { STRING_COMMA_LEN ("eq") },
13272
  { STRING_COMMA_LEN ("lt") },
13273
  { STRING_COMMA_LEN ("le") },
13274
  { STRING_COMMA_LEN ("unord") },
13275
  { STRING_COMMA_LEN ("neq") },
13276
  { STRING_COMMA_LEN ("nlt") },
13277
  { STRING_COMMA_LEN ("nle") },
13278
  { STRING_COMMA_LEN ("ord") }
13279
};
13280
13281
static const struct op vex_cmp_op[] =
13282
{
13283
  { STRING_COMMA_LEN ("eq_uq") },
13284
  { STRING_COMMA_LEN ("nge") },
13285
  { STRING_COMMA_LEN ("ngt") },
13286
  { STRING_COMMA_LEN ("false") },
13287
  { STRING_COMMA_LEN ("neq_oq") },
13288
  { STRING_COMMA_LEN ("ge") },
13289
  { STRING_COMMA_LEN ("gt") },
13290
  { STRING_COMMA_LEN ("true") },
13291
  { STRING_COMMA_LEN ("eq_os") },
13292
  { STRING_COMMA_LEN ("lt_oq") },
13293
  { STRING_COMMA_LEN ("le_oq") },
13294
  { STRING_COMMA_LEN ("unord_s") },
13295
  { STRING_COMMA_LEN ("neq_us") },
13296
  { STRING_COMMA_LEN ("nlt_uq") },
13297
  { STRING_COMMA_LEN ("nle_uq") },
13298
  { STRING_COMMA_LEN ("ord_s") },
13299
  { STRING_COMMA_LEN ("eq_us") },
13300
  { STRING_COMMA_LEN ("nge_uq") },
13301
  { STRING_COMMA_LEN ("ngt_uq") },
13302
  { STRING_COMMA_LEN ("false_os") },
13303
  { STRING_COMMA_LEN ("neq_os") },
13304
  { STRING_COMMA_LEN ("ge_oq") },
13305
  { STRING_COMMA_LEN ("gt_oq") },
13306
  { STRING_COMMA_LEN ("true_us") },
13307
};
13308
13309
static bool
13310
CMP_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13311
     int sizeflag ATTRIBUTE_UNUSED)
13312
1.98k
{
13313
1.98k
  unsigned int cmp_type;
13314
13315
1.98k
  if (!fetch_code (ins->info, ins->codep + 1))
13316
11
    return false;
13317
1.97k
  cmp_type = *ins->codep++;
13318
1.97k
  if (cmp_type < ARRAY_SIZE (simd_cmp_op))
13319
509
    {
13320
509
      char suffix[3];
13321
509
      char *p = ins->mnemonicendp - 2;
13322
509
      suffix[0] = p[0];
13323
509
      suffix[1] = p[1];
13324
509
      suffix[2] = '\0';
13325
509
      sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
13326
509
      ins->mnemonicendp += simd_cmp_op[cmp_type].len;
13327
509
    }
13328
1.46k
  else if (ins->need_vex
13329
1.46k
     && cmp_type < ARRAY_SIZE (simd_cmp_op) + ARRAY_SIZE (vex_cmp_op))
13330
293
    {
13331
293
      char suffix[3];
13332
293
      char *p = ins->mnemonicendp - 2;
13333
293
      suffix[0] = p[0];
13334
293
      suffix[1] = p[1];
13335
293
      suffix[2] = '\0';
13336
293
      cmp_type -= ARRAY_SIZE (simd_cmp_op);
13337
293
      sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
13338
293
      ins->mnemonicendp += vex_cmp_op[cmp_type].len;
13339
293
    }
13340
1.17k
  else
13341
1.17k
    {
13342
      /* We have a reserved extension byte.  Output it directly.  */
13343
1.17k
      oappend_immediate (ins, cmp_type);
13344
1.17k
    }
13345
1.97k
  return true;
13346
1.98k
}
13347
13348
static bool
13349
OP_Mwait (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13350
1.28k
{
13351
  /* mwait %eax,%ecx / mwaitx %eax,%ecx,%ebx  */
13352
1.28k
  if (!ins->intel_syntax)
13353
847
    {
13354
847
      strcpy (ins->op_out[0], att_names32[0] + ins->intel_syntax);
13355
847
      strcpy (ins->op_out[1], att_names32[1] + ins->intel_syntax);
13356
847
      if (bytemode == eBX_reg)
13357
341
  strcpy (ins->op_out[2], att_names32[3] + ins->intel_syntax);
13358
847
      ins->two_source_ops = true;
13359
847
    }
13360
  /* Skip mod/rm byte.  */
13361
1.28k
  MODRM_CHECK;
13362
1.28k
  ins->codep++;
13363
1.28k
  return true;
13364
1.28k
}
13365
13366
static bool
13367
OP_Monitor (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13368
      int sizeflag ATTRIBUTE_UNUSED)
13369
1.95k
{
13370
  /* monitor %{e,r,}ax,%ecx,%edx"  */
13371
1.95k
  if (!ins->intel_syntax)
13372
1.49k
    {
13373
1.49k
      const char (*names)[8] = (ins->address_mode == mode_64bit
13374
1.49k
        ? att_names64 : att_names32);
13375
13376
1.49k
      if (ins->prefixes & PREFIX_ADDR)
13377
276
  {
13378
    /* Remove "addr16/addr32".  */
13379
276
    ins->all_prefixes[ins->last_addr_prefix] = 0;
13380
276
    names = (ins->address_mode != mode_32bit
13381
276
       ? att_names32 : att_names16);
13382
276
    ins->used_prefixes |= PREFIX_ADDR;
13383
276
  }
13384
1.21k
      else if (ins->address_mode == mode_16bit)
13385
450
  names = att_names16;
13386
1.49k
      strcpy (ins->op_out[0], names[0] + ins->intel_syntax);
13387
1.49k
      strcpy (ins->op_out[1], att_names32[1] + ins->intel_syntax);
13388
1.49k
      strcpy (ins->op_out[2], att_names32[2] + ins->intel_syntax);
13389
1.49k
      ins->two_source_ops = true;
13390
1.49k
    }
13391
  /* Skip mod/rm byte.  */
13392
1.95k
  MODRM_CHECK;
13393
1.95k
  ins->codep++;
13394
1.95k
  return true;
13395
1.95k
}
13396
13397
static bool
13398
REP_Fixup (instr_info *ins, int bytemode, int sizeflag)
13399
394k
{
13400
  /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
13401
     lods and stos.  */
13402
394k
  if (ins->prefixes & PREFIX_REPZ)
13403
1.18k
    ins->all_prefixes[ins->last_repz_prefix] = REP_PREFIX;
13404
13405
394k
  switch (bytemode)
13406
394k
    {
13407
11.1k
    case al_reg:
13408
22.1k
    case eAX_reg:
13409
120k
    case indir_dx_reg:
13410
120k
      return OP_IMREG (ins, bytemode, sizeflag);
13411
274k
    case eDI_reg:
13412
274k
      return OP_ESreg (ins, bytemode, sizeflag);
13413
0
    case eSI_reg:
13414
0
      return OP_DSreg (ins, bytemode, sizeflag);
13415
0
    default:
13416
0
      abort ();
13417
0
      break;
13418
394k
    }
13419
0
  return true;
13420
394k
}
13421
13422
static bool
13423
SEP_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13424
     int sizeflag ATTRIBUTE_UNUSED)
13425
1.18k
{
13426
1.18k
  if (ins->isa64 != amd64)
13427
994
    return true;
13428
13429
190
  ins->obufp = ins->obuf;
13430
190
  BadOp (ins);
13431
190
  ins->mnemonicendp = ins->obufp;
13432
190
  ++ins->codep;
13433
190
  return true;
13434
1.18k
}
13435
13436
/* For BND-prefixed instructions 0xF2 prefix should be displayed as
13437
   "bnd".  */
13438
13439
static bool
13440
BND_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13441
     int sizeflag ATTRIBUTE_UNUSED)
13442
967k
{
13443
967k
  if (ins->prefixes & PREFIX_REPNZ)
13444
2.81k
    ins->all_prefixes[ins->last_repnz_prefix] = BND_PREFIX;
13445
967k
  return true;
13446
967k
}
13447
13448
/* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as
13449
   "notrack".  */
13450
13451
static bool
13452
NOTRACK_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13453
         int sizeflag ATTRIBUTE_UNUSED)
13454
53.6k
{
13455
  /* Since active_seg_prefix is not set in 64-bit mode, check whether
13456
     we've seen a PREFIX_DS.  */
13457
53.6k
  if ((ins->prefixes & PREFIX_DS) != 0
13458
53.6k
      && (ins->address_mode != mode_64bit || ins->last_data_prefix < 0))
13459
2.09k
    {
13460
      /* NOTRACK prefix is only valid on indirect branch instructions.
13461
   NB: DATA prefix is unsupported for Intel64.  */
13462
2.09k
      ins->active_seg_prefix = 0;
13463
2.09k
      ins->all_prefixes[ins->last_seg_prefix] = NOTRACK_PREFIX;
13464
2.09k
    }
13465
53.6k
  return true;
13466
53.6k
}
13467
13468
/* Similar to OP_E.  But the 0xf2/0xf3 ins->prefixes should be displayed as
13469
   "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
13470
 */
13471
13472
static bool
13473
HLE_Fixup1 (instr_info *ins, int bytemode, int sizeflag)
13474
2.35M
{
13475
2.35M
  if (ins->modrm.mod != 3
13476
2.35M
      && (ins->prefixes & PREFIX_LOCK) != 0)
13477
3.08k
    {
13478
3.08k
      if (ins->prefixes & PREFIX_REPZ)
13479
374
  ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX;
13480
3.08k
      if (ins->prefixes & PREFIX_REPNZ)
13481
391
  ins->all_prefixes[ins->last_repnz_prefix] = XACQUIRE_PREFIX;
13482
3.08k
    }
13483
13484
2.35M
  return OP_E (ins, bytemode, sizeflag);
13485
2.35M
}
13486
13487
/* Similar to OP_E.  But the 0xf2/0xf3 ins->prefixes should be displayed as
13488
   "xacquire"/"xrelease" for memory operand.  No check for LOCK prefix.
13489
 */
13490
13491
static bool
13492
HLE_Fixup2 (instr_info *ins, int bytemode, int sizeflag)
13493
24.3k
{
13494
24.3k
  if (ins->modrm.mod != 3)
13495
20.3k
    {
13496
20.3k
      if (ins->prefixes & PREFIX_REPZ)
13497
830
  ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX;
13498
20.3k
      if (ins->prefixes & PREFIX_REPNZ)
13499
1.28k
  ins->all_prefixes[ins->last_repnz_prefix] = XACQUIRE_PREFIX;
13500
20.3k
    }
13501
13502
24.3k
  return OP_E (ins, bytemode, sizeflag);
13503
24.3k
}
13504
13505
/* Similar to OP_E.  But the 0xf3 prefixes should be displayed as
13506
   "xrelease" for memory operand.  No check for LOCK prefix.   */
13507
13508
static bool
13509
HLE_Fixup3 (instr_info *ins, int bytemode, int sizeflag)
13510
338k
{
13511
338k
  if (ins->modrm.mod != 3
13512
338k
      && ins->last_repz_prefix > ins->last_repnz_prefix
13513
338k
      && (ins->prefixes & PREFIX_REPZ) != 0)
13514
297
    ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX;
13515
13516
338k
  return OP_E (ins, bytemode, sizeflag);
13517
338k
}
13518
13519
static bool
13520
CMPXCHG8B_Fixup (instr_info *ins, int bytemode, int sizeflag)
13521
1.95k
{
13522
1.95k
  USED_REX (REX_W);
13523
1.95k
  if (ins->rex & REX_W)
13524
523
    {
13525
      /* Change cmpxchg8b to cmpxchg16b.  */
13526
523
      char *p = ins->mnemonicendp - 2;
13527
523
      ins->mnemonicendp = stpcpy (p, "16b");
13528
523
      bytemode = o_mode;
13529
523
    }
13530
1.42k
  else if ((ins->prefixes & PREFIX_LOCK) != 0)
13531
946
    {
13532
946
      if (ins->prefixes & PREFIX_REPZ)
13533
296
  ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX;
13534
946
      if (ins->prefixes & PREFIX_REPNZ)
13535
309
  ins->all_prefixes[ins->last_repnz_prefix] = XACQUIRE_PREFIX;
13536
946
    }
13537
13538
1.95k
  return OP_M (ins, bytemode, sizeflag);
13539
1.95k
}
13540
13541
static bool
13542
XMM_Fixup (instr_info *ins, int reg, int sizeflag ATTRIBUTE_UNUSED)
13543
642
{
13544
642
  const char (*names)[8] = att_names_xmm;
13545
13546
642
  if (ins->need_vex)
13547
0
    {
13548
0
      switch (ins->vex.length)
13549
0
  {
13550
0
  case 128:
13551
0
    break;
13552
0
  case 256:
13553
0
    names = att_names_ymm;
13554
0
    break;
13555
0
  default:
13556
0
    abort ();
13557
0
  }
13558
0
    }
13559
642
  oappend_register (ins, names[reg]);
13560
642
  return true;
13561
642
}
13562
13563
static bool
13564
FXSAVE_Fixup (instr_info *ins, int bytemode, int sizeflag)
13565
779
{
13566
  /* Add proper suffix to "fxsave" and "fxrstor".  */
13567
779
  USED_REX (REX_W);
13568
779
  if (ins->rex & REX_W)
13569
216
    {
13570
216
      char *p = ins->mnemonicendp;
13571
216
      *p++ = '6';
13572
216
      *p++ = '4';
13573
216
      *p = '\0';
13574
216
      ins->mnemonicendp = p;
13575
216
    }
13576
779
  return OP_M (ins, bytemode, sizeflag);
13577
779
}
13578
13579
/* Display the destination register operand for instructions with
13580
   VEX. */
13581
13582
static bool
13583
OP_VEX (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13584
46.2k
{
13585
46.2k
  int reg, modrm_reg, sib_index = -1;
13586
46.2k
  const char (*names)[8];
13587
13588
46.2k
  if (!ins->need_vex)
13589
0
    abort ();
13590
13591
46.2k
  reg = ins->vex.register_specifier;
13592
46.2k
  ins->vex.register_specifier = 0;
13593
46.2k
  if (ins->address_mode != mode_64bit)
13594
7.77k
    {
13595
7.77k
      if (ins->vex.evex && !ins->vex.v)
13596
1.94k
  {
13597
1.94k
    oappend (ins, "(bad)");
13598
1.94k
    return true;
13599
1.94k
  }
13600
13601
5.83k
      reg &= 7;
13602
5.83k
    }
13603
38.5k
  else if (ins->vex.evex && !ins->vex.v)
13604
10.3k
    reg += 16;
13605
13606
44.3k
  switch (bytemode)
13607
44.3k
    {
13608
6.40k
    case scalar_mode:
13609
6.40k
      oappend_register (ins, att_names_xmm[reg]);
13610
6.40k
      return true;
13611
13612
3.38k
    case vex_vsib_d_w_dq_mode:
13613
6.00k
    case vex_vsib_q_w_dq_mode:
13614
      /* This must be the 3rd operand.  */
13615
6.00k
      if (ins->obufp != ins->op_out[2])
13616
0
  abort ();
13617
6.00k
      if (ins->vex.length == 128
13618
6.00k
    || (bytemode != vex_vsib_d_w_dq_mode
13619
2.37k
        && !ins->vex.w))
13620
3.97k
  oappend_register (ins, att_names_xmm[reg]);
13621
2.03k
      else
13622
2.03k
  oappend_register (ins, att_names_ymm[reg]);
13623
13624
      /* All 3 XMM/YMM registers must be distinct.  */
13625
6.00k
      modrm_reg = ins->modrm.reg;
13626
6.00k
      if (ins->rex & REX_R)
13627
1.70k
  modrm_reg += 8;
13628
13629
6.00k
      if (ins->has_sib && ins->modrm.rm == 4)
13630
1.27k
  {
13631
1.27k
    sib_index = ins->sib.index;
13632
1.27k
    if (ins->rex & REX_X)
13633
454
      sib_index += 8;
13634
1.27k
  }
13635
13636
6.00k
      if (reg == modrm_reg || reg == sib_index)
13637
863
  strcpy (ins->obufp, "/(bad)");
13638
6.00k
      if (modrm_reg == sib_index || modrm_reg == reg)
13639
1.04k
  strcat (ins->op_out[0], "/(bad)");
13640
6.00k
      if (sib_index == modrm_reg || sib_index == reg)
13641
872
  strcat (ins->op_out[1], "/(bad)");
13642
13643
6.00k
      return true;
13644
13645
2.55k
    case tmm_mode:
13646
      /* All 3 TMM registers must be distinct.  */
13647
2.55k
      if (reg >= 8)
13648
1.19k
  oappend (ins, "(bad)");
13649
1.35k
      else
13650
1.35k
  {
13651
    /* This must be the 3rd operand.  */
13652
1.35k
    if (ins->obufp != ins->op_out[2])
13653
0
      abort ();
13654
1.35k
    oappend_register (ins, att_names_tmm[reg]);
13655
1.35k
    if (reg == ins->modrm.reg || reg == ins->modrm.rm)
13656
745
      strcpy (ins->obufp, "/(bad)");
13657
1.35k
  }
13658
13659
2.55k
      if (ins->modrm.reg == ins->modrm.rm || ins->modrm.reg == reg
13660
2.55k
    || ins->modrm.rm == reg)
13661
1.97k
  {
13662
1.97k
    if (ins->modrm.reg <= 8
13663
1.97k
        && (ins->modrm.reg == ins->modrm.rm || ins->modrm.reg == reg))
13664
774
      strcat (ins->op_out[0], "/(bad)");
13665
1.97k
    if (ins->modrm.rm <= 8
13666
1.97k
        && (ins->modrm.rm == ins->modrm.reg || ins->modrm.rm == reg))
13667
727
      strcat (ins->op_out[1], "/(bad)");
13668
1.97k
  }
13669
13670
2.55k
      return true;
13671
44.3k
    }
13672
13673
29.3k
  switch (ins->vex.length)
13674
29.3k
    {
13675
12.4k
    case 128:
13676
12.4k
      switch (bytemode)
13677
12.4k
  {
13678
10.6k
  case x_mode:
13679
10.6k
    names = att_names_xmm;
13680
10.6k
    ins->evex_used |= EVEX_len_used;
13681
10.6k
    break;
13682
1.85k
  case dq_mode:
13683
1.85k
    if (ins->rex & REX_W)
13684
963
      names = att_names64;
13685
891
    else
13686
891
      names = att_names32;
13687
1.85k
    break;
13688
0
  case mask_bd_mode:
13689
0
  case mask_mode:
13690
0
    if (reg > 0x7)
13691
0
      {
13692
0
        oappend (ins, "(bad)");
13693
0
        return true;
13694
0
      }
13695
0
    names = att_names_mask;
13696
0
    break;
13697
0
  default:
13698
0
    abort ();
13699
0
    return true;
13700
12.4k
  }
13701
12.4k
      break;
13702
12.4k
    case 256:
13703
10.0k
      switch (bytemode)
13704
10.0k
  {
13705
8.67k
  case x_mode:
13706
8.67k
    names = att_names_ymm;
13707
8.67k
    ins->evex_used |= EVEX_len_used;
13708
8.67k
    break;
13709
0
  case mask_bd_mode:
13710
1.05k
  case mask_mode:
13711
1.05k
    if (reg <= 0x7)
13712
635
      {
13713
635
        names = att_names_mask;
13714
635
        break;
13715
635
      }
13716
    /* Fall through.  */
13717
709
  default:
13718
    /* See PR binutils/20893 for a reproducer.  */
13719
709
    oappend (ins, "(bad)");
13720
709
    return true;
13721
10.0k
  }
13722
9.30k
      break;
13723
9.30k
    case 512:
13724
6.90k
      names = att_names_zmm;
13725
6.90k
      ins->evex_used |= EVEX_len_used;
13726
6.90k
      break;
13727
0
    default:
13728
0
      abort ();
13729
0
      break;
13730
29.3k
    }
13731
28.6k
  oappend_register (ins, names[reg]);
13732
28.6k
  return true;
13733
29.3k
}
13734
13735
static bool
13736
OP_VexR (instr_info *ins, int bytemode, int sizeflag)
13737
2.00k
{
13738
2.00k
  if (ins->modrm.mod == 3)
13739
982
    return OP_VEX (ins, bytemode, sizeflag);
13740
1.02k
  return true;
13741
2.00k
}
13742
13743
static bool
13744
OP_VexW (instr_info *ins, int bytemode, int sizeflag)
13745
2.09k
{
13746
2.09k
  OP_VEX (ins, bytemode, sizeflag);
13747
13748
2.09k
  if (ins->vex.w)
13749
1.61k
    {
13750
      /* Swap 2nd and 3rd operands.  */
13751
1.61k
      char *tmp = ins->op_out[2];
13752
13753
1.61k
      ins->op_out[2] = ins->op_out[1];
13754
1.61k
      ins->op_out[1] = tmp;
13755
1.61k
    }
13756
2.09k
  return true;
13757
2.09k
}
13758
13759
static bool
13760
OP_REG_VexI4 (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13761
2.83k
{
13762
2.83k
  int reg;
13763
2.83k
  const char (*names)[8] = att_names_xmm;
13764
13765
2.83k
  if (!fetch_code (ins->info, ins->codep + 1))
13766
3
    return false;
13767
2.83k
  reg = *ins->codep++;
13768
13769
2.83k
  if (bytemode != x_mode && bytemode != scalar_mode)
13770
0
    abort ();
13771
13772
2.83k
  reg >>= 4;
13773
2.83k
  if (ins->address_mode != mode_64bit)
13774
423
    reg &= 7;
13775
13776
2.83k
  if (bytemode == x_mode && ins->vex.length == 256)
13777
1.66k
    names = att_names_ymm;
13778
13779
2.83k
  oappend_register (ins, names[reg]);
13780
13781
2.83k
  if (ins->vex.w)
13782
1.75k
    {
13783
      /* Swap 3rd and 4th operands.  */
13784
1.75k
      char *tmp = ins->op_out[3];
13785
13786
1.75k
      ins->op_out[3] = ins->op_out[2];
13787
1.75k
      ins->op_out[2] = tmp;
13788
1.75k
    }
13789
2.83k
  return true;
13790
2.83k
}
13791
13792
static bool
13793
OP_VexI4 (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13794
    int sizeflag ATTRIBUTE_UNUSED)
13795
2.03k
{
13796
2.03k
  oappend_immediate (ins, ins->codep[-1] & 0xf);
13797
2.03k
  return true;
13798
2.03k
}
13799
13800
static bool
13801
VPCMP_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13802
       int sizeflag ATTRIBUTE_UNUSED)
13803
2.46k
{
13804
2.46k
  unsigned int cmp_type;
13805
13806
2.46k
  if (!ins->vex.evex)
13807
0
    abort ();
13808
13809
2.46k
  if (!fetch_code (ins->info, ins->codep + 1))
13810
13
    return false;
13811
2.44k
  cmp_type = *ins->codep++;
13812
  /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
13813
     If it's the case, print suffix, otherwise - print the immediate.  */
13814
2.44k
  if (cmp_type < ARRAY_SIZE (simd_cmp_op)
13815
2.44k
      && cmp_type != 3
13816
2.44k
      && cmp_type != 7)
13817
1.03k
    {
13818
1.03k
      char suffix[3];
13819
1.03k
      char *p = ins->mnemonicendp - 2;
13820
13821
      /* vpcmp* can have both one- and two-lettered suffix.  */
13822
1.03k
      if (p[0] == 'p')
13823
358
  {
13824
358
    p++;
13825
358
    suffix[0] = p[0];
13826
358
    suffix[1] = '\0';
13827
358
  }
13828
679
      else
13829
679
  {
13830
679
    suffix[0] = p[0];
13831
679
    suffix[1] = p[1];
13832
679
    suffix[2] = '\0';
13833
679
  }
13834
13835
1.03k
      sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
13836
1.03k
      ins->mnemonicendp += simd_cmp_op[cmp_type].len;
13837
1.03k
    }
13838
1.41k
  else
13839
1.41k
    {
13840
      /* We have a reserved extension byte.  Output it directly.  */
13841
1.41k
      oappend_immediate (ins, cmp_type);
13842
1.41k
    }
13843
2.44k
  return true;
13844
2.46k
}
13845
13846
static const struct op xop_cmp_op[] =
13847
{
13848
  { STRING_COMMA_LEN ("lt") },
13849
  { STRING_COMMA_LEN ("le") },
13850
  { STRING_COMMA_LEN ("gt") },
13851
  { STRING_COMMA_LEN ("ge") },
13852
  { STRING_COMMA_LEN ("eq") },
13853
  { STRING_COMMA_LEN ("neq") },
13854
  { STRING_COMMA_LEN ("false") },
13855
  { STRING_COMMA_LEN ("true") }
13856
};
13857
13858
static bool
13859
VPCOM_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13860
       int sizeflag ATTRIBUTE_UNUSED)
13861
1.44k
{
13862
1.44k
  unsigned int cmp_type;
13863
13864
1.44k
  if (!fetch_code (ins->info, ins->codep + 1))
13865
0
    return false;
13866
1.44k
  cmp_type = *ins->codep++;
13867
1.44k
  if (cmp_type < ARRAY_SIZE (xop_cmp_op))
13868
435
    {
13869
435
      char suffix[3];
13870
435
      char *p = ins->mnemonicendp - 2;
13871
13872
      /* vpcom* can have both one- and two-lettered suffix.  */
13873
435
      if (p[0] == 'm')
13874
238
  {
13875
238
    p++;
13876
238
    suffix[0] = p[0];
13877
238
    suffix[1] = '\0';
13878
238
  }
13879
197
      else
13880
197
  {
13881
197
    suffix[0] = p[0];
13882
197
    suffix[1] = p[1];
13883
197
    suffix[2] = '\0';
13884
197
  }
13885
13886
435
      sprintf (p, "%s%s", xop_cmp_op[cmp_type].name, suffix);
13887
435
      ins->mnemonicendp += xop_cmp_op[cmp_type].len;
13888
435
    }
13889
1.00k
  else
13890
1.00k
    {
13891
      /* We have a reserved extension byte.  Output it directly.  */
13892
1.00k
      oappend_immediate (ins, cmp_type);
13893
1.00k
    }
13894
1.44k
  return true;
13895
1.44k
}
13896
13897
static const struct op pclmul_op[] =
13898
{
13899
  { STRING_COMMA_LEN ("lql") },
13900
  { STRING_COMMA_LEN ("hql") },
13901
  { STRING_COMMA_LEN ("lqh") },
13902
  { STRING_COMMA_LEN ("hqh") }
13903
};
13904
13905
static bool
13906
PCLMUL_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13907
        int sizeflag ATTRIBUTE_UNUSED)
13908
2.43k
{
13909
2.43k
  unsigned int pclmul_type;
13910
13911
2.43k
  if (!fetch_code (ins->info, ins->codep + 1))
13912
16
    return false;
13913
2.41k
  pclmul_type = *ins->codep++;
13914
2.41k
  switch (pclmul_type)
13915
2.41k
    {
13916
267
    case 0x10:
13917
267
      pclmul_type = 2;
13918
267
      break;
13919
293
    case 0x11:
13920
293
      pclmul_type = 3;
13921
293
      break;
13922
1.85k
    default:
13923
1.85k
      break;
13924
2.41k
    }
13925
2.41k
  if (pclmul_type < ARRAY_SIZE (pclmul_op))
13926
813
    {
13927
813
      char suffix[4];
13928
813
      char *p = ins->mnemonicendp - 3;
13929
813
      suffix[0] = p[0];
13930
813
      suffix[1] = p[1];
13931
813
      suffix[2] = p[2];
13932
813
      suffix[3] = '\0';
13933
813
      sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
13934
813
      ins->mnemonicendp += pclmul_op[pclmul_type].len;
13935
813
    }
13936
1.60k
  else
13937
1.60k
    {
13938
      /* We have a reserved extension byte.  Output it directly.  */
13939
1.60k
      oappend_immediate (ins, pclmul_type);
13940
1.60k
    }
13941
2.41k
  return true;
13942
2.41k
}
13943
13944
static bool
13945
MOVSXD_Fixup (instr_info *ins, int bytemode, int sizeflag)
13946
31.5k
{
13947
  /* Add proper suffix to "movsxd".  */
13948
31.5k
  char *p = ins->mnemonicendp;
13949
13950
31.5k
  switch (bytemode)
13951
31.5k
    {
13952
31.5k
    case movsxd_mode:
13953
31.5k
      if (!ins->intel_syntax)
13954
28.5k
  {
13955
28.5k
    USED_REX (REX_W);
13956
28.5k
    if (ins->rex & REX_W)
13957
7.18k
      {
13958
7.18k
        *p++ = 'l';
13959
7.18k
        *p++ = 'q';
13960
7.18k
        break;
13961
7.18k
      }
13962
28.5k
  }
13963
13964
24.4k
      *p++ = 'x';
13965
24.4k
      *p++ = 'd';
13966
24.4k
      break;
13967
0
    default:
13968
0
      oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
13969
0
      break;
13970
31.5k
    }
13971
13972
31.5k
  ins->mnemonicendp = p;
13973
31.5k
  *p = '\0';
13974
31.5k
  return OP_E (ins, bytemode, sizeflag);
13975
31.5k
}
13976
13977
static bool
13978
DistinctDest_Fixup (instr_info *ins, int bytemode, int sizeflag)
13979
4.27k
{
13980
4.27k
  unsigned int reg = ins->vex.register_specifier;
13981
4.27k
  unsigned int modrm_reg = ins->modrm.reg;
13982
4.27k
  unsigned int modrm_rm = ins->modrm.rm;
13983
13984
  /* Calc destination register number.  */
13985
4.27k
  if (ins->rex & REX_R)
13986
730
    modrm_reg += 8;
13987
4.27k
  if (!ins->vex.r)
13988
2.55k
    modrm_reg += 16;
13989
13990
  /* Calc src1 register number.  */
13991
4.27k
  if (ins->address_mode != mode_64bit)
13992
524
    reg &= 7;
13993
3.74k
  else if (ins->vex.evex && !ins->vex.v)
13994
2.68k
    reg += 16;
13995
13996
  /* Calc src2 register number.  */
13997
4.27k
  if (ins->modrm.mod == 3)
13998
1.36k
    {
13999
1.36k
      if (ins->rex & REX_B)
14000
1.13k
        modrm_rm += 8;
14001
1.36k
      if (ins->rex & REX_X)
14002
593
        modrm_rm += 16;
14003
1.36k
    }
14004
14005
  /* Destination and source registers must be distinct, output bad if
14006
     dest == src1 or dest == src2.  */
14007
4.27k
  if (modrm_reg == reg
14008
4.27k
      || (ins->modrm.mod == 3
14009
2.74k
    && modrm_reg == modrm_rm))
14010
1.73k
    {
14011
1.73k
      oappend (ins, "(bad)");
14012
1.73k
      return true;
14013
1.73k
    }
14014
2.53k
  return OP_XMM (ins, bytemode, sizeflag);
14015
4.27k
}
14016
14017
static bool
14018
OP_Rounding (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
14019
18.7k
{
14020
18.7k
  if (ins->modrm.mod != 3 || !ins->vex.b)
14021
15.4k
    return true;
14022
14023
3.30k
  switch (bytemode)
14024
3.30k
    {
14025
810
    case evex_rounding_64_mode:
14026
810
      if (ins->address_mode != mode_64bit || !ins->vex.w)
14027
526
        return true;
14028
      /* Fall through.  */
14029
2.02k
    case evex_rounding_mode:
14030
2.02k
      ins->evex_used |= EVEX_b_used;
14031
2.02k
      oappend (ins, names_rounding[ins->vex.ll]);
14032
2.02k
      break;
14033
761
    case evex_sae_mode:
14034
761
      ins->evex_used |= EVEX_b_used;
14035
761
      oappend (ins, "{");
14036
761
      break;
14037
0
    default:
14038
0
      abort ();
14039
3.30k
    }
14040
2.78k
  oappend (ins, "sae}");
14041
2.78k
  return true;
14042
3.30k
}
14043
14044
static bool
14045
PREFETCHI_Fixup (instr_info *ins, int bytemode, int sizeflag)
14046
1.61k
{
14047
1.61k
  if (ins->modrm.mod != 0 || ins->modrm.rm != 5)
14048
1.18k
    {
14049
1.18k
      if (ins->intel_syntax)
14050
272
  {
14051
272
    ins->mnemonicendp = stpcpy (ins->obuf, "nop   ");
14052
272
  }
14053
909
      else
14054
909
  {
14055
909
    USED_REX (REX_W);
14056
909
    if (ins->rex & REX_W)
14057
237
      ins->mnemonicendp = stpcpy (ins->obuf, "nopq  ");
14058
672
    else
14059
672
      {
14060
672
        if (sizeflag & DFLAG)
14061
482
    ins->mnemonicendp = stpcpy (ins->obuf, "nopl  ");
14062
190
        else
14063
190
    ins->mnemonicendp = stpcpy (ins->obuf, "nopw  ");
14064
672
        ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
14065
672
      }
14066
909
  }
14067
1.18k
      bytemode = v_mode;
14068
1.18k
    }
14069
14070
1.61k
  return OP_M (ins, bytemode, sizeflag);
14071
1.61k
}