Coverage Report

Created: 2026-03-10 08:46

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/binutils-gdb/opcodes/i386-dis.c
Line
Count
Source
1
/* Print i386 instructions for GDB, the GNU debugger.
2
   Copyright (C) 1988-2026 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_R (instr_info *, int, int);
78
static bool OP_M (instr_info *, int, int);
79
static bool OP_VEX (instr_info *, int, int);
80
static bool OP_VexR (instr_info *, int, int);
81
static bool OP_VexW (instr_info *, int, int);
82
static bool OP_Rounding (instr_info *, int, int);
83
static bool OP_REG_VexI4 (instr_info *, int, int);
84
static bool OP_VexI4 (instr_info *, int, int);
85
static bool OP_0f07 (instr_info *, int, int);
86
static bool OP_Monitor (instr_info *, int, int);
87
static bool OP_Mwait (instr_info *, int, int);
88
89
static bool PCLMUL_Fixup (instr_info *, int, int);
90
static bool VPCMP_Fixup (instr_info *, int, int);
91
static bool VPCOM_Fixup (instr_info *, int, int);
92
static bool NOP_Fixup (instr_info *, int, int);
93
static bool MONTMUL_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
static bool PUSH2_POP2_Fixup (instr_info *, int, int);
110
static bool JMPABS_Fixup (instr_info *, int, int);
111
static bool CFCMOV_Fixup (instr_info *, int, int);
112
113
static void ATTRIBUTE_PRINTF_3 i386_dis_printf (const disassemble_info *,
114
            enum disassembler_style,
115
            const char *, ...);
116
117
/* This character is used to encode style information within the output
118
   buffers.  See oappend_insert_style for more details.  */
119
146M
#define STYLE_MARKER_CHAR '\002'
120
121
/* The maximum operand buffer size.  */
122
#define MAX_OPERAND_BUFFER_SIZE 128
123
124
enum address_mode
125
{
126
  mode_16bit,
127
  mode_32bit,
128
  mode_64bit
129
};
130
131
static const char *prefix_name (enum address_mode, uint8_t, int);
132
133
enum x86_64_isa
134
{
135
  amd64 = 1,
136
  intel64
137
};
138
139
enum evex_type
140
{
141
  evex_default = 0,
142
  evex_from_legacy,
143
  evex_from_vex,
144
};
145
146
struct instr_info
147
{
148
  enum address_mode address_mode;
149
150
  /* Flags for the prefixes for the current instruction.  See below.  */
151
  int prefixes;
152
153
  /* REX prefix the current instruction.  See below.  */
154
  uint8_t rex;
155
  /* Bits of REX we've already used.  */
156
  uint8_t rex_used;
157
158
  /* Record W R4 X4 B4 bits for rex2.  */
159
  unsigned char rex2;
160
  /* Bits of rex2 we've already used.  */
161
  unsigned char rex2_used;
162
  unsigned char rex2_payload;
163
164
  bool need_modrm;
165
  unsigned char condition_code;
166
  unsigned char need_vex;
167
  bool has_sib;
168
169
  /* Flags for ins->prefixes which we somehow handled when printing the
170
     current instruction.  */
171
  int used_prefixes;
172
173
  /* Flags for EVEX bits which we somehow handled when printing the
174
     current instruction.  */
175
  int evex_used;
176
177
  char obuf[MAX_OPERAND_BUFFER_SIZE];
178
  char *obufp;
179
  char *mnemonicendp;
180
  const uint8_t *start_codep;
181
  uint8_t *codep;
182
  const uint8_t *end_codep;
183
  unsigned char nr_prefixes;
184
  signed char last_lock_prefix;
185
  signed char last_repz_prefix;
186
  signed char last_repnz_prefix;
187
  signed char last_data_prefix;
188
  signed char last_addr_prefix;
189
  signed char last_rex_prefix;
190
  signed char last_rex2_prefix;
191
  signed char last_seg_prefix;
192
  signed char fwait_prefix;
193
  /* The active segment register prefix.  */
194
  unsigned char active_seg_prefix;
195
196
7.23M
#define MAX_CODE_LENGTH 15
197
  /* We can up to 14 ins->prefixes since the maximum instruction length is
198
     15bytes.  */
199
  uint8_t all_prefixes[MAX_CODE_LENGTH - 1];
200
  disassemble_info *info;
201
202
  struct
203
  {
204
    int mod;
205
    int reg;
206
    int rm;
207
  }
208
  modrm;
209
210
  struct
211
  {
212
    int scale;
213
    int index;
214
    int base;
215
  }
216
  sib;
217
218
  struct
219
  {
220
    int register_specifier;
221
    int length;
222
    int prefix;
223
    int mask_register_specifier;
224
    int scc;
225
    int ll;
226
    bool w;
227
    bool evex;
228
    bool v;
229
    bool zeroing;
230
    bool b;
231
    bool no_broadcast;
232
    bool nf;
233
  }
234
  vex;
235
236
/* For APX EVEX-promoted prefix, EVEX.ND shares the same bit as vex.b.  */
237
9.70M
#define nd b
238
239
  enum evex_type evex_type;
240
241
  /* Remember if the current op is a jump instruction.  */
242
  bool op_is_jump;
243
244
  bool two_source_ops;
245
246
  /* Record whether EVEX masking is used incorrectly.  */
247
  bool illegal_masking;
248
249
  /* Record whether the modrm byte has been skipped.  */
250
  bool has_skipped_modrm;
251
252
  unsigned char op_ad;
253
  signed char op_index[MAX_OPERANDS];
254
  bool op_riprel[MAX_OPERANDS];
255
  char *op_out[MAX_OPERANDS];
256
  bfd_vma op_address[MAX_OPERANDS];
257
  bfd_vma start_pc;
258
259
  /* On the 386's of 1988, the maximum length of an instruction is 15 bytes.
260
   *   (see topic "Redundant ins->prefixes" in the "Differences from 8086"
261
   *   section of the "Virtual 8086 Mode" chapter.)
262
   * 'pc' should be the address of this instruction, it will
263
   *   be used to print the target address if this is a relative jump or call
264
   * The function returns the length of this instruction in bytes.
265
   */
266
  char intel_syntax;
267
  bool intel_mnemonic;
268
  char open_char;
269
  char close_char;
270
  char separator_char;
271
  char scale_char;
272
273
  enum x86_64_isa isa64;
274
};
275
276
struct dis_private {
277
  bfd_vma insn_start;
278
  int orig_sizeflag;
279
280
  /* Indexes first byte not fetched.  */
281
  unsigned int fetched;
282
  uint8_t the_buffer[2 * MAX_CODE_LENGTH - 1];
283
};
284
285
/* Mark parts used in the REX prefix.  When we are testing for
286
   empty prefix (for 8bit register REX extension), just mask it
287
   out.  Otherwise test for REX bit is excuse for existence of REX
288
   only in case value is nonzero.  */
289
#define USED_REX(value)         \
290
4.70M
  {             \
291
4.70M
    if (value)           \
292
4.70M
      {             \
293
4.46M
  if (ins->rex & value)       \
294
4.46M
    ins->rex_used |= (value) | REX_OPCODE; \
295
4.46M
  if (ins->rex2 & value)       \
296
4.46M
    {           \
297
56.5k
      ins->rex2_used |= (value);      \
298
56.5k
      ins->rex_used |= REX_OPCODE;   \
299
56.5k
    }            \
300
4.46M
      }              \
301
4.70M
    else            \
302
4.70M
      ins->rex_used |= REX_OPCODE;     \
303
4.70M
  }
304
305
306
37.7k
#define EVEX_b_used 1
307
92.4k
#define EVEX_len_used 2
308
309
310
/* {rex2} is not printed when the REX2_SPECIAL is set.  */
311
17.5k
#define REX2_SPECIAL 16
312
313
/* Flags stored in PREFIXES.  */
314
307k
#define PREFIX_REPZ 1
315
432k
#define PREFIX_REPNZ 2
316
3.80M
#define PREFIX_CS 4
317
3.17M
#define PREFIX_SS 8
318
3.75M
#define PREFIX_DS 0x10
319
3.18M
#define PREFIX_ES 0x20
320
3.25M
#define PREFIX_FS 0x40
321
3.25M
#define PREFIX_GS 0x80
322
957k
#define PREFIX_LOCK 0x100
323
8.09M
#define PREFIX_DATA 0x200
324
8.16M
#define PREFIX_ADDR 0x400
325
3.32M
#define PREFIX_FWAIT 0x800
326
6.35M
#define PREFIX_REX2 0x1000
327
24.8k
#define PREFIX_NP_OR_DATA 0x2000
328
16.6k
#define NO_PREFIX   0x4000
329
330
/* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
331
   to ADDR (exclusive) are valid.  Returns true for success, false
332
   on error.  */
333
static bool
334
fetch_code (struct disassemble_info *info, const uint8_t *until)
335
10.9M
{
336
10.9M
  int status = -1;
337
10.9M
  struct dis_private *priv = info->private_data;
338
10.9M
  bfd_vma start = priv->insn_start + priv->fetched;
339
10.9M
  uint8_t *fetch_end = priv->the_buffer + priv->fetched;
340
10.9M
  ptrdiff_t needed = until - fetch_end;
341
342
10.9M
  if (needed <= 0)
343
3.27M
    return true;
344
345
7.66M
  if (priv->fetched + (size_t) needed <= ARRAY_SIZE (priv->the_buffer))
346
7.66M
    status = (*info->read_memory_func) (start, fetch_end, needed, info);
347
7.66M
  if (status != 0)
348
47.0k
    {
349
      /* If we did manage to read at least one byte, then
350
   print_insn_i386 will do something sensible.  Otherwise, print
351
   an error.  We do that here because this is where we know
352
   STATUS.  */
353
47.0k
      if (!priv->fetched)
354
694
  (*info->memory_error_func) (status, start, info);
355
47.0k
      return false;
356
47.0k
    }
357
358
7.61M
  priv->fetched += needed;
359
7.61M
  return true;
360
7.66M
}
361
362
static bool
363
fetch_modrm (instr_info *ins)
364
2.15M
{
365
2.15M
  if (!fetch_code (ins->info, ins->codep + 1))
366
6.38k
    return false;
367
368
2.15M
  ins->modrm.mod = (*ins->codep >> 6) & 3;
369
2.15M
  ins->modrm.reg = (*ins->codep >> 3) & 7;
370
2.15M
  ins->modrm.rm = *ins->codep & 7;
371
372
2.15M
  return true;
373
2.15M
}
374
375
static int
376
fetch_error (const instr_info *ins)
377
47.9k
{
378
  /* Getting here means we tried for data but didn't get it.  That
379
     means we have an incomplete instruction of some sort.  Just
380
     print the first byte as a prefix or a .byte pseudo-op.  */
381
47.9k
  const struct dis_private *priv = ins->info->private_data;
382
47.9k
  const char *name = NULL;
383
384
47.9k
  if (ins->codep <= priv->the_buffer)
385
694
    return -1;
386
387
47.2k
  if (ins->prefixes || ins->fwait_prefix >= 0 || (ins->rex & REX_OPCODE))
388
31.2k
    name = prefix_name (ins->address_mode, priv->the_buffer[0],
389
31.2k
      priv->orig_sizeflag);
390
47.2k
  if (name != NULL)
391
30.9k
    i386_dis_printf (ins->info, dis_style_mnemonic, "%s", name);
392
16.2k
  else
393
16.2k
    {
394
      /* Just print the first byte as a .byte instruction.  */
395
16.2k
      i386_dis_printf (ins->info, dis_style_assembler_directive, ".byte ");
396
16.2k
      i386_dis_printf (ins->info, dis_style_immediate, "%#x",
397
16.2k
           (unsigned int) priv->the_buffer[0]);
398
16.2k
    }
399
400
47.2k
  return 1;
401
47.9k
}
402
403
/* Possible values for prefix requirement.  */
404
6.39M
#define PREFIX_IGNORED_SHIFT  16
405
11.8k
#define PREFIX_IGNORED_REPZ (PREFIX_REPZ << PREFIX_IGNORED_SHIFT)
406
11.8k
#define PREFIX_IGNORED_REPNZ  (PREFIX_REPNZ << PREFIX_IGNORED_SHIFT)
407
11.8k
#define PREFIX_IGNORED_DATA (PREFIX_DATA << PREFIX_IGNORED_SHIFT)
408
#define PREFIX_IGNORED_ADDR (PREFIX_ADDR << PREFIX_IGNORED_SHIFT)
409
#define PREFIX_IGNORED_LOCK (PREFIX_LOCK << PREFIX_IGNORED_SHIFT)
410
6.35M
#define PREFIX_REX2_ILLEGAL (PREFIX_REX2 << PREFIX_IGNORED_SHIFT)
411
412
/* Opcode prefixes.  */
413
39.8k
#define PREFIX_OPCODE   (PREFIX_REPZ \
414
39.8k
         | PREFIX_REPNZ \
415
39.8k
         | PREFIX_DATA)
416
417
/* Prefixes ignored.  */
418
11.8k
#define PREFIX_IGNORED    (PREFIX_IGNORED_REPZ \
419
11.8k
         | PREFIX_IGNORED_REPNZ \
420
11.8k
         | PREFIX_IGNORED_DATA)
421
422
#define XX { NULL, 0 }
423
#define Bad_Opcode NULL, { { NULL, 0 } }, 0
424
425
#define Eb { OP_E, b_mode }
426
#define Ebnd { OP_E, bnd_mode }
427
#define EbS { OP_E, b_swap_mode }
428
#define EbndS { OP_E, bnd_swap_mode }
429
#define Ev { OP_E, v_mode }
430
#define Eva { OP_E, va_mode }
431
#define Ev_bnd { OP_E, v_bnd_mode }
432
#define EvS { OP_E, v_swap_mode }
433
#define Ed { OP_E, d_mode }
434
#define Edq { OP_E, dq_mode }
435
#define Edb { OP_E, db_mode }
436
#define Edw { OP_E, dw_mode }
437
#define Eq { OP_E, q_mode }
438
#define indirEv { OP_indirE, indir_v_mode }
439
#define indirEp { OP_indirE, f_mode }
440
#define stackEv { OP_E, stack_v_mode }
441
#define Em { OP_E, m_mode }
442
#define Ew { OP_E, w_mode }
443
#define M { OP_M, 0 }   /* lea, lgdt, etc. */
444
#define Ma { OP_M, a_mode }
445
#define Mb { OP_M, b_mode }
446
#define Md { OP_M, d_mode }
447
#define Mdq { OP_M, dq_mode }
448
#define Mo { OP_M, o_mode }
449
#define Mp { OP_M, f_mode }   /* 32 or 48 bit memory operand for LDS, LES etc */
450
#define Mq { OP_M, q_mode }
451
#define Mv { OP_M, v_mode }
452
#define Mv_bnd { OP_M, v_bndmk_mode }
453
#define Mw { OP_M, w_mode }
454
#define Mx { OP_M, x_mode }
455
#define Mxmm { OP_M, xmm_mode }
456
#define Mymm { OP_M, ymm_mode }
457
#define Gb { OP_G, b_mode }
458
#define Gbnd { OP_G, bnd_mode }
459
#define Gv { OP_G, v_mode }
460
#define Gd { OP_G, d_mode }
461
#define Gdq { OP_G, dq_mode }
462
#define Gq { OP_G, q_mode }
463
#define Gm { OP_G, m_mode }
464
#define Gva { OP_G, va_mode }
465
#define Gw { OP_G, w_mode }
466
#define Ib { OP_I, b_mode }
467
#define sIb { OP_sI, b_mode } /* sign extened byte */
468
#define sIbT { OP_sI, b_T_mode } /* sign extened byte like 'T' */
469
#define Iv { OP_I, v_mode }
470
#define sIv { OP_sI, v_mode }
471
#define Iv64 { OP_I64, v_mode }
472
#define Id { OP_I, d_mode }
473
#define Iw { OP_I, w_mode }
474
#define I1 { OP_I, const_1_mode }
475
#define Jb { OP_J, b_mode }
476
#define Jv { OP_J, v_mode }
477
#define Jdqw { OP_J, dqw_mode }
478
#define Cm { OP_C, m_mode }
479
#define Dm { OP_D, m_mode }
480
#define Td { OP_T, d_mode }
481
#define Skip_MODRM { OP_Skip_MODRM, 0 }
482
483
#define RMeAX { OP_REG, eAX_reg }
484
#define RMeBX { OP_REG, eBX_reg }
485
#define RMeCX { OP_REG, eCX_reg }
486
#define RMeDX { OP_REG, eDX_reg }
487
#define RMeSP { OP_REG, eSP_reg }
488
#define RMeBP { OP_REG, eBP_reg }
489
#define RMeSI { OP_REG, eSI_reg }
490
#define RMeDI { OP_REG, eDI_reg }
491
#define RMrAX { OP_REG, rAX_reg }
492
#define RMrBX { OP_REG, rBX_reg }
493
#define RMrCX { OP_REG, rCX_reg }
494
#define RMrDX { OP_REG, rDX_reg }
495
#define RMrSP { OP_REG, rSP_reg }
496
#define RMrBP { OP_REG, rBP_reg }
497
#define RMrSI { OP_REG, rSI_reg }
498
#define RMrDI { OP_REG, rDI_reg }
499
#define RMAL { OP_REG, al_reg }
500
#define RMCL { OP_REG, cl_reg }
501
#define RMDL { OP_REG, dl_reg }
502
#define RMBL { OP_REG, bl_reg }
503
#define RMAH { OP_REG, ah_reg }
504
#define RMCH { OP_REG, ch_reg }
505
#define RMDH { OP_REG, dh_reg }
506
#define RMBH { OP_REG, bh_reg }
507
#define RMAX { OP_REG, ax_reg }
508
#define RMDX { OP_REG, dx_reg }
509
510
#define eAX { OP_IMREG, eAX_reg }
511
#define AL { OP_IMREG, al_reg }
512
#define CL { OP_IMREG, cl_reg }
513
#define zAX { OP_IMREG, z_mode_ax_reg }
514
#define indirDX { OP_IMREG, indir_dx_reg }
515
516
#define Sw { OP_SEG, w_mode }
517
#define Sv { OP_SEG, v_mode }
518
#define Ap { OP_DIR, 0 }
519
#define Ob { OP_OFF64, b_mode }
520
#define Ov { OP_OFF64, v_mode }
521
#define Xb { OP_DSreg, eSI_reg }
522
#define Xv { OP_DSreg, eSI_reg }
523
#define Xz { OP_DSreg, eSI_reg }
524
#define Yb { OP_ESreg, eDI_reg }
525
#define Yv { OP_ESreg, eDI_reg }
526
#define DSCX { OP_DSreg, eCX_reg }
527
#define DSBX { OP_DSreg, eBX_reg }
528
529
#define es { OP_REG, es_reg }
530
#define ss { OP_REG, ss_reg }
531
#define cs { OP_REG, cs_reg }
532
#define ds { OP_REG, ds_reg }
533
#define fs { OP_REG, fs_reg }
534
#define gs { OP_REG, gs_reg }
535
536
#define MX { OP_MMX, 0 }
537
#define XM { OP_XMM, 0 }
538
#define XMScalar { OP_XMM, scalar_mode }
539
#define XMGatherD { OP_XMM, vex_vsib_d_w_dq_mode }
540
#define XMGatherQ { OP_XMM, vex_vsib_q_w_dq_mode }
541
#define XMM { OP_XMM, xmm_mode }
542
#define TMM { OP_XMM, tmm_mode }
543
#define XMxmmq { OP_XMM, xmmq_mode }
544
#define EM { OP_EM, v_mode }
545
#define EMS { OP_EM, v_swap_mode }
546
#define EMd { OP_EM, d_mode }
547
#define EMx { OP_EM, x_mode }
548
#define EXbwUnit { OP_EX, bw_unit_mode }
549
#define EXb { OP_EX, b_mode }
550
#define EXw { OP_EX, w_mode }
551
#define EXd { OP_EX, d_mode }
552
#define EXdS { OP_EX, d_swap_mode }
553
#define EXwS { OP_EX, w_swap_mode }
554
#define EXq { OP_EX, q_mode }
555
#define EXqS { OP_EX, q_swap_mode }
556
#define EXdq { OP_EX, dq_mode }
557
#define EXx { OP_EX, x_mode }
558
#define EXxh { OP_EX, xh_mode }
559
#define EXxS { OP_EX, x_swap_mode }
560
#define EXxmm { OP_EX, xmm_mode }
561
#define EXymm { OP_EX, ymm_mode }
562
#define EXxmmq { OP_EX, xmmq_mode }
563
#define EXxmmqh { OP_EX, evex_half_bcst_xmmqh_mode }
564
#define EXEvexHalfBcstXmmq { OP_EX, evex_half_bcst_xmmq_mode }
565
#define EXxmmdw { OP_EX, xmmdw_mode }
566
#define EXxmmqd { OP_EX, xmmqd_mode }
567
#define EXxmmqdh { OP_EX, evex_half_bcst_xmmqdh_mode }
568
#define EXymmq { OP_EX, ymmq_mode }
569
#define EXEvexXGscat { OP_EX, evex_x_gscat_mode }
570
#define EXEvexXNoBcst { OP_EX, evex_x_nobcst_mode }
571
#define Rd { OP_R, d_mode }
572
#define Rdq { OP_R, dq_mode }
573
#define Rq { OP_R, q_mode }
574
#define Nq { OP_R, q_mm_mode }
575
#define Ux { OP_R, x_mode }
576
#define Uxmm { OP_R, xmm_mode }
577
#define Rxmmq { OP_R, xmmq_mode }
578
#define Rymm { OP_R, ymm_mode }
579
#define Rtmm { OP_R, tmm_mode }
580
#define EMCq { OP_EMC, q_mode }
581
#define MXC { OP_MXC, 0 }
582
#define OPSUF { OP_3DNowSuffix, 0 }
583
#define SEP { SEP_Fixup, 0 }
584
#define CMP { CMP_Fixup, 0 }
585
#define XMM0 { XMM_Fixup, 0 }
586
#define FXSAVE { FXSAVE_Fixup, 0 }
587
588
#define Vex { OP_VEX, x_mode }
589
#define VexW { OP_VexW, x_mode }
590
#define VexScalar { OP_VEX, scalar_mode }
591
#define VexScalarR { OP_VexR, scalar_mode }
592
#define VexGatherD { OP_VEX, vex_vsib_d_w_dq_mode }
593
#define VexGatherQ { OP_VEX, vex_vsib_q_w_dq_mode }
594
#define VexGdq { OP_VEX, dq_mode }
595
#define VexGb { OP_VEX, b_mode }
596
#define VexGv { OP_VEX, v_mode }
597
#define VexTmm { OP_VEX, tmm_mode }
598
#define XMVexI4 { OP_REG_VexI4, x_mode }
599
#define XMVexScalarI4 { OP_REG_VexI4, scalar_mode }
600
#define VexI4 { OP_VexI4, 0 }
601
#define PCLMUL { PCLMUL_Fixup, 0 }
602
#define VPCMP { VPCMP_Fixup, 0 }
603
#define VPCOM { VPCOM_Fixup, 0 }
604
605
#define EXxEVexR { OP_Rounding, evex_rounding_mode }
606
#define EXxEVexR64 { OP_Rounding, evex_rounding_64_mode }
607
#define EXxEVexS { OP_Rounding, evex_sae_mode }
608
609
#define MaskG { OP_G, mask_mode }
610
#define MaskE { OP_E, mask_mode }
611
#define MaskR { OP_R, mask_mode }
612
#define MaskBDE { OP_E, mask_bd_mode }
613
#define MaskVex { OP_VEX, mask_mode }
614
615
#define MVexVSIBDWpX { OP_M, vex_vsib_d_w_dq_mode }
616
#define MVexVSIBQWpX { OP_M, vex_vsib_q_w_dq_mode }
617
618
#define MVexSIBMEM { OP_M, vex_sibmem_mode }
619
620
/* Used handle "rep" prefix for string instructions.  */
621
#define Xbr { REP_Fixup, eSI_reg }
622
#define Xvr { REP_Fixup, eSI_reg }
623
#define Ybr { REP_Fixup, eDI_reg }
624
#define Yvr { REP_Fixup, eDI_reg }
625
#define Yzr { REP_Fixup, eDI_reg }
626
#define indirDXr { REP_Fixup, indir_dx_reg }
627
#define ALr { REP_Fixup, al_reg }
628
#define eAXr { REP_Fixup, eAX_reg }
629
630
/* Used handle HLE prefix for lockable instructions.  */
631
#define Ebh1 { HLE_Fixup1, b_mode }
632
#define Evh1 { HLE_Fixup1, v_mode }
633
#define Ebh2 { HLE_Fixup2, b_mode }
634
#define Evh2 { HLE_Fixup2, v_mode }
635
#define Ebh3 { HLE_Fixup3, b_mode }
636
#define Evh3 { HLE_Fixup3, v_mode }
637
638
#define BND { BND_Fixup, 0 }
639
#define NOTRACK { NOTRACK_Fixup, 0 }
640
641
#define cond_jump_flag { NULL, cond_jump_mode }
642
#define loop_jcxz_flag { NULL, loop_jcxz_mode }
643
644
/* bits in sizeflag */
645
2.04M
#define SUFFIX_ALWAYS 4
646
8.38M
#define AFLAG 2
647
4.73M
#define DFLAG 1
648
649
enum
650
{
651
  /* byte operand */
652
  b_mode = 1,
653
  /* byte operand with operand swapped */
654
  b_swap_mode,
655
  /* byte operand, sign extend like 'T' suffix */
656
  b_T_mode,
657
  /* operand size depends on prefixes */
658
  v_mode,
659
  /* operand size depends on prefixes with operand swapped */
660
  v_swap_mode,
661
  /* operand size depends on address prefix */
662
  va_mode,
663
  /* word operand */
664
  w_mode,
665
  /* double word operand  */
666
  d_mode,
667
  /* word operand with operand swapped  */
668
  w_swap_mode,
669
  /* double word operand with operand swapped */
670
  d_swap_mode,
671
  /* quad word operand */
672
  q_mode,
673
  /* 8-byte MM operand */
674
  q_mm_mode,
675
  /* quad word operand with operand swapped */
676
  q_swap_mode,
677
  /* ten-byte operand */
678
  t_mode,
679
  /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand.  In EVEX with
680
     broadcast enabled.  */
681
  x_mode,
682
  /* Similar to x_mode, but with different EVEX mem shifts.  */
683
  evex_x_gscat_mode,
684
  /* Similar to x_mode, but with yet different EVEX mem shifts.  */
685
  bw_unit_mode,
686
  /* Similar to x_mode, but with disabled broadcast.  */
687
  evex_x_nobcst_mode,
688
  /* Similar to x_mode, but with operands swapped and disabled broadcast
689
     in EVEX.  */
690
  x_swap_mode,
691
  /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand.  In EVEX with
692
     broadcast of 16bit enabled.  */
693
  xh_mode,
694
  /* 16-byte XMM operand */
695
  xmm_mode,
696
  /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
697
     memory operand (depending on vector length).  Broadcast isn't
698
     allowed.  */
699
  xmmq_mode,
700
  /* Same as xmmq_mode, but broadcast is allowed.  */
701
  evex_half_bcst_xmmq_mode,
702
  /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
703
     memory operand (depending on vector length).  16bit broadcast.  */
704
  evex_half_bcst_xmmqh_mode,
705
  /* 16-byte XMM, word, double word or quad word operand.  */
706
  xmmdw_mode,
707
  /* 16-byte XMM, double word, quad word operand or xmm word operand.  */
708
  xmmqd_mode,
709
  /* 16-byte XMM, double word, quad word operand or xmm word operand.
710
     16bit broadcast.  */
711
  evex_half_bcst_xmmqdh_mode,
712
  /* 32-byte YMM operand */
713
  ymm_mode,
714
  /* quad word, ymmword or zmmword memory operand.  */
715
  ymmq_mode,
716
  /* TMM operand */
717
  tmm_mode,
718
  /* d_mode in 32bit, q_mode in 64bit mode.  */
719
  m_mode,
720
  /* pair of v_mode operands */
721
  a_mode,
722
  cond_jump_mode,
723
  loop_jcxz_mode,
724
  movsxd_mode,
725
  v_bnd_mode,
726
  /* like v_bnd_mode in 32bit, no RIP-rel in 64bit mode.  */
727
  v_bndmk_mode,
728
  /* operand size depends on REX.W / VEX.W.  */
729
  dq_mode,
730
  /* Displacements like v_mode without considering Intel64 ISA.  */
731
  dqw_mode,
732
  /* bounds operand */
733
  bnd_mode,
734
  /* bounds operand with operand swapped */
735
  bnd_swap_mode,
736
  /* 4- or 6-byte pointer operand */
737
  f_mode,
738
  const_1_mode,
739
  /* v_mode for indirect branch opcodes.  */
740
  indir_v_mode,
741
  /* v_mode for stack-related opcodes.  */
742
  stack_v_mode,
743
  /* non-quad operand size depends on prefixes */
744
  z_mode,
745
  /* 16-byte operand */
746
  o_mode,
747
  /* registers like d_mode, memory like b_mode.  */
748
  db_mode,
749
  /* registers like d_mode, memory like w_mode.  */
750
  dw_mode,
751
752
  /* Operand size depends on the VEX.W bit, with VSIB dword indices.  */
753
  vex_vsib_d_w_dq_mode,
754
  /* Operand size depends on the VEX.W bit, with VSIB qword indices.  */
755
  vex_vsib_q_w_dq_mode,
756
  /* mandatory non-vector SIB.  */
757
  vex_sibmem_mode,
758
759
  /* scalar, ignore vector length.  */
760
  scalar_mode,
761
762
  /* Static rounding.  */
763
  evex_rounding_mode,
764
  /* Static rounding, 64-bit mode only.  */
765
  evex_rounding_64_mode,
766
  /* Supress all exceptions.  */
767
  evex_sae_mode,
768
769
  /* Mask register operand.  */
770
  mask_mode,
771
  /* Mask register operand.  */
772
  mask_bd_mode,
773
774
  es_reg,
775
  cs_reg,
776
  ss_reg,
777
  ds_reg,
778
  fs_reg,
779
  gs_reg,
780
781
  eAX_reg,
782
  eCX_reg,
783
  eDX_reg,
784
  eBX_reg,
785
  eSP_reg,
786
  eBP_reg,
787
  eSI_reg,
788
  eDI_reg,
789
790
  al_reg,
791
  cl_reg,
792
  dl_reg,
793
  bl_reg,
794
  ah_reg,
795
  ch_reg,
796
  dh_reg,
797
  bh_reg,
798
799
  ax_reg,
800
  cx_reg,
801
  dx_reg,
802
  bx_reg,
803
  sp_reg,
804
  bp_reg,
805
  si_reg,
806
  di_reg,
807
808
  rAX_reg,
809
  rCX_reg,
810
  rDX_reg,
811
  rBX_reg,
812
  rSP_reg,
813
  rBP_reg,
814
  rSI_reg,
815
  rDI_reg,
816
817
  z_mode_ax_reg,
818
  indir_dx_reg
819
};
820
821
enum
822
{
823
  FLOATCODE = 1,
824
  USE_REG_TABLE,
825
  USE_MOD_TABLE,
826
  USE_RM_TABLE,
827
  USE_PREFIX_TABLE,
828
  USE_X86_64_TABLE,
829
  USE_X86_64_EVEX_FROM_VEX_TABLE,
830
  USE_X86_64_EVEX_PFX_TABLE,
831
  USE_X86_64_EVEX_W_TABLE,
832
  USE_X86_64_EVEX_MEM_W_TABLE,
833
  USE_3BYTE_TABLE,
834
  USE_XOP_8F_TABLE,
835
  USE_VEX_C4_TABLE,
836
  USE_VEX_C5_TABLE,
837
  USE_VEX_LEN_TABLE,
838
  USE_VEX_W_TABLE,
839
  USE_EVEX_TABLE,
840
  USE_EVEX_LEN_TABLE
841
};
842
843
#define FLOAT     NULL, { { NULL, FLOATCODE } }, 0
844
845
#define DIS386(T, I)    NULL, { { NULL, (T)}, { NULL,  (I) } }, 0
846
#define REG_TABLE(I)    DIS386 (USE_REG_TABLE, (I))
847
#define MOD_TABLE(I)    DIS386 (USE_MOD_TABLE, (I))
848
#define RM_TABLE(I)   DIS386 (USE_RM_TABLE, (I))
849
#define PREFIX_TABLE(I)   DIS386 (USE_PREFIX_TABLE, (I))
850
#define X86_64_TABLE(I)   DIS386 (USE_X86_64_TABLE, (I))
851
#define X86_64_EVEX_FROM_VEX_TABLE(I) \
852
  DIS386 (USE_X86_64_EVEX_FROM_VEX_TABLE, (I))
853
#define X86_64_EVEX_PFX_TABLE(I) DIS386 (USE_X86_64_EVEX_PFX_TABLE, (I))
854
#define X86_64_EVEX_W_TABLE(I) DIS386 (USE_X86_64_EVEX_W_TABLE, (I))
855
#define X86_64_EVEX_MEM_W_TABLE(I) DIS386 (USE_X86_64_EVEX_MEM_W_TABLE, (I))
856
#define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
857
#define XOP_8F_TABLE()    DIS386 (USE_XOP_8F_TABLE, 0)
858
#define VEX_C4_TABLE()    DIS386 (USE_VEX_C4_TABLE, 0)
859
#define VEX_C5_TABLE()    DIS386 (USE_VEX_C5_TABLE, 0)
860
#define VEX_LEN_TABLE(I)  DIS386 (USE_VEX_LEN_TABLE, (I))
861
#define VEX_W_TABLE(I)    DIS386 (USE_VEX_W_TABLE, (I))
862
#define EVEX_TABLE()    DIS386 (USE_EVEX_TABLE, 0)
863
#define EVEX_LEN_TABLE(I) DIS386 (USE_EVEX_LEN_TABLE, (I))
864
865
enum
866
{
867
  REG_80 = 0,
868
  REG_81,
869
  REG_83,
870
  REG_8F,
871
  REG_C0,
872
  REG_C1,
873
  REG_C6,
874
  REG_C7,
875
  REG_D0,
876
  REG_D1,
877
  REG_D2,
878
  REG_D3,
879
  REG_F6,
880
  REG_F7,
881
  REG_FE,
882
  REG_FF,
883
  REG_0F00,
884
  REG_0F01,
885
  REG_0F0D,
886
  REG_0F18,
887
  REG_0F1C_P_0_MOD_0,
888
  REG_0F1E_P_1_MOD_3,
889
  REG_0F38D8_PREFIX_1,
890
  REG_0F3A0F_P_1,
891
  REG_0F71,
892
  REG_0F72,
893
  REG_0F73,
894
  REG_0FA6,
895
  REG_0FA7,
896
  REG_0FAE,
897
  REG_0FBA,
898
  REG_0FC7,
899
  REG_VEX_0F71,
900
  REG_VEX_0F72,
901
  REG_VEX_0F73,
902
  REG_VEX_0FAE,
903
  REG_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0,
904
  REG_VEX_0F38F3_L_0_P_0,
905
  REG_VEX_MAP7_F6_L_0_W_0,
906
  REG_VEX_MAP7_F8_L_0_W_0,
907
908
  REG_XOP_09_01_L_0,
909
  REG_XOP_09_02_L_0,
910
  REG_XOP_09_12_L_0,
911
  REG_XOP_0A_12_L_0,
912
913
  REG_EVEX_0F71,
914
  REG_EVEX_0F72,
915
  REG_EVEX_0F73,
916
  REG_EVEX_0F38C6_L_2,
917
  REG_EVEX_0F38C7_L_2,
918
  REG_EVEX_MAP4_80,
919
  REG_EVEX_MAP4_81,
920
  REG_EVEX_MAP4_83,
921
  REG_EVEX_MAP4_8F,
922
  REG_EVEX_MAP4_F6,
923
  REG_EVEX_MAP4_F7,
924
  REG_EVEX_MAP4_FE,
925
  REG_EVEX_MAP4_FF,
926
};
927
928
enum
929
{
930
  MOD_62_32BIT = 0,
931
  MOD_C4_32BIT,
932
  MOD_C5_32BIT,
933
  MOD_0F01_REG_0,
934
  MOD_0F01_REG_1,
935
  MOD_0F01_REG_2,
936
  MOD_0F01_REG_3,
937
  MOD_0F01_REG_5,
938
  MOD_0F01_REG_7,
939
  MOD_0F12_PREFIX_0,
940
  MOD_0F16_PREFIX_0,
941
  MOD_0F18_REG_0,
942
  MOD_0F18_REG_1,
943
  MOD_0F18_REG_2,
944
  MOD_0F18_REG_3,
945
  MOD_0F18_REG_4,
946
  MOD_0F18_REG_6,
947
  MOD_0F18_REG_7,
948
  MOD_0F1A_PREFIX_0,
949
  MOD_0F1B_PREFIX_0,
950
  MOD_0F1B_PREFIX_1,
951
  MOD_0F1C_PREFIX_0,
952
  MOD_0F1E_PREFIX_1,
953
  MOD_0FAE_REG_0,
954
  MOD_0FAE_REG_1,
955
  MOD_0FAE_REG_2,
956
  MOD_0FAE_REG_3,
957
  MOD_0FAE_REG_4,
958
  MOD_0FAE_REG_5,
959
  MOD_0FAE_REG_6,
960
  MOD_0FAE_REG_7,
961
  MOD_0FC7_REG_6,
962
  MOD_0FC7_REG_7,
963
  MOD_0F38DC_PREFIX_1,
964
  MOD_0F38F8,
965
966
  MOD_VEX_0F3849_X86_64_L_0_W_0,
967
968
  MOD_EVEX_MAP4_60,
969
  MOD_EVEX_MAP4_61,
970
  MOD_EVEX_MAP4_F8_P_1,
971
  MOD_EVEX_MAP4_F8_P_3,
972
};
973
974
enum
975
{
976
  RM_C6_REG_7 = 0,
977
  RM_C7_REG_7,
978
  RM_0F01_REG_0,
979
  RM_0F01_REG_1,
980
  RM_0F01_REG_2,
981
  RM_0F01_REG_3,
982
  RM_0F01_REG_5_MOD_3,
983
  RM_0F01_REG_7_MOD_3,
984
  RM_0F1E_P_1_MOD_3_REG_7,
985
  RM_0FAE_REG_6_MOD_3_P_0,
986
  RM_0FAE_REG_7_MOD_3,
987
  RM_0F3A0F_P_1_R_0,
988
989
  RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0_R_0,
990
  RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_3,
991
};
992
993
enum
994
{
995
  PREFIX_90 = 0,
996
  PREFIX_0F00_REG_6_X86_64,
997
  PREFIX_0F01_REG_0_MOD_3_RM_6,
998
  PREFIX_0F01_REG_0_MOD_3_RM_7,
999
  PREFIX_0F01_REG_1_RM_2,
1000
  PREFIX_0F01_REG_1_RM_4,
1001
  PREFIX_0F01_REG_1_RM_5,
1002
  PREFIX_0F01_REG_1_RM_6,
1003
  PREFIX_0F01_REG_1_RM_7,
1004
  PREFIX_0F01_REG_3_RM_1,
1005
  PREFIX_0F01_REG_5_MOD_0,
1006
  PREFIX_0F01_REG_5_MOD_3_RM_0,
1007
  PREFIX_0F01_REG_5_MOD_3_RM_1,
1008
  PREFIX_0F01_REG_5_MOD_3_RM_2,
1009
  PREFIX_0F01_REG_5_MOD_3_RM_4,
1010
  PREFIX_0F01_REG_5_MOD_3_RM_5,
1011
  PREFIX_0F01_REG_5_MOD_3_RM_6,
1012
  PREFIX_0F01_REG_5_MOD_3_RM_7,
1013
  PREFIX_0F01_REG_7_MOD_3_RM_2,
1014
  PREFIX_0F01_REG_7_MOD_3_RM_5,
1015
  PREFIX_0F01_REG_7_MOD_3_RM_6,
1016
  PREFIX_0F01_REG_7_MOD_3_RM_7,
1017
  PREFIX_0F09,
1018
  PREFIX_0F10,
1019
  PREFIX_0F11,
1020
  PREFIX_0F12,
1021
  PREFIX_0F16,
1022
  PREFIX_0F18_REG_6_MOD_0_X86_64,
1023
  PREFIX_0F18_REG_7_MOD_0_X86_64,
1024
  PREFIX_0F1A,
1025
  PREFIX_0F1B,
1026
  PREFIX_0F1C,
1027
  PREFIX_0F1E,
1028
  PREFIX_0F2A,
1029
  PREFIX_0F2B,
1030
  PREFIX_0F2C,
1031
  PREFIX_0F2D,
1032
  PREFIX_0F2E,
1033
  PREFIX_0F2F,
1034
  PREFIX_0F51,
1035
  PREFIX_0F52,
1036
  PREFIX_0F53,
1037
  PREFIX_0F58,
1038
  PREFIX_0F59,
1039
  PREFIX_0F5A,
1040
  PREFIX_0F5B,
1041
  PREFIX_0F5C,
1042
  PREFIX_0F5D,
1043
  PREFIX_0F5E,
1044
  PREFIX_0F5F,
1045
  PREFIX_0F60,
1046
  PREFIX_0F61,
1047
  PREFIX_0F62,
1048
  PREFIX_0F6F,
1049
  PREFIX_0F70,
1050
  PREFIX_0F78,
1051
  PREFIX_0F79,
1052
  PREFIX_0F7C,
1053
  PREFIX_0F7D,
1054
  PREFIX_0F7E,
1055
  PREFIX_0F7F,
1056
  PREFIX_0FA6_REG_0,
1057
  PREFIX_0FA6_REG_5,
1058
  PREFIX_0FA7_REG_6,
1059
  PREFIX_0FAE_REG_0_MOD_3,
1060
  PREFIX_0FAE_REG_1_MOD_3,
1061
  PREFIX_0FAE_REG_2_MOD_3,
1062
  PREFIX_0FAE_REG_3_MOD_3,
1063
  PREFIX_0FAE_REG_4_MOD_0,
1064
  PREFIX_0FAE_REG_4_MOD_3,
1065
  PREFIX_0FAE_REG_5_MOD_3,
1066
  PREFIX_0FAE_REG_6_MOD_0,
1067
  PREFIX_0FAE_REG_6_MOD_3,
1068
  PREFIX_0FAE_REG_7_MOD_0,
1069
  PREFIX_0FB8,
1070
  PREFIX_0FBC,
1071
  PREFIX_0FBD,
1072
  PREFIX_0FC2,
1073
  PREFIX_0FC7_REG_6_MOD_0,
1074
  PREFIX_0FC7_REG_6_MOD_3,
1075
  PREFIX_0FC7_REG_7_MOD_3,
1076
  PREFIX_0FD0,
1077
  PREFIX_0FD6,
1078
  PREFIX_0FE6,
1079
  PREFIX_0FE7,
1080
  PREFIX_0FF0,
1081
  PREFIX_0FF7,
1082
  PREFIX_0F38D8,
1083
  PREFIX_0F38DC,
1084
  PREFIX_0F38DD,
1085
  PREFIX_0F38DE,
1086
  PREFIX_0F38DF,
1087
  PREFIX_0F38F0,
1088
  PREFIX_0F38F1,
1089
  PREFIX_0F38F6,
1090
  PREFIX_0F38F8_M_0,
1091
  PREFIX_0F38F8_M_1_X86_64,
1092
  PREFIX_0F38FA,
1093
  PREFIX_0F38FB,
1094
  PREFIX_0F38FC,
1095
  PREFIX_0F3A0F,
1096
  PREFIX_VEX_0F12,
1097
  PREFIX_VEX_0F16,
1098
  PREFIX_VEX_0F2A,
1099
  PREFIX_VEX_0F2C,
1100
  PREFIX_VEX_0F2D,
1101
  PREFIX_VEX_0F41_L_1_W_0,
1102
  PREFIX_VEX_0F41_L_1_W_1,
1103
  PREFIX_VEX_0F42_L_1_W_0,
1104
  PREFIX_VEX_0F42_L_1_W_1,
1105
  PREFIX_VEX_0F44_L_0_W_0,
1106
  PREFIX_VEX_0F44_L_0_W_1,
1107
  PREFIX_VEX_0F45_L_1_W_0,
1108
  PREFIX_VEX_0F45_L_1_W_1,
1109
  PREFIX_VEX_0F46_L_1_W_0,
1110
  PREFIX_VEX_0F46_L_1_W_1,
1111
  PREFIX_VEX_0F47_L_1_W_0,
1112
  PREFIX_VEX_0F47_L_1_W_1,
1113
  PREFIX_VEX_0F4A_L_1_W_0,
1114
  PREFIX_VEX_0F4A_L_1_W_1,
1115
  PREFIX_VEX_0F4B_L_1_W_0,
1116
  PREFIX_VEX_0F4B_L_1_W_1,
1117
  PREFIX_VEX_0F6F,
1118
  PREFIX_VEX_0F70,
1119
  PREFIX_VEX_0F7E,
1120
  PREFIX_VEX_0F7F,
1121
  PREFIX_VEX_0F90_L_0_W_0,
1122
  PREFIX_VEX_0F90_L_0_W_1,
1123
  PREFIX_VEX_0F91_L_0_W_0,
1124
  PREFIX_VEX_0F91_L_0_W_1,
1125
  PREFIX_VEX_0F92_L_0_W_0,
1126
  PREFIX_VEX_0F92_L_0_W_1,
1127
  PREFIX_VEX_0F93_L_0_W_0,
1128
  PREFIX_VEX_0F93_L_0_W_1,
1129
  PREFIX_VEX_0F98_L_0_W_0,
1130
  PREFIX_VEX_0F98_L_0_W_1,
1131
  PREFIX_VEX_0F99_L_0_W_0,
1132
  PREFIX_VEX_0F99_L_0_W_1,
1133
  PREFIX_VEX_0F3848_X86_64_L_0_W_0,
1134
  PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_0,
1135
  PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_1,
1136
  PREFIX_VEX_0F384A_X86_64_W_0_L_0,
1137
  PREFIX_VEX_0F384B_X86_64_L_0_W_0,
1138
  PREFIX_VEX_0F3850_W_0,
1139
  PREFIX_VEX_0F3851_W_0,
1140
  PREFIX_VEX_0F385C_X86_64_L_0_W_0,
1141
  PREFIX_VEX_0F385E_X86_64_L_0_W_0,
1142
  PREFIX_VEX_0F385F_X86_64_L_0_W_0,
1143
  PREFIX_VEX_0F386B_X86_64_L_0_W_0,
1144
  PREFIX_VEX_0F386C_X86_64_L_0_W_0,
1145
  PREFIX_VEX_0F386E_X86_64_L_0_W_0,
1146
  PREFIX_VEX_0F386F_X86_64_L_0_W_0,
1147
  PREFIX_VEX_0F3872,
1148
  PREFIX_VEX_0F38B0_W_0,
1149
  PREFIX_VEX_0F38B1_W_0,
1150
  PREFIX_VEX_0F38D2_W_0,
1151
  PREFIX_VEX_0F38D3_W_0,
1152
  PREFIX_VEX_0F38CB,
1153
  PREFIX_VEX_0F38CC,
1154
  PREFIX_VEX_0F38CD,
1155
  PREFIX_VEX_0F38DA_W_0,
1156
  PREFIX_VEX_0F38F2_L_0,
1157
  PREFIX_VEX_0F38F3_L_0,
1158
  PREFIX_VEX_0F38F5_L_0,
1159
  PREFIX_VEX_0F38F6_L_0,
1160
  PREFIX_VEX_0F38F7_L_0,
1161
  PREFIX_VEX_0F3AF0_L_0,
1162
  PREFIX_VEX_MAP5_F8_X86_64_L_0_W_0,
1163
  PREFIX_VEX_MAP5_F9_X86_64_L_0_W_0,
1164
  PREFIX_VEX_MAP5_FD_X86_64_L_0_W_0,
1165
  PREFIX_VEX_MAP7_F6_L_0_W_0_R_0_X86_64,
1166
  PREFIX_VEX_MAP7_F8_L_0_W_0_R_0_X86_64,
1167
1168
  PREFIX_EVEX_0F2E,
1169
  PREFIX_EVEX_0F2F,
1170
  PREFIX_EVEX_0F5B,
1171
  PREFIX_EVEX_0F6F,
1172
  PREFIX_EVEX_0F70,
1173
  PREFIX_EVEX_0F78,
1174
  PREFIX_EVEX_0F79,
1175
  PREFIX_EVEX_0F7A,
1176
  PREFIX_EVEX_0F7B,
1177
  PREFIX_EVEX_0F7E,
1178
  PREFIX_EVEX_0F7F,
1179
  PREFIX_EVEX_0FC2,
1180
  PREFIX_EVEX_0FE6,
1181
  PREFIX_EVEX_0F3810,
1182
  PREFIX_EVEX_0F3811,
1183
  PREFIX_EVEX_0F3812,
1184
  PREFIX_EVEX_0F3813,
1185
  PREFIX_EVEX_0F3814,
1186
  PREFIX_EVEX_0F3815,
1187
  PREFIX_EVEX_0F3820,
1188
  PREFIX_EVEX_0F3821,
1189
  PREFIX_EVEX_0F3822,
1190
  PREFIX_EVEX_0F3823,
1191
  PREFIX_EVEX_0F3824,
1192
  PREFIX_EVEX_0F3825,
1193
  PREFIX_EVEX_0F3826,
1194
  PREFIX_EVEX_0F3827,
1195
  PREFIX_EVEX_0F3828,
1196
  PREFIX_EVEX_0F3829,
1197
  PREFIX_EVEX_0F382A,
1198
  PREFIX_EVEX_0F3830,
1199
  PREFIX_EVEX_0F3831,
1200
  PREFIX_EVEX_0F3832,
1201
  PREFIX_EVEX_0F3833,
1202
  PREFIX_EVEX_0F3834,
1203
  PREFIX_EVEX_0F3835,
1204
  PREFIX_EVEX_0F3838,
1205
  PREFIX_EVEX_0F3839,
1206
  PREFIX_EVEX_0F383A,
1207
  PREFIX_EVEX_0F384A_X86_64_W_0_L_2,
1208
  PREFIX_EVEX_0F3852,
1209
  PREFIX_EVEX_0F3853,
1210
  PREFIX_EVEX_0F3868,
1211
  PREFIX_EVEX_0F386D_X86_64_W_0_L_2,
1212
  PREFIX_EVEX_0F3872,
1213
  PREFIX_EVEX_0F3874,
1214
  PREFIX_EVEX_0F389A,
1215
  PREFIX_EVEX_0F389B,
1216
  PREFIX_EVEX_0F38AA,
1217
  PREFIX_EVEX_0F38AB,
1218
1219
  PREFIX_EVEX_0F3A07_X86_64_W_0_L_2,
1220
  PREFIX_EVEX_0F3A08,
1221
  PREFIX_EVEX_0F3A0A,
1222
  PREFIX_EVEX_0F3A26,
1223
  PREFIX_EVEX_0F3A27,
1224
  PREFIX_EVEX_0F3A42_W_0,
1225
  PREFIX_EVEX_0F3A52,
1226
  PREFIX_EVEX_0F3A53,
1227
  PREFIX_EVEX_0F3A56,
1228
  PREFIX_EVEX_0F3A57,
1229
  PREFIX_EVEX_0F3A66,
1230
  PREFIX_EVEX_0F3A67,
1231
  PREFIX_EVEX_0F3A77_X86_64_W_0_L_2,
1232
  PREFIX_EVEX_0F3AC2,
1233
1234
  PREFIX_EVEX_MAP4_4x,
1235
  PREFIX_EVEX_MAP4_F0,
1236
  PREFIX_EVEX_MAP4_F1,
1237
  PREFIX_EVEX_MAP4_F2,
1238
  PREFIX_EVEX_MAP4_F8,
1239
1240
  PREFIX_EVEX_MAP5_10,
1241
  PREFIX_EVEX_MAP5_11,
1242
  PREFIX_EVEX_MAP5_18,
1243
  PREFIX_EVEX_MAP5_1B,
1244
  PREFIX_EVEX_MAP5_1D,
1245
  PREFIX_EVEX_MAP5_1E,
1246
  PREFIX_EVEX_MAP5_2A,
1247
  PREFIX_EVEX_MAP5_2C,
1248
  PREFIX_EVEX_MAP5_2D,
1249
  PREFIX_EVEX_MAP5_2E,
1250
  PREFIX_EVEX_MAP5_2F,
1251
  PREFIX_EVEX_MAP5_51,
1252
  PREFIX_EVEX_MAP5_58,
1253
  PREFIX_EVEX_MAP5_59,
1254
  PREFIX_EVEX_MAP5_5A,
1255
  PREFIX_EVEX_MAP5_5B,
1256
  PREFIX_EVEX_MAP5_5C,
1257
  PREFIX_EVEX_MAP5_5D,
1258
  PREFIX_EVEX_MAP5_5E,
1259
  PREFIX_EVEX_MAP5_5F,
1260
  PREFIX_EVEX_MAP5_68,
1261
  PREFIX_EVEX_MAP5_69,
1262
  PREFIX_EVEX_MAP5_6A,
1263
  PREFIX_EVEX_MAP5_6B,
1264
  PREFIX_EVEX_MAP5_6C,
1265
  PREFIX_EVEX_MAP5_6D,
1266
  PREFIX_EVEX_MAP5_6E_L_0,
1267
  PREFIX_EVEX_MAP5_6F_X86_64,
1268
  PREFIX_EVEX_MAP5_74,
1269
  PREFIX_EVEX_MAP5_78,
1270
  PREFIX_EVEX_MAP5_79,
1271
  PREFIX_EVEX_MAP5_7A,
1272
  PREFIX_EVEX_MAP5_7B,
1273
  PREFIX_EVEX_MAP5_7C,
1274
  PREFIX_EVEX_MAP5_7D,
1275
  PREFIX_EVEX_MAP5_7E_L_0,
1276
1277
  PREFIX_EVEX_MAP6_13,
1278
  PREFIX_EVEX_MAP6_2C,
1279
  PREFIX_EVEX_MAP6_42,
1280
  PREFIX_EVEX_MAP6_4C,
1281
  PREFIX_EVEX_MAP6_4E,
1282
  PREFIX_EVEX_MAP6_56,
1283
  PREFIX_EVEX_MAP6_57,
1284
  PREFIX_EVEX_MAP6_98,
1285
  PREFIX_EVEX_MAP6_9A,
1286
  PREFIX_EVEX_MAP6_9C,
1287
  PREFIX_EVEX_MAP6_9E,
1288
  PREFIX_EVEX_MAP6_A8,
1289
  PREFIX_EVEX_MAP6_AA,
1290
  PREFIX_EVEX_MAP6_AC,
1291
  PREFIX_EVEX_MAP6_AE,
1292
  PREFIX_EVEX_MAP6_B8,
1293
  PREFIX_EVEX_MAP6_BA,
1294
  PREFIX_EVEX_MAP6_BC,
1295
  PREFIX_EVEX_MAP6_BE,
1296
  PREFIX_EVEX_MAP6_D6,
1297
  PREFIX_EVEX_MAP6_D7,
1298
};
1299
1300
enum
1301
{
1302
  X86_64_06 = 0,
1303
  X86_64_07,
1304
  X86_64_0E,
1305
  X86_64_16,
1306
  X86_64_17,
1307
  X86_64_1E,
1308
  X86_64_1F,
1309
  X86_64_27,
1310
  X86_64_2F,
1311
  X86_64_37,
1312
  X86_64_3F,
1313
  X86_64_60,
1314
  X86_64_61,
1315
  X86_64_62,
1316
  X86_64_63,
1317
  X86_64_6D,
1318
  X86_64_6F,
1319
  X86_64_82,
1320
  X86_64_9A,
1321
  X86_64_C2,
1322
  X86_64_C3,
1323
  X86_64_C4,
1324
  X86_64_C5,
1325
  X86_64_CE,
1326
  X86_64_D4,
1327
  X86_64_D5,
1328
  X86_64_D6,
1329
  X86_64_E8,
1330
  X86_64_E9,
1331
  X86_64_EA,
1332
  X86_64_0F00_REG_6,
1333
  X86_64_0F01_REG_0,
1334
  X86_64_0F01_REG_0_MOD_3_RM_6_P_1,
1335
  X86_64_0F01_REG_0_MOD_3_RM_6_P_3,
1336
  X86_64_0F01_REG_0_MOD_3_RM_7_P_0,
1337
  X86_64_0F01_REG_1,
1338
  X86_64_0F01_REG_1_RM_2_PREFIX_1,
1339
  X86_64_0F01_REG_1_RM_2_PREFIX_3,
1340
  X86_64_0F01_REG_1_RM_5_PREFIX_2,
1341
  X86_64_0F01_REG_1_RM_6_PREFIX_2,
1342
  X86_64_0F01_REG_1_RM_7_PREFIX_2,
1343
  X86_64_0F01_REG_2,
1344
  X86_64_0F01_REG_3,
1345
  X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1,
1346
  X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1,
1347
  X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1,
1348
  X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1,
1349
  X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_1,
1350
  X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_3,
1351
  X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1,
1352
  X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3,
1353
  X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1,
1354
  X86_64_0F18_REG_6_MOD_0,
1355
  X86_64_0F18_REG_7_MOD_0,
1356
  X86_64_0F24,
1357
  X86_64_0F26,
1358
  X86_64_0F388A,
1359
  X86_64_0F388B,
1360
  X86_64_0F38F8_M_1,
1361
  X86_64_0FAE_REG_0_MOD_3_PREFIX_1,
1362
  X86_64_0FAE_REG_1_MOD_3_PREFIX_1,
1363
  X86_64_0FAE_REG_2_MOD_3_PREFIX_1,
1364
  X86_64_0FAE_REG_3_MOD_3_PREFIX_1,
1365
  X86_64_0FC7_REG_6_MOD_3_PREFIX_1,
1366
1367
  X86_64_VEX_0F3848,
1368
  X86_64_VEX_0F3849,
1369
  X86_64_VEX_0F384A,
1370
  X86_64_VEX_0F384B,
1371
  X86_64_VEX_0F385C,
1372
  X86_64_VEX_0F385E,
1373
  X86_64_VEX_0F385F,
1374
  X86_64_VEX_0F386B,
1375
  X86_64_VEX_0F386C,
1376
  X86_64_VEX_0F386E,
1377
  X86_64_VEX_0F386F,
1378
  X86_64_VEX_0F38Ex,
1379
1380
  X86_64_VEX_MAP5_F8,
1381
  X86_64_VEX_MAP5_F9,
1382
  X86_64_VEX_MAP5_FD,
1383
  X86_64_VEX_MAP7_F6_L_0_W_0_R_0,
1384
  X86_64_VEX_MAP7_F8_L_0_W_0_R_0,
1385
1386
  X86_64_EVEX_0F384A,
1387
  X86_64_EVEX_0F386D,
1388
  X86_64_EVEX_0F3A07,
1389
  X86_64_EVEX_0F3A77,
1390
1391
  X86_64_EVEX_MAP5_6F,
1392
};
1393
1394
enum
1395
{
1396
  THREE_BYTE_0F38 = 0,
1397
  THREE_BYTE_0F3A
1398
};
1399
1400
enum
1401
{
1402
  XOP_08 = 0,
1403
  XOP_09,
1404
  XOP_0A
1405
};
1406
1407
enum
1408
{
1409
  VEX_0F = 0,
1410
  VEX_0F38,
1411
  VEX_0F3A,
1412
  VEX_MAP5,
1413
  VEX_MAP7,
1414
};
1415
1416
enum
1417
{
1418
  EVEX_0F = 0,
1419
  EVEX_0F38,
1420
  EVEX_0F3A,
1421
  EVEX_MAP4,
1422
  EVEX_MAP5,
1423
  EVEX_MAP6,
1424
  EVEX_MAP7,
1425
};
1426
1427
enum
1428
{
1429
  VEX_LEN_0F12_P_0 = 0,
1430
  VEX_LEN_0F12_P_2,
1431
  VEX_LEN_0F13,
1432
  VEX_LEN_0F16_P_0,
1433
  VEX_LEN_0F16_P_2,
1434
  VEX_LEN_0F17,
1435
  VEX_LEN_0F41,
1436
  VEX_LEN_0F42,
1437
  VEX_LEN_0F44,
1438
  VEX_LEN_0F45,
1439
  VEX_LEN_0F46,
1440
  VEX_LEN_0F47,
1441
  VEX_LEN_0F4A,
1442
  VEX_LEN_0F4B,
1443
  VEX_LEN_0F6E,
1444
  VEX_LEN_0F77,
1445
  VEX_LEN_0F7E_P_1,
1446
  VEX_LEN_0F7E_P_2,
1447
  VEX_LEN_0F90,
1448
  VEX_LEN_0F91,
1449
  VEX_LEN_0F92,
1450
  VEX_LEN_0F93,
1451
  VEX_LEN_0F98,
1452
  VEX_LEN_0F99,
1453
  VEX_LEN_0FAE_R_2,
1454
  VEX_LEN_0FAE_R_3,
1455
  VEX_LEN_0FC4,
1456
  VEX_LEN_0FD6,
1457
  VEX_LEN_0F3816,
1458
  VEX_LEN_0F3819,
1459
  VEX_LEN_0F381A,
1460
  VEX_LEN_0F3836,
1461
  VEX_LEN_0F3841,
1462
  VEX_LEN_0F3848_X86_64,
1463
  VEX_LEN_0F3849_X86_64,
1464
  VEX_LEN_0F384A_X86_64_W_0,
1465
  VEX_LEN_0F384B_X86_64,
1466
  VEX_LEN_0F385A,
1467
  VEX_LEN_0F385C_X86_64,
1468
  VEX_LEN_0F385E_X86_64,
1469
  VEX_LEN_0F385F_X86_64,
1470
  VEX_LEN_0F386B_X86_64,
1471
  VEX_LEN_0F386C_X86_64,
1472
  VEX_LEN_0F386E_X86_64,
1473
  VEX_LEN_0F386F_X86_64,
1474
  VEX_LEN_0F38CB_P_3_W_0,
1475
  VEX_LEN_0F38CC_P_3_W_0,
1476
  VEX_LEN_0F38CD_P_3_W_0,
1477
  VEX_LEN_0F38DA_W_0_P_0,
1478
  VEX_LEN_0F38DA_W_0_P_2,
1479
  VEX_LEN_0F38DB,
1480
  VEX_LEN_0F38F2,
1481
  VEX_LEN_0F38F3,
1482
  VEX_LEN_0F38F5,
1483
  VEX_LEN_0F38F6,
1484
  VEX_LEN_0F38F7,
1485
  VEX_LEN_0F3A00,
1486
  VEX_LEN_0F3A01,
1487
  VEX_LEN_0F3A06,
1488
  VEX_LEN_0F3A14,
1489
  VEX_LEN_0F3A15,
1490
  VEX_LEN_0F3A16,
1491
  VEX_LEN_0F3A17,
1492
  VEX_LEN_0F3A18,
1493
  VEX_LEN_0F3A19,
1494
  VEX_LEN_0F3A20,
1495
  VEX_LEN_0F3A21,
1496
  VEX_LEN_0F3A22,
1497
  VEX_LEN_0F3A30,
1498
  VEX_LEN_0F3A31,
1499
  VEX_LEN_0F3A32,
1500
  VEX_LEN_0F3A33,
1501
  VEX_LEN_0F3A38,
1502
  VEX_LEN_0F3A39,
1503
  VEX_LEN_0F3A41,
1504
  VEX_LEN_0F3A46,
1505
  VEX_LEN_0F3A60,
1506
  VEX_LEN_0F3A61,
1507
  VEX_LEN_0F3A62,
1508
  VEX_LEN_0F3A63,
1509
  VEX_LEN_0F3ADE_W_0,
1510
  VEX_LEN_0F3ADF,
1511
  VEX_LEN_0F3AF0,
1512
  VEX_LEN_MAP5_F8_X86_64,
1513
  VEX_LEN_MAP5_F9_X86_64,
1514
  VEX_LEN_MAP5_FD_X86_64,
1515
  VEX_LEN_MAP7_F6,
1516
  VEX_LEN_MAP7_F8,
1517
  VEX_LEN_XOP_08_85,
1518
  VEX_LEN_XOP_08_86,
1519
  VEX_LEN_XOP_08_87,
1520
  VEX_LEN_XOP_08_8E,
1521
  VEX_LEN_XOP_08_8F,
1522
  VEX_LEN_XOP_08_95,
1523
  VEX_LEN_XOP_08_96,
1524
  VEX_LEN_XOP_08_97,
1525
  VEX_LEN_XOP_08_9E,
1526
  VEX_LEN_XOP_08_9F,
1527
  VEX_LEN_XOP_08_A3,
1528
  VEX_LEN_XOP_08_A6,
1529
  VEX_LEN_XOP_08_B6,
1530
  VEX_LEN_XOP_08_C0,
1531
  VEX_LEN_XOP_08_C1,
1532
  VEX_LEN_XOP_08_C2,
1533
  VEX_LEN_XOP_08_C3,
1534
  VEX_LEN_XOP_08_CC,
1535
  VEX_LEN_XOP_08_CD,
1536
  VEX_LEN_XOP_08_CE,
1537
  VEX_LEN_XOP_08_CF,
1538
  VEX_LEN_XOP_08_EC,
1539
  VEX_LEN_XOP_08_ED,
1540
  VEX_LEN_XOP_08_EE,
1541
  VEX_LEN_XOP_08_EF,
1542
  VEX_LEN_XOP_09_01,
1543
  VEX_LEN_XOP_09_02,
1544
  VEX_LEN_XOP_09_12,
1545
  VEX_LEN_XOP_09_82_W_0,
1546
  VEX_LEN_XOP_09_83_W_0,
1547
  VEX_LEN_XOP_09_90,
1548
  VEX_LEN_XOP_09_91,
1549
  VEX_LEN_XOP_09_92,
1550
  VEX_LEN_XOP_09_93,
1551
  VEX_LEN_XOP_09_94,
1552
  VEX_LEN_XOP_09_95,
1553
  VEX_LEN_XOP_09_96,
1554
  VEX_LEN_XOP_09_97,
1555
  VEX_LEN_XOP_09_98,
1556
  VEX_LEN_XOP_09_99,
1557
  VEX_LEN_XOP_09_9A,
1558
  VEX_LEN_XOP_09_9B,
1559
  VEX_LEN_XOP_09_C1,
1560
  VEX_LEN_XOP_09_C2,
1561
  VEX_LEN_XOP_09_C3,
1562
  VEX_LEN_XOP_09_C6,
1563
  VEX_LEN_XOP_09_C7,
1564
  VEX_LEN_XOP_09_CB,
1565
  VEX_LEN_XOP_09_D1,
1566
  VEX_LEN_XOP_09_D2,
1567
  VEX_LEN_XOP_09_D3,
1568
  VEX_LEN_XOP_09_D6,
1569
  VEX_LEN_XOP_09_D7,
1570
  VEX_LEN_XOP_09_DB,
1571
  VEX_LEN_XOP_09_E1,
1572
  VEX_LEN_XOP_09_E2,
1573
  VEX_LEN_XOP_09_E3,
1574
  VEX_LEN_XOP_0A_12,
1575
};
1576
1577
enum
1578
{
1579
  EVEX_LEN_0F7E_P_1_W_0 = 0,
1580
  EVEX_LEN_0FD6_P_2_W_0,
1581
  EVEX_LEN_0F3816,
1582
  EVEX_LEN_0F3819,
1583
  EVEX_LEN_0F381A,
1584
  EVEX_LEN_0F381B,
1585
  EVEX_LEN_0F3836,
1586
  EVEX_LEN_0F384A_X86_64_W_0,
1587
  EVEX_LEN_0F385A,
1588
  EVEX_LEN_0F385B,
1589
  EVEX_LEN_0F386D_X86_64_W_0,
1590
  EVEX_LEN_0F38C6,
1591
  EVEX_LEN_0F38C7,
1592
  EVEX_LEN_0F3A00,
1593
  EVEX_LEN_0F3A01,
1594
  EVEX_LEN_0F3A07_X86_64_W_0,
1595
  EVEX_LEN_0F3A18,
1596
  EVEX_LEN_0F3A19,
1597
  EVEX_LEN_0F3A1A,
1598
  EVEX_LEN_0F3A1B,
1599
  EVEX_LEN_0F3A23,
1600
  EVEX_LEN_0F3A38,
1601
  EVEX_LEN_0F3A39,
1602
  EVEX_LEN_0F3A3A,
1603
  EVEX_LEN_0F3A3B,
1604
  EVEX_LEN_0F3A43,
1605
  EVEX_LEN_0F3A77_X86_64_W_0,
1606
1607
  EVEX_LEN_MAP5_6E,
1608
  EVEX_LEN_MAP5_7E,
1609
  EVEX_LEN_MAP6_80_W_0,
1610
  EVEX_LEN_MAP6_80_W_1,
1611
};
1612
1613
enum
1614
{
1615
  VEX_W_0F41_L_1 = 0,
1616
  VEX_W_0F42_L_1,
1617
  VEX_W_0F44_L_0,
1618
  VEX_W_0F45_L_1,
1619
  VEX_W_0F46_L_1,
1620
  VEX_W_0F47_L_1,
1621
  VEX_W_0F4A_L_1,
1622
  VEX_W_0F4B_L_1,
1623
  VEX_W_0F90_L_0,
1624
  VEX_W_0F91_L_0,
1625
  VEX_W_0F92_L_0,
1626
  VEX_W_0F93_L_0,
1627
  VEX_W_0F98_L_0,
1628
  VEX_W_0F99_L_0,
1629
  VEX_W_0F380C,
1630
  VEX_W_0F380D,
1631
  VEX_W_0F380E,
1632
  VEX_W_0F380F,
1633
  VEX_W_0F3813,
1634
  VEX_W_0F3816_L_1,
1635
  VEX_W_0F3818,
1636
  VEX_W_0F3819_L_1,
1637
  VEX_W_0F381A_L_1,
1638
  VEX_W_0F382C,
1639
  VEX_W_0F382D,
1640
  VEX_W_0F382E,
1641
  VEX_W_0F382F,
1642
  VEX_W_0F3836,
1643
  VEX_W_0F3846,
1644
  VEX_W_0F3848_X86_64_L_0,
1645
  VEX_W_0F3849_X86_64_L_0,
1646
  VEX_W_0F384A_X86_64,
1647
  VEX_W_0F384B_X86_64_L_0,
1648
  VEX_W_0F3850,
1649
  VEX_W_0F3851,
1650
  VEX_W_0F3852,
1651
  VEX_W_0F3853,
1652
  VEX_W_0F3858,
1653
  VEX_W_0F3859,
1654
  VEX_W_0F385A_L_0,
1655
  VEX_W_0F385C_X86_64_L_0,
1656
  VEX_W_0F385E_X86_64_L_0,
1657
  VEX_W_0F385F_X86_64_L_0,
1658
  VEX_W_0F386B_X86_64_L_0,
1659
  VEX_W_0F386C_X86_64_L_0,
1660
  VEX_W_0F386E_X86_64_L_0,
1661
  VEX_W_0F386F_X86_64_L_0,
1662
  VEX_W_0F3872_P_1,
1663
  VEX_W_0F3878,
1664
  VEX_W_0F3879,
1665
  VEX_W_0F38B0,
1666
  VEX_W_0F38B1,
1667
  VEX_W_0F38B4,
1668
  VEX_W_0F38B5,
1669
  VEX_W_0F38CB_P_3,
1670
  VEX_W_0F38CC_P_3,
1671
  VEX_W_0F38CD_P_3,
1672
  VEX_W_0F38CF,
1673
  VEX_W_0F38D2,
1674
  VEX_W_0F38D3,
1675
  VEX_W_0F38DA,
1676
  VEX_W_0F3A00_L_1,
1677
  VEX_W_0F3A01_L_1,
1678
  VEX_W_0F3A02,
1679
  VEX_W_0F3A04,
1680
  VEX_W_0F3A05,
1681
  VEX_W_0F3A06_L_1,
1682
  VEX_W_0F3A18_L_1,
1683
  VEX_W_0F3A19_L_1,
1684
  VEX_W_0F3A1D,
1685
  VEX_W_0F3A38_L_1,
1686
  VEX_W_0F3A39_L_1,
1687
  VEX_W_0F3A46_L_1,
1688
  VEX_W_0F3A4A,
1689
  VEX_W_0F3A4B,
1690
  VEX_W_0F3A4C,
1691
  VEX_W_0F3ACE,
1692
  VEX_W_0F3ACF,
1693
  VEX_W_0F3ADE,
1694
  VEX_W_MAP5_F8_X86_64_L_0,
1695
  VEX_W_MAP5_F9_X86_64_L_0,
1696
  VEX_W_MAP5_FD_X86_64_L_0,
1697
  VEX_W_MAP7_F6_L_0,
1698
  VEX_W_MAP7_F8_L_0,
1699
1700
  VEX_W_XOP_08_85_L_0,
1701
  VEX_W_XOP_08_86_L_0,
1702
  VEX_W_XOP_08_87_L_0,
1703
  VEX_W_XOP_08_8E_L_0,
1704
  VEX_W_XOP_08_8F_L_0,
1705
  VEX_W_XOP_08_95_L_0,
1706
  VEX_W_XOP_08_96_L_0,
1707
  VEX_W_XOP_08_97_L_0,
1708
  VEX_W_XOP_08_9E_L_0,
1709
  VEX_W_XOP_08_9F_L_0,
1710
  VEX_W_XOP_08_A6_L_0,
1711
  VEX_W_XOP_08_B6_L_0,
1712
  VEX_W_XOP_08_C0_L_0,
1713
  VEX_W_XOP_08_C1_L_0,
1714
  VEX_W_XOP_08_C2_L_0,
1715
  VEX_W_XOP_08_C3_L_0,
1716
  VEX_W_XOP_08_CC_L_0,
1717
  VEX_W_XOP_08_CD_L_0,
1718
  VEX_W_XOP_08_CE_L_0,
1719
  VEX_W_XOP_08_CF_L_0,
1720
  VEX_W_XOP_08_EC_L_0,
1721
  VEX_W_XOP_08_ED_L_0,
1722
  VEX_W_XOP_08_EE_L_0,
1723
  VEX_W_XOP_08_EF_L_0,
1724
1725
  VEX_W_XOP_09_80,
1726
  VEX_W_XOP_09_81,
1727
  VEX_W_XOP_09_82,
1728
  VEX_W_XOP_09_83,
1729
  VEX_W_XOP_09_C1_L_0,
1730
  VEX_W_XOP_09_C2_L_0,
1731
  VEX_W_XOP_09_C3_L_0,
1732
  VEX_W_XOP_09_C6_L_0,
1733
  VEX_W_XOP_09_C7_L_0,
1734
  VEX_W_XOP_09_CB_L_0,
1735
  VEX_W_XOP_09_D1_L_0,
1736
  VEX_W_XOP_09_D2_L_0,
1737
  VEX_W_XOP_09_D3_L_0,
1738
  VEX_W_XOP_09_D6_L_0,
1739
  VEX_W_XOP_09_D7_L_0,
1740
  VEX_W_XOP_09_DB_L_0,
1741
  VEX_W_XOP_09_E1_L_0,
1742
  VEX_W_XOP_09_E2_L_0,
1743
  VEX_W_XOP_09_E3_L_0,
1744
1745
  EVEX_W_0F5B_P_0,
1746
  EVEX_W_0F62,
1747
  EVEX_W_0F66,
1748
  EVEX_W_0F6A,
1749
  EVEX_W_0F6B,
1750
  EVEX_W_0F6C,
1751
  EVEX_W_0F6D,
1752
  EVEX_W_0F6F_P_1,
1753
  EVEX_W_0F6F_P_2,
1754
  EVEX_W_0F6F_P_3,
1755
  EVEX_W_0F70_P_2,
1756
  EVEX_W_0F72_R_2,
1757
  EVEX_W_0F72_R_4,
1758
  EVEX_W_0F72_R_6,
1759
  EVEX_W_0F73_R_2,
1760
  EVEX_W_0F73_R_6,
1761
  EVEX_W_0F76,
1762
  EVEX_W_0F78_P_0,
1763
  EVEX_W_0F78_P_2,
1764
  EVEX_W_0F79_P_0,
1765
  EVEX_W_0F79_P_2,
1766
  EVEX_W_0F7A_P_1,
1767
  EVEX_W_0F7A_P_2,
1768
  EVEX_W_0F7A_P_3,
1769
  EVEX_W_0F7B_P_2,
1770
  EVEX_W_0F7E_P_1,
1771
  EVEX_W_0F7F_P_1,
1772
  EVEX_W_0F7F_P_2,
1773
  EVEX_W_0F7F_P_3,
1774
  EVEX_W_0FD2,
1775
  EVEX_W_0FD3,
1776
  EVEX_W_0FD4,
1777
  EVEX_W_0FD6,
1778
  EVEX_W_0FE2,
1779
  EVEX_W_0FE6_P_1,
1780
  EVEX_W_0FE7,
1781
  EVEX_W_0FF2,
1782
  EVEX_W_0FF3,
1783
  EVEX_W_0FF4,
1784
  EVEX_W_0FFA,
1785
  EVEX_W_0FFB,
1786
  EVEX_W_0FFE,
1787
1788
  EVEX_W_0F3810_P_1,
1789
  EVEX_W_0F3810_P_2,
1790
  EVEX_W_0F3811_P_1,
1791
  EVEX_W_0F3811_P_2,
1792
  EVEX_W_0F3812_P_1,
1793
  EVEX_W_0F3812_P_2,
1794
  EVEX_W_0F3813_P_1,
1795
  EVEX_W_0F3814_P_1,
1796
  EVEX_W_0F3815_P_1,
1797
  EVEX_W_0F3819_L_n,
1798
  EVEX_W_0F381A_L_n,
1799
  EVEX_W_0F381B_L_2,
1800
  EVEX_W_0F381E,
1801
  EVEX_W_0F381F,
1802
  EVEX_W_0F3820_P_1,
1803
  EVEX_W_0F3821_P_1,
1804
  EVEX_W_0F3822_P_1,
1805
  EVEX_W_0F3823_P_1,
1806
  EVEX_W_0F3824_P_1,
1807
  EVEX_W_0F3825_P_1,
1808
  EVEX_W_0F3825_P_2,
1809
  EVEX_W_0F3828_P_2,
1810
  EVEX_W_0F3829_P_2,
1811
  EVEX_W_0F382A_P_1,
1812
  EVEX_W_0F382A_P_2,
1813
  EVEX_W_0F382B,
1814
  EVEX_W_0F3830_P_1,
1815
  EVEX_W_0F3831_P_1,
1816
  EVEX_W_0F3832_P_1,
1817
  EVEX_W_0F3833_P_1,
1818
  EVEX_W_0F3834_P_1,
1819
  EVEX_W_0F3835_P_1,
1820
  EVEX_W_0F3835_P_2,
1821
  EVEX_W_0F3837,
1822
  EVEX_W_0F383A_P_1,
1823
  EVEX_W_0F384A_X86_64,
1824
  EVEX_W_0F3859,
1825
  EVEX_W_0F385A_L_n,
1826
  EVEX_W_0F385B_L_2,
1827
  EVEX_W_0F386D_X86_64,
1828
  EVEX_W_0F3870,
1829
  EVEX_W_0F3872_P_2,
1830
  EVEX_W_0F387A,
1831
  EVEX_W_0F387B,
1832
  EVEX_W_0F3883,
1833
1834
  EVEX_W_0F3A07_X86_64,
1835
  EVEX_W_0F3A18_L_n,
1836
  EVEX_W_0F3A19_L_n,
1837
  EVEX_W_0F3A1A_L_2,
1838
  EVEX_W_0F3A1B_L_2,
1839
  EVEX_W_0F3A21,
1840
  EVEX_W_0F3A23_L_n,
1841
  EVEX_W_0F3A38_L_n,
1842
  EVEX_W_0F3A39_L_n,
1843
  EVEX_W_0F3A3A_L_2,
1844
  EVEX_W_0F3A3B_L_2,
1845
  EVEX_W_0F3A42,
1846
  EVEX_W_0F3A43_L_n,
1847
  EVEX_W_0F3A70,
1848
  EVEX_W_0F3A72,
1849
  EVEX_W_0F3A77_X86_64,
1850
1851
  EVEX_W_MAP4_8F_R_0,
1852
  EVEX_W_MAP4_F8_P1_M_1,
1853
  EVEX_W_MAP4_F8_P3_M_1,
1854
  EVEX_W_MAP4_FF_R_6,
1855
1856
  EVEX_W_MAP5_5B_P_0,
1857
  EVEX_W_MAP5_6C_P_0,
1858
  EVEX_W_MAP5_6C_P_2,
1859
  EVEX_W_MAP5_6D_P_0,
1860
  EVEX_W_MAP5_6D_P_2,
1861
  EVEX_W_MAP5_6E_P_1,
1862
  EVEX_W_MAP5_7A_P_3,
1863
  EVEX_W_MAP5_7E_P_1,
1864
  EVEX_W_MAP6_80,
1865
  EVEX_W_MAP6_81,
1866
};
1867
1868
typedef bool (*op_rtn) (instr_info *ins, int bytemode, int sizeflag);
1869
1870
struct dis386 {
1871
  const char *name;
1872
  struct
1873
    {
1874
      op_rtn rtn;
1875
      int bytemode;
1876
    } op[MAX_OPERANDS];
1877
  unsigned int prefix_requirement;
1878
};
1879
1880
/* Upper case letters in the instruction names here are macros.
1881
   'A' => print 'b' if no (suitable) register operand or suffix_always is true
1882
   'B' => print 'b' if suffix_always is true
1883
   'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
1884
    size prefix
1885
   'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
1886
    suffix_always is true
1887
   'E' => print 'e' if 32-bit form of jcxz
1888
   'F' => print 'w' or 'l' depending on address size prefix (loop insns)
1889
   'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
1890
   'H' => print ",pt" or ",pn" branch hint
1891
   'I' unused.
1892
   'J' unused.
1893
   'K' => print 'd' or 'q' if rex prefix is present.
1894
   'L' => print 'l' or 'q' if suffix_always is true
1895
   'M' => print 'r' if intel_mnemonic is false.
1896
   'N' => print 'n' if instruction has no wait "prefix"
1897
   'O' => print 'd' or 'o' (or 'q' in Intel mode)
1898
   'P' => behave as 'T' except with register operand outside of suffix_always
1899
    mode
1900
   'Q' => print 'w', 'l' or 'q' if no (suitable) register operand or
1901
    suffix_always is true
1902
   'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
1903
   'S' => print 'w', 'l' or 'q' if suffix_always is true
1904
   'T' => print 'w', 'l'/'d', or 'q' if instruction has an operand size
1905
    prefix or if suffix_always is true.
1906
   'U' unused.
1907
   'V' => print 'v' for VEX/EVEX and nothing for legacy encodings.
1908
   'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
1909
   'X' => print 's', 'd' depending on data16 prefix (for XMM)
1910
   'Y' => no output, mark EVEX.aaa != 0 as bad.
1911
   'Z' => print 'q' in 64bit mode and 'l' otherwise, if suffix_always is true.
1912
   '!' => change condition from true to false or from false to true.
1913
   '%' => add 1 upper case letter to the macro.
1914
   '^' => print 'w', 'l', or 'q' (Intel64 ISA only) depending on operand size
1915
    prefix or suffix_always is true (lcall/ljmp).
1916
   '@' => in 64bit mode for Intel64 ISA or if instruction
1917
    has no operand sizing prefix, print 'q' if suffix_always is true or
1918
    nothing otherwise; behave as 'P' in all other cases
1919
1920
   2 upper case letter macros:
1921
   "CC" => print condition code
1922
   "XY" => print 'x' or 'y' if suffix_always is true or no register
1923
     operands and no broadcast.
1924
   "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
1925
     register operands and no broadcast.
1926
   "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
1927
   "XD" => print 'd' if !EVEX or EVEX.W=1, EVEX.W=0 is not a valid encoding
1928
   "XH" => print 'h' if EVEX.W=0, EVEX.W=1 is not a valid encoding (for FP16)
1929
   "XB" => print 'bf16' if EVEX.W=0, EVEX.W=1 is not a valid encoding
1930
     (for BF16)
1931
   "XS" => print 's' if !EVEX or EVEX.W=0, EVEX.W=1 is not a valid encoding
1932
   "XV" => print "{vex} " pseudo prefix
1933
   "XE" => print "{evex} " pseudo prefix if no EVEX-specific functionality is
1934
     is used by an EVEX-encoded (AVX512VL) instruction.
1935
   "ME" => Similar to "XE", but only print "{evex} " when there is no
1936
     memory operand.
1937
   "NF" => print "{nf} " pseudo prefix when EVEX.NF = 1 and print "{evex} "
1938
     pseudo prefix when instructions without NF, EGPR and VVVV,
1939
   "NE" => don't print "{evex} " pseudo prefix for some special instructions
1940
     in MAP4.
1941
   "ZU" => print 'zu' if EVEX.ZU=1.
1942
   "SC" => print suffix SCC for SCC insns
1943
   "YK" keep unused, to avoid ambiguity with the combined use of Y and K.
1944
   "YX" keep unused, to avoid ambiguity with the combined use of Y and X.
1945
   "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand, cond
1946
     being false, or no operand at all in 64bit mode, or if suffix_always
1947
     is true.
1948
   "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
1949
   "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
1950
   "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
1951
   "DQ" => print 'd' or 'q' depending on the VEX.W bit
1952
   "DF" => print default flag value for SCC insns
1953
   "BW" => print 'b' or 'w' depending on the VEX.W bit
1954
   "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
1955
     an operand size prefix, or suffix_always is true.  print
1956
     'q' if rex prefix is present.
1957
1958
   Many of the above letters print nothing in Intel mode.  See "putop"
1959
   for the details.
1960
1961
   Braces '{' and '}', and vertical bars '|', indicate alternative
1962
   mnemonic strings for AT&T and Intel.  */
1963
1964
static const struct dis386 dis386[] = {
1965
  /* 00 */
1966
  { "addB",   { Ebh1, Gb }, 0 },
1967
  { "addS",   { Evh1, Gv }, 0 },
1968
  { "addB",   { Gb, EbS }, 0 },
1969
  { "addS",   { Gv, EvS }, 0 },
1970
  { "addB",   { AL, Ib }, 0 },
1971
  { "addS",   { eAX, Iv }, 0 },
1972
  { X86_64_TABLE (X86_64_06) },
1973
  { X86_64_TABLE (X86_64_07) },
1974
  /* 08 */
1975
  { "orB",    { Ebh1, Gb }, 0 },
1976
  { "orS",    { Evh1, Gv }, 0 },
1977
  { "orB",    { Gb, EbS }, 0 },
1978
  { "orS",    { Gv, EvS }, 0 },
1979
  { "orB",    { AL, Ib }, 0 },
1980
  { "orS",    { eAX, Iv }, 0 },
1981
  { X86_64_TABLE (X86_64_0E) },
1982
  { Bad_Opcode }, /* 0x0f extended opcode escape */
1983
  /* 10 */
1984
  { "adcB",   { Ebh1, Gb }, 0 },
1985
  { "adcS",   { Evh1, Gv }, 0 },
1986
  { "adcB",   { Gb, EbS }, 0 },
1987
  { "adcS",   { Gv, EvS }, 0 },
1988
  { "adcB",   { AL, Ib }, 0 },
1989
  { "adcS",   { eAX, Iv }, 0 },
1990
  { X86_64_TABLE (X86_64_16) },
1991
  { X86_64_TABLE (X86_64_17) },
1992
  /* 18 */
1993
  { "sbbB",   { Ebh1, Gb }, 0 },
1994
  { "sbbS",   { Evh1, Gv }, 0 },
1995
  { "sbbB",   { Gb, EbS }, 0 },
1996
  { "sbbS",   { Gv, EvS }, 0 },
1997
  { "sbbB",   { AL, Ib }, 0 },
1998
  { "sbbS",   { eAX, Iv }, 0 },
1999
  { X86_64_TABLE (X86_64_1E) },
2000
  { X86_64_TABLE (X86_64_1F) },
2001
  /* 20 */
2002
  { "andB",   { Ebh1, Gb }, 0 },
2003
  { "andS",   { Evh1, Gv }, 0 },
2004
  { "andB",   { Gb, EbS }, 0 },
2005
  { "andS",   { Gv, EvS }, 0 },
2006
  { "andB",   { AL, Ib }, 0 },
2007
  { "andS",   { eAX, Iv }, 0 },
2008
  { Bad_Opcode }, /* SEG ES prefix */
2009
  { X86_64_TABLE (X86_64_27) },
2010
  /* 28 */
2011
  { "subB",   { Ebh1, Gb }, 0 },
2012
  { "subS",   { Evh1, Gv }, 0 },
2013
  { "subB",   { Gb, EbS }, 0 },
2014
  { "subS",   { Gv, EvS }, 0 },
2015
  { "subB",   { AL, Ib }, 0 },
2016
  { "subS",   { eAX, Iv }, 0 },
2017
  { Bad_Opcode }, /* SEG CS prefix */
2018
  { X86_64_TABLE (X86_64_2F) },
2019
  /* 30 */
2020
  { "xorB",   { Ebh1, Gb }, 0 },
2021
  { "xorS",   { Evh1, Gv }, 0 },
2022
  { "xorB",   { Gb, EbS }, 0 },
2023
  { "xorS",   { Gv, EvS }, 0 },
2024
  { "xorB",   { AL, Ib }, 0 },
2025
  { "xorS",   { eAX, Iv }, 0 },
2026
  { Bad_Opcode }, /* SEG SS prefix */
2027
  { X86_64_TABLE (X86_64_37) },
2028
  /* 38 */
2029
  { "cmpB",   { Eb, Gb }, 0 },
2030
  { "cmpS",   { Ev, Gv }, 0 },
2031
  { "cmpB",   { Gb, EbS }, 0 },
2032
  { "cmpS",   { Gv, EvS }, 0 },
2033
  { "cmpB",   { AL, Ib }, 0 },
2034
  { "cmpS",   { eAX, Iv }, 0 },
2035
  { Bad_Opcode }, /* SEG DS prefix */
2036
  { X86_64_TABLE (X86_64_3F) },
2037
  /* 40 */
2038
  { "inc{S|}",    { RMeAX }, 0 },
2039
  { "inc{S|}",    { RMeCX }, 0 },
2040
  { "inc{S|}",    { RMeDX }, 0 },
2041
  { "inc{S|}",    { RMeBX }, 0 },
2042
  { "inc{S|}",    { RMeSP }, 0 },
2043
  { "inc{S|}",    { RMeBP }, 0 },
2044
  { "inc{S|}",    { RMeSI }, 0 },
2045
  { "inc{S|}",    { RMeDI }, 0 },
2046
  /* 48 */
2047
  { "dec{S|}",    { RMeAX }, 0 },
2048
  { "dec{S|}",    { RMeCX }, 0 },
2049
  { "dec{S|}",    { RMeDX }, 0 },
2050
  { "dec{S|}",    { RMeBX }, 0 },
2051
  { "dec{S|}",    { RMeSP }, 0 },
2052
  { "dec{S|}",    { RMeBP }, 0 },
2053
  { "dec{S|}",    { RMeSI }, 0 },
2054
  { "dec{S|}",    { RMeDI }, 0 },
2055
  /* 50 */
2056
  { "push!P",   { RMrAX }, 0 },
2057
  { "push!P",   { RMrCX }, 0 },
2058
  { "push!P",   { RMrDX }, 0 },
2059
  { "push!P",   { RMrBX }, 0 },
2060
  { "push!P",   { RMrSP }, 0 },
2061
  { "push!P",   { RMrBP }, 0 },
2062
  { "push!P",   { RMrSI }, 0 },
2063
  { "push!P",   { RMrDI }, 0 },
2064
  /* 58 */
2065
  { "pop!P",    { RMrAX }, 0 },
2066
  { "pop!P",    { RMrCX }, 0 },
2067
  { "pop!P",    { RMrDX }, 0 },
2068
  { "pop!P",    { RMrBX }, 0 },
2069
  { "pop!P",    { RMrSP }, 0 },
2070
  { "pop!P",    { RMrBP }, 0 },
2071
  { "pop!P",    { RMrSI }, 0 },
2072
  { "pop!P",    { RMrDI }, 0 },
2073
  /* 60 */
2074
  { X86_64_TABLE (X86_64_60) },
2075
  { X86_64_TABLE (X86_64_61) },
2076
  { X86_64_TABLE (X86_64_62) },
2077
  { X86_64_TABLE (X86_64_63) },
2078
  { Bad_Opcode }, /* seg fs */
2079
  { Bad_Opcode }, /* seg gs */
2080
  { Bad_Opcode }, /* op size prefix */
2081
  { Bad_Opcode }, /* adr size prefix */
2082
  /* 68 */
2083
  { "pushP",    { sIv }, 0 },
2084
  { "imulS",    { Gv, Ev, Iv }, 0 },
2085
  { "pushP",    { sIbT }, 0 },
2086
  { "imulS",    { Gv, Ev, sIb }, 0 },
2087
  { "ins{b|}",    { Ybr, indirDX }, 0 },
2088
  { X86_64_TABLE (X86_64_6D) },
2089
  { "outs{b|}",   { indirDXr, Xb }, 0 },
2090
  { X86_64_TABLE (X86_64_6F) },
2091
  /* 70 */
2092
  { "joH",    { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2093
  { "jnoH",   { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2094
  { "jbH",    { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2095
  { "jaeH",   { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2096
  { "jeH",    { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2097
  { "jneH",   { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2098
  { "jbeH",   { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2099
  { "jaH",    { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2100
  /* 78 */
2101
  { "jsH",    { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2102
  { "jnsH",   { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2103
  { "jpH",    { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2104
  { "jnpH",   { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2105
  { "jlH",    { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2106
  { "jgeH",   { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2107
  { "jleH",   { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2108
  { "jgH",    { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2109
  /* 80 */
2110
  { REG_TABLE (REG_80) },
2111
  { REG_TABLE (REG_81) },
2112
  { X86_64_TABLE (X86_64_82) },
2113
  { REG_TABLE (REG_83) },
2114
  { "testB",    { Eb, Gb }, 0 },
2115
  { "testS",    { Ev, Gv }, 0 },
2116
  { "xchgB",    { Ebh2, Gb }, 0 },
2117
  { "xchgS",    { Evh2, Gv }, 0 },
2118
  /* 88 */
2119
  { "movB",   { Ebh3, Gb }, 0 },
2120
  { "movS",   { Evh3, Gv }, 0 },
2121
  { "movB",   { Gb, EbS }, 0 },
2122
  { "movS",   { Gv, EvS }, 0 },
2123
  { "movD",   { Sv, Sw }, 0 },
2124
  { "leaS",   { Gv, M }, 0 },
2125
  { "movD",   { Sw, Sv }, 0 },
2126
  { REG_TABLE (REG_8F) },
2127
  /* 90 */
2128
  { PREFIX_TABLE (PREFIX_90) },
2129
  { "xchgS",    { RMeCX, eAX }, 0 },
2130
  { "xchgS",    { RMeDX, eAX }, 0 },
2131
  { "xchgS",    { RMeBX, eAX }, 0 },
2132
  { "xchgS",    { RMeSP, eAX }, 0 },
2133
  { "xchgS",    { RMeBP, eAX }, 0 },
2134
  { "xchgS",    { RMeSI, eAX }, 0 },
2135
  { "xchgS",    { RMeDI, eAX }, 0 },
2136
  /* 98 */
2137
  { "cW{t|}R",    { XX }, 0 },
2138
  { "cR{t|}O",    { XX }, 0 },
2139
  { X86_64_TABLE (X86_64_9A) },
2140
  { Bad_Opcode }, /* fwait */
2141
  { "pushfP",   { XX }, 0 },
2142
  { "popfP",    { XX }, 0 },
2143
  { "sahf",   { XX }, 0 },
2144
  { "lahf",   { XX }, 0 },
2145
  /* a0 */
2146
  { "mov%LB",   { AL, Ob }, PREFIX_REX2_ILLEGAL },
2147
  { "mov%LS",   { { JMPABS_Fixup, eAX_reg }, { JMPABS_Fixup, v_mode } }, PREFIX_REX2_ILLEGAL },
2148
  { "mov%LB",   { Ob, AL }, PREFIX_REX2_ILLEGAL },
2149
  { "mov%LS",   { Ov, eAX }, PREFIX_REX2_ILLEGAL },
2150
  { "movs{b|}",   { Ybr, Xb }, PREFIX_REX2_ILLEGAL },
2151
  { "movs{R|}",   { Yvr, Xv }, PREFIX_REX2_ILLEGAL },
2152
  { "cmps{b|}",   { Xb, Yb }, PREFIX_REX2_ILLEGAL },
2153
  { "cmps{R|}",   { Xv, Yv }, PREFIX_REX2_ILLEGAL },
2154
  /* a8 */
2155
  { "testB",    { AL, Ib }, PREFIX_REX2_ILLEGAL },
2156
  { "testS",    { eAX, Iv }, PREFIX_REX2_ILLEGAL },
2157
  { "stosB",    { Ybr, AL }, PREFIX_REX2_ILLEGAL },
2158
  { "stosS",    { Yvr, eAX }, PREFIX_REX2_ILLEGAL },
2159
  { "lodsB",    { ALr, Xb }, PREFIX_REX2_ILLEGAL },
2160
  { "lodsS",    { eAXr, Xv }, PREFIX_REX2_ILLEGAL },
2161
  { "scasB",    { AL, Yb }, PREFIX_REX2_ILLEGAL },
2162
  { "scasS",    { eAX, Yv }, PREFIX_REX2_ILLEGAL },
2163
  /* b0 */
2164
  { "movB",   { RMAL, Ib }, 0 },
2165
  { "movB",   { RMCL, Ib }, 0 },
2166
  { "movB",   { RMDL, Ib }, 0 },
2167
  { "movB",   { RMBL, Ib }, 0 },
2168
  { "movB",   { RMAH, Ib }, 0 },
2169
  { "movB",   { RMCH, Ib }, 0 },
2170
  { "movB",   { RMDH, Ib }, 0 },
2171
  { "movB",   { RMBH, Ib }, 0 },
2172
  /* b8 */
2173
  { "mov%LV",   { RMeAX, Iv64 }, 0 },
2174
  { "mov%LV",   { RMeCX, Iv64 }, 0 },
2175
  { "mov%LV",   { RMeDX, Iv64 }, 0 },
2176
  { "mov%LV",   { RMeBX, Iv64 }, 0 },
2177
  { "mov%LV",   { RMeSP, Iv64 }, 0 },
2178
  { "mov%LV",   { RMeBP, Iv64 }, 0 },
2179
  { "mov%LV",   { RMeSI, Iv64 }, 0 },
2180
  { "mov%LV",   { RMeDI, Iv64 }, 0 },
2181
  /* c0 */
2182
  { REG_TABLE (REG_C0) },
2183
  { REG_TABLE (REG_C1) },
2184
  { X86_64_TABLE (X86_64_C2) },
2185
  { X86_64_TABLE (X86_64_C3) },
2186
  { X86_64_TABLE (X86_64_C4) },
2187
  { X86_64_TABLE (X86_64_C5) },
2188
  { REG_TABLE (REG_C6) },
2189
  { REG_TABLE (REG_C7) },
2190
  /* c8 */
2191
  { "enterP",   { Iw, Ib }, 0 },
2192
  { "leaveP",   { XX }, 0 },
2193
  { "{l|}ret{|f}%LP", { Iw }, 0 },
2194
  { "{l|}ret{|f}%LP", { XX }, 0 },
2195
  { "int3",   { XX }, 0 },
2196
  { "int",    { Ib }, 0 },
2197
  { X86_64_TABLE (X86_64_CE) },
2198
  { "iret%LP",    { XX }, 0 },
2199
  /* d0 */
2200
  { REG_TABLE (REG_D0) },
2201
  { REG_TABLE (REG_D1) },
2202
  { REG_TABLE (REG_D2) },
2203
  { REG_TABLE (REG_D3) },
2204
  { X86_64_TABLE (X86_64_D4) },
2205
  { X86_64_TABLE (X86_64_D5) },
2206
  { X86_64_TABLE (X86_64_D6) },
2207
  { "xlat",   { DSBX }, 0 },
2208
  /* d8 */
2209
  { FLOAT },
2210
  { FLOAT },
2211
  { FLOAT },
2212
  { FLOAT },
2213
  { FLOAT },
2214
  { FLOAT },
2215
  { FLOAT },
2216
  { FLOAT },
2217
  /* e0 */
2218
  { "loopneFH",   { Jb, XX, loop_jcxz_flag }, PREFIX_REX2_ILLEGAL },
2219
  { "loopeFH",    { Jb, XX, loop_jcxz_flag }, PREFIX_REX2_ILLEGAL },
2220
  { "loopFH",   { Jb, XX, loop_jcxz_flag }, PREFIX_REX2_ILLEGAL },
2221
  { "jEcxzH",   { Jb, XX, loop_jcxz_flag }, PREFIX_REX2_ILLEGAL },
2222
  { "inB",    { AL, Ib }, PREFIX_REX2_ILLEGAL },
2223
  { "inG",    { zAX, Ib }, PREFIX_REX2_ILLEGAL },
2224
  { "outB",   { Ib, AL }, PREFIX_REX2_ILLEGAL },
2225
  { "outG",   { Ib, zAX }, PREFIX_REX2_ILLEGAL },
2226
  /* e8 */
2227
  { X86_64_TABLE (X86_64_E8) },
2228
  { X86_64_TABLE (X86_64_E9) },
2229
  { X86_64_TABLE (X86_64_EA) },
2230
  { "jmp",    { Jb, BND }, PREFIX_REX2_ILLEGAL },
2231
  { "inB",    { AL, indirDX }, PREFIX_REX2_ILLEGAL },
2232
  { "inG",    { zAX, indirDX }, PREFIX_REX2_ILLEGAL },
2233
  { "outB",   { indirDX, AL }, PREFIX_REX2_ILLEGAL },
2234
  { "outG",   { indirDX, zAX }, PREFIX_REX2_ILLEGAL },
2235
  /* f0 */
2236
  { Bad_Opcode }, /* lock prefix */
2237
  { "int1",   { XX }, 0 },
2238
  { Bad_Opcode }, /* repne */
2239
  { Bad_Opcode }, /* repz */
2240
  { "hlt",    { XX }, 0 },
2241
  { "cmc",    { XX }, 0 },
2242
  { REG_TABLE (REG_F6) },
2243
  { REG_TABLE (REG_F7) },
2244
  /* f8 */
2245
  { "clc",    { XX }, 0 },
2246
  { "stc",    { XX }, 0 },
2247
  { "cli",    { XX }, 0 },
2248
  { "sti",    { XX }, 0 },
2249
  { "cld",    { XX }, 0 },
2250
  { "std",    { XX }, 0 },
2251
  { REG_TABLE (REG_FE) },
2252
  { REG_TABLE (REG_FF) },
2253
};
2254
2255
static const struct dis386 dis386_twobyte[] = {
2256
  /* 00 */
2257
  { REG_TABLE (REG_0F00 ) },
2258
  { REG_TABLE (REG_0F01 ) },
2259
  { "larS",   { Gv, Sv }, 0 },
2260
  { "lslS",   { Gv, Sv }, 0 },
2261
  { Bad_Opcode },
2262
  { "syscall",    { XX }, 0 },
2263
  { "clts",   { XX }, 0 },
2264
  { "sysret%LQ",    { XX }, 0 },
2265
  /* 08 */
2266
  { "invd",   { XX }, 0 },
2267
  { PREFIX_TABLE (PREFIX_0F09) },
2268
  { Bad_Opcode },
2269
  { "ud2",    { XX }, 0 },
2270
  { Bad_Opcode },
2271
  { REG_TABLE (REG_0F0D) },
2272
  { "femms",    { XX }, 0 },
2273
  { "",     { MX, EM, OPSUF }, 0 }, /* See OP_3DNowSuffix.  */
2274
  /* 10 */
2275
  { PREFIX_TABLE (PREFIX_0F10) },
2276
  { PREFIX_TABLE (PREFIX_0F11) },
2277
  { PREFIX_TABLE (PREFIX_0F12) },
2278
  { "movlpX",   { Mq, XM }, PREFIX_OPCODE },
2279
  { "unpcklpX",   { XM, EXx }, PREFIX_OPCODE },
2280
  { "unpckhpX",   { XM, EXx }, PREFIX_OPCODE },
2281
  { PREFIX_TABLE (PREFIX_0F16) },
2282
  { "movhpX",   { Mq, XM }, PREFIX_OPCODE },
2283
  /* 18 */
2284
  { REG_TABLE (REG_0F18) },
2285
  { "nopQ",   { Ev }, 0 },
2286
  { PREFIX_TABLE (PREFIX_0F1A) },
2287
  { PREFIX_TABLE (PREFIX_0F1B) },
2288
  { PREFIX_TABLE (PREFIX_0F1C) },
2289
  { "nopQ",   { Ev }, 0 },
2290
  { PREFIX_TABLE (PREFIX_0F1E) },
2291
  { "nopQ",   { Ev }, 0 },
2292
  /* 20 */
2293
  { "movZ",   { Em, Cm }, 0 },
2294
  { "movZ",   { Em, Dm }, 0 },
2295
  { "movZ",   { Cm, Em }, 0 },
2296
  { "movZ",   { Dm, Em }, 0 },
2297
  { X86_64_TABLE (X86_64_0F24) },
2298
  { Bad_Opcode },
2299
  { X86_64_TABLE (X86_64_0F26) },
2300
  { Bad_Opcode },
2301
  /* 28 */
2302
  { "movapX",   { XM, EXx }, PREFIX_OPCODE },
2303
  { "movapX",   { EXxS, XM }, PREFIX_OPCODE },
2304
  { PREFIX_TABLE (PREFIX_0F2A) },
2305
  { PREFIX_TABLE (PREFIX_0F2B) },
2306
  { PREFIX_TABLE (PREFIX_0F2C) },
2307
  { PREFIX_TABLE (PREFIX_0F2D) },
2308
  { PREFIX_TABLE (PREFIX_0F2E) },
2309
  { PREFIX_TABLE (PREFIX_0F2F) },
2310
  /* 30 */
2311
  { "wrmsr",    { XX }, PREFIX_REX2_ILLEGAL },
2312
  { "rdtsc",    { XX }, PREFIX_REX2_ILLEGAL },
2313
  { "rdmsr",    { XX }, PREFIX_REX2_ILLEGAL },
2314
  { "rdpmc",    { XX }, PREFIX_REX2_ILLEGAL },
2315
  { "sysenter",   { SEP }, PREFIX_REX2_ILLEGAL },
2316
  { "sysexit%LQ", { SEP }, PREFIX_REX2_ILLEGAL },
2317
  { Bad_Opcode },
2318
  { "getsec",   { XX }, PREFIX_REX2_ILLEGAL },
2319
  /* 38 */
2320
  { THREE_BYTE_TABLE (THREE_BYTE_0F38) },
2321
  { Bad_Opcode },
2322
  { THREE_BYTE_TABLE (THREE_BYTE_0F3A) },
2323
  { Bad_Opcode },
2324
  { Bad_Opcode },
2325
  { Bad_Opcode },
2326
  { Bad_Opcode },
2327
  { Bad_Opcode },
2328
  /* 40 */
2329
  { "cmovoS",   { Gv, Ev }, 0 },
2330
  { "cmovnoS",    { Gv, Ev }, 0 },
2331
  { "cmovbS",   { Gv, Ev }, 0 },
2332
  { "cmovaeS",    { Gv, Ev }, 0 },
2333
  { "cmoveS",   { Gv, Ev }, 0 },
2334
  { "cmovneS",    { Gv, Ev }, 0 },
2335
  { "cmovbeS",    { Gv, Ev }, 0 },
2336
  { "cmovaS",   { Gv, Ev }, 0 },
2337
  /* 48 */
2338
  { "cmovsS",   { Gv, Ev }, 0 },
2339
  { "cmovnsS",    { Gv, Ev }, 0 },
2340
  { "cmovpS",   { Gv, Ev }, 0 },
2341
  { "cmovnpS",    { Gv, Ev }, 0 },
2342
  { "cmovlS",   { Gv, Ev }, 0 },
2343
  { "cmovgeS",    { Gv, Ev }, 0 },
2344
  { "cmovleS",    { Gv, Ev }, 0 },
2345
  { "cmovgS",   { Gv, Ev }, 0 },
2346
  /* 50 */
2347
  { "movmskpX",   { Gdq, Ux }, PREFIX_OPCODE },
2348
  { PREFIX_TABLE (PREFIX_0F51) },
2349
  { PREFIX_TABLE (PREFIX_0F52) },
2350
  { PREFIX_TABLE (PREFIX_0F53) },
2351
  { "andpX",    { XM, EXx }, PREFIX_OPCODE },
2352
  { "andnpX",   { XM, EXx }, PREFIX_OPCODE },
2353
  { "orpX",   { XM, EXx }, PREFIX_OPCODE },
2354
  { "xorpX",    { XM, EXx }, PREFIX_OPCODE },
2355
  /* 58 */
2356
  { PREFIX_TABLE (PREFIX_0F58) },
2357
  { PREFIX_TABLE (PREFIX_0F59) },
2358
  { PREFIX_TABLE (PREFIX_0F5A) },
2359
  { PREFIX_TABLE (PREFIX_0F5B) },
2360
  { PREFIX_TABLE (PREFIX_0F5C) },
2361
  { PREFIX_TABLE (PREFIX_0F5D) },
2362
  { PREFIX_TABLE (PREFIX_0F5E) },
2363
  { PREFIX_TABLE (PREFIX_0F5F) },
2364
  /* 60 */
2365
  { PREFIX_TABLE (PREFIX_0F60) },
2366
  { PREFIX_TABLE (PREFIX_0F61) },
2367
  { PREFIX_TABLE (PREFIX_0F62) },
2368
  { "packsswb",   { MX, EM }, PREFIX_OPCODE },
2369
  { "pcmpgtb",    { MX, EM }, PREFIX_OPCODE },
2370
  { "pcmpgtw",    { MX, EM }, PREFIX_OPCODE },
2371
  { "pcmpgtd",    { MX, EM }, PREFIX_OPCODE },
2372
  { "packuswb",   { MX, EM }, PREFIX_OPCODE },
2373
  /* 68 */
2374
  { "punpckhbw",  { MX, EM }, PREFIX_OPCODE },
2375
  { "punpckhwd",  { MX, EM }, PREFIX_OPCODE },
2376
  { "punpckhdq",  { MX, EM }, PREFIX_OPCODE },
2377
  { "packssdw",   { MX, EM }, PREFIX_OPCODE },
2378
  { "punpcklqdq", { XM, EXx }, PREFIX_DATA },
2379
  { "punpckhqdq", { XM, EXx }, PREFIX_DATA },
2380
  { "movK",   { MX, Edq }, PREFIX_OPCODE },
2381
  { PREFIX_TABLE (PREFIX_0F6F) },
2382
  /* 70 */
2383
  { PREFIX_TABLE (PREFIX_0F70) },
2384
  { REG_TABLE (REG_0F71) },
2385
  { REG_TABLE (REG_0F72) },
2386
  { REG_TABLE (REG_0F73) },
2387
  { "pcmpeqb",    { MX, EM }, PREFIX_OPCODE },
2388
  { "pcmpeqw",    { MX, EM }, PREFIX_OPCODE },
2389
  { "pcmpeqd",    { MX, EM }, PREFIX_OPCODE },
2390
  { "emms",   { XX }, PREFIX_OPCODE },
2391
  /* 78 */
2392
  { PREFIX_TABLE (PREFIX_0F78) },
2393
  { PREFIX_TABLE (PREFIX_0F79) },
2394
  { Bad_Opcode },
2395
  { Bad_Opcode },
2396
  { PREFIX_TABLE (PREFIX_0F7C) },
2397
  { PREFIX_TABLE (PREFIX_0F7D) },
2398
  { PREFIX_TABLE (PREFIX_0F7E) },
2399
  { PREFIX_TABLE (PREFIX_0F7F) },
2400
  /* 80 */
2401
  { "joH",    { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2402
  { "jnoH",   { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2403
  { "jbH",    { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2404
  { "jaeH",   { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2405
  { "jeH",    { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2406
  { "jneH",   { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2407
  { "jbeH",   { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2408
  { "jaH",    { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2409
  /* 88 */
2410
  { "jsH",    { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2411
  { "jnsH",   { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2412
  { "jpH",    { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2413
  { "jnpH",   { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2414
  { "jlH",    { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2415
  { "jgeH",   { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2416
  { "jleH",   { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2417
  { "jgH",    { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2418
  /* 90 */
2419
  { "seto",   { Eb }, 0 },
2420
  { "setno",    { Eb }, 0 },
2421
  { "setb",   { Eb }, 0 },
2422
  { "setae",    { Eb }, 0 },
2423
  { "sete",   { Eb }, 0 },
2424
  { "setne",    { Eb }, 0 },
2425
  { "setbe",    { Eb }, 0 },
2426
  { "seta",   { Eb }, 0 },
2427
  /* 98 */
2428
  { "sets",   { Eb }, 0 },
2429
  { "setns",    { Eb }, 0 },
2430
  { "setp",   { Eb }, 0 },
2431
  { "setnp",    { Eb }, 0 },
2432
  { "setl",   { Eb }, 0 },
2433
  { "setge",    { Eb }, 0 },
2434
  { "setle",    { Eb }, 0 },
2435
  { "setg",   { Eb }, 0 },
2436
  /* a0 */
2437
  { "pushP",    { fs }, 0 },
2438
  { "popP",   { fs }, 0 },
2439
  { "cpuid",    { XX }, 0 },
2440
  { "btS",    { Ev, Gv }, 0 },
2441
  { "shldS",    { Ev, Gv, Ib }, 0 },
2442
  { "shldS",    { Ev, Gv, CL }, 0 },
2443
  { REG_TABLE (REG_0FA6) },
2444
  { REG_TABLE (REG_0FA7) },
2445
  /* a8 */
2446
  { "pushP",    { gs }, 0 },
2447
  { "popP",   { gs }, 0 },
2448
  { "rsm",    { XX }, 0 },
2449
  { "btsS",   { Evh1, Gv }, 0 },
2450
  { "shrdS",    { Ev, Gv, Ib }, 0 },
2451
  { "shrdS",    { Ev, Gv, CL }, 0 },
2452
  { REG_TABLE (REG_0FAE) },
2453
  { "imulS",    { Gv, Ev }, 0 },
2454
  /* b0 */
2455
  { "cmpxchgB",   { Ebh1, Gb }, 0 },
2456
  { "cmpxchgS",   { Evh1, Gv }, 0 },
2457
  { "lssS",   { Gv, Mp }, 0 },
2458
  { "btrS",   { Evh1, Gv }, 0 },
2459
  { "lfsS",   { Gv, Mp }, 0 },
2460
  { "lgsS",   { Gv, Mp }, 0 },
2461
  { "movz{bR|x}", { Gv, Eb }, 0 },
2462
  { "movz{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movzww ! */
2463
  /* b8 */
2464
  { PREFIX_TABLE (PREFIX_0FB8) },
2465
  { "ud1S",   { Gv, Ev }, 0 },
2466
  { REG_TABLE (REG_0FBA) },
2467
  { "btcS",   { Evh1, Gv }, 0 },
2468
  { PREFIX_TABLE (PREFIX_0FBC) },
2469
  { PREFIX_TABLE (PREFIX_0FBD) },
2470
  { "movs{bR|x}", { Gv, Eb }, 0 },
2471
  { "movs{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movsww ! */
2472
  /* c0 */
2473
  { "xaddB",    { Ebh1, Gb }, 0 },
2474
  { "xaddS",    { Evh1, Gv }, 0 },
2475
  { PREFIX_TABLE (PREFIX_0FC2) },
2476
  { "movntiS",    { Mdq, Gdq }, PREFIX_OPCODE },
2477
  { "pinsrw",   { MX, Edw, Ib }, PREFIX_OPCODE },
2478
  { "pextrw",   { Gd, Nq, Ib }, PREFIX_OPCODE },
2479
  { "shufpX",   { XM, EXx, Ib }, PREFIX_OPCODE },
2480
  { REG_TABLE (REG_0FC7) },
2481
  /* c8 */
2482
  { "bswap",    { RMeAX }, 0 },
2483
  { "bswap",    { RMeCX }, 0 },
2484
  { "bswap",    { RMeDX }, 0 },
2485
  { "bswap",    { RMeBX }, 0 },
2486
  { "bswap",    { RMeSP }, 0 },
2487
  { "bswap",    { RMeBP }, 0 },
2488
  { "bswap",    { RMeSI }, 0 },
2489
  { "bswap",    { RMeDI }, 0 },
2490
  /* d0 */
2491
  { PREFIX_TABLE (PREFIX_0FD0) },
2492
  { "psrlw",    { MX, EM }, PREFIX_OPCODE },
2493
  { "psrld",    { MX, EM }, PREFIX_OPCODE },
2494
  { "psrlq",    { MX, EM }, PREFIX_OPCODE },
2495
  { "paddq",    { MX, EM }, PREFIX_OPCODE },
2496
  { "pmullw",   { MX, EM }, PREFIX_OPCODE },
2497
  { PREFIX_TABLE (PREFIX_0FD6) },
2498
  { "pmovmskb",   { Gdq, Nq }, PREFIX_OPCODE },
2499
  /* d8 */
2500
  { "psubusb",    { MX, EM }, PREFIX_OPCODE },
2501
  { "psubusw",    { MX, EM }, PREFIX_OPCODE },
2502
  { "pminub",   { MX, EM }, PREFIX_OPCODE },
2503
  { "pand",   { MX, EM }, PREFIX_OPCODE },
2504
  { "paddusb",    { MX, EM }, PREFIX_OPCODE },
2505
  { "paddusw",    { MX, EM }, PREFIX_OPCODE },
2506
  { "pmaxub",   { MX, EM }, PREFIX_OPCODE },
2507
  { "pandn",    { MX, EM }, PREFIX_OPCODE },
2508
  /* e0 */
2509
  { "pavgb",    { MX, EM }, PREFIX_OPCODE },
2510
  { "psraw",    { MX, EM }, PREFIX_OPCODE },
2511
  { "psrad",    { MX, EM }, PREFIX_OPCODE },
2512
  { "pavgw",    { MX, EM }, PREFIX_OPCODE },
2513
  { "pmulhuw",    { MX, EM }, PREFIX_OPCODE },
2514
  { "pmulhw",   { MX, EM }, PREFIX_OPCODE },
2515
  { PREFIX_TABLE (PREFIX_0FE6) },
2516
  { PREFIX_TABLE (PREFIX_0FE7) },
2517
  /* e8 */
2518
  { "psubsb",   { MX, EM }, PREFIX_OPCODE },
2519
  { "psubsw",   { MX, EM }, PREFIX_OPCODE },
2520
  { "pminsw",   { MX, EM }, PREFIX_OPCODE },
2521
  { "por",    { MX, EM }, PREFIX_OPCODE },
2522
  { "paddsb",   { MX, EM }, PREFIX_OPCODE },
2523
  { "paddsw",   { MX, EM }, PREFIX_OPCODE },
2524
  { "pmaxsw",   { MX, EM }, PREFIX_OPCODE },
2525
  { "pxor",   { MX, EM }, PREFIX_OPCODE },
2526
  /* f0 */
2527
  { PREFIX_TABLE (PREFIX_0FF0) },
2528
  { "psllw",    { MX, EM }, PREFIX_OPCODE },
2529
  { "pslld",    { MX, EM }, PREFIX_OPCODE },
2530
  { "psllq",    { MX, EM }, PREFIX_OPCODE },
2531
  { "pmuludq",    { MX, EM }, PREFIX_OPCODE },
2532
  { "pmaddwd",    { MX, EM }, PREFIX_OPCODE },
2533
  { "psadbw",   { MX, EM }, PREFIX_OPCODE },
2534
  { PREFIX_TABLE (PREFIX_0FF7) },
2535
  /* f8 */
2536
  { "psubb",    { MX, EM }, PREFIX_OPCODE },
2537
  { "psubw",    { MX, EM }, PREFIX_OPCODE },
2538
  { "psubd",    { MX, EM }, PREFIX_OPCODE },
2539
  { "psubq",    { MX, EM }, PREFIX_OPCODE },
2540
  { "paddb",    { MX, EM }, PREFIX_OPCODE },
2541
  { "paddw",    { MX, EM }, PREFIX_OPCODE },
2542
  { "paddd",    { MX, EM }, PREFIX_OPCODE },
2543
  { "ud0S",   { Gv, Ev }, 0 },
2544
};
2545
2546
static const bool onebyte_has_modrm[256] = {
2547
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2548
  /*       -------------------------------        */
2549
  /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2550
  /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2551
  /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2552
  /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2553
  /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2554
  /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2555
  /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2556
  /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2557
  /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2558
  /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2559
  /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2560
  /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2561
  /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2562
  /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2563
  /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2564
  /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1  /* f0 */
2565
  /*       -------------------------------        */
2566
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2567
};
2568
2569
static const bool twobyte_has_modrm[256] = {
2570
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2571
  /*       -------------------------------        */
2572
  /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
2573
  /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
2574
  /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
2575
  /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
2576
  /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
2577
  /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2578
  /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
2579
  /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
2580
  /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2581
  /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
2582
  /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
2583
  /* b0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bf */
2584
  /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
2585
  /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
2586
  /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
2587
  /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1  /* ff */
2588
  /*       -------------------------------        */
2589
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2590
};
2591
2592
2593
struct op
2594
  {
2595
    const char *name;
2596
    unsigned int len;
2597
  };
2598
2599
/* If we are accessing mod/rm/reg without need_modrm set, then the
2600
   values are stale.  Hitting this abort likely indicates that you
2601
   need to update onebyte_has_modrm or twobyte_has_modrm.  */
2602
1.63M
#define MODRM_CHECK  if (!ins->need_modrm) abort ()
2603
2604
static const char intel_index16[][6] = {
2605
  "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2606
};
2607
2608
static const char att_names64[][8] = {
2609
  "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
2610
  "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15",
2611
  "%r16", "%r17", "%r18", "%r19", "%r20", "%r21", "%r22", "%r23",
2612
  "%r24", "%r25", "%r26", "%r27", "%r28", "%r29", "%r30", "%r31",
2613
};
2614
static const char att_names32[][8] = {
2615
  "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
2616
  "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d",
2617
  "%r16d", "%r17d", "%r18d", "%r19d", "%r20d", "%r21d", "%r22d", "%r23d",
2618
  "%r24d", "%r25d", "%r26d", "%r27d", "%r28d", "%r29d", "%r30d", "%r31d",
2619
};
2620
static const char att_names16[][8] = {
2621
  "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
2622
  "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w",
2623
  "%r16w", "%r17w", "%r18w", "%r19w", "%r20w", "%r21w", "%r22w", "%r23w",
2624
  "%r24w", "%r25w", "%r26w", "%r27w", "%r28w", "%r29w", "%r30w", "%r31w",
2625
};
2626
static const char att_names8[][8] = {
2627
  "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
2628
};
2629
static const char att_names8rex[][8] = {
2630
  "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
2631
  "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b",
2632
  "%r16b", "%r17b", "%r18b", "%r19b", "%r20b", "%r21b", "%r22b", "%r23b",
2633
  "%r24b", "%r25b", "%r26b", "%r27b", "%r28b", "%r29b", "%r30b", "%r31b",
2634
};
2635
static const char att_names_seg[][4] = {
2636
  "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
2637
};
2638
static const char att_index64[] = "%riz";
2639
static const char att_index32[] = "%eiz";
2640
static const char att_index16[][8] = {
2641
  "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
2642
};
2643
2644
static const char att_names_mm[][8] = {
2645
  "%mm0", "%mm1", "%mm2", "%mm3",
2646
  "%mm4", "%mm5", "%mm6", "%mm7"
2647
};
2648
2649
static const char att_names_bnd[][8] = {
2650
  "%bnd0", "%bnd1", "%bnd2", "%bnd3"
2651
};
2652
2653
static const char att_names_xmm[][8] = {
2654
  "%xmm0", "%xmm1", "%xmm2", "%xmm3",
2655
  "%xmm4", "%xmm5", "%xmm6", "%xmm7",
2656
  "%xmm8", "%xmm9", "%xmm10", "%xmm11",
2657
  "%xmm12", "%xmm13", "%xmm14", "%xmm15",
2658
  "%xmm16", "%xmm17", "%xmm18", "%xmm19",
2659
  "%xmm20", "%xmm21", "%xmm22", "%xmm23",
2660
  "%xmm24", "%xmm25", "%xmm26", "%xmm27",
2661
  "%xmm28", "%xmm29", "%xmm30", "%xmm31"
2662
};
2663
2664
static const char att_names_ymm[][8] = {
2665
  "%ymm0", "%ymm1", "%ymm2", "%ymm3",
2666
  "%ymm4", "%ymm5", "%ymm6", "%ymm7",
2667
  "%ymm8", "%ymm9", "%ymm10", "%ymm11",
2668
  "%ymm12", "%ymm13", "%ymm14", "%ymm15",
2669
  "%ymm16", "%ymm17", "%ymm18", "%ymm19",
2670
  "%ymm20", "%ymm21", "%ymm22", "%ymm23",
2671
  "%ymm24", "%ymm25", "%ymm26", "%ymm27",
2672
  "%ymm28", "%ymm29", "%ymm30", "%ymm31"
2673
};
2674
2675
static const char att_names_zmm[][8] = {
2676
  "%zmm0", "%zmm1", "%zmm2", "%zmm3",
2677
  "%zmm4", "%zmm5", "%zmm6", "%zmm7",
2678
  "%zmm8", "%zmm9", "%zmm10", "%zmm11",
2679
  "%zmm12", "%zmm13", "%zmm14", "%zmm15",
2680
  "%zmm16", "%zmm17", "%zmm18", "%zmm19",
2681
  "%zmm20", "%zmm21", "%zmm22", "%zmm23",
2682
  "%zmm24", "%zmm25", "%zmm26", "%zmm27",
2683
  "%zmm28", "%zmm29", "%zmm30", "%zmm31"
2684
};
2685
2686
static const char att_names_tmm[][8] = {
2687
  "%tmm0", "%tmm1", "%tmm2", "%tmm3",
2688
  "%tmm4", "%tmm5", "%tmm6", "%tmm7"
2689
};
2690
2691
static const char att_names_mask[][8] = {
2692
  "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
2693
};
2694
2695
static const char *const names_rounding[] =
2696
{
2697
  "{rn-",
2698
  "{rd-",
2699
  "{ru-",
2700
  "{rz-"
2701
};
2702
2703
static const struct dis386 reg_table[][8] = {
2704
  /* REG_80 */
2705
  {
2706
    { "addA", { Ebh1, Ib }, 0 },
2707
    { "orA",  { Ebh1, Ib }, 0 },
2708
    { "adcA", { Ebh1, Ib }, 0 },
2709
    { "sbbA", { Ebh1, Ib }, 0 },
2710
    { "andA", { Ebh1, Ib }, 0 },
2711
    { "subA", { Ebh1, Ib }, 0 },
2712
    { "xorA", { Ebh1, Ib }, 0 },
2713
    { "cmpA", { Eb, Ib }, 0 },
2714
  },
2715
  /* REG_81 */
2716
  {
2717
    { "addQ", { Evh1, Iv }, 0 },
2718
    { "orQ",  { Evh1, Iv }, 0 },
2719
    { "adcQ", { Evh1, Iv }, 0 },
2720
    { "sbbQ", { Evh1, Iv }, 0 },
2721
    { "andQ", { Evh1, Iv }, 0 },
2722
    { "subQ", { Evh1, Iv }, 0 },
2723
    { "xorQ", { Evh1, Iv }, 0 },
2724
    { "cmpQ", { Ev, Iv }, 0 },
2725
  },
2726
  /* REG_83 */
2727
  {
2728
    { "addQ", { Evh1, sIb }, 0 },
2729
    { "orQ",  { Evh1, sIb }, 0 },
2730
    { "adcQ", { Evh1, sIb }, 0 },
2731
    { "sbbQ", { Evh1, sIb }, 0 },
2732
    { "andQ", { Evh1, sIb }, 0 },
2733
    { "subQ", { Evh1, sIb }, 0 },
2734
    { "xorQ", { Evh1, sIb }, 0 },
2735
    { "cmpQ", { Ev, sIb }, 0 },
2736
  },
2737
  /* REG_8F */
2738
  {
2739
    { "pop{P|}", { stackEv }, 0 },
2740
    { XOP_8F_TABLE () },
2741
    { Bad_Opcode },
2742
    { Bad_Opcode },
2743
    { Bad_Opcode },
2744
    { XOP_8F_TABLE () },
2745
  },
2746
  /* REG_C0 */
2747
  {
2748
    { "%NFrolA",  { VexGb, Eb, Ib }, NO_PREFIX },
2749
    { "%NFrorA",  { VexGb, Eb, Ib }, NO_PREFIX },
2750
    { "rclA", { VexGb, Eb, Ib }, NO_PREFIX },
2751
    { "rcrA", { VexGb, Eb, Ib }, NO_PREFIX },
2752
    { "%NFshlA",  { VexGb, Eb, Ib }, NO_PREFIX },
2753
    { "%NFshrA",  { VexGb, Eb, Ib }, NO_PREFIX },
2754
    { "%NFshlA",  { VexGb, Eb, Ib }, NO_PREFIX },
2755
    { "%NFsarA",  { VexGb, Eb, Ib }, NO_PREFIX },
2756
  },
2757
  /* REG_C1 */
2758
  {
2759
    { "%NFrolQ",  { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
2760
    { "%NFrorQ",  { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
2761
    { "rclQ", { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
2762
    { "rcrQ", { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
2763
    { "%NFshlQ",  { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
2764
    { "%NFshrQ",  { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
2765
    { "%NFshlQ",  { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
2766
    { "%NFsarQ",  { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
2767
  },
2768
  /* REG_C6 */
2769
  {
2770
    { "movA", { Ebh3, Ib }, 0 },
2771
    { Bad_Opcode },
2772
    { Bad_Opcode },
2773
    { Bad_Opcode },
2774
    { Bad_Opcode },
2775
    { Bad_Opcode },
2776
    { Bad_Opcode },
2777
    { RM_TABLE (RM_C6_REG_7) },
2778
  },
2779
  /* REG_C7 */
2780
  {
2781
    { "movQ", { Evh3, Iv }, 0 },
2782
    { Bad_Opcode },
2783
    { Bad_Opcode },
2784
    { Bad_Opcode },
2785
    { Bad_Opcode },
2786
    { Bad_Opcode },
2787
    { Bad_Opcode },
2788
    { RM_TABLE (RM_C7_REG_7) },
2789
  },
2790
  /* REG_D0 */
2791
  {
2792
    { "%NFrolA",  { VexGb, Eb, I1 }, NO_PREFIX },
2793
    { "%NFrorA",  { VexGb, Eb, I1 }, NO_PREFIX },
2794
    { "rclA", { VexGb, Eb, I1 }, NO_PREFIX },
2795
    { "rcrA", { VexGb, Eb, I1 }, NO_PREFIX },
2796
    { "%NFshlA",  { VexGb, Eb, I1 }, NO_PREFIX },
2797
    { "%NFshrA",  { VexGb, Eb, I1 }, NO_PREFIX },
2798
    { "%NFshlA",  { VexGb, Eb, I1 }, NO_PREFIX },
2799
    { "%NFsarA",  { VexGb, Eb, I1 }, NO_PREFIX },
2800
  },
2801
  /* REG_D1 */
2802
  {
2803
    { "%NFrolQ",  { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
2804
    { "%NFrorQ",  { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
2805
    { "rclQ", { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
2806
    { "rcrQ", { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
2807
    { "%NFshlQ",  { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
2808
    { "%NFshrQ",  { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
2809
    { "%NFshlQ",  { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
2810
    { "%NFsarQ",  { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
2811
  },
2812
  /* REG_D2 */
2813
  {
2814
    { "%NFrolA",  { VexGb, Eb, CL }, NO_PREFIX },
2815
    { "%NFrorA",  { VexGb, Eb, CL }, NO_PREFIX },
2816
    { "rclA", { VexGb, Eb, CL }, NO_PREFIX },
2817
    { "rcrA", { VexGb, Eb, CL }, NO_PREFIX },
2818
    { "%NFshlA",  { VexGb, Eb, CL }, NO_PREFIX },
2819
    { "%NFshrA",  { VexGb, Eb, CL }, NO_PREFIX },
2820
    { "%NFshlA",  { VexGb, Eb, CL }, NO_PREFIX },
2821
    { "%NFsarA",  { VexGb, Eb, CL }, NO_PREFIX },
2822
  },
2823
  /* REG_D3 */
2824
  {
2825
    { "%NFrolQ",  { VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
2826
    { "%NFrorQ",  { VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
2827
    { "rclQ", { VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
2828
    { "rcrQ", { VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
2829
    { "%NFshlQ",  { VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
2830
    { "%NFshrQ",  { VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
2831
    { "%NFshlQ",  { VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
2832
    { "%NFsarQ",  { VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
2833
  },
2834
  /* REG_F6 */
2835
  {
2836
    { "testA",  { Eb, Ib }, 0 },
2837
    { "testA",  { Eb, Ib }, 0 },
2838
    { "notA", { Ebh1 }, 0 },
2839
    { "negA", { Ebh1 }, 0 },
2840
    { "mulA", { Eb }, 0 },  /* Don't print the implicit %al register,  */
2841
    { "imulA",  { Eb }, 0 },  /* to distinguish these opcodes from other */
2842
    { "divA", { Eb }, 0 },  /* mul/imul opcodes.  Do the same for div  */
2843
    { "idivA",  { Eb }, 0 },  /* and idiv for consistency.       */
2844
  },
2845
  /* REG_F7 */
2846
  {
2847
    { "testQ",  { Ev, Iv }, 0 },
2848
    { "testQ",  { Ev, Iv }, 0 },
2849
    { "notQ", { Evh1 }, 0 },
2850
    { "negQ", { Evh1 }, 0 },
2851
    { "mulQ", { Ev }, 0 },  /* Don't print the implicit register.  */
2852
    { "imulQ",  { Ev }, 0 },
2853
    { "divQ", { Ev }, 0 },
2854
    { "idivQ",  { Ev }, 0 },
2855
  },
2856
  /* REG_FE */
2857
  {
2858
    { "incA", { Ebh1 }, 0 },
2859
    { "decA", { Ebh1 }, 0 },
2860
  },
2861
  /* REG_FF */
2862
  {
2863
    { "incQ", { Evh1 }, 0 },
2864
    { "decQ", { Evh1 }, 0 },
2865
    { "call{@|}", { NOTRACK, indirEv, BND }, 0 },
2866
    { "{l|}call^", { indirEp }, 0 },
2867
    { "jmp{@|}", { NOTRACK, indirEv, BND }, 0 },
2868
    { "{l|}jmp^", { indirEp }, 0 },
2869
    { "push{P|}", { stackEv }, 0 },
2870
    { Bad_Opcode },
2871
  },
2872
  /* REG_0F00 */
2873
  {
2874
    { "sldtD",  { Sv }, 0 },
2875
    { "strD", { Sv }, 0 },
2876
    { "lldtD",  { Sv }, 0 },
2877
    { "ltrD", { Sv }, 0 },
2878
    { "verrD",  { Sv }, 0 },
2879
    { "verwD",  { Sv }, 0 },
2880
    { X86_64_TABLE (X86_64_0F00_REG_6) },
2881
    { Bad_Opcode },
2882
  },
2883
  /* REG_0F01 */
2884
  {
2885
    { MOD_TABLE (MOD_0F01_REG_0) },
2886
    { MOD_TABLE (MOD_0F01_REG_1) },
2887
    { MOD_TABLE (MOD_0F01_REG_2) },
2888
    { MOD_TABLE (MOD_0F01_REG_3) },
2889
    { "smswD",  { Sv }, 0 },
2890
    { MOD_TABLE (MOD_0F01_REG_5) },
2891
    { "lmsw", { Ew }, 0 },
2892
    { MOD_TABLE (MOD_0F01_REG_7) },
2893
  },
2894
  /* REG_0F0D */
2895
  {
2896
    { "prefetch", { Mb }, 0 },
2897
    { "prefetchw",  { Mb }, 0 },
2898
    { "prefetchwt1",  { Mb }, 0 },
2899
    { "prefetch", { Mb }, 0 },
2900
    { "prefetch", { Mb }, 0 },
2901
    { "prefetch", { Mb }, 0 },
2902
    { "prefetch", { Mb }, 0 },
2903
    { "prefetch", { Mb }, 0 },
2904
  },
2905
  /* REG_0F18 */
2906
  {
2907
    { MOD_TABLE (MOD_0F18_REG_0) },
2908
    { MOD_TABLE (MOD_0F18_REG_1) },
2909
    { MOD_TABLE (MOD_0F18_REG_2) },
2910
    { MOD_TABLE (MOD_0F18_REG_3) },
2911
    { MOD_TABLE (MOD_0F18_REG_4) },
2912
    { "nopQ",   { Ev }, 0 },
2913
    { MOD_TABLE (MOD_0F18_REG_6) },
2914
    { MOD_TABLE (MOD_0F18_REG_7) },
2915
  },
2916
  /* REG_0F1C_P_0_MOD_0 */
2917
  {
2918
    { "cldemote", { Mb }, 0 },
2919
    { "nopQ",   { Ev }, 0 },
2920
    { "nopQ",   { Ev }, 0 },
2921
    { "nopQ",   { Ev }, 0 },
2922
    { "nopQ",   { Ev }, 0 },
2923
    { "nopQ",   { Ev }, 0 },
2924
    { "nopQ",   { Ev }, 0 },
2925
    { "nopQ",   { Ev }, 0 },
2926
  },
2927
  /* REG_0F1E_P_1_MOD_3 */
2928
  {
2929
    { "nopQ",   { Ev }, PREFIX_IGNORED },
2930
    { "rdsspK",   { Edq }, 0 },
2931
    { "nopQ",   { Ev }, PREFIX_IGNORED },
2932
    { "nopQ",   { Ev }, PREFIX_IGNORED },
2933
    { "nopQ",   { Ev }, PREFIX_IGNORED },
2934
    { "nopQ",   { Ev }, PREFIX_IGNORED },
2935
    { "nopQ",   { Ev }, PREFIX_IGNORED },
2936
    { RM_TABLE (RM_0F1E_P_1_MOD_3_REG_7) },
2937
  },
2938
  /* REG_0F38D8_PREFIX_1 */
2939
  {
2940
    { "aesencwide128kl",  { M }, 0 },
2941
    { "aesdecwide128kl",  { M }, 0 },
2942
    { "aesencwide256kl",  { M }, 0 },
2943
    { "aesdecwide256kl",  { M }, 0 },
2944
  },
2945
  /* REG_0F3A0F_P_1 */
2946
  {
2947
    { RM_TABLE (RM_0F3A0F_P_1_R_0) },
2948
  },
2949
  /* REG_0F71 */
2950
  {
2951
    { Bad_Opcode },
2952
    { Bad_Opcode },
2953
    { "psrlw",    { Nq, Ib }, PREFIX_OPCODE },
2954
    { Bad_Opcode },
2955
    { "psraw",    { Nq, Ib }, PREFIX_OPCODE },
2956
    { Bad_Opcode },
2957
    { "psllw",    { Nq, Ib }, PREFIX_OPCODE },
2958
  },
2959
  /* REG_0F72 */
2960
  {
2961
    { Bad_Opcode },
2962
    { Bad_Opcode },
2963
    { "psrld",    { Nq, Ib }, PREFIX_OPCODE },
2964
    { Bad_Opcode },
2965
    { "psrad",    { Nq, Ib }, PREFIX_OPCODE },
2966
    { Bad_Opcode },
2967
    { "pslld",    { Nq, Ib }, PREFIX_OPCODE },
2968
  },
2969
  /* REG_0F73 */
2970
  {
2971
    { Bad_Opcode },
2972
    { Bad_Opcode },
2973
    { "psrlq",    { Nq, Ib }, PREFIX_OPCODE },
2974
    { "psrldq",   { Ux, Ib }, PREFIX_DATA },
2975
    { Bad_Opcode },
2976
    { Bad_Opcode },
2977
    { "psllq",    { Nq, Ib }, PREFIX_OPCODE },
2978
    { "pslldq",   { Ux, Ib }, PREFIX_DATA },
2979
  },
2980
  /* REG_0FA6 */
2981
  {
2982
    { PREFIX_TABLE (PREFIX_0FA6_REG_0) },
2983
    { "xsha1",    { { OP_0f07, 0 } }, 0 },
2984
    { "xsha256",  { { OP_0f07, 0 } }, 0 },
2985
    { "xsha384",  { { OP_0f07, 0 } }, 0 },
2986
    { "xsha512",  { { OP_0f07, 0 } }, 0 },
2987
    { PREFIX_TABLE (PREFIX_0FA6_REG_5) },
2988
    { "montmul2", { { OP_0f07, 0 } }, 0 },
2989
    { "xmodexp",  { { OP_0f07, 0 } }, 0 },
2990
  },
2991
  /* REG_0FA7 */
2992
  {
2993
    { "xstore-rng", { { OP_0f07, 0 } }, 0 },
2994
    { "xcrypt-ecb", { { OP_0f07, 0 } }, 0 },
2995
    { "xcrypt-cbc", { { OP_0f07, 0 } }, 0 },
2996
    { "xcrypt-ctr", { { OP_0f07, 0 } }, 0 },
2997
    { "xcrypt-cfb", { { OP_0f07, 0 } }, 0 },
2998
    { "xcrypt-ofb", { { OP_0f07, 0 } }, 0 },
2999
    { PREFIX_TABLE (PREFIX_0FA7_REG_6) },
3000
    { "xrng2",    { { OP_0f07, 0 } }, 0 },
3001
  },
3002
  /* REG_0FAE */
3003
  {
3004
    { MOD_TABLE (MOD_0FAE_REG_0) },
3005
    { MOD_TABLE (MOD_0FAE_REG_1) },
3006
    { MOD_TABLE (MOD_0FAE_REG_2) },
3007
    { MOD_TABLE (MOD_0FAE_REG_3) },
3008
    { MOD_TABLE (MOD_0FAE_REG_4) },
3009
    { MOD_TABLE (MOD_0FAE_REG_5) },
3010
    { MOD_TABLE (MOD_0FAE_REG_6) },
3011
    { MOD_TABLE (MOD_0FAE_REG_7) },
3012
  },
3013
  /* REG_0FBA */
3014
  {
3015
    { Bad_Opcode },
3016
    { Bad_Opcode },
3017
    { Bad_Opcode },
3018
    { Bad_Opcode },
3019
    { "btQ",  { Ev, Ib }, 0 },
3020
    { "btsQ", { Evh1, Ib }, 0 },
3021
    { "btrQ", { Evh1, Ib }, 0 },
3022
    { "btcQ", { Evh1, Ib }, 0 },
3023
  },
3024
  /* REG_0FC7 */
3025
  {
3026
    { Bad_Opcode },
3027
    { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } }, 0 },
3028
    { Bad_Opcode },
3029
    { "xrstors", { FXSAVE }, PREFIX_REX2_ILLEGAL },
3030
    { "xsavec", { FXSAVE }, PREFIX_REX2_ILLEGAL },
3031
    { "xsaves", { FXSAVE }, PREFIX_REX2_ILLEGAL },
3032
    { MOD_TABLE (MOD_0FC7_REG_6) },
3033
    { MOD_TABLE (MOD_0FC7_REG_7) },
3034
  },
3035
  /* REG_VEX_0F71 */
3036
  {
3037
    { Bad_Opcode },
3038
    { Bad_Opcode },
3039
    { "vpsrlw",   { Vex, Ux, Ib }, PREFIX_DATA },
3040
    { Bad_Opcode },
3041
    { "vpsraw",   { Vex, Ux, Ib }, PREFIX_DATA },
3042
    { Bad_Opcode },
3043
    { "vpsllw",   { Vex, Ux, Ib }, PREFIX_DATA },
3044
  },
3045
  /* REG_VEX_0F72 */
3046
  {
3047
    { Bad_Opcode },
3048
    { Bad_Opcode },
3049
    { "vpsrld",   { Vex, Ux, Ib }, PREFIX_DATA },
3050
    { Bad_Opcode },
3051
    { "vpsrad",   { Vex, Ux, Ib }, PREFIX_DATA },
3052
    { Bad_Opcode },
3053
    { "vpslld",   { Vex, Ux, Ib }, PREFIX_DATA },
3054
  },
3055
  /* REG_VEX_0F73 */
3056
  {
3057
    { Bad_Opcode },
3058
    { Bad_Opcode },
3059
    { "vpsrlq",   { Vex, Ux, Ib }, PREFIX_DATA },
3060
    { "vpsrldq",  { Vex, Ux, Ib }, PREFIX_DATA },
3061
    { Bad_Opcode },
3062
    { Bad_Opcode },
3063
    { "vpsllq",   { Vex, Ux, Ib }, PREFIX_DATA },
3064
    { "vpslldq",  { Vex, Ux, Ib }, PREFIX_DATA },
3065
  },
3066
  /* REG_VEX_0FAE */
3067
  {
3068
    { Bad_Opcode },
3069
    { Bad_Opcode },
3070
    { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2) },
3071
    { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3) },
3072
  },
3073
  /* REG_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0 */
3074
  {
3075
    { RM_TABLE (RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0_R_0) },
3076
  },
3077
  /* REG_VEX_0F38F3_L_0_P_0 */
3078
  {
3079
    { Bad_Opcode },
3080
    { "%NFblsrS",   { VexGdq, Edq }, 0 },
3081
    { "%NFblsmskS",   { VexGdq, Edq }, 0 },
3082
    { "%NFblsiS",   { VexGdq, Edq }, 0 },
3083
  },
3084
  /* REG_VEX_MAP7_F6_L_0_W_0 */
3085
  {
3086
    { X86_64_TABLE (X86_64_VEX_MAP7_F6_L_0_W_0_R_0) },
3087
  },
3088
  /* REG_VEX_MAP7_F8_L_0_W_0 */
3089
  {
3090
    { X86_64_TABLE (X86_64_VEX_MAP7_F8_L_0_W_0_R_0) },
3091
  },
3092
  /* REG_XOP_09_01_L_0 */
3093
  {
3094
    { Bad_Opcode },
3095
    { "blcfill",  { VexGdq, Edq }, 0 },
3096
    { "blsfill",  { VexGdq, Edq }, 0 },
3097
    { "blcs", { VexGdq, Edq }, 0 },
3098
    { "tzmsk",  { VexGdq, Edq }, 0 },
3099
    { "blcic",  { VexGdq, Edq }, 0 },
3100
    { "blsic",  { VexGdq, Edq }, 0 },
3101
    { "t1mskc", { VexGdq, Edq }, 0 },
3102
  },
3103
  /* REG_XOP_09_02_L_0 */
3104
  {
3105
    { Bad_Opcode },
3106
    { "blcmsk", { VexGdq, Edq }, 0 },
3107
    { Bad_Opcode },
3108
    { Bad_Opcode },
3109
    { Bad_Opcode },
3110
    { Bad_Opcode },
3111
    { "blci", { VexGdq, Edq }, 0 },
3112
  },
3113
  /* REG_XOP_09_12_L_0 */
3114
  {
3115
    { "llwpcb", { Rdq }, 0 },
3116
    { "slwpcb", { Rdq }, 0 },
3117
  },
3118
  /* REG_XOP_0A_12_L_0 */
3119
  {
3120
    { "lwpins", { VexGdq, Ed, Id }, 0 },
3121
    { "lwpval", { VexGdq, Ed, Id }, 0 },
3122
  },
3123
3124
#include "i386-dis-evex-reg.h"
3125
};
3126
3127
static const struct dis386 prefix_table[][4] = {
3128
  /* PREFIX_90 */
3129
  {
3130
    { "xchgS", { { NOP_Fixup, 0 }, { NOP_Fixup, 1 } }, 0 },
3131
    { "pause", { XX }, 0 },
3132
    { "xchgS", { { NOP_Fixup, 0 }, { NOP_Fixup, 1 } }, 0 },
3133
    { NULL, { { NULL, 0 } }, PREFIX_IGNORED }
3134
  },
3135
3136
  /* PREFIX_0F00_REG_6_X86_64 */
3137
  {
3138
    { Bad_Opcode },
3139
    { Bad_Opcode },
3140
    { Bad_Opcode },
3141
    { "lkgsD", { Sv }, 0 },
3142
  },
3143
3144
  /* PREFIX_0F01_REG_0_MOD_3_RM_6 */
3145
  {
3146
    { "wrmsrns",        { Skip_MODRM }, 0 },
3147
    { X86_64_TABLE (X86_64_0F01_REG_0_MOD_3_RM_6_P_1) },
3148
    { Bad_Opcode },
3149
    { X86_64_TABLE (X86_64_0F01_REG_0_MOD_3_RM_6_P_3) },
3150
  },
3151
3152
  /* PREFIX_0F01_REG_0_MOD_3_RM_7 */
3153
  {
3154
    { X86_64_TABLE (X86_64_0F01_REG_0_MOD_3_RM_7_P_0) },
3155
  },
3156
3157
  /* PREFIX_0F01_REG_1_RM_2 */
3158
  {
3159
    { "clac",   { Skip_MODRM }, 0 },
3160
    { X86_64_TABLE (X86_64_0F01_REG_1_RM_2_PREFIX_1) },
3161
    { Bad_Opcode },
3162
    { X86_64_TABLE (X86_64_0F01_REG_1_RM_2_PREFIX_3)},
3163
  },
3164
3165
  /* PREFIX_0F01_REG_1_RM_4 */
3166
  {
3167
    { Bad_Opcode },
3168
    { Bad_Opcode },
3169
    { "tdcall",   { Skip_MODRM }, 0 },
3170
    { Bad_Opcode },
3171
  },
3172
3173
  /* PREFIX_0F01_REG_1_RM_5 */
3174
  {
3175
    { Bad_Opcode },
3176
    { Bad_Opcode },
3177
    { X86_64_TABLE (X86_64_0F01_REG_1_RM_5_PREFIX_2) },
3178
    { Bad_Opcode },
3179
  },
3180
3181
  /* PREFIX_0F01_REG_1_RM_6 */
3182
  {
3183
    { Bad_Opcode },
3184
    { Bad_Opcode },
3185
    { X86_64_TABLE (X86_64_0F01_REG_1_RM_6_PREFIX_2) },
3186
    { Bad_Opcode },
3187
  },
3188
3189
  /* PREFIX_0F01_REG_1_RM_7 */
3190
  {
3191
    { "encls",    { Skip_MODRM }, 0 },
3192
    { Bad_Opcode },
3193
    { X86_64_TABLE (X86_64_0F01_REG_1_RM_7_PREFIX_2) },
3194
    { Bad_Opcode },
3195
  },
3196
3197
  /* PREFIX_0F01_REG_3_RM_1 */
3198
  {
3199
    { "vmmcall",  { Skip_MODRM }, 0 },
3200
    { "vmgexit",  { Skip_MODRM }, 0 },
3201
    { Bad_Opcode },
3202
    { "vmgexit",  { Skip_MODRM }, 0 },
3203
  },
3204
3205
  /* PREFIX_0F01_REG_5_MOD_0 */
3206
  {
3207
    { Bad_Opcode },
3208
    { "rstorssp", { Mq }, PREFIX_OPCODE },
3209
  },
3210
3211
  /* PREFIX_0F01_REG_5_MOD_3_RM_0 */
3212
  {
3213
    { "serialize",  { Skip_MODRM }, PREFIX_OPCODE },
3214
    { "setssbsy", { Skip_MODRM }, PREFIX_OPCODE },
3215
    { Bad_Opcode },
3216
    { "xsusldtrk",  { Skip_MODRM }, PREFIX_OPCODE },
3217
  },
3218
3219
  /* PREFIX_0F01_REG_5_MOD_3_RM_1 */
3220
  {
3221
    { Bad_Opcode },
3222
    { Bad_Opcode },
3223
    { Bad_Opcode },
3224
    { "xresldtrk",     { Skip_MODRM }, PREFIX_OPCODE },
3225
  },
3226
3227
  /* PREFIX_0F01_REG_5_MOD_3_RM_2 */
3228
  {
3229
    { Bad_Opcode },
3230
    { "saveprevssp",  { Skip_MODRM }, PREFIX_OPCODE },
3231
  },
3232
3233
  /* PREFIX_0F01_REG_5_MOD_3_RM_4 */
3234
  {
3235
    { Bad_Opcode },
3236
    { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1) },
3237
  },
3238
3239
  /* PREFIX_0F01_REG_5_MOD_3_RM_5 */
3240
  {
3241
    { Bad_Opcode },
3242
    { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1) },
3243
  },
3244
3245
  /* PREFIX_0F01_REG_5_MOD_3_RM_6 */
3246
  {
3247
    { "rdpkru", { Skip_MODRM }, 0 },
3248
    { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1) },
3249
  },
3250
3251
  /* PREFIX_0F01_REG_5_MOD_3_RM_7 */
3252
  {
3253
    { "wrpkru", { Skip_MODRM }, 0 },
3254
    { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1) },
3255
  },
3256
3257
  /* PREFIX_0F01_REG_7_MOD_3_RM_2 */
3258
  {
3259
    { "monitorx", { { OP_Monitor, 0 } }, 0  },
3260
    { "mcommit",  { Skip_MODRM }, 0 },
3261
  },
3262
3263
  /* PREFIX_0F01_REG_7_MOD_3_RM_5 */
3264
  {
3265
    { "rdpru", { Skip_MODRM }, 0 },
3266
    { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_1) },
3267
    { Bad_Opcode },
3268
    { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_3) },
3269
  },
3270
3271
  /* PREFIX_0F01_REG_7_MOD_3_RM_6 */
3272
  {
3273
    { "invlpgb",        { Skip_MODRM }, 0 },
3274
    { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1) },
3275
    { Bad_Opcode },
3276
    { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3) },
3277
  },
3278
3279
  /* PREFIX_0F01_REG_7_MOD_3_RM_7 */
3280
  {
3281
    { "tlbsync",        { Skip_MODRM }, 0 },
3282
    { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1) },
3283
    { Bad_Opcode },
3284
    { "pvalidate",      { Skip_MODRM }, 0 },
3285
  },
3286
3287
  /* PREFIX_0F09 */
3288
  {
3289
    { "wbinvd",   { XX }, 0 },
3290
    { "wbnoinvd", { XX }, 0 },
3291
  },
3292
3293
  /* PREFIX_0F10 */
3294
  {
3295
    { "%XEVmovupX", { XM, EXEvexXNoBcst }, 0 },
3296
    { "%XEVmovs%XS",  { XMScalar, VexScalarR, EXd }, 0 },
3297
    { "%XEVmovupX", { XM, EXEvexXNoBcst }, 0 },
3298
    { "%XEVmovs%XD",  { XMScalar, VexScalarR, EXq }, 0 },
3299
  },
3300
3301
  /* PREFIX_0F11 */
3302
  {
3303
    { "%XEVmovupX", { EXxS, XM }, 0 },
3304
    { "%XEVmovs%XS",  { EXdS, VexScalarR, XMScalar }, 0 },
3305
    { "%XEVmovupX", { EXxS, XM }, 0 },
3306
    { "%XEVmovs%XD",  { EXqS, VexScalarR, XMScalar }, 0 },
3307
  },
3308
3309
  /* PREFIX_0F12 */
3310
  {
3311
    { MOD_TABLE (MOD_0F12_PREFIX_0) },
3312
    { "movsldup", { XM, EXx }, 0 },
3313
    { "%XEVmovlpYX",  { XM, Vex, Mq }, 0 },
3314
    { "movddup",  { XM, EXq }, 0 },
3315
  },
3316
3317
  /* PREFIX_0F16 */
3318
  {
3319
    { MOD_TABLE (MOD_0F16_PREFIX_0) },
3320
    { "movshdup", { XM, EXx }, 0 },
3321
    { "%XEVmovhpYX",  { XM, Vex, Mq }, 0 },
3322
  },
3323
3324
  /* PREFIX_0F18_REG_6_MOD_0_X86_64 */
3325
  {
3326
    { "prefetchit1",  { { PREFETCHI_Fixup, b_mode } }, 0 },
3327
    { "nopQ",   { Ev }, 0 },
3328
    { "nopQ",   { Ev }, 0 },
3329
    { "nopQ",   { Ev }, 0 },
3330
  },
3331
3332
  /* PREFIX_0F18_REG_7_MOD_0_X86_64 */
3333
  {
3334
    { "prefetchit0",  { { PREFETCHI_Fixup, b_mode } }, 0 },
3335
    { "nopQ",   { Ev }, 0 },
3336
    { "nopQ",   { Ev }, 0 },
3337
    { "nopQ",   { Ev }, 0 },
3338
  },
3339
3340
  /* PREFIX_0F1A */
3341
  {
3342
    { MOD_TABLE (MOD_0F1A_PREFIX_0) },
3343
    { "bndcl",  { Gbnd, Ev_bnd }, 0 },
3344
    { "bndmov", { Gbnd, Ebnd }, 0 },
3345
    { "bndcu",  { Gbnd, Ev_bnd }, 0 },
3346
  },
3347
3348
  /* PREFIX_0F1B */
3349
  {
3350
    { MOD_TABLE (MOD_0F1B_PREFIX_0) },
3351
    { MOD_TABLE (MOD_0F1B_PREFIX_1) },
3352
    { "bndmov", { EbndS, Gbnd }, 0 },
3353
    { "bndcn",  { Gbnd, Ev_bnd }, 0 },
3354
  },
3355
3356
  /* PREFIX_0F1C */
3357
  {
3358
    { MOD_TABLE (MOD_0F1C_PREFIX_0) },
3359
    { "nopQ", { Ev }, PREFIX_IGNORED },
3360
    { "nopQ", { Ev }, 0 },
3361
    { "nopQ", { Ev }, PREFIX_IGNORED },
3362
  },
3363
3364
  /* PREFIX_0F1E */
3365
  {
3366
    { "nopQ", { Ev }, 0 },
3367
    { MOD_TABLE (MOD_0F1E_PREFIX_1) },
3368
    { "nopQ", { Ev }, 0 },
3369
    { NULL, { XX }, PREFIX_IGNORED },
3370
  },
3371
3372
  /* PREFIX_0F2A */
3373
  {
3374
    { "cvtpi2ps", { XM, EMCq }, PREFIX_OPCODE },
3375
    { "cvtsi2ss{%LQ|}", { XM, Edq }, PREFIX_OPCODE },
3376
    { "cvtpi2pd", { XM, EMCq }, PREFIX_OPCODE },
3377
    { "cvtsi2sd{%LQ|}", { XM, Edq }, 0 },
3378
  },
3379
3380
  /* PREFIX_0F2B */
3381
  {
3382
    { "movntps", { Mx, XM }, 0 },
3383
    { "movntss", { Md, XM }, 0 },
3384
    { "movntpd", { Mx, XM }, 0 },
3385
    { "movntsd", { Mq, XM }, 0 },
3386
  },
3387
3388
  /* PREFIX_0F2C */
3389
  {
3390
    { "cvttps2pi", { MXC, EXq }, PREFIX_OPCODE },
3391
    { "cvttss2si", { Gdq, EXd }, PREFIX_OPCODE },
3392
    { "cvttpd2pi", { MXC, EXx }, PREFIX_OPCODE },
3393
    { "cvttsd2si", { Gdq, EXq }, PREFIX_OPCODE },
3394
  },
3395
3396
  /* PREFIX_0F2D */
3397
  {
3398
    { "cvtps2pi", { MXC, EXq }, PREFIX_OPCODE },
3399
    { "cvtss2si", { Gdq, EXd }, PREFIX_OPCODE },
3400
    { "cvtpd2pi", { MXC, EXx }, PREFIX_OPCODE },
3401
    { "cvtsd2si", { Gdq, EXq }, PREFIX_OPCODE },
3402
  },
3403
3404
  /* PREFIX_0F2E */
3405
  {
3406
    { "VucomisYX",  { XMScalar, EXd, EXxEVexS }, 0 },
3407
    { Bad_Opcode },
3408
    { "VucomisYX",  { XMScalar, EXq, EXxEVexS }, 0 },
3409
  },
3410
3411
  /* PREFIX_0F2F */
3412
  {
3413
    { "VcomisYX", { XMScalar, EXd, EXxEVexS }, 0 },
3414
    { Bad_Opcode },
3415
    { "VcomisYX", { XMScalar, EXq, EXxEVexS }, 0 },
3416
  },
3417
3418
  /* PREFIX_0F51 */
3419
  {
3420
    { "%XEVsqrtpX", { XM, EXx, EXxEVexR }, 0 },
3421
    { "%XEVsqrts%XS", { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
3422
    { "%XEVsqrtpX", { XM, EXx, EXxEVexR }, 0 },
3423
    { "%XEVsqrts%XD", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3424
  },
3425
3426
  /* PREFIX_0F52 */
3427
  {
3428
    { "Vrsqrtps", { XM, EXx }, 0 },
3429
    { "Vrsqrtss", { XMScalar, VexScalar, EXd }, 0 },
3430
  },
3431
3432
  /* PREFIX_0F53 */
3433
  {
3434
    { "Vrcpps",   { XM, EXx }, 0 },
3435
    { "Vrcpss",   { XMScalar, VexScalar, EXd }, 0 },
3436
  },
3437
3438
  /* PREFIX_0F58 */
3439
  {
3440
    { "%XEVaddpX",  { XM, Vex, EXx, EXxEVexR }, 0 },
3441
    { "%XEVadds%XS",  { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
3442
    { "%XEVaddpX",  { XM, Vex, EXx, EXxEVexR }, 0 },
3443
    { "%XEVadds%XD",  { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3444
  },
3445
3446
  /* PREFIX_0F59 */
3447
  {
3448
    { "%XEVmulpX",  { XM, Vex, EXx, EXxEVexR }, 0 },
3449
    { "%XEVmuls%XS",  { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
3450
    { "%XEVmulpX",  { XM, Vex, EXx, EXxEVexR }, 0 },
3451
    { "%XEVmuls%XD",  { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3452
  },
3453
3454
  /* PREFIX_0F5A */
3455
  {
3456
    { "%XEVcvtp%XS2pd", { XM, EXEvexHalfBcstXmmq, EXxEVexS }, 0 },
3457
    { "%XEVcvts%XS2sd", { XMScalar, VexScalar, EXd, EXxEVexS }, 0 },
3458
    { "%XEVcvtp%XD2ps%XY", { XMxmmq, EXx, EXxEVexR }, 0 },
3459
    { "%XEVcvts%XD2ss", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3460
  },
3461
3462
  /* PREFIX_0F5B */
3463
  {
3464
    { "Vcvtdq2ps",  { XM, EXx }, 0 },
3465
    { "Vcvttps2dq", { XM, EXx }, 0 },
3466
    { "Vcvtps2dq",  { XM, EXx }, 0 },
3467
  },
3468
3469
  /* PREFIX_0F5C */
3470
  {
3471
    { "%XEVsubpX",  { XM, Vex, EXx, EXxEVexR }, 0 },
3472
    { "%XEVsubs%XS",  { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
3473
    { "%XEVsubpX",  { XM, Vex, EXx, EXxEVexR }, 0 },
3474
    { "%XEVsubs%XD",  { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3475
  },
3476
3477
  /* PREFIX_0F5D */
3478
  {
3479
    { "%XEVminpX",  { XM, Vex, EXx, EXxEVexS }, 0 },
3480
    { "%XEVmins%XS",  { XMScalar, VexScalar, EXd, EXxEVexS }, 0 },
3481
    { "%XEVminpX",  { XM, Vex, EXx, EXxEVexS }, 0 },
3482
    { "%XEVmins%XD",  { XMScalar, VexScalar, EXq, EXxEVexS }, 0 },
3483
  },
3484
3485
  /* PREFIX_0F5E */
3486
  {
3487
    { "%XEVdivpX",  { XM, Vex, EXx, EXxEVexR }, 0 },
3488
    { "%XEVdivs%XS",  { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
3489
    { "%XEVdivpX",  { XM, Vex, EXx, EXxEVexR }, 0 },
3490
    { "%XEVdivs%XD",  { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3491
  },
3492
3493
  /* PREFIX_0F5F */
3494
  {
3495
    { "%XEVmaxpX",  { XM, Vex, EXx, EXxEVexS }, 0 },
3496
    { "%XEVmaxs%XS",  { XMScalar, VexScalar, EXd, EXxEVexS }, 0 },
3497
    { "%XEVmaxpX",  { XM, Vex, EXx, EXxEVexS }, 0 },
3498
    { "%XEVmaxs%XD",  { XMScalar, VexScalar, EXq, EXxEVexS }, 0 },
3499
  },
3500
3501
  /* PREFIX_0F60 */
3502
  {
3503
    { "punpcklbw",{ MX, EMd }, PREFIX_OPCODE },
3504
    { Bad_Opcode },
3505
    { "punpcklbw",{ MX, EMx }, PREFIX_OPCODE },
3506
  },
3507
3508
  /* PREFIX_0F61 */
3509
  {
3510
    { "punpcklwd",{ MX, EMd }, PREFIX_OPCODE },
3511
    { Bad_Opcode },
3512
    { "punpcklwd",{ MX, EMx }, PREFIX_OPCODE },
3513
  },
3514
3515
  /* PREFIX_0F62 */
3516
  {
3517
    { "punpckldq",{ MX, EMd }, PREFIX_OPCODE },
3518
    { Bad_Opcode },
3519
    { "punpckldq",{ MX, EMx }, PREFIX_OPCODE },
3520
  },
3521
3522
  /* PREFIX_0F6F */
3523
  {
3524
    { "movq", { MX, EM }, PREFIX_OPCODE },
3525
    { "movdqu", { XM, EXx }, PREFIX_OPCODE },
3526
    { "movdqa", { XM, EXx }, PREFIX_OPCODE },
3527
  },
3528
3529
  /* PREFIX_0F70 */
3530
  {
3531
    { "pshufw", { MX, EM, Ib }, PREFIX_OPCODE },
3532
    { "pshufhw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3533
    { "pshufd", { XM, EXx, Ib }, PREFIX_OPCODE },
3534
    { "pshuflw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3535
  },
3536
3537
  /* PREFIX_0F78 */
3538
  {
3539
    {"vmread",  { Em, Gm }, 0 },
3540
    { Bad_Opcode },
3541
    {"extrq", { Uxmm, Ib, Ib }, 0 },
3542
    {"insertq", { XM, Uxmm, Ib, Ib }, 0 },
3543
  },
3544
3545
  /* PREFIX_0F79 */
3546
  {
3547
    {"vmwrite", { Gm, Em }, 0 },
3548
    { Bad_Opcode },
3549
    {"extrq", { XM, Uxmm }, 0 },
3550
    {"insertq", { XM, Uxmm }, 0 },
3551
  },
3552
3553
  /* PREFIX_0F7C */
3554
  {
3555
    { Bad_Opcode },
3556
    { Bad_Opcode },
3557
    { "Vhaddpd",  { XM, Vex, EXx }, 0 },
3558
    { "Vhaddps",  { XM, Vex, EXx }, 0 },
3559
  },
3560
3561
  /* PREFIX_0F7D */
3562
  {
3563
    { Bad_Opcode },
3564
    { Bad_Opcode },
3565
    { "Vhsubpd",  { XM, Vex, EXx }, 0 },
3566
    { "Vhsubps",  { XM, Vex, EXx }, 0 },
3567
  },
3568
3569
  /* PREFIX_0F7E */
3570
  {
3571
    { "movK", { Edq, MX }, PREFIX_OPCODE },
3572
    { "movq", { XM, EXq }, PREFIX_OPCODE },
3573
    { "movK", { Edq, XM }, PREFIX_OPCODE },
3574
  },
3575
3576
  /* PREFIX_0F7F */
3577
  {
3578
    { "movq", { EMS, MX }, PREFIX_OPCODE },
3579
    { "movdqu", { EXxS, XM }, PREFIX_OPCODE },
3580
    { "movdqa", { EXxS, XM }, PREFIX_OPCODE },
3581
  },
3582
3583
  /* PREFIX_0FA6_REG_0 */
3584
  {
3585
    { Bad_Opcode },
3586
    { "montmul",  { { MONTMUL_Fixup, 0 } }, 0},
3587
    { Bad_Opcode },
3588
    { "sm2",  { Skip_MODRM }, 0 },
3589
  },
3590
3591
  /* PREFIX_0FA6_REG_5 */
3592
  {
3593
    { Bad_Opcode },
3594
    { "sm3",  { Skip_MODRM }, 0 },
3595
  },
3596
3597
  /* PREFIX_0FA7_REG_6 */
3598
  {
3599
    { Bad_Opcode },
3600
    { "sm4",  { Skip_MODRM }, 0 },
3601
  },
3602
3603
  /* PREFIX_0FAE_REG_0_MOD_3 */
3604
  {
3605
    { Bad_Opcode },
3606
    { X86_64_TABLE (X86_64_0FAE_REG_0_MOD_3_PREFIX_1) },
3607
  },
3608
3609
  /* PREFIX_0FAE_REG_1_MOD_3 */
3610
  {
3611
    { Bad_Opcode },
3612
    { X86_64_TABLE (X86_64_0FAE_REG_1_MOD_3_PREFIX_1) },
3613
  },
3614
3615
  /* PREFIX_0FAE_REG_2_MOD_3 */
3616
  {
3617
    { Bad_Opcode },
3618
    { X86_64_TABLE (X86_64_0FAE_REG_2_MOD_3_PREFIX_1) },
3619
  },
3620
3621
  /* PREFIX_0FAE_REG_3_MOD_3 */
3622
  {
3623
    { Bad_Opcode },
3624
    { X86_64_TABLE (X86_64_0FAE_REG_3_MOD_3_PREFIX_1) },
3625
  },
3626
3627
  /* PREFIX_0FAE_REG_4_MOD_0 */
3628
  {
3629
    { "xsave",  { FXSAVE }, PREFIX_REX2_ILLEGAL },
3630
    { "ptwrite{%LQ|}", { Edq }, 0 },
3631
  },
3632
3633
  /* PREFIX_0FAE_REG_4_MOD_3 */
3634
  {
3635
    { Bad_Opcode },
3636
    { "ptwrite{%LQ|}", { Edq }, 0 },
3637
  },
3638
3639
  /* PREFIX_0FAE_REG_5_MOD_3 */
3640
  {
3641
    { "lfence",   { Skip_MODRM }, 0 },
3642
    { "incsspK",  { Edq }, PREFIX_OPCODE },
3643
  },
3644
3645
  /* PREFIX_0FAE_REG_6_MOD_0 */
3646
  {
3647
    { "xsaveopt", { FXSAVE }, PREFIX_OPCODE | PREFIX_REX2_ILLEGAL },
3648
    { "clrssbsy", { Mq }, PREFIX_OPCODE },
3649
    { "clwb", { Mb }, PREFIX_OPCODE },
3650
  },
3651
3652
  /* PREFIX_0FAE_REG_6_MOD_3 */
3653
  {
3654
    { RM_TABLE (RM_0FAE_REG_6_MOD_3_P_0) },
3655
    { "umonitor", { Eva }, PREFIX_OPCODE },
3656
    { "tpause", { Edq }, PREFIX_OPCODE },
3657
    { "umwait", { Edq }, PREFIX_OPCODE },
3658
  },
3659
3660
  /* PREFIX_0FAE_REG_7_MOD_0 */
3661
  {
3662
    { "clflush",  { Mb }, 0 },
3663
    { Bad_Opcode },
3664
    { "clflushopt", { Mb }, 0 },
3665
  },
3666
3667
  /* PREFIX_0FB8 */
3668
  {
3669
    { Bad_Opcode },
3670
    { "popcntS", { Gv, Ev }, 0 },
3671
  },
3672
3673
  /* PREFIX_0FBC */
3674
  {
3675
    { "bsfS", { Gv, Ev }, 0 },
3676
    { "tzcntS", { Gv, Ev }, 0 },
3677
    { "bsfS", { Gv, Ev }, 0 },
3678
  },
3679
3680
  /* PREFIX_0FBD */
3681
  {
3682
    { "bsrS", { Gv, Ev }, 0 },
3683
    { "lzcntS", { Gv, Ev }, 0 },
3684
    { "bsrS", { Gv, Ev }, 0 },
3685
  },
3686
3687
  /* PREFIX_0FC2 */
3688
  {
3689
    { "VcmppX", { XM, Vex, EXx, CMP }, 0 },
3690
    { "Vcmpss", { XMScalar, VexScalar, EXd, CMP }, 0 },
3691
    { "VcmppX", { XM, Vex, EXx, CMP }, 0 },
3692
    { "Vcmpsd", { XMScalar, VexScalar, EXq, CMP }, 0 },
3693
  },
3694
3695
  /* PREFIX_0FC7_REG_6_MOD_0 */
3696
  {
3697
    { "vmptrld",{ Mq }, 0 },
3698
    { "vmxon",  { Mq }, 0 },
3699
    { "vmclear",{ Mq }, 0 },
3700
  },
3701
3702
  /* PREFIX_0FC7_REG_6_MOD_3 */
3703
  {
3704
    { "rdrand", { Ev }, 0 },
3705
    { X86_64_TABLE (X86_64_0FC7_REG_6_MOD_3_PREFIX_1) },
3706
    { "rdrand", { Ev }, 0 }
3707
  },
3708
3709
  /* PREFIX_0FC7_REG_7_MOD_3 */
3710
  {
3711
    { "rdseed", { Ev }, 0 },
3712
    { "rdpid",  { Em }, 0 },
3713
    { "rdseed", { Ev }, 0 },
3714
  },
3715
3716
  /* PREFIX_0FD0 */
3717
  {
3718
    { Bad_Opcode },
3719
    { Bad_Opcode },
3720
    { "VaddsubpX",  { XM, Vex, EXx }, 0 },
3721
    { "VaddsubpX",  { XM, Vex, EXx }, 0 },
3722
  },
3723
3724
  /* PREFIX_0FD6 */
3725
  {
3726
    { Bad_Opcode },
3727
    { "movq2dq",{ XM, Nq }, 0 },
3728
    { "movq", { EXqS, XM }, 0 },
3729
    { "movdq2q",{ MX, Ux }, 0 },
3730
  },
3731
3732
  /* PREFIX_0FE6 */
3733
  {
3734
    { Bad_Opcode },
3735
    { "Vcvtdq2pd",  { XM, EXxmmq }, 0 },
3736
    { "Vcvttpd2dq%XY",  { XMM, EXx }, 0 },
3737
    { "Vcvtpd2dq%XY", { XMM, EXx }, 0 },
3738
  },
3739
3740
  /* PREFIX_0FE7 */
3741
  {
3742
    { "movntq",   { Mq, MX }, 0 },
3743
    { Bad_Opcode },
3744
    { "movntdq",  { Mx, XM }, 0 },
3745
  },
3746
3747
  /* PREFIX_0FF0 */
3748
  {
3749
    { Bad_Opcode },
3750
    { Bad_Opcode },
3751
    { Bad_Opcode },
3752
    { "Vlddqu",   { XM, M }, 0 },
3753
  },
3754
3755
  /* PREFIX_0FF7 */
3756
  {
3757
    { "maskmovq", { MX, Nq }, PREFIX_OPCODE },
3758
    { Bad_Opcode },
3759
    { "maskmovdqu", { XM, Ux }, PREFIX_OPCODE },
3760
  },
3761
3762
  /* PREFIX_0F38D8 */
3763
  {
3764
    { Bad_Opcode },
3765
    { REG_TABLE (REG_0F38D8_PREFIX_1) },
3766
  },
3767
3768
  /* PREFIX_0F38DC */
3769
  {
3770
    { Bad_Opcode },
3771
    { MOD_TABLE (MOD_0F38DC_PREFIX_1) },
3772
    { "aesenc", { XM, EXx }, 0 },
3773
  },
3774
3775
  /* PREFIX_0F38DD */
3776
  {
3777
    { Bad_Opcode },
3778
    { "aesdec128kl", { XM, M }, 0 },
3779
    { "aesenclast", { XM, EXx }, 0 },
3780
  },
3781
3782
  /* PREFIX_0F38DE */
3783
  {
3784
    { Bad_Opcode },
3785
    { "aesenc256kl", { XM, M }, 0 },
3786
    { "aesdec", { XM, EXx }, 0 },
3787
  },
3788
3789
  /* PREFIX_0F38DF */
3790
  {
3791
    { Bad_Opcode },
3792
    { "aesdec256kl", { XM, M }, 0 },
3793
    { "aesdeclast", { XM, EXx }, 0 },
3794
  },
3795
3796
  /* PREFIX_0F38F0 */
3797
  {
3798
    { "movbeS", { Gv, Mv }, PREFIX_OPCODE },
3799
    { Bad_Opcode },
3800
    { "movbeS", { Gv, Mv }, PREFIX_OPCODE },
3801
    { "crc32A", { Gdq, Eb }, PREFIX_OPCODE },
3802
  },
3803
3804
  /* PREFIX_0F38F1 */
3805
  {
3806
    { "movbeS", { Mv, Gv }, PREFIX_OPCODE },
3807
    { Bad_Opcode },
3808
    { "movbeS", { Mv, Gv }, PREFIX_OPCODE },
3809
    { "crc32Q", { Gdq, Ev }, PREFIX_OPCODE },
3810
  },
3811
3812
  /* PREFIX_0F38F6 */
3813
  {
3814
    { "wrssK",  { M, Gdq }, 0 },
3815
    { "adoxL",  { VexGdq, Gdq, Edq }, 0 },
3816
    { "adcxL",  { VexGdq, Gdq, Edq }, 0 },
3817
    { Bad_Opcode },
3818
  },
3819
3820
  /* PREFIX_0F38F8_M_0 */
3821
  {
3822
    { Bad_Opcode },
3823
    { "enqcmds", { Gva, M }, 0 },
3824
    { "movdir64b", { Gva, M }, 0 },
3825
    { "enqcmd", { Gva, M }, 0 },
3826
  },
3827
3828
  /* PREFIX_0F38F8_M_1_X86_64 */
3829
  {
3830
    { Bad_Opcode },
3831
    { "uwrmsr",   { Gq, Rq }, 0 },
3832
    { Bad_Opcode },
3833
    { "urdmsr",   { Rq, Gq }, 0 },
3834
  },
3835
3836
  /* PREFIX_0F38FA */
3837
  {
3838
    { Bad_Opcode },
3839
    { "encodekey128", { Gd, Rd }, 0 },
3840
  },
3841
3842
  /* PREFIX_0F38FB */
3843
  {
3844
    { Bad_Opcode },
3845
    { "encodekey256", { Gd, Rd }, 0 },
3846
  },
3847
3848
  /* PREFIX_0F38FC */
3849
  {
3850
    { "aadd", { Mdq, Gdq }, 0 },
3851
    { "axor", { Mdq, Gdq }, 0 },
3852
    { "aand", { Mdq, Gdq }, 0 },
3853
    { "aor",  { Mdq, Gdq }, 0 },
3854
  },
3855
3856
  /* PREFIX_0F3A0F */
3857
  {
3858
    { Bad_Opcode },
3859
    { REG_TABLE (REG_0F3A0F_P_1) },
3860
  },
3861
3862
  /* PREFIX_VEX_0F12 */
3863
  {
3864
    { VEX_LEN_TABLE (VEX_LEN_0F12_P_0) },
3865
    { "%XEvmov%XSldup", { XM, EXEvexXNoBcst }, 0 },
3866
    { VEX_LEN_TABLE (VEX_LEN_0F12_P_2) },
3867
    { "%XEvmov%XDdup",  { XM, EXymmq }, 0 },
3868
  },
3869
3870
  /* PREFIX_VEX_0F16 */
3871
  {
3872
    { VEX_LEN_TABLE (VEX_LEN_0F16_P_0) },
3873
    { "%XEvmov%XShdup", { XM, EXEvexXNoBcst }, 0 },
3874
    { VEX_LEN_TABLE (VEX_LEN_0F16_P_2) },
3875
  },
3876
3877
  /* PREFIX_VEX_0F2A */
3878
  {
3879
    { Bad_Opcode },
3880
    { "%XEvcvtsi2ssY{%LQ|}",  { XMScalar, VexScalar, EXxEVexR, Edq }, 0 },
3881
    { Bad_Opcode },
3882
    { "%XEvcvtsi2sdY{%LQ|}",  { XMScalar, VexScalar, EXxEVexR64, Edq }, 0 },
3883
  },
3884
3885
  /* PREFIX_VEX_0F2C */
3886
  {
3887
    { Bad_Opcode },
3888
    { "%XEvcvttss2si",  { Gdq, EXd, EXxEVexS }, 0 },
3889
    { Bad_Opcode },
3890
    { "%XEvcvttsd2si",  { Gdq, EXq, EXxEVexS }, 0 },
3891
  },
3892
3893
  /* PREFIX_VEX_0F2D */
3894
  {
3895
    { Bad_Opcode },
3896
    { "%XEvcvtss2si", { Gdq, EXd, EXxEVexR }, 0 },
3897
    { Bad_Opcode },
3898
    { "%XEvcvtsd2si", { Gdq, EXq, EXxEVexR }, 0 },
3899
  },
3900
3901
  /* PREFIX_VEX_0F41_L_1_W_0 */
3902
  {
3903
    { "kandw",          { MaskG, MaskVex, MaskR }, 0 },
3904
    { Bad_Opcode },
3905
    { "kandb",          { MaskG, MaskVex, MaskR }, 0 },
3906
  },
3907
3908
  /* PREFIX_VEX_0F41_L_1_W_1 */
3909
  {
3910
    { "kandq",          { MaskG, MaskVex, MaskR }, 0 },
3911
    { Bad_Opcode },
3912
    { "kandd",          { MaskG, MaskVex, MaskR }, 0 },
3913
  },
3914
3915
  /* PREFIX_VEX_0F42_L_1_W_0 */
3916
  {
3917
    { "kandnw",         { MaskG, MaskVex, MaskR }, 0 },
3918
    { Bad_Opcode },
3919
    { "kandnb",         { MaskG, MaskVex, MaskR }, 0 },
3920
  },
3921
3922
  /* PREFIX_VEX_0F42_L_1_W_1 */
3923
  {
3924
    { "kandnq",         { MaskG, MaskVex, MaskR }, 0 },
3925
    { Bad_Opcode },
3926
    { "kandnd",         { MaskG, MaskVex, MaskR }, 0 },
3927
  },
3928
3929
  /* PREFIX_VEX_0F44_L_0_W_0 */
3930
  {
3931
    { "knotw",          { MaskG, MaskR }, 0 },
3932
    { Bad_Opcode },
3933
    { "knotb",          { MaskG, MaskR }, 0 },
3934
  },
3935
3936
  /* PREFIX_VEX_0F44_L_0_W_1 */
3937
  {
3938
    { "knotq",          { MaskG, MaskR }, 0 },
3939
    { Bad_Opcode },
3940
    { "knotd",          { MaskG, MaskR }, 0 },
3941
  },
3942
3943
  /* PREFIX_VEX_0F45_L_1_W_0 */
3944
  {
3945
    { "korw",       { MaskG, MaskVex, MaskR }, 0 },
3946
    { Bad_Opcode },
3947
    { "korb",       { MaskG, MaskVex, MaskR }, 0 },
3948
  },
3949
3950
  /* PREFIX_VEX_0F45_L_1_W_1 */
3951
  {
3952
    { "korq",       { MaskG, MaskVex, MaskR }, 0 },
3953
    { Bad_Opcode },
3954
    { "kord",       { MaskG, MaskVex, MaskR }, 0 },
3955
  },
3956
3957
  /* PREFIX_VEX_0F46_L_1_W_0 */
3958
  {
3959
    { "kxnorw",     { MaskG, MaskVex, MaskR }, 0 },
3960
    { Bad_Opcode },
3961
    { "kxnorb",     { MaskG, MaskVex, MaskR }, 0 },
3962
  },
3963
3964
  /* PREFIX_VEX_0F46_L_1_W_1 */
3965
  {
3966
    { "kxnorq",     { MaskG, MaskVex, MaskR }, 0 },
3967
    { Bad_Opcode },
3968
    { "kxnord",     { MaskG, MaskVex, MaskR }, 0 },
3969
  },
3970
3971
  /* PREFIX_VEX_0F47_L_1_W_0 */
3972
  {
3973
    { "kxorw",      { MaskG, MaskVex, MaskR }, 0 },
3974
    { Bad_Opcode },
3975
    { "kxorb",      { MaskG, MaskVex, MaskR }, 0 },
3976
  },
3977
3978
  /* PREFIX_VEX_0F47_L_1_W_1 */
3979
  {
3980
    { "kxorq",      { MaskG, MaskVex, MaskR }, 0 },
3981
    { Bad_Opcode },
3982
    { "kxord",      { MaskG, MaskVex, MaskR }, 0 },
3983
  },
3984
3985
  /* PREFIX_VEX_0F4A_L_1_W_0 */
3986
  {
3987
    { "kaddw",          { MaskG, MaskVex, MaskR }, 0 },
3988
    { Bad_Opcode },
3989
    { "kaddb",          { MaskG, MaskVex, MaskR }, 0 },
3990
  },
3991
3992
  /* PREFIX_VEX_0F4A_L_1_W_1 */
3993
  {
3994
    { "kaddq",          { MaskG, MaskVex, MaskR }, 0 },
3995
    { Bad_Opcode },
3996
    { "kaddd",          { MaskG, MaskVex, MaskR }, 0 },
3997
  },
3998
3999
  /* PREFIX_VEX_0F4B_L_1_W_0 */
4000
  {
4001
    { "kunpckwd",   { MaskG, MaskVex, MaskR }, 0 },
4002
    { Bad_Opcode },
4003
    { "kunpckbw",   { MaskG, MaskVex, MaskR }, 0 },
4004
  },
4005
4006
  /* PREFIX_VEX_0F4B_L_1_W_1 */
4007
  {
4008
    { "kunpckdq",   { MaskG, MaskVex, MaskR }, 0 },
4009
  },
4010
4011
  /* PREFIX_VEX_0F6F */
4012
  {
4013
    { Bad_Opcode },
4014
    { "vmovdqu",  { XM, EXx }, 0 },
4015
    { "vmovdqa",  { XM, EXx }, 0 },
4016
  },
4017
4018
  /* PREFIX_VEX_0F70 */
4019
  {
4020
    { Bad_Opcode },
4021
    { "vpshufhw", { XM, EXx, Ib }, 0 },
4022
    { "vpshufd",  { XM, EXx, Ib }, 0 },
4023
    { "vpshuflw", { XM, EXx, Ib }, 0 },
4024
  },
4025
4026
  /* PREFIX_VEX_0F7E */
4027
  {
4028
    { Bad_Opcode },
4029
    { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1) },
4030
    { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2) },
4031
  },
4032
4033
  /* PREFIX_VEX_0F7F */
4034
  {
4035
    { Bad_Opcode },
4036
    { "vmovdqu",  { EXxS, XM }, 0 },
4037
    { "vmovdqa",  { EXxS, XM }, 0 },
4038
  },
4039
4040
  /* PREFIX_VEX_0F90_L_0_W_0 */
4041
  {
4042
    { "%XEkmovw",   { MaskG, MaskE }, 0 },
4043
    { Bad_Opcode },
4044
    { "%XEkmovb",   { MaskG, MaskBDE }, 0 },
4045
  },
4046
4047
  /* PREFIX_VEX_0F90_L_0_W_1 */
4048
  {
4049
    { "%XEkmovq",   { MaskG, MaskE }, 0 },
4050
    { Bad_Opcode },
4051
    { "%XEkmovd",   { MaskG, MaskBDE }, 0 },
4052
  },
4053
4054
  /* PREFIX_VEX_0F91_L_0_W_0 */
4055
  {
4056
    { "%XEkmovw",   { Mw, MaskG }, 0 },
4057
    { Bad_Opcode },
4058
    { "%XEkmovb",   { Mb, MaskG }, 0 },
4059
  },
4060
4061
  /* PREFIX_VEX_0F91_L_0_W_1 */
4062
  {
4063
    { "%XEkmovq",   { Mq, MaskG }, 0 },
4064
    { Bad_Opcode },
4065
    { "%XEkmovd",   { Md, MaskG }, 0 },
4066
  },
4067
4068
  /* PREFIX_VEX_0F92_L_0_W_0 */
4069
  {
4070
    { "%XEkmovw",   { MaskG, Rdq }, 0 },
4071
    { Bad_Opcode },
4072
    { "%XEkmovb",   { MaskG, Rdq }, 0 },
4073
    { "%XEkmovd",   { MaskG, Rdq }, 0 },
4074
  },
4075
4076
  /* PREFIX_VEX_0F92_L_0_W_1 */
4077
  {
4078
    { Bad_Opcode },
4079
    { Bad_Opcode },
4080
    { Bad_Opcode },
4081
    { "%XEkmovK",   { MaskG, Rdq }, 0 },
4082
  },
4083
4084
  /* PREFIX_VEX_0F93_L_0_W_0 */
4085
  {
4086
    { "%XEkmovw",   { Gdq, MaskR }, 0 },
4087
    { Bad_Opcode },
4088
    { "%XEkmovb",   { Gdq, MaskR }, 0 },
4089
    { "%XEkmovd",   { Gdq, MaskR }, 0 },
4090
  },
4091
4092
  /* PREFIX_VEX_0F93_L_0_W_1 */
4093
  {
4094
    { Bad_Opcode },
4095
    { Bad_Opcode },
4096
    { Bad_Opcode },
4097
    { "%XEkmovK",   { Gdq, MaskR }, 0 },
4098
  },
4099
4100
  /* PREFIX_VEX_0F98_L_0_W_0 */
4101
  {
4102
    { "kortestw", { MaskG, MaskR }, 0 },
4103
    { Bad_Opcode },
4104
    { "kortestb", { MaskG, MaskR }, 0 },
4105
  },
4106
4107
  /* PREFIX_VEX_0F98_L_0_W_1 */
4108
  {
4109
    { "kortestq", { MaskG, MaskR }, 0 },
4110
    { Bad_Opcode },
4111
    { "kortestd", { MaskG, MaskR }, 0 },
4112
  },
4113
4114
  /* PREFIX_VEX_0F99_L_0_W_0 */
4115
  {
4116
    { "ktestw", { MaskG, MaskR }, 0 },
4117
    { Bad_Opcode },
4118
    { "ktestb", { MaskG, MaskR }, 0 },
4119
  },
4120
4121
  /* PREFIX_VEX_0F99_L_0_W_1 */
4122
  {
4123
    { "ktestq", { MaskG, MaskR }, 0 },
4124
    { Bad_Opcode },
4125
    { "ktestd", { MaskG, MaskR }, 0 },
4126
  },
4127
4128
  /* PREFIX_VEX_0F3848_X86_64_L_0_W_0 */
4129
  {
4130
    { "ttmmultf32ps", { TMM, Rtmm, VexTmm }, 0 },
4131
    { Bad_Opcode },
4132
    { "tmmultf32ps",  { TMM, Rtmm, VexTmm }, 0 },
4133
  },
4134
4135
  /* PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_0 */
4136
  {
4137
    { "ldtilecfg", { M }, 0 },
4138
    { Bad_Opcode },
4139
    { "sttilecfg", { M }, 0 },
4140
  },
4141
4142
  /* PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_1 */
4143
  {
4144
    { REG_TABLE (REG_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0) },
4145
    { Bad_Opcode },
4146
    { Bad_Opcode },
4147
    { RM_TABLE (RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_3) },
4148
  },
4149
4150
  /* PREFIX_VEX_0F384A_X86_64_W_0_L_0 */
4151
  {
4152
    { Bad_Opcode },
4153
    { Bad_Opcode },
4154
    { "tileloaddrst1",  { TMM, MVexSIBMEM }, 0 },
4155
    { "tileloaddrs",  { TMM, MVexSIBMEM }, 0 },
4156
  },
4157
4158
  /* PREFIX_VEX_0F384B_X86_64_L_0_W_0 */
4159
  {
4160
    { Bad_Opcode },
4161
    { "tilestored", { MVexSIBMEM, TMM }, 0 },
4162
    { "tileloaddt1",  { TMM, MVexSIBMEM }, 0 },
4163
    { "tileloadd",  { TMM, MVexSIBMEM }, 0 },
4164
  },
4165
4166
  /* PREFIX_VEX_0F3850_W_0 */
4167
  {
4168
    { "%XEvpdpbuud",  { XM, Vex, EXx }, 0 },
4169
    { "%XEvpdpbsud",  { XM, Vex, EXx }, 0 },
4170
    { "%XVvpdpbusd",  { XM, Vex, EXx }, 0 },
4171
    { "%XEvpdpbssd",  { XM, Vex, EXx }, 0 },
4172
  },
4173
4174
  /* PREFIX_VEX_0F3851_W_0 */
4175
  {
4176
    { "%XEvpdpbuuds", { XM, Vex, EXx }, 0 },
4177
    { "%XEvpdpbsuds", { XM, Vex, EXx }, 0 },
4178
    { "%XVvpdpbusds", { XM, Vex, EXx }, 0 },
4179
    { "%XEvpdpbssds", { XM, Vex, EXx }, 0 },
4180
  },
4181
  /* PREFIX_VEX_0F385C_X86_64_L_0_W_0 */
4182
  {
4183
    { Bad_Opcode },
4184
    { "tdpbf16ps", { TMM, Rtmm, VexTmm }, 0 },
4185
    { Bad_Opcode },
4186
    { "tdpfp16ps", { TMM, Rtmm, VexTmm }, 0 },
4187
  },
4188
4189
  /* PREFIX_VEX_0F385E_X86_64_L_0_W_0 */
4190
  {
4191
    { "tdpbuud", {TMM, Rtmm, VexTmm }, 0 },
4192
    { "tdpbsud", {TMM, Rtmm, VexTmm }, 0 },
4193
    { "tdpbusd", {TMM, Rtmm, VexTmm }, 0 },
4194
    { "tdpbssd", {TMM, Rtmm, VexTmm }, 0 },
4195
  },
4196
4197
  /* PREFIX_VEX_0F385F_X86_64_L_0_W_0 */
4198
  {
4199
    { Bad_Opcode },
4200
    { "ttransposed",  { TMM, Rtmm }, 0 },
4201
  },
4202
4203
  /* PREFIX_VEX_0F386B_X86_64_L_0_W_0 */
4204
  {
4205
    { "tconjtcmmimfp16ps",  { TMM, Rtmm, VexTmm }, 0 },
4206
    { "ttcmmrlfp16ps",  { TMM, Rtmm, VexTmm }, 0 },
4207
    { "tconjtfp16", { TMM, Rtmm }, 0 },
4208
    { "ttcmmimfp16ps",  { TMM, Rtmm, VexTmm }, 0 },
4209
  },
4210
4211
  /* PREFIX_VEX_0F386C_X86_64_L_0_W_0 */
4212
  {
4213
    { "tcmmrlfp16ps", { TMM, Rtmm, VexTmm }, 0 },
4214
    { "ttdpbf16ps", { TMM, Rtmm, VexTmm }, 0 },
4215
    { "tcmmimfp16ps", { TMM, Rtmm, VexTmm }, 0 },
4216
    { "ttdpfp16ps", { TMM, Rtmm, VexTmm }, 0 },
4217
  },
4218
4219
  /* PREFIX_VEX_0F386E_X86_64_L_0_W_0 */
4220
  {
4221
    { "t2rpntlvwz0",  { TMM, MVexSIBMEM }, 0 },
4222
    { Bad_Opcode },
4223
    { "t2rpntlvwz1",  { TMM, MVexSIBMEM }, 0 },
4224
  },
4225
4226
  /* PREFIX_VEX_0F386F_X86_64_L_0_W_0 */
4227
  {
4228
    { "t2rpntlvwz0t1",  { TMM, MVexSIBMEM }, 0 },
4229
    { Bad_Opcode },
4230
    { "t2rpntlvwz1t1",  { TMM, MVexSIBMEM }, 0 },
4231
  },
4232
4233
  /* PREFIX_VEX_0F3872 */
4234
  {
4235
    { Bad_Opcode },
4236
    { VEX_W_TABLE (VEX_W_0F3872_P_1) },
4237
  },
4238
4239
  /* PREFIX_VEX_0F38B0_W_0 */
4240
  {
4241
    { "vcvtneoph2ps", { XM, Mx }, 0 },
4242
    { "vcvtneebf162ps", { XM, Mx }, 0 },
4243
    { "vcvtneeph2ps", { XM, Mx }, 0 },
4244
    { "vcvtneobf162ps", { XM, Mx }, 0 },
4245
  },
4246
4247
  /* PREFIX_VEX_0F38B1_W_0 */
4248
  {
4249
    { Bad_Opcode },
4250
    { "vbcstnebf162ps", { XM, Mw }, 0 },
4251
    { "vbcstnesh2ps", { XM, Mw }, 0 },
4252
  },
4253
4254
  /* PREFIX_VEX_0F38D2_W_0 */
4255
  {
4256
    { "%XEvpdpwuud",  { XM, Vex, EXx }, 0 },
4257
    { "%XEvpdpwsud",  { XM, Vex, EXx }, 0 },
4258
    { "%XEvpdpwusd",  { XM, Vex, EXx }, 0 },
4259
  },
4260
4261
  /* PREFIX_VEX_0F38D3_W_0 */
4262
  {
4263
    { "%XEvpdpwuuds", { XM, Vex, EXx }, 0 },
4264
    { "%XEvpdpwsuds", { XM, Vex, EXx }, 0 },
4265
    { "%XEvpdpwusds", { XM, Vex, EXx }, 0 },
4266
  },
4267
4268
  /* PREFIX_VEX_0F38CB */
4269
  {
4270
    { Bad_Opcode },
4271
    { Bad_Opcode },
4272
    { Bad_Opcode },
4273
    { VEX_W_TABLE (VEX_W_0F38CB_P_3) },
4274
  },
4275
4276
  /* PREFIX_VEX_0F38CC */
4277
  {
4278
    { Bad_Opcode },
4279
    { Bad_Opcode },
4280
    { Bad_Opcode },
4281
    { VEX_W_TABLE (VEX_W_0F38CC_P_3) },
4282
  },
4283
4284
  /* PREFIX_VEX_0F38CD */
4285
  {
4286
    { Bad_Opcode },
4287
    { Bad_Opcode },
4288
    { Bad_Opcode },
4289
    { VEX_W_TABLE (VEX_W_0F38CD_P_3) },
4290
  },
4291
4292
  /* PREFIX_VEX_0F38DA_W_0 */
4293
  {
4294
    { VEX_LEN_TABLE (VEX_LEN_0F38DA_W_0_P_0) },
4295
    { "%XEvsm4key4",  { XM, Vex, EXx }, 0 },
4296
    { VEX_LEN_TABLE (VEX_LEN_0F38DA_W_0_P_2) },
4297
    { "%XEvsm4rnds4", { XM, Vex, EXx }, 0 },
4298
  },
4299
4300
  /* PREFIX_VEX_0F38F2_L_0 */
4301
  {
4302
    { "%NFandnS",          { Gdq, VexGdq, Edq }, 0 },
4303
  },
4304
4305
  /* PREFIX_VEX_0F38F3_L_0 */
4306
  {
4307
    { REG_TABLE (REG_VEX_0F38F3_L_0_P_0) },
4308
  },
4309
4310
  /* PREFIX_VEX_0F38F5_L_0 */
4311
  {
4312
    { "%NFbzhiS", { Gdq, Edq, VexGdq }, 0 },
4313
    { "%XEpextS",   { Gdq, VexGdq, Edq }, 0 },
4314
    { Bad_Opcode },
4315
    { "%XEpdepS",   { Gdq, VexGdq, Edq }, 0 },
4316
  },
4317
4318
  /* PREFIX_VEX_0F38F6_L_0 */
4319
  {
4320
    { Bad_Opcode },
4321
    { Bad_Opcode },
4322
    { Bad_Opcode },
4323
    { "%XEmulxS",   { Gdq, VexGdq, Edq }, 0 },
4324
  },
4325
4326
  /* PREFIX_VEX_0F38F7_L_0 */
4327
  {
4328
    { "%NFbextrS",  { Gdq, Edq, VexGdq }, 0 },
4329
    { "%XEsarxS",   { Gdq, Edq, VexGdq }, 0 },
4330
    { "%XEshlxS",   { Gdq, Edq, VexGdq }, 0 },
4331
    { "%XEshrxS",   { Gdq, Edq, VexGdq }, 0 },
4332
  },
4333
4334
  /* PREFIX_VEX_0F3AF0_L_0 */
4335
  {
4336
    { Bad_Opcode },
4337
    { Bad_Opcode },
4338
    { Bad_Opcode },
4339
    { "%XErorxS",   { Gdq, Edq, Ib }, 0 },
4340
  },
4341
4342
  /* PREFIX_VEX_MAP5_F8_X86_64_L_0_W_0 */
4343
  {
4344
    { "t2rpntlvwz0rs",  { TMM, MVexSIBMEM }, 0 },
4345
    { Bad_Opcode },
4346
    { "t2rpntlvwz1rs",  { TMM, MVexSIBMEM }, 0 },
4347
  },
4348
4349
  /* PREFIX_VEX_MAP5_F9_X86_64_L_0_W_0 */
4350
  {
4351
    { "t2rpntlvwz0rst1",  { TMM, MVexSIBMEM }, 0 },
4352
    { Bad_Opcode },
4353
    { "t2rpntlvwz1rst1",  { TMM, MVexSIBMEM }, 0 },
4354
  },
4355
4356
  /* PREFIX_VEX_MAP5_FD_X86_64_L_0_W_0 */
4357
  {
4358
    { "tdpbf8ps", { TMM, Rtmm, VexTmm }, 0 },
4359
    { "tdphbf8ps",  { TMM, Rtmm, VexTmm }, 0 },
4360
    { "tdphf8ps", { TMM, Rtmm, VexTmm }, 0 },
4361
    { "tdpbhf8ps",  { TMM, Rtmm, VexTmm }, 0 },
4362
  },
4363
4364
  /* PREFIX_VEX_MAP7_F6_L_0_W_0_R_0_X86_64 */
4365
  {
4366
    { Bad_Opcode },
4367
    { "wrmsrns",  { Skip_MODRM, Id, Rq }, 0 },
4368
    { Bad_Opcode },
4369
    { "rdmsr",    { Rq, Id }, 0 },
4370
  },
4371
4372
  /* PREFIX_VEX_MAP7_F8_L_0_W_0_R_0_X86_64 */
4373
  {
4374
    { Bad_Opcode },
4375
    { "uwrmsr", { Skip_MODRM, Id, Rq }, 0 },
4376
    { Bad_Opcode },
4377
    { "urdmsr", { Rq, Id }, 0 },
4378
  },
4379
4380
#include "i386-dis-evex-prefix.h"
4381
};
4382
4383
static const struct dis386 x86_64_table[][2] = {
4384
  /* X86_64_06 */
4385
  {
4386
    { "pushP", { es }, 0 },
4387
  },
4388
4389
  /* X86_64_07 */
4390
  {
4391
    { "popP", { es }, 0 },
4392
  },
4393
4394
  /* X86_64_0E */
4395
  {
4396
    { "pushP", { cs }, 0 },
4397
  },
4398
4399
  /* X86_64_16 */
4400
  {
4401
    { "pushP", { ss }, 0 },
4402
  },
4403
4404
  /* X86_64_17 */
4405
  {
4406
    { "popP", { ss }, 0 },
4407
  },
4408
4409
  /* X86_64_1E */
4410
  {
4411
    { "pushP", { ds }, 0 },
4412
  },
4413
4414
  /* X86_64_1F */
4415
  {
4416
    { "popP", { ds }, 0 },
4417
  },
4418
4419
  /* X86_64_27 */
4420
  {
4421
    { "daa", { XX }, 0 },
4422
  },
4423
4424
  /* X86_64_2F */
4425
  {
4426
    { "das", { XX }, 0 },
4427
  },
4428
4429
  /* X86_64_37 */
4430
  {
4431
    { "aaa", { XX }, 0 },
4432
  },
4433
4434
  /* X86_64_3F */
4435
  {
4436
    { "aas", { XX }, 0 },
4437
  },
4438
4439
  /* X86_64_60 */
4440
  {
4441
    { "pushaP", { XX }, 0 },
4442
  },
4443
4444
  /* X86_64_61 */
4445
  {
4446
    { "popaP", { XX }, 0 },
4447
  },
4448
4449
  /* X86_64_62 */
4450
  {
4451
    { MOD_TABLE (MOD_62_32BIT) },
4452
    { EVEX_TABLE () },
4453
  },
4454
4455
  /* X86_64_63 */
4456
  {
4457
    { "arplS", { Sv, Gv }, 0 },
4458
    { "movs", { Gv, { MOVSXD_Fixup, movsxd_mode } }, 0 },
4459
  },
4460
4461
  /* X86_64_6D */
4462
  {
4463
    { "ins{R|}", { Yzr, indirDX }, 0 },
4464
    { "ins{G|}", { Yzr, indirDX }, 0 },
4465
  },
4466
4467
  /* X86_64_6F */
4468
  {
4469
    { "outs{R|}", { indirDXr, Xz }, 0 },
4470
    { "outs{G|}", { indirDXr, Xz }, 0 },
4471
  },
4472
4473
  /* X86_64_82 */
4474
  {
4475
    /* Opcode 0x82 is an alias of opcode 0x80 in 32-bit mode.  */
4476
    { REG_TABLE (REG_80) },
4477
  },
4478
4479
  /* X86_64_9A */
4480
  {
4481
    { "{l|}call{P|}", { Ap }, 0 },
4482
  },
4483
4484
  /* X86_64_C2 */
4485
  {
4486
    { "retP",   { Iw, BND }, 0 },
4487
    { "ret@",   { Iw, BND }, 0 },
4488
  },
4489
4490
  /* X86_64_C3 */
4491
  {
4492
    { "retP",   { BND }, 0 },
4493
    { "ret@",   { BND }, 0 },
4494
  },
4495
4496
  /* X86_64_C4 */
4497
  {
4498
    { MOD_TABLE (MOD_C4_32BIT) },
4499
    { VEX_C4_TABLE () },
4500
  },
4501
4502
  /* X86_64_C5 */
4503
  {
4504
    { MOD_TABLE (MOD_C5_32BIT) },
4505
    { VEX_C5_TABLE () },
4506
  },
4507
4508
  /* X86_64_CE */
4509
  {
4510
    { "into", { XX }, 0 },
4511
  },
4512
4513
  /* X86_64_D4 */
4514
  {
4515
    { "aam", { Ib }, 0 },
4516
  },
4517
4518
  /* X86_64_D5 */
4519
  {
4520
    { "aad", { Ib }, 0 },
4521
  },
4522
4523
  /* X86_64_D6 */
4524
  {
4525
    { "salc", { XX }, 0 },
4526
    { "udb", { XX }, 0 },
4527
  },
4528
4529
  /* X86_64_E8 */
4530
  {
4531
    { "callP",    { Jv, BND }, 0 },
4532
    { "call@",    { Jv, BND }, PREFIX_REX2_ILLEGAL }
4533
  },
4534
4535
  /* X86_64_E9 */
4536
  {
4537
    { "jmpP",   { Jv, BND }, 0 },
4538
    { "jmp@",   { Jv, BND }, PREFIX_REX2_ILLEGAL }
4539
  },
4540
4541
  /* X86_64_EA */
4542
  {
4543
    { "{l|}jmp{P|}", { Ap }, 0 },
4544
  },
4545
4546
  /* X86_64_0F00_REG_6 */
4547
  {
4548
    { Bad_Opcode },
4549
    { PREFIX_TABLE (PREFIX_0F00_REG_6_X86_64) },
4550
  },
4551
4552
  /* X86_64_0F01_REG_0 */
4553
  {
4554
    { "sgdt{Q|Q}", { M }, 0 },
4555
    { "sgdt", { M }, 0 },
4556
  },
4557
4558
  /* X86_64_0F01_REG_0_MOD_3_RM_6_P_1 */
4559
  {
4560
    { Bad_Opcode },
4561
    { "wrmsrlist",  { Skip_MODRM }, 0 },
4562
  },
4563
4564
  /* X86_64_0F01_REG_0_MOD_3_RM_6_P_3 */
4565
  {
4566
    { Bad_Opcode },
4567
    { "rdmsrlist",  { Skip_MODRM }, 0 },
4568
  },
4569
4570
  /* X86_64_0F01_REG_0_MOD_3_RM_7_P_0 */
4571
  {
4572
    { Bad_Opcode },
4573
    { "pbndkb",   { Skip_MODRM }, 0 },
4574
  },
4575
4576
  /* X86_64_0F01_REG_1 */
4577
  {
4578
    { "sidt{Q|Q}", { M }, 0 },
4579
    { "sidt", { M }, 0 },
4580
  },
4581
4582
  /* X86_64_0F01_REG_1_RM_2_PREFIX_1 */
4583
  {
4584
    { Bad_Opcode },
4585
    { "eretu",    { Skip_MODRM }, 0 },
4586
  },
4587
4588
  /* X86_64_0F01_REG_1_RM_2_PREFIX_3 */
4589
  {
4590
    { Bad_Opcode },
4591
    { "erets",    { Skip_MODRM }, 0 },
4592
  },
4593
4594
  /* X86_64_0F01_REG_1_RM_5_PREFIX_2 */
4595
  {
4596
    { Bad_Opcode },
4597
    { "seamret",  { Skip_MODRM }, 0 },
4598
  },
4599
4600
  /* X86_64_0F01_REG_1_RM_6_PREFIX_2 */
4601
  {
4602
    { Bad_Opcode },
4603
    { "seamops",  { Skip_MODRM }, 0 },
4604
  },
4605
4606
  /* X86_64_0F01_REG_1_RM_7_PREFIX_2 */
4607
  {
4608
    { Bad_Opcode },
4609
    { "seamcall", { Skip_MODRM }, 0 },
4610
  },
4611
4612
  /* X86_64_0F01_REG_2 */
4613
  {
4614
    { "lgdt{Q|Q}", { M }, 0 },
4615
    { "lgdt", { M }, 0 },
4616
  },
4617
4618
  /* X86_64_0F01_REG_3 */
4619
  {
4620
    { "lidt{Q|Q}", { M }, 0 },
4621
    { "lidt", { M }, 0 },
4622
  },
4623
4624
  /* X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1 */
4625
  {
4626
    { Bad_Opcode },
4627
    { "uiret",  { Skip_MODRM }, 0 },
4628
  },
4629
4630
  /* X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1 */
4631
  {
4632
    { Bad_Opcode },
4633
    { "testui", { Skip_MODRM }, 0 },
4634
  },
4635
4636
  /* X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1 */
4637
  {
4638
    { Bad_Opcode },
4639
    { "clui", { Skip_MODRM }, 0 },
4640
  },
4641
4642
  /* X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1 */
4643
  {
4644
    { Bad_Opcode },
4645
    { "stui", { Skip_MODRM }, 0 },
4646
  },
4647
4648
  /* X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_1 */
4649
  {
4650
    { Bad_Opcode },
4651
    { "rmpquery", { Skip_MODRM }, 0 },
4652
  },
4653
4654
  /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3 */
4655
  {
4656
    { Bad_Opcode },
4657
    { "rmpread",  { DSCX, RMrAX, Skip_MODRM }, 0 },
4658
  },
4659
4660
  /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1 */
4661
  {
4662
    { Bad_Opcode },
4663
    { "rmpadjust",  { Skip_MODRM }, 0 },
4664
  },
4665
4666
  /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3 */
4667
  {
4668
    { Bad_Opcode },
4669
    { "rmpupdate",  { RMrAX, DSCX, Skip_MODRM }, 0 },
4670
  },
4671
4672
  /* X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1 */
4673
  {
4674
    { Bad_Opcode },
4675
    { "psmash", { Skip_MODRM }, 0 },
4676
  },
4677
4678
  /* X86_64_0F18_REG_6_MOD_0 */
4679
  {
4680
    { "nopQ",   { Ev }, 0 },
4681
    { PREFIX_TABLE (PREFIX_0F18_REG_6_MOD_0_X86_64) },
4682
  },
4683
4684
  /* X86_64_0F18_REG_7_MOD_0 */
4685
  {
4686
    { "nopQ",   { Ev }, 0 },
4687
    { PREFIX_TABLE (PREFIX_0F18_REG_7_MOD_0_X86_64) },
4688
  },
4689
4690
  {
4691
    /* X86_64_0F24 */
4692
    { "movZ",   { Em, Td }, 0 },
4693
  },
4694
4695
  {
4696
    /* X86_64_0F26 */
4697
    { "movZ",   { Td, Em }, 0 },
4698
  },
4699
4700
  {
4701
    /* X86_64_0F388A */
4702
    { Bad_Opcode },
4703
    { "movrsB",   { Gb, Mb }, PREFIX_OPCODE },
4704
  },
4705
4706
  {
4707
    /* X86_64_0F388B */
4708
    { Bad_Opcode },
4709
    { "movrsS",   { Gv, Mv }, PREFIX_OPCODE },
4710
  },
4711
4712
  {
4713
    /* X86_64_0F38F8_M_1 */
4714
    { Bad_Opcode },
4715
    { PREFIX_TABLE (PREFIX_0F38F8_M_1_X86_64) },
4716
  },
4717
4718
  /* X86_64_0FAE_REG_0_MOD_3_PREFIX_1 */
4719
  {
4720
    { Bad_Opcode },
4721
    { "rdfsbase", { Edq }, 0 },
4722
  },
4723
4724
  /* X86_64_0FAE_REG_1_MOD_3_PREFIX_1 */
4725
  {
4726
    { Bad_Opcode },
4727
    { "rdgsbase", { Edq }, 0 },
4728
  },
4729
4730
  /* X86_64_0FAE_REG_2_MOD_3_PREFIX_1 */
4731
  {
4732
    { Bad_Opcode },
4733
    { "wrfsbase", { Edq }, 0 },
4734
  },
4735
4736
  /* X86_64_0FAE_REG_3_MOD_3_PREFIX_1 */
4737
  {
4738
    { Bad_Opcode },
4739
    { "wrgsbase", { Edq }, 0 },
4740
  },
4741
4742
  /* X86_64_0FC7_REG_6_MOD_3_PREFIX_1 */
4743
  {
4744
    { Bad_Opcode },
4745
    { "senduipi", { Eq }, 0 },
4746
  },
4747
4748
  /* X86_64_VEX_0F3848 */
4749
  {
4750
    { Bad_Opcode },
4751
    { VEX_LEN_TABLE (VEX_LEN_0F3848_X86_64) },
4752
  },
4753
4754
  /* X86_64_VEX_0F3849 */
4755
  {
4756
    { Bad_Opcode },
4757
    { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64) },
4758
  },
4759
4760
  /* X86_64_VEX_0F384A */
4761
  {
4762
    { Bad_Opcode },
4763
    { VEX_W_TABLE (VEX_W_0F384A_X86_64) },
4764
  },
4765
4766
  /* X86_64_VEX_0F384B */
4767
  {
4768
    { Bad_Opcode },
4769
    { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64) },
4770
  },
4771
4772
  /* X86_64_VEX_0F385C */
4773
  {
4774
    { Bad_Opcode },
4775
    { VEX_LEN_TABLE (VEX_LEN_0F385C_X86_64) },
4776
  },
4777
4778
  /* X86_64_VEX_0F385E */
4779
  {
4780
    { Bad_Opcode },
4781
    { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64) },
4782
  },
4783
4784
  /* X86_64_VEX_0F385F */
4785
  {
4786
    { Bad_Opcode },
4787
    { VEX_LEN_TABLE (VEX_LEN_0F385F_X86_64) },
4788
  },
4789
4790
  /* X86_64_VEX_0F386B */
4791
  {
4792
    { Bad_Opcode },
4793
    { VEX_LEN_TABLE (VEX_LEN_0F386B_X86_64) },
4794
  },
4795
4796
  /* X86_64_VEX_0F386C */
4797
  {
4798
    { Bad_Opcode },
4799
    { VEX_LEN_TABLE (VEX_LEN_0F386C_X86_64) },
4800
  },
4801
4802
  /* X86_64_VEX_0F386E */
4803
  {
4804
    { Bad_Opcode },
4805
    { VEX_LEN_TABLE (VEX_LEN_0F386E_X86_64) },
4806
  },
4807
4808
  /* X86_64_VEX_0F386F */
4809
  {
4810
    { Bad_Opcode },
4811
    { VEX_LEN_TABLE (VEX_LEN_0F386F_X86_64) },
4812
  },
4813
4814
  /* X86_64_VEX_0F38Ex */
4815
  {
4816
    { Bad_Opcode },
4817
    { "%XEcmp%CCxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4818
  },
4819
4820
  /* X86_64_VEX_MAP5_F8 */
4821
  {
4822
    { Bad_Opcode },
4823
    { VEX_LEN_TABLE (VEX_LEN_MAP5_F8_X86_64) },
4824
  },
4825
4826
  /* X86_64_VEX_MAP5_F9 */
4827
  {
4828
    { Bad_Opcode },
4829
    { VEX_LEN_TABLE (VEX_LEN_MAP5_F9_X86_64) },
4830
  },
4831
4832
  /* X86_64_VEX_MAP5_FD */
4833
  {
4834
    { Bad_Opcode },
4835
    { VEX_LEN_TABLE (VEX_LEN_MAP5_FD_X86_64) },
4836
  },
4837
4838
  /* X86_64_VEX_MAP7_F6_L_0_W_0_R_0 */
4839
  {
4840
    { Bad_Opcode },
4841
    { PREFIX_TABLE (PREFIX_VEX_MAP7_F6_L_0_W_0_R_0_X86_64) },
4842
  },
4843
4844
  /* X86_64_VEX_MAP7_F8_L_0_W_0_R_0 */
4845
  {
4846
    { Bad_Opcode },
4847
    { PREFIX_TABLE (PREFIX_VEX_MAP7_F8_L_0_W_0_R_0_X86_64) },
4848
  },
4849
4850
#include "i386-dis-evex-x86-64.h"
4851
};
4852
4853
static const struct dis386 three_byte_table[][256] = {
4854
4855
  /* THREE_BYTE_0F38 */
4856
  {
4857
    /* 00 */
4858
    { "pshufb",   { MX, EM }, PREFIX_OPCODE },
4859
    { "phaddw",   { MX, EM }, PREFIX_OPCODE },
4860
    { "phaddd",   { MX, EM }, PREFIX_OPCODE },
4861
    { "phaddsw",  { MX, EM }, PREFIX_OPCODE },
4862
    { "pmaddubsw",  { MX, EM }, PREFIX_OPCODE },
4863
    { "phsubw",   { MX, EM }, PREFIX_OPCODE },
4864
    { "phsubd",   { MX, EM }, PREFIX_OPCODE },
4865
    { "phsubsw",  { MX, EM }, PREFIX_OPCODE },
4866
    /* 08 */
4867
    { "psignb",   { MX, EM }, PREFIX_OPCODE },
4868
    { "psignw",   { MX, EM }, PREFIX_OPCODE },
4869
    { "psignd",   { MX, EM }, PREFIX_OPCODE },
4870
    { "pmulhrsw", { MX, EM }, PREFIX_OPCODE },
4871
    { Bad_Opcode },
4872
    { Bad_Opcode },
4873
    { Bad_Opcode },
4874
    { Bad_Opcode },
4875
    /* 10 */
4876
    { "pblendvb", { XM, EXx, XMM0 }, PREFIX_DATA },
4877
    { Bad_Opcode },
4878
    { Bad_Opcode },
4879
    { Bad_Opcode },
4880
    { "blendvps", { XM, EXx, XMM0 }, PREFIX_DATA },
4881
    { "blendvpd", { XM, EXx, XMM0 }, PREFIX_DATA },
4882
    { Bad_Opcode },
4883
    { "ptest",  { XM, EXx }, PREFIX_DATA },
4884
    /* 18 */
4885
    { Bad_Opcode },
4886
    { Bad_Opcode },
4887
    { Bad_Opcode },
4888
    { Bad_Opcode },
4889
    { "pabsb",    { MX, EM }, PREFIX_OPCODE },
4890
    { "pabsw",    { MX, EM }, PREFIX_OPCODE },
4891
    { "pabsd",    { MX, EM }, PREFIX_OPCODE },
4892
    { Bad_Opcode },
4893
    /* 20 */
4894
    { "pmovsxbw", { XM, EXq }, PREFIX_DATA },
4895
    { "pmovsxbd", { XM, EXd }, PREFIX_DATA },
4896
    { "pmovsxbq", { XM, EXw }, PREFIX_DATA },
4897
    { "pmovsxwd", { XM, EXq }, PREFIX_DATA },
4898
    { "pmovsxwq", { XM, EXd }, PREFIX_DATA },
4899
    { "pmovsxdq", { XM, EXq }, PREFIX_DATA },
4900
    { Bad_Opcode },
4901
    { Bad_Opcode },
4902
    /* 28 */
4903
    { "pmuldq", { XM, EXx }, PREFIX_DATA },
4904
    { "pcmpeqq", { XM, EXx }, PREFIX_DATA },
4905
    { "movntdqa", { XM, Mx }, PREFIX_DATA },
4906
    { "packusdw", { XM, EXx }, PREFIX_DATA },
4907
    { Bad_Opcode },
4908
    { Bad_Opcode },
4909
    { Bad_Opcode },
4910
    { Bad_Opcode },
4911
    /* 30 */
4912
    { "pmovzxbw", { XM, EXq }, PREFIX_DATA },
4913
    { "pmovzxbd", { XM, EXd }, PREFIX_DATA },
4914
    { "pmovzxbq", { XM, EXw }, PREFIX_DATA },
4915
    { "pmovzxwd", { XM, EXq }, PREFIX_DATA },
4916
    { "pmovzxwq", { XM, EXd }, PREFIX_DATA },
4917
    { "pmovzxdq", { XM, EXq }, PREFIX_DATA },
4918
    { Bad_Opcode },
4919
    { "pcmpgtq", { XM, EXx }, PREFIX_DATA },
4920
    /* 38 */
4921
    { "pminsb", { XM, EXx }, PREFIX_DATA },
4922
    { "pminsd", { XM, EXx }, PREFIX_DATA },
4923
    { "pminuw", { XM, EXx }, PREFIX_DATA },
4924
    { "pminud", { XM, EXx }, PREFIX_DATA },
4925
    { "pmaxsb", { XM, EXx }, PREFIX_DATA },
4926
    { "pmaxsd", { XM, EXx }, PREFIX_DATA },
4927
    { "pmaxuw", { XM, EXx }, PREFIX_DATA },
4928
    { "pmaxud", { XM, EXx }, PREFIX_DATA },
4929
    /* 40 */
4930
    { "pmulld", { XM, EXx }, PREFIX_DATA },
4931
    { "phminposuw", { XM, EXx }, PREFIX_DATA },
4932
    { Bad_Opcode },
4933
    { Bad_Opcode },
4934
    { Bad_Opcode },
4935
    { Bad_Opcode },
4936
    { Bad_Opcode },
4937
    { Bad_Opcode },
4938
    /* 48 */
4939
    { Bad_Opcode },
4940
    { Bad_Opcode },
4941
    { Bad_Opcode },
4942
    { Bad_Opcode },
4943
    { Bad_Opcode },
4944
    { Bad_Opcode },
4945
    { Bad_Opcode },
4946
    { Bad_Opcode },
4947
    /* 50 */
4948
    { Bad_Opcode },
4949
    { Bad_Opcode },
4950
    { Bad_Opcode },
4951
    { Bad_Opcode },
4952
    { Bad_Opcode },
4953
    { Bad_Opcode },
4954
    { Bad_Opcode },
4955
    { Bad_Opcode },
4956
    /* 58 */
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
    /* 60 */
4966
    { Bad_Opcode },
4967
    { Bad_Opcode },
4968
    { Bad_Opcode },
4969
    { Bad_Opcode },
4970
    { Bad_Opcode },
4971
    { Bad_Opcode },
4972
    { Bad_Opcode },
4973
    { Bad_Opcode },
4974
    /* 68 */
4975
    { Bad_Opcode },
4976
    { Bad_Opcode },
4977
    { Bad_Opcode },
4978
    { Bad_Opcode },
4979
    { Bad_Opcode },
4980
    { Bad_Opcode },
4981
    { Bad_Opcode },
4982
    { Bad_Opcode },
4983
    /* 70 */
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
    /* 78 */
4993
    { Bad_Opcode },
4994
    { Bad_Opcode },
4995
    { Bad_Opcode },
4996
    { Bad_Opcode },
4997
    { Bad_Opcode },
4998
    { Bad_Opcode },
4999
    { Bad_Opcode },
5000
    { Bad_Opcode },
5001
    /* 80 */
5002
    { "invept", { Gm, Mo }, PREFIX_DATA },
5003
    { "invvpid", { Gm, Mo }, PREFIX_DATA },
5004
    { "invpcid", { Gm, M }, PREFIX_DATA },
5005
    { Bad_Opcode },
5006
    { Bad_Opcode },
5007
    { Bad_Opcode },
5008
    { Bad_Opcode },
5009
    { Bad_Opcode },
5010
    /* 88 */
5011
    { Bad_Opcode },
5012
    { Bad_Opcode },
5013
    { X86_64_TABLE (X86_64_0F388A) },
5014
    { X86_64_TABLE (X86_64_0F388B) },
5015
    { Bad_Opcode },
5016
    { Bad_Opcode },
5017
    { Bad_Opcode },
5018
    { Bad_Opcode },
5019
    /* 90 */
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
    /* 98 */
5029
    { Bad_Opcode },
5030
    { Bad_Opcode },
5031
    { Bad_Opcode },
5032
    { Bad_Opcode },
5033
    { Bad_Opcode },
5034
    { Bad_Opcode },
5035
    { Bad_Opcode },
5036
    { Bad_Opcode },
5037
    /* a0 */
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
    /* a8 */
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
    /* b0 */
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
    /* b8 */
5065
    { Bad_Opcode },
5066
    { Bad_Opcode },
5067
    { Bad_Opcode },
5068
    { Bad_Opcode },
5069
    { Bad_Opcode },
5070
    { Bad_Opcode },
5071
    { Bad_Opcode },
5072
    { Bad_Opcode },
5073
    /* c0 */
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
    /* c8 */
5083
    { "sha1nexte", { XM, EXxmm }, PREFIX_OPCODE },
5084
    { "sha1msg1", { XM, EXxmm }, PREFIX_OPCODE },
5085
    { "sha1msg2", { XM, EXxmm }, PREFIX_OPCODE },
5086
    { "sha256rnds2", { XM, EXxmm, XMM0 }, PREFIX_OPCODE },
5087
    { "sha256msg1", { XM, EXxmm }, PREFIX_OPCODE },
5088
    { "sha256msg2", { XM, EXxmm }, PREFIX_OPCODE },
5089
    { Bad_Opcode },
5090
    { "gf2p8mulb", { XM, EXxmm }, PREFIX_DATA },
5091
    /* d0 */
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
    /* d8 */
5101
    { PREFIX_TABLE (PREFIX_0F38D8) },
5102
    { Bad_Opcode },
5103
    { Bad_Opcode },
5104
    { "aesimc", { XM, EXx }, PREFIX_DATA },
5105
    { PREFIX_TABLE (PREFIX_0F38DC) },
5106
    { PREFIX_TABLE (PREFIX_0F38DD) },
5107
    { PREFIX_TABLE (PREFIX_0F38DE) },
5108
    { PREFIX_TABLE (PREFIX_0F38DF) },
5109
    /* e0 */
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
    /* e8 */
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
    /* f0 */
5128
    { PREFIX_TABLE (PREFIX_0F38F0) },
5129
    { PREFIX_TABLE (PREFIX_0F38F1) },
5130
    { Bad_Opcode },
5131
    { Bad_Opcode },
5132
    { Bad_Opcode },
5133
    { "wrussK",   { M, Gdq }, PREFIX_DATA },
5134
    { PREFIX_TABLE (PREFIX_0F38F6) },
5135
    { Bad_Opcode },
5136
    /* f8 */
5137
    { MOD_TABLE (MOD_0F38F8) },
5138
    { "movdiri",  { Mdq, Gdq }, PREFIX_OPCODE },
5139
    { PREFIX_TABLE (PREFIX_0F38FA) },
5140
    { PREFIX_TABLE (PREFIX_0F38FB) },
5141
    { PREFIX_TABLE (PREFIX_0F38FC) },
5142
    { Bad_Opcode },
5143
    { Bad_Opcode },
5144
    { Bad_Opcode },
5145
  },
5146
  /* THREE_BYTE_0F3A */
5147
  {
5148
    /* 00 */
5149
    { Bad_Opcode },
5150
    { Bad_Opcode },
5151
    { Bad_Opcode },
5152
    { Bad_Opcode },
5153
    { Bad_Opcode },
5154
    { Bad_Opcode },
5155
    { Bad_Opcode },
5156
    { Bad_Opcode },
5157
    /* 08 */
5158
    { "roundps", { XM, EXx, Ib }, PREFIX_DATA },
5159
    { "roundpd", { XM, EXx, Ib }, PREFIX_DATA },
5160
    { "roundss", { XM, EXd, Ib }, PREFIX_DATA },
5161
    { "roundsd", { XM, EXq, Ib }, PREFIX_DATA },
5162
    { "blendps", { XM, EXx, Ib }, PREFIX_DATA },
5163
    { "blendpd", { XM, EXx, Ib }, PREFIX_DATA },
5164
    { "pblendw", { XM, EXx, Ib }, PREFIX_DATA },
5165
    { "palignr",  { MX, EM, Ib }, PREFIX_OPCODE },
5166
    /* 10 */
5167
    { Bad_Opcode },
5168
    { Bad_Opcode },
5169
    { Bad_Opcode },
5170
    { Bad_Opcode },
5171
    { "pextrb", { Edb, XM, Ib }, PREFIX_DATA },
5172
    { "pextrw", { Edw, XM, Ib }, PREFIX_DATA },
5173
    { "pextrK", { Edq, XM, Ib }, PREFIX_DATA },
5174
    { "extractps", { Ed, XM, Ib }, PREFIX_DATA },
5175
    /* 18 */
5176
    { Bad_Opcode },
5177
    { Bad_Opcode },
5178
    { Bad_Opcode },
5179
    { Bad_Opcode },
5180
    { Bad_Opcode },
5181
    { Bad_Opcode },
5182
    { Bad_Opcode },
5183
    { Bad_Opcode },
5184
    /* 20 */
5185
    { "pinsrb", { XM, Edb, Ib }, PREFIX_DATA },
5186
    { "insertps", { XM, EXd, Ib }, PREFIX_DATA },
5187
    { "pinsrK", { XM, Edq, Ib }, PREFIX_DATA },
5188
    { Bad_Opcode },
5189
    { Bad_Opcode },
5190
    { Bad_Opcode },
5191
    { Bad_Opcode },
5192
    { Bad_Opcode },
5193
    /* 28 */
5194
    { Bad_Opcode },
5195
    { Bad_Opcode },
5196
    { Bad_Opcode },
5197
    { Bad_Opcode },
5198
    { Bad_Opcode },
5199
    { Bad_Opcode },
5200
    { Bad_Opcode },
5201
    { Bad_Opcode },
5202
    /* 30 */
5203
    { Bad_Opcode },
5204
    { Bad_Opcode },
5205
    { Bad_Opcode },
5206
    { Bad_Opcode },
5207
    { Bad_Opcode },
5208
    { Bad_Opcode },
5209
    { Bad_Opcode },
5210
    { Bad_Opcode },
5211
    /* 38 */
5212
    { Bad_Opcode },
5213
    { Bad_Opcode },
5214
    { Bad_Opcode },
5215
    { Bad_Opcode },
5216
    { Bad_Opcode },
5217
    { Bad_Opcode },
5218
    { Bad_Opcode },
5219
    { Bad_Opcode },
5220
    /* 40 */
5221
    { "dpps", { XM, EXx, Ib }, PREFIX_DATA },
5222
    { "dppd", { XM, EXx, Ib }, PREFIX_DATA },
5223
    { "mpsadbw", { XM, EXx, Ib }, PREFIX_DATA },
5224
    { Bad_Opcode },
5225
    { "pclmulqdq", { XM, EXx, PCLMUL }, PREFIX_DATA },
5226
    { Bad_Opcode },
5227
    { Bad_Opcode },
5228
    { Bad_Opcode },
5229
    /* 48 */
5230
    { Bad_Opcode },
5231
    { Bad_Opcode },
5232
    { Bad_Opcode },
5233
    { Bad_Opcode },
5234
    { Bad_Opcode },
5235
    { Bad_Opcode },
5236
    { Bad_Opcode },
5237
    { Bad_Opcode },
5238
    /* 50 */
5239
    { Bad_Opcode },
5240
    { Bad_Opcode },
5241
    { Bad_Opcode },
5242
    { Bad_Opcode },
5243
    { Bad_Opcode },
5244
    { Bad_Opcode },
5245
    { Bad_Opcode },
5246
    { Bad_Opcode },
5247
    /* 58 */
5248
    { Bad_Opcode },
5249
    { Bad_Opcode },
5250
    { Bad_Opcode },
5251
    { Bad_Opcode },
5252
    { Bad_Opcode },
5253
    { Bad_Opcode },
5254
    { Bad_Opcode },
5255
    { Bad_Opcode },
5256
    /* 60 */
5257
    { "pcmpestrm!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
5258
    { "pcmpestri!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
5259
    { "pcmpistrm", { XM, EXx, Ib }, PREFIX_DATA },
5260
    { "pcmpistri", { XM, EXx, Ib }, PREFIX_DATA },
5261
    { Bad_Opcode },
5262
    { Bad_Opcode },
5263
    { Bad_Opcode },
5264
    { Bad_Opcode },
5265
    /* 68 */
5266
    { Bad_Opcode },
5267
    { Bad_Opcode },
5268
    { Bad_Opcode },
5269
    { Bad_Opcode },
5270
    { Bad_Opcode },
5271
    { Bad_Opcode },
5272
    { Bad_Opcode },
5273
    { Bad_Opcode },
5274
    /* 70 */
5275
    { Bad_Opcode },
5276
    { Bad_Opcode },
5277
    { Bad_Opcode },
5278
    { Bad_Opcode },
5279
    { Bad_Opcode },
5280
    { Bad_Opcode },
5281
    { Bad_Opcode },
5282
    { Bad_Opcode },
5283
    /* 78 */
5284
    { Bad_Opcode },
5285
    { Bad_Opcode },
5286
    { Bad_Opcode },
5287
    { Bad_Opcode },
5288
    { Bad_Opcode },
5289
    { Bad_Opcode },
5290
    { Bad_Opcode },
5291
    { Bad_Opcode },
5292
    /* 80 */
5293
    { Bad_Opcode },
5294
    { Bad_Opcode },
5295
    { Bad_Opcode },
5296
    { Bad_Opcode },
5297
    { Bad_Opcode },
5298
    { Bad_Opcode },
5299
    { Bad_Opcode },
5300
    { Bad_Opcode },
5301
    /* 88 */
5302
    { Bad_Opcode },
5303
    { Bad_Opcode },
5304
    { Bad_Opcode },
5305
    { Bad_Opcode },
5306
    { Bad_Opcode },
5307
    { Bad_Opcode },
5308
    { Bad_Opcode },
5309
    { Bad_Opcode },
5310
    /* 90 */
5311
    { Bad_Opcode },
5312
    { Bad_Opcode },
5313
    { Bad_Opcode },
5314
    { Bad_Opcode },
5315
    { Bad_Opcode },
5316
    { Bad_Opcode },
5317
    { Bad_Opcode },
5318
    { Bad_Opcode },
5319
    /* 98 */
5320
    { Bad_Opcode },
5321
    { Bad_Opcode },
5322
    { Bad_Opcode },
5323
    { Bad_Opcode },
5324
    { Bad_Opcode },
5325
    { Bad_Opcode },
5326
    { Bad_Opcode },
5327
    { Bad_Opcode },
5328
    /* a0 */
5329
    { Bad_Opcode },
5330
    { Bad_Opcode },
5331
    { Bad_Opcode },
5332
    { Bad_Opcode },
5333
    { Bad_Opcode },
5334
    { Bad_Opcode },
5335
    { Bad_Opcode },
5336
    { Bad_Opcode },
5337
    /* a8 */
5338
    { Bad_Opcode },
5339
    { Bad_Opcode },
5340
    { Bad_Opcode },
5341
    { Bad_Opcode },
5342
    { Bad_Opcode },
5343
    { Bad_Opcode },
5344
    { Bad_Opcode },
5345
    { Bad_Opcode },
5346
    /* b0 */
5347
    { Bad_Opcode },
5348
    { Bad_Opcode },
5349
    { Bad_Opcode },
5350
    { Bad_Opcode },
5351
    { Bad_Opcode },
5352
    { Bad_Opcode },
5353
    { Bad_Opcode },
5354
    { Bad_Opcode },
5355
    /* b8 */
5356
    { Bad_Opcode },
5357
    { Bad_Opcode },
5358
    { Bad_Opcode },
5359
    { Bad_Opcode },
5360
    { Bad_Opcode },
5361
    { Bad_Opcode },
5362
    { Bad_Opcode },
5363
    { Bad_Opcode },
5364
    /* c0 */
5365
    { Bad_Opcode },
5366
    { Bad_Opcode },
5367
    { Bad_Opcode },
5368
    { Bad_Opcode },
5369
    { Bad_Opcode },
5370
    { Bad_Opcode },
5371
    { Bad_Opcode },
5372
    { Bad_Opcode },
5373
    /* c8 */
5374
    { Bad_Opcode },
5375
    { Bad_Opcode },
5376
    { Bad_Opcode },
5377
    { Bad_Opcode },
5378
    { "sha1rnds4", { XM, EXxmm, Ib }, PREFIX_OPCODE },
5379
    { Bad_Opcode },
5380
    { "gf2p8affineqb", { XM, EXxmm, Ib }, PREFIX_DATA },
5381
    { "gf2p8affineinvqb", { XM, EXxmm, Ib }, PREFIX_DATA },
5382
    /* d0 */
5383
    { Bad_Opcode },
5384
    { Bad_Opcode },
5385
    { Bad_Opcode },
5386
    { Bad_Opcode },
5387
    { Bad_Opcode },
5388
    { Bad_Opcode },
5389
    { Bad_Opcode },
5390
    { Bad_Opcode },
5391
    /* d8 */
5392
    { Bad_Opcode },
5393
    { Bad_Opcode },
5394
    { Bad_Opcode },
5395
    { Bad_Opcode },
5396
    { Bad_Opcode },
5397
    { Bad_Opcode },
5398
    { Bad_Opcode },
5399
    { "aeskeygenassist", { XM, EXx, Ib }, PREFIX_DATA },
5400
    /* e0 */
5401
    { Bad_Opcode },
5402
    { Bad_Opcode },
5403
    { Bad_Opcode },
5404
    { Bad_Opcode },
5405
    { Bad_Opcode },
5406
    { Bad_Opcode },
5407
    { Bad_Opcode },
5408
    { Bad_Opcode },
5409
    /* e8 */
5410
    { Bad_Opcode },
5411
    { Bad_Opcode },
5412
    { Bad_Opcode },
5413
    { Bad_Opcode },
5414
    { Bad_Opcode },
5415
    { Bad_Opcode },
5416
    { Bad_Opcode },
5417
    { Bad_Opcode },
5418
    /* f0 */
5419
    { PREFIX_TABLE (PREFIX_0F3A0F) },
5420
    { Bad_Opcode },
5421
    { Bad_Opcode },
5422
    { Bad_Opcode },
5423
    { Bad_Opcode },
5424
    { Bad_Opcode },
5425
    { Bad_Opcode },
5426
    { Bad_Opcode },
5427
    /* f8 */
5428
    { Bad_Opcode },
5429
    { Bad_Opcode },
5430
    { Bad_Opcode },
5431
    { Bad_Opcode },
5432
    { Bad_Opcode },
5433
    { Bad_Opcode },
5434
    { Bad_Opcode },
5435
    { Bad_Opcode },
5436
  },
5437
};
5438
5439
static const struct dis386 xop_table[][256] = {
5440
  /* XOP_08 */
5441
  {
5442
    /* 00 */
5443
    { Bad_Opcode },
5444
    { Bad_Opcode },
5445
    { Bad_Opcode },
5446
    { Bad_Opcode },
5447
    { Bad_Opcode },
5448
    { Bad_Opcode },
5449
    { Bad_Opcode },
5450
    { Bad_Opcode },
5451
    /* 08 */
5452
    { Bad_Opcode },
5453
    { Bad_Opcode },
5454
    { Bad_Opcode },
5455
    { Bad_Opcode },
5456
    { Bad_Opcode },
5457
    { Bad_Opcode },
5458
    { Bad_Opcode },
5459
    { Bad_Opcode },
5460
    /* 10 */
5461
    { Bad_Opcode },
5462
    { Bad_Opcode },
5463
    { Bad_Opcode },
5464
    { Bad_Opcode },
5465
    { Bad_Opcode },
5466
    { Bad_Opcode },
5467
    { Bad_Opcode },
5468
    { Bad_Opcode },
5469
    /* 18 */
5470
    { Bad_Opcode },
5471
    { Bad_Opcode },
5472
    { Bad_Opcode },
5473
    { Bad_Opcode },
5474
    { Bad_Opcode },
5475
    { Bad_Opcode },
5476
    { Bad_Opcode },
5477
    { Bad_Opcode },
5478
    /* 20 */
5479
    { Bad_Opcode },
5480
    { Bad_Opcode },
5481
    { Bad_Opcode },
5482
    { Bad_Opcode },
5483
    { Bad_Opcode },
5484
    { Bad_Opcode },
5485
    { Bad_Opcode },
5486
    { Bad_Opcode },
5487
    /* 28 */
5488
    { Bad_Opcode },
5489
    { Bad_Opcode },
5490
    { Bad_Opcode },
5491
    { Bad_Opcode },
5492
    { Bad_Opcode },
5493
    { Bad_Opcode },
5494
    { Bad_Opcode },
5495
    { Bad_Opcode },
5496
    /* 30 */
5497
    { Bad_Opcode },
5498
    { Bad_Opcode },
5499
    { Bad_Opcode },
5500
    { Bad_Opcode },
5501
    { Bad_Opcode },
5502
    { Bad_Opcode },
5503
    { Bad_Opcode },
5504
    { Bad_Opcode },
5505
    /* 38 */
5506
    { Bad_Opcode },
5507
    { Bad_Opcode },
5508
    { Bad_Opcode },
5509
    { Bad_Opcode },
5510
    { Bad_Opcode },
5511
    { Bad_Opcode },
5512
    { Bad_Opcode },
5513
    { Bad_Opcode },
5514
    /* 40 */
5515
    { Bad_Opcode },
5516
    { Bad_Opcode },
5517
    { Bad_Opcode },
5518
    { Bad_Opcode },
5519
    { Bad_Opcode },
5520
    { Bad_Opcode },
5521
    { Bad_Opcode },
5522
    { Bad_Opcode },
5523
    /* 48 */
5524
    { Bad_Opcode },
5525
    { Bad_Opcode },
5526
    { Bad_Opcode },
5527
    { Bad_Opcode },
5528
    { Bad_Opcode },
5529
    { Bad_Opcode },
5530
    { Bad_Opcode },
5531
    { Bad_Opcode },
5532
    /* 50 */
5533
    { Bad_Opcode },
5534
    { Bad_Opcode },
5535
    { Bad_Opcode },
5536
    { Bad_Opcode },
5537
    { Bad_Opcode },
5538
    { Bad_Opcode },
5539
    { Bad_Opcode },
5540
    { Bad_Opcode },
5541
    /* 58 */
5542
    { Bad_Opcode },
5543
    { Bad_Opcode },
5544
    { Bad_Opcode },
5545
    { Bad_Opcode },
5546
    { Bad_Opcode },
5547
    { Bad_Opcode },
5548
    { Bad_Opcode },
5549
    { Bad_Opcode },
5550
    /* 60 */
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
    /* 68 */
5560
    { Bad_Opcode },
5561
    { Bad_Opcode },
5562
    { Bad_Opcode },
5563
    { Bad_Opcode },
5564
    { Bad_Opcode },
5565
    { Bad_Opcode },
5566
    { Bad_Opcode },
5567
    { Bad_Opcode },
5568
    /* 70 */
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
    /* 78 */
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
    /* 80 */
5587
    { Bad_Opcode },
5588
    { Bad_Opcode },
5589
    { Bad_Opcode },
5590
    { Bad_Opcode },
5591
    { Bad_Opcode },
5592
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_85) },
5593
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_86) },
5594
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_87) },
5595
    /* 88 */
5596
    { Bad_Opcode },
5597
    { Bad_Opcode },
5598
    { Bad_Opcode },
5599
    { Bad_Opcode },
5600
    { Bad_Opcode },
5601
    { Bad_Opcode },
5602
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_8E) },
5603
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_8F) },
5604
    /* 90 */
5605
    { Bad_Opcode },
5606
    { Bad_Opcode },
5607
    { Bad_Opcode },
5608
    { Bad_Opcode },
5609
    { Bad_Opcode },
5610
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_95) },
5611
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_96) },
5612
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_97) },
5613
    /* 98 */
5614
    { Bad_Opcode },
5615
    { Bad_Opcode },
5616
    { Bad_Opcode },
5617
    { Bad_Opcode },
5618
    { Bad_Opcode },
5619
    { Bad_Opcode },
5620
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_9E) },
5621
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_9F) },
5622
    /* a0 */
5623
    { Bad_Opcode },
5624
    { Bad_Opcode },
5625
    { "vpcmov",   { XM, Vex, EXx, XMVexI4 }, 0 },
5626
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_A3) },
5627
    { Bad_Opcode },
5628
    { Bad_Opcode },
5629
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_A6) },
5630
    { Bad_Opcode },
5631
    /* a8 */
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
    /* b0 */
5641
    { Bad_Opcode },
5642
    { Bad_Opcode },
5643
    { Bad_Opcode },
5644
    { Bad_Opcode },
5645
    { Bad_Opcode },
5646
    { Bad_Opcode },
5647
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_B6) },
5648
    { Bad_Opcode },
5649
    /* b8 */
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
    /* c0 */
5659
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_C0) },
5660
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_C1) },
5661
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_C2) },
5662
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_C3) },
5663
    { Bad_Opcode },
5664
    { Bad_Opcode },
5665
    { Bad_Opcode },
5666
    { Bad_Opcode },
5667
    /* c8 */
5668
    { Bad_Opcode },
5669
    { Bad_Opcode },
5670
    { Bad_Opcode },
5671
    { Bad_Opcode },
5672
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_CC) },
5673
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_CD) },
5674
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_CE) },
5675
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_CF) },
5676
    /* d0 */
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
    /* d8 */
5686
    { Bad_Opcode },
5687
    { Bad_Opcode },
5688
    { Bad_Opcode },
5689
    { Bad_Opcode },
5690
    { Bad_Opcode },
5691
    { Bad_Opcode },
5692
    { Bad_Opcode },
5693
    { Bad_Opcode },
5694
    /* e0 */
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
    /* e8 */
5704
    { Bad_Opcode },
5705
    { Bad_Opcode },
5706
    { Bad_Opcode },
5707
    { Bad_Opcode },
5708
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_EC) },
5709
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_ED) },
5710
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_EE) },
5711
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_EF) },
5712
    /* f0 */
5713
    { Bad_Opcode },
5714
    { Bad_Opcode },
5715
    { Bad_Opcode },
5716
    { Bad_Opcode },
5717
    { Bad_Opcode },
5718
    { Bad_Opcode },
5719
    { Bad_Opcode },
5720
    { Bad_Opcode },
5721
    /* f8 */
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
  },
5731
  /* XOP_09 */
5732
  {
5733
    /* 00 */
5734
    { Bad_Opcode },
5735
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_01) },
5736
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_02) },
5737
    { Bad_Opcode },
5738
    { Bad_Opcode },
5739
    { Bad_Opcode },
5740
    { Bad_Opcode },
5741
    { Bad_Opcode },
5742
    /* 08 */
5743
    { Bad_Opcode },
5744
    { Bad_Opcode },
5745
    { Bad_Opcode },
5746
    { Bad_Opcode },
5747
    { Bad_Opcode },
5748
    { Bad_Opcode },
5749
    { Bad_Opcode },
5750
    { Bad_Opcode },
5751
    /* 10 */
5752
    { Bad_Opcode },
5753
    { Bad_Opcode },
5754
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_12) },
5755
    { Bad_Opcode },
5756
    { Bad_Opcode },
5757
    { Bad_Opcode },
5758
    { Bad_Opcode },
5759
    { Bad_Opcode },
5760
    /* 18 */
5761
    { Bad_Opcode },
5762
    { Bad_Opcode },
5763
    { Bad_Opcode },
5764
    { Bad_Opcode },
5765
    { Bad_Opcode },
5766
    { Bad_Opcode },
5767
    { Bad_Opcode },
5768
    { Bad_Opcode },
5769
    /* 20 */
5770
    { Bad_Opcode },
5771
    { Bad_Opcode },
5772
    { Bad_Opcode },
5773
    { Bad_Opcode },
5774
    { Bad_Opcode },
5775
    { Bad_Opcode },
5776
    { Bad_Opcode },
5777
    { Bad_Opcode },
5778
    /* 28 */
5779
    { Bad_Opcode },
5780
    { Bad_Opcode },
5781
    { Bad_Opcode },
5782
    { Bad_Opcode },
5783
    { Bad_Opcode },
5784
    { Bad_Opcode },
5785
    { Bad_Opcode },
5786
    { Bad_Opcode },
5787
    /* 30 */
5788
    { Bad_Opcode },
5789
    { Bad_Opcode },
5790
    { Bad_Opcode },
5791
    { Bad_Opcode },
5792
    { Bad_Opcode },
5793
    { Bad_Opcode },
5794
    { Bad_Opcode },
5795
    { Bad_Opcode },
5796
    /* 38 */
5797
    { Bad_Opcode },
5798
    { Bad_Opcode },
5799
    { Bad_Opcode },
5800
    { Bad_Opcode },
5801
    { Bad_Opcode },
5802
    { Bad_Opcode },
5803
    { Bad_Opcode },
5804
    { Bad_Opcode },
5805
    /* 40 */
5806
    { Bad_Opcode },
5807
    { Bad_Opcode },
5808
    { Bad_Opcode },
5809
    { Bad_Opcode },
5810
    { Bad_Opcode },
5811
    { Bad_Opcode },
5812
    { Bad_Opcode },
5813
    { Bad_Opcode },
5814
    /* 48 */
5815
    { Bad_Opcode },
5816
    { Bad_Opcode },
5817
    { Bad_Opcode },
5818
    { Bad_Opcode },
5819
    { Bad_Opcode },
5820
    { Bad_Opcode },
5821
    { Bad_Opcode },
5822
    { Bad_Opcode },
5823
    /* 50 */
5824
    { Bad_Opcode },
5825
    { Bad_Opcode },
5826
    { Bad_Opcode },
5827
    { Bad_Opcode },
5828
    { Bad_Opcode },
5829
    { Bad_Opcode },
5830
    { Bad_Opcode },
5831
    { Bad_Opcode },
5832
    /* 58 */
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
    /* 60 */
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
    /* 68 */
5851
    { Bad_Opcode },
5852
    { Bad_Opcode },
5853
    { Bad_Opcode },
5854
    { Bad_Opcode },
5855
    { Bad_Opcode },
5856
    { Bad_Opcode },
5857
    { Bad_Opcode },
5858
    { Bad_Opcode },
5859
    /* 70 */
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
    /* 78 */
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
    /* 80 */
5878
    { VEX_W_TABLE (VEX_W_XOP_09_80) },
5879
    { VEX_W_TABLE (VEX_W_XOP_09_81) },
5880
    { VEX_W_TABLE (VEX_W_XOP_09_82) },
5881
    { VEX_W_TABLE (VEX_W_XOP_09_83) },
5882
    { Bad_Opcode },
5883
    { Bad_Opcode },
5884
    { Bad_Opcode },
5885
    { Bad_Opcode },
5886
    /* 88 */
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
    /* 90 */
5896
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_90) },
5897
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_91) },
5898
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_92) },
5899
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_93) },
5900
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_94) },
5901
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_95) },
5902
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_96) },
5903
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_97) },
5904
    /* 98 */
5905
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_98) },
5906
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_99) },
5907
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_9A) },
5908
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_9B) },
5909
    { Bad_Opcode },
5910
    { Bad_Opcode },
5911
    { Bad_Opcode },
5912
    { Bad_Opcode },
5913
    /* a0 */
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
    /* a8 */
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
    /* b0 */
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
    /* b8 */
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
    /* c0 */
5950
    { Bad_Opcode },
5951
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_C1) },
5952
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_C2) },
5953
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_C3) },
5954
    { Bad_Opcode },
5955
    { Bad_Opcode },
5956
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_C6) },
5957
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_C7) },
5958
    /* c8 */
5959
    { Bad_Opcode },
5960
    { Bad_Opcode },
5961
    { Bad_Opcode },
5962
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_CB) },
5963
    { Bad_Opcode },
5964
    { Bad_Opcode },
5965
    { Bad_Opcode },
5966
    { Bad_Opcode },
5967
    /* d0 */
5968
    { Bad_Opcode },
5969
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_D1) },
5970
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_D2) },
5971
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_D3) },
5972
    { Bad_Opcode },
5973
    { Bad_Opcode },
5974
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_D6) },
5975
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_D7) },
5976
    /* d8 */
5977
    { Bad_Opcode },
5978
    { Bad_Opcode },
5979
    { Bad_Opcode },
5980
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_DB) },
5981
    { Bad_Opcode },
5982
    { Bad_Opcode },
5983
    { Bad_Opcode },
5984
    { Bad_Opcode },
5985
    /* e0 */
5986
    { Bad_Opcode },
5987
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_E1) },
5988
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_E2) },
5989
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_E3) },
5990
    { Bad_Opcode },
5991
    { Bad_Opcode },
5992
    { Bad_Opcode },
5993
    { Bad_Opcode },
5994
    /* e8 */
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
    /* f0 */
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
    /* f8 */
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
  },
6022
  /* XOP_0A */
6023
  {
6024
    /* 00 */
6025
    { Bad_Opcode },
6026
    { Bad_Opcode },
6027
    { Bad_Opcode },
6028
    { Bad_Opcode },
6029
    { Bad_Opcode },
6030
    { Bad_Opcode },
6031
    { Bad_Opcode },
6032
    { Bad_Opcode },
6033
    /* 08 */
6034
    { Bad_Opcode },
6035
    { Bad_Opcode },
6036
    { Bad_Opcode },
6037
    { Bad_Opcode },
6038
    { Bad_Opcode },
6039
    { Bad_Opcode },
6040
    { Bad_Opcode },
6041
    { Bad_Opcode },
6042
    /* 10 */
6043
    { "bextrS", { Gdq, Edq, Id }, 0 },
6044
    { Bad_Opcode },
6045
    { VEX_LEN_TABLE (VEX_LEN_XOP_0A_12) },
6046
    { Bad_Opcode },
6047
    { Bad_Opcode },
6048
    { Bad_Opcode },
6049
    { Bad_Opcode },
6050
    { Bad_Opcode },
6051
    /* 18 */
6052
    { Bad_Opcode },
6053
    { Bad_Opcode },
6054
    { Bad_Opcode },
6055
    { Bad_Opcode },
6056
    { Bad_Opcode },
6057
    { Bad_Opcode },
6058
    { Bad_Opcode },
6059
    { Bad_Opcode },
6060
    /* 20 */
6061
    { Bad_Opcode },
6062
    { Bad_Opcode },
6063
    { Bad_Opcode },
6064
    { Bad_Opcode },
6065
    { Bad_Opcode },
6066
    { Bad_Opcode },
6067
    { Bad_Opcode },
6068
    { Bad_Opcode },
6069
    /* 28 */
6070
    { Bad_Opcode },
6071
    { Bad_Opcode },
6072
    { Bad_Opcode },
6073
    { Bad_Opcode },
6074
    { Bad_Opcode },
6075
    { Bad_Opcode },
6076
    { Bad_Opcode },
6077
    { Bad_Opcode },
6078
    /* 30 */
6079
    { Bad_Opcode },
6080
    { Bad_Opcode },
6081
    { Bad_Opcode },
6082
    { Bad_Opcode },
6083
    { Bad_Opcode },
6084
    { Bad_Opcode },
6085
    { Bad_Opcode },
6086
    { Bad_Opcode },
6087
    /* 38 */
6088
    { Bad_Opcode },
6089
    { Bad_Opcode },
6090
    { Bad_Opcode },
6091
    { Bad_Opcode },
6092
    { Bad_Opcode },
6093
    { Bad_Opcode },
6094
    { Bad_Opcode },
6095
    { Bad_Opcode },
6096
    /* 40 */
6097
    { Bad_Opcode },
6098
    { Bad_Opcode },
6099
    { Bad_Opcode },
6100
    { Bad_Opcode },
6101
    { Bad_Opcode },
6102
    { Bad_Opcode },
6103
    { Bad_Opcode },
6104
    { Bad_Opcode },
6105
    /* 48 */
6106
    { Bad_Opcode },
6107
    { Bad_Opcode },
6108
    { Bad_Opcode },
6109
    { Bad_Opcode },
6110
    { Bad_Opcode },
6111
    { Bad_Opcode },
6112
    { Bad_Opcode },
6113
    { Bad_Opcode },
6114
    /* 50 */
6115
    { Bad_Opcode },
6116
    { Bad_Opcode },
6117
    { Bad_Opcode },
6118
    { Bad_Opcode },
6119
    { Bad_Opcode },
6120
    { Bad_Opcode },
6121
    { Bad_Opcode },
6122
    { Bad_Opcode },
6123
    /* 58 */
6124
    { Bad_Opcode },
6125
    { Bad_Opcode },
6126
    { Bad_Opcode },
6127
    { Bad_Opcode },
6128
    { Bad_Opcode },
6129
    { Bad_Opcode },
6130
    { Bad_Opcode },
6131
    { Bad_Opcode },
6132
    /* 60 */
6133
    { Bad_Opcode },
6134
    { Bad_Opcode },
6135
    { Bad_Opcode },
6136
    { Bad_Opcode },
6137
    { Bad_Opcode },
6138
    { Bad_Opcode },
6139
    { Bad_Opcode },
6140
    { Bad_Opcode },
6141
    /* 68 */
6142
    { Bad_Opcode },
6143
    { Bad_Opcode },
6144
    { Bad_Opcode },
6145
    { Bad_Opcode },
6146
    { Bad_Opcode },
6147
    { Bad_Opcode },
6148
    { Bad_Opcode },
6149
    { Bad_Opcode },
6150
    /* 70 */
6151
    { Bad_Opcode },
6152
    { Bad_Opcode },
6153
    { Bad_Opcode },
6154
    { Bad_Opcode },
6155
    { Bad_Opcode },
6156
    { Bad_Opcode },
6157
    { Bad_Opcode },
6158
    { Bad_Opcode },
6159
    /* 78 */
6160
    { Bad_Opcode },
6161
    { Bad_Opcode },
6162
    { Bad_Opcode },
6163
    { Bad_Opcode },
6164
    { Bad_Opcode },
6165
    { Bad_Opcode },
6166
    { Bad_Opcode },
6167
    { Bad_Opcode },
6168
    /* 80 */
6169
    { Bad_Opcode },
6170
    { Bad_Opcode },
6171
    { Bad_Opcode },
6172
    { Bad_Opcode },
6173
    { Bad_Opcode },
6174
    { Bad_Opcode },
6175
    { Bad_Opcode },
6176
    { Bad_Opcode },
6177
    /* 88 */
6178
    { Bad_Opcode },
6179
    { Bad_Opcode },
6180
    { Bad_Opcode },
6181
    { Bad_Opcode },
6182
    { Bad_Opcode },
6183
    { Bad_Opcode },
6184
    { Bad_Opcode },
6185
    { Bad_Opcode },
6186
    /* 90 */
6187
    { Bad_Opcode },
6188
    { Bad_Opcode },
6189
    { Bad_Opcode },
6190
    { Bad_Opcode },
6191
    { Bad_Opcode },
6192
    { Bad_Opcode },
6193
    { Bad_Opcode },
6194
    { Bad_Opcode },
6195
    /* 98 */
6196
    { Bad_Opcode },
6197
    { Bad_Opcode },
6198
    { Bad_Opcode },
6199
    { Bad_Opcode },
6200
    { Bad_Opcode },
6201
    { Bad_Opcode },
6202
    { Bad_Opcode },
6203
    { Bad_Opcode },
6204
    /* a0 */
6205
    { Bad_Opcode },
6206
    { Bad_Opcode },
6207
    { Bad_Opcode },
6208
    { Bad_Opcode },
6209
    { Bad_Opcode },
6210
    { Bad_Opcode },
6211
    { Bad_Opcode },
6212
    { Bad_Opcode },
6213
    /* a8 */
6214
    { Bad_Opcode },
6215
    { Bad_Opcode },
6216
    { Bad_Opcode },
6217
    { Bad_Opcode },
6218
    { Bad_Opcode },
6219
    { Bad_Opcode },
6220
    { Bad_Opcode },
6221
    { Bad_Opcode },
6222
    /* b0 */
6223
    { Bad_Opcode },
6224
    { Bad_Opcode },
6225
    { Bad_Opcode },
6226
    { Bad_Opcode },
6227
    { Bad_Opcode },
6228
    { Bad_Opcode },
6229
    { Bad_Opcode },
6230
    { Bad_Opcode },
6231
    /* b8 */
6232
    { Bad_Opcode },
6233
    { Bad_Opcode },
6234
    { Bad_Opcode },
6235
    { Bad_Opcode },
6236
    { Bad_Opcode },
6237
    { Bad_Opcode },
6238
    { Bad_Opcode },
6239
    { Bad_Opcode },
6240
    /* c0 */
6241
    { Bad_Opcode },
6242
    { Bad_Opcode },
6243
    { Bad_Opcode },
6244
    { Bad_Opcode },
6245
    { Bad_Opcode },
6246
    { Bad_Opcode },
6247
    { Bad_Opcode },
6248
    { Bad_Opcode },
6249
    /* c8 */
6250
    { Bad_Opcode },
6251
    { Bad_Opcode },
6252
    { Bad_Opcode },
6253
    { Bad_Opcode },
6254
    { Bad_Opcode },
6255
    { Bad_Opcode },
6256
    { Bad_Opcode },
6257
    { Bad_Opcode },
6258
    /* d0 */
6259
    { Bad_Opcode },
6260
    { Bad_Opcode },
6261
    { Bad_Opcode },
6262
    { Bad_Opcode },
6263
    { Bad_Opcode },
6264
    { Bad_Opcode },
6265
    { Bad_Opcode },
6266
    { Bad_Opcode },
6267
    /* d8 */
6268
    { Bad_Opcode },
6269
    { Bad_Opcode },
6270
    { Bad_Opcode },
6271
    { Bad_Opcode },
6272
    { Bad_Opcode },
6273
    { Bad_Opcode },
6274
    { Bad_Opcode },
6275
    { Bad_Opcode },
6276
    /* e0 */
6277
    { Bad_Opcode },
6278
    { Bad_Opcode },
6279
    { Bad_Opcode },
6280
    { Bad_Opcode },
6281
    { Bad_Opcode },
6282
    { Bad_Opcode },
6283
    { Bad_Opcode },
6284
    { Bad_Opcode },
6285
    /* e8 */
6286
    { Bad_Opcode },
6287
    { Bad_Opcode },
6288
    { Bad_Opcode },
6289
    { Bad_Opcode },
6290
    { Bad_Opcode },
6291
    { Bad_Opcode },
6292
    { Bad_Opcode },
6293
    { Bad_Opcode },
6294
    /* f0 */
6295
    { Bad_Opcode },
6296
    { Bad_Opcode },
6297
    { Bad_Opcode },
6298
    { Bad_Opcode },
6299
    { Bad_Opcode },
6300
    { Bad_Opcode },
6301
    { Bad_Opcode },
6302
    { Bad_Opcode },
6303
    /* f8 */
6304
    { Bad_Opcode },
6305
    { Bad_Opcode },
6306
    { Bad_Opcode },
6307
    { Bad_Opcode },
6308
    { Bad_Opcode },
6309
    { Bad_Opcode },
6310
    { Bad_Opcode },
6311
    { Bad_Opcode },
6312
  },
6313
};
6314
6315
static const struct dis386 vex_table[][256] = {
6316
  /* VEX_0F */
6317
  {
6318
    /* 00 */
6319
    { Bad_Opcode },
6320
    { Bad_Opcode },
6321
    { Bad_Opcode },
6322
    { Bad_Opcode },
6323
    { Bad_Opcode },
6324
    { Bad_Opcode },
6325
    { Bad_Opcode },
6326
    { Bad_Opcode },
6327
    /* 08 */
6328
    { Bad_Opcode },
6329
    { Bad_Opcode },
6330
    { Bad_Opcode },
6331
    { Bad_Opcode },
6332
    { Bad_Opcode },
6333
    { Bad_Opcode },
6334
    { Bad_Opcode },
6335
    { Bad_Opcode },
6336
    /* 10 */
6337
    { PREFIX_TABLE (PREFIX_0F10) },
6338
    { PREFIX_TABLE (PREFIX_0F11) },
6339
    { PREFIX_TABLE (PREFIX_VEX_0F12) },
6340
    { VEX_LEN_TABLE (VEX_LEN_0F13) },
6341
    { "vunpcklpX",  { XM, Vex, EXx }, PREFIX_OPCODE },
6342
    { "vunpckhpX",  { XM, Vex, EXx }, PREFIX_OPCODE },
6343
    { PREFIX_TABLE (PREFIX_VEX_0F16) },
6344
    { VEX_LEN_TABLE (VEX_LEN_0F17) },
6345
    /* 18 */
6346
    { Bad_Opcode },
6347
    { Bad_Opcode },
6348
    { Bad_Opcode },
6349
    { Bad_Opcode },
6350
    { Bad_Opcode },
6351
    { Bad_Opcode },
6352
    { Bad_Opcode },
6353
    { Bad_Opcode },
6354
    /* 20 */
6355
    { Bad_Opcode },
6356
    { Bad_Opcode },
6357
    { Bad_Opcode },
6358
    { Bad_Opcode },
6359
    { Bad_Opcode },
6360
    { Bad_Opcode },
6361
    { Bad_Opcode },
6362
    { Bad_Opcode },
6363
    /* 28 */
6364
    { "vmovapX",  { XM, EXx }, PREFIX_OPCODE },
6365
    { "vmovapX",  { EXxS, XM }, PREFIX_OPCODE },
6366
    { PREFIX_TABLE (PREFIX_VEX_0F2A) },
6367
    { "vmovntpX", { Mx, XM }, PREFIX_OPCODE },
6368
    { PREFIX_TABLE (PREFIX_VEX_0F2C) },
6369
    { PREFIX_TABLE (PREFIX_VEX_0F2D) },
6370
    { PREFIX_TABLE (PREFIX_0F2E) },
6371
    { PREFIX_TABLE (PREFIX_0F2F) },
6372
    /* 30 */
6373
    { Bad_Opcode },
6374
    { Bad_Opcode },
6375
    { Bad_Opcode },
6376
    { Bad_Opcode },
6377
    { Bad_Opcode },
6378
    { Bad_Opcode },
6379
    { Bad_Opcode },
6380
    { Bad_Opcode },
6381
    /* 38 */
6382
    { Bad_Opcode },
6383
    { Bad_Opcode },
6384
    { Bad_Opcode },
6385
    { Bad_Opcode },
6386
    { Bad_Opcode },
6387
    { Bad_Opcode },
6388
    { Bad_Opcode },
6389
    { Bad_Opcode },
6390
    /* 40 */
6391
    { Bad_Opcode },
6392
    { VEX_LEN_TABLE (VEX_LEN_0F41) },
6393
    { VEX_LEN_TABLE (VEX_LEN_0F42) },
6394
    { Bad_Opcode },
6395
    { VEX_LEN_TABLE (VEX_LEN_0F44) },
6396
    { VEX_LEN_TABLE (VEX_LEN_0F45) },
6397
    { VEX_LEN_TABLE (VEX_LEN_0F46) },
6398
    { VEX_LEN_TABLE (VEX_LEN_0F47) },
6399
    /* 48 */
6400
    { Bad_Opcode },
6401
    { Bad_Opcode },
6402
    { VEX_LEN_TABLE (VEX_LEN_0F4A) },
6403
    { VEX_LEN_TABLE (VEX_LEN_0F4B) },
6404
    { Bad_Opcode },
6405
    { Bad_Opcode },
6406
    { Bad_Opcode },
6407
    { Bad_Opcode },
6408
    /* 50 */
6409
    { "vmovmskpX",  { Gdq, Ux }, PREFIX_OPCODE },
6410
    { PREFIX_TABLE (PREFIX_0F51) },
6411
    { PREFIX_TABLE (PREFIX_0F52) },
6412
    { PREFIX_TABLE (PREFIX_0F53) },
6413
    { "vandpX",   { XM, Vex, EXx }, PREFIX_OPCODE },
6414
    { "vandnpX",  { XM, Vex, EXx }, PREFIX_OPCODE },
6415
    { "vorpX",    { XM, Vex, EXx }, PREFIX_OPCODE },
6416
    { "vxorpX",   { XM, Vex, EXx }, PREFIX_OPCODE },
6417
    /* 58 */
6418
    { PREFIX_TABLE (PREFIX_0F58) },
6419
    { PREFIX_TABLE (PREFIX_0F59) },
6420
    { PREFIX_TABLE (PREFIX_0F5A) },
6421
    { PREFIX_TABLE (PREFIX_0F5B) },
6422
    { PREFIX_TABLE (PREFIX_0F5C) },
6423
    { PREFIX_TABLE (PREFIX_0F5D) },
6424
    { PREFIX_TABLE (PREFIX_0F5E) },
6425
    { PREFIX_TABLE (PREFIX_0F5F) },
6426
    /* 60 */
6427
    { "vpunpcklbw", { XM, Vex, EXx }, PREFIX_DATA },
6428
    { "vpunpcklwd", { XM, Vex, EXx }, PREFIX_DATA },
6429
    { "vpunpckldq", { XM, Vex, EXx }, PREFIX_DATA },
6430
    { "vpacksswb",  { XM, Vex, EXx }, PREFIX_DATA },
6431
    { "vpcmpgtb", { XM, Vex, EXx }, PREFIX_DATA },
6432
    { "vpcmpgtw", { XM, Vex, EXx }, PREFIX_DATA },
6433
    { "vpcmpgtd", { XM, Vex, EXx }, PREFIX_DATA },
6434
    { "vpackuswb",  { XM, Vex, EXx }, PREFIX_DATA },
6435
    /* 68 */
6436
    { "vpunpckhbw", { XM, Vex, EXx }, PREFIX_DATA },
6437
    { "vpunpckhwd", { XM, Vex, EXx }, PREFIX_DATA },
6438
    { "vpunpckhdq", { XM, Vex, EXx }, PREFIX_DATA },
6439
    { "vpackssdw",  { XM, Vex, EXx }, PREFIX_DATA },
6440
    { "vpunpcklqdq",  { XM, Vex, EXx }, PREFIX_DATA },
6441
    { "vpunpckhqdq",  { XM, Vex, EXx }, PREFIX_DATA },
6442
    { VEX_LEN_TABLE (VEX_LEN_0F6E) },
6443
    { PREFIX_TABLE (PREFIX_VEX_0F6F) },
6444
    /* 70 */
6445
    { PREFIX_TABLE (PREFIX_VEX_0F70) },
6446
    { REG_TABLE (REG_VEX_0F71) },
6447
    { REG_TABLE (REG_VEX_0F72) },
6448
    { REG_TABLE (REG_VEX_0F73) },
6449
    { "vpcmpeqb", { XM, Vex, EXx }, PREFIX_DATA },
6450
    { "vpcmpeqw", { XM, Vex, EXx }, PREFIX_DATA },
6451
    { "vpcmpeqd", { XM, Vex, EXx }, PREFIX_DATA },
6452
    { VEX_LEN_TABLE (VEX_LEN_0F77) },
6453
    /* 78 */
6454
    { Bad_Opcode },
6455
    { Bad_Opcode },
6456
    { Bad_Opcode },
6457
    { Bad_Opcode },
6458
    { PREFIX_TABLE (PREFIX_0F7C) },
6459
    { PREFIX_TABLE (PREFIX_0F7D) },
6460
    { PREFIX_TABLE (PREFIX_VEX_0F7E) },
6461
    { PREFIX_TABLE (PREFIX_VEX_0F7F) },
6462
    /* 80 */
6463
    { Bad_Opcode },
6464
    { Bad_Opcode },
6465
    { Bad_Opcode },
6466
    { Bad_Opcode },
6467
    { Bad_Opcode },
6468
    { Bad_Opcode },
6469
    { Bad_Opcode },
6470
    { Bad_Opcode },
6471
    /* 88 */
6472
    { Bad_Opcode },
6473
    { Bad_Opcode },
6474
    { Bad_Opcode },
6475
    { Bad_Opcode },
6476
    { Bad_Opcode },
6477
    { Bad_Opcode },
6478
    { Bad_Opcode },
6479
    { Bad_Opcode },
6480
    /* 90 */
6481
    { VEX_LEN_TABLE (VEX_LEN_0F90) },
6482
    { VEX_LEN_TABLE (VEX_LEN_0F91) },
6483
    { VEX_LEN_TABLE (VEX_LEN_0F92) },
6484
    { VEX_LEN_TABLE (VEX_LEN_0F93) },
6485
    { Bad_Opcode },
6486
    { Bad_Opcode },
6487
    { Bad_Opcode },
6488
    { Bad_Opcode },
6489
    /* 98 */
6490
    { VEX_LEN_TABLE (VEX_LEN_0F98) },
6491
    { VEX_LEN_TABLE (VEX_LEN_0F99) },
6492
    { Bad_Opcode },
6493
    { Bad_Opcode },
6494
    { Bad_Opcode },
6495
    { Bad_Opcode },
6496
    { Bad_Opcode },
6497
    { Bad_Opcode },
6498
    /* a0 */
6499
    { Bad_Opcode },
6500
    { Bad_Opcode },
6501
    { Bad_Opcode },
6502
    { Bad_Opcode },
6503
    { Bad_Opcode },
6504
    { Bad_Opcode },
6505
    { Bad_Opcode },
6506
    { Bad_Opcode },
6507
    /* a8 */
6508
    { Bad_Opcode },
6509
    { Bad_Opcode },
6510
    { Bad_Opcode },
6511
    { Bad_Opcode },
6512
    { Bad_Opcode },
6513
    { Bad_Opcode },
6514
    { REG_TABLE (REG_VEX_0FAE) },
6515
    { Bad_Opcode },
6516
    /* b0 */
6517
    { Bad_Opcode },
6518
    { Bad_Opcode },
6519
    { Bad_Opcode },
6520
    { Bad_Opcode },
6521
    { Bad_Opcode },
6522
    { Bad_Opcode },
6523
    { Bad_Opcode },
6524
    { Bad_Opcode },
6525
    /* b8 */
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
    /* c0 */
6535
    { Bad_Opcode },
6536
    { Bad_Opcode },
6537
    { PREFIX_TABLE (PREFIX_0FC2) },
6538
    { Bad_Opcode },
6539
    { VEX_LEN_TABLE (VEX_LEN_0FC4) },
6540
    { "vpextrw",  { Gd, Uxmm, Ib }, PREFIX_DATA },
6541
    { "vshufpX",  { XM, Vex, EXx, Ib }, PREFIX_OPCODE },
6542
    { Bad_Opcode },
6543
    /* c8 */
6544
    { Bad_Opcode },
6545
    { Bad_Opcode },
6546
    { Bad_Opcode },
6547
    { Bad_Opcode },
6548
    { Bad_Opcode },
6549
    { Bad_Opcode },
6550
    { Bad_Opcode },
6551
    { Bad_Opcode },
6552
    /* d0 */
6553
    { PREFIX_TABLE (PREFIX_0FD0) },
6554
    { "vpsrlw",   { XM, Vex, EXxmm }, PREFIX_DATA },
6555
    { "vpsrld",   { XM, Vex, EXxmm }, PREFIX_DATA },
6556
    { "vpsrlq",   { XM, Vex, EXxmm }, PREFIX_DATA },
6557
    { "vpaddq",   { XM, Vex, EXx }, PREFIX_DATA },
6558
    { "vpmullw",  { XM, Vex, EXx }, PREFIX_DATA },
6559
    { VEX_LEN_TABLE (VEX_LEN_0FD6) },
6560
    { "vpmovmskb",  { Gdq, Ux }, PREFIX_DATA },
6561
    /* d8 */
6562
    { "vpsubusb", { XM, Vex, EXx }, PREFIX_DATA },
6563
    { "vpsubusw", { XM, Vex, EXx }, PREFIX_DATA },
6564
    { "vpminub",  { XM, Vex, EXx }, PREFIX_DATA },
6565
    { "vpand",    { XM, Vex, EXx }, PREFIX_DATA },
6566
    { "vpaddusb", { XM, Vex, EXx }, PREFIX_DATA },
6567
    { "vpaddusw", { XM, Vex, EXx }, PREFIX_DATA },
6568
    { "vpmaxub",  { XM, Vex, EXx }, PREFIX_DATA },
6569
    { "vpandn",   { XM, Vex, EXx }, PREFIX_DATA },
6570
    /* e0 */
6571
    { "vpavgb",   { XM, Vex, EXx }, PREFIX_DATA },
6572
    { "vpsraw",   { XM, Vex, EXxmm }, PREFIX_DATA },
6573
    { "vpsrad",   { XM, Vex, EXxmm }, PREFIX_DATA },
6574
    { "vpavgw",   { XM, Vex, EXx }, PREFIX_DATA },
6575
    { "vpmulhuw", { XM, Vex, EXx }, PREFIX_DATA },
6576
    { "vpmulhw",  { XM, Vex, EXx }, PREFIX_DATA },
6577
    { PREFIX_TABLE (PREFIX_0FE6) },
6578
    { "vmovntdq", { Mx, XM }, PREFIX_DATA },
6579
    /* e8 */
6580
    { "vpsubsb",  { XM, Vex, EXx }, PREFIX_DATA },
6581
    { "vpsubsw",  { XM, Vex, EXx }, PREFIX_DATA },
6582
    { "vpminsw",  { XM, Vex, EXx }, PREFIX_DATA },
6583
    { "vpor",   { XM, Vex, EXx }, PREFIX_DATA },
6584
    { "vpaddsb",  { XM, Vex, EXx }, PREFIX_DATA },
6585
    { "vpaddsw",  { XM, Vex, EXx }, PREFIX_DATA },
6586
    { "vpmaxsw",  { XM, Vex, EXx }, PREFIX_DATA },
6587
    { "vpxor",    { XM, Vex, EXx }, PREFIX_DATA },
6588
    /* f0 */
6589
    { PREFIX_TABLE (PREFIX_0FF0) },
6590
    { "vpsllw",   { XM, Vex, EXxmm }, PREFIX_DATA },
6591
    { "vpslld",   { XM, Vex, EXxmm }, PREFIX_DATA },
6592
    { "vpsllq",   { XM, Vex, EXxmm }, PREFIX_DATA },
6593
    { "vpmuludq", { XM, Vex, EXx }, PREFIX_DATA },
6594
    { "vpmaddwd", { XM, Vex, EXx }, PREFIX_DATA },
6595
    { "vpsadbw",  { XM, Vex, EXx }, PREFIX_DATA },
6596
    { "vmaskmovdqu",  { XM, Uxmm }, PREFIX_DATA },
6597
    /* f8 */
6598
    { "vpsubb",   { XM, Vex, EXx }, PREFIX_DATA },
6599
    { "vpsubw",   { XM, Vex, EXx }, PREFIX_DATA },
6600
    { "vpsubd",   { XM, Vex, EXx }, PREFIX_DATA },
6601
    { "vpsubq",   { XM, Vex, EXx }, PREFIX_DATA },
6602
    { "vpaddb",   { XM, Vex, EXx }, PREFIX_DATA },
6603
    { "vpaddw",   { XM, Vex, EXx }, PREFIX_DATA },
6604
    { "vpaddd",   { XM, Vex, EXx }, PREFIX_DATA },
6605
    { Bad_Opcode },
6606
  },
6607
  /* VEX_0F38 */
6608
  {
6609
    /* 00 */
6610
    { "vpshufb",  { XM, Vex, EXx }, PREFIX_DATA },
6611
    { "vphaddw",  { XM, Vex, EXx }, PREFIX_DATA },
6612
    { "vphaddd",  { XM, Vex, EXx }, PREFIX_DATA },
6613
    { "vphaddsw", { XM, Vex, EXx }, PREFIX_DATA },
6614
    { "vpmaddubsw", { XM, Vex, EXx }, PREFIX_DATA },
6615
    { "vphsubw",  { XM, Vex, EXx }, PREFIX_DATA },
6616
    { "vphsubd",  { XM, Vex, EXx }, PREFIX_DATA },
6617
    { "vphsubsw", { XM, Vex, EXx }, PREFIX_DATA },
6618
    /* 08 */
6619
    { "vpsignb",  { XM, Vex, EXx }, PREFIX_DATA },
6620
    { "vpsignw",  { XM, Vex, EXx }, PREFIX_DATA },
6621
    { "vpsignd",  { XM, Vex, EXx }, PREFIX_DATA },
6622
    { "vpmulhrsw",  { XM, Vex, EXx }, PREFIX_DATA },
6623
    { VEX_W_TABLE (VEX_W_0F380C) },
6624
    { VEX_W_TABLE (VEX_W_0F380D) },
6625
    { VEX_W_TABLE (VEX_W_0F380E) },
6626
    { VEX_W_TABLE (VEX_W_0F380F) },
6627
    /* 10 */
6628
    { Bad_Opcode },
6629
    { Bad_Opcode },
6630
    { Bad_Opcode },
6631
    { VEX_W_TABLE (VEX_W_0F3813) },
6632
    { Bad_Opcode },
6633
    { Bad_Opcode },
6634
    { VEX_LEN_TABLE (VEX_LEN_0F3816) },
6635
    { "vptest",   { XM, EXx }, PREFIX_DATA },
6636
    /* 18 */
6637
    { VEX_W_TABLE (VEX_W_0F3818) },
6638
    { VEX_LEN_TABLE (VEX_LEN_0F3819) },
6639
    { VEX_LEN_TABLE (VEX_LEN_0F381A) },
6640
    { Bad_Opcode },
6641
    { "vpabsb",   { XM, EXx }, PREFIX_DATA },
6642
    { "vpabsw",   { XM, EXx }, PREFIX_DATA },
6643
    { "vpabsd",   { XM, EXx }, PREFIX_DATA },
6644
    { Bad_Opcode },
6645
    /* 20 */
6646
    { "vpmovsxbw",  { XM, EXxmmq }, PREFIX_DATA },
6647
    { "vpmovsxbd",  { XM, EXxmmqd }, PREFIX_DATA },
6648
    { "vpmovsxbq",  { XM, EXxmmdw }, PREFIX_DATA },
6649
    { "vpmovsxwd",  { XM, EXxmmq }, PREFIX_DATA },
6650
    { "vpmovsxwq",  { XM, EXxmmqd }, PREFIX_DATA },
6651
    { "vpmovsxdq",  { XM, EXxmmq }, PREFIX_DATA },
6652
    { Bad_Opcode },
6653
    { Bad_Opcode },
6654
    /* 28 */
6655
    { "vpmuldq",  { XM, Vex, EXx }, PREFIX_DATA },
6656
    { "vpcmpeqq", { XM, Vex, EXx }, PREFIX_DATA },
6657
    { "vmovntdqa",  { XM, Mx }, PREFIX_DATA },
6658
    { "vpackusdw",  { XM, Vex, EXx }, PREFIX_DATA },
6659
    { VEX_W_TABLE (VEX_W_0F382C) },
6660
    { VEX_W_TABLE (VEX_W_0F382D) },
6661
    { VEX_W_TABLE (VEX_W_0F382E) },
6662
    { VEX_W_TABLE (VEX_W_0F382F) },
6663
    /* 30 */
6664
    { "vpmovzxbw",  { XM, EXxmmq }, PREFIX_DATA },
6665
    { "vpmovzxbd",  { XM, EXxmmqd }, PREFIX_DATA },
6666
    { "vpmovzxbq",  { XM, EXxmmdw }, PREFIX_DATA },
6667
    { "vpmovzxwd",  { XM, EXxmmq }, PREFIX_DATA },
6668
    { "vpmovzxwq",  { XM, EXxmmqd }, PREFIX_DATA },
6669
    { "vpmovzxdq",  { XM, EXxmmq }, PREFIX_DATA },
6670
    { VEX_LEN_TABLE (VEX_LEN_0F3836) },
6671
    { "vpcmpgtq", { XM, Vex, EXx }, PREFIX_DATA },
6672
    /* 38 */
6673
    { "vpminsb",  { XM, Vex, EXx }, PREFIX_DATA },
6674
    { "vpminsd",  { XM, Vex, EXx }, PREFIX_DATA },
6675
    { "vpminuw",  { XM, Vex, EXx }, PREFIX_DATA },
6676
    { "vpminud",  { XM, Vex, EXx }, PREFIX_DATA },
6677
    { "vpmaxsb",  { XM, Vex, EXx }, PREFIX_DATA },
6678
    { "vpmaxsd",  { XM, Vex, EXx }, PREFIX_DATA },
6679
    { "vpmaxuw",  { XM, Vex, EXx }, PREFIX_DATA },
6680
    { "vpmaxud",  { XM, Vex, EXx }, PREFIX_DATA },
6681
    /* 40 */
6682
    { "vpmulld",  { XM, Vex, EXx }, PREFIX_DATA },
6683
    { VEX_LEN_TABLE (VEX_LEN_0F3841) },
6684
    { Bad_Opcode },
6685
    { Bad_Opcode },
6686
    { Bad_Opcode },
6687
    { "vpsrlv%DQ", { XM, Vex, EXx }, PREFIX_DATA },
6688
    { VEX_W_TABLE (VEX_W_0F3846) },
6689
    { "vpsllv%DQ", { XM, Vex, EXx }, PREFIX_DATA },
6690
    /* 48 */
6691
    { X86_64_TABLE (X86_64_VEX_0F3848) },
6692
    { X86_64_TABLE (X86_64_VEX_0F3849) },
6693
    { X86_64_TABLE (X86_64_VEX_0F384A) },
6694
    { X86_64_TABLE (X86_64_VEX_0F384B) },
6695
    { Bad_Opcode },
6696
    { Bad_Opcode },
6697
    { Bad_Opcode },
6698
    { Bad_Opcode },
6699
    /* 50 */
6700
    { VEX_W_TABLE (VEX_W_0F3850) },
6701
    { VEX_W_TABLE (VEX_W_0F3851) },
6702
    { VEX_W_TABLE (VEX_W_0F3852) },
6703
    { VEX_W_TABLE (VEX_W_0F3853) },
6704
    { Bad_Opcode },
6705
    { Bad_Opcode },
6706
    { Bad_Opcode },
6707
    { Bad_Opcode },
6708
    /* 58 */
6709
    { VEX_W_TABLE (VEX_W_0F3858) },
6710
    { VEX_W_TABLE (VEX_W_0F3859) },
6711
    { VEX_LEN_TABLE (VEX_LEN_0F385A) },
6712
    { Bad_Opcode },
6713
    { X86_64_TABLE (X86_64_VEX_0F385C) },
6714
    { Bad_Opcode },
6715
    { X86_64_TABLE (X86_64_VEX_0F385E) },
6716
    { X86_64_TABLE (X86_64_VEX_0F385F) },
6717
    /* 60 */
6718
    { Bad_Opcode },
6719
    { Bad_Opcode },
6720
    { Bad_Opcode },
6721
    { Bad_Opcode },
6722
    { Bad_Opcode },
6723
    { Bad_Opcode },
6724
    { Bad_Opcode },
6725
    { Bad_Opcode },
6726
    /* 68 */
6727
    { Bad_Opcode },
6728
    { Bad_Opcode },
6729
    { Bad_Opcode },
6730
    { X86_64_TABLE (X86_64_VEX_0F386B) },
6731
    { X86_64_TABLE (X86_64_VEX_0F386C) },
6732
    { Bad_Opcode },
6733
    { X86_64_TABLE (X86_64_VEX_0F386E) },
6734
    { X86_64_TABLE (X86_64_VEX_0F386F) },
6735
    /* 70 */
6736
    { Bad_Opcode },
6737
    { Bad_Opcode },
6738
    { PREFIX_TABLE (PREFIX_VEX_0F3872) },
6739
    { Bad_Opcode },
6740
    { Bad_Opcode },
6741
    { Bad_Opcode },
6742
    { Bad_Opcode },
6743
    { Bad_Opcode },
6744
    /* 78 */
6745
    { VEX_W_TABLE (VEX_W_0F3878) },
6746
    { VEX_W_TABLE (VEX_W_0F3879) },
6747
    { Bad_Opcode },
6748
    { Bad_Opcode },
6749
    { Bad_Opcode },
6750
    { Bad_Opcode },
6751
    { Bad_Opcode },
6752
    { Bad_Opcode },
6753
    /* 80 */
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
    /* 88 */
6763
    { Bad_Opcode },
6764
    { Bad_Opcode },
6765
    { Bad_Opcode },
6766
    { Bad_Opcode },
6767
    { "vpmaskmov%DQ", { XM, Vex, Mx }, PREFIX_DATA },
6768
    { Bad_Opcode },
6769
    { "vpmaskmov%DQ", { Mx, Vex, XM }, PREFIX_DATA },
6770
    { Bad_Opcode },
6771
    /* 90 */
6772
    { "vpgatherd%DQ", { XM, MVexVSIBDWpX, VexGatherD }, PREFIX_DATA },
6773
    { "vpgatherq%DQ", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, PREFIX_DATA },
6774
    { "vgatherdp%XW", { XM, MVexVSIBDWpX, VexGatherD }, PREFIX_DATA },
6775
    { "vgatherqp%XW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, PREFIX_DATA },
6776
    { Bad_Opcode },
6777
    { Bad_Opcode },
6778
    { "vfmaddsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6779
    { "vfmsubadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6780
    /* 98 */
6781
    { "vfmadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6782
    { "vfmadd132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6783
    { "vfmsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6784
    { "vfmsub132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6785
    { "vfnmadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6786
    { "vfnmadd132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6787
    { "vfnmsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6788
    { "vfnmsub132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6789
    /* a0 */
6790
    { Bad_Opcode },
6791
    { Bad_Opcode },
6792
    { Bad_Opcode },
6793
    { Bad_Opcode },
6794
    { Bad_Opcode },
6795
    { Bad_Opcode },
6796
    { "vfmaddsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6797
    { "vfmsubadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6798
    /* a8 */
6799
    { "vfmadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6800
    { "vfmadd213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6801
    { "vfmsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6802
    { "vfmsub213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6803
    { "vfnmadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6804
    { "vfnmadd213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6805
    { "vfnmsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6806
    { "vfnmsub213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6807
    /* b0 */
6808
    { VEX_W_TABLE (VEX_W_0F38B0) },
6809
    { VEX_W_TABLE (VEX_W_0F38B1) },
6810
    { Bad_Opcode },
6811
    { Bad_Opcode },
6812
    { VEX_W_TABLE (VEX_W_0F38B4) },
6813
    { VEX_W_TABLE (VEX_W_0F38B5) },
6814
    { "vfmaddsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6815
    { "vfmsubadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6816
    /* b8 */
6817
    { "vfmadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6818
    { "vfmadd231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6819
    { "vfmsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6820
    { "vfmsub231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6821
    { "vfnmadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6822
    { "vfnmadd231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6823
    { "vfnmsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6824
    { "vfnmsub231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6825
    /* c0 */
6826
    { Bad_Opcode },
6827
    { Bad_Opcode },
6828
    { Bad_Opcode },
6829
    { Bad_Opcode },
6830
    { Bad_Opcode },
6831
    { Bad_Opcode },
6832
    { Bad_Opcode },
6833
    { Bad_Opcode },
6834
    /* c8 */
6835
    { Bad_Opcode },
6836
    { Bad_Opcode },
6837
    { Bad_Opcode },
6838
    { PREFIX_TABLE (PREFIX_VEX_0F38CB) },
6839
    { PREFIX_TABLE (PREFIX_VEX_0F38CC) },
6840
    { PREFIX_TABLE (PREFIX_VEX_0F38CD) },
6841
    { Bad_Opcode },
6842
    { VEX_W_TABLE (VEX_W_0F38CF) },
6843
    /* d0 */
6844
    { Bad_Opcode },
6845
    { Bad_Opcode },
6846
    { VEX_W_TABLE (VEX_W_0F38D2) },
6847
    { VEX_W_TABLE (VEX_W_0F38D3) },
6848
    { Bad_Opcode },
6849
    { Bad_Opcode },
6850
    { Bad_Opcode },
6851
    { Bad_Opcode },
6852
    /* d8 */
6853
    { Bad_Opcode },
6854
    { Bad_Opcode },
6855
    { VEX_W_TABLE (VEX_W_0F38DA) },
6856
    { VEX_LEN_TABLE (VEX_LEN_0F38DB) },
6857
    { "vaesenc",  { XM, Vex, EXx }, PREFIX_DATA },
6858
    { "vaesenclast",  { XM, Vex, EXx }, PREFIX_DATA },
6859
    { "vaesdec",  { XM, Vex, EXx }, PREFIX_DATA },
6860
    { "vaesdeclast",  { XM, Vex, EXx }, PREFIX_DATA },
6861
    /* e0 */
6862
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6863
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6864
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6865
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6866
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6867
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6868
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6869
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6870
    /* e8 */
6871
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6872
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6873
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6874
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6875
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6876
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6877
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6878
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6879
    /* f0 */
6880
    { Bad_Opcode },
6881
    { Bad_Opcode },
6882
    { VEX_LEN_TABLE (VEX_LEN_0F38F2) },
6883
    { VEX_LEN_TABLE (VEX_LEN_0F38F3) },
6884
    { Bad_Opcode },
6885
    { VEX_LEN_TABLE (VEX_LEN_0F38F5) },
6886
    { VEX_LEN_TABLE (VEX_LEN_0F38F6) },
6887
    { VEX_LEN_TABLE (VEX_LEN_0F38F7) },
6888
    /* f8 */
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
  },
6898
  /* VEX_0F3A */
6899
  {
6900
    /* 00 */
6901
    { VEX_LEN_TABLE (VEX_LEN_0F3A00) },
6902
    { VEX_LEN_TABLE (VEX_LEN_0F3A01) },
6903
    { VEX_W_TABLE (VEX_W_0F3A02) },
6904
    { Bad_Opcode },
6905
    { VEX_W_TABLE (VEX_W_0F3A04) },
6906
    { VEX_W_TABLE (VEX_W_0F3A05) },
6907
    { VEX_LEN_TABLE (VEX_LEN_0F3A06) },
6908
    { Bad_Opcode },
6909
    /* 08 */
6910
    { "vroundps", { XM, EXx, Ib }, PREFIX_DATA },
6911
    { "vroundpd", { XM, EXx, Ib }, PREFIX_DATA },
6912
    { "vroundss", { XMScalar, VexScalar, EXd, Ib }, PREFIX_DATA },
6913
    { "vroundsd", { XMScalar, VexScalar, EXq, Ib }, PREFIX_DATA },
6914
    { "vblendps", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6915
    { "vblendpd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6916
    { "vpblendw", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6917
    { "vpalignr", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6918
    /* 10 */
6919
    { Bad_Opcode },
6920
    { Bad_Opcode },
6921
    { Bad_Opcode },
6922
    { Bad_Opcode },
6923
    { VEX_LEN_TABLE (VEX_LEN_0F3A14) },
6924
    { VEX_LEN_TABLE (VEX_LEN_0F3A15) },
6925
    { VEX_LEN_TABLE (VEX_LEN_0F3A16) },
6926
    { VEX_LEN_TABLE (VEX_LEN_0F3A17) },
6927
    /* 18 */
6928
    { VEX_LEN_TABLE (VEX_LEN_0F3A18) },
6929
    { VEX_LEN_TABLE (VEX_LEN_0F3A19) },
6930
    { Bad_Opcode },
6931
    { Bad_Opcode },
6932
    { Bad_Opcode },
6933
    { VEX_W_TABLE (VEX_W_0F3A1D) },
6934
    { Bad_Opcode },
6935
    { Bad_Opcode },
6936
    /* 20 */
6937
    { VEX_LEN_TABLE (VEX_LEN_0F3A20) },
6938
    { VEX_LEN_TABLE (VEX_LEN_0F3A21) },
6939
    { VEX_LEN_TABLE (VEX_LEN_0F3A22) },
6940
    { Bad_Opcode },
6941
    { Bad_Opcode },
6942
    { Bad_Opcode },
6943
    { Bad_Opcode },
6944
    { Bad_Opcode },
6945
    /* 28 */
6946
    { Bad_Opcode },
6947
    { Bad_Opcode },
6948
    { Bad_Opcode },
6949
    { Bad_Opcode },
6950
    { Bad_Opcode },
6951
    { Bad_Opcode },
6952
    { Bad_Opcode },
6953
    { Bad_Opcode },
6954
    /* 30 */
6955
    { VEX_LEN_TABLE (VEX_LEN_0F3A30) },
6956
    { VEX_LEN_TABLE (VEX_LEN_0F3A31) },
6957
    { VEX_LEN_TABLE (VEX_LEN_0F3A32) },
6958
    { VEX_LEN_TABLE (VEX_LEN_0F3A33) },
6959
    { Bad_Opcode },
6960
    { Bad_Opcode },
6961
    { Bad_Opcode },
6962
    { Bad_Opcode },
6963
    /* 38 */
6964
    { VEX_LEN_TABLE (VEX_LEN_0F3A38) },
6965
    { VEX_LEN_TABLE (VEX_LEN_0F3A39) },
6966
    { Bad_Opcode },
6967
    { Bad_Opcode },
6968
    { Bad_Opcode },
6969
    { Bad_Opcode },
6970
    { Bad_Opcode },
6971
    { Bad_Opcode },
6972
    /* 40 */
6973
    { "vdpps",    { XM, Vex, EXx, Ib }, PREFIX_DATA },
6974
    { VEX_LEN_TABLE (VEX_LEN_0F3A41) },
6975
    { "vmpsadbw", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6976
    { Bad_Opcode },
6977
    { "vpclmulqdq", { XM, Vex, EXx, PCLMUL }, PREFIX_DATA },
6978
    { Bad_Opcode },
6979
    { VEX_LEN_TABLE (VEX_LEN_0F3A46) },
6980
    { Bad_Opcode },
6981
    /* 48 */
6982
    { "vpermil2ps", { XM, Vex, EXx, XMVexI4, VexI4 }, PREFIX_DATA },
6983
    { "vpermil2pd", { XM, Vex, EXx, XMVexI4, VexI4 }, PREFIX_DATA },
6984
    { VEX_W_TABLE (VEX_W_0F3A4A) },
6985
    { VEX_W_TABLE (VEX_W_0F3A4B) },
6986
    { VEX_W_TABLE (VEX_W_0F3A4C) },
6987
    { Bad_Opcode },
6988
    { Bad_Opcode },
6989
    { Bad_Opcode },
6990
    /* 50 */
6991
    { Bad_Opcode },
6992
    { Bad_Opcode },
6993
    { Bad_Opcode },
6994
    { Bad_Opcode },
6995
    { Bad_Opcode },
6996
    { Bad_Opcode },
6997
    { Bad_Opcode },
6998
    { Bad_Opcode },
6999
    /* 58 */
7000
    { Bad_Opcode },
7001
    { Bad_Opcode },
7002
    { Bad_Opcode },
7003
    { Bad_Opcode },
7004
    { "vfmaddsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7005
    { "vfmaddsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7006
    { "vfmsubaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7007
    { "vfmsubaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7008
    /* 60 */
7009
    { VEX_LEN_TABLE (VEX_LEN_0F3A60) },
7010
    { VEX_LEN_TABLE (VEX_LEN_0F3A61) },
7011
    { VEX_LEN_TABLE (VEX_LEN_0F3A62) },
7012
    { VEX_LEN_TABLE (VEX_LEN_0F3A63) },
7013
    { Bad_Opcode },
7014
    { Bad_Opcode },
7015
    { Bad_Opcode },
7016
    { Bad_Opcode },
7017
    /* 68 */
7018
    { "vfmaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7019
    { "vfmaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7020
    { "vfmaddss", { XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA },
7021
    { "vfmaddsd", { XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA },
7022
    { "vfmsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7023
    { "vfmsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7024
    { "vfmsubss", { XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA },
7025
    { "vfmsubsd", { XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA },
7026
    /* 70 */
7027
    { Bad_Opcode },
7028
    { Bad_Opcode },
7029
    { Bad_Opcode },
7030
    { Bad_Opcode },
7031
    { Bad_Opcode },
7032
    { Bad_Opcode },
7033
    { Bad_Opcode },
7034
    { Bad_Opcode },
7035
    /* 78 */
7036
    { "vfnmaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7037
    { "vfnmaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7038
    { "vfnmaddss",  { XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA },
7039
    { "vfnmaddsd",  { XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA },
7040
    { "vfnmsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7041
    { "vfnmsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7042
    { "vfnmsubss",  { XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA },
7043
    { "vfnmsubsd",  { XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA },
7044
    /* 80 */
7045
    { Bad_Opcode },
7046
    { Bad_Opcode },
7047
    { Bad_Opcode },
7048
    { Bad_Opcode },
7049
    { Bad_Opcode },
7050
    { Bad_Opcode },
7051
    { Bad_Opcode },
7052
    { Bad_Opcode },
7053
    /* 88 */
7054
    { Bad_Opcode },
7055
    { Bad_Opcode },
7056
    { Bad_Opcode },
7057
    { Bad_Opcode },
7058
    { Bad_Opcode },
7059
    { Bad_Opcode },
7060
    { Bad_Opcode },
7061
    { Bad_Opcode },
7062
    /* 90 */
7063
    { Bad_Opcode },
7064
    { Bad_Opcode },
7065
    { Bad_Opcode },
7066
    { Bad_Opcode },
7067
    { Bad_Opcode },
7068
    { Bad_Opcode },
7069
    { Bad_Opcode },
7070
    { Bad_Opcode },
7071
    /* 98 */
7072
    { Bad_Opcode },
7073
    { Bad_Opcode },
7074
    { Bad_Opcode },
7075
    { Bad_Opcode },
7076
    { Bad_Opcode },
7077
    { Bad_Opcode },
7078
    { Bad_Opcode },
7079
    { Bad_Opcode },
7080
    /* a0 */
7081
    { Bad_Opcode },
7082
    { Bad_Opcode },
7083
    { Bad_Opcode },
7084
    { Bad_Opcode },
7085
    { Bad_Opcode },
7086
    { Bad_Opcode },
7087
    { Bad_Opcode },
7088
    { Bad_Opcode },
7089
    /* a8 */
7090
    { Bad_Opcode },
7091
    { Bad_Opcode },
7092
    { Bad_Opcode },
7093
    { Bad_Opcode },
7094
    { Bad_Opcode },
7095
    { Bad_Opcode },
7096
    { Bad_Opcode },
7097
    { Bad_Opcode },
7098
    /* b0 */
7099
    { Bad_Opcode },
7100
    { Bad_Opcode },
7101
    { Bad_Opcode },
7102
    { Bad_Opcode },
7103
    { Bad_Opcode },
7104
    { Bad_Opcode },
7105
    { Bad_Opcode },
7106
    { Bad_Opcode },
7107
    /* b8 */
7108
    { Bad_Opcode },
7109
    { Bad_Opcode },
7110
    { Bad_Opcode },
7111
    { Bad_Opcode },
7112
    { Bad_Opcode },
7113
    { Bad_Opcode },
7114
    { Bad_Opcode },
7115
    { Bad_Opcode },
7116
    /* c0 */
7117
    { Bad_Opcode },
7118
    { Bad_Opcode },
7119
    { Bad_Opcode },
7120
    { Bad_Opcode },
7121
    { Bad_Opcode },
7122
    { Bad_Opcode },
7123
    { Bad_Opcode },
7124
    { Bad_Opcode },
7125
    /* c8 */
7126
    { Bad_Opcode },
7127
    { Bad_Opcode },
7128
    { Bad_Opcode },
7129
    { Bad_Opcode },
7130
    { Bad_Opcode },
7131
    { Bad_Opcode },
7132
    { VEX_W_TABLE (VEX_W_0F3ACE) },
7133
    { VEX_W_TABLE (VEX_W_0F3ACF) },
7134
    /* d0 */
7135
    { Bad_Opcode },
7136
    { Bad_Opcode },
7137
    { Bad_Opcode },
7138
    { Bad_Opcode },
7139
    { Bad_Opcode },
7140
    { Bad_Opcode },
7141
    { Bad_Opcode },
7142
    { Bad_Opcode },
7143
    /* d8 */
7144
    { Bad_Opcode },
7145
    { Bad_Opcode },
7146
    { Bad_Opcode },
7147
    { Bad_Opcode },
7148
    { Bad_Opcode },
7149
    { Bad_Opcode },
7150
    { VEX_W_TABLE (VEX_W_0F3ADE) },
7151
    { VEX_LEN_TABLE (VEX_LEN_0F3ADF) },
7152
    /* e0 */
7153
    { Bad_Opcode },
7154
    { Bad_Opcode },
7155
    { Bad_Opcode },
7156
    { Bad_Opcode },
7157
    { Bad_Opcode },
7158
    { Bad_Opcode },
7159
    { Bad_Opcode },
7160
    { Bad_Opcode },
7161
    /* e8 */
7162
    { Bad_Opcode },
7163
    { Bad_Opcode },
7164
    { Bad_Opcode },
7165
    { Bad_Opcode },
7166
    { Bad_Opcode },
7167
    { Bad_Opcode },
7168
    { Bad_Opcode },
7169
    { Bad_Opcode },
7170
    /* f0 */
7171
    { VEX_LEN_TABLE (VEX_LEN_0F3AF0) },
7172
    { Bad_Opcode },
7173
    { Bad_Opcode },
7174
    { Bad_Opcode },
7175
    { Bad_Opcode },
7176
    { Bad_Opcode },
7177
    { Bad_Opcode },
7178
    { Bad_Opcode },
7179
    /* f8 */
7180
    { Bad_Opcode },
7181
    { Bad_Opcode },
7182
    { Bad_Opcode },
7183
    { Bad_Opcode },
7184
    { Bad_Opcode },
7185
    { Bad_Opcode },
7186
    { Bad_Opcode },
7187
    { Bad_Opcode },
7188
  },
7189
};
7190
7191
#include "i386-dis-evex.h"
7192
7193
static const struct dis386 vex_len_table[][2] = {
7194
  /* VEX_LEN_0F12_P_0 */
7195
  {
7196
    { MOD_TABLE (MOD_0F12_PREFIX_0) },
7197
  },
7198
7199
  /* VEX_LEN_0F12_P_2 */
7200
  {
7201
    { "%XEVmovlpYX",  { XM, Vex, Mq }, 0 },
7202
  },
7203
7204
  /* VEX_LEN_0F13 */
7205
  {
7206
    { "%XEVmovlpYX",  { Mq, XM }, PREFIX_OPCODE },
7207
  },
7208
7209
  /* VEX_LEN_0F16_P_0 */
7210
  {
7211
    { MOD_TABLE (MOD_0F16_PREFIX_0) },
7212
  },
7213
7214
  /* VEX_LEN_0F16_P_2 */
7215
  {
7216
    { "%XEVmovhpYX",  { XM, Vex, Mq }, 0 },
7217
  },
7218
7219
  /* VEX_LEN_0F17 */
7220
  {
7221
    { "%XEVmovhpYX",  { Mq, XM }, PREFIX_OPCODE },
7222
  },
7223
7224
  /* VEX_LEN_0F41 */
7225
  {
7226
    { Bad_Opcode },
7227
    { VEX_W_TABLE (VEX_W_0F41_L_1) },
7228
  },
7229
7230
  /* VEX_LEN_0F42 */
7231
  {
7232
    { Bad_Opcode },
7233
    { VEX_W_TABLE (VEX_W_0F42_L_1) },
7234
  },
7235
7236
  /* VEX_LEN_0F44 */
7237
  {
7238
    { VEX_W_TABLE (VEX_W_0F44_L_0) },
7239
  },
7240
7241
  /* VEX_LEN_0F45 */
7242
  {
7243
    { Bad_Opcode },
7244
    { VEX_W_TABLE (VEX_W_0F45_L_1) },
7245
  },
7246
7247
  /* VEX_LEN_0F46 */
7248
  {
7249
    { Bad_Opcode },
7250
    { VEX_W_TABLE (VEX_W_0F46_L_1) },
7251
  },
7252
7253
  /* VEX_LEN_0F47 */
7254
  {
7255
    { Bad_Opcode },
7256
    { VEX_W_TABLE (VEX_W_0F47_L_1) },
7257
  },
7258
7259
  /* VEX_LEN_0F4A */
7260
  {
7261
    { Bad_Opcode },
7262
    { VEX_W_TABLE (VEX_W_0F4A_L_1) },
7263
  },
7264
7265
  /* VEX_LEN_0F4B */
7266
  {
7267
    { Bad_Opcode },
7268
    { VEX_W_TABLE (VEX_W_0F4B_L_1) },
7269
  },
7270
7271
  /* VEX_LEN_0F6E */
7272
  {
7273
    { "%XEvmovYK",  { XMScalar, Edq }, PREFIX_DATA },
7274
  },
7275
7276
  /* VEX_LEN_0F77 */
7277
  {
7278
    { "vzeroupper", { XX }, 0 },
7279
    { "vzeroall", { XX }, 0 },
7280
  },
7281
7282
  /* VEX_LEN_0F7E_P_1 */
7283
  {
7284
    { "%XEvmovqY",  { XMScalar, EXq }, 0 },
7285
  },
7286
7287
  /* VEX_LEN_0F7E_P_2 */
7288
  {
7289
    { "%XEvmovK", { Edq, XMScalar }, 0 },
7290
  },
7291
7292
  /* VEX_LEN_0F90 */
7293
  {
7294
    { VEX_W_TABLE (VEX_W_0F90_L_0) },
7295
  },
7296
7297
  /* VEX_LEN_0F91 */
7298
  {
7299
    { VEX_W_TABLE (VEX_W_0F91_L_0) },
7300
  },
7301
7302
  /* VEX_LEN_0F92 */
7303
  {
7304
    { VEX_W_TABLE (VEX_W_0F92_L_0) },
7305
  },
7306
7307
  /* VEX_LEN_0F93 */
7308
  {
7309
    { VEX_W_TABLE (VEX_W_0F93_L_0) },
7310
  },
7311
7312
  /* VEX_LEN_0F98 */
7313
  {
7314
    { VEX_W_TABLE (VEX_W_0F98_L_0) },
7315
  },
7316
7317
  /* VEX_LEN_0F99 */
7318
  {
7319
    { VEX_W_TABLE (VEX_W_0F99_L_0) },
7320
  },
7321
7322
  /* VEX_LEN_0FAE_R_2 */
7323
  {
7324
    { "vldmxcsr", { Md }, 0 },
7325
  },
7326
7327
  /* VEX_LEN_0FAE_R_3 */
7328
  {
7329
    { "vstmxcsr", { Md }, 0 },
7330
  },
7331
7332
  /* VEX_LEN_0FC4 */
7333
  {
7334
    { "%XEvpinsrwY",  { XM, Vex, Edw, Ib }, PREFIX_DATA },
7335
  },
7336
7337
  /* VEX_LEN_0FD6 */
7338
  {
7339
    { "%XEvmovqY",  { EXqS, XMScalar }, PREFIX_DATA },
7340
  },
7341
7342
  /* VEX_LEN_0F3816 */
7343
  {
7344
    { Bad_Opcode },
7345
    { VEX_W_TABLE (VEX_W_0F3816_L_1) },
7346
  },
7347
7348
  /* VEX_LEN_0F3819 */
7349
  {
7350
    { Bad_Opcode },
7351
    { VEX_W_TABLE (VEX_W_0F3819_L_1) },
7352
  },
7353
7354
  /* VEX_LEN_0F381A */
7355
  {
7356
    { Bad_Opcode },
7357
    { VEX_W_TABLE (VEX_W_0F381A_L_1) },
7358
  },
7359
7360
  /* VEX_LEN_0F3836 */
7361
  {
7362
    { Bad_Opcode },
7363
    { VEX_W_TABLE (VEX_W_0F3836) },
7364
  },
7365
7366
  /* VEX_LEN_0F3841 */
7367
  {
7368
    { "vphminposuw",  { XM, EXx }, PREFIX_DATA },
7369
  },
7370
7371
  /* VEX_LEN_0F3848_X86_64 */
7372
  {
7373
    { VEX_W_TABLE (VEX_W_0F3848_X86_64_L_0) },
7374
  },
7375
7376
  /* VEX_LEN_0F3849_X86_64 */
7377
  {
7378
    { VEX_W_TABLE (VEX_W_0F3849_X86_64_L_0) },
7379
  },
7380
7381
  /* VEX_LEN_0F384A_X86_64_W_0 */
7382
  {
7383
    { PREFIX_TABLE (PREFIX_VEX_0F384A_X86_64_W_0_L_0) },
7384
  },
7385
7386
  /* VEX_LEN_0F384B_X86_64 */
7387
  {
7388
    { VEX_W_TABLE (VEX_W_0F384B_X86_64_L_0) },
7389
  },
7390
7391
  /* VEX_LEN_0F385A */
7392
  {
7393
    { Bad_Opcode },
7394
    { VEX_W_TABLE (VEX_W_0F385A_L_0) },
7395
  },
7396
7397
  /* VEX_LEN_0F385C_X86_64 */
7398
  {
7399
    { VEX_W_TABLE (VEX_W_0F385C_X86_64_L_0) },
7400
  },
7401
7402
  /* VEX_LEN_0F385E_X86_64 */
7403
  {
7404
    { VEX_W_TABLE (VEX_W_0F385E_X86_64_L_0) },
7405
  },
7406
7407
  /* VEX_LEN_0F385F_X86_64 */
7408
  {
7409
    { VEX_W_TABLE (VEX_W_0F385F_X86_64_L_0) },
7410
  },
7411
7412
  /* VEX_LEN_0F386B_X86_64 */
7413
  {
7414
    { VEX_W_TABLE (VEX_W_0F386B_X86_64_L_0) },
7415
  },
7416
7417
  /* VEX_LEN_0F386C_X86_64 */
7418
  {
7419
    { VEX_W_TABLE (VEX_W_0F386C_X86_64_L_0) },
7420
  },
7421
7422
  /* VEX_LEN_0F386E_X86_64 */
7423
  {
7424
    { VEX_W_TABLE (VEX_W_0F386E_X86_64_L_0) },
7425
  },
7426
7427
  /* VEX_LEN_0F386F_X86_64 */
7428
  {
7429
    { VEX_W_TABLE (VEX_W_0F386F_X86_64_L_0) },
7430
  },
7431
7432
  /* VEX_LEN_0F38CB_P_3_W_0 */
7433
  {
7434
    { Bad_Opcode },
7435
    { "vsha512rnds2", { XM, Vex, Rxmmq }, 0 },
7436
  },
7437
7438
  /* VEX_LEN_0F38CC_P_3_W_0 */
7439
  {
7440
    { Bad_Opcode },
7441
    { "vsha512msg1", { XM, Rxmmq }, 0 },
7442
  },
7443
7444
  /* VEX_LEN_0F38CD_P_3_W_0 */
7445
  {
7446
    { Bad_Opcode },
7447
    { "vsha512msg2", { XM, Rymm }, 0 },
7448
  },
7449
7450
  /* VEX_LEN_0F38DA_W_0_P_0 */
7451
  {
7452
    { "vsm3msg1", { XM, Vex, EXxmm }, 0 },
7453
  },
7454
7455
  /* VEX_LEN_0F38DA_W_0_P_2 */
7456
  {
7457
    { "vsm3msg2", { XM, Vex, EXxmm }, 0 },
7458
  },
7459
7460
  /* VEX_LEN_0F38DB */
7461
  {
7462
    { "vaesimc",  { XM, EXx }, PREFIX_DATA },
7463
  },
7464
7465
  /* VEX_LEN_0F38F2 */
7466
  {
7467
    { PREFIX_TABLE (PREFIX_VEX_0F38F2_L_0) },
7468
  },
7469
7470
  /* VEX_LEN_0F38F3 */
7471
  {
7472
    { PREFIX_TABLE (PREFIX_VEX_0F38F3_L_0) },
7473
  },
7474
7475
  /* VEX_LEN_0F38F5 */
7476
  {
7477
    { PREFIX_TABLE(PREFIX_VEX_0F38F5_L_0) },
7478
  },
7479
7480
  /* VEX_LEN_0F38F6 */
7481
  {
7482
    { PREFIX_TABLE(PREFIX_VEX_0F38F6_L_0) },
7483
  },
7484
7485
  /* VEX_LEN_0F38F7 */
7486
  {
7487
    { PREFIX_TABLE(PREFIX_VEX_0F38F7_L_0) },
7488
  },
7489
7490
  /* VEX_LEN_0F3A00 */
7491
  {
7492
    { Bad_Opcode },
7493
    { VEX_W_TABLE (VEX_W_0F3A00_L_1) },
7494
  },
7495
7496
  /* VEX_LEN_0F3A01 */
7497
  {
7498
    { Bad_Opcode },
7499
    { VEX_W_TABLE (VEX_W_0F3A01_L_1) },
7500
  },
7501
7502
  /* VEX_LEN_0F3A06 */
7503
  {
7504
    { Bad_Opcode },
7505
    { VEX_W_TABLE (VEX_W_0F3A06_L_1) },
7506
  },
7507
7508
  /* VEX_LEN_0F3A14 */
7509
  {
7510
    { "%XEvpextrb", { Edb, XM, Ib }, PREFIX_DATA },
7511
  },
7512
7513
  /* VEX_LEN_0F3A15 */
7514
  {
7515
    { "%XEvpextrw", { Edw, XM, Ib }, PREFIX_DATA },
7516
  },
7517
7518
  /* VEX_LEN_0F3A16  */
7519
  {
7520
    { "%XEvpextrK", { Edq, XM, Ib }, PREFIX_DATA },
7521
  },
7522
7523
  /* VEX_LEN_0F3A17 */
7524
  {
7525
    { "%XEvextractps",  { Ed, XM, Ib }, PREFIX_DATA },
7526
  },
7527
7528
  /* VEX_LEN_0F3A18 */
7529
  {
7530
    { Bad_Opcode },
7531
    { VEX_W_TABLE (VEX_W_0F3A18_L_1) },
7532
  },
7533
7534
  /* VEX_LEN_0F3A19 */
7535
  {
7536
    { Bad_Opcode },
7537
    { VEX_W_TABLE (VEX_W_0F3A19_L_1) },
7538
  },
7539
7540
  /* VEX_LEN_0F3A20 */
7541
  {
7542
    { "%XEvpinsrbY",  { XM, Vex, Edb, Ib }, PREFIX_DATA },
7543
  },
7544
7545
  /* VEX_LEN_0F3A21 */
7546
  {
7547
    { "%XEvinsertpsY",  { XM, Vex, EXd, Ib }, PREFIX_DATA },
7548
  },
7549
7550
  /* VEX_LEN_0F3A22 */
7551
  {
7552
    { "%XEvpinsrYK",  { XM, Vex, Edq, Ib }, PREFIX_DATA },
7553
  },
7554
7555
  /* VEX_LEN_0F3A30 */
7556
  {
7557
    { "kshiftr%BW", { MaskG, MaskR, Ib }, PREFIX_DATA },
7558
  },
7559
7560
  /* VEX_LEN_0F3A31 */
7561
  {
7562
    { "kshiftr%DQ", { MaskG, MaskR, Ib }, PREFIX_DATA },
7563
  },
7564
7565
  /* VEX_LEN_0F3A32 */
7566
  {
7567
    { "kshiftl%BW", { MaskG, MaskR, Ib }, PREFIX_DATA },
7568
  },
7569
7570
  /* VEX_LEN_0F3A33 */
7571
  {
7572
    { "kshiftl%DQ", { MaskG, MaskR, Ib }, PREFIX_DATA },
7573
  },
7574
7575
  /* VEX_LEN_0F3A38 */
7576
  {
7577
    { Bad_Opcode },
7578
    { VEX_W_TABLE (VEX_W_0F3A38_L_1) },
7579
  },
7580
7581
  /* VEX_LEN_0F3A39 */
7582
  {
7583
    { Bad_Opcode },
7584
    { VEX_W_TABLE (VEX_W_0F3A39_L_1) },
7585
  },
7586
7587
  /* VEX_LEN_0F3A41 */
7588
  {
7589
    { "vdppd",    { XM, Vex, EXx, Ib }, PREFIX_DATA },
7590
  },
7591
7592
  /* VEX_LEN_0F3A46 */
7593
  {
7594
    { Bad_Opcode },
7595
    { VEX_W_TABLE (VEX_W_0F3A46_L_1) },
7596
  },
7597
7598
  /* VEX_LEN_0F3A60 */
7599
  {
7600
    { "vpcmpestrm!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
7601
  },
7602
7603
  /* VEX_LEN_0F3A61 */
7604
  {
7605
    { "vpcmpestri!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
7606
  },
7607
7608
  /* VEX_LEN_0F3A62 */
7609
  {
7610
    { "vpcmpistrm", { XM, EXx, Ib }, PREFIX_DATA },
7611
  },
7612
7613
  /* VEX_LEN_0F3A63 */
7614
  {
7615
    { "vpcmpistri", { XM, EXx, Ib }, PREFIX_DATA },
7616
  },
7617
7618
  /* VEX_LEN_0F3ADE_W_0 */
7619
  {
7620
    { "vsm3rnds2", { XM, Vex, EXxmm, Ib }, PREFIX_DATA },
7621
  },
7622
7623
  /* VEX_LEN_0F3ADF */
7624
  {
7625
    { "vaeskeygenassist", { XM, EXx, Ib }, PREFIX_DATA },
7626
  },
7627
7628
  /* VEX_LEN_0F3AF0 */
7629
  {
7630
    { PREFIX_TABLE (PREFIX_VEX_0F3AF0_L_0) },
7631
  },
7632
7633
  /* VEX_LEN_MAP5_F8_X86_64 */
7634
  {
7635
    { VEX_W_TABLE (VEX_W_MAP5_F8_X86_64_L_0) },
7636
  },
7637
7638
  /* VEX_LEN_MAP5_F9_X86_64 */
7639
  {
7640
    { VEX_W_TABLE (VEX_W_MAP5_F9_X86_64_L_0) },
7641
  },
7642
7643
  /* VEX_LEN_MAP5_FD_X86_64 */
7644
  {
7645
    { VEX_W_TABLE (VEX_W_MAP5_FD_X86_64_L_0) },
7646
  },
7647
7648
  /* VEX_LEN_MAP7_F6 */
7649
  {
7650
    { VEX_W_TABLE (VEX_W_MAP7_F6_L_0) },
7651
  },
7652
7653
  /* VEX_LEN_MAP7_F8 */
7654
  {
7655
    { VEX_W_TABLE (VEX_W_MAP7_F8_L_0) },
7656
  },
7657
7658
  /* VEX_LEN_XOP_08_85 */
7659
  {
7660
    { VEX_W_TABLE (VEX_W_XOP_08_85_L_0) },
7661
  },
7662
7663
  /* VEX_LEN_XOP_08_86 */
7664
  {
7665
    { VEX_W_TABLE (VEX_W_XOP_08_86_L_0) },
7666
  },
7667
7668
  /* VEX_LEN_XOP_08_87 */
7669
  {
7670
    { VEX_W_TABLE (VEX_W_XOP_08_87_L_0) },
7671
  },
7672
7673
  /* VEX_LEN_XOP_08_8E */
7674
  {
7675
    { VEX_W_TABLE (VEX_W_XOP_08_8E_L_0) },
7676
  },
7677
7678
  /* VEX_LEN_XOP_08_8F */
7679
  {
7680
    { VEX_W_TABLE (VEX_W_XOP_08_8F_L_0) },
7681
  },
7682
7683
  /* VEX_LEN_XOP_08_95 */
7684
  {
7685
    { VEX_W_TABLE (VEX_W_XOP_08_95_L_0) },
7686
  },
7687
7688
  /* VEX_LEN_XOP_08_96 */
7689
  {
7690
    { VEX_W_TABLE (VEX_W_XOP_08_96_L_0) },
7691
  },
7692
7693
  /* VEX_LEN_XOP_08_97 */
7694
  {
7695
    { VEX_W_TABLE (VEX_W_XOP_08_97_L_0) },
7696
  },
7697
7698
  /* VEX_LEN_XOP_08_9E */
7699
  {
7700
    { VEX_W_TABLE (VEX_W_XOP_08_9E_L_0) },
7701
  },
7702
7703
  /* VEX_LEN_XOP_08_9F */
7704
  {
7705
    { VEX_W_TABLE (VEX_W_XOP_08_9F_L_0) },
7706
  },
7707
7708
  /* VEX_LEN_XOP_08_A3 */
7709
  {
7710
    { "vpperm",   { XM, Vex, EXx, XMVexI4 }, 0 },
7711
  },
7712
7713
  /* VEX_LEN_XOP_08_A6 */
7714
  {
7715
    { VEX_W_TABLE (VEX_W_XOP_08_A6_L_0) },
7716
  },
7717
7718
  /* VEX_LEN_XOP_08_B6 */
7719
  {
7720
    { VEX_W_TABLE (VEX_W_XOP_08_B6_L_0) },
7721
  },
7722
7723
  /* VEX_LEN_XOP_08_C0 */
7724
  {
7725
    { VEX_W_TABLE (VEX_W_XOP_08_C0_L_0) },
7726
  },
7727
7728
  /* VEX_LEN_XOP_08_C1 */
7729
  {
7730
    { VEX_W_TABLE (VEX_W_XOP_08_C1_L_0) },
7731
  },
7732
7733
  /* VEX_LEN_XOP_08_C2 */
7734
  {
7735
    { VEX_W_TABLE (VEX_W_XOP_08_C2_L_0) },
7736
  },
7737
7738
  /* VEX_LEN_XOP_08_C3 */
7739
  {
7740
    { VEX_W_TABLE (VEX_W_XOP_08_C3_L_0) },
7741
  },
7742
7743
  /* VEX_LEN_XOP_08_CC */
7744
  {
7745
    { VEX_W_TABLE (VEX_W_XOP_08_CC_L_0) },
7746
  },
7747
7748
  /* VEX_LEN_XOP_08_CD */
7749
  {
7750
    { VEX_W_TABLE (VEX_W_XOP_08_CD_L_0) },
7751
  },
7752
7753
  /* VEX_LEN_XOP_08_CE */
7754
  {
7755
    { VEX_W_TABLE (VEX_W_XOP_08_CE_L_0) },
7756
  },
7757
7758
  /* VEX_LEN_XOP_08_CF */
7759
  {
7760
    { VEX_W_TABLE (VEX_W_XOP_08_CF_L_0) },
7761
  },
7762
7763
  /* VEX_LEN_XOP_08_EC */
7764
  {
7765
    { VEX_W_TABLE (VEX_W_XOP_08_EC_L_0) },
7766
  },
7767
7768
  /* VEX_LEN_XOP_08_ED */
7769
  {
7770
    { VEX_W_TABLE (VEX_W_XOP_08_ED_L_0) },
7771
  },
7772
7773
  /* VEX_LEN_XOP_08_EE */
7774
  {
7775
    { VEX_W_TABLE (VEX_W_XOP_08_EE_L_0) },
7776
  },
7777
7778
  /* VEX_LEN_XOP_08_EF */
7779
  {
7780
    { VEX_W_TABLE (VEX_W_XOP_08_EF_L_0) },
7781
  },
7782
7783
  /* VEX_LEN_XOP_09_01 */
7784
  {
7785
    { REG_TABLE (REG_XOP_09_01_L_0) },
7786
  },
7787
7788
  /* VEX_LEN_XOP_09_02 */
7789
  {
7790
    { REG_TABLE (REG_XOP_09_02_L_0) },
7791
  },
7792
7793
  /* VEX_LEN_XOP_09_12 */
7794
  {
7795
    { REG_TABLE (REG_XOP_09_12_L_0) },
7796
  },
7797
7798
  /* VEX_LEN_XOP_09_82_W_0 */
7799
  {
7800
    { "vfrczss",  { XM, EXd }, 0 },
7801
  },
7802
7803
  /* VEX_LEN_XOP_09_83_W_0 */
7804
  {
7805
    { "vfrczsd",  { XM, EXq }, 0 },
7806
  },
7807
7808
  /* VEX_LEN_XOP_09_90 */
7809
  {
7810
    { "vprotb",   { XM, EXx, VexW }, 0 },
7811
  },
7812
7813
  /* VEX_LEN_XOP_09_91 */
7814
  {
7815
    { "vprotw",   { XM, EXx, VexW }, 0 },
7816
  },
7817
7818
  /* VEX_LEN_XOP_09_92 */
7819
  {
7820
    { "vprotd",   { XM, EXx, VexW }, 0 },
7821
  },
7822
7823
  /* VEX_LEN_XOP_09_93 */
7824
  {
7825
    { "vprotq",   { XM, EXx, VexW }, 0 },
7826
  },
7827
7828
  /* VEX_LEN_XOP_09_94 */
7829
  {
7830
    { "vpshlb",   { XM, EXx, VexW }, 0 },
7831
  },
7832
7833
  /* VEX_LEN_XOP_09_95 */
7834
  {
7835
    { "vpshlw",   { XM, EXx, VexW }, 0 },
7836
  },
7837
7838
  /* VEX_LEN_XOP_09_96 */
7839
  {
7840
    { "vpshld",   { XM, EXx, VexW }, 0 },
7841
  },
7842
7843
  /* VEX_LEN_XOP_09_97 */
7844
  {
7845
    { "vpshlq",   { XM, EXx, VexW }, 0 },
7846
  },
7847
7848
  /* VEX_LEN_XOP_09_98 */
7849
  {
7850
    { "vpshab",   { XM, EXx, VexW }, 0 },
7851
  },
7852
7853
  /* VEX_LEN_XOP_09_99 */
7854
  {
7855
    { "vpshaw",   { XM, EXx, VexW }, 0 },
7856
  },
7857
7858
  /* VEX_LEN_XOP_09_9A */
7859
  {
7860
    { "vpshad",   { XM, EXx, VexW }, 0 },
7861
  },
7862
7863
  /* VEX_LEN_XOP_09_9B */
7864
  {
7865
    { "vpshaq",   { XM, EXx, VexW }, 0 },
7866
  },
7867
7868
  /* VEX_LEN_XOP_09_C1 */
7869
  {
7870
    { VEX_W_TABLE (VEX_W_XOP_09_C1_L_0) },
7871
  },
7872
7873
  /* VEX_LEN_XOP_09_C2 */
7874
  {
7875
    { VEX_W_TABLE (VEX_W_XOP_09_C2_L_0) },
7876
  },
7877
7878
  /* VEX_LEN_XOP_09_C3 */
7879
  {
7880
    { VEX_W_TABLE (VEX_W_XOP_09_C3_L_0) },
7881
  },
7882
7883
  /* VEX_LEN_XOP_09_C6 */
7884
  {
7885
    { VEX_W_TABLE (VEX_W_XOP_09_C6_L_0) },
7886
  },
7887
7888
  /* VEX_LEN_XOP_09_C7 */
7889
  {
7890
    { VEX_W_TABLE (VEX_W_XOP_09_C7_L_0) },
7891
  },
7892
7893
  /* VEX_LEN_XOP_09_CB */
7894
  {
7895
    { VEX_W_TABLE (VEX_W_XOP_09_CB_L_0) },
7896
  },
7897
7898
  /* VEX_LEN_XOP_09_D1 */
7899
  {
7900
    { VEX_W_TABLE (VEX_W_XOP_09_D1_L_0) },
7901
  },
7902
7903
  /* VEX_LEN_XOP_09_D2 */
7904
  {
7905
    { VEX_W_TABLE (VEX_W_XOP_09_D2_L_0) },
7906
  },
7907
7908
  /* VEX_LEN_XOP_09_D3 */
7909
  {
7910
    { VEX_W_TABLE (VEX_W_XOP_09_D3_L_0) },
7911
  },
7912
7913
  /* VEX_LEN_XOP_09_D6 */
7914
  {
7915
    { VEX_W_TABLE (VEX_W_XOP_09_D6_L_0) },
7916
  },
7917
7918
  /* VEX_LEN_XOP_09_D7 */
7919
  {
7920
    { VEX_W_TABLE (VEX_W_XOP_09_D7_L_0) },
7921
  },
7922
7923
  /* VEX_LEN_XOP_09_DB */
7924
  {
7925
    { VEX_W_TABLE (VEX_W_XOP_09_DB_L_0) },
7926
  },
7927
7928
  /* VEX_LEN_XOP_09_E1 */
7929
  {
7930
    { VEX_W_TABLE (VEX_W_XOP_09_E1_L_0) },
7931
  },
7932
7933
  /* VEX_LEN_XOP_09_E2 */
7934
  {
7935
    { VEX_W_TABLE (VEX_W_XOP_09_E2_L_0) },
7936
  },
7937
7938
  /* VEX_LEN_XOP_09_E3 */
7939
  {
7940
    { VEX_W_TABLE (VEX_W_XOP_09_E3_L_0) },
7941
  },
7942
7943
  /* VEX_LEN_XOP_0A_12 */
7944
  {
7945
    { REG_TABLE (REG_XOP_0A_12_L_0) },
7946
  },
7947
};
7948
7949
#include "i386-dis-evex-len.h"
7950
7951
static const struct dis386 vex_w_table[][2] = {
7952
  {
7953
    /* VEX_W_0F41_L_1_M_1 */
7954
    { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_W_0) },
7955
    { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_W_1) },
7956
  },
7957
  {
7958
    /* VEX_W_0F42_L_1_M_1 */
7959
    { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_W_0) },
7960
    { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_W_1) },
7961
  },
7962
  {
7963
    /* VEX_W_0F44_L_0_M_1 */
7964
    { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_W_0) },
7965
    { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_W_1) },
7966
  },
7967
  {
7968
    /* VEX_W_0F45_L_1_M_1 */
7969
    { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_W_0) },
7970
    { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_W_1) },
7971
  },
7972
  {
7973
    /* VEX_W_0F46_L_1_M_1 */
7974
    { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_W_0) },
7975
    { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_W_1) },
7976
  },
7977
  {
7978
    /* VEX_W_0F47_L_1_M_1 */
7979
    { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_W_0) },
7980
    { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_W_1) },
7981
  },
7982
  {
7983
    /* VEX_W_0F4A_L_1_M_1 */
7984
    { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_W_0) },
7985
    { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_W_1) },
7986
  },
7987
  {
7988
    /* VEX_W_0F4B_L_1_M_1 */
7989
    { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_W_0) },
7990
    { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_W_1) },
7991
  },
7992
  {
7993
    /* VEX_W_0F90_L_0 */
7994
    { PREFIX_TABLE (PREFIX_VEX_0F90_L_0_W_0) },
7995
    { PREFIX_TABLE (PREFIX_VEX_0F90_L_0_W_1) },
7996
  },
7997
  {
7998
    /* VEX_W_0F91_L_0_M_0 */
7999
    { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_W_0) },
8000
    { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_W_1) },
8001
  },
8002
  {
8003
    /* VEX_W_0F92_L_0_M_1 */
8004
    { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_W_0) },
8005
    { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_W_1) },
8006
  },
8007
  {
8008
    /* VEX_W_0F93_L_0_M_1 */
8009
    { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_W_0) },
8010
    { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_W_1) },
8011
  },
8012
  {
8013
    /* VEX_W_0F98_L_0_M_1 */
8014
    { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_W_0) },
8015
    { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_W_1) },
8016
  },
8017
  {
8018
    /* VEX_W_0F99_L_0_M_1 */
8019
    { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_W_0) },
8020
    { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_W_1) },
8021
  },
8022
  {
8023
    /* VEX_W_0F380C  */
8024
    { "%XEvpermilps", { XM, Vex, EXx }, PREFIX_DATA },
8025
  },
8026
  {
8027
    /* VEX_W_0F380D  */
8028
    { "vpermilpd",  { XM, Vex, EXx }, PREFIX_DATA },
8029
  },
8030
  {
8031
    /* VEX_W_0F380E  */
8032
    { "vtestps",  { XM, EXx }, PREFIX_DATA },
8033
  },
8034
  {
8035
    /* VEX_W_0F380F  */
8036
    { "vtestpd",  { XM, EXx }, PREFIX_DATA },
8037
  },
8038
  {
8039
    /* VEX_W_0F3813 */
8040
    { "vcvtph2ps", { XM, EXxmmq }, PREFIX_DATA },
8041
  },
8042
  {
8043
    /* VEX_W_0F3816_L_1  */
8044
    { "vpermps",  { XM, Vex, EXx }, PREFIX_DATA },
8045
  },
8046
  {
8047
    /* VEX_W_0F3818 */
8048
    { "%XEvbroadcastss",  { XM, EXd }, PREFIX_DATA },
8049
  },
8050
  {
8051
    /* VEX_W_0F3819_L_1 */
8052
    { "vbroadcastsd", { XM, EXq }, PREFIX_DATA },
8053
  },
8054
  {
8055
    /* VEX_W_0F381A_L_1 */
8056
    { "vbroadcastf128", { XM, Mxmm }, PREFIX_DATA },
8057
  },
8058
  {
8059
    /* VEX_W_0F382C */
8060
    { "vmaskmovps", { XM, Vex, Mx }, PREFIX_DATA },
8061
  },
8062
  {
8063
    /* VEX_W_0F382D */
8064
    { "vmaskmovpd", { XM, Vex, Mx }, PREFIX_DATA },
8065
  },
8066
  {
8067
    /* VEX_W_0F382E */
8068
    { "vmaskmovps", { Mx, Vex, XM }, PREFIX_DATA },
8069
  },
8070
  {
8071
    /* VEX_W_0F382F */
8072
    { "vmaskmovpd", { Mx, Vex, XM }, PREFIX_DATA },
8073
  },
8074
  {
8075
    /* VEX_W_0F3836  */
8076
    { "vpermd",   { XM, Vex, EXx }, PREFIX_DATA },
8077
  },
8078
  {
8079
    /* VEX_W_0F3846 */
8080
    { "vpsravd",  { XM, Vex, EXx }, PREFIX_DATA },
8081
  },
8082
  {
8083
    /* VEX_W_0F3848_X86_64_L_0 */
8084
    { PREFIX_TABLE (PREFIX_VEX_0F3848_X86_64_L_0_W_0) },
8085
  },
8086
  {
8087
    /* VEX_W_0F3849_X86_64_L_0 */
8088
    { MOD_TABLE (MOD_VEX_0F3849_X86_64_L_0_W_0) },
8089
  },
8090
  {
8091
    /* VEX_W_0F384A_X86_64 */
8092
    { VEX_LEN_TABLE (VEX_LEN_0F384A_X86_64_W_0) },
8093
  },
8094
  {
8095
    /* VEX_W_0F384B_X86_64_L_0 */
8096
    { PREFIX_TABLE (PREFIX_VEX_0F384B_X86_64_L_0_W_0) },
8097
  },
8098
  {
8099
    /* VEX_W_0F3850 */
8100
    { PREFIX_TABLE (PREFIX_VEX_0F3850_W_0) },
8101
  },
8102
  {
8103
    /* VEX_W_0F3851 */
8104
    { PREFIX_TABLE (PREFIX_VEX_0F3851_W_0) },
8105
  },
8106
  {
8107
    /* VEX_W_0F3852 */
8108
    { "%XVvpdpwssd",  { XM, Vex, EXx }, PREFIX_DATA },
8109
  },
8110
  {
8111
    /* VEX_W_0F3853 */
8112
    { "%XVvpdpwssds", { XM, Vex, EXx }, PREFIX_DATA },
8113
  },
8114
  {
8115
    /* VEX_W_0F3858 */
8116
    { "%XEvpbroadcastd", { XM, EXd }, PREFIX_DATA },
8117
  },
8118
  {
8119
    /* VEX_W_0F3859 */
8120
    { "vpbroadcastq", { XM, EXq }, PREFIX_DATA },
8121
  },
8122
  {
8123
    /* VEX_W_0F385A_L_0 */
8124
    { "vbroadcasti128", { XM, Mxmm }, PREFIX_DATA },
8125
  },
8126
  {
8127
    /* VEX_W_0F385C_X86_64_L_0 */
8128
    { PREFIX_TABLE (PREFIX_VEX_0F385C_X86_64_L_0_W_0) },
8129
  },
8130
  {
8131
    /* VEX_W_0F385E_X86_64_L_0 */
8132
    { PREFIX_TABLE (PREFIX_VEX_0F385E_X86_64_L_0_W_0) },
8133
  },
8134
  {
8135
    /* VEX_W_0F385F_X86_64_L_0 */
8136
    { PREFIX_TABLE (PREFIX_VEX_0F385F_X86_64_L_0_W_0) },
8137
  },
8138
  {
8139
    /* VEX_W_0F386B_X86_64_L_0 */
8140
    { PREFIX_TABLE (PREFIX_VEX_0F386B_X86_64_L_0_W_0) },
8141
  },
8142
  {
8143
    /* VEX_W_0F386C_X86_64_L_0 */
8144
    { PREFIX_TABLE (PREFIX_VEX_0F386C_X86_64_L_0_W_0) },
8145
  },
8146
  {
8147
    /* VEX_W_0F386E_X86_64_L_0 */
8148
    { PREFIX_TABLE (PREFIX_VEX_0F386E_X86_64_L_0_W_0) },
8149
  },
8150
  {
8151
    /* VEX_W_0F386F_X86_64_L_0 */
8152
    { PREFIX_TABLE (PREFIX_VEX_0F386F_X86_64_L_0_W_0) },
8153
  },
8154
  {
8155
    /* VEX_W_0F3872_P_1 */
8156
    { "%XVvcvtneps2bf16%XY", { XMM, EXx }, 0 },
8157
  },
8158
  {
8159
    /* VEX_W_0F3878 */
8160
    { "%XEvpbroadcastb",  { XM, EXb }, PREFIX_DATA },
8161
  },
8162
  {
8163
    /* VEX_W_0F3879 */
8164
    { "%XEvpbroadcastw",  { XM, EXw }, PREFIX_DATA },
8165
  },
8166
  {
8167
    /* VEX_W_0F38B0 */
8168
    { PREFIX_TABLE (PREFIX_VEX_0F38B0_W_0) },
8169
  },
8170
  {
8171
    /* VEX_W_0F38B1 */
8172
    { PREFIX_TABLE (PREFIX_VEX_0F38B1_W_0) },
8173
  },
8174
  {
8175
    /* VEX_W_0F38B4 */
8176
    { Bad_Opcode },
8177
    { "%XVvpmadd52luq", { XM, Vex, EXx }, PREFIX_DATA },
8178
  },
8179
  {
8180
    /* VEX_W_0F38B5 */
8181
    { Bad_Opcode },
8182
    { "%XVvpmadd52huq", { XM, Vex, EXx }, PREFIX_DATA },
8183
  },
8184
  {
8185
    /* VEX_W_0F38CB_P_3 */
8186
    { VEX_LEN_TABLE (VEX_LEN_0F38CB_P_3_W_0) },
8187
  },
8188
  {
8189
    /* VEX_W_0F38CC_P_3 */
8190
    { VEX_LEN_TABLE (VEX_LEN_0F38CC_P_3_W_0) },
8191
  },
8192
  {
8193
    /* VEX_W_0F38CD_P_3 */
8194
    { VEX_LEN_TABLE (VEX_LEN_0F38CD_P_3_W_0) },
8195
  },
8196
  {
8197
    /* VEX_W_0F38CF */
8198
    { "%XEvgf2p8mulb", { XM, Vex, EXx }, PREFIX_DATA },
8199
  },
8200
  {
8201
    /* VEX_W_0F38D2 */
8202
    { PREFIX_TABLE (PREFIX_VEX_0F38D2_W_0) },
8203
  },
8204
  {
8205
    /* VEX_W_0F38D3 */
8206
    { PREFIX_TABLE (PREFIX_VEX_0F38D3_W_0) },
8207
  },
8208
  {
8209
    /* VEX_W_0F38DA */
8210
    { PREFIX_TABLE (PREFIX_VEX_0F38DA_W_0) },
8211
  },
8212
  {
8213
    /* VEX_W_0F3A00_L_1 */
8214
    { Bad_Opcode },
8215
    { "%XEvpermq",    { XM, EXx, Ib }, PREFIX_DATA },
8216
  },
8217
  {
8218
    /* VEX_W_0F3A01_L_1 */
8219
    { Bad_Opcode },
8220
    { "%XEvpermpd", { XM, EXx, Ib }, PREFIX_DATA },
8221
  },
8222
  {
8223
    /* VEX_W_0F3A02 */
8224
    { "vpblendd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
8225
  },
8226
  {
8227
    /* VEX_W_0F3A04 */
8228
    { "%XEvpermilps", { XM, EXx, Ib }, PREFIX_DATA },
8229
  },
8230
  {
8231
    /* VEX_W_0F3A05 */
8232
    { "vpermilpd",  { XM, EXx, Ib }, PREFIX_DATA },
8233
  },
8234
  {
8235
    /* VEX_W_0F3A06_L_1 */
8236
    { "vperm2f128", { XM, Vex, EXx, Ib }, PREFIX_DATA },
8237
  },
8238
  {
8239
    /* VEX_W_0F3A18_L_1 */
8240
    { "vinsertf128",  { XM, Vex, EXxmm, Ib }, PREFIX_DATA },
8241
  },
8242
  {
8243
    /* VEX_W_0F3A19_L_1 */
8244
    { "vextractf128", { EXxmm, XM, Ib }, PREFIX_DATA },
8245
  },
8246
  {
8247
    /* VEX_W_0F3A1D */
8248
    { "%XEvcvtps2ph", { EXxmmq, XM, EXxEVexS, Ib }, PREFIX_DATA },
8249
  },
8250
  {
8251
    /* VEX_W_0F3A38_L_1 */
8252
    { "vinserti128",  { XM, Vex, EXxmm, Ib }, PREFIX_DATA },
8253
  },
8254
  {
8255
    /* VEX_W_0F3A39_L_1 */
8256
    { "vextracti128", { EXxmm, XM, Ib }, PREFIX_DATA },
8257
  },
8258
  {
8259
    /* VEX_W_0F3A46_L_1 */
8260
    { "vperm2i128", { XM, Vex, EXx, Ib }, PREFIX_DATA },
8261
  },
8262
  {
8263
    /* VEX_W_0F3A4A */
8264
    { "vblendvps",  { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
8265
  },
8266
  {
8267
    /* VEX_W_0F3A4B */
8268
    { "vblendvpd",  { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
8269
  },
8270
  {
8271
    /* VEX_W_0F3A4C */
8272
    { "vpblendvb",  { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
8273
  },
8274
  {
8275
    /* VEX_W_0F3ACE */
8276
    { Bad_Opcode },
8277
    { "%XEvgf2p8affineqb", { XM, Vex, EXx, Ib }, PREFIX_DATA },
8278
  },
8279
  {
8280
    /* VEX_W_0F3ACF */
8281
    { Bad_Opcode },
8282
    { "%XEvgf2p8affineinvqb",  { XM, Vex, EXx, Ib }, PREFIX_DATA },
8283
  },
8284
  {
8285
    /* VEX_W_0F3ADE */
8286
    { VEX_LEN_TABLE (VEX_LEN_0F3ADE_W_0) },
8287
  },
8288
  {
8289
    /* VEX_W_MAP5_F8_X86_64 */
8290
    { PREFIX_TABLE (PREFIX_VEX_MAP5_F8_X86_64_L_0_W_0) },
8291
  },
8292
  {
8293
    /* VEX_W_MAP5_F9_X86_64 */
8294
    { PREFIX_TABLE (PREFIX_VEX_MAP5_F9_X86_64_L_0_W_0) },
8295
  },
8296
  {
8297
    /* VEX_W_MAP5_FD_X86_64 */
8298
    { PREFIX_TABLE (PREFIX_VEX_MAP5_FD_X86_64_L_0_W_0) },
8299
  },
8300
  {
8301
    /* VEX_W_MAP7_F6_L_0 */
8302
    { REG_TABLE (REG_VEX_MAP7_F6_L_0_W_0) },
8303
  },
8304
  {
8305
    /* VEX_W_MAP7_F8_L_0 */
8306
    { REG_TABLE (REG_VEX_MAP7_F8_L_0_W_0) },
8307
  },
8308
  /* VEX_W_XOP_08_85_L_0 */
8309
  {
8310
    { "vpmacssww",  { XM, Vex, EXx, XMVexI4 }, 0 },
8311
  },
8312
  /* VEX_W_XOP_08_86_L_0 */
8313
  {
8314
    { "vpmacsswd",  { XM, Vex, EXx, XMVexI4 }, 0 },
8315
  },
8316
  /* VEX_W_XOP_08_87_L_0 */
8317
  {
8318
    { "vpmacssdql",   { XM, Vex, EXx, XMVexI4 }, 0 },
8319
  },
8320
  /* VEX_W_XOP_08_8E_L_0 */
8321
  {
8322
    { "vpmacssdd",  { XM, Vex, EXx, XMVexI4 }, 0 },
8323
  },
8324
  /* VEX_W_XOP_08_8F_L_0 */
8325
  {
8326
    { "vpmacssdqh",   { XM, Vex, EXx, XMVexI4 }, 0 },
8327
  },
8328
  /* VEX_W_XOP_08_95_L_0 */
8329
  {
8330
    { "vpmacsww",   { XM, Vex, EXx, XMVexI4 }, 0 },
8331
  },
8332
  /* VEX_W_XOP_08_96_L_0 */
8333
  {
8334
    { "vpmacswd",   { XM, Vex, EXx, XMVexI4 }, 0 },
8335
  },
8336
  /* VEX_W_XOP_08_97_L_0 */
8337
  {
8338
    { "vpmacsdql",  { XM, Vex, EXx, XMVexI4 }, 0 },
8339
  },
8340
  /* VEX_W_XOP_08_9E_L_0 */
8341
  {
8342
    { "vpmacsdd",   { XM, Vex, EXx, XMVexI4 }, 0 },
8343
  },
8344
  /* VEX_W_XOP_08_9F_L_0 */
8345
  {
8346
    { "vpmacsdqh",  { XM, Vex, EXx, XMVexI4 }, 0 },
8347
  },
8348
  /* VEX_W_XOP_08_A6_L_0 */
8349
  {
8350
    { "vpmadcsswd",   { XM, Vex, EXx, XMVexI4 }, 0 },
8351
  },
8352
  /* VEX_W_XOP_08_B6_L_0 */
8353
  {
8354
    { "vpmadcswd",  { XM, Vex, EXx, XMVexI4 }, 0 },
8355
  },
8356
  /* VEX_W_XOP_08_C0_L_0 */
8357
  {
8358
    { "vprotb",   { XM, EXx, Ib }, 0 },
8359
  },
8360
  /* VEX_W_XOP_08_C1_L_0 */
8361
  {
8362
    { "vprotw",   { XM, EXx, Ib }, 0 },
8363
  },
8364
  /* VEX_W_XOP_08_C2_L_0 */
8365
  {
8366
    { "vprotd",   { XM, EXx, Ib }, 0 },
8367
  },
8368
  /* VEX_W_XOP_08_C3_L_0 */
8369
  {
8370
    { "vprotq",   { XM, EXx, Ib }, 0 },
8371
  },
8372
  /* VEX_W_XOP_08_CC_L_0 */
8373
  {
8374
     { "vpcomb",  { XM, Vex, EXx, VPCOM }, 0 },
8375
  },
8376
  /* VEX_W_XOP_08_CD_L_0 */
8377
  {
8378
     { "vpcomw",  { XM, Vex, EXx, VPCOM }, 0 },
8379
  },
8380
  /* VEX_W_XOP_08_CE_L_0 */
8381
  {
8382
     { "vpcomd",  { XM, Vex, EXx, VPCOM }, 0 },
8383
  },
8384
  /* VEX_W_XOP_08_CF_L_0 */
8385
  {
8386
     { "vpcomq",  { XM, Vex, EXx, VPCOM }, 0 },
8387
  },
8388
  /* VEX_W_XOP_08_EC_L_0 */
8389
  {
8390
     { "vpcomub", { XM, Vex, EXx, VPCOM }, 0 },
8391
  },
8392
  /* VEX_W_XOP_08_ED_L_0 */
8393
  {
8394
     { "vpcomuw", { XM, Vex, EXx, VPCOM }, 0 },
8395
  },
8396
  /* VEX_W_XOP_08_EE_L_0 */
8397
  {
8398
     { "vpcomud", { XM, Vex, EXx, VPCOM }, 0 },
8399
  },
8400
  /* VEX_W_XOP_08_EF_L_0 */
8401
  {
8402
     { "vpcomuq", { XM, Vex, EXx, VPCOM }, 0 },
8403
  },
8404
  /* VEX_W_XOP_09_80 */
8405
  {
8406
    { "vfrczps",  { XM, EXx }, 0 },
8407
  },
8408
  /* VEX_W_XOP_09_81 */
8409
  {
8410
    { "vfrczpd",  { XM, EXx }, 0 },
8411
  },
8412
  /* VEX_W_XOP_09_82 */
8413
  {
8414
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_82_W_0) },
8415
  },
8416
  /* VEX_W_XOP_09_83 */
8417
  {
8418
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_83_W_0) },
8419
  },
8420
  /* VEX_W_XOP_09_C1_L_0 */
8421
  {
8422
    { "vphaddbw", { XM, EXxmm }, 0 },
8423
  },
8424
  /* VEX_W_XOP_09_C2_L_0 */
8425
  {
8426
    { "vphaddbd", { XM, EXxmm }, 0 },
8427
  },
8428
  /* VEX_W_XOP_09_C3_L_0 */
8429
  {
8430
    { "vphaddbq", { XM, EXxmm }, 0 },
8431
  },
8432
  /* VEX_W_XOP_09_C6_L_0 */
8433
  {
8434
    { "vphaddwd", { XM, EXxmm }, 0 },
8435
  },
8436
  /* VEX_W_XOP_09_C7_L_0 */
8437
  {
8438
    { "vphaddwq", { XM, EXxmm }, 0 },
8439
  },
8440
  /* VEX_W_XOP_09_CB_L_0 */
8441
  {
8442
    { "vphadddq", { XM, EXxmm }, 0 },
8443
  },
8444
  /* VEX_W_XOP_09_D1_L_0 */
8445
  {
8446
    { "vphaddubw",  { XM, EXxmm }, 0 },
8447
  },
8448
  /* VEX_W_XOP_09_D2_L_0 */
8449
  {
8450
    { "vphaddubd",  { XM, EXxmm }, 0 },
8451
  },
8452
  /* VEX_W_XOP_09_D3_L_0 */
8453
  {
8454
    { "vphaddubq",  { XM, EXxmm }, 0 },
8455
  },
8456
  /* VEX_W_XOP_09_D6_L_0 */
8457
  {
8458
    { "vphadduwd",  { XM, EXxmm }, 0 },
8459
  },
8460
  /* VEX_W_XOP_09_D7_L_0 */
8461
  {
8462
    { "vphadduwq",  { XM, EXxmm }, 0 },
8463
  },
8464
  /* VEX_W_XOP_09_DB_L_0 */
8465
  {
8466
    { "vphaddudq",  { XM, EXxmm }, 0 },
8467
  },
8468
  /* VEX_W_XOP_09_E1_L_0 */
8469
  {
8470
    { "vphsubbw", { XM, EXxmm }, 0 },
8471
  },
8472
  /* VEX_W_XOP_09_E2_L_0 */
8473
  {
8474
    { "vphsubwd", { XM, EXxmm }, 0 },
8475
  },
8476
  /* VEX_W_XOP_09_E3_L_0 */
8477
  {
8478
    { "vphsubdq", { XM, EXxmm }, 0 },
8479
  },
8480
8481
#include "i386-dis-evex-w.h"
8482
};
8483
8484
static const struct dis386 mod_table[][2] = {
8485
  {
8486
    /* MOD_62_32BIT */
8487
    { "bound{S|}",  { Gv, Ma }, 0 },
8488
    { EVEX_TABLE () },
8489
  },
8490
  {
8491
    /* MOD_C4_32BIT */
8492
    { "lesS",   { Gv, Mp }, 0 },
8493
    { VEX_C4_TABLE () },
8494
  },
8495
  {
8496
    /* MOD_C5_32BIT */
8497
    { "ldsS",   { Gv, Mp }, 0 },
8498
    { VEX_C5_TABLE () },
8499
  },
8500
  {
8501
    /* MOD_0F01_REG_0 */
8502
    { X86_64_TABLE (X86_64_0F01_REG_0) },
8503
    { RM_TABLE (RM_0F01_REG_0) },
8504
  },
8505
  {
8506
    /* MOD_0F01_REG_1 */
8507
    { X86_64_TABLE (X86_64_0F01_REG_1) },
8508
    { RM_TABLE (RM_0F01_REG_1) },
8509
  },
8510
  {
8511
    /* MOD_0F01_REG_2 */
8512
    { X86_64_TABLE (X86_64_0F01_REG_2) },
8513
    { RM_TABLE (RM_0F01_REG_2) },
8514
  },
8515
  {
8516
    /* MOD_0F01_REG_3 */
8517
    { X86_64_TABLE (X86_64_0F01_REG_3) },
8518
    { RM_TABLE (RM_0F01_REG_3) },
8519
  },
8520
  {
8521
    /* MOD_0F01_REG_5 */
8522
    { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_0) },
8523
    { RM_TABLE (RM_0F01_REG_5_MOD_3) },
8524
  },
8525
  {
8526
    /* MOD_0F01_REG_7 */
8527
    { "invlpg",   { Mb }, 0 },
8528
    { RM_TABLE (RM_0F01_REG_7_MOD_3) },
8529
  },
8530
  {
8531
    /* MOD_0F12_PREFIX_0 */
8532
    { "%XEVmovlpYX",  { XM, Vex, EXq }, 0 },
8533
    { "%XEVmovhlpY%XS", { XM, Vex, EXq }, 0 },
8534
  },
8535
  {
8536
    /* MOD_0F16_PREFIX_0 */
8537
    { "%XEVmovhpYX",  { XM, Vex, EXq }, 0 },
8538
    { "%XEVmovlhpY%XS", { XM, Vex, EXq }, 0 },
8539
  },
8540
  {
8541
    /* MOD_0F18_REG_0 */
8542
    { "prefetchnta",  { Mb }, 0 },
8543
    { "nopQ",   { Ev }, 0 },
8544
  },
8545
  {
8546
    /* MOD_0F18_REG_1 */
8547
    { "prefetcht0", { Mb }, 0 },
8548
    { "nopQ",   { Ev }, 0 },
8549
  },
8550
  {
8551
    /* MOD_0F18_REG_2 */
8552
    { "prefetcht1", { Mb }, 0 },
8553
    { "nopQ",   { Ev }, 0 },
8554
  },
8555
  {
8556
    /* MOD_0F18_REG_3 */
8557
    { "prefetcht2", { Mb }, 0 },
8558
    { "nopQ",   { Ev }, 0 },
8559
  },
8560
  {
8561
    /* MOD_0F18_REG_4 */
8562
    { "prefetchrst2", { Mb }, 0 },
8563
    { "nopQ",   { Ev }, 0 },
8564
  },
8565
  {
8566
    /* MOD_0F18_REG_6 */
8567
    { X86_64_TABLE (X86_64_0F18_REG_6_MOD_0) },
8568
    { "nopQ",   { Ev }, 0 },
8569
  },
8570
  {
8571
    /* MOD_0F18_REG_7 */
8572
    { X86_64_TABLE (X86_64_0F18_REG_7_MOD_0) },
8573
    { "nopQ",   { Ev }, 0 },
8574
  },
8575
  {
8576
    /* MOD_0F1A_PREFIX_0 */
8577
    { "bndldx",   { Gbnd, Mv_bnd }, 0 },
8578
    { "nopQ",   { Ev }, 0 },
8579
  },
8580
  {
8581
    /* MOD_0F1B_PREFIX_0 */
8582
    { "bndstx",   { Mv_bnd, Gbnd }, 0 },
8583
    { "nopQ",   { Ev }, 0 },
8584
  },
8585
  {
8586
    /* MOD_0F1B_PREFIX_1 */
8587
    { "bndmk",    { Gbnd, Mv_bnd }, 0 },
8588
    { "nopQ",   { Ev }, PREFIX_IGNORED },
8589
  },
8590
  {
8591
    /* MOD_0F1C_PREFIX_0 */
8592
    { REG_TABLE (REG_0F1C_P_0_MOD_0) },
8593
    { "nopQ",   { Ev }, 0 },
8594
  },
8595
  {
8596
    /* MOD_0F1E_PREFIX_1 */
8597
    { "nopQ",   { Ev }, PREFIX_IGNORED },
8598
    { REG_TABLE (REG_0F1E_P_1_MOD_3) },
8599
  },
8600
  {
8601
    /* MOD_0FAE_REG_0 */
8602
    { "fxsave",   { FXSAVE }, 0 },
8603
    { PREFIX_TABLE (PREFIX_0FAE_REG_0_MOD_3) },
8604
  },
8605
  {
8606
    /* MOD_0FAE_REG_1 */
8607
    { "fxrstor",  { FXSAVE }, 0 },
8608
    { PREFIX_TABLE (PREFIX_0FAE_REG_1_MOD_3) },
8609
  },
8610
  {
8611
    /* MOD_0FAE_REG_2 */
8612
    { "ldmxcsr",  { Md }, 0 },
8613
    { PREFIX_TABLE (PREFIX_0FAE_REG_2_MOD_3) },
8614
  },
8615
  {
8616
    /* MOD_0FAE_REG_3 */
8617
    { "stmxcsr",  { Md }, 0 },
8618
    { PREFIX_TABLE (PREFIX_0FAE_REG_3_MOD_3) },
8619
  },
8620
  {
8621
    /* MOD_0FAE_REG_4 */
8622
    { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_0) },
8623
    { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_3) },
8624
  },
8625
  {
8626
    /* MOD_0FAE_REG_5 */
8627
    { "xrstor",   { FXSAVE }, PREFIX_OPCODE | PREFIX_REX2_ILLEGAL },
8628
    { PREFIX_TABLE (PREFIX_0FAE_REG_5_MOD_3) },
8629
  },
8630
  {
8631
    /* MOD_0FAE_REG_6 */
8632
    { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_0) },
8633
    { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_3) },
8634
  },
8635
  {
8636
    /* MOD_0FAE_REG_7 */
8637
    { PREFIX_TABLE (PREFIX_0FAE_REG_7_MOD_0) },
8638
    { RM_TABLE (RM_0FAE_REG_7_MOD_3) },
8639
  },
8640
  {
8641
    /* MOD_0FC7_REG_6 */
8642
    { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_0) },
8643
    { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_3) }
8644
  },
8645
  {
8646
    /* MOD_0FC7_REG_7 */
8647
    { "vmptrst",  { Mq }, 0 },
8648
    { PREFIX_TABLE (PREFIX_0FC7_REG_7_MOD_3) }
8649
  },
8650
  {
8651
    /* MOD_0F38DC_PREFIX_1 */
8652
    { "aesenc128kl",    { XM, M }, 0 },
8653
    { "loadiwkey",      { XM, EXx }, 0 },
8654
  },
8655
  /* MOD_0F38F8 */
8656
  {
8657
    { PREFIX_TABLE (PREFIX_0F38F8_M_0) },
8658
    { X86_64_TABLE (X86_64_0F38F8_M_1) },
8659
  },
8660
  {
8661
    /* MOD_VEX_0F3849_X86_64_L_0_W_0 */
8662
    { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_0) },
8663
    { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_1) },
8664
  },
8665
8666
#include "i386-dis-evex-mod.h"
8667
};
8668
8669
static const struct dis386 rm_table[][8] = {
8670
  {
8671
    /* RM_C6_REG_7 */
8672
    { "xabort",   { Skip_MODRM, Ib }, 0 },
8673
  },
8674
  {
8675
    /* RM_C7_REG_7 */
8676
    { "xbeginT",  { Skip_MODRM, Jdqw }, 0 },
8677
  },
8678
  {
8679
    /* RM_0F01_REG_0 */
8680
    { "enclv",    { Skip_MODRM }, 0 },
8681
    { "vmcall",   { Skip_MODRM }, 0 },
8682
    { "vmlaunch", { Skip_MODRM }, 0 },
8683
    { "vmresume", { Skip_MODRM }, 0 },
8684
    { "vmxoff",   { Skip_MODRM }, 0 },
8685
    { "pconfig",  { Skip_MODRM }, 0 },
8686
    { PREFIX_TABLE (PREFIX_0F01_REG_0_MOD_3_RM_6) },
8687
    { PREFIX_TABLE (PREFIX_0F01_REG_0_MOD_3_RM_7) },
8688
  },
8689
  {
8690
    /* RM_0F01_REG_1 */
8691
    { "monitor",  { { OP_Monitor, 0 } }, 0 },
8692
    { "mwait",    { { OP_Mwait, 0 } }, 0 },
8693
    { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_2) },
8694
    { "stac",   { Skip_MODRM }, 0 },
8695
    { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_4) },
8696
    { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_5) },
8697
    { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_6) },
8698
    { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_7) },
8699
  },
8700
  {
8701
    /* RM_0F01_REG_2 */
8702
    { "xgetbv",   { Skip_MODRM }, 0 },
8703
    { "xsetbv",   { Skip_MODRM }, 0 },
8704
    { Bad_Opcode },
8705
    { Bad_Opcode },
8706
    { "vmfunc",   { Skip_MODRM }, 0 },
8707
    { "xend",   { Skip_MODRM }, 0 },
8708
    { "xtest",    { Skip_MODRM }, 0 },
8709
    { "enclu",    { Skip_MODRM }, 0 },
8710
  },
8711
  {
8712
    /* RM_0F01_REG_3 */
8713
    { "vmrun",    { Skip_MODRM }, 0 },
8714
    { PREFIX_TABLE (PREFIX_0F01_REG_3_RM_1) },
8715
    { "vmload",   { Skip_MODRM }, 0 },
8716
    { "vmsave",   { Skip_MODRM }, 0 },
8717
    { "stgi",   { Skip_MODRM }, 0 },
8718
    { "clgi",   { Skip_MODRM }, 0 },
8719
    { "skinit",   { Skip_MODRM }, 0 },
8720
    { "invlpga",  { Skip_MODRM }, 0 },
8721
  },
8722
  {
8723
    /* RM_0F01_REG_5_MOD_3 */
8724
    { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_0) },
8725
    { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_1) },
8726
    { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_2) },
8727
    { Bad_Opcode },
8728
    { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_4) },
8729
    { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_5) },
8730
    { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_6) },
8731
    { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_7) },
8732
  },
8733
  {
8734
    /* RM_0F01_REG_7_MOD_3 */
8735
    { "swapgs",   { Skip_MODRM }, 0  },
8736
    { "rdtscp",   { Skip_MODRM }, 0  },
8737
    { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_2) },
8738
    { "mwaitx",   { { OP_Mwait, eBX_reg } }, PREFIX_OPCODE },
8739
    { "clzero",   { Skip_MODRM }, 0  },
8740
    { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_5) },
8741
    { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_6) },
8742
    { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_7) },
8743
  },
8744
  {
8745
    /* RM_0F1E_P_1_MOD_3_REG_7 */
8746
    { "nopQ",   { Ev }, PREFIX_IGNORED },
8747
    { "nopQ",   { Ev }, PREFIX_IGNORED },
8748
    { "endbr64",  { Skip_MODRM }, 0 },
8749
    { "endbr32",  { Skip_MODRM }, 0 },
8750
    { "nopQ",   { Ev }, PREFIX_IGNORED },
8751
    { "nopQ",   { Ev }, PREFIX_IGNORED },
8752
    { "nopQ",   { Ev }, PREFIX_IGNORED },
8753
    { "nopQ",   { Ev }, PREFIX_IGNORED },
8754
  },
8755
  {
8756
    /* RM_0FAE_REG_6_MOD_3 */
8757
    { "mfence",   { Skip_MODRM }, 0 },
8758
  },
8759
  {
8760
    /* RM_0FAE_REG_7_MOD_3 */
8761
    { "sfence",   { Skip_MODRM }, 0 },
8762
  },
8763
  {
8764
    /* RM_0F3A0F_P_1_R_0 */
8765
    { "hreset",   { Skip_MODRM, Ib }, 0 },
8766
  },
8767
  {
8768
    /* RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0_R_0 */
8769
    { "tilerelease",  { Skip_MODRM }, 0 },
8770
  },
8771
  {
8772
    /* RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_3 */
8773
    { "tilezero", { TMM, Skip_MODRM }, 0 },
8774
  },
8775
};
8776
8777
0
#define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
8778
8779
/* The values used here must be non-zero, fit in 'unsigned char', and not be
8780
   in conflict with actual prefix opcodes.  */
8781
584
#define REP_PREFIX  0x01
8782
3.50k
#define XACQUIRE_PREFIX 0x02
8783
4.43k
#define XRELEASE_PREFIX 0x03
8784
2.17k
#define BND_PREFIX  0x04
8785
4.65k
#define NOTRACK_PREFIX  0x05
8786
8787
static enum {
8788
  ckp_okay,
8789
  ckp_bogus,
8790
  ckp_fetch_error,
8791
}
8792
ckprefix (instr_info *ins)
8793
3.38M
{
8794
3.38M
  int i, length;
8795
3.38M
  uint8_t newrex;
8796
8797
3.38M
  i = 0;
8798
3.38M
  length = 0;
8799
  /* The maximum instruction length is 15bytes.  */
8800
4.08M
  while (length < MAX_CODE_LENGTH - 1)
8801
4.08M
    {
8802
4.08M
      if (!fetch_code (ins->info, ins->codep + 1))
8803
3.29k
  return ckp_fetch_error;
8804
4.08M
      newrex = 0;
8805
4.08M
      switch (*ins->codep)
8806
4.08M
  {
8807
  /* REX prefixes family.  */
8808
20.3k
  case 0x40:
8809
46.2k
  case 0x41:
8810
63.8k
  case 0x42:
8811
75.1k
  case 0x43:
8812
90.2k
  case 0x44:
8813
106k
  case 0x45:
8814
123k
  case 0x46:
8815
135k
  case 0x47:
8816
184k
  case 0x48:
8817
214k
  case 0x49:
8818
226k
  case 0x4a:
8819
234k
  case 0x4b:
8820
254k
  case 0x4c:
8821
268k
  case 0x4d:
8822
286k
  case 0x4e:
8823
312k
  case 0x4f:
8824
312k
    if (ins->address_mode == mode_64bit)
8825
271k
      newrex = *ins->codep;
8826
40.9k
    else
8827
40.9k
      return ckp_okay;
8828
271k
    ins->last_rex_prefix = i;
8829
271k
    break;
8830
  /* REX2 must be the last prefix. */
8831
34.8k
  case REX2_OPCODE:
8832
34.8k
    if (ins->address_mode == mode_64bit)
8833
33.2k
      {
8834
33.2k
        if (ins->last_rex_prefix >= 0)
8835
472
    return ckp_bogus;
8836
8837
32.7k
        ins->codep++;
8838
32.7k
        if (!fetch_code (ins->info, ins->codep + 1))
8839
102
    return ckp_fetch_error;
8840
32.6k
        ins->rex2_payload = *ins->codep;
8841
32.6k
        ins->rex2 = ins->rex2_payload >> 4;
8842
32.6k
        ins->rex = (ins->rex2_payload & 0xf) | REX_OPCODE;
8843
32.6k
        ins->codep++;
8844
32.6k
        ins->last_rex2_prefix = i;
8845
32.6k
        ins->all_prefixes[i] = REX2_OPCODE;
8846
32.6k
      }
8847
34.3k
    return ckp_okay;
8848
27.2k
  case 0xf3:
8849
27.2k
    ins->prefixes |= PREFIX_REPZ;
8850
27.2k
    ins->last_repz_prefix = i;
8851
27.2k
    break;
8852
37.4k
  case 0xf2:
8853
37.4k
    ins->prefixes |= PREFIX_REPNZ;
8854
37.4k
    ins->last_repnz_prefix = i;
8855
37.4k
    break;
8856
29.7k
  case 0xf0:
8857
29.7k
    ins->prefixes |= PREFIX_LOCK;
8858
29.7k
    ins->last_lock_prefix = i;
8859
29.7k
    break;
8860
39.4k
  case 0x2e:
8861
39.4k
    ins->prefixes |= PREFIX_CS;
8862
39.4k
    ins->last_seg_prefix = i;
8863
39.4k
    if (ins->address_mode != mode_64bit)
8864
12.3k
      ins->active_seg_prefix = PREFIX_CS;
8865
39.4k
    break;
8866
20.2k
  case 0x36:
8867
20.2k
    ins->prefixes |= PREFIX_SS;
8868
20.2k
    ins->last_seg_prefix = i;
8869
20.2k
    if (ins->address_mode != mode_64bit)
8870
4.89k
      ins->active_seg_prefix = PREFIX_SS;
8871
20.2k
    break;
8872
88.3k
  case 0x3e:
8873
88.3k
    ins->prefixes |= PREFIX_DS;
8874
88.3k
    ins->last_seg_prefix = i;
8875
88.3k
    if (ins->address_mode != mode_64bit)
8876
9.40k
      ins->active_seg_prefix = PREFIX_DS;
8877
88.3k
    break;
8878
26.0k
  case 0x26:
8879
26.0k
    ins->prefixes |= PREFIX_ES;
8880
26.0k
    ins->last_seg_prefix = i;
8881
26.0k
    if (ins->address_mode != mode_64bit)
8882
6.77k
      ins->active_seg_prefix = PREFIX_ES;
8883
26.0k
    break;
8884
48.8k
  case 0x64:
8885
48.8k
    ins->prefixes |= PREFIX_FS;
8886
48.8k
    ins->last_seg_prefix = i;
8887
48.8k
    ins->active_seg_prefix = PREFIX_FS;
8888
48.8k
    break;
8889
47.0k
  case 0x65:
8890
47.0k
    ins->prefixes |= PREFIX_GS;
8891
47.0k
    ins->last_seg_prefix = i;
8892
47.0k
    ins->active_seg_prefix = PREFIX_GS;
8893
47.0k
    break;
8894
56.7k
  case 0x66:
8895
56.7k
    ins->prefixes |= PREFIX_DATA;
8896
56.7k
    ins->last_data_prefix = i;
8897
56.7k
    break;
8898
72.6k
  case 0x67:
8899
72.6k
    ins->prefixes |= PREFIX_ADDR;
8900
72.6k
    ins->last_addr_prefix = i;
8901
72.6k
    break;
8902
17.1k
  case FWAIT_OPCODE:
8903
    /* fwait is really an instruction.  If there are prefixes
8904
       before the fwait, they belong to the fwait, *not* to the
8905
       following instruction.  */
8906
17.1k
    ins->fwait_prefix = i;
8907
17.1k
    if (ins->prefixes || ins->rex)
8908
7.23k
      {
8909
7.23k
        ins->prefixes |= PREFIX_FWAIT;
8910
7.23k
        ins->codep++;
8911
        /* This ensures that the previous REX prefixes are noticed
8912
     as unused prefixes, as in the return case below.  */
8913
7.23k
        return ins->rex ? ckp_bogus : ckp_okay;
8914
7.23k
      }
8915
9.95k
    ins->prefixes = PREFIX_FWAIT;
8916
9.95k
    break;
8917
3.22M
  default:
8918
3.22M
    return ckp_okay;
8919
4.08M
  }
8920
      /* Rex is ignored when followed by another prefix.  */
8921
774k
      if (ins->rex)
8922
73.7k
  return ckp_bogus;
8923
701k
      if (*ins->codep != FWAIT_OPCODE)
8924
691k
  ins->all_prefixes[i++] = *ins->codep;
8925
701k
      ins->rex = newrex;
8926
701k
      ins->codep++;
8927
701k
      length++;
8928
701k
    }
8929
2.09k
  return ckp_bogus;
8930
3.38M
}
8931
8932
/* Return the name of the prefix byte PREF, or NULL if PREF is not a
8933
   prefix byte.  */
8934
8935
static const char *
8936
prefix_name (enum address_mode mode, uint8_t pref, int sizeflag)
8937
408k
{
8938
408k
  static const char *rexes [16] =
8939
408k
    {
8940
408k
      "rex",    /* 0x40 */
8941
408k
      "rex.B",    /* 0x41 */
8942
408k
      "rex.X",    /* 0x42 */
8943
408k
      "rex.XB",   /* 0x43 */
8944
408k
      "rex.R",    /* 0x44 */
8945
408k
      "rex.RB",   /* 0x45 */
8946
408k
      "rex.RX",   /* 0x46 */
8947
408k
      "rex.RXB",  /* 0x47 */
8948
408k
      "rex.W",    /* 0x48 */
8949
408k
      "rex.WB",   /* 0x49 */
8950
408k
      "rex.WX",   /* 0x4a */
8951
408k
      "rex.WXB",  /* 0x4b */
8952
408k
      "rex.WR",   /* 0x4c */
8953
408k
      "rex.WRB",  /* 0x4d */
8954
408k
      "rex.WRX",  /* 0x4e */
8955
408k
      "rex.WRXB", /* 0x4f */
8956
408k
    };
8957
8958
408k
  switch (pref)
8959
408k
    {
8960
    /* REX prefixes family.  */
8961
12.3k
    case 0x40:
8962
19.0k
    case 0x41:
8963
29.2k
    case 0x42:
8964
34.9k
    case 0x43:
8965
41.0k
    case 0x44:
8966
48.4k
    case 0x45:
8967
57.7k
    case 0x46:
8968
64.0k
    case 0x47:
8969
75.1k
    case 0x48:
8970
87.6k
    case 0x49:
8971
95.5k
    case 0x4a:
8972
100k
    case 0x4b:
8973
107k
    case 0x4c:
8974
115k
    case 0x4d:
8975
125k
    case 0x4e:
8976
140k
    case 0x4f:
8977
140k
      return rexes [pref - 0x40];
8978
15.6k
    case 0xf3:
8979
15.6k
      return "repz";
8980
17.1k
    case 0xf2:
8981
17.1k
      return "repnz";
8982
21.1k
    case 0xf0:
8983
21.1k
      return "lock";
8984
24.9k
    case 0x2e:
8985
24.9k
      return "cs";
8986
14.8k
    case 0x36:
8987
14.8k
      return "ss";
8988
26.5k
    case 0x3e:
8989
26.5k
      return "ds";
8990
13.9k
    case 0x26:
8991
13.9k
      return "es";
8992
26.3k
    case 0x64:
8993
26.3k
      return "fs";
8994
23.2k
    case 0x65:
8995
23.2k
      return "gs";
8996
21.4k
    case 0x66:
8997
21.4k
      return (sizeflag & DFLAG) ? "data16" : "data32";
8998
41.7k
    case 0x67:
8999
41.7k
      if (mode == mode_64bit)
9000
28.9k
  return (sizeflag & AFLAG) ? "addr32" : "addr64";
9001
12.8k
      else
9002
12.8k
  return (sizeflag & AFLAG) ? "addr16" : "addr32";
9003
182
    case FWAIT_OPCODE:
9004
182
      return "fwait";
9005
292
    case REP_PREFIX:
9006
292
      return "rep";
9007
1.69k
    case XACQUIRE_PREFIX:
9008
1.69k
      return "xacquire";
9009
2.04k
    case XRELEASE_PREFIX:
9010
2.04k
      return "xrelease";
9011
1.08k
    case BND_PREFIX:
9012
1.08k
      return "bnd";
9013
2.21k
    case NOTRACK_PREFIX:
9014
2.21k
      return "notrack";
9015
13.5k
    case REX2_OPCODE:
9016
13.5k
      return "rex2";
9017
286
    default:
9018
286
      return NULL;
9019
408k
    }
9020
408k
}
9021
9022
void
9023
print_i386_disassembler_options (FILE *stream)
9024
0
{
9025
0
  fprintf (stream, _("\n\
9026
0
The following i386/x86-64 specific disassembler options are supported for use\n\
9027
0
with the -M switch (multiple options should be separated by commas):\n"));
9028
9029
0
  fprintf (stream, _("  x86-64      Disassemble in 64bit mode\n"));
9030
0
  fprintf (stream, _("  i386        Disassemble in 32bit mode\n"));
9031
0
  fprintf (stream, _("  i8086       Disassemble in 16bit mode\n"));
9032
0
  fprintf (stream, _("  att         Display instruction in AT&T syntax\n"));
9033
0
  fprintf (stream, _("  intel       Display instruction in Intel syntax\n"));
9034
0
  fprintf (stream, _("  att-mnemonic  (AT&T syntax only)\n"
9035
0
         "              Display instruction with AT&T mnemonic\n"));
9036
0
  fprintf (stream, _("  intel-mnemonic  (AT&T syntax only)\n"
9037
0
         "              Display instruction with Intel mnemonic\n"));
9038
0
  fprintf (stream, _("  addr64      Assume 64bit address size\n"));
9039
0
  fprintf (stream, _("  addr32      Assume 32bit address size\n"));
9040
0
  fprintf (stream, _("  addr16      Assume 16bit address size\n"));
9041
0
  fprintf (stream, _("  data32      Assume 32bit data size\n"));
9042
0
  fprintf (stream, _("  data16      Assume 16bit data size\n"));
9043
0
  fprintf (stream, _("  suffix      Always display instruction suffix in AT&T syntax\n"));
9044
0
  fprintf (stream, _("  amd64       Display instruction in AMD64 ISA\n"));
9045
0
  fprintf (stream, _("  intel64     Display instruction in Intel64 ISA\n"));
9046
0
}
9047
9048
/* Bad opcode.  */
9049
static const struct dis386 bad_opcode = { "(bad)", { XX }, 0 };
9050
9051
/* Fetch error indicator.  */
9052
static const struct dis386 err_opcode = { NULL, { XX }, 0 };
9053
9054
static const struct dis386 map5_f8_opcode = { X86_64_TABLE (X86_64_VEX_MAP5_F8) };
9055
static const struct dis386 map5_f9_opcode = { X86_64_TABLE (X86_64_VEX_MAP5_F9) };
9056
static const struct dis386 map5_fd_opcode = { X86_64_TABLE (X86_64_VEX_MAP5_FD) };
9057
static const struct dis386 map7_f6_opcode = { VEX_LEN_TABLE (VEX_LEN_MAP7_F6) };
9058
static const struct dis386 map7_f8_opcode = { VEX_LEN_TABLE (VEX_LEN_MAP7_F8) };
9059
9060
/* Get a pointer to struct dis386 with a valid name.  */
9061
9062
static const struct dis386 *
9063
get_valid_dis386 (const struct dis386 *dp, instr_info *ins)
9064
4.00M
{
9065
4.00M
  int vindex, vex_table_index;
9066
9067
4.00M
  if (dp->name != NULL)
9068
2.28M
    return dp;
9069
9070
1.72M
  switch (dp->op[0].bytemode)
9071
1.72M
    {
9072
496k
    case USE_REG_TABLE:
9073
496k
      dp = &reg_table[dp->op[1].bytemode][ins->modrm.reg];
9074
496k
      break;
9075
9076
43.5k
    case USE_MOD_TABLE:
9077
43.5k
      vindex = ins->modrm.mod == 0x3 ? 1 : 0;
9078
43.5k
      dp = &mod_table[dp->op[1].bytemode][vindex];
9079
43.5k
      break;
9080
9081
6.05k
    case USE_RM_TABLE:
9082
6.05k
      dp = &rm_table[dp->op[1].bytemode][ins->modrm.rm];
9083
6.05k
      break;
9084
9085
91.2k
    case USE_PREFIX_TABLE:
9086
92.1k
    use_prefix_table:
9087
92.1k
      if (ins->need_vex)
9088
47.0k
  {
9089
    /* The prefix in VEX is implicit.  */
9090
47.0k
    switch (ins->vex.prefix)
9091
47.0k
      {
9092
10.7k
      case 0:
9093
10.7k
        vindex = 0;
9094
10.7k
        break;
9095
13.2k
      case REPE_PREFIX_OPCODE:
9096
13.2k
        vindex = 1;
9097
13.2k
        break;
9098
13.6k
      case DATA_PREFIX_OPCODE:
9099
13.6k
        vindex = 2;
9100
13.6k
        break;
9101
9.46k
      case REPNE_PREFIX_OPCODE:
9102
9.46k
        vindex = 3;
9103
9.46k
        break;
9104
0
      default:
9105
0
        abort ();
9106
0
        break;
9107
47.0k
      }
9108
47.0k
  }
9109
45.0k
      else
9110
45.0k
  {
9111
45.0k
    int last_prefix = -1;
9112
45.0k
    int prefix = 0;
9113
45.0k
    vindex = 0;
9114
    /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
9115
       When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
9116
       last one wins.  */
9117
45.0k
    if ((ins->prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
9118
9.66k
      {
9119
9.66k
        if (ins->last_repz_prefix > ins->last_repnz_prefix)
9120
4.31k
    {
9121
4.31k
      vindex = 1;
9122
4.31k
      prefix = PREFIX_REPZ;
9123
4.31k
      last_prefix = ins->last_repz_prefix;
9124
4.31k
    }
9125
5.35k
        else
9126
5.35k
    {
9127
5.35k
      vindex = 3;
9128
5.35k
      prefix = PREFIX_REPNZ;
9129
5.35k
      last_prefix = ins->last_repnz_prefix;
9130
5.35k
    }
9131
9132
        /* Check if prefix should be ignored.  */
9133
9.66k
        if ((((prefix_table[dp->op[1].bytemode][vindex].prefix_requirement
9134
9.66k
         & PREFIX_IGNORED) >> PREFIX_IGNORED_SHIFT)
9135
9.66k
       & prefix) != 0
9136
2.40k
      && !prefix_table[dp->op[1].bytemode][vindex].name)
9137
524
    vindex = 0;
9138
9.66k
      }
9139
9140
45.0k
    if (vindex == 0 && (ins->prefixes & PREFIX_DATA) != 0)
9141
5.61k
      {
9142
5.61k
        vindex = 2;
9143
5.61k
        prefix = PREFIX_DATA;
9144
5.61k
        last_prefix = ins->last_data_prefix;
9145
5.61k
      }
9146
9147
45.0k
    if (vindex != 0)
9148
14.7k
      {
9149
14.7k
        ins->used_prefixes |= prefix;
9150
14.7k
        ins->all_prefixes[last_prefix] = 0;
9151
14.7k
      }
9152
45.0k
  }
9153
92.1k
      dp = &prefix_table[dp->op[1].bytemode][vindex];
9154
92.1k
      break;
9155
9156
3.37k
    case USE_X86_64_EVEX_FROM_VEX_TABLE:
9157
4.89k
    case USE_X86_64_EVEX_PFX_TABLE:
9158
5.85k
    case USE_X86_64_EVEX_W_TABLE:
9159
6.68k
    case USE_X86_64_EVEX_MEM_W_TABLE:
9160
6.68k
      ins->evex_type = evex_from_vex;
9161
      /* EVEX from VEX instructions are 64-bit only and require that EVEX.z,
9162
   EVEX.L'L, EVEX.b, and the lower 2 bits of EVEX.aaa must be 0.  */
9163
6.68k
      if (ins->address_mode != mode_64bit
9164
6.39k
    || (ins->vex.mask_register_specifier & 0x3) != 0
9165
5.91k
    || ins->vex.ll != 0
9166
5.63k
    || ins->vex.zeroing != 0
9167
5.39k
    || ins->vex.b)
9168
1.56k
  return &bad_opcode;
9169
9170
5.11k
      if (dp->op[0].bytemode == USE_X86_64_EVEX_PFX_TABLE)
9171
905
  goto use_prefix_table;
9172
4.21k
      if (dp->op[0].bytemode == USE_X86_64_EVEX_W_TABLE)
9173
849
  goto use_vex_w_table;
9174
3.36k
      if (dp->op[0].bytemode == USE_X86_64_EVEX_MEM_W_TABLE)
9175
540
  {
9176
540
    if (ins->modrm.mod == 3)
9177
279
      return &bad_opcode;
9178
261
    goto use_vex_w_table;
9179
540
  }
9180
9181
      /* Fall through.  */
9182
443k
    case USE_X86_64_TABLE:
9183
443k
      vindex = ins->address_mode == mode_64bit ? 1 : 0;
9184
443k
      dp = &x86_64_table[dp->op[1].bytemode][vindex];
9185
443k
      break;
9186
9187
5.04k
    case USE_3BYTE_TABLE:
9188
5.04k
      if (ins->last_rex2_prefix >= 0)
9189
948
  return &err_opcode;
9190
4.09k
      if (!fetch_code (ins->info, ins->codep + 2))
9191
95
  return &err_opcode;
9192
4.00k
      vindex = *ins->codep++;
9193
4.00k
      dp = &three_byte_table[dp->op[1].bytemode][vindex];
9194
4.00k
      ins->end_codep = ins->codep;
9195
4.00k
      if (!fetch_modrm (ins))
9196
0
  return &err_opcode;
9197
4.00k
      break;
9198
9199
16.1k
    case USE_VEX_LEN_TABLE:
9200
16.1k
      if (!ins->need_vex)
9201
0
  abort ();
9202
9203
16.1k
      switch (ins->vex.length)
9204
16.1k
  {
9205
12.9k
  case 128:
9206
12.9k
    vindex = 0;
9207
12.9k
    break;
9208
580
  case 512:
9209
    /* This allows re-using in particular table entries where only
9210
       128-bit operand size (VEX.L=0 / EVEX.L'L=0) are valid.  */
9211
580
    if (ins->vex.evex)
9212
580
      {
9213
3.20k
  case 256:
9214
3.20k
        vindex = 1;
9215
3.20k
        break;
9216
580
      }
9217
  /* Fall through.  */
9218
0
  default:
9219
0
    abort ();
9220
0
    break;
9221
16.1k
  }
9222
9223
16.1k
      dp = &vex_len_table[dp->op[1].bytemode][vindex];
9224
16.1k
      break;
9225
9226
2.48k
    case USE_EVEX_LEN_TABLE:
9227
2.48k
      if (!ins->vex.evex)
9228
0
  abort ();
9229
9230
2.48k
      switch (ins->vex.length)
9231
2.48k
  {
9232
873
  case 128:
9233
873
    vindex = 0;
9234
873
    break;
9235
593
  case 256:
9236
593
    vindex = 1;
9237
593
    break;
9238
1.01k
  case 512:
9239
1.01k
    vindex = 2;
9240
1.01k
    break;
9241
0
  default:
9242
0
    abort ();
9243
0
    break;
9244
2.48k
  }
9245
9246
2.48k
      dp = &evex_len_table[dp->op[1].bytemode][vindex];
9247
2.48k
      break;
9248
9249
15.0k
    case USE_XOP_8F_TABLE:
9250
15.0k
      if (!fetch_code (ins->info, ins->codep + 3))
9251
157
  return &err_opcode;
9252
14.9k
      ins->rex = ~(*ins->codep >> 5) & 0x7;
9253
9254
      /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm".  */
9255
14.9k
      switch ((*ins->codep & 0x1f))
9256
14.9k
  {
9257
9.45k
  default:
9258
9.45k
    dp = &bad_opcode;
9259
9.45k
    return dp;
9260
2.08k
  case 0x8:
9261
2.08k
    vex_table_index = XOP_08;
9262
2.08k
    break;
9263
1.83k
  case 0x9:
9264
1.83k
    vex_table_index = XOP_09;
9265
1.83k
    break;
9266
1.53k
  case 0xa:
9267
1.53k
    vex_table_index = XOP_0A;
9268
1.53k
    break;
9269
14.9k
  }
9270
5.45k
      ins->codep++;
9271
5.45k
      ins->vex.w = *ins->codep & 0x80;
9272
5.45k
      if (ins->vex.w && ins->address_mode == mode_64bit)
9273
1.45k
  ins->rex |= REX_W;
9274
9275
5.45k
      ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf;
9276
5.45k
      if (ins->address_mode != mode_64bit)
9277
1.84k
  {
9278
    /* In 16/32-bit mode REX_B is silently ignored.  */
9279
1.84k
    ins->rex &= ~REX_B;
9280
1.84k
  }
9281
9282
5.45k
      ins->vex.length = (*ins->codep & 0x4) ? 256 : 128;
9283
5.45k
      switch ((*ins->codep & 0x3))
9284
5.45k
  {
9285
4.02k
  case 0:
9286
4.02k
    break;
9287
400
  case 1:
9288
400
    ins->vex.prefix = DATA_PREFIX_OPCODE;
9289
400
    break;
9290
684
  case 2:
9291
684
    ins->vex.prefix = REPE_PREFIX_OPCODE;
9292
684
    break;
9293
349
  case 3:
9294
349
    ins->vex.prefix = REPNE_PREFIX_OPCODE;
9295
349
    break;
9296
5.45k
  }
9297
5.45k
      ins->need_vex = 3;
9298
5.45k
      ins->codep++;
9299
5.45k
      vindex = *ins->codep++;
9300
5.45k
      dp = &xop_table[vex_table_index][vindex];
9301
9302
5.45k
      ins->end_codep = ins->codep;
9303
5.45k
      if (!fetch_modrm (ins))
9304
343
  return &err_opcode;
9305
9306
      /* No XOP encoding so far allows for a non-zero embedded prefix. Avoid
9307
   having to decode the bits for every otherwise valid encoding.  */
9308
5.11k
      if (ins->vex.prefix)
9309
1.21k
  return &bad_opcode;
9310
3.89k
      break;
9311
9312
43.5k
    case USE_VEX_C4_TABLE:
9313
      /* VEX prefix.  */
9314
43.5k
      if (!fetch_code (ins->info, ins->codep + 3))
9315
309
  return &err_opcode;
9316
43.2k
      ins->rex = ~(*ins->codep >> 5) & 0x7;
9317
43.2k
      switch ((*ins->codep & 0x1f))
9318
43.2k
  {
9319
20.6k
  default:
9320
20.6k
    dp = &bad_opcode;
9321
20.6k
    return dp;
9322
2.72k
  case 0x1:
9323
2.72k
    vex_table_index = VEX_0F;
9324
2.72k
    break;
9325
12.5k
  case 0x2:
9326
12.5k
    vex_table_index = VEX_0F38;
9327
12.5k
    break;
9328
4.49k
  case 0x3:
9329
4.49k
    vex_table_index = VEX_0F3A;
9330
4.49k
    break;
9331
1.53k
  case 0x5:
9332
1.53k
    vex_table_index = VEX_MAP5;
9333
1.53k
    break;
9334
1.29k
  case 0x7:
9335
1.29k
    vex_table_index = VEX_MAP7;
9336
1.29k
    break;
9337
43.2k
  }
9338
22.5k
      ins->codep++;
9339
22.5k
      ins->vex.w = *ins->codep & 0x80;
9340
22.5k
      if (ins->address_mode == mode_64bit)
9341
18.4k
  {
9342
18.4k
    if (ins->vex.w)
9343
6.64k
      ins->rex |= REX_W;
9344
18.4k
  }
9345
4.09k
      else
9346
4.09k
  {
9347
    /* For the 3-byte VEX prefix in 32-bit mode, the REX_B bit
9348
       is ignored, other REX bits are 0 and the highest bit in
9349
       VEX.vvvv is also ignored (but we mustn't clear it here).  */
9350
4.09k
    ins->rex = 0;
9351
4.09k
  }
9352
22.5k
      ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf;
9353
22.5k
      ins->vex.length = (*ins->codep & 0x4) ? 256 : 128;
9354
22.5k
      switch ((*ins->codep & 0x3))
9355
22.5k
  {
9356
8.21k
  case 0:
9357
8.21k
    break;
9358
5.52k
  case 1:
9359
5.52k
    ins->vex.prefix = DATA_PREFIX_OPCODE;
9360
5.52k
    break;
9361
5.59k
  case 2:
9362
5.59k
    ins->vex.prefix = REPE_PREFIX_OPCODE;
9363
5.59k
    break;
9364
3.22k
  case 3:
9365
3.22k
    ins->vex.prefix = REPNE_PREFIX_OPCODE;
9366
3.22k
    break;
9367
22.5k
  }
9368
22.5k
      ins->need_vex = 3;
9369
22.5k
      ins->codep++;
9370
22.5k
      vindex = *ins->codep++;
9371
22.5k
      ins->condition_code = vindex & 0xf;
9372
22.5k
      if (vex_table_index != VEX_MAP7 && vex_table_index != VEX_MAP5)
9373
19.7k
  dp = &vex_table[vex_table_index][vindex];
9374
2.82k
      else if (vindex == 0xf6)
9375
302
  dp = &map7_f6_opcode;
9376
2.52k
      else if (vindex == 0xf8)
9377
1.05k
  {
9378
1.05k
    if (vex_table_index == VEX_MAP5)
9379
393
      dp = &map5_f8_opcode;
9380
658
    else
9381
658
      dp = &map7_f8_opcode;
9382
1.05k
  }
9383
1.47k
      else if (vindex == 0xf9)
9384
199
  dp = &map5_f9_opcode;
9385
1.27k
      else if (vindex == 0xfd)
9386
304
  dp = &map5_fd_opcode;
9387
971
      else
9388
971
  dp = &bad_opcode;
9389
22.5k
      ins->end_codep = ins->codep;
9390
      /* There is no MODRM byte for VEX0F 77.  */
9391
22.5k
      if ((vex_table_index != VEX_0F || vindex != 0x77)
9392
22.3k
    && !fetch_modrm (ins))
9393
785
  return &err_opcode;
9394
21.7k
      break;
9395
9396
21.7k
    case USE_VEX_C5_TABLE:
9397
      /* VEX prefix.  */
9398
19.8k
      if (!fetch_code (ins->info, ins->codep + 2))
9399
215
  return &err_opcode;
9400
19.6k
      ins->rex = (*ins->codep & 0x80) ? 0 : REX_R;
9401
9402
      /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in
9403
   VEX.vvvv is 1.  */
9404
19.6k
      ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf;
9405
19.6k
      ins->vex.length = (*ins->codep & 0x4) ? 256 : 128;
9406
19.6k
      switch ((*ins->codep & 0x3))
9407
19.6k
  {
9408
3.59k
  case 0:
9409
3.59k
    break;
9410
9.72k
  case 1:
9411
9.72k
    ins->vex.prefix = DATA_PREFIX_OPCODE;
9412
9.72k
    break;
9413
2.37k
  case 2:
9414
2.37k
    ins->vex.prefix = REPE_PREFIX_OPCODE;
9415
2.37k
    break;
9416
3.92k
  case 3:
9417
3.92k
    ins->vex.prefix = REPNE_PREFIX_OPCODE;
9418
3.92k
    break;
9419
19.6k
  }
9420
19.6k
      ins->need_vex = 2;
9421
19.6k
      ins->codep++;
9422
19.6k
      vindex = *ins->codep++;
9423
19.6k
      dp = &vex_table[VEX_0F][vindex];
9424
19.6k
      ins->end_codep = ins->codep;
9425
      /* There is no MODRM byte for VEX 77.  */
9426
19.6k
      if (vindex != 0x77 && !fetch_modrm (ins))
9427
302
  return &err_opcode;
9428
19.3k
      break;
9429
9430
20.6k
    case USE_VEX_W_TABLE:
9431
21.7k
    use_vex_w_table:
9432
21.7k
      if (!ins->need_vex)
9433
0
  abort ();
9434
9435
21.7k
      dp = &vex_w_table[dp->op[1].bytemode][ins->vex.w];
9436
21.7k
      break;
9437
9438
102k
    case USE_EVEX_TABLE:
9439
102k
      ins->two_source_ops = false;
9440
      /* EVEX prefix.  */
9441
102k
      ins->vex.evex = true;
9442
102k
      if (!fetch_code (ins->info, ins->codep + 4))
9443
607
  return &err_opcode;
9444
      /* The first byte after 0x62.  */
9445
102k
      if (*ins->codep & 0x8)
9446
16.7k
  ins->rex2 |= REX_B;
9447
102k
      if (!(*ins->codep & 0x10))
9448
56.0k
  ins->rex2 |= REX_R;
9449
9450
102k
      ins->rex = ~(*ins->codep >> 5) & 0x7;
9451
102k
      switch (*ins->codep & 0x7)
9452
102k
  {
9453
4.39k
  default:
9454
4.39k
    return &bad_opcode;
9455
17.0k
  case 0x1:
9456
17.0k
    vex_table_index = EVEX_0F;
9457
17.0k
    break;
9458
27.6k
  case 0x2:
9459
27.6k
    vex_table_index = EVEX_0F38;
9460
27.6k
    break;
9461
13.2k
  case 0x3:
9462
13.2k
    vex_table_index = EVEX_0F3A;
9463
13.2k
    break;
9464
19.1k
  case 0x4:
9465
19.1k
    vex_table_index = EVEX_MAP4;
9466
19.1k
    ins->evex_type = evex_from_legacy;
9467
19.1k
    if (ins->address_mode != mode_64bit)
9468
651
      return &bad_opcode;
9469
18.5k
    ins->rex |= REX_OPCODE;
9470
18.5k
    break;
9471
7.81k
  case 0x5:
9472
7.81k
    vex_table_index = EVEX_MAP5;
9473
7.81k
    break;
9474
9.81k
  case 0x6:
9475
9.81k
    vex_table_index = EVEX_MAP6;
9476
9.81k
    break;
9477
3.06k
  case 0x7:
9478
3.06k
    vex_table_index = EVEX_MAP7;
9479
3.06k
    break;
9480
102k
  }
9481
9482
      /* The second byte after 0x62.  */
9483
97.1k
      ins->codep++;
9484
97.1k
      ins->vex.w = *ins->codep & 0x80;
9485
97.1k
      if (ins->vex.w && ins->address_mode == mode_64bit)
9486
35.0k
  ins->rex |= REX_W;
9487
9488
97.1k
      ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf;
9489
9490
97.1k
      if (!(*ins->codep & 0x4))
9491
23.9k
  ins->rex2 |= REX_X;
9492
9493
97.1k
      switch ((*ins->codep & 0x3))
9494
97.1k
  {
9495
26.7k
  case 0:
9496
26.7k
    break;
9497
22.7k
  case 1:
9498
22.7k
    ins->vex.prefix = DATA_PREFIX_OPCODE;
9499
22.7k
    break;
9500
27.9k
  case 2:
9501
27.9k
    ins->vex.prefix = REPE_PREFIX_OPCODE;
9502
27.9k
    break;
9503
19.7k
  case 3:
9504
19.7k
    ins->vex.prefix = REPNE_PREFIX_OPCODE;
9505
19.7k
    break;
9506
97.1k
  }
9507
9508
      /* The third byte after 0x62.  */
9509
97.1k
      ins->codep++;
9510
9511
      /* Remember the static rounding bits.  */
9512
97.1k
      ins->vex.ll = (*ins->codep >> 5) & 3;
9513
97.1k
      ins->vex.b = *ins->codep & 0x10;
9514
9515
97.1k
      ins->vex.v = *ins->codep & 0x8;
9516
97.1k
      ins->vex.mask_register_specifier = *ins->codep & 0x7;
9517
97.1k
      ins->vex.scc = *ins->codep & 0xf;
9518
97.1k
      ins->vex.zeroing = *ins->codep & 0x80;
9519
      /* Set the NF bit for EVEX-Promoted instructions, this bit will be cleared
9520
   when it's an evex_default one.  */
9521
97.1k
      ins->vex.nf = *ins->codep & 0x4;
9522
9523
97.1k
      if (ins->address_mode != mode_64bit)
9524
7.92k
  {
9525
    /* Report bad for !evex_default and when two fixed values of evex
9526
       change.  */
9527
7.92k
    if (ins->evex_type != evex_default
9528
7.92k
        || (ins->rex2 & (REX_B | REX_X)))
9529
1.31k
      return &bad_opcode;
9530
    /* In 16/32-bit mode silently ignore following bits.  */
9531
6.61k
    ins->rex &= ~REX_B;
9532
6.61k
    ins->rex2 &= ~REX_R;
9533
6.61k
  }
9534
9535
95.8k
      ins->need_vex = 4;
9536
9537
95.8k
      ins->codep++;
9538
95.8k
      vindex = *ins->codep++;
9539
95.8k
      ins->condition_code = vindex & 0xf;
9540
95.8k
      if (vex_table_index != EVEX_MAP7)
9541
93.1k
  dp = &evex_table[vex_table_index][vindex];
9542
2.69k
      else if (vindex == 0xf8)
9543
267
  dp = &map7_f8_opcode;
9544
2.42k
      else if (vindex == 0xf6)
9545
342
  dp = &map7_f6_opcode;
9546
2.08k
      else
9547
2.08k
  dp = &bad_opcode;
9548
95.8k
      ins->end_codep = ins->codep;
9549
95.8k
      if (!fetch_modrm (ins))
9550
862
  return &err_opcode;
9551
9552
94.9k
      if (ins->modrm.mod == 3 && (ins->rex2 & REX_X))
9553
2.69k
  return &bad_opcode;
9554
9555
      /* Set vector length. For EVEX-promoted instructions, evex.ll == 0b00,
9556
   which has the same encoding as vex.length == 128 and they can share
9557
   the same processing with vex.length in OP_VEX.  */
9558
92.2k
      if (ins->modrm.mod == 3 && ins->vex.b && ins->evex_type != evex_from_legacy)
9559
8.87k
  ins->vex.length = 512;
9560
83.3k
      else
9561
83.3k
  {
9562
83.3k
    switch (ins->vex.ll)
9563
83.3k
      {
9564
32.1k
      case 0x0:
9565
32.1k
        ins->vex.length = 128;
9566
32.1k
        break;
9567
20.4k
      case 0x1:
9568
20.4k
        ins->vex.length = 256;
9569
20.4k
        break;
9570
22.9k
      case 0x2:
9571
22.9k
        ins->vex.length = 512;
9572
22.9k
        break;
9573
7.77k
      default:
9574
7.77k
        return &bad_opcode;
9575
83.3k
      }
9576
83.3k
  }
9577
84.4k
      break;
9578
9579
416k
    case 0:
9580
416k
      dp = &bad_opcode;
9581
416k
      break;
9582
9583
0
    default:
9584
0
      abort ();
9585
1.72M
    }
9586
9587
1.67M
  if (dp->name != NULL)
9588
913k
    return dp;
9589
758k
  else
9590
758k
    return get_valid_dis386 (dp, ins);
9591
1.67M
}
9592
9593
static bool
9594
get_sib (instr_info *ins, int sizeflag)
9595
3.28M
{
9596
  /* If modrm.mod == 3, operand must be register.  */
9597
3.28M
  if (ins->need_modrm
9598
2.00M
      && ((sizeflag & AFLAG) || ins->address_mode == mode_64bit)
9599
1.87M
      && ins->modrm.mod != 3
9600
1.35M
      && ins->modrm.rm == 4)
9601
94.3k
    {
9602
94.3k
      if (!fetch_code (ins->info, ins->codep + 2))
9603
1.70k
  return false;
9604
92.6k
      ins->sib.index = (ins->codep[1] >> 3) & 7;
9605
92.6k
      ins->sib.scale = (ins->codep[1] >> 6) & 3;
9606
92.6k
      ins->sib.base = ins->codep[1] & 7;
9607
92.6k
      ins->has_sib = true;
9608
92.6k
    }
9609
3.19M
  else
9610
3.19M
    ins->has_sib = false;
9611
9612
3.28M
  return true;
9613
3.28M
}
9614
9615
/* Like oappend_with_style (below) but always with text style.  */
9616
9617
static void
9618
oappend (instr_info *ins, const char *s)
9619
1.27M
{
9620
1.27M
  oappend_with_style (ins, s, dis_style_text);
9621
1.27M
}
9622
9623
/* Like oappend (above), but S is a string starting with '%'.  In
9624
   Intel syntax, the '%' is elided.  */
9625
9626
static void
9627
oappend_register (instr_info *ins, const char *s)
9628
4.01M
{
9629
4.01M
  oappend_with_style (ins, s + ins->intel_syntax, dis_style_register);
9630
4.01M
}
9631
9632
/* Wrap around a call to INS->info->fprintf_styled_func, printing FMT.
9633
   STYLE is the default style to use in the fprintf_styled_func calls,
9634
   however, FMT might include embedded style markers (see oappend_style),
9635
   these embedded markers are not printed, but instead change the style
9636
   used in the next fprintf_styled_func call.  */
9637
9638
static void ATTRIBUTE_PRINTF_3
9639
i386_dis_printf (const disassemble_info *info, enum disassembler_style style,
9640
     const char *fmt, ...)
9641
9.88M
{
9642
9.88M
  va_list ap;
9643
9.88M
  enum disassembler_style curr_style = style;
9644
9.88M
  const char *start, *curr;
9645
9.88M
  char staging_area[50];
9646
9647
9.88M
  va_start (ap, fmt);
9648
  /* In particular print_insn()'s processing of op_txt[] can hand rather long
9649
     strings here.  Bypass vsnprintf() in such cases to avoid capacity issues
9650
     with the staging area.  */
9651
9.88M
  if (strcmp (fmt, "%s"))
9652
5.64M
    {
9653
5.64M
      int res = vsnprintf (staging_area, sizeof (staging_area), fmt, ap);
9654
9655
5.64M
      va_end (ap);
9656
9657
5.64M
      if (res < 0)
9658
0
  return;
9659
9660
5.64M
      if ((size_t) res >= sizeof (staging_area))
9661
0
  abort ();
9662
9663
5.64M
      start = curr = staging_area;
9664
5.64M
    }
9665
4.23M
  else
9666
4.23M
    {
9667
4.23M
      start = curr = va_arg (ap, const char *);
9668
4.23M
      va_end (ap);
9669
4.23M
    }
9670
9671
9.88M
  do
9672
68.9M
    {
9673
68.9M
      if (*curr == '\0'
9674
59.0M
    || (*curr == STYLE_MARKER_CHAR
9675
59.0M
        && ISXDIGIT (*(curr + 1))
9676
8.94M
        && *(curr + 2) == STYLE_MARKER_CHAR))
9677
18.8M
  {
9678
    /* Output content between our START position and CURR.  */
9679
18.8M
    int len = curr - start;
9680
18.8M
    int n = (*info->fprintf_styled_func) (info->stream, curr_style,
9681
18.8M
            "%.*s", len, start);
9682
18.8M
    if (n < 0)
9683
0
      break;
9684
9685
18.8M
    if (*curr == '\0')
9686
9.88M
      break;
9687
9688
    /* Skip over the initial STYLE_MARKER_CHAR.  */
9689
8.94M
    ++curr;
9690
9691
    /* Update the CURR_STYLE.  As there are less than 16 styles, it
9692
       is possible, that if the input is corrupted in some way, that
9693
       we might set CURR_STYLE to an invalid value.  Don't worry
9694
       though, we check for this situation.  */
9695
8.94M
    if (*curr >= '0' && *curr <= '9')
9696
8.94M
      curr_style = (enum disassembler_style) (*curr - '0');
9697
0
    else if (*curr >= 'a' && *curr <= 'f')
9698
0
      curr_style = (enum disassembler_style) (*curr - 'a' + 10);
9699
0
    else
9700
0
      curr_style = dis_style_text;
9701
9702
    /* Check for an invalid style having been selected.  This should
9703
       never happen, but it doesn't hurt to be a little paranoid.  */
9704
8.94M
    if (curr_style > dis_style_comment_start)
9705
0
      curr_style = dis_style_text;
9706
9707
    /* Skip the hex character, and the closing STYLE_MARKER_CHAR.  */
9708
8.94M
    curr += 2;
9709
9710
    /* Reset the START to after the style marker.  */
9711
8.94M
    start = curr;
9712
8.94M
  }
9713
50.1M
      else
9714
50.1M
  ++curr;
9715
68.9M
    }
9716
9.88M
  while (true);
9717
9.88M
}
9718
9719
static int
9720
print_insn (bfd_vma pc, disassemble_info *info, int intel_syntax)
9721
3.38M
{
9722
3.38M
  const struct dis386 *dp;
9723
3.38M
  int i;
9724
3.38M
  int ret;
9725
3.38M
  char *op_txt[MAX_OPERANDS];
9726
3.38M
  int needcomma;
9727
3.38M
  bool intel_swap_2_3;
9728
3.38M
  int sizeflag, orig_sizeflag;
9729
3.38M
  const char *p;
9730
3.38M
  struct dis_private priv;
9731
3.38M
  int prefix_length;
9732
3.38M
  int op_count;
9733
3.38M
  instr_info ins = {
9734
3.38M
    .info = info,
9735
3.38M
    .intel_syntax = intel_syntax >= 0
9736
3.38M
        ? intel_syntax
9737
3.38M
        : (info->mach & bfd_mach_i386_intel_syntax) != 0,
9738
3.38M
    .intel_mnemonic = !SYSV386_COMPAT,
9739
3.38M
    .op_index[0 ... MAX_OPERANDS - 1] = -1,
9740
3.38M
    .start_pc = pc,
9741
3.38M
    .start_codep = priv.the_buffer,
9742
3.38M
    .codep = priv.the_buffer,
9743
3.38M
    .obufp = ins.obuf,
9744
3.38M
    .last_lock_prefix = -1,
9745
3.38M
    .last_repz_prefix = -1,
9746
3.38M
    .last_repnz_prefix = -1,
9747
3.38M
    .last_data_prefix = -1,
9748
3.38M
    .last_addr_prefix = -1,
9749
3.38M
    .last_rex_prefix = -1,
9750
3.38M
    .last_rex2_prefix = -1,
9751
3.38M
    .last_seg_prefix = -1,
9752
3.38M
    .fwait_prefix = -1,
9753
3.38M
  };
9754
3.38M
  char op_out[MAX_OPERANDS][MAX_OPERAND_BUFFER_SIZE];
9755
9756
3.38M
  priv.orig_sizeflag = AFLAG | DFLAG;
9757
3.38M
  if ((info->mach & bfd_mach_i386_i386) != 0)
9758
470k
    ins.address_mode = mode_32bit;
9759
2.91M
  else if (info->mach == bfd_mach_i386_i8086)
9760
201k
    {
9761
201k
      ins.address_mode = mode_16bit;
9762
201k
      priv.orig_sizeflag = 0;
9763
201k
    }
9764
2.71M
  else
9765
2.71M
    ins.address_mode = mode_64bit;
9766
9767
4.04M
  for (p = info->disassembler_options; p != NULL;)
9768
656k
    {
9769
656k
      if (startswith (p, "amd64"))
9770
1.26k
  ins.isa64 = amd64;
9771
655k
      else if (startswith (p, "intel64"))
9772
24.2k
  ins.isa64 = intel64;
9773
630k
      else if (startswith (p, "x86-64"))
9774
1.81k
  {
9775
1.81k
    ins.address_mode = mode_64bit;
9776
1.81k
    priv.orig_sizeflag |= AFLAG | DFLAG;
9777
1.81k
  }
9778
628k
      else if (startswith (p, "i386"))
9779
2.79k
  {
9780
2.79k
    ins.address_mode = mode_32bit;
9781
2.79k
    priv.orig_sizeflag |= AFLAG | DFLAG;
9782
2.79k
  }
9783
626k
      else if (startswith (p, "i8086"))
9784
26.5k
  {
9785
26.5k
    ins.address_mode = mode_16bit;
9786
26.5k
    priv.orig_sizeflag &= ~(AFLAG | DFLAG);
9787
26.5k
  }
9788
599k
      else if (startswith (p, "intel"))
9789
44.1k
  {
9790
44.1k
    if (startswith (p + 5, "-mnemonic"))
9791
336
      ins.intel_mnemonic = true;
9792
43.8k
    else
9793
43.8k
      ins.intel_syntax = 1;
9794
44.1k
  }
9795
555k
      else if (startswith (p, "att"))
9796
5.37k
  {
9797
5.37k
    ins.intel_syntax = 0;
9798
5.37k
    if (startswith (p + 3, "-mnemonic"))
9799
256
      ins.intel_mnemonic = false;
9800
5.37k
  }
9801
550k
      else if (startswith (p, "addr"))
9802
12.5k
  {
9803
12.5k
    if (ins.address_mode == mode_64bit)
9804
7.56k
      {
9805
7.56k
        if (p[4] == '3' && p[5] == '2')
9806
2.50k
    priv.orig_sizeflag &= ~AFLAG;
9807
5.05k
        else if (p[4] == '6' && p[5] == '4')
9808
218
    priv.orig_sizeflag |= AFLAG;
9809
7.56k
      }
9810
4.96k
    else
9811
4.96k
      {
9812
4.96k
        if (p[4] == '1' && p[5] == '6')
9813
480
    priv.orig_sizeflag &= ~AFLAG;
9814
4.48k
        else if (p[4] == '3' && p[5] == '2')
9815
1.85k
    priv.orig_sizeflag |= AFLAG;
9816
4.96k
      }
9817
12.5k
  }
9818
537k
      else if (startswith (p, "data"))
9819
31.4k
  {
9820
31.4k
    if (p[4] == '1' && p[5] == '6')
9821
22.5k
      priv.orig_sizeflag &= ~DFLAG;
9822
8.86k
    else if (p[4] == '3' && p[5] == '2')
9823
542
      priv.orig_sizeflag |= DFLAG;
9824
31.4k
  }
9825
506k
      else if (startswith (p, "suffix"))
9826
56.7k
  priv.orig_sizeflag |= SUFFIX_ALWAYS;
9827
9828
656k
      p = strchr (p, ',');
9829
656k
      if (p != NULL)
9830
200k
  p++;
9831
656k
    }
9832
9833
3.38M
  if (ins.address_mode == mode_64bit && sizeof (bfd_vma) < 8)
9834
0
    {
9835
0
      i386_dis_printf (info, dis_style_text, _("64-bit address is disabled"));
9836
0
      return -1;
9837
0
    }
9838
9839
3.38M
  if (ins.intel_syntax)
9840
813k
    {
9841
813k
      ins.open_char = '[';
9842
813k
      ins.close_char = ']';
9843
813k
      ins.separator_char = '+';
9844
813k
      ins.scale_char = '*';
9845
813k
    }
9846
2.57M
  else
9847
2.57M
    {
9848
2.57M
      ins.open_char = '(';
9849
2.57M
      ins.close_char =  ')';
9850
2.57M
      ins.separator_char = ',';
9851
2.57M
      ins.scale_char = ',';
9852
2.57M
    }
9853
9854
  /* The output looks better if we put 7 bytes on a line, since that
9855
     puts most long word instructions on a single line.  */
9856
3.38M
  info->bytes_per_line = 7;
9857
9858
3.38M
  info->private_data = &priv;
9859
3.38M
  priv.fetched = 0;
9860
3.38M
  priv.insn_start = pc;
9861
9862
20.3M
  for (i = 0; i < MAX_OPERANDS; ++i)
9863
16.9M
    {
9864
16.9M
      op_out[i][0] = 0;
9865
16.9M
      ins.op_out[i] = op_out[i];
9866
16.9M
    }
9867
9868
3.38M
  sizeflag = priv.orig_sizeflag;
9869
9870
3.38M
  switch (ckprefix (&ins))
9871
3.38M
    {
9872
3.30M
    case ckp_okay:
9873
3.30M
      break;
9874
9875
77.1k
    case ckp_bogus:
9876
      /* Too many prefixes or unused REX prefixes.  */
9877
77.1k
      for (i = 0;
9878
185k
     i < (int) ARRAY_SIZE (ins.all_prefixes) && ins.all_prefixes[i];
9879
108k
     i++)
9880
108k
  i386_dis_printf (info, dis_style_mnemonic, "%s%s",
9881
108k
       (i == 0 ? "" : " "),
9882
108k
       prefix_name (ins.address_mode, ins.all_prefixes[i],
9883
108k
              sizeflag));
9884
77.1k
      ret = i;
9885
77.1k
      goto out;
9886
9887
3.39k
    case ckp_fetch_error:
9888
3.39k
      goto fetch_error_out;
9889
3.38M
    }
9890
9891
3.30M
  ins.nr_prefixes = ins.codep - ins.start_codep;
9892
9893
3.30M
  if (!fetch_code (info, ins.codep + 1))
9894
313
    {
9895
47.9k
    fetch_error_out:
9896
47.9k
      ret = fetch_error (&ins);
9897
47.9k
      goto out;
9898
313
    }
9899
9900
3.30M
  ins.two_source_ops = (*ins.codep == 0x62 || *ins.codep == 0xc8);
9901
9902
3.30M
  if ((ins.prefixes & PREFIX_FWAIT)
9903
10.0k
      && (*ins.codep < 0xd8 || *ins.codep > 0xdf))
9904
9.25k
    {
9905
      /* Handle ins.prefixes before fwait.  */
9906
9.98k
      for (i = 0; i < ins.fwait_prefix && ins.all_prefixes[i];
9907
9.25k
     i++)
9908
734
  i386_dis_printf (info, dis_style_mnemonic, "%s ",
9909
734
       prefix_name (ins.address_mode, ins.all_prefixes[i],
9910
734
              sizeflag));
9911
9.25k
      i386_dis_printf (info, dis_style_mnemonic, "fwait");
9912
9.25k
      ret = i + 1;
9913
9.25k
      goto out;
9914
9.25k
    }
9915
9916
  /* REX2.M in rex2 prefix represents map0 or map1.  */
9917
3.29M
  if (ins.last_rex2_prefix < 0 ? *ins.codep == 0x0f : (ins.rex2 & REX2_M))
9918
94.1k
    {
9919
94.1k
      if (!ins.rex2)
9920
80.7k
  {
9921
80.7k
    ins.codep++;
9922
80.7k
    if (!fetch_code (info, ins.codep + 1))
9923
174
      goto fetch_error_out;
9924
80.7k
  }
9925
9926
93.9k
      dp = &dis386_twobyte[*ins.codep];
9927
93.9k
      ins.need_modrm = twobyte_has_modrm[*ins.codep];
9928
93.9k
    }
9929
3.19M
  else
9930
3.19M
    {
9931
3.19M
      dp = &dis386[*ins.codep];
9932
3.19M
      ins.need_modrm = onebyte_has_modrm[*ins.codep];
9933
3.19M
    }
9934
3.29M
  ins.condition_code = *ins.codep & 0xf;
9935
3.29M
  ins.codep++;
9936
9937
  /* Save sizeflag for printing the extra ins.prefixes later before updating
9938
     it for mnemonic and operand processing.  The prefix names depend
9939
     only on the address mode.  */
9940
3.29M
  orig_sizeflag = sizeflag;
9941
3.29M
  if (ins.prefixes & PREFIX_ADDR)
9942
36.0k
    sizeflag ^= AFLAG;
9943
3.29M
  if ((ins.prefixes & PREFIX_DATA))
9944
39.3k
    sizeflag ^= DFLAG;
9945
9946
3.29M
  ins.end_codep = ins.codep;
9947
3.29M
  if (ins.need_modrm && !fetch_modrm (&ins))
9948
4.09k
    goto fetch_error_out;
9949
9950
3.28M
  if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
9951
39.3k
    {
9952
39.3k
      if (!get_sib (&ins, sizeflag)
9953
39.1k
    || !dofloat (&ins, sizeflag))
9954
880
  goto fetch_error_out;
9955
39.3k
    }
9956
3.25M
  else
9957
3.25M
    {
9958
3.25M
      dp = get_valid_dis386 (dp, &ins);
9959
3.25M
      if (dp == &err_opcode)
9960
4.62k
  goto fetch_error_out;
9961
9962
      /* For APX instructions promoted from legacy maps 0/1, embedded prefix
9963
   is interpreted as the operand size override.  */
9964
3.24M
      if (ins.evex_type == evex_from_legacy
9965
19.0k
    && ins.vex.prefix == DATA_PREFIX_OPCODE)
9966
2.90k
  sizeflag ^= DFLAG;
9967
9968
3.24M
      if(ins.evex_type == evex_default)
9969
3.22M
  ins.vex.nf = false;
9970
25.7k
      else
9971
  /* For EVEX-promoted formats, we need to clear EVEX.NF (ccmp and ctest
9972
     are cleared separately.) in mask_register_specifier and keep the low
9973
     2 bits of mask_register_specifier to report errors for invalid cases
9974
     .  */
9975
25.7k
  ins.vex.mask_register_specifier &= 0x3;
9976
9977
3.24M
      if (dp != NULL && putop (&ins, dp->name, sizeflag) == 0)
9978
3.24M
  {
9979
3.24M
    if (!get_sib (&ins, sizeflag))
9980
1.51k
      goto fetch_error_out;
9981
19.3M
    for (i = 0; i < MAX_OPERANDS; ++i)
9982
16.1M
      {
9983
16.1M
        ins.obufp = ins.op_out[i];
9984
16.1M
        ins.op_ad = MAX_OPERANDS - 1 - i;
9985
16.1M
        if (dp->op[i].rtn
9986
5.00M
      && !dp->op[i].rtn (&ins, dp->op[i].bytemode, sizeflag))
9987
32.9k
    goto fetch_error_out;
9988
        /* For EVEX instruction after the last operand masking
9989
     should be printed.  */
9990
16.0M
        if (i == 0 && ins.vex.evex)
9991
99.6k
    {
9992
      /* Don't print {%k0}.  */
9993
99.6k
      if (ins.vex.mask_register_specifier)
9994
64.1k
        {
9995
64.1k
          const char *reg_name
9996
64.1k
      = att_names_mask[ins.vex.mask_register_specifier];
9997
9998
64.1k
          oappend (&ins, "{");
9999
64.1k
          oappend_register (&ins, reg_name);
10000
64.1k
          oappend (&ins, "}");
10001
10002
64.1k
          if (ins.vex.zeroing)
10003
24.1k
      oappend (&ins, "{z}");
10004
64.1k
        }
10005
35.5k
      else if (ins.vex.zeroing)
10006
6.76k
        {
10007
6.76k
          oappend (&ins, "{bad}");
10008
6.76k
          continue;
10009
6.76k
        }
10010
10011
      /* Instructions with a mask register destination allow for
10012
         zeroing-masking only (if any masking at all), which is
10013
         _not_ expressed by EVEX.z.  */
10014
92.9k
      if (ins.vex.zeroing && dp->op[0].bytemode == mask_mode)
10015
2.77k
        ins.illegal_masking = true;
10016
10017
      /* S/G insns require a mask and don't allow
10018
         zeroing-masking.  */
10019
92.9k
      if ((dp->op[0].bytemode == vex_vsib_d_w_dq_mode
10020
90.4k
           || dp->op[0].bytemode == vex_vsib_q_w_dq_mode)
10021
4.64k
          && (ins.vex.mask_register_specifier == 0
10022
4.17k
        || ins.vex.zeroing))
10023
2.68k
        ins.illegal_masking = true;
10024
10025
92.9k
      if (ins.illegal_masking)
10026
12.8k
        oappend (&ins, "/(bad)");
10027
92.9k
    }
10028
16.0M
      }
10029
    /* vex.nf is cleared after being consumed.  */
10030
3.21M
    if (ins.vex.nf)
10031
5.76k
      oappend (&ins, "{bad-nf}");
10032
10033
    /* Check whether rounding control was enabled for an insn not
10034
       supporting it, when evex.b is not treated as evex.nd.  */
10035
3.21M
    if (ins.modrm.mod == 3 && ins.vex.b && ins.evex_type == evex_default
10036
10.2k
        && !(ins.evex_used & EVEX_b_used))
10037
6.37k
      {
10038
18.6k
        for (i = 0; i < MAX_OPERANDS; ++i)
10039
18.6k
    {
10040
18.6k
      ins.obufp = ins.op_out[i];
10041
18.6k
      if (*ins.obufp)
10042
12.2k
        continue;
10043
6.37k
      oappend (&ins, names_rounding[ins.vex.ll]);
10044
6.37k
      oappend (&ins, "bad}");
10045
6.37k
      break;
10046
18.6k
    }
10047
6.37k
      }
10048
3.21M
  }
10049
3.24M
    }
10050
10051
  /* Clear instruction information.  */
10052
3.24M
  info->insn_info_valid = 0;
10053
3.24M
  info->branch_delay_insns = 0;
10054
3.24M
  info->data_size = 0;
10055
3.24M
  info->insn_type = dis_noninsn;
10056
3.24M
  info->target = 0;
10057
3.24M
  info->target2 = 0;
10058
10059
  /* Reset jump operation indicator.  */
10060
3.24M
  ins.op_is_jump = false;
10061
3.24M
  {
10062
3.24M
    int jump_detection = 0;
10063
10064
    /* Extract flags.  */
10065
19.4M
    for (i = 0; i < MAX_OPERANDS; ++i)
10066
16.2M
      {
10067
16.2M
  if ((dp->op[i].rtn == OP_J)
10068
16.0M
      || (dp->op[i].rtn == OP_indirE))
10069
256k
    jump_detection |= 1;
10070
15.9M
  else if ((dp->op[i].rtn == BND_Fixup)
10071
15.7M
     || (!dp->op[i].rtn && !dp->op[i].bytemode))
10072
11.3M
    jump_detection |= 2;
10073
4.66M
  else if ((dp->op[i].bytemode == cond_jump_mode)
10074
4.50M
     || (dp->op[i].bytemode == loop_jcxz_mode))
10075
182k
    jump_detection |= 4;
10076
16.2M
      }
10077
10078
    /* Determine if this is a jump or branch.  */
10079
3.24M
    if ((jump_detection & 0x3) == 0x3)
10080
256k
      {
10081
256k
  ins.op_is_jump = true;
10082
256k
  if (jump_detection & 0x4)
10083
182k
    info->insn_type = dis_condbranch;
10084
73.6k
  else
10085
73.6k
    info->insn_type = (dp->name && !strncmp (dp->name, "call", 4))
10086
73.6k
      ? dis_jsr : dis_branch;
10087
256k
      }
10088
3.24M
  }
10089
  /* The purpose of placing the check here is to wait for the EVEX prefix for
10090
     conditional CMP and TEST to be consumed and cleared, and then make a
10091
     unified judgment. Because they are both in map4, we can not distinguish
10092
     EVEX prefix for conditional CMP and TEST from others during the
10093
     EVEX prefix stage of parsing.  */
10094
3.24M
  if (ins.evex_type == evex_from_legacy)
10095
15.9k
    {
10096
      /* EVEX from legacy instructions, when the EVEX.ND bit is 0,
10097
   all bits of EVEX.vvvv and EVEX.V' must be 1.  */
10098
15.9k
      if (!ins.vex.nd && (ins.vex.register_specifier || !ins.vex.v))
10099
4.92k
  {
10100
4.92k
    i386_dis_printf (info, dis_style_text, "(bad)");
10101
4.92k
    ret = ins.end_codep - priv.the_buffer;
10102
4.92k
    goto out;
10103
4.92k
  }
10104
10105
      /* EVEX from legacy instructions require that EVEX.z, EVEX.L’L and the
10106
   lower 2 bits of EVEX.aaa must be 0.  */
10107
11.0k
      if ((ins.vex.mask_register_specifier & 0x3) != 0
10108
7.11k
    || ins.vex.ll != 0 || ins.vex.zeroing != 0)
10109
7.26k
  {
10110
7.26k
    i386_dis_printf (info, dis_style_text, "(bad)");
10111
7.26k
    ret = ins.end_codep - priv.the_buffer;
10112
7.26k
    goto out;
10113
7.26k
  }
10114
11.0k
    }
10115
  /* If VEX.vvvv and EVEX.vvvv are unused, they must be all 1s, which
10116
     are all 0s in inverted form.  */
10117
3.23M
  if (ins.need_vex && ins.vex.register_specifier != 0)
10118
61.0k
    {
10119
61.0k
      i386_dis_printf (info, dis_style_text, "(bad)");
10120
61.0k
      ret = ins.end_codep - priv.the_buffer;
10121
61.0k
      goto out;
10122
61.0k
    }
10123
10124
3.17M
  if ((dp->prefix_requirement & PREFIX_REX2_ILLEGAL)
10125
372k
      && ins.last_rex2_prefix >= 0 && (ins.rex2 & REX2_SPECIAL) == 0)
10126
2.35k
    {
10127
2.35k
      i386_dis_printf (info, dis_style_text, "(bad)");
10128
2.35k
      ret = ins.end_codep - priv.the_buffer;
10129
2.35k
      goto out;
10130
2.35k
    }
10131
10132
3.17M
  switch (dp->prefix_requirement & ~PREFIX_REX2_ILLEGAL)
10133
3.17M
    {
10134
28.7k
    case PREFIX_DATA:
10135
      /* If only the data prefix is marked as mandatory, its absence renders
10136
   the encoding invalid.  Most other PREFIX_OPCODE rules still apply.  */
10137
28.7k
      if (ins.need_vex ? !ins.vex.prefix : !(ins.prefixes & PREFIX_DATA))
10138
12.7k
  {
10139
12.7k
    i386_dis_printf (info, dis_style_text, "(bad)");
10140
12.7k
    ret = ins.end_codep - priv.the_buffer;
10141
12.7k
    goto out;
10142
12.7k
  }
10143
16.0k
      ins.used_prefixes |= PREFIX_DATA;
10144
      /* Fall through.  */
10145
35.7k
    case PREFIX_OPCODE:
10146
      /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
10147
   unused, opcode is invalid.  Since the PREFIX_DATA prefix may be
10148
   used by putop and MMX/SSE operand and may be overridden by the
10149
   PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
10150
   separately.  */
10151
35.7k
      if (((ins.need_vex
10152
35.7k
      ? ins.vex.prefix == REPE_PREFIX_OPCODE
10153
12.8k
        || ins.vex.prefix == REPNE_PREFIX_OPCODE
10154
35.7k
      : (ins.prefixes
10155
19.0k
         & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
10156
10.6k
     && (ins.used_prefixes
10157
10.6k
         & (PREFIX_REPZ | PREFIX_REPNZ)) == 0)
10158
25.8k
    || (((ins.need_vex
10159
25.8k
    ? ins.vex.prefix == DATA_PREFIX_OPCODE
10160
25.8k
    : ((ins.prefixes
10161
17.9k
        & (PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA))
10162
17.9k
       == PREFIX_DATA))
10163
9.45k
         && (ins.used_prefixes & PREFIX_DATA) == 0))
10164
25.5k
    || (ins.vex.evex && dp->prefix_requirement != PREFIX_DATA
10165
546
        && !ins.vex.w != !(ins.used_prefixes & PREFIX_DATA)))
10166
10.4k
  {
10167
10.4k
    i386_dis_printf (info, dis_style_text, "(bad)");
10168
10.4k
    ret = ins.end_codep - priv.the_buffer;
10169
10.4k
    goto out;
10170
10.4k
  }
10171
25.2k
      break;
10172
10173
25.2k
    case PREFIX_IGNORED:
10174
      /* Zap data size and rep prefixes from used_prefixes and reinstate their
10175
   origins in all_prefixes.  */
10176
2.23k
      ins.used_prefixes &= ~PREFIX_OPCODE;
10177
2.23k
      if (ins.last_data_prefix >= 0)
10178
664
  ins.all_prefixes[ins.last_data_prefix] = 0x66;
10179
2.23k
      if (ins.last_repz_prefix >= 0)
10180
1.19k
  ins.all_prefixes[ins.last_repz_prefix] = 0xf3;
10181
2.23k
      if (ins.last_repnz_prefix >= 0)
10182
1.22k
  ins.all_prefixes[ins.last_repnz_prefix] = 0xf2;
10183
2.23k
      break;
10184
10185
24.8k
    case PREFIX_NP_OR_DATA:
10186
24.8k
      if (ins.vex.prefix == REPE_PREFIX_OPCODE
10187
24.3k
    || ins.vex.prefix == REPNE_PREFIX_OPCODE)
10188
817
  {
10189
817
    i386_dis_printf (info, dis_style_text, "(bad)");
10190
817
    ret = ins.end_codep - priv.the_buffer;
10191
817
    goto out;
10192
817
  }
10193
24.0k
      break;
10194
10195
24.0k
    case NO_PREFIX:
10196
16.6k
      if (ins.vex.prefix)
10197
408
  {
10198
408
    i386_dis_printf (info, dis_style_text, "(bad)");
10199
408
    ret = ins.end_codep - priv.the_buffer;
10200
408
    goto out;
10201
408
  }
10202
16.2k
      break;
10203
3.17M
    }
10204
10205
  /* Check if the REX prefix is used.  */
10206
3.14M
  if ((ins.rex ^ ins.rex_used) == 0
10207
2.81M
      && !ins.need_vex && ins.last_rex_prefix >= 0)
10208
59.1k
    ins.all_prefixes[ins.last_rex_prefix] = 0;
10209
10210
  /* Check if the REX2 prefix is used.  */
10211
3.14M
  if (ins.last_rex2_prefix >= 0
10212
14.2k
      && ((ins.rex2 & REX2_SPECIAL)
10213
13.5k
    || (((ins.rex2 & 7) ^ (ins.rex2_used & 7)) == 0
10214
2.76k
        && (ins.rex ^ ins.rex_used) == 0
10215
1.43k
        && (ins.rex2 & 7))))
10216
1.87k
    ins.all_prefixes[ins.last_rex2_prefix] = 0;
10217
10218
  /* Check if the SEG prefix is used.  */
10219
3.14M
  if ((ins.prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
10220
3.14M
           | PREFIX_FS | PREFIX_GS)) != 0
10221
90.3k
      && (ins.used_prefixes & ins.active_seg_prefix) != 0)
10222
29.9k
    ins.all_prefixes[ins.last_seg_prefix] = 0;
10223
10224
  /* Check if the ADDR prefix is used.  */
10225
3.14M
  if ((ins.prefixes & PREFIX_ADDR) != 0
10226
31.4k
      && (ins.used_prefixes & PREFIX_ADDR) != 0)
10227
16.4k
    ins.all_prefixes[ins.last_addr_prefix] = 0;
10228
10229
  /* Check if the DATA prefix is used.  */
10230
3.14M
  if ((ins.prefixes & PREFIX_DATA) != 0
10231
33.1k
      && (ins.used_prefixes & PREFIX_DATA) != 0
10232
23.0k
      && !ins.need_vex)
10233
22.6k
    ins.all_prefixes[ins.last_data_prefix] = 0;
10234
10235
  /* Print the extra ins.prefixes.  */
10236
3.14M
  prefix_length = 0;
10237
47.2M
  for (i = 0; i < (int) ARRAY_SIZE (ins.all_prefixes); i++)
10238
44.0M
    if (ins.all_prefixes[i])
10239
267k
      {
10240
267k
  const char *name = prefix_name (ins.address_mode, ins.all_prefixes[i],
10241
267k
          orig_sizeflag);
10242
10243
267k
  if (name == NULL)
10244
0
    abort ();
10245
267k
  prefix_length += strlen (name) + 1;
10246
267k
  if (ins.all_prefixes[i] == REX2_OPCODE)
10247
12.3k
    i386_dis_printf (info, dis_style_mnemonic, "{%s 0x%x} ", name,
10248
12.3k
         (unsigned int) ins.rex2_payload);
10249
255k
  else
10250
255k
    i386_dis_printf (info, dis_style_mnemonic, "%s ", name);
10251
267k
      }
10252
10253
  /* Check maximum code length.  */
10254
3.14M
  if ((ins.codep - ins.start_codep) > MAX_CODE_LENGTH)
10255
847
    {
10256
847
      i386_dis_printf (info, dis_style_text, "(bad)");
10257
847
      ret = MAX_CODE_LENGTH;
10258
847
      goto out;
10259
847
    }
10260
10261
  /* Calculate the number of operands this instruction has.  */
10262
3.14M
  op_count = 0;
10263
18.8M
  for (i = 0; i < MAX_OPERANDS; ++i)
10264
15.7M
    if (*ins.op_out[i] != '\0')
10265
4.42M
      ++op_count;
10266
10267
  /* Calculate the number of spaces to print after the mnemonic.  */
10268
3.14M
  ins.obufp = ins.mnemonicendp;
10269
3.14M
  if (op_count > 0)
10270
2.46M
    {
10271
2.46M
      i = strlen (ins.obuf) + prefix_length;
10272
2.46M
      if (i < 7)
10273
2.30M
  i = 7 - i;
10274
169k
      else
10275
169k
  i = 1;
10276
2.46M
    }
10277
678k
  else
10278
678k
    i = 0;
10279
10280
  /* Print the instruction mnemonic along with any trailing whitespace.  */
10281
3.14M
  i386_dis_printf (info, dis_style_mnemonic, "%s%*s", ins.obuf, i, "");
10282
10283
  /* The enter and bound instructions are printed with operands in the same
10284
     order as the intel book; everything else is printed in reverse order.  */
10285
3.14M
  intel_swap_2_3 = false;
10286
3.14M
  if (ins.intel_syntax || ins.two_source_ops)
10287
744k
    {
10288
4.46M
      for (i = 0; i < MAX_OPERANDS; ++i)
10289
3.72M
  op_txt[i] = ins.op_out[i];
10290
10291
744k
      if (ins.intel_syntax && dp && dp->op[2].rtn == OP_Rounding
10292
3.11k
          && dp->op[3].rtn == OP_E && dp->op[4].rtn == NULL)
10293
787
  {
10294
787
    op_txt[2] = ins.op_out[3];
10295
787
    op_txt[3] = ins.op_out[2];
10296
787
    intel_swap_2_3 = true;
10297
787
  }
10298
10299
2.23M
      for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
10300
1.48M
  {
10301
1.48M
    bool riprel;
10302
10303
1.48M
    ins.op_ad = ins.op_index[i];
10304
1.48M
    ins.op_index[i] = ins.op_index[MAX_OPERANDS - 1 - i];
10305
1.48M
    ins.op_index[MAX_OPERANDS - 1 - i] = ins.op_ad;
10306
1.48M
    riprel = ins.op_riprel[i];
10307
1.48M
    ins.op_riprel[i] = ins.op_riprel[MAX_OPERANDS - 1 - i];
10308
1.48M
    ins.op_riprel[MAX_OPERANDS - 1 - i] = riprel;
10309
1.48M
  }
10310
744k
    }
10311
2.40M
  else
10312
2.40M
    {
10313
14.4M
      for (i = 0; i < MAX_OPERANDS; ++i)
10314
12.0M
  op_txt[MAX_OPERANDS - 1 - i] = ins.op_out[i];
10315
2.40M
    }
10316
10317
3.14M
  needcomma = 0;
10318
18.8M
  for (i = 0; i < MAX_OPERANDS; ++i)
10319
15.7M
    if (*op_txt[i])
10320
4.42M
      {
10321
  /* In Intel syntax embedded rounding / SAE are not separate operands.
10322
     Instead they're attached to the prior register operand.  Simply
10323
     suppress emission of the comma to achieve that effect.  */
10324
4.42M
  switch (i & -(ins.intel_syntax && dp))
10325
4.42M
    {
10326
30.5k
    case 2:
10327
30.5k
      if (dp->op[2].rtn == OP_Rounding && !intel_swap_2_3)
10328
417
        needcomma = 0;
10329
30.5k
      break;
10330
2.76k
    case 3:
10331
2.76k
      if (dp->op[3].rtn == OP_Rounding || intel_swap_2_3)
10332
690
        needcomma = 0;
10333
2.76k
      break;
10334
4.42M
    }
10335
4.42M
  if (needcomma)
10336
1.94M
    i386_dis_printf (info, dis_style_text, ",");
10337
4.42M
  if (ins.op_index[i] != -1 && !ins.op_riprel[i])
10338
214k
    {
10339
214k
      bfd_vma target = (bfd_vma) ins.op_address[ins.op_index[i]];
10340
10341
214k
      if (ins.op_is_jump)
10342
214k
        {
10343
214k
    info->insn_info_valid = 1;
10344
214k
    info->branch_delay_insns = 0;
10345
214k
    info->data_size = 0;
10346
214k
    info->target = target;
10347
214k
    info->target2 = 0;
10348
214k
        }
10349
214k
      (*info->print_address_func) (target, info);
10350
214k
    }
10351
4.20M
  else
10352
4.20M
    i386_dis_printf (info, dis_style_text, "%s", op_txt[i]);
10353
4.42M
  needcomma = 1;
10354
4.42M
      }
10355
10356
18.8M
  for (i = 0; i < MAX_OPERANDS; i++)
10357
15.7M
    if (ins.op_index[i] != -1 && ins.op_riprel[i])
10358
27.0k
      {
10359
27.0k
  i386_dis_printf (info, dis_style_comment_start, "        # ");
10360
27.0k
  (*info->print_address_func)
10361
27.0k
    ((bfd_vma)(ins.start_pc + (ins.codep - ins.start_codep)
10362
27.0k
         + ins.op_address[ins.op_index[i]]),
10363
27.0k
    info);
10364
27.0k
  break;
10365
27.0k
      }
10366
3.14M
  ret = ins.codep - priv.the_buffer;
10367
3.38M
 out:
10368
3.38M
  info->private_data = NULL;
10369
3.38M
  return ret;
10370
3.14M
}
10371
10372
/* Here for backwards compatibility.  When gdb stops using
10373
   print_insn_i386_att and print_insn_i386_intel these functions can
10374
   disappear, and print_insn_i386 be merged into print_insn.  */
10375
int
10376
print_insn_i386_att (bfd_vma pc, disassemble_info *info)
10377
0
{
10378
0
  return print_insn (pc, info, 0);
10379
0
}
10380
10381
int
10382
print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
10383
0
{
10384
0
  return print_insn (pc, info, 1);
10385
0
}
10386
10387
int
10388
print_insn_i386 (bfd_vma pc, disassemble_info *info)
10389
3.38M
{
10390
3.38M
  return print_insn (pc, info, -1);
10391
3.38M
}
10392
10393
static const char *float_mem[] = {
10394
  /* d8 */
10395
  "fadd{s|}",
10396
  "fmul{s|}",
10397
  "fcom{s|}",
10398
  "fcomp{s|}",
10399
  "fsub{s|}",
10400
  "fsubr{s|}",
10401
  "fdiv{s|}",
10402
  "fdivr{s|}",
10403
  /* d9 */
10404
  "fld{s|}",
10405
  "(bad)",
10406
  "fst{s|}",
10407
  "fstp{s|}",
10408
  "fldenv{C|C}",
10409
  "fldcw",
10410
  "fNstenv{C|C}",
10411
  "fNstcw",
10412
  /* da */
10413
  "fiadd{l|}",
10414
  "fimul{l|}",
10415
  "ficom{l|}",
10416
  "ficomp{l|}",
10417
  "fisub{l|}",
10418
  "fisubr{l|}",
10419
  "fidiv{l|}",
10420
  "fidivr{l|}",
10421
  /* db */
10422
  "fild{l|}",
10423
  "fisttp{l|}",
10424
  "fist{l|}",
10425
  "fistp{l|}",
10426
  "(bad)",
10427
  "fld{t|}",
10428
  "(bad)",
10429
  "fstp{t|}",
10430
  /* dc */
10431
  "fadd{l|}",
10432
  "fmul{l|}",
10433
  "fcom{l|}",
10434
  "fcomp{l|}",
10435
  "fsub{l|}",
10436
  "fsubr{l|}",
10437
  "fdiv{l|}",
10438
  "fdivr{l|}",
10439
  /* dd */
10440
  "fld{l|}",
10441
  "fisttp{ll|}",
10442
  "fst{l||}",
10443
  "fstp{l|}",
10444
  "frstor{C|C}",
10445
  "(bad)",
10446
  "fNsave{C|C}",
10447
  "fNstsw",
10448
  /* de */
10449
  "fiadd{s|}",
10450
  "fimul{s|}",
10451
  "ficom{s|}",
10452
  "ficomp{s|}",
10453
  "fisub{s|}",
10454
  "fisubr{s|}",
10455
  "fidiv{s|}",
10456
  "fidivr{s|}",
10457
  /* df */
10458
  "fild{s|}",
10459
  "fisttp{s|}",
10460
  "fist{s|}",
10461
  "fistp{s|}",
10462
  "fbld",
10463
  "fild{ll|}",
10464
  "fbstp",
10465
  "fistp{ll|}",
10466
};
10467
10468
static const unsigned char float_mem_mode[] = {
10469
  /* d8 */
10470
  d_mode,
10471
  d_mode,
10472
  d_mode,
10473
  d_mode,
10474
  d_mode,
10475
  d_mode,
10476
  d_mode,
10477
  d_mode,
10478
  /* d9 */
10479
  d_mode,
10480
  0,
10481
  d_mode,
10482
  d_mode,
10483
  0,
10484
  w_mode,
10485
  0,
10486
  w_mode,
10487
  /* da */
10488
  d_mode,
10489
  d_mode,
10490
  d_mode,
10491
  d_mode,
10492
  d_mode,
10493
  d_mode,
10494
  d_mode,
10495
  d_mode,
10496
  /* db */
10497
  d_mode,
10498
  d_mode,
10499
  d_mode,
10500
  d_mode,
10501
  0,
10502
  t_mode,
10503
  0,
10504
  t_mode,
10505
  /* dc */
10506
  q_mode,
10507
  q_mode,
10508
  q_mode,
10509
  q_mode,
10510
  q_mode,
10511
  q_mode,
10512
  q_mode,
10513
  q_mode,
10514
  /* dd */
10515
  q_mode,
10516
  q_mode,
10517
  q_mode,
10518
  q_mode,
10519
  0,
10520
  0,
10521
  0,
10522
  w_mode,
10523
  /* de */
10524
  w_mode,
10525
  w_mode,
10526
  w_mode,
10527
  w_mode,
10528
  w_mode,
10529
  w_mode,
10530
  w_mode,
10531
  w_mode,
10532
  /* df */
10533
  w_mode,
10534
  w_mode,
10535
  w_mode,
10536
  w_mode,
10537
  t_mode,
10538
  q_mode,
10539
  t_mode,
10540
  q_mode
10541
};
10542
10543
#define ST { OP_ST, 0 }
10544
#define STi { OP_STi, 0 }
10545
10546
#define FGRPd9_2 NULL, { { NULL, 1 } }, 0
10547
#define FGRPd9_4 NULL, { { NULL, 2 } }, 0
10548
#define FGRPd9_5 NULL, { { NULL, 3 } }, 0
10549
#define FGRPd9_6 NULL, { { NULL, 4 } }, 0
10550
#define FGRPd9_7 NULL, { { NULL, 5 } }, 0
10551
#define FGRPda_5 NULL, { { NULL, 6 } }, 0
10552
#define FGRPdb_4 NULL, { { NULL, 7 } }, 0
10553
#define FGRPde_3 NULL, { { NULL, 8 } }, 0
10554
#define FGRPdf_4 NULL, { { NULL, 9 } }, 0
10555
10556
static const struct dis386 float_reg[][8] = {
10557
  /* d8 */
10558
  {
10559
    { "fadd", { ST, STi }, 0 },
10560
    { "fmul", { ST, STi }, 0 },
10561
    { "fcom", { STi }, 0 },
10562
    { "fcomp",  { STi }, 0 },
10563
    { "fsub", { ST, STi }, 0 },
10564
    { "fsubr",  { ST, STi }, 0 },
10565
    { "fdiv", { ST, STi }, 0 },
10566
    { "fdivr",  { ST, STi }, 0 },
10567
  },
10568
  /* d9 */
10569
  {
10570
    { "fld",  { STi }, 0 },
10571
    { "fxch", { STi }, 0 },
10572
    { FGRPd9_2 },
10573
    { Bad_Opcode },
10574
    { FGRPd9_4 },
10575
    { FGRPd9_5 },
10576
    { FGRPd9_6 },
10577
    { FGRPd9_7 },
10578
  },
10579
  /* da */
10580
  {
10581
    { "fcmovb", { ST, STi }, 0 },
10582
    { "fcmove", { ST, STi }, 0 },
10583
    { "fcmovbe",{ ST, STi }, 0 },
10584
    { "fcmovu", { ST, STi }, 0 },
10585
    { Bad_Opcode },
10586
    { FGRPda_5 },
10587
    { Bad_Opcode },
10588
    { Bad_Opcode },
10589
  },
10590
  /* db */
10591
  {
10592
    { "fcmovnb",{ ST, STi }, 0 },
10593
    { "fcmovne",{ ST, STi }, 0 },
10594
    { "fcmovnbe",{ ST, STi }, 0 },
10595
    { "fcmovnu",{ ST, STi }, 0 },
10596
    { FGRPdb_4 },
10597
    { "fucomi", { ST, STi }, 0 },
10598
    { "fcomi",  { ST, STi }, 0 },
10599
    { Bad_Opcode },
10600
  },
10601
  /* dc */
10602
  {
10603
    { "fadd", { STi, ST }, 0 },
10604
    { "fmul", { STi, ST }, 0 },
10605
    { Bad_Opcode },
10606
    { Bad_Opcode },
10607
    { "fsub{!M|r}", { STi, ST }, 0 },
10608
    { "fsub{M|}", { STi, ST }, 0 },
10609
    { "fdiv{!M|r}", { STi, ST }, 0 },
10610
    { "fdiv{M|}", { STi, ST }, 0 },
10611
  },
10612
  /* dd */
10613
  {
10614
    { "ffree",  { STi }, 0 },
10615
    { Bad_Opcode },
10616
    { "fst",  { STi }, 0 },
10617
    { "fstp", { STi }, 0 },
10618
    { "fucom",  { STi }, 0 },
10619
    { "fucomp", { STi }, 0 },
10620
    { Bad_Opcode },
10621
    { Bad_Opcode },
10622
  },
10623
  /* de */
10624
  {
10625
    { "faddp",  { STi, ST }, 0 },
10626
    { "fmulp",  { STi, ST }, 0 },
10627
    { Bad_Opcode },
10628
    { FGRPde_3 },
10629
    { "fsub{!M|r}p",  { STi, ST }, 0 },
10630
    { "fsub{M|}p",  { STi, ST }, 0 },
10631
    { "fdiv{!M|r}p",  { STi, ST }, 0 },
10632
    { "fdiv{M|}p",  { STi, ST }, 0 },
10633
  },
10634
  /* df */
10635
  {
10636
    { "ffreep", { STi }, 0 },
10637
    { Bad_Opcode },
10638
    { Bad_Opcode },
10639
    { Bad_Opcode },
10640
    { FGRPdf_4 },
10641
    { "fucomip", { ST, STi }, 0 },
10642
    { "fcomip", { ST, STi }, 0 },
10643
    { Bad_Opcode },
10644
  },
10645
};
10646
10647
static const char *const fgrps[][8] = {
10648
  /* Bad opcode 0 */
10649
  {
10650
    "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10651
  },
10652
10653
  /* d9_2  1 */
10654
  {
10655
    "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10656
  },
10657
10658
  /* d9_4  2 */
10659
  {
10660
    "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
10661
  },
10662
10663
  /* d9_5  3 */
10664
  {
10665
    "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
10666
  },
10667
10668
  /* d9_6  4 */
10669
  {
10670
    "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
10671
  },
10672
10673
  /* d9_7  5 */
10674
  {
10675
    "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
10676
  },
10677
10678
  /* da_5  6 */
10679
  {
10680
    "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10681
  },
10682
10683
  /* db_4  7 */
10684
  {
10685
    "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
10686
    "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
10687
  },
10688
10689
  /* de_3  8 */
10690
  {
10691
    "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10692
  },
10693
10694
  /* df_4  9 */
10695
  {
10696
    "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10697
  },
10698
};
10699
10700
static const char *const oszc_flags[16] = {
10701
  " {dfv=}", " {dfv=cf}", " {dfv=zf}", " {dfv=zf, cf}", " {dfv=sf}",
10702
  " {dfv=sf, cf}", " {dfv=sf, zf}", " {dfv=sf, zf, cf}", " {dfv=of}",
10703
  " {dfv=of, cf}", " {dfv=of, zf}", " {dfv=of, zf, cf}", " {dfv=of, sf}",
10704
  " {dfv=of, sf, cf}", " {dfv=of, sf, zf}", " {dfv=of, sf, zf, cf}"
10705
};
10706
10707
static const char *const scc_suffix[16] = {
10708
  "o", "no", "b", "ae", "e", "ne", "be", "a", "s", "ns", "t", "f",
10709
  "l", "ge", "le", "g"
10710
};
10711
10712
static void
10713
swap_operand (instr_info *ins)
10714
2.23k
{
10715
2.23k
  char *p = ins->mnemonicendp;
10716
10717
2.23k
  if (p[-1] == '}')
10718
416
    {
10719
5.29k
      while (*--p != '{')
10720
4.87k
  {
10721
4.87k
    if (p <= ins->obuf + 2)
10722
0
      abort ();
10723
4.87k
  }
10724
416
      if (p[-1] == ' ')
10725
226
  --p;
10726
416
    }
10727
2.23k
  memmove (p + 2, p, ins->mnemonicendp - p + 1);
10728
2.23k
  p[0] = '.';
10729
2.23k
  p[1] = 's';
10730
2.23k
  ins->mnemonicendp += 2;
10731
2.23k
}
10732
10733
static bool
10734
dofloat (instr_info *ins, int sizeflag)
10735
39.1k
{
10736
39.1k
  const struct dis386 *dp;
10737
39.1k
  unsigned char floatop = ins->codep[-1];
10738
10739
39.1k
  if (ins->modrm.mod != 3)
10740
17.2k
    {
10741
17.2k
      int fp_indx = (floatop - 0xd8) * 8 + ins->modrm.reg;
10742
10743
17.2k
      putop (ins, float_mem[fp_indx], sizeflag);
10744
17.2k
      ins->obufp = ins->op_out[0];
10745
17.2k
      ins->op_ad = 2;
10746
17.2k
      return OP_E (ins, float_mem_mode[fp_indx], sizeflag);
10747
17.2k
    }
10748
  /* Skip mod/rm byte.  */
10749
21.9k
  MODRM_CHECK;
10750
21.9k
  ins->codep++;
10751
10752
21.9k
  dp = &float_reg[floatop - 0xd8][ins->modrm.reg];
10753
21.9k
  if (dp->name == NULL)
10754
10.8k
    {
10755
10.8k
      putop (ins, fgrps[dp->op[0].bytemode][ins->modrm.rm], sizeflag);
10756
10757
      /* Instruction fnstsw is only one with strange arg.  */
10758
10.8k
      if (floatop == 0xdf && ins->codep[-1] == 0xe0)
10759
310
  strcpy (ins->op_out[0], att_names16[0] + ins->intel_syntax);
10760
10.8k
    }
10761
11.0k
  else
10762
11.0k
    {
10763
11.0k
      putop (ins, dp->name, sizeflag);
10764
10765
11.0k
      ins->obufp = ins->op_out[0];
10766
11.0k
      ins->op_ad = 2;
10767
11.0k
      if (dp->op[0].rtn
10768
11.0k
    && !dp->op[0].rtn (ins, dp->op[0].bytemode, sizeflag))
10769
0
  return false;
10770
10771
11.0k
      ins->obufp = ins->op_out[1];
10772
11.0k
      ins->op_ad = 1;
10773
11.0k
      if (dp->op[1].rtn
10774
7.56k
    && !dp->op[1].rtn (ins, dp->op[1].bytemode, sizeflag))
10775
0
  return false;
10776
11.0k
    }
10777
21.9k
  return true;
10778
21.9k
}
10779
10780
static bool
10781
OP_ST (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
10782
       int sizeflag ATTRIBUTE_UNUSED)
10783
7.56k
{
10784
7.56k
  oappend_register (ins, "%st");
10785
7.56k
  return true;
10786
7.56k
}
10787
10788
static bool
10789
OP_STi (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
10790
  int sizeflag ATTRIBUTE_UNUSED)
10791
11.0k
{
10792
11.0k
  char scratch[8];
10793
11.0k
  int res = snprintf (scratch, ARRAY_SIZE (scratch), "%%st(%d)", ins->modrm.rm);
10794
10795
11.0k
  if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
10796
0
    abort ();
10797
11.0k
  oappend_register (ins, scratch);
10798
11.0k
  return true;
10799
11.0k
}
10800
10801
/* Capital letters in template are macros.  */
10802
static int
10803
putop (instr_info *ins, const char *in_template, int sizeflag)
10804
3.28M
{
10805
3.28M
  const char *p;
10806
3.28M
  int alt = 0;
10807
3.28M
  int cond = 1;
10808
3.28M
  unsigned int l = 0, len = 0;
10809
3.28M
  char last[4];
10810
3.28M
  bool evex_printed = false;
10811
10812
  /* We don't want to add any prefix or suffix to (bad), so return early.  */
10813
3.28M
  if (!strncmp (in_template, "(bad)", 5))
10814
479k
    {
10815
479k
      oappend (ins, "(bad)");
10816
479k
      *ins->obufp = 0;
10817
479k
      ins->mnemonicendp = ins->obufp;
10818
479k
      return 0;
10819
479k
    }
10820
10821
16.2M
  for (p = in_template; *p; p++)
10822
13.3M
    {
10823
13.3M
      if (len > l)
10824
229k
  {
10825
229k
    if (l >= sizeof (last) || !ISUPPER (*p))
10826
0
      abort ();
10827
229k
    last[l++] = *p;
10828
229k
    continue;
10829
229k
  }
10830
13.1M
      switch (*p)
10831
13.1M
  {
10832
9.53M
  default:
10833
9.53M
    if (ins->evex_type == evex_from_legacy && !ins->vex.nd
10834
17.0k
        && !(ins->rex2 & 7) && !evex_printed)
10835
920
      {
10836
920
        oappend (ins, "{evex} ");
10837
920
        evex_printed = true;
10838
920
      }
10839
9.53M
    *ins->obufp++ = *p;
10840
9.53M
    break;
10841
229k
  case '%':
10842
229k
    len++;
10843
229k
    break;
10844
134k
  case '!':
10845
134k
    cond = 0;
10846
134k
    break;
10847
342k
  case '{':
10848
342k
    if (ins->intel_syntax)
10849
116k
      {
10850
231k
        while (*++p != '|')
10851
115k
    if (*p == '}' || *p == '\0')
10852
0
      abort ();
10853
116k
        alt = 1;
10854
116k
      }
10855
342k
    break;
10856
342k
  case '|':
10857
247k
    while (*++p != '}')
10858
20.6k
      {
10859
20.6k
        if (*p == '\0')
10860
0
    abort ();
10861
20.6k
      }
10862
226k
    break;
10863
226k
  case '}':
10864
116k
    alt = 0;
10865
116k
    break;
10866
38.3k
  case 'A':
10867
38.3k
    if (ins->intel_syntax)
10868
7.93k
      break;
10869
30.3k
    if ((ins->need_modrm && ins->modrm.mod != 3 && !ins->vex.nd)
10870
9.43k
        || (sizeflag & SUFFIX_ALWAYS))
10871
21.3k
      *ins->obufp++ = 'b';
10872
30.3k
    break;
10873
1.10M
  case 'B':
10874
1.10M
    if (l == 0)
10875
1.09M
      {
10876
1.10M
      case_B:
10877
1.10M
        if (ins->intel_syntax)
10878
194k
    break;
10879
912k
        if (sizeflag & SUFFIX_ALWAYS)
10880
10.6k
    *ins->obufp++ = 'b';
10881
912k
      }
10882
13.7k
    else if (l == 1 && last[0] == 'L')
10883
12.8k
      {
10884
12.8k
        if (ins->address_mode == mode_64bit
10885
9.34k
      && !(ins->prefixes & PREFIX_ADDR))
10886
8.47k
    {
10887
8.47k
      *ins->obufp++ = 'a';
10888
8.47k
      *ins->obufp++ = 'b';
10889
8.47k
      *ins->obufp++ = 's';
10890
8.47k
    }
10891
10892
12.8k
        goto case_B;
10893
12.8k
      }
10894
907
    else if (l && last[0] == 'X')
10895
907
      {
10896
907
        if (!ins->vex.w)
10897
525
    oappend (ins, "bf16");
10898
382
        else
10899
382
    oappend (ins, "{bad}");
10900
907
      }
10901
0
    else
10902
0
      abort ();
10903
913k
    break;
10904
913k
  case 'C':
10905
10.5k
    if (l == 1 && last[0] == 'C')
10906
5.63k
      {
10907
        /* Condition code (taken from the map-0 Jcc entries).  */
10908
5.63k
        for (const char *q = dis386[0x70 | ins->condition_code].name + 1;
10909
8.31k
       ISLOWER(*q); ++q)
10910
8.31k
    *ins->obufp++ = *q;
10911
5.63k
        break;
10912
5.63k
      }
10913
4.92k
    else if (l == 1 && last[0] == 'S')
10914
1.59k
      {
10915
        /* Add scc suffix.  */
10916
1.59k
        oappend (ins, scc_suffix[ins->vex.scc]);
10917
10918
        /* For SCC insns, the ND bit is required to be set to 0.  */
10919
1.59k
        if (ins->vex.nd)
10920
1.23k
    oappend (ins, "(bad)");
10921
10922
        /* These bits have been consumed and should be cleared or restored
10923
     to default values.  */
10924
1.59k
        ins->vex.v = 1;
10925
1.59k
        ins->vex.nf = false;
10926
1.59k
        ins->vex.mask_register_specifier = 0;
10927
1.59k
        break;
10928
1.59k
      }
10929
10930
3.32k
    if (l)
10931
0
      abort ();
10932
3.32k
    if (ins->intel_syntax && !alt)
10933
0
      break;
10934
3.32k
    if ((ins->prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
10935
1.74k
      {
10936
1.74k
        if (sizeflag & DFLAG)
10937
500
    *ins->obufp++ = ins->intel_syntax ? 'd' : 'l';
10938
1.24k
        else
10939
1.24k
    *ins->obufp++ = ins->intel_syntax ? 'w' : 's';
10940
1.74k
        ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
10941
1.74k
      }
10942
3.32k
    break;
10943
16.4k
  case 'D':
10944
16.4k
    if (l == 1)
10945
5.08k
      {
10946
5.08k
        switch (last[0])
10947
5.08k
        {
10948
5.08k
        case 'X':
10949
5.08k
    if (!ins->vex.evex || ins->vex.w)
10950
4.61k
      *ins->obufp++ = 'd';
10951
471
    else
10952
471
      oappend (ins, "{bad}");
10953
5.08k
    break;
10954
0
        default:
10955
0
    abort ();
10956
5.08k
        }
10957
5.08k
        break;
10958
5.08k
      }
10959
11.3k
    if (l)
10960
0
      abort ();
10961
11.3k
    if (ins->intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
10962
10.2k
      break;
10963
1.15k
    USED_REX (REX_W);
10964
1.15k
    if (ins->modrm.mod == 3)
10965
686
      {
10966
686
        if (ins->rex & REX_W)
10967
228
    *ins->obufp++ = 'q';
10968
458
        else
10969
458
    {
10970
458
      if (sizeflag & DFLAG)
10971
190
        *ins->obufp++ = ins->intel_syntax ? 'd' : 'l';
10972
268
      else
10973
268
        *ins->obufp++ = 'w';
10974
458
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
10975
458
    }
10976
686
      }
10977
464
    else
10978
464
      *ins->obufp++ = 'w';
10979
1.15k
    break;
10980
43.0k
  case 'E':
10981
43.0k
    if (l == 1)
10982
35.5k
      {
10983
35.5k
        switch (last[0])
10984
35.5k
    {
10985
613
    case 'M':
10986
613
      if (ins->modrm.mod != 3)
10987
318
        break;
10988
    /* Fall through.  */
10989
33.6k
    case 'X':
10990
33.6k
      if (!ins->vex.evex || ins->vex.b || ins->vex.ll >= 2
10991
12.4k
          || (ins->rex2 & 7)
10992
6.57k
          || (ins->modrm.mod == 3 && (ins->rex & REX_X))
10993
5.96k
          || !ins->vex.v || ins->vex.mask_register_specifier)
10994
29.0k
        break;
10995
      /* AVX512 extends a number of V*D insns to also have V*Q variants,
10996
         merely distinguished by EVEX.W.  Look for a use of the
10997
         respective macro.  */
10998
4.61k
      if (ins->vex.w)
10999
1.79k
        {
11000
1.79k
          const char *pct = strchr (p + 1, '%');
11001
11002
1.79k
          if (pct != NULL && pct[1] == 'D' && pct[2] == 'Q')
11003
512
      break;
11004
1.79k
        }
11005
4.10k
      *ins->obufp++ = '{';
11006
4.10k
      *ins->obufp++ = 'e';
11007
4.10k
      *ins->obufp++ = 'v';
11008
4.10k
      *ins->obufp++ = 'e';
11009
4.10k
      *ins->obufp++ = 'x';
11010
4.10k
      *ins->obufp++ = '}';
11011
4.10k
      *ins->obufp++ = ' ';
11012
4.10k
      break;
11013
1.59k
    case 'N':
11014
      /* Skip printing {evex} for some special instructions in MAP4.  */
11015
1.59k
      evex_printed = true;
11016
1.59k
      break;
11017
0
    default:
11018
0
      abort ();
11019
35.5k
    }
11020
35.5k
    break;
11021
35.5k
      }
11022
    /* For jcxz/jecxz */
11023
7.43k
    if (ins->address_mode == mode_64bit)
11024
6.09k
      {
11025
6.09k
        if (sizeflag & AFLAG)
11026
5.68k
    *ins->obufp++ = 'r';
11027
413
        else
11028
413
    *ins->obufp++ = 'e';
11029
6.09k
      }
11030
1.34k
    else
11031
1.34k
      if (sizeflag & AFLAG)
11032
783
        *ins->obufp++ = 'e';
11033
7.43k
    ins->used_prefixes |= (ins->prefixes & PREFIX_ADDR);
11034
7.43k
    break;
11035
60.8k
  case 'F':
11036
60.8k
    if (l == 0)
11037
19.5k
      {
11038
19.5k
        if (ins->intel_syntax)
11039
3.88k
    break;
11040
15.6k
        if ((ins->prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
11041
1.02k
    {
11042
1.02k
      if (sizeflag & AFLAG)
11043
514
        *ins->obufp++ = ins->address_mode == mode_64bit ? 'q' : 'l';
11044
511
      else
11045
511
        *ins->obufp++ = ins->address_mode == mode_64bit ? 'l' : 'w';
11046
1.02k
      ins->used_prefixes |= (ins->prefixes & PREFIX_ADDR);
11047
1.02k
    }
11048
15.6k
      }
11049
41.2k
    else if (l == 1 && last[0] == 'C')
11050
2.51k
      {
11051
2.51k
        if (ins->vex.nd && !ins->vex.nf)
11052
1.35k
    break;
11053
1.15k
        *ins->obufp++ = 'c';
11054
1.15k
        *ins->obufp++ = 'f';
11055
        /* Skip printing {evex} */
11056
1.15k
        evex_printed = true;
11057
1.15k
      }
11058
38.7k
    else if (l == 1 && last[0] == 'N')
11059
37.1k
      {
11060
37.1k
        if (ins->vex.nf)
11061
2.79k
    {
11062
2.79k
      oappend (ins, "{nf} ");
11063
      /* This bit needs to be cleared after it is consumed.  */
11064
2.79k
      ins->vex.nf = false;
11065
2.79k
      evex_printed = true;
11066
2.79k
    }
11067
34.3k
        else if (ins->evex_type == evex_from_vex && !(ins->rex2 & 7)
11068
580
           && ins->vex.v)
11069
247
    {
11070
247
      oappend (ins, "{evex} ");
11071
247
      evex_printed = true;
11072
247
    }
11073
37.1k
      }
11074
1.59k
    else if (l == 1 && last[0] == 'D')
11075
1.59k
      {
11076
        /* Get oszc flags value from register_specifier.  */
11077
1.59k
        int oszc_value = ~ins->vex.register_specifier & 0xf;
11078
11079
        /* Add {dfv=of, sf, zf, cf} flags.  */
11080
1.59k
        oappend (ins, oszc_flags[oszc_value]);
11081
11082
        /* These bits have been consumed and should be cleared.  */
11083
1.59k
        ins->vex.register_specifier = 0;
11084
1.59k
      }
11085
0
    else
11086
0
      abort ();
11087
55.5k
    break;
11088
55.5k
  case 'G':
11089
39.0k
    if (ins->intel_syntax || (ins->obufp[-1] != 's'
11090
16.3k
            && !(sizeflag & SUFFIX_ALWAYS)))
11091
21.4k
      break;
11092
17.5k
    if ((ins->rex & REX_W) || (sizeflag & DFLAG))
11093
16.3k
      *ins->obufp++ = 'l';
11094
1.22k
    else
11095
1.22k
      *ins->obufp++ = 'w';
11096
17.5k
    if (!(ins->rex & REX_W))
11097
17.0k
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11098
17.5k
    break;
11099
196k
  case 'H':
11100
196k
    if (l == 0)
11101
184k
      {
11102
184k
        if (ins->intel_syntax)
11103
36.6k
          break;
11104
147k
        if ((ins->prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
11105
141k
      || (ins->prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
11106
6.78k
    {
11107
6.78k
      ins->used_prefixes |= ins->prefixes & (PREFIX_CS | PREFIX_DS);
11108
6.78k
      *ins->obufp++ = ',';
11109
6.78k
      *ins->obufp++ = 'p';
11110
11111
      /* Set active_seg_prefix even if not set in 64-bit mode
11112
         because here it is a valid branch hint. */
11113
6.78k
      if (ins->prefixes & PREFIX_DS)
11114
1.30k
        {
11115
1.30k
          ins->active_seg_prefix = PREFIX_DS;
11116
1.30k
          *ins->obufp++ = 't';
11117
1.30k
        }
11118
5.47k
      else
11119
5.47k
        {
11120
5.47k
          ins->active_seg_prefix = PREFIX_CS;
11121
5.47k
          *ins->obufp++ = 'n';
11122
5.47k
        }
11123
6.78k
    }
11124
147k
      }
11125
12.7k
    else if (l == 1 && last[0] == 'X')
11126
12.7k
      {
11127
12.7k
        if (!ins->vex.w)
11128
6.35k
    *ins->obufp++ = 'h';
11129
6.43k
        else
11130
6.43k
    oappend (ins, "{bad}");
11131
12.7k
      }
11132
0
    else
11133
0
      abort ();
11134
160k
    break;
11135
160k
  case 'K':
11136
1.50k
    USED_REX (REX_W);
11137
1.50k
    if (ins->rex & REX_W)
11138
697
      *ins->obufp++ = 'q';
11139
808
    else
11140
808
      *ins->obufp++ = 'd';
11141
1.50k
    break;
11142
927
  case 'L':
11143
927
    if (ins->intel_syntax)
11144
265
      break;
11145
662
    if (sizeflag & SUFFIX_ALWAYS)
11146
444
      {
11147
444
        if (ins->rex & REX_W)
11148
190
    *ins->obufp++ = 'q';
11149
254
        else
11150
254
    *ins->obufp++ = 'l';
11151
444
      }
11152
662
    break;
11153
1.13k
  case 'M':
11154
1.13k
    if (ins->intel_mnemonic != cond)
11155
775
      *ins->obufp++ = 'r';
11156
1.13k
    break;
11157
1.83k
  case 'N':
11158
1.83k
    if ((ins->prefixes & PREFIX_FWAIT) == 0)
11159
1.37k
      *ins->obufp++ = 'n';
11160
461
    else
11161
461
      ins->used_prefixes |= PREFIX_FWAIT;
11162
1.83k
    break;
11163
19.0k
  case 'O':
11164
19.0k
    USED_REX (REX_W);
11165
19.0k
    if (ins->rex & REX_W)
11166
1.11k
      *ins->obufp++ = 'o';
11167
17.9k
    else if (ins->intel_syntax && (sizeflag & DFLAG))
11168
3.47k
      *ins->obufp++ = 'q';
11169
14.4k
    else
11170
14.4k
      *ins->obufp++ = 'd';
11171
19.0k
    if (!(ins->rex & REX_W))
11172
17.9k
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11173
19.0k
    break;
11174
50.3k
  case '@':
11175
50.3k
    if (ins->address_mode == mode_64bit
11176
47.6k
        && (ins->isa64 == intel64 || (ins->rex & REX_W)
11177
45.2k
      || !(ins->prefixes & PREFIX_DATA)))
11178
46.2k
      {
11179
46.2k
        if (sizeflag & SUFFIX_ALWAYS)
11180
756
    *ins->obufp++ = 'q';
11181
46.2k
        break;
11182
46.2k
      }
11183
    /* Fall through.  */
11184
237k
  case 'P':
11185
237k
    if (l == 0)
11186
212k
      {
11187
212k
        if (!cond && ins->last_rex2_prefix >= 0 && (ins->rex & REX_W))
11188
486
    {
11189
      /* For pushp and popp, p is printed and do not print {rex2}
11190
         for them.  */
11191
486
      *ins->obufp++ = 'p';
11192
486
      ins->rex2 |= REX2_SPECIAL;
11193
486
      break;
11194
486
    }
11195
11196
        /* For "!P" print nothing else in Intel syntax.  */
11197
211k
        if (!cond && ins->intel_syntax)
11198
25.9k
    break;
11199
11200
185k
        if ((ins->modrm.mod == 3 || !cond)
11201
112k
      && !(sizeflag & SUFFIX_ALWAYS))
11202
110k
    break;
11203
    /* Fall through.  */
11204
76.1k
  case 'T':
11205
76.1k
        if ((!(ins->rex & REX_W) && (ins->prefixes & PREFIX_DATA))
11206
73.0k
      || ((sizeflag & SUFFIX_ALWAYS)
11207
3.45k
          && ins->address_mode != mode_64bit))
11208
3.86k
    {
11209
3.86k
      *ins->obufp++ = (sizeflag & DFLAG)
11210
3.86k
          ? ins->intel_syntax ? 'd' : 'l' : 'w';
11211
3.86k
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11212
3.86k
    }
11213
72.2k
        else if (sizeflag & SUFFIX_ALWAYS)
11214
2.64k
    *ins->obufp++ = 'q';
11215
76.1k
      }
11216
25.2k
    else if (l == 1 && last[0] == 'L')
11217
25.2k
      {
11218
25.2k
        if ((ins->prefixes & PREFIX_DATA)
11219
24.8k
      || (ins->rex & REX_W)
11220
23.5k
      || (sizeflag & SUFFIX_ALWAYS))
11221
2.34k
    {
11222
2.34k
      USED_REX (REX_W);
11223
2.34k
      if (ins->rex & REX_W)
11224
1.24k
        *ins->obufp++ = 'q';
11225
1.10k
      else
11226
1.10k
        {
11227
1.10k
          if (sizeflag & DFLAG)
11228
579
      *ins->obufp++ = ins->intel_syntax ? 'd' : 'l';
11229
529
          else
11230
529
      *ins->obufp++ = 'w';
11231
1.10k
          ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11232
1.10k
        }
11233
2.34k
    }
11234
25.2k
      }
11235
0
    else
11236
0
      abort ();
11237
101k
    break;
11238
103k
  case 'Q':
11239
103k
    if (l == 0)
11240
91.1k
      {
11241
91.1k
        if (ins->intel_syntax && !alt)
11242
25.7k
    break;
11243
65.3k
        USED_REX (REX_W);
11244
65.3k
        if ((ins->need_modrm && ins->modrm.mod != 3 && !ins->vex.nd)
11245
27.0k
      || (sizeflag & SUFFIX_ALWAYS))
11246
38.7k
    {
11247
38.7k
      if (ins->rex & REX_W)
11248
1.76k
        *ins->obufp++ = 'q';
11249
36.9k
      else
11250
36.9k
        {
11251
36.9k
          if (sizeflag & DFLAG)
11252
31.4k
      *ins->obufp++ = ins->intel_syntax ? 'd' : 'l';
11253
5.48k
          else
11254
5.48k
      *ins->obufp++ = 'w';
11255
36.9k
          ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11256
36.9k
        }
11257
38.7k
    }
11258
65.3k
      }
11259
12.6k
    else if (l == 1 && last[0] == 'D')
11260
8.26k
      *ins->obufp++ = ins->vex.w ? 'q' : 'd';
11261
4.38k
    else if (l == 1 && last[0] == 'L')
11262
4.38k
      {
11263
4.38k
        if (cond ? ins->modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)
11264
4.38k
           : ins->address_mode != mode_64bit)
11265
1.37k
    break;
11266
3.01k
        if ((ins->rex & REX_W))
11267
995
    {
11268
995
      USED_REX (REX_W);
11269
995
      *ins->obufp++ = 'q';
11270
995
    }
11271
2.01k
        else if ((ins->address_mode == mode_64bit && cond)
11272
1.12k
          || (sizeflag & SUFFIX_ALWAYS))
11273
1.07k
    *ins->obufp++ = ins->intel_syntax? 'd' : 'l';
11274
3.01k
      }
11275
0
    else
11276
0
      abort ();
11277
76.6k
    break;
11278
76.6k
  case 'R':
11279
59.3k
    USED_REX (REX_W);
11280
59.3k
    if (ins->rex & REX_W)
11281
3.84k
      *ins->obufp++ = 'q';
11282
55.5k
    else if (sizeflag & DFLAG)
11283
50.1k
      {
11284
50.1k
        if (ins->intel_syntax)
11285
8.99k
      *ins->obufp++ = 'd';
11286
41.1k
        else
11287
41.1k
      *ins->obufp++ = 'l';
11288
50.1k
      }
11289
5.34k
    else
11290
5.34k
      *ins->obufp++ = 'w';
11291
59.3k
    if (ins->intel_syntax && !p[1]
11292
7.57k
        && ((ins->rex & REX_W) || (sizeflag & DFLAG)))
11293
6.66k
      *ins->obufp++ = 'e';
11294
59.3k
    if (!(ins->rex & REX_W))
11295
55.5k
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11296
59.3k
    break;
11297
471k
  case 'S':
11298
471k
    if (l == 0)
11299
455k
      {
11300
503k
      case_S:
11301
503k
        if (ins->intel_syntax)
11302
105k
    break;
11303
398k
        if (sizeflag & SUFFIX_ALWAYS)
11304
3.80k
    {
11305
3.80k
      if (ins->rex & REX_W)
11306
688
        *ins->obufp++ = 'q';
11307
3.11k
      else
11308
3.11k
        {
11309
3.11k
          if (sizeflag & DFLAG)
11310
2.48k
      *ins->obufp++ = 'l';
11311
628
          else
11312
628
      *ins->obufp++ = 'w';
11313
3.11k
          ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11314
3.11k
        }
11315
3.80k
    }
11316
398k
        break;
11317
503k
      }
11318
15.8k
    if (l != 1)
11319
0
      abort ();
11320
15.8k
    switch (last[0])
11321
15.8k
      {
11322
10.9k
      case 'L':
11323
10.9k
        if (ins->address_mode == mode_64bit
11324
7.00k
      && !(ins->prefixes & PREFIX_ADDR))
11325
6.39k
    {
11326
6.39k
      *ins->obufp++ = 'a';
11327
6.39k
      *ins->obufp++ = 'b';
11328
6.39k
      *ins->obufp++ = 's';
11329
6.39k
    }
11330
11331
10.9k
        goto case_S;
11332
4.84k
      case 'X':
11333
4.84k
        if (!ins->vex.evex || !ins->vex.w)
11334
4.06k
    *ins->obufp++ = 's';
11335
782
        else
11336
782
    oappend (ins, "{bad}");
11337
4.84k
        break;
11338
0
      default:
11339
0
        abort ();
11340
15.8k
      }
11341
4.84k
    break;
11342
4.84k
  case 'U':
11343
3.58k
    if (l == 1 && (last[0] == 'Z'))
11344
3.58k
      {
11345
        /* Although IMUL/SETcc does not support NDD, the EVEX.ND bit is
11346
     used to control whether its destination register has its upper
11347
     bits zeroed.  */
11348
3.58k
        if (ins->vex.nd)
11349
2.16k
    oappend (ins, "zu");
11350
3.58k
      }
11351
0
    else
11352
0
      abort ();
11353
3.58k
    break;
11354
52.7k
  case 'V':
11355
52.7k
    if (l == 0)
11356
14.4k
      {
11357
14.4k
        if (ins->need_vex)
11358
6.73k
    *ins->obufp++ = 'v';
11359
14.4k
      }
11360
38.2k
    else if (l == 1)
11361
38.2k
      {
11362
38.2k
        switch (last[0])
11363
38.2k
    {
11364
1.44k
    case 'X':
11365
1.44k
      if (ins->vex.evex)
11366
787
        break;
11367
659
      *ins->obufp++ = '{';
11368
659
      *ins->obufp++ = 'v';
11369
659
      *ins->obufp++ = 'e';
11370
659
      *ins->obufp++ = 'x';
11371
659
      *ins->obufp++ = '}';
11372
659
      *ins->obufp++ = ' ';
11373
659
      break;
11374
36.8k
    case 'L':
11375
36.8k
      if (ins->rex & REX_W)
11376
1.27k
        {
11377
1.27k
          *ins->obufp++ = 'a';
11378
1.27k
          *ins->obufp++ = 'b';
11379
1.27k
          *ins->obufp++ = 's';
11380
1.27k
        }
11381
36.8k
      goto case_S;
11382
0
    default:
11383
0
      abort ();
11384
38.2k
    }
11385
38.2k
      }
11386
0
    else
11387
0
      abort ();
11388
15.9k
    break;
11389
27.1k
  case 'W':
11390
27.1k
    if (l == 0)
11391
15.9k
      {
11392
        /* operand size flag for cwtl, cbtw */
11393
15.9k
        USED_REX (REX_W);
11394
15.9k
        if (ins->rex & REX_W)
11395
2.58k
    {
11396
2.58k
      if (ins->intel_syntax)
11397
1.13k
        *ins->obufp++ = 'd';
11398
1.44k
      else
11399
1.44k
        *ins->obufp++ = 'l';
11400
2.58k
    }
11401
13.3k
        else if (sizeflag & DFLAG)
11402
11.8k
    *ins->obufp++ = 'w';
11403
1.50k
        else
11404
1.50k
    *ins->obufp++ = 'b';
11405
15.9k
        if (!(ins->rex & REX_W))
11406
13.3k
    ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11407
15.9k
      }
11408
11.1k
    else if (l == 1)
11409
11.1k
      {
11410
11.1k
        if (!ins->need_vex)
11411
0
    abort ();
11412
11.1k
        if (last[0] == 'X')
11413
7.45k
    *ins->obufp++ = ins->vex.w ? 'd': 's';
11414
3.71k
        else if (last[0] == 'B')
11415
3.71k
    *ins->obufp++ = ins->vex.w ? 'w': 'b';
11416
0
        else
11417
0
    abort ();
11418
11.1k
      }
11419
0
    else
11420
0
      abort ();
11421
27.1k
    break;
11422
27.1k
  case 'X':
11423
8.79k
    if (l != 0)
11424
0
      abort ();
11425
8.79k
    if (ins->need_vex
11426
8.79k
        ? ins->vex.prefix == DATA_PREFIX_OPCODE
11427
8.79k
        : ins->prefixes & PREFIX_DATA)
11428
2.25k
      {
11429
2.25k
        *ins->obufp++ = 'd';
11430
2.25k
        ins->used_prefixes |= PREFIX_DATA;
11431
2.25k
      }
11432
6.54k
    else
11433
6.54k
      *ins->obufp++ = 's';
11434
8.79k
    break;
11435
11.6k
  case 'Y':
11436
11.6k
    if (l == 0)
11437
7.66k
      {
11438
7.66k
        if (ins->vex.mask_register_specifier)
11439
2.90k
    ins->illegal_masking = true;
11440
7.66k
      }
11441
3.95k
    else if (l == 1 && last[0] == 'X')
11442
3.95k
      {
11443
3.95k
        if (!ins->need_vex)
11444
672
    break;
11445
3.28k
        if (ins->intel_syntax
11446
2.31k
      || ((ins->modrm.mod == 3 || ins->vex.b)
11447
1.78k
          && !(sizeflag & SUFFIX_ALWAYS)))
11448
2.05k
    break;
11449
1.23k
        switch (ins->vex.length)
11450
1.23k
    {
11451
230
    case 128:
11452
230
      *ins->obufp++ = 'x';
11453
230
      break;
11454
464
    case 256:
11455
464
      *ins->obufp++ = 'y';
11456
464
      break;
11457
536
    case 512:
11458
536
      if (!ins->vex.evex)
11459
0
    default:
11460
0
        abort ();
11461
1.23k
    }
11462
1.23k
      }
11463
0
    else
11464
0
      abort ();
11465
8.89k
    break;
11466
8.89k
  case 'Z':
11467
7.32k
    if (l == 0)
11468
4.48k
      {
11469
        /* These insns ignore ModR/M.mod: Force it to 3 for OP_E().  */
11470
4.48k
        ins->modrm.mod = 3;
11471
4.48k
        if (!ins->intel_syntax && (sizeflag & SUFFIX_ALWAYS))
11472
224
    *ins->obufp++ = ins->address_mode == mode_64bit ? 'q' : 'l';
11473
4.48k
      }
11474
2.84k
    else if (l == 1 && last[0] == 'X')
11475
2.84k
      {
11476
2.84k
        if (!ins->vex.evex)
11477
0
    abort ();
11478
2.84k
        if (ins->intel_syntax
11479
2.06k
      || ((ins->modrm.mod == 3 || ins->vex.b)
11480
1.41k
          && !(sizeflag & SUFFIX_ALWAYS)))
11481
1.92k
    break;
11482
920
        switch (ins->vex.length)
11483
920
    {
11484
303
    case 128:
11485
303
      *ins->obufp++ = 'x';
11486
303
      break;
11487
260
    case 256:
11488
260
      *ins->obufp++ = 'y';
11489
260
      break;
11490
357
    case 512:
11491
357
      *ins->obufp++ = 'z';
11492
357
      break;
11493
0
    default:
11494
0
      abort ();
11495
920
    }
11496
920
      }
11497
0
    else
11498
0
      abort ();
11499
5.40k
    break;
11500
14.7k
  case '^':
11501
14.7k
    if (ins->intel_syntax)
11502
4.08k
      break;
11503
10.6k
    if (ins->isa64 == intel64 && (ins->rex & REX_W))
11504
190
      {
11505
190
        USED_REX (REX_W);
11506
190
        *ins->obufp++ = 'q';
11507
190
        break;
11508
190
      }
11509
10.4k
    if ((ins->prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
11510
910
      {
11511
910
        if (sizeflag & DFLAG)
11512
540
    *ins->obufp++ = 'l';
11513
370
        else
11514
370
    *ins->obufp++ = 'w';
11515
910
        ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11516
910
      }
11517
10.4k
    break;
11518
13.1M
  }
11519
11520
13.1M
      if (len == l)
11521
12.9M
  len = l = 0;
11522
13.1M
    }
11523
2.80M
  *ins->obufp = 0;
11524
2.80M
  ins->mnemonicendp = ins->obufp;
11525
2.80M
  return 0;
11526
2.80M
}
11527
11528
/* Add a style marker to *INS->obufp that encodes STYLE.  This assumes that
11529
   the buffer pointed to by INS->obufp has space.  A style marker is made
11530
   from the STYLE_MARKER_CHAR followed by STYLE converted to a single hex
11531
   digit, followed by another STYLE_MARKER_CHAR.  This function assumes
11532
   that the number of styles is not greater than 16.  */
11533
11534
static void
11535
oappend_insert_style (instr_info *ins, enum disassembler_style style)
11536
9.90M
{
11537
9.90M
  unsigned num = (unsigned) style;
11538
11539
  /* We currently assume that STYLE can be encoded as a single hex
11540
     character.  If more styles are added then this might start to fail,
11541
     and we'll need to expand this code.  */
11542
9.90M
  if (num > 0xf)
11543
0
    abort ();
11544
11545
9.90M
  *ins->obufp++ = STYLE_MARKER_CHAR;
11546
9.90M
  *ins->obufp++ = (num < 10 ? ('0' + num)
11547
9.90M
       : ((num < 16) ? ('a' + (num - 10)) : '0'));
11548
9.90M
  *ins->obufp++ = STYLE_MARKER_CHAR;
11549
11550
  /* This final null character is not strictly necessary, after inserting a
11551
     style marker we should always be inserting some additional content.
11552
     However, having the buffer null terminated doesn't cost much, and make
11553
     it easier to debug what's going on.  Also, if we do ever forget to add
11554
     any additional content after this style marker, then the buffer will
11555
     still be well formed.  */
11556
9.90M
  *ins->obufp = '\0';
11557
9.90M
}
11558
11559
static void
11560
oappend_with_style (instr_info *ins, const char *s,
11561
        enum disassembler_style style)
11562
6.28M
{
11563
6.28M
  oappend_insert_style (ins, style);
11564
6.28M
  ins->obufp = stpcpy (ins->obufp, s);
11565
6.28M
}
11566
11567
/* Add a single character C to the buffer pointer to by INS->obufp, marking
11568
   the style for the character as STYLE.  */
11569
11570
static void
11571
oappend_char_with_style (instr_info *ins, const char c,
11572
       enum disassembler_style style)
11573
3.62M
{
11574
3.62M
  oappend_insert_style (ins, style);
11575
3.62M
  *ins->obufp++ = c;
11576
3.62M
  *ins->obufp = '\0';
11577
3.62M
}
11578
11579
/* Like oappend_char_with_style, but always uses dis_style_text.  */
11580
11581
static void
11582
oappend_char (instr_info *ins, const char c)
11583
3.17M
{
11584
3.17M
  oappend_char_with_style (ins, c, dis_style_text);
11585
3.17M
}
11586
11587
static void
11588
append_seg (instr_info *ins)
11589
1.48M
{
11590
  /* Only print the active segment register.  */
11591
1.48M
  if (!ins->active_seg_prefix)
11592
1.44M
    return;
11593
11594
45.2k
  ins->used_prefixes |= ins->active_seg_prefix;
11595
45.2k
  switch (ins->active_seg_prefix)
11596
45.2k
    {
11597
2.03k
    case PREFIX_CS:
11598
2.03k
      oappend_register (ins, att_names_seg[1]);
11599
2.03k
      break;
11600
17.4k
    case PREFIX_DS:
11601
17.4k
      oappend_register (ins, att_names_seg[3]);
11602
17.4k
      break;
11603
1.24k
    case PREFIX_SS:
11604
1.24k
      oappend_register (ins, att_names_seg[2]);
11605
1.24k
      break;
11606
1.58k
    case PREFIX_ES:
11607
1.58k
      oappend_register (ins, att_names_seg[0]);
11608
1.58k
      break;
11609
9.44k
    case PREFIX_FS:
11610
9.44k
      oappend_register (ins, att_names_seg[4]);
11611
9.44k
      break;
11612
13.5k
    case PREFIX_GS:
11613
13.5k
      oappend_register (ins, att_names_seg[5]);
11614
13.5k
      break;
11615
0
    default:
11616
0
      break;
11617
45.2k
    }
11618
45.2k
  oappend_char (ins, ':');
11619
45.2k
}
11620
11621
static void
11622
print_operand_value (instr_info *ins, bfd_vma disp,
11623
         enum disassembler_style style)
11624
609k
{
11625
609k
  char tmp[30];
11626
11627
609k
  if (ins->address_mode != mode_64bit)
11628
134k
    disp &= 0xffffffff;
11629
609k
  sprintf (tmp, "0x%" PRIx64, (uint64_t) disp);
11630
609k
  oappend_with_style (ins, tmp, style);
11631
609k
}
11632
11633
/* Like oappend, but called for immediate operands.  */
11634
11635
static void
11636
oappend_immediate (instr_info *ins, bfd_vma imm)
11637
361k
{
11638
361k
  if (!ins->intel_syntax)
11639
275k
    oappend_char_with_style (ins, '$', dis_style_immediate);
11640
361k
  print_operand_value (ins, imm, dis_style_immediate);
11641
361k
}
11642
11643
/* Put DISP in BUF as signed hex number.  */
11644
11645
static void
11646
print_displacement (instr_info *ins, bfd_signed_vma val)
11647
339k
{
11648
339k
  char tmp[30];
11649
11650
339k
  if (val < 0)
11651
91.7k
    {
11652
91.7k
      oappend_char_with_style (ins, '-', dis_style_address_offset);
11653
91.7k
      val = (bfd_vma) 0 - val;
11654
11655
      /* Check for possible overflow.  */
11656
91.7k
      if (val < 0)
11657
0
  {
11658
0
    switch (ins->address_mode)
11659
0
      {
11660
0
      case mode_64bit:
11661
0
        oappend_with_style (ins, "0x8000000000000000",
11662
0
          dis_style_address_offset);
11663
0
        break;
11664
0
      case mode_32bit:
11665
0
        oappend_with_style (ins, "0x80000000",
11666
0
          dis_style_address_offset);
11667
0
        break;
11668
0
      case mode_16bit:
11669
0
        oappend_with_style (ins, "0x8000",
11670
0
          dis_style_address_offset);
11671
0
        break;
11672
0
      }
11673
0
    return;
11674
0
  }
11675
91.7k
    }
11676
11677
339k
  sprintf (tmp, "0x%" PRIx64, (int64_t) val);
11678
339k
  oappend_with_style (ins, tmp, dis_style_address_offset);
11679
339k
}
11680
11681
static void
11682
intel_operand_size (instr_info *ins, int bytemode, int sizeflag)
11683
375k
{
11684
  /* Check if there is a broadcast, when evex.b is not treated as evex.nd.  */
11685
375k
  if (ins->vex.b && ins->evex_type == evex_default)
11686
5.25k
    {
11687
5.25k
      if (!ins->vex.no_broadcast)
11688
4.79k
  switch (bytemode)
11689
4.79k
    {
11690
1.21k
    case x_mode:
11691
1.73k
    case evex_half_bcst_xmmq_mode:
11692
1.73k
      if (ins->vex.w)
11693
815
        oappend (ins, "QWORD BCST ");
11694
915
      else
11695
915
        oappend (ins, "DWORD BCST ");
11696
1.73k
      break;
11697
866
    case xh_mode:
11698
1.12k
    case evex_half_bcst_xmmqh_mode:
11699
1.32k
    case evex_half_bcst_xmmqdh_mode:
11700
1.32k
      oappend (ins, "WORD BCST ");
11701
1.32k
      break;
11702
1.73k
    default:
11703
1.73k
      ins->vex.no_broadcast = true;
11704
1.73k
      break;
11705
4.79k
    }
11706
5.25k
      return;
11707
5.25k
    }
11708
370k
  switch (bytemode)
11709
370k
    {
11710
191k
    case b_mode:
11711
206k
    case b_swap_mode:
11712
206k
    case db_mode:
11713
206k
      oappend (ins, "BYTE PTR ");
11714
206k
      break;
11715
5.38k
    case w_mode:
11716
5.62k
    case w_swap_mode:
11717
6.08k
    case dw_mode:
11718
6.08k
      oappend (ins, "WORD PTR ");
11719
6.08k
      break;
11720
6.40k
    case indir_v_mode:
11721
6.40k
      if (ins->address_mode == mode_64bit && ins->isa64 == intel64)
11722
356
  {
11723
356
    oappend (ins, "QWORD PTR ");
11724
356
    break;
11725
356
  }
11726
      /* Fall through.  */
11727
8.29k
    case stack_v_mode:
11728
8.29k
      if (ins->address_mode == mode_64bit && ((sizeflag & DFLAG)
11729
749
                || (ins->rex & REX_W)))
11730
5.79k
  {
11731
5.79k
    oappend (ins, "QWORD PTR ");
11732
5.79k
    break;
11733
5.79k
  }
11734
      /* Fall through.  */
11735
61.6k
    case v_mode:
11736
79.4k
    case v_swap_mode:
11737
82.1k
    case dq_mode:
11738
82.1k
      USED_REX (REX_W);
11739
82.1k
      if (ins->rex & REX_W)
11740
3.20k
  oappend (ins, "QWORD PTR ");
11741
78.9k
      else if (bytemode == dq_mode)
11742
2.40k
  oappend (ins, "DWORD PTR ");
11743
76.5k
      else
11744
76.5k
  {
11745
76.5k
    if (sizeflag & DFLAG)
11746
68.5k
      oappend (ins, "DWORD PTR ");
11747
8.05k
    else
11748
8.05k
      oappend (ins, "WORD PTR ");
11749
76.5k
    ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11750
76.5k
  }
11751
82.1k
      break;
11752
15.8k
    case z_mode:
11753
15.8k
      if ((ins->rex & REX_W) || (sizeflag & DFLAG))
11754
13.9k
  *ins->obufp++ = 'D';
11755
15.8k
      oappend (ins, "WORD PTR ");
11756
15.8k
      if (!(ins->rex & REX_W))
11757
15.1k
  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11758
15.8k
      break;
11759
4.33k
    case a_mode:
11760
4.33k
      if (sizeflag & DFLAG)
11761
2.38k
  oappend (ins, "QWORD PTR ");
11762
1.95k
      else
11763
1.95k
  oappend (ins, "DWORD PTR ");
11764
4.33k
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11765
4.33k
      break;
11766
1.37k
    case movsxd_mode:
11767
1.37k
      if (!(sizeflag & DFLAG) && ins->isa64 == intel64)
11768
232
  oappend (ins, "WORD PTR ");
11769
1.14k
      else
11770
1.14k
  oappend (ins, "DWORD PTR ");
11771
1.37k
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11772
1.37k
      break;
11773
2.69k
    case d_mode:
11774
3.10k
    case d_swap_mode:
11775
3.10k
      oappend (ins, "DWORD PTR ");
11776
3.10k
      break;
11777
10.2k
    case q_mode:
11778
11.1k
    case q_swap_mode:
11779
11.1k
      oappend (ins, "QWORD PTR ");
11780
11.1k
      break;
11781
555
    case m_mode:
11782
555
      if (ins->address_mode == mode_64bit)
11783
295
  oappend (ins, "QWORD PTR ");
11784
260
      else
11785
260
  oappend (ins, "DWORD PTR ");
11786
555
      break;
11787
4.38k
    case f_mode:
11788
4.38k
      if (sizeflag & DFLAG)
11789
3.03k
  oappend (ins, "FWORD PTR ");
11790
1.35k
      else
11791
1.35k
  oappend (ins, "DWORD PTR ");
11792
4.38k
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11793
4.38k
      break;
11794
554
    case t_mode:
11795
554
      oappend (ins, "TBYTE PTR ");
11796
554
      break;
11797
8.68k
    case x_mode:
11798
9.38k
    case xh_mode:
11799
10.5k
    case x_swap_mode:
11800
10.9k
    case evex_x_gscat_mode:
11801
11.2k
    case evex_x_nobcst_mode:
11802
11.6k
    case bw_unit_mode:
11803
11.6k
      if (ins->need_vex)
11804
7.79k
  {
11805
7.79k
    switch (ins->vex.length)
11806
7.79k
      {
11807
3.50k
      case 128:
11808
3.50k
        oappend (ins, "XMMWORD PTR ");
11809
3.50k
        break;
11810
2.74k
      case 256:
11811
2.74k
        oappend (ins, "YMMWORD PTR ");
11812
2.74k
        break;
11813
1.54k
      case 512:
11814
1.54k
        oappend (ins, "ZMMWORD PTR ");
11815
1.54k
        break;
11816
0
      default:
11817
0
        abort ();
11818
7.79k
      }
11819
7.79k
  }
11820
3.82k
      else
11821
3.82k
  oappend (ins, "XMMWORD PTR ");
11822
11.6k
      break;
11823
11.6k
    case xmm_mode:
11824
422
      oappend (ins, "XMMWORD PTR ");
11825
422
      break;
11826
232
    case ymm_mode:
11827
232
      oappend (ins, "YMMWORD PTR ");
11828
232
      break;
11829
626
    case xmmq_mode:
11830
1.12k
    case evex_half_bcst_xmmqh_mode:
11831
1.75k
    case evex_half_bcst_xmmq_mode:
11832
1.75k
      switch (ins->vex.length)
11833
1.75k
  {
11834
411
  case 0:
11835
751
  case 128:
11836
751
    oappend (ins, "QWORD PTR ");
11837
751
    break;
11838
518
  case 256:
11839
518
    oappend (ins, "XMMWORD PTR ");
11840
518
    break;
11841
489
  case 512:
11842
489
    oappend (ins, "YMMWORD PTR ");
11843
489
    break;
11844
0
  default:
11845
0
    abort ();
11846
1.75k
  }
11847
1.75k
      break;
11848
1.75k
    case xmmdw_mode:
11849
1.06k
      if (!ins->need_vex)
11850
0
  abort ();
11851
11852
1.06k
      switch (ins->vex.length)
11853
1.06k
  {
11854
424
  case 128:
11855
424
    oappend (ins, "WORD PTR ");
11856
424
    break;
11857
325
  case 256:
11858
325
    oappend (ins, "DWORD PTR ");
11859
325
    break;
11860
317
  case 512:
11861
317
    oappend (ins, "QWORD PTR ");
11862
317
    break;
11863
0
  default:
11864
0
    abort ();
11865
1.06k
  }
11866
1.06k
      break;
11867
1.06k
    case xmmqd_mode:
11868
1.03k
    case evex_half_bcst_xmmqdh_mode:
11869
1.03k
      if (!ins->need_vex)
11870
0
  abort ();
11871
11872
1.03k
      switch (ins->vex.length)
11873
1.03k
  {
11874
298
  case 128:
11875
298
    oappend (ins, "DWORD PTR ");
11876
298
    break;
11877
365
  case 256:
11878
365
    oappend (ins, "QWORD PTR ");
11879
365
    break;
11880
367
  case 512:
11881
367
    oappend (ins, "XMMWORD PTR ");
11882
367
    break;
11883
0
  default:
11884
0
    abort ();
11885
1.03k
  }
11886
1.03k
      break;
11887
1.03k
    case ymmq_mode:
11888
968
      if (!ins->need_vex)
11889
0
  abort ();
11890
11891
968
      switch (ins->vex.length)
11892
968
  {
11893
400
  case 128:
11894
400
    oappend (ins, "QWORD PTR ");
11895
400
    break;
11896
299
  case 256:
11897
299
    oappend (ins, "YMMWORD PTR ");
11898
299
    break;
11899
269
  case 512:
11900
269
    oappend (ins, "ZMMWORD PTR ");
11901
269
    break;
11902
0
  default:
11903
0
    abort ();
11904
968
  }
11905
968
      break;
11906
968
    case o_mode:
11907
293
      oappend (ins, "OWORD PTR ");
11908
293
      break;
11909
1.40k
    case vex_vsib_d_w_dq_mode:
11910
2.52k
    case vex_vsib_q_w_dq_mode:
11911
2.52k
      if (!ins->need_vex)
11912
0
  abort ();
11913
2.52k
      if (ins->vex.w)
11914
1.29k
  oappend (ins, "QWORD PTR ");
11915
1.22k
      else
11916
1.22k
  oappend (ins, "DWORD PTR ");
11917
2.52k
      break;
11918
1.12k
    case mask_bd_mode:
11919
1.12k
      if (!ins->need_vex || ins->vex.length != 128)
11920
0
  abort ();
11921
1.12k
      if (ins->vex.w)
11922
678
  oappend (ins, "DWORD PTR ");
11923
449
      else
11924
449
  oappend (ins, "BYTE PTR ");
11925
1.12k
      break;
11926
880
    case mask_mode:
11927
880
      if (!ins->need_vex)
11928
0
  abort ();
11929
880
      if (ins->vex.w)
11930
205
  oappend (ins, "QWORD PTR ");
11931
675
      else
11932
675
  oappend (ins, "WORD PTR ");
11933
880
      break;
11934
778
    case v_bnd_mode:
11935
1.68k
    case v_bndmk_mode:
11936
6.31k
    default:
11937
6.31k
      break;
11938
370k
    }
11939
370k
}
11940
11941
static void
11942
print_register (instr_info *ins, unsigned int reg, unsigned int rexmask,
11943
    int bytemode, int sizeflag)
11944
1.48M
{
11945
1.48M
  const char (*names)[8];
11946
11947
  /* Masking is invalid for insns with GPR destination. Set the flag uniformly,
11948
     as the consumer will inspect it only for the destination operand.  */
11949
1.48M
  if (bytemode != mask_mode && ins->vex.mask_register_specifier)
11950
6.95k
    ins->illegal_masking = true;
11951
11952
1.48M
  USED_REX (rexmask);
11953
1.48M
  if (ins->rex & rexmask)
11954
47.0k
    reg += 8;
11955
1.48M
  if (ins->rex2 & rexmask)
11956
14.9k
    reg += 16;
11957
11958
1.48M
  switch (bytemode)
11959
1.48M
    {
11960
1.01M
    case b_mode:
11961
1.02M
    case b_swap_mode:
11962
1.02M
      if (reg & 4)
11963
219k
  USED_REX (0);
11964
1.02M
      if (ins->rex || ins->rex2)
11965
22.3k
  names = att_names8rex;
11966
1.00M
      else
11967
1.00M
  names = att_names8;
11968
1.02M
      break;
11969
519
    case w_mode:
11970
519
      names = att_names16;
11971
519
      break;
11972
7.85k
    case d_mode:
11973
8.52k
    case dw_mode:
11974
9.20k
    case db_mode:
11975
9.20k
      names = att_names32;
11976
9.20k
      break;
11977
2.51k
    case q_mode:
11978
2.51k
      names = att_names64;
11979
2.51k
      break;
11980
5.10k
    case m_mode:
11981
5.30k
    case v_bnd_mode:
11982
5.30k
      names = ins->address_mode == mode_64bit ? att_names64 : att_names32;
11983
5.30k
      break;
11984
5.87k
    case bnd_mode:
11985
6.15k
    case bnd_swap_mode:
11986
6.15k
      if (reg > 0x3)
11987
2.49k
  {
11988
2.49k
    oappend (ins, "(bad)");
11989
2.49k
    return;
11990
2.49k
  }
11991
3.66k
      names = att_names_bnd;
11992
3.66k
      break;
11993
10.2k
    case indir_v_mode:
11994
10.2k
      if (ins->address_mode == mode_64bit && ins->isa64 == intel64)
11995
190
  {
11996
190
    names = att_names64;
11997
190
    break;
11998
190
  }
11999
      /* Fall through.  */
12000
20.4k
    case stack_v_mode:
12001
20.4k
      if (ins->address_mode == mode_64bit && ((sizeflag & DFLAG)
12002
4.25k
                || (ins->rex & REX_W)))
12003
12.0k
  {
12004
12.0k
    names = att_names64;
12005
12.0k
    break;
12006
12.0k
  }
12007
8.36k
      bytemode = v_mode;
12008
      /* Fall through.  */
12009
385k
    case v_mode:
12010
395k
    case v_swap_mode:
12011
404k
    case dq_mode:
12012
404k
      USED_REX (REX_W);
12013
404k
      if (ins->rex & REX_W)
12014
59.3k
  names = att_names64;
12015
345k
      else if (bytemode != v_mode && bytemode != v_swap_mode)
12016
7.82k
  names = att_names32;
12017
337k
      else
12018
337k
  {
12019
337k
    if (sizeflag & DFLAG)
12020
299k
      names = att_names32;
12021
37.7k
    else
12022
37.7k
      names = att_names16;
12023
337k
    ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12024
337k
  }
12025
404k
      break;
12026
3.78k
    case movsxd_mode:
12027
3.78k
      if (!(sizeflag & DFLAG) && ins->isa64 == intel64)
12028
1.16k
  names = att_names16;
12029
2.62k
      else
12030
2.62k
  names = att_names32;
12031
3.78k
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12032
3.78k
      break;
12033
1.08k
    case va_mode:
12034
1.08k
      names = (ins->address_mode == mode_64bit
12035
1.08k
         ? att_names64 : att_names32);
12036
1.08k
      if (!(ins->prefixes & PREFIX_ADDR))
12037
804
  names = (ins->address_mode == mode_16bit
12038
804
         ? att_names16 : names);
12039
285
      else
12040
285
  {
12041
    /* Remove "addr16/addr32".  */
12042
285
    ins->all_prefixes[ins->last_addr_prefix] = 0;
12043
285
    names = (ins->address_mode != mode_32bit
12044
285
           ? att_names32 : att_names16);
12045
285
    ins->used_prefixes |= PREFIX_ADDR;
12046
285
  }
12047
1.08k
      break;
12048
465
    case mask_bd_mode:
12049
13.7k
    case mask_mode:
12050
13.7k
      if (reg > 0x7)
12051
8.74k
  {
12052
8.74k
    oappend (ins, "(bad)");
12053
8.74k
    return;
12054
8.74k
  }
12055
5.04k
      names = att_names_mask;
12056
5.04k
      break;
12057
300
    case 0:
12058
300
      return;
12059
0
    default:
12060
0
      oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
12061
0
      return;
12062
1.48M
    }
12063
1.47M
  oappend_register (ins, names[reg]);
12064
1.47M
}
12065
12066
static bool
12067
get8s (instr_info *ins, bfd_vma *res)
12068
435k
{
12069
435k
  if (!fetch_code (ins->info, ins->codep + 1))
12070
8.75k
    return false;
12071
426k
  *res = ((bfd_vma) *ins->codep++ ^ 0x80) - 0x80;
12072
426k
  return true;
12073
435k
}
12074
12075
static bool
12076
get16 (instr_info *ins, bfd_vma *res)
12077
41.3k
{
12078
41.3k
  if (!fetch_code (ins->info, ins->codep + 2))
12079
2.86k
    return false;
12080
38.4k
  *res = *ins->codep++;
12081
38.4k
  *res |= (bfd_vma) *ins->codep++ << 8;
12082
38.4k
  return true;
12083
41.3k
}
12084
12085
static bool
12086
get16s (instr_info *ins, bfd_vma *res)
12087
13.5k
{
12088
13.5k
  if (!get16 (ins, res))
12089
975
    return false;
12090
12.6k
  *res = (*res ^ 0x8000) - 0x8000;
12091
12.6k
  return true;
12092
13.5k
}
12093
12094
static bool
12095
get32 (instr_info *ins, bfd_vma *res)
12096
288k
{
12097
288k
  if (!fetch_code (ins->info, ins->codep + 4))
12098
13.7k
    return false;
12099
275k
  *res = *ins->codep++;
12100
275k
  *res |= (bfd_vma) *ins->codep++ << 8;
12101
275k
  *res |= (bfd_vma) *ins->codep++ << 16;
12102
275k
  *res |= (bfd_vma) *ins->codep++ << 24;
12103
275k
  return true;
12104
288k
}
12105
12106
static bool
12107
get32s (instr_info *ins, bfd_vma *res)
12108
177k
{
12109
177k
  if (!get32 (ins, res))
12110
9.30k
    return false;
12111
12112
168k
  *res = (*res ^ ((bfd_vma) 1 << 31)) - ((bfd_vma) 1 << 31);
12113
12114
168k
  return true;
12115
177k
}
12116
12117
static bool
12118
get64 (instr_info *ins, uint64_t *res)
12119
15.5k
{
12120
15.5k
  unsigned int a;
12121
15.5k
  unsigned int b;
12122
12123
15.5k
  if (!fetch_code (ins->info, ins->codep + 8))
12124
1.40k
    return false;
12125
14.1k
  a = *ins->codep++;
12126
14.1k
  a |= (unsigned int) *ins->codep++ << 8;
12127
14.1k
  a |= (unsigned int) *ins->codep++ << 16;
12128
14.1k
  a |= (unsigned int) *ins->codep++ << 24;
12129
14.1k
  b = *ins->codep++;
12130
14.1k
  b |= (unsigned int) *ins->codep++ << 8;
12131
14.1k
  b |= (unsigned int) *ins->codep++ << 16;
12132
14.1k
  b |= (unsigned int) *ins->codep++ << 24;
12133
14.1k
  *res = a + ((uint64_t) b << 32);
12134
14.1k
  return true;
12135
15.5k
}
12136
12137
static void
12138
set_op (instr_info *ins, bfd_vma op, bool riprel)
12139
242k
{
12140
242k
  ins->op_index[ins->op_ad] = ins->op_ad;
12141
242k
  if (ins->address_mode == mode_64bit)
12142
196k
    ins->op_address[ins->op_ad] = op;
12143
46.8k
  else /* Mask to get a 32-bit address.  */
12144
46.8k
    ins->op_address[ins->op_ad] = op & 0xffffffff;
12145
242k
  ins->op_riprel[ins->op_ad] = riprel;
12146
242k
}
12147
12148
static bool
12149
BadOp (instr_info *ins)
12150
26.6k
{
12151
  /* Throw away prefixes and 1st. opcode byte.  */
12152
26.6k
  struct dis_private *priv = ins->info->private_data;
12153
12154
26.6k
  ins->codep = priv->the_buffer + ins->nr_prefixes + ins->need_vex + 1;
12155
26.6k
  ins->obufp = stpcpy (ins->obufp, "(bad)");
12156
26.6k
  return true;
12157
26.6k
}
12158
12159
static bool
12160
OP_Skip_MODRM (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
12161
         int sizeflag ATTRIBUTE_UNUSED)
12162
1.68k
{
12163
1.68k
  if (ins->modrm.mod != 3)
12164
685
    return BadOp (ins);
12165
12166
  /* Skip mod/rm byte.  */
12167
996
  MODRM_CHECK;
12168
996
  ins->codep++;
12169
996
  ins->has_skipped_modrm = true;
12170
996
  return true;
12171
996
}
12172
12173
static bool
12174
OP_E_memory (instr_info *ins, int bytemode, int sizeflag)
12175
1.35M
{
12176
1.35M
  int add = (ins->rex & REX_B) ? 8 : 0;
12177
1.35M
  int riprel = 0;
12178
1.35M
  int shift;
12179
12180
1.35M
  add += (ins->rex2 & REX_B) ? 16 : 0;
12181
12182
  /* Handles EVEX other than APX EVEX-promoted instructions.  */
12183
1.35M
  if (ins->vex.evex && ins->evex_type == evex_default)
12184
39.6k
    {
12185
12186
      /* Zeroing-masking is invalid for memory destinations. Set the flag
12187
   uniformly, as the consumer will inspect it only for the destination
12188
   operand.  */
12189
39.6k
      if (ins->vex.zeroing)
12190
13.5k
  ins->illegal_masking = true;
12191
12192
39.6k
      switch (bytemode)
12193
39.6k
  {
12194
252
  case dw_mode:
12195
1.05k
  case w_mode:
12196
1.31k
  case w_swap_mode:
12197
1.31k
    shift = 1;
12198
1.31k
    break;
12199
376
  case db_mode:
12200
778
  case b_mode:
12201
778
    shift = 0;
12202
778
    break;
12203
1.23k
  case dq_mode:
12204
1.23k
    if (ins->address_mode != mode_64bit)
12205
390
      {
12206
1.68k
  case d_mode:
12207
2.17k
  case d_swap_mode:
12208
2.17k
        shift = 2;
12209
2.17k
        break;
12210
1.68k
      }
12211
      /* fall through */
12212
3.14k
  case vex_vsib_d_w_dq_mode:
12213
5.35k
  case vex_vsib_q_w_dq_mode:
12214
5.90k
  case evex_x_gscat_mode:
12215
5.90k
    shift = ins->vex.w ? 3 : 2;
12216
5.90k
    break;
12217
3.31k
  case xh_mode:
12218
4.62k
  case evex_half_bcst_xmmqh_mode:
12219
5.42k
  case evex_half_bcst_xmmqdh_mode:
12220
5.42k
    if (ins->vex.b)
12221
3.49k
      {
12222
3.49k
        shift = ins->vex.w ? 2 : 1;
12223
3.49k
        break;
12224
3.49k
      }
12225
    /* Fall through.  */
12226
16.3k
  case x_mode:
12227
17.4k
  case evex_half_bcst_xmmq_mode:
12228
17.4k
    if (ins->vex.b)
12229
8.20k
      {
12230
8.20k
        shift = ins->vex.w ? 3 : 2;
12231
8.20k
        break;
12232
8.20k
      }
12233
    /* Fall through.  */
12234
9.84k
  case xmmqd_mode:
12235
10.6k
  case xmmdw_mode:
12236
11.0k
  case xmmq_mode:
12237
12.2k
  case ymmq_mode:
12238
12.6k
  case evex_x_nobcst_mode:
12239
13.3k
  case x_swap_mode:
12240
13.3k
    switch (ins->vex.length)
12241
13.3k
      {
12242
4.98k
      case 128:
12243
4.98k
        shift = 4;
12244
4.98k
        break;
12245
3.86k
      case 256:
12246
3.86k
        shift = 5;
12247
3.86k
        break;
12248
4.50k
      case 512:
12249
4.50k
        shift = 6;
12250
4.50k
        break;
12251
0
      default:
12252
0
        abort ();
12253
13.3k
      }
12254
    /* Make necessary corrections to shift for modes that need it.  */
12255
13.3k
    if (bytemode == xmmq_mode
12256
12.9k
        || bytemode == evex_half_bcst_xmmqh_mode
12257
12.4k
        || bytemode == evex_half_bcst_xmmq_mode
12258
12.1k
        || (bytemode == ymmq_mode && ins->vex.length == 128))
12259
2.06k
      shift -= 1;
12260
11.2k
    else if (bytemode == xmmqd_mode
12261
10.7k
             || bytemode == evex_half_bcst_xmmqdh_mode)
12262
805
      shift -= 2;
12263
10.4k
    else if (bytemode == xmmdw_mode)
12264
794
      shift -= 3;
12265
13.3k
    break;
12266
252
  case ymm_mode:
12267
252
    shift = 5;
12268
252
    break;
12269
561
  case xmm_mode:
12270
561
    shift = 4;
12271
561
    break;
12272
983
  case q_mode:
12273
1.85k
  case q_swap_mode:
12274
1.85k
    shift = 3;
12275
1.85k
    break;
12276
1.79k
  case bw_unit_mode:
12277
1.79k
    shift = ins->vex.w ? 1 : 0;
12278
1.79k
    break;
12279
0
  default:
12280
0
    abort ();
12281
39.6k
  }
12282
39.6k
    }
12283
1.31M
  else
12284
1.31M
    shift = 0;
12285
12286
1.35M
  USED_REX (REX_B);
12287
1.35M
  if (ins->intel_syntax)
12288
283k
    intel_operand_size (ins, bytemode, sizeflag);
12289
1.35M
  append_seg (ins);
12290
12291
1.35M
  if ((sizeflag & AFLAG) || ins->address_mode == mode_64bit)
12292
1.28M
    {
12293
      /* 32/64 bit address mode */
12294
1.28M
      bfd_vma disp = 0;
12295
1.28M
      int havedisp;
12296
1.28M
      int havebase;
12297
1.28M
      int needindex;
12298
1.28M
      int needaddr32;
12299
1.28M
      int base, rbase;
12300
1.28M
      int vindex = 0;
12301
1.28M
      int scale = 0;
12302
1.28M
      int addr32flag = !((sizeflag & AFLAG)
12303
12.1k
       || bytemode == v_bnd_mode
12304
11.4k
       || bytemode == v_bndmk_mode
12305
10.7k
       || bytemode == bnd_mode
12306
10.1k
       || bytemode == bnd_swap_mode);
12307
1.28M
      bool check_gather = false;
12308
1.28M
      const char (*indexes)[8] = NULL;
12309
12310
1.28M
      havebase = 1;
12311
1.28M
      base = ins->modrm.rm;
12312
12313
1.28M
      if (base == 4)
12314
87.3k
  {
12315
87.3k
    vindex = ins->sib.index;
12316
87.3k
    USED_REX (REX_X);
12317
87.3k
    if (ins->rex & REX_X)
12318
3.00k
      vindex += 8;
12319
87.3k
    switch (bytemode)
12320
87.3k
      {
12321
3.08k
      case vex_vsib_d_w_dq_mode:
12322
5.23k
      case vex_vsib_q_w_dq_mode:
12323
5.23k
        if (!ins->need_vex)
12324
0
    abort ();
12325
5.23k
        if (ins->vex.evex)
12326
3.19k
    {
12327
      /* S/G EVEX insns require EVEX.X4 not to be set.  */
12328
3.19k
      if (ins->rex2 & REX_X)
12329
320
        {
12330
320
          oappend (ins, "(bad)");
12331
320
          return true;
12332
320
        }
12333
12334
2.87k
      if (!ins->vex.v)
12335
2.46k
        vindex += 16;
12336
2.87k
      check_gather = ins->obufp == ins->op_out[1];
12337
2.87k
    }
12338
12339
4.91k
        switch (ins->vex.length)
12340
4.91k
    {
12341
1.39k
    case 128:
12342
1.39k
      indexes = att_names_xmm;
12343
1.39k
      break;
12344
2.07k
    case 256:
12345
2.07k
      if (!ins->vex.w
12346
992
          || bytemode == vex_vsib_q_w_dq_mode)
12347
1.35k
        indexes = att_names_ymm;
12348
714
      else
12349
714
        indexes = att_names_xmm;
12350
2.07k
      break;
12351
1.44k
    case 512:
12352
1.44k
      if (!ins->vex.w
12353
749
          || bytemode == vex_vsib_q_w_dq_mode)
12354
1.20k
        indexes = att_names_zmm;
12355
238
      else
12356
238
        indexes = att_names_ymm;
12357
1.44k
      break;
12358
0
    default:
12359
0
      abort ();
12360
4.91k
    }
12361
4.91k
        break;
12362
82.1k
      default:
12363
82.1k
        if (ins->rex2 & REX_X)
12364
2.28k
    vindex += 16;
12365
12366
82.1k
        if (vindex != 4)
12367
67.8k
    indexes = ins->address_mode == mode_64bit && !addr32flag
12368
67.8k
        ? att_names64 : att_names32;
12369
82.1k
        break;
12370
87.3k
      }
12371
87.0k
    scale = ins->sib.scale;
12372
87.0k
    base = ins->sib.base;
12373
87.0k
    ins->codep++;
12374
87.0k
  }
12375
1.19M
      else
12376
1.19M
  {
12377
    /* Check for mandatory SIB.  */
12378
1.19M
    if (bytemode == vex_vsib_d_w_dq_mode
12379
1.19M
        || bytemode == vex_vsib_q_w_dq_mode
12380
1.19M
        || bytemode == vex_sibmem_mode)
12381
2.01k
      {
12382
2.01k
        oappend (ins, "(bad)");
12383
2.01k
        return true;
12384
2.01k
      }
12385
1.19M
  }
12386
1.28M
      rbase = base + add;
12387
12388
1.28M
      switch (ins->modrm.mod)
12389
1.28M
  {
12390
984k
  case 0:
12391
984k
    if (base == 5)
12392
41.4k
      {
12393
41.4k
        havebase = 0;
12394
41.4k
        if (ins->address_mode == mode_64bit && !ins->has_sib)
12395
30.6k
    riprel = 1;
12396
41.4k
        if (!get32s (ins, &disp))
12397
3.32k
    return false;
12398
38.0k
        if (riprel && bytemode == v_bndmk_mode)
12399
213
    {
12400
213
      oappend (ins, "(bad)");
12401
213
      return true;
12402
213
    }
12403
38.0k
      }
12404
980k
    break;
12405
980k
  case 1:
12406
205k
    if (!get8s (ins, &disp))
12407
5.59k
      return false;
12408
199k
    if (ins->vex.evex && shift > 0)
12409
16.9k
      disp <<= shift;
12410
199k
    break;
12411
93.8k
  case 2:
12412
93.8k
    if (!get32s (ins, &disp))
12413
4.20k
      return false;
12414
89.6k
    break;
12415
1.28M
  }
12416
12417
1.26M
      needindex = 0;
12418
1.26M
      needaddr32 = 0;
12419
1.26M
      if (ins->has_sib
12420
85.7k
    && !havebase
12421
5.28k
    && !indexes
12422
2.34k
    && ins->address_mode != mode_16bit)
12423
1.90k
  {
12424
1.90k
    if (ins->address_mode == mode_64bit)
12425
1.60k
      {
12426
1.60k
        if (addr32flag)
12427
581
    {
12428
      /* Without base nor index registers, zero-extend the
12429
         lower 32-bit displacement to 64 bits.  */
12430
581
      disp &= 0xffffffff;
12431
581
      needindex = 1;
12432
581
    }
12433
1.60k
        needaddr32 = 1;
12434
1.60k
      }
12435
301
    else
12436
301
      {
12437
        /* In 32-bit mode, we need index register to tell [offset]
12438
     from [eiz*1 + offset].  */
12439
301
        needindex = 1;
12440
301
      }
12441
1.90k
  }
12442
12443
1.26M
      havedisp = (havebase
12444
37.8k
      || needindex
12445
37.0k
      || (ins->has_sib && (indexes || scale != 0)));
12446
12447
1.26M
      if (!ins->intel_syntax)
12448
1.01M
  if (ins->modrm.mod != 0 || base == 5)
12449
242k
    {
12450
242k
      if (havedisp || riprel)
12451
239k
        print_displacement (ins, disp);
12452
3.72k
      else
12453
3.72k
        print_operand_value (ins, disp, dis_style_address_offset);
12454
242k
      if (riprel)
12455
23.0k
        {
12456
23.0k
    set_op (ins, disp, true);
12457
23.0k
    oappend_char (ins, '(');
12458
23.0k
    oappend_with_style (ins, !addr32flag ? "%rip" : "%eip",
12459
23.0k
            dis_style_register);
12460
23.0k
    oappend_char (ins, ')');
12461
23.0k
        }
12462
242k
    }
12463
12464
1.26M
      if ((havebase || indexes || needindex || needaddr32 || riprel)
12465
1.26M
    && (ins->address_mode != mode_64bit
12466
1.07M
        || ((bytemode != v_bnd_mode)
12467
1.07M
      && (bytemode != v_bndmk_mode)
12468
1.07M
      && (bytemode != bnd_mode)
12469
1.07M
      && (bytemode != bnd_swap_mode))))
12470
1.26M
  ins->used_prefixes |= PREFIX_ADDR;
12471
12472
1.26M
      if (havedisp || (ins->intel_syntax && riprel))
12473
1.24M
  {
12474
1.24M
    oappend_char (ins, ins->open_char);
12475
1.24M
    if (ins->intel_syntax && riprel)
12476
4.78k
      {
12477
4.78k
        set_op (ins, disp, true);
12478
4.78k
        oappend_with_style (ins, !addr32flag ? "rip" : "eip",
12479
4.78k
          dis_style_register);
12480
4.78k
      }
12481
1.24M
    if (havebase)
12482
1.23M
      oappend_register
12483
1.23M
        (ins,
12484
1.23M
         (ins->address_mode == mode_64bit && !addr32flag
12485
1.23M
    ? att_names64 : att_names32)[rbase]);
12486
1.24M
    if (ins->has_sib)
12487
84.7k
      {
12488
        /* ESP/RSP won't allow index.  If base isn't ESP/RSP,
12489
     print index to tell base + index from base.  */
12490
84.7k
        if (scale != 0
12491
46.9k
      || needindex
12492
46.3k
      || indexes
12493
4.99k
      || (havebase && base != ESP_REG_NUM))
12494
81.5k
    {
12495
81.5k
      if (!ins->intel_syntax || havebase)
12496
80.4k
        oappend_char (ins, ins->separator_char);
12497
81.5k
      if (indexes)
12498
71.5k
        {
12499
71.5k
          if (ins->address_mode == mode_64bit || vindex < 16)
12500
71.2k
      oappend_register (ins, indexes[vindex]);
12501
305
          else
12502
305
      oappend (ins, "(bad)");
12503
71.5k
        }
12504
9.96k
      else
12505
9.96k
        oappend_register (ins,
12506
9.96k
              ins->address_mode == mode_64bit
12507
7.21k
              && !addr32flag
12508
9.96k
              ? att_index64
12509
9.96k
              : att_index32);
12510
12511
81.5k
      oappend_char (ins, ins->scale_char);
12512
81.5k
      oappend_char_with_style (ins, '0' + (1 << scale),
12513
81.5k
             dis_style_immediate);
12514
81.5k
    }
12515
84.7k
      }
12516
1.24M
    if (ins->intel_syntax
12517
253k
        && (disp || ins->modrm.mod != 0 || base == 5))
12518
82.3k
      {
12519
82.3k
        if (!havedisp || (bfd_signed_vma) disp >= 0)
12520
57.1k
      oappend_char (ins, '+');
12521
82.3k
        if (havedisp)
12522
77.5k
    print_displacement (ins, disp);
12523
4.78k
        else
12524
4.78k
    print_operand_value (ins, disp, dis_style_address_offset);
12525
82.3k
      }
12526
12527
1.24M
    oappend_char (ins, ins->close_char);
12528
12529
1.24M
    if (check_gather)
12530
1.95k
      {
12531
        /* Both XMM/YMM/ZMM registers must be distinct.  */
12532
1.95k
        int modrm_reg = ins->modrm.reg;
12533
12534
1.95k
        if (ins->rex & REX_R)
12535
1.11k
          modrm_reg += 8;
12536
1.95k
        if (ins->rex2 & REX_R)
12537
1.26k
          modrm_reg += 16;
12538
1.95k
        if (vindex == modrm_reg)
12539
399
    oappend (ins, "/(bad)");
12540
1.95k
      }
12541
1.24M
  }
12542
28.8k
      else if (ins->intel_syntax)
12543
2.05k
  {
12544
2.05k
    if (ins->modrm.mod != 0 || base == 5)
12545
2.05k
      {
12546
2.05k
        if (!ins->active_seg_prefix)
12547
1.70k
    {
12548
1.70k
      oappend_register (ins, att_names_seg[ds_reg - es_reg]);
12549
1.70k
      oappend (ins, ":");
12550
1.70k
    }
12551
2.05k
        print_operand_value (ins, disp, dis_style_text);
12552
2.05k
      }
12553
2.05k
  }
12554
1.26M
    }
12555
73.6k
  else if (bytemode == v_bnd_mode
12556
73.2k
     || bytemode == v_bndmk_mode
12557
72.9k
     || bytemode == bnd_mode
12558
72.5k
     || bytemode == bnd_swap_mode
12559
72.1k
     || bytemode == vex_vsib_d_w_dq_mode
12560
71.5k
     || bytemode == vex_vsib_q_w_dq_mode)
12561
3.00k
    {
12562
3.00k
      oappend (ins, "(bad)");
12563
3.00k
      return true;
12564
3.00k
    }
12565
70.6k
  else
12566
70.6k
    {
12567
      /* 16 bit address mode */
12568
70.6k
      bfd_vma disp = 0;
12569
12570
70.6k
      ins->used_prefixes |= ins->prefixes & PREFIX_ADDR;
12571
70.6k
      switch (ins->modrm.mod)
12572
70.6k
  {
12573
48.3k
  case 0:
12574
48.3k
    if (ins->modrm.rm == 6)
12575
3.45k
      {
12576
11.4k
  case 2:
12577
11.4k
        if (!get16s (ins, &disp))
12578
575
    return false;
12579
11.4k
      }
12580
55.8k
    break;
12581
55.8k
  case 1:
12582
14.2k
    if (!get8s (ins, &disp))
12583
557
      return false;
12584
13.7k
    if (ins->vex.evex && shift > 0)
12585
720
      disp <<= shift;
12586
13.7k
    break;
12587
70.6k
  }
12588
12589
69.5k
      if (!ins->intel_syntax)
12590
52.0k
  if (ins->modrm.mod != 0 || ins->modrm.rm == 6)
12591
17.6k
    print_displacement (ins, disp);
12592
12593
69.5k
      if (ins->modrm.mod != 0 || ins->modrm.rm != 6)
12594
66.1k
  {
12595
66.1k
    oappend_char (ins, ins->open_char);
12596
66.1k
    oappend (ins, ins->intel_syntax ? intel_index16[ins->modrm.rm]
12597
66.1k
            : att_index16[ins->modrm.rm]);
12598
66.1k
    if (ins->intel_syntax
12599
16.1k
        && (disp || ins->modrm.mod != 0 || ins->modrm.rm == 6))
12600
5.61k
      {
12601
5.61k
        if ((bfd_signed_vma) disp >= 0)
12602
3.11k
    oappend_char (ins, '+');
12603
5.61k
        print_displacement (ins, disp);
12604
5.61k
      }
12605
12606
66.1k
    oappend_char (ins, ins->close_char);
12607
66.1k
  }
12608
3.38k
      else if (ins->intel_syntax)
12609
1.40k
  {
12610
1.40k
    if (!ins->active_seg_prefix)
12611
776
      {
12612
776
        oappend_register (ins, att_names_seg[ds_reg - es_reg]);
12613
776
        oappend (ins, ":");
12614
776
      }
12615
1.40k
    print_operand_value (ins, disp & 0xffff, dis_style_text);
12616
1.40k
  }
12617
69.5k
    }
12618
1.33M
  if (ins->vex.b && ins->evex_type == evex_default)
12619
17.0k
    {
12620
17.0k
      ins->evex_used |= EVEX_b_used;
12621
12622
      /* Broadcast can only ever be valid for memory sources.  */
12623
17.0k
      if (ins->obufp == ins->op_out[0])
12624
0
  ins->vex.no_broadcast = true;
12625
12626
17.0k
      if (!ins->vex.no_broadcast
12627
14.5k
    && (!ins->intel_syntax || !(ins->evex_used & EVEX_len_used)))
12628
12.5k
  {
12629
12.5k
    if (bytemode == xh_mode)
12630
1.64k
      {
12631
1.64k
        switch (ins->vex.length)
12632
1.64k
    {
12633
362
    case 128:
12634
362
      oappend (ins, "{1to8}");
12635
362
      break;
12636
892
    case 256:
12637
892
      oappend (ins, "{1to16}");
12638
892
      break;
12639
387
    case 512:
12640
387
      oappend (ins, "{1to32}");
12641
387
      break;
12642
0
    default:
12643
0
      abort ();
12644
1.64k
    }
12645
1.64k
      }
12646
10.9k
    else if (bytemode == q_mode
12647
10.4k
       || bytemode == ymmq_mode)
12648
1.01k
      ins->vex.no_broadcast = true;
12649
9.91k
    else if (ins->vex.w
12650
4.38k
       || bytemode == evex_half_bcst_xmmqdh_mode
12651
4.06k
       || bytemode == evex_half_bcst_xmmq_mode)
12652
6.19k
      {
12653
6.19k
        switch (ins->vex.length)
12654
6.19k
    {
12655
1.80k
    case 128:
12656
1.80k
      oappend (ins, "{1to2}");
12657
1.80k
      break;
12658
1.15k
    case 256:
12659
1.15k
      oappend (ins, "{1to4}");
12660
1.15k
      break;
12661
3.23k
    case 512:
12662
3.23k
      oappend (ins, "{1to8}");
12663
3.23k
      break;
12664
0
    default:
12665
0
      abort ();
12666
6.19k
    }
12667
6.19k
      }
12668
3.71k
    else if (bytemode == x_mode
12669
1.97k
       || bytemode == evex_half_bcst_xmmqh_mode)
12670
2.28k
      {
12671
2.28k
        switch (ins->vex.length)
12672
2.28k
    {
12673
360
    case 128:
12674
360
      oappend (ins, "{1to4}");
12675
360
      break;
12676
968
    case 256:
12677
968
      oappend (ins, "{1to8}");
12678
968
      break;
12679
961
    case 512:
12680
961
      oappend (ins, "{1to16}");
12681
961
      break;
12682
0
    default:
12683
0
      abort ();
12684
2.28k
    }
12685
2.28k
      }
12686
1.42k
    else
12687
1.42k
      ins->vex.no_broadcast = true;
12688
12.5k
  }
12689
17.0k
      if (ins->vex.no_broadcast)
12690
4.87k
  oappend (ins, "{bad}");
12691
17.0k
    }
12692
12693
1.33M
  return true;
12694
1.33M
}
12695
12696
static bool
12697
OP_E (instr_info *ins, int bytemode, int sizeflag)
12698
1.48M
{
12699
  /* Skip mod/rm byte.  */
12700
1.48M
  MODRM_CHECK;
12701
1.48M
  if (!ins->has_skipped_modrm)
12702
1.48M
    {
12703
1.48M
      ins->codep++;
12704
1.48M
      ins->has_skipped_modrm = true;
12705
1.48M
    }
12706
12707
1.48M
  if (ins->modrm.mod == 3)
12708
212k
    {
12709
212k
      if ((sizeflag & SUFFIX_ALWAYS)
12710
4.93k
    && (bytemode == b_swap_mode
12711
4.68k
        || bytemode == bnd_swap_mode
12712
4.49k
        || bytemode == v_swap_mode))
12713
900
  swap_operand (ins);
12714
12715
212k
      print_register (ins, ins->modrm.rm, REX_B, bytemode, sizeflag);
12716
212k
      return true;
12717
212k
    }
12718
12719
  /* Masking is invalid for insns with GPR-like memory destination. Set the
12720
     flag uniformly, as the consumer will inspect it only for the destination
12721
     operand.  */
12722
1.27M
  if (ins->vex.mask_register_specifier)
12723
5.29k
    ins->illegal_masking = true;
12724
12725
1.27M
  return OP_E_memory (ins, bytemode, sizeflag);
12726
1.48M
}
12727
12728
static bool
12729
OP_indirE (instr_info *ins, int bytemode, int sizeflag)
12730
41.9k
{
12731
41.9k
  if (ins->modrm.mod == 3 && bytemode == f_mode)
12732
    /* bad lcall/ljmp */
12733
2.90k
    return BadOp (ins);
12734
39.0k
  if (!ins->intel_syntax)
12735
25.4k
    oappend (ins, "*");
12736
39.0k
  return OP_E (ins, bytemode, sizeflag);
12737
41.9k
}
12738
12739
static bool
12740
OP_G (instr_info *ins, int bytemode, int sizeflag)
12741
1.27M
{
12742
1.27M
  print_register (ins, ins->modrm.reg, REX_R, bytemode, sizeflag);
12743
1.27M
  return true;
12744
1.27M
}
12745
12746
static bool
12747
OP_REG (instr_info *ins, int code, int sizeflag)
12748
319k
{
12749
319k
  const char *s;
12750
319k
  int add = 0;
12751
12752
319k
  switch (code)
12753
319k
    {
12754
7.99k
    case es_reg: case ss_reg: case cs_reg:
12755
11.3k
    case ds_reg: case fs_reg: case gs_reg:
12756
11.3k
      oappend_register (ins, att_names_seg[code - es_reg]);
12757
11.3k
      return true;
12758
319k
    }
12759
12760
307k
  USED_REX (REX_B);
12761
307k
  if (ins->rex & REX_B)
12762
11.3k
    add = 8;
12763
307k
  if (ins->rex2 & REX_B)
12764
810
    add += 16;
12765
12766
307k
  switch (code)
12767
307k
    {
12768
0
    case ax_reg: case cx_reg: case dx_reg: case bx_reg:
12769
0
    case sp_reg: case bp_reg: case si_reg: case di_reg:
12770
0
      s = att_names16[code - ax_reg + add];
12771
0
      break;
12772
17.2k
    case ah_reg: case ch_reg: case dh_reg: case bh_reg:
12773
17.2k
      USED_REX (0);
12774
      /* Fall through.  */
12775
31.3k
    case al_reg: case cl_reg: case dl_reg: case bl_reg:
12776
31.3k
      if (ins->rex)
12777
1.53k
  s = att_names8rex[code - al_reg + add];
12778
29.8k
      else
12779
29.8k
  s = att_names8[code - al_reg];
12780
31.3k
      break;
12781
64.6k
    case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
12782
133k
    case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
12783
133k
      if (ins->address_mode == mode_64bit
12784
103k
    && ((sizeflag & DFLAG) || (ins->rex & REX_W)))
12785
102k
  {
12786
102k
    s = att_names64[code - rAX_reg + add];
12787
102k
    break;
12788
102k
  }
12789
31.2k
      code += eAX_reg - rAX_reg;
12790
      /* Fall through.  */
12791
116k
    case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
12792
174k
    case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
12793
174k
      USED_REX (REX_W);
12794
174k
      if (ins->rex & REX_W)
12795
2.14k
  s = att_names64[code - eAX_reg + add];
12796
172k
      else
12797
172k
  {
12798
172k
    if (sizeflag & DFLAG)
12799
139k
      s = att_names32[code - eAX_reg + add];
12800
33.1k
    else
12801
33.1k
      s = att_names16[code - eAX_reg + add];
12802
172k
    ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12803
172k
  }
12804
174k
      break;
12805
0
    default:
12806
0
      oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
12807
0
      return true;
12808
307k
    }
12809
307k
  oappend_register (ins, s);
12810
307k
  return true;
12811
307k
}
12812
12813
static bool
12814
OP_IMREG (instr_info *ins, int code, int sizeflag)
12815
401k
{
12816
401k
  const char *s;
12817
12818
401k
  switch (code)
12819
401k
    {
12820
101k
    case indir_dx_reg:
12821
101k
      if (!ins->intel_syntax)
12822
68.5k
  {
12823
68.5k
    oappend (ins, "(%dx)");
12824
68.5k
    return true;
12825
68.5k
  }
12826
33.2k
      s = att_names16[dx_reg - ax_reg];
12827
33.2k
      break;
12828
131k
    case al_reg: case cl_reg:
12829
131k
      s = att_names8[code - al_reg];
12830
131k
      break;
12831
146k
    case eAX_reg:
12832
146k
      USED_REX (REX_W);
12833
146k
      if (ins->rex & REX_W)
12834
3.71k
  {
12835
3.71k
    s = *att_names64;
12836
3.71k
    break;
12837
3.71k
  }
12838
      /* Fall through.  */
12839
164k
    case z_mode_ax_reg:
12840
164k
      if ((ins->rex & REX_W) || (sizeflag & DFLAG))
12841
151k
  s = *att_names32;
12842
13.4k
      else
12843
13.4k
  s = *att_names16;
12844
164k
      if (!(ins->rex & REX_W))
12845
164k
  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12846
164k
      break;
12847
0
    default:
12848
0
      oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
12849
0
      return true;
12850
401k
    }
12851
333k
  oappend_register (ins, s);
12852
333k
  return true;
12853
401k
}
12854
12855
static bool
12856
OP_I (instr_info *ins, int bytemode, int sizeflag)
12857
335k
{
12858
335k
  bfd_vma op;
12859
12860
335k
  switch (bytemode)
12861
335k
    {
12862
198k
    case b_mode:
12863
198k
      if (!fetch_code (ins->info, ins->codep + 1))
12864
5.09k
  return false;
12865
193k
      op = *ins->codep++;
12866
193k
      break;
12867
116k
    case v_mode:
12868
116k
      USED_REX (REX_W);
12869
116k
      if (ins->rex & REX_W)
12870
3.39k
  {
12871
3.39k
    if (!get32s (ins, &op))
12872
840
      return false;
12873
3.39k
  }
12874
113k
      else
12875
113k
  {
12876
113k
    ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12877
113k
    if (sizeflag & DFLAG)
12878
102k
      {
12879
104k
    case d_mode:
12880
104k
        if (!get32 (ins, &op))
12881
3.62k
    return false;
12882
104k
      }
12883
10.1k
    else
12884
10.1k
      {
12885
        /* Fall through.  */
12886
20.3k
    case w_mode:
12887
20.3k
        if (!get16 (ins, &op))
12888
987
    return false;
12889
20.3k
      }
12890
113k
  }
12891
122k
      break;
12892
122k
    case const_1_mode:
12893
8.99k
      if (ins->intel_syntax)
12894
1.95k
  oappend_with_style (ins, "1", dis_style_immediate);
12895
7.04k
      else
12896
7.04k
  oappend_with_style (ins, "$1", dis_style_immediate);
12897
8.99k
      return true;
12898
0
    default:
12899
0
      oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
12900
0
      return true;
12901
335k
    }
12902
12903
315k
  oappend_immediate (ins, op);
12904
315k
  return true;
12905
335k
}
12906
12907
static bool
12908
OP_I64 (instr_info *ins, int bytemode, int sizeflag)
12909
36.8k
{
12910
36.8k
  uint64_t op;
12911
12912
36.8k
  if (bytemode != v_mode || ins->address_mode != mode_64bit
12913
29.2k
      || !(ins->rex & REX_W))
12914
35.5k
    return OP_I (ins, bytemode, sizeflag);
12915
12916
1.27k
  USED_REX (REX_W);
12917
12918
1.27k
  if (!get64 (ins, &op))
12919
179
    return false;
12920
12921
1.09k
  oappend_immediate (ins, op);
12922
1.09k
  return true;
12923
1.27k
}
12924
12925
static bool
12926
OP_sI (instr_info *ins, int bytemode, int sizeflag)
12927
40.2k
{
12928
40.2k
  bfd_vma op;
12929
12930
40.2k
  switch (bytemode)
12931
40.2k
    {
12932
17.1k
    case b_mode:
12933
24.9k
    case b_T_mode:
12934
24.9k
      if (!get8s (ins, &op))
12935
1.04k
  return false;
12936
23.8k
      if (bytemode == b_T_mode)
12937
7.62k
  {
12938
7.62k
    if (ins->address_mode != mode_64bit
12939
5.58k
        || !((sizeflag & DFLAG) || (ins->rex & REX_W)))
12940
2.79k
      {
12941
        /* The operand-size prefix is overridden by a REX prefix.  */
12942
2.79k
        if ((sizeflag & DFLAG) || (ins->rex & REX_W))
12943
1.47k
    op &= 0xffffffff;
12944
1.31k
        else
12945
1.31k
    op &= 0xffff;
12946
2.79k
    }
12947
7.62k
  }
12948
16.2k
      else
12949
16.2k
  {
12950
16.2k
    if (!(ins->rex & REX_W))
12951
9.73k
      {
12952
9.73k
        if (sizeflag & DFLAG)
12953
8.91k
    op &= 0xffffffff;
12954
814
        else
12955
814
    op &= 0xffff;
12956
9.73k
      }
12957
16.2k
  }
12958
23.8k
      break;
12959
15.3k
    case v_mode:
12960
      /* The operand-size prefix is overridden by a REX prefix.  */
12961
15.3k
      if (!(sizeflag & DFLAG) && !(ins->rex & REX_W))
12962
1.05k
  {
12963
1.05k
    if (!get16 (ins, &op))
12964
155
      return false;
12965
1.05k
  }
12966
14.3k
      else if (!get32s (ins, &op))
12967
377
  return false;
12968
14.8k
      break;
12969
14.8k
    default:
12970
0
      oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
12971
0
      return true;
12972
40.2k
    }
12973
12974
38.7k
  oappend_immediate (ins, op);
12975
38.7k
  return true;
12976
40.2k
}
12977
12978
static bool
12979
OP_J (instr_info *ins, int bytemode, int sizeflag)
12980
217k
{
12981
217k
  bfd_vma disp;
12982
217k
  bfd_vma mask = -1;
12983
217k
  bfd_vma segment = 0;
12984
12985
217k
  switch (bytemode)
12986
217k
    {
12987
190k
    case b_mode:
12988
190k
      if (!get8s (ins, &disp))
12989
1.55k
  return false;
12990
189k
      break;
12991
189k
    case v_mode:
12992
26.8k
    case dqw_mode:
12993
26.8k
      if ((sizeflag & DFLAG)
12994
2.61k
    || (ins->address_mode == mode_64bit
12995
1.62k
        && ((ins->isa64 == intel64 && bytemode != dqw_mode)
12996
1.37k
      || (ins->rex & REX_W))))
12997
24.7k
  {
12998
24.7k
    if (!get32s (ins, &disp))
12999
566
      return false;
13000
24.7k
  }
13001
2.09k
      else
13002
2.09k
  {
13003
2.09k
    if (!get16s (ins, &disp))
13004
400
      return false;
13005
    /* In 16bit mode, address is wrapped around at 64k within
13006
       the same segment.  Otherwise, a data16 prefix on a jump
13007
       instruction means that the pc is masked to 16 bits after
13008
       the displacement is added!  */
13009
1.69k
    mask = 0xffff;
13010
1.69k
    if ((ins->prefixes & PREFIX_DATA) == 0)
13011
1.38k
      segment = ((ins->start_pc + (ins->codep - ins->start_codep))
13012
1.38k
           & ~((bfd_vma) 0xffff));
13013
1.69k
  }
13014
25.8k
      if (ins->address_mode != mode_64bit
13015
20.6k
    || (ins->isa64 != intel64 && !(ins->rex & REX_W)))
13016
24.5k
  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13017
25.8k
      break;
13018
0
    default:
13019
0
      oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
13020
0
      return true;
13021
217k
    }
13022
215k
  disp = ((ins->start_pc + (ins->codep - ins->start_codep) + disp) & mask)
13023
215k
   | segment;
13024
215k
  set_op (ins, disp, false);
13025
215k
  print_operand_value (ins, disp, dis_style_text);
13026
215k
  return true;
13027
217k
}
13028
13029
static bool
13030
OP_SEG (instr_info *ins, int bytemode, int sizeflag)
13031
24.2k
{
13032
24.2k
  if (bytemode == w_mode)
13033
9.03k
    {
13034
9.03k
      oappend_register (ins, att_names_seg[ins->modrm.reg]);
13035
9.03k
      return true;
13036
9.03k
    }
13037
15.1k
  return OP_E (ins, ins->modrm.mod == 3 ? bytemode : w_mode, sizeflag);
13038
24.2k
}
13039
13040
static bool
13041
OP_DIR (instr_info *ins, int dummy ATTRIBUTE_UNUSED, int sizeflag)
13042
2.35k
{
13043
2.35k
  bfd_vma seg, offset;
13044
2.35k
  int res;
13045
2.35k
  char scratch[24];
13046
13047
2.35k
  if (sizeflag & DFLAG)
13048
1.33k
    {
13049
1.33k
      if (!get32 (ins, &offset))
13050
1.14k
  return false;;
13051
1.14k
    }
13052
1.02k
  else if (!get16 (ins, &offset))
13053
98
    return false;
13054
2.06k
  if (!get16 (ins, &seg))
13055
1.69k
    return false;;
13056
1.69k
  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13057
13058
1.69k
  res = snprintf (scratch, ARRAY_SIZE (scratch),
13059
1.69k
      ins->intel_syntax ? "0x%x:0x%x" : "$0x%x,$0x%x",
13060
1.69k
      (unsigned) seg, (unsigned) offset);
13061
1.69k
  if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
13062
0
    abort ();
13063
1.69k
  oappend (ins, scratch);
13064
1.69k
  return true;
13065
1.69k
}
13066
13067
static bool
13068
OP_OFF (instr_info *ins, int bytemode, int sizeflag)
13069
8.92k
{
13070
8.92k
  bfd_vma off;
13071
13072
8.92k
  if (ins->intel_syntax && (sizeflag & SUFFIX_ALWAYS))
13073
684
    intel_operand_size (ins, bytemode, sizeflag);
13074
8.92k
  append_seg (ins);
13075
13076
8.92k
  if ((sizeflag & AFLAG) || ins->address_mode == mode_64bit)
13077
5.71k
    {
13078
5.71k
      if (!get32 (ins, &off))
13079
664
  return false;
13080
5.71k
    }
13081
3.20k
  else
13082
3.20k
    {
13083
3.20k
      if (!get16 (ins, &off))
13084
285
  return false;
13085
3.20k
    }
13086
13087
7.97k
  if (ins->intel_syntax)
13088
3.23k
    {
13089
3.23k
      if (!ins->active_seg_prefix)
13090
2.86k
  {
13091
2.86k
    oappend_register (ins, att_names_seg[ds_reg - es_reg]);
13092
2.86k
    oappend (ins, ":");
13093
2.86k
  }
13094
3.23k
    }
13095
7.97k
  print_operand_value (ins, off, dis_style_address_offset);
13096
7.97k
  return true;
13097
8.92k
}
13098
13099
static bool
13100
OP_OFF64 (instr_info *ins, int bytemode, int sizeflag)
13101
22.9k
{
13102
22.9k
  uint64_t off;
13103
13104
22.9k
  if (ins->address_mode != mode_64bit
13105
15.4k
      || (ins->prefixes & PREFIX_ADDR))
13106
8.92k
    return OP_OFF (ins, bytemode, sizeflag);
13107
13108
13.9k
  if (ins->intel_syntax && (sizeflag & SUFFIX_ALWAYS))
13109
362
    intel_operand_size (ins, bytemode, sizeflag);
13110
13.9k
  append_seg (ins);
13111
13112
13.9k
  if (!get64 (ins, &off))
13113
1.16k
    return false;
13114
13115
12.8k
  if (ins->intel_syntax)
13116
3.27k
    {
13117
3.27k
      if (!ins->active_seg_prefix)
13118
2.95k
  {
13119
2.95k
    oappend_register (ins, att_names_seg[ds_reg - es_reg]);
13120
2.95k
    oappend (ins, ":");
13121
2.95k
  }
13122
3.27k
    }
13123
12.8k
  print_operand_value (ins, off, dis_style_address_offset);
13124
12.8k
  return true;
13125
13.9k
}
13126
13127
static void
13128
ptr_reg (instr_info *ins, int code, int sizeflag)
13129
226k
{
13130
226k
  const char *s;
13131
13132
226k
  *ins->obufp++ = ins->open_char;
13133
226k
  ins->used_prefixes |= (ins->prefixes & PREFIX_ADDR);
13134
226k
  if (ins->address_mode == mode_64bit)
13135
194k
    {
13136
194k
      if (!(sizeflag & AFLAG))
13137
2.64k
  s = att_names32[code - eAX_reg];
13138
191k
      else
13139
191k
  s = att_names64[code - eAX_reg];
13140
194k
    }
13141
32.6k
  else if (sizeflag & AFLAG)
13142
21.5k
    s = att_names32[code - eAX_reg];
13143
11.0k
  else
13144
11.0k
    s = att_names16[code - eAX_reg];
13145
226k
  oappend_register (ins, s);
13146
226k
  oappend_char (ins, ins->close_char);
13147
226k
}
13148
13149
static bool
13150
OP_ESreg (instr_info *ins, int code, int sizeflag)
13151
122k
{
13152
122k
  if (ins->intel_syntax)
13153
50.9k
    {
13154
50.9k
      switch (ins->codep[-1])
13155
50.9k
  {
13156
10.7k
  case 0x6d:  /* insw/insl */
13157
10.7k
    intel_operand_size (ins, z_mode, sizeflag);
13158
10.7k
    break;
13159
1.31k
  case 0xa5:  /* movsw/movsl/movsq */
13160
4.04k
  case 0xa7:  /* cmpsw/cmpsl/cmpsq */
13161
6.17k
  case 0xab:  /* stosw/stosl */
13162
6.99k
  case 0xaf:  /* scasw/scasl */
13163
6.99k
    intel_operand_size (ins, v_mode, sizeflag);
13164
6.99k
    break;
13165
33.2k
  default:
13166
33.2k
    intel_operand_size (ins, b_mode, sizeflag);
13167
50.9k
  }
13168
50.9k
    }
13169
122k
  if (ins->address_mode != mode_64bit)
13170
16.3k
    {
13171
16.3k
      oappend_register (ins, att_names_seg[0]);
13172
16.3k
      oappend_char (ins, ':');
13173
16.3k
    }
13174
122k
  ptr_reg (ins, code, sizeflag);
13175
122k
  return true;
13176
122k
}
13177
13178
static bool
13179
OP_DSreg (instr_info *ins, int code, int sizeflag)
13180
104k
{
13181
104k
  if (ins->intel_syntax)
13182
40.3k
    {
13183
40.3k
      switch (ins->codep[-1])
13184
40.3k
  {
13185
192
  case 0x01:  /* rmpupdate/rmpread */
13186
192
    break;
13187
5.10k
  case 0x6f:  /* outsw/outsl */
13188
5.10k
    intel_operand_size (ins, z_mode, sizeflag);
13189
5.10k
    break;
13190
1.31k
  case 0xa5:  /* movsw/movsl/movsq */
13191
4.04k
  case 0xa7:  /* cmpsw/cmpsl/cmpsq */
13192
6.15k
  case 0xad:  /* lodsw/lodsl/lodsq */
13193
6.15k
    intel_operand_size (ins, v_mode, sizeflag);
13194
6.15k
    break;
13195
28.9k
  default:
13196
28.9k
    intel_operand_size (ins, b_mode, sizeflag);
13197
40.3k
  }
13198
40.3k
    }
13199
  /* Outside of 64-bit mode set ins->active_seg_prefix to PREFIX_DS if it
13200
     is unset, so that the default segment register DS is printed.  */
13201
104k
  if (ins->address_mode != mode_64bit && !ins->active_seg_prefix)
13202
15.2k
    ins->active_seg_prefix = PREFIX_DS;
13203
104k
  append_seg (ins);
13204
104k
  ptr_reg (ins, code, sizeflag);
13205
104k
  return true;
13206
104k
}
13207
13208
static bool
13209
OP_C (instr_info *ins, int dummy ATTRIBUTE_UNUSED,
13210
      int sizeflag ATTRIBUTE_UNUSED)
13211
2.67k
{
13212
2.67k
  int add, res;
13213
2.67k
  char scratch[8];
13214
13215
2.67k
  if (ins->rex & REX_R)
13216
708
    {
13217
708
      USED_REX (REX_R);
13218
708
      add = 8;
13219
708
    }
13220
1.96k
  else if (ins->address_mode != mode_64bit && (ins->prefixes & PREFIX_LOCK))
13221
261
    {
13222
261
      ins->all_prefixes[ins->last_lock_prefix] = 0;
13223
261
      ins->used_prefixes |= PREFIX_LOCK;
13224
261
      add = 8;
13225
261
    }
13226
1.70k
  else
13227
1.70k
    add = 0;
13228
2.67k
  res = snprintf (scratch, ARRAY_SIZE (scratch), "%%cr%d",
13229
2.67k
      ins->modrm.reg + add);
13230
2.67k
  if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
13231
0
    abort ();
13232
2.67k
  oappend_register (ins, scratch);
13233
2.67k
  return true;
13234
2.67k
}
13235
13236
static bool
13237
OP_D (instr_info *ins, int dummy ATTRIBUTE_UNUSED,
13238
      int sizeflag ATTRIBUTE_UNUSED)
13239
1.30k
{
13240
1.30k
  int add, res;
13241
1.30k
  char scratch[8];
13242
13243
1.30k
  USED_REX (REX_R);
13244
1.30k
  if (ins->rex & REX_R)
13245
270
    add = 8;
13246
1.03k
  else
13247
1.03k
    add = 0;
13248
1.30k
  res = snprintf (scratch, ARRAY_SIZE (scratch),
13249
1.30k
      ins->intel_syntax ? "dr%d" : "%%db%d",
13250
1.30k
      ins->modrm.reg + add);
13251
1.30k
  if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
13252
0
    abort ();
13253
1.30k
  oappend (ins, scratch);
13254
1.30k
  return true;
13255
1.30k
}
13256
13257
static bool
13258
OP_T (instr_info *ins, int dummy ATTRIBUTE_UNUSED,
13259
      int sizeflag ATTRIBUTE_UNUSED)
13260
503
{
13261
503
  int res;
13262
503
  char scratch[8];
13263
13264
503
  res = snprintf (scratch, ARRAY_SIZE (scratch), "%%tr%d", ins->modrm.reg);
13265
503
  if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
13266
0
    abort ();
13267
503
  oappend_register (ins, scratch);
13268
503
  return true;
13269
503
}
13270
13271
static bool
13272
OP_MMX (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13273
  int sizeflag ATTRIBUTE_UNUSED)
13274
22.8k
{
13275
22.8k
  int reg = ins->modrm.reg;
13276
22.8k
  const char (*names)[8];
13277
13278
22.8k
  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13279
22.8k
  if (ins->prefixes & PREFIX_DATA)
13280
1.53k
    {
13281
1.53k
      names = att_names_xmm;
13282
1.53k
      USED_REX (REX_R);
13283
1.53k
      if (ins->rex & REX_R)
13284
784
  reg += 8;
13285
1.53k
    }
13286
21.3k
  else
13287
21.3k
    names = att_names_mm;
13288
22.8k
  oappend_register (ins, names[reg]);
13289
22.8k
  return true;
13290
22.8k
}
13291
13292
static void
13293
print_vector_reg (instr_info *ins, unsigned int reg, int bytemode)
13294
100k
{
13295
100k
  const char (*names)[8];
13296
13297
100k
  if (bytemode == xmmq_mode
13298
97.5k
      || bytemode == evex_half_bcst_xmmqh_mode
13299
97.2k
      || bytemode == evex_half_bcst_xmmq_mode)
13300
4.31k
    {
13301
4.31k
      switch (ins->vex.length)
13302
4.31k
  {
13303
1.51k
  case 0:
13304
1.80k
  case 128:
13305
2.46k
  case 256:
13306
2.46k
    names = att_names_xmm;
13307
2.46k
    break;
13308
1.85k
  case 512:
13309
1.85k
    names = att_names_ymm;
13310
1.85k
    ins->evex_used |= EVEX_len_used;
13311
1.85k
    break;
13312
0
  default:
13313
0
    abort ();
13314
4.31k
  }
13315
4.31k
    }
13316
96.1k
  else if (bytemode == ymm_mode)
13317
249
    names = att_names_ymm;
13318
95.8k
  else if (bytemode == tmm_mode)
13319
3.89k
    {
13320
3.89k
      if (reg >= 8)
13321
1.65k
  {
13322
1.65k
    oappend (ins, "(bad)");
13323
1.65k
    return;
13324
1.65k
  }
13325
2.24k
      names = att_names_tmm;
13326
2.24k
    }
13327
91.9k
  else if (ins->need_vex
13328
76.0k
     && bytemode != xmm_mode
13329
74.3k
     && bytemode != scalar_mode
13330
64.2k
     && bytemode != xmmdw_mode
13331
63.9k
     && bytemode != xmmqd_mode
13332
63.7k
     && bytemode != evex_half_bcst_xmmqdh_mode
13333
63.3k
     && bytemode != w_swap_mode
13334
62.9k
     && bytemode != b_mode
13335
62.4k
     && bytemode != w_mode
13336
62.0k
     && bytemode != d_mode
13337
60.9k
     && bytemode != q_mode)
13338
60.0k
    {
13339
60.0k
      ins->evex_used |= EVEX_len_used;
13340
60.0k
      switch (ins->vex.length)
13341
60.0k
  {
13342
25.2k
  case 128:
13343
25.2k
    names = att_names_xmm;
13344
25.2k
    break;
13345
16.7k
  case 256:
13346
16.7k
    if (ins->vex.w
13347
9.22k
        || bytemode != vex_vsib_q_w_dq_mode)
13348
15.6k
      names = att_names_ymm;
13349
1.08k
    else
13350
1.08k
      names = att_names_xmm;
13351
16.7k
    break;
13352
18.1k
  case 512:
13353
18.1k
    if (ins->vex.w
13354
9.41k
        || bytemode != vex_vsib_q_w_dq_mode)
13355
16.9k
      names = att_names_zmm;
13356
1.21k
    else
13357
1.21k
      names = att_names_ymm;
13358
18.1k
    break;
13359
0
  default:
13360
0
    abort ();
13361
60.0k
  }
13362
60.0k
    }
13363
31.8k
  else
13364
31.8k
    names = att_names_xmm;
13365
98.7k
  oappend_register (ins, names[reg]);
13366
98.7k
}
13367
13368
static bool
13369
OP_XMM (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13370
79.1k
{
13371
79.1k
  unsigned int reg = ins->modrm.reg;
13372
13373
79.1k
  USED_REX (REX_R);
13374
79.1k
  if (ins->rex & REX_R)
13375
33.7k
    reg += 8;
13376
79.1k
  if (ins->vex.evex)
13377
40.1k
    {
13378
40.1k
      if (ins->rex2 & REX_R)
13379
21.6k
  reg += 16;
13380
40.1k
    }
13381
13382
79.1k
  if (bytemode == tmm_mode)
13383
2.37k
    ins->modrm.reg = reg;
13384
76.7k
  else if (bytemode == scalar_mode)
13385
12.0k
    ins->vex.no_broadcast = true;
13386
13387
79.1k
  print_vector_reg (ins, reg, bytemode);
13388
79.1k
  return true;
13389
79.1k
}
13390
13391
static bool
13392
OP_EM (instr_info *ins, int bytemode, int sizeflag)
13393
22.3k
{
13394
22.3k
  int reg;
13395
22.3k
  const char (*names)[8];
13396
13397
22.3k
  if (ins->modrm.mod != 3)
13398
13.6k
    {
13399
13.6k
      if (ins->intel_syntax
13400
8.34k
    && (bytemode == v_mode || bytemode == v_swap_mode))
13401
7.99k
  {
13402
7.99k
    bytemode = (ins->prefixes & PREFIX_DATA) ? x_mode : q_mode;
13403
7.99k
    ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13404
7.99k
  }
13405
13.6k
      return OP_E (ins, bytemode, sizeflag);
13406
13.6k
    }
13407
13408
8.70k
  if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
13409
190
    swap_operand (ins);
13410
13411
  /* Skip mod/rm byte.  */
13412
8.70k
  MODRM_CHECK;
13413
8.70k
  ins->codep++;
13414
8.70k
  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13415
8.70k
  reg = ins->modrm.rm;
13416
8.70k
  if (ins->prefixes & PREFIX_DATA)
13417
749
    {
13418
749
      names = att_names_xmm;
13419
749
      USED_REX (REX_B);
13420
749
      if (ins->rex & REX_B)
13421
475
  reg += 8;
13422
749
    }
13423
7.95k
  else
13424
7.95k
    names = att_names_mm;
13425
8.70k
  oappend_register (ins, names[reg]);
13426
8.70k
  return true;
13427
8.70k
}
13428
13429
/* cvt* are the only instructions in sse2 which have
13430
   both SSE and MMX operands and also have 0x66 prefix
13431
   in their opcode. 0x66 was originally used to differentiate
13432
   between SSE and MMX instruction(operands). So we have to handle the
13433
   cvt* separately using OP_EMC and OP_MXC */
13434
static bool
13435
OP_EMC (instr_info *ins, int bytemode, int sizeflag)
13436
1.36k
{
13437
1.36k
  if (ins->modrm.mod != 3)
13438
1.06k
    {
13439
1.06k
      if (ins->intel_syntax && bytemode == v_mode)
13440
0
  {
13441
0
    bytemode = (ins->prefixes & PREFIX_DATA) ? x_mode : q_mode;
13442
0
    ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13443
0
  }
13444
1.06k
      return OP_E (ins, bytemode, sizeflag);
13445
1.06k
    }
13446
13447
  /* Skip mod/rm byte.  */
13448
297
  MODRM_CHECK;
13449
297
  ins->codep++;
13450
297
  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13451
297
  oappend_register (ins, att_names_mm[ins->modrm.rm]);
13452
297
  return true;
13453
297
}
13454
13455
static bool
13456
OP_MXC (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13457
  int sizeflag ATTRIBUTE_UNUSED)
13458
363
{
13459
363
  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13460
363
  oappend_register (ins, att_names_mm[ins->modrm.reg]);
13461
363
  return true;
13462
363
}
13463
13464
static bool
13465
OP_EX (instr_info *ins, int bytemode, int sizeflag)
13466
72.5k
{
13467
72.5k
  int reg;
13468
13469
  /* Skip mod/rm byte.  */
13470
72.5k
  MODRM_CHECK;
13471
72.5k
  ins->codep++;
13472
13473
72.5k
  if (bytemode == dq_mode)
13474
388
    bytemode = ins->vex.w ? q_mode : d_mode;
13475
13476
72.5k
  if (ins->modrm.mod != 3)
13477
51.2k
    return OP_E_memory (ins, bytemode, sizeflag);
13478
13479
21.3k
  reg = ins->modrm.rm;
13480
21.3k
  USED_REX (REX_B);
13481
21.3k
  if (ins->rex & REX_B)
13482
5.06k
    reg += 8;
13483
21.3k
  if (ins->vex.evex)
13484
9.65k
    {
13485
9.65k
      USED_REX (REX_X);
13486
9.65k
      if ((ins->rex & REX_X))
13487
3.31k
  reg += 16;
13488
9.65k
      ins->rex2_used &= ~REX_B;
13489
9.65k
    }
13490
11.6k
  else if (ins->rex2 & REX_B)
13491
292
    reg += 16;
13492
13493
21.3k
  if ((sizeflag & SUFFIX_ALWAYS)
13494
2.49k
      && (bytemode == x_swap_mode
13495
2.11k
    || bytemode == w_swap_mode
13496
1.91k
    || bytemode == d_swap_mode
13497
1.54k
    || bytemode == q_swap_mode))
13498
1.14k
    swap_operand (ins);
13499
13500
21.3k
  if (bytemode == tmm_mode)
13501
1.52k
    ins->modrm.rm = reg;
13502
13503
21.3k
  print_vector_reg (ins, reg, bytemode);
13504
21.3k
  return true;
13505
72.5k
}
13506
13507
static bool
13508
OP_R (instr_info *ins, int bytemode, int sizeflag)
13509
12.6k
{
13510
12.6k
  if (ins->modrm.mod != 3)
13511
3.25k
    return BadOp (ins);
13512
13513
9.39k
  switch (bytemode)
13514
9.39k
    {
13515
544
    case d_mode:
13516
864
    case dq_mode:
13517
1.43k
    case q_mode:
13518
2.65k
    case mask_mode:
13519
2.65k
      return OP_E (ins, bytemode, sizeflag);
13520
472
    case q_mm_mode:
13521
472
      return OP_EM (ins, x_mode, sizeflag);
13522
4.67k
    case xmm_mode:
13523
4.67k
      if (ins->vex.length <= 128)
13524
494
  break;
13525
4.18k
      return BadOp (ins);
13526
9.39k
    }
13527
13528
2.09k
  return OP_EX (ins, bytemode, sizeflag);
13529
9.39k
}
13530
13531
static bool
13532
OP_M (instr_info *ins, int bytemode, int sizeflag)
13533
40.0k
{
13534
  /* Skip mod/rm byte.  */
13535
40.0k
  MODRM_CHECK;
13536
40.0k
  ins->codep++;
13537
13538
40.0k
  if (ins->modrm.mod == 3)
13539
    /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
13540
3.59k
    return BadOp (ins);
13541
13542
36.5k
  if (bytemode == x_mode)
13543
342
    ins->vex.no_broadcast = true;
13544
13545
36.5k
  return OP_E_memory (ins, bytemode, sizeflag);
13546
40.0k
}
13547
13548
static bool
13549
OP_0f07 (instr_info *ins, int bytemode, int sizeflag)
13550
2.39k
{
13551
2.39k
  if (ins->modrm.mod != 3 || ins->modrm.rm != 0)
13552
2.09k
    return BadOp (ins);
13553
300
  return OP_E (ins, bytemode, sizeflag);
13554
2.39k
}
13555
13556
/* montmul instruction need display repz and skip modrm */
13557
13558
static bool
13559
MONTMUL_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13560
1.17k
{
13561
1.17k
  if (ins->modrm.mod != 3 || ins->modrm.rm != 0)
13562
641
    return BadOp (ins);
13563
13564
  /* The 0xf3 prefix should be displayed as "repz" for montmul. */
13565
536
  if (ins->prefixes & PREFIX_REPZ)
13566
536
    ins->all_prefixes[ins->last_repz_prefix] = 0xf3;
13567
13568
  /* Skip mod/rm byte.  */
13569
536
  MODRM_CHECK;
13570
536
  ins->codep++;
13571
536
  return true;
13572
536
}
13573
13574
/* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
13575
   32bit mode and "xchg %rax,%rax" in 64bit mode.  */
13576
13577
static bool
13578
NOP_Fixup (instr_info *ins, int opnd, int sizeflag)
13579
28.0k
{
13580
28.0k
  if ((ins->prefixes & PREFIX_DATA) == 0 && (ins->rex & REX_B) == 0)
13581
24.2k
    {
13582
24.2k
      ins->mnemonicendp = stpcpy (ins->obuf, "nop");
13583
24.2k
      return true;
13584
24.2k
    }
13585
3.82k
  if (opnd == 0)
13586
1.91k
    return OP_REG (ins, eAX_reg, sizeflag);
13587
1.91k
  return OP_IMREG (ins, eAX_reg, sizeflag);
13588
3.82k
}
13589
13590
static const char *const Suffix3DNow[] = {
13591
/* 00 */  NULL,   NULL,   NULL,   NULL,
13592
/* 04 */  NULL,   NULL,   NULL,   NULL,
13593
/* 08 */  NULL,   NULL,   NULL,   NULL,
13594
/* 0C */  "pi2fw",  "pi2fd",  NULL,   NULL,
13595
/* 10 */  NULL,   NULL,   NULL,   NULL,
13596
/* 14 */  NULL,   NULL,   NULL,   NULL,
13597
/* 18 */  NULL,   NULL,   NULL,   NULL,
13598
/* 1C */  "pf2iw",  "pf2id",  NULL,   NULL,
13599
/* 20 */  NULL,   NULL,   NULL,   NULL,
13600
/* 24 */  NULL,   NULL,   NULL,   NULL,
13601
/* 28 */  NULL,   NULL,   NULL,   NULL,
13602
/* 2C */  NULL,   NULL,   NULL,   NULL,
13603
/* 30 */  NULL,   NULL,   NULL,   NULL,
13604
/* 34 */  NULL,   NULL,   NULL,   NULL,
13605
/* 38 */  NULL,   NULL,   NULL,   NULL,
13606
/* 3C */  NULL,   NULL,   NULL,   NULL,
13607
/* 40 */  NULL,   NULL,   NULL,   NULL,
13608
/* 44 */  NULL,   NULL,   NULL,   NULL,
13609
/* 48 */  NULL,   NULL,   NULL,   NULL,
13610
/* 4C */  NULL,   NULL,   NULL,   NULL,
13611
/* 50 */  NULL,   NULL,   NULL,   NULL,
13612
/* 54 */  NULL,   NULL,   NULL,   NULL,
13613
/* 58 */  NULL,   NULL,   NULL,   NULL,
13614
/* 5C */  NULL,   NULL,   NULL,   NULL,
13615
/* 60 */  NULL,   NULL,   NULL,   NULL,
13616
/* 64 */  NULL,   NULL,   NULL,   NULL,
13617
/* 68 */  NULL,   NULL,   NULL,   NULL,
13618
/* 6C */  NULL,   NULL,   NULL,   NULL,
13619
/* 70 */  NULL,   NULL,   NULL,   NULL,
13620
/* 74 */  NULL,   NULL,   NULL,   NULL,
13621
/* 78 */  NULL,   NULL,   NULL,   NULL,
13622
/* 7C */  NULL,   NULL,   NULL,   NULL,
13623
/* 80 */  NULL,   NULL,   NULL,   NULL,
13624
/* 84 */  NULL,   NULL,   NULL,   NULL,
13625
/* 88 */  NULL,   NULL,   "pfnacc", NULL,
13626
/* 8C */  NULL,   NULL,   "pfpnacc",  NULL,
13627
/* 90 */  "pfcmpge",  NULL,   NULL,   NULL,
13628
/* 94 */  "pfmin",  NULL,   "pfrcp",  "pfrsqrt",
13629
/* 98 */  NULL,   NULL,   "pfsub",  NULL,
13630
/* 9C */  NULL,   NULL,   "pfadd",  NULL,
13631
/* A0 */  "pfcmpgt",  NULL,   NULL,   NULL,
13632
/* A4 */  "pfmax",  NULL,   "pfrcpit1", "pfrsqit1",
13633
/* A8 */  NULL,   NULL,   "pfsubr", NULL,
13634
/* AC */  NULL,   NULL,   "pfacc",  NULL,
13635
/* B0 */  "pfcmpeq",  NULL,   NULL,   NULL,
13636
/* B4 */  "pfmul",  NULL,   "pfrcpit2", "pmulhrw",
13637
/* B8 */  NULL,   NULL,   NULL,   "pswapd",
13638
/* BC */  NULL,   NULL,   NULL,   "pavgusb",
13639
/* C0 */  NULL,   NULL,   NULL,   NULL,
13640
/* C4 */  NULL,   NULL,   NULL,   NULL,
13641
/* C8 */  NULL,   NULL,   NULL,   NULL,
13642
/* CC */  NULL,   NULL,   NULL,   NULL,
13643
/* D0 */  NULL,   NULL,   NULL,   NULL,
13644
/* D4 */  NULL,   NULL,   NULL,   NULL,
13645
/* D8 */  NULL,   NULL,   NULL,   NULL,
13646
/* DC */  NULL,   NULL,   NULL,   NULL,
13647
/* E0 */  NULL,   NULL,   NULL,   NULL,
13648
/* E4 */  NULL,   NULL,   NULL,   NULL,
13649
/* E8 */  NULL,   NULL,   NULL,   NULL,
13650
/* EC */  NULL,   NULL,   NULL,   NULL,
13651
/* F0 */  NULL,   NULL,   NULL,   NULL,
13652
/* F4 */  NULL,   NULL,   NULL,   NULL,
13653
/* F8 */  NULL,   NULL,   NULL,   NULL,
13654
/* FC */  NULL,   NULL,   NULL,   NULL,
13655
};
13656
13657
static bool
13658
OP_3DNowSuffix (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13659
    int sizeflag ATTRIBUTE_UNUSED)
13660
10.0k
{
13661
10.0k
  const char *mnemonic;
13662
13663
10.0k
  if (!fetch_code (ins->info, ins->codep + 1))
13664
410
    return false;
13665
  /* AMD 3DNow! instructions are specified by an opcode suffix in the
13666
     place where an 8-bit immediate would normally go.  ie. the last
13667
     byte of the instruction.  */
13668
9.65k
  ins->obufp = ins->mnemonicendp;
13669
9.65k
  mnemonic = Suffix3DNow[*ins->codep++];
13670
9.65k
  if (mnemonic)
13671
600
    ins->obufp = stpcpy (ins->obufp, mnemonic);
13672
9.05k
  else
13673
9.05k
    {
13674
      /* Since a variable sized ins->modrm/ins->sib chunk is between the start
13675
   of the opcode (0x0f0f) and the opcode suffix, we need to do
13676
   all the ins->modrm processing first, and don't know until now that
13677
   we have a bad opcode.  This necessitates some cleaning up.  */
13678
9.05k
      ins->op_out[0][0] = '\0';
13679
9.05k
      ins->op_out[1][0] = '\0';
13680
9.05k
      BadOp (ins);
13681
9.05k
    }
13682
9.65k
  ins->mnemonicendp = ins->obufp;
13683
9.65k
  return true;
13684
10.0k
}
13685
13686
static const struct op simd_cmp_op[] =
13687
{
13688
  { STRING_COMMA_LEN ("eq") },
13689
  { STRING_COMMA_LEN ("lt") },
13690
  { STRING_COMMA_LEN ("le") },
13691
  { STRING_COMMA_LEN ("unord") },
13692
  { STRING_COMMA_LEN ("neq") },
13693
  { STRING_COMMA_LEN ("nlt") },
13694
  { STRING_COMMA_LEN ("nle") },
13695
  { STRING_COMMA_LEN ("ord") }
13696
};
13697
13698
static const struct op vex_cmp_op[] =
13699
{
13700
  { STRING_COMMA_LEN ("eq_uq") },
13701
  { STRING_COMMA_LEN ("nge") },
13702
  { STRING_COMMA_LEN ("ngt") },
13703
  { STRING_COMMA_LEN ("false") },
13704
  { STRING_COMMA_LEN ("neq_oq") },
13705
  { STRING_COMMA_LEN ("ge") },
13706
  { STRING_COMMA_LEN ("gt") },
13707
  { STRING_COMMA_LEN ("true") },
13708
  { STRING_COMMA_LEN ("eq_os") },
13709
  { STRING_COMMA_LEN ("lt_oq") },
13710
  { STRING_COMMA_LEN ("le_oq") },
13711
  { STRING_COMMA_LEN ("unord_s") },
13712
  { STRING_COMMA_LEN ("neq_us") },
13713
  { STRING_COMMA_LEN ("nlt_uq") },
13714
  { STRING_COMMA_LEN ("nle_uq") },
13715
  { STRING_COMMA_LEN ("ord_s") },
13716
  { STRING_COMMA_LEN ("eq_us") },
13717
  { STRING_COMMA_LEN ("nge_uq") },
13718
  { STRING_COMMA_LEN ("ngt_uq") },
13719
  { STRING_COMMA_LEN ("false_os") },
13720
  { STRING_COMMA_LEN ("neq_os") },
13721
  { STRING_COMMA_LEN ("ge_oq") },
13722
  { STRING_COMMA_LEN ("gt_oq") },
13723
  { STRING_COMMA_LEN ("true_us") },
13724
};
13725
13726
static bool
13727
CMP_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13728
     int sizeflag ATTRIBUTE_UNUSED)
13729
3.15k
{
13730
3.15k
  unsigned int cmp_type;
13731
13732
3.15k
  if (!fetch_code (ins->info, ins->codep + 1))
13733
603
    return false;
13734
2.55k
  cmp_type = *ins->codep++;
13735
2.55k
  if (cmp_type < ARRAY_SIZE (simd_cmp_op))
13736
739
    {
13737
739
      char suffix[3];
13738
739
      char *p = ins->mnemonicendp - 2;
13739
739
      suffix[0] = p[0];
13740
739
      suffix[1] = p[1];
13741
739
      suffix[2] = '\0';
13742
739
      sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
13743
739
      ins->mnemonicendp += simd_cmp_op[cmp_type].len;
13744
739
    }
13745
1.81k
  else if (ins->need_vex
13746
1.24k
     && cmp_type < ARRAY_SIZE (simd_cmp_op) + ARRAY_SIZE (vex_cmp_op))
13747
264
    {
13748
264
      char suffix[3];
13749
264
      char *p = ins->mnemonicendp - 2;
13750
264
      suffix[0] = p[0];
13751
264
      suffix[1] = p[1];
13752
264
      suffix[2] = '\0';
13753
264
      cmp_type -= ARRAY_SIZE (simd_cmp_op);
13754
264
      sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
13755
264
      ins->mnemonicendp += vex_cmp_op[cmp_type].len;
13756
264
    }
13757
1.55k
  else
13758
1.55k
    {
13759
      /* We have a reserved extension byte.  Output it directly.  */
13760
1.55k
      oappend_immediate (ins, cmp_type);
13761
1.55k
    }
13762
2.55k
  return true;
13763
3.15k
}
13764
13765
static bool
13766
OP_Mwait (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13767
994
{
13768
  /* mwait %eax,%ecx / mwaitx %eax,%ecx,%ebx  */
13769
994
  if (!ins->intel_syntax)
13770
600
    {
13771
600
      strcpy (ins->op_out[0], att_names32[0] + ins->intel_syntax);
13772
600
      strcpy (ins->op_out[1], att_names32[1] + ins->intel_syntax);
13773
600
      if (bytemode == eBX_reg)
13774
229
  strcpy (ins->op_out[2], att_names32[3] + ins->intel_syntax);
13775
600
      ins->two_source_ops = true;
13776
600
    }
13777
  /* Skip mod/rm byte.  */
13778
994
  MODRM_CHECK;
13779
994
  ins->codep++;
13780
994
  return true;
13781
994
}
13782
13783
static bool
13784
OP_Monitor (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13785
      int sizeflag ATTRIBUTE_UNUSED)
13786
2.35k
{
13787
  /* monitor %{e,r,}ax,%ecx,%edx"  */
13788
2.35k
  if (!ins->intel_syntax)
13789
1.14k
    {
13790
1.14k
      const char (*names)[8] = (ins->address_mode == mode_64bit
13791
1.14k
        ? att_names64 : att_names32);
13792
13793
1.14k
      if (ins->prefixes & PREFIX_ADDR)
13794
434
  {
13795
    /* Remove "addr16/addr32".  */
13796
434
    ins->all_prefixes[ins->last_addr_prefix] = 0;
13797
434
    names = (ins->address_mode != mode_32bit
13798
434
       ? att_names32 : att_names16);
13799
434
    ins->used_prefixes |= PREFIX_ADDR;
13800
434
  }
13801
709
      else if (ins->address_mode == mode_16bit)
13802
484
  names = att_names16;
13803
1.14k
      strcpy (ins->op_out[0], names[0] + ins->intel_syntax);
13804
1.14k
      strcpy (ins->op_out[1], att_names32[1] + ins->intel_syntax);
13805
1.14k
      strcpy (ins->op_out[2], att_names32[2] + ins->intel_syntax);
13806
1.14k
      ins->two_source_ops = true;
13807
1.14k
    }
13808
  /* Skip mod/rm byte.  */
13809
2.35k
  MODRM_CHECK;
13810
2.35k
  ins->codep++;
13811
2.35k
  return true;
13812
2.35k
}
13813
13814
static bool
13815
REP_Fixup (instr_info *ins, int bytemode, int sizeflag)
13816
117k
{
13817
  /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
13818
     lods and stos.  */
13819
117k
  if (ins->prefixes & PREFIX_REPZ)
13820
292
    ins->all_prefixes[ins->last_repz_prefix] = REP_PREFIX;
13821
13822
117k
  switch (bytemode)
13823
117k
    {
13824
2.90k
    case al_reg:
13825
10.5k
    case eAX_reg:
13826
46.3k
    case indir_dx_reg:
13827
46.3k
      return OP_IMREG (ins, bytemode, sizeflag);
13828
71.1k
    case eDI_reg:
13829
71.1k
      return OP_ESreg (ins, bytemode, sizeflag);
13830
0
    case eSI_reg:
13831
0
      return OP_DSreg (ins, bytemode, sizeflag);
13832
0
    default:
13833
0
      abort ();
13834
0
      break;
13835
117k
    }
13836
0
  return true;
13837
117k
}
13838
13839
static bool
13840
SEP_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13841
     int sizeflag ATTRIBUTE_UNUSED)
13842
715
{
13843
715
  if (ins->isa64 != amd64)
13844
525
    return true;
13845
13846
190
  ins->obufp = ins->obuf;
13847
190
  BadOp (ins);
13848
190
  ins->mnemonicendp = ins->obufp;
13849
190
  ++ins->codep;
13850
190
  return true;
13851
715
}
13852
13853
/* For BND-prefixed instructions 0xF2 prefix should be displayed as
13854
   "bnd".  */
13855
13856
static bool
13857
BND_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13858
     int sizeflag ATTRIBUTE_UNUSED)
13859
232k
{
13860
232k
  if (ins->prefixes & PREFIX_REPNZ)
13861
1.08k
    ins->all_prefixes[ins->last_repnz_prefix] = BND_PREFIX;
13862
232k
  return true;
13863
232k
}
13864
13865
/* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as
13866
   "notrack".  */
13867
13868
static bool
13869
NOTRACK_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13870
         int sizeflag ATTRIBUTE_UNUSED)
13871
27.3k
{
13872
  /* Since active_seg_prefix is not set in 64-bit mode, check whether
13873
     we've seen a PREFIX_DS.  */
13874
27.3k
  if ((ins->prefixes & PREFIX_DS) != 0
13875
2.86k
      && (ins->address_mode != mode_64bit || ins->last_data_prefix < 0))
13876
2.43k
    {
13877
      /* NOTRACK prefix is only valid on indirect branch instructions.
13878
   NB: DATA prefix is unsupported for Intel64.  */
13879
2.43k
      ins->active_seg_prefix = 0;
13880
2.43k
      ins->all_prefixes[ins->last_seg_prefix] = NOTRACK_PREFIX;
13881
2.43k
    }
13882
27.3k
  return true;
13883
27.3k
}
13884
13885
/* Similar to OP_E.  But the 0xf2/0xf3 ins->prefixes should be displayed as
13886
   "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
13887
 */
13888
13889
static bool
13890
HLE_Fixup1 (instr_info *ins, int bytemode, int sizeflag)
13891
1.00M
{
13892
1.00M
  if (ins->modrm.mod != 3
13893
923k
      && (ins->prefixes & PREFIX_LOCK) != 0)
13894
3.26k
    {
13895
3.26k
      if (ins->prefixes & PREFIX_REPZ)
13896
907
  ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX;
13897
3.26k
      if (ins->prefixes & PREFIX_REPNZ)
13898
440
  ins->all_prefixes[ins->last_repnz_prefix] = XACQUIRE_PREFIX;
13899
3.26k
    }
13900
13901
1.00M
  return OP_E (ins, bytemode, sizeflag);
13902
1.00M
}
13903
13904
/* Similar to OP_E.  But the 0xf2/0xf3 ins->prefixes should be displayed as
13905
   "xacquire"/"xrelease" for memory operand.  No check for LOCK prefix.
13906
 */
13907
13908
static bool
13909
HLE_Fixup2 (instr_info *ins, int bytemode, int sizeflag)
13910
10.0k
{
13911
10.0k
  if (ins->modrm.mod != 3)
13912
8.59k
    {
13913
8.59k
      if (ins->prefixes & PREFIX_REPZ)
13914
515
  ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX;
13915
8.59k
      if (ins->prefixes & PREFIX_REPNZ)
13916
1.16k
  ins->all_prefixes[ins->last_repnz_prefix] = XACQUIRE_PREFIX;
13917
8.59k
    }
13918
13919
10.0k
  return OP_E (ins, bytemode, sizeflag);
13920
10.0k
}
13921
13922
/* Similar to OP_E.  But the 0xf3 prefixes should be displayed as
13923
   "xrelease" for memory operand.  No check for LOCK prefix.   */
13924
13925
static bool
13926
HLE_Fixup3 (instr_info *ins, int bytemode, int sizeflag)
13927
32.6k
{
13928
32.6k
  if (ins->modrm.mod != 3
13929
14.0k
      && ins->last_repz_prefix > ins->last_repnz_prefix
13930
339
      && (ins->prefixes & PREFIX_REPZ) != 0)
13931
339
    ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX;
13932
13933
32.6k
  return OP_E (ins, bytemode, sizeflag);
13934
32.6k
}
13935
13936
static bool
13937
CMPXCHG8B_Fixup (instr_info *ins, int bytemode, int sizeflag)
13938
2.35k
{
13939
2.35k
  USED_REX (REX_W);
13940
2.35k
  if (ins->rex & REX_W)
13941
274
    {
13942
      /* Change cmpxchg8b to cmpxchg16b.  */
13943
274
      char *p = ins->mnemonicendp - 2;
13944
274
      ins->mnemonicendp = stpcpy (p, "16b");
13945
274
      bytemode = o_mode;
13946
274
    }
13947
2.08k
  else if ((ins->prefixes & PREFIX_LOCK) != 0)
13948
1.08k
    {
13949
1.08k
      if (ins->prefixes & PREFIX_REPZ)
13950
621
  ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX;
13951
1.08k
      if (ins->prefixes & PREFIX_REPNZ)
13952
206
  ins->all_prefixes[ins->last_repnz_prefix] = XACQUIRE_PREFIX;
13953
1.08k
    }
13954
13955
2.35k
  return OP_M (ins, bytemode, sizeflag);
13956
2.35k
}
13957
13958
static bool
13959
XMM_Fixup (instr_info *ins, int reg, int sizeflag ATTRIBUTE_UNUSED)
13960
324
{
13961
324
  const char (*names)[8] = att_names_xmm;
13962
13963
324
  if (ins->need_vex)
13964
0
    {
13965
0
      switch (ins->vex.length)
13966
0
  {
13967
0
  case 128:
13968
0
    break;
13969
0
  case 256:
13970
0
    names = att_names_ymm;
13971
0
    break;
13972
0
  default:
13973
0
    abort ();
13974
0
  }
13975
0
    }
13976
324
  oappend_register (ins, names[reg]);
13977
324
  return true;
13978
324
}
13979
13980
static bool
13981
FXSAVE_Fixup (instr_info *ins, int bytemode, int sizeflag)
13982
1.34k
{
13983
  /* Add proper suffix to "fxsave" and "fxrstor".  */
13984
1.34k
  USED_REX (REX_W);
13985
1.34k
  if (ins->rex & REX_W)
13986
614
    {
13987
614
      char *p = ins->mnemonicendp;
13988
614
      *p++ = '6';
13989
614
      *p++ = '4';
13990
614
      *p = '\0';
13991
614
      ins->mnemonicendp = p;
13992
614
    }
13993
1.34k
  return OP_M (ins, bytemode, sizeflag);
13994
1.34k
}
13995
13996
/* Display the destination register operand for instructions with
13997
   VEX. */
13998
13999
static bool
14000
OP_VEX (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
14001
98.4k
{
14002
98.4k
  int reg, modrm_reg, sib_index = -1;
14003
98.4k
  const char (*names)[8];
14004
14005
98.4k
  if (!ins->need_vex)
14006
42.8k
    return true;
14007
14008
55.6k
  if (ins->evex_type == evex_from_legacy)
14009
6.53k
    {
14010
6.53k
      ins->evex_used |= EVEX_b_used;
14011
6.53k
      if (!ins->vex.nd)
14012
2.20k
  return true;
14013
6.53k
    }
14014
14015
53.4k
  reg = ins->vex.register_specifier;
14016
53.4k
  ins->vex.register_specifier = 0;
14017
53.4k
  if (ins->address_mode != mode_64bit)
14018
7.85k
    {
14019
7.85k
      if (ins->vex.evex && !ins->vex.v)
14020
1.80k
  {
14021
1.80k
    oappend (ins, "(bad)");
14022
1.80k
    return true;
14023
1.80k
  }
14024
14025
6.05k
      reg &= 7;
14026
6.05k
    }
14027
45.5k
  else if (ins->vex.evex && !ins->vex.v)
14028
13.4k
    reg += 16;
14029
14030
51.6k
  switch (bytemode)
14031
51.6k
    {
14032
7.25k
    case scalar_mode:
14033
7.25k
      oappend_register (ins, att_names_xmm[reg]);
14034
7.25k
      return true;
14035
14036
3.03k
    case vex_vsib_d_w_dq_mode:
14037
4.89k
    case vex_vsib_q_w_dq_mode:
14038
      /* This must be the 3rd operand.  */
14039
4.89k
      if (ins->obufp != ins->op_out[2])
14040
0
  abort ();
14041
4.89k
      if (ins->vex.length == 128
14042
2.14k
    || (bytemode != vex_vsib_d_w_dq_mode
14043
1.19k
        && !ins->vex.w))
14044
3.50k
  oappend_register (ins, att_names_xmm[reg]);
14045
1.38k
      else
14046
1.38k
  oappend_register (ins, att_names_ymm[reg]);
14047
14048
      /* All 3 XMM/YMM registers must be distinct.  */
14049
4.89k
      modrm_reg = ins->modrm.reg;
14050
4.89k
      if (ins->rex & REX_R)
14051
1.11k
  modrm_reg += 8;
14052
14053
4.89k
      if (ins->has_sib && ins->modrm.rm == 4)
14054
1.81k
  {
14055
1.81k
    sib_index = ins->sib.index;
14056
1.81k
    if (ins->rex & REX_X)
14057
370
      sib_index += 8;
14058
1.81k
  }
14059
14060
4.89k
      if (reg == modrm_reg || reg == sib_index)
14061
806
  strcpy (ins->obufp, "/(bad)");
14062
4.89k
      if (modrm_reg == sib_index || modrm_reg == reg)
14063
1.06k
  strcat (ins->op_out[0], "/(bad)");
14064
4.89k
      if (sib_index == modrm_reg || sib_index == reg)
14065
669
  strcat (ins->op_out[1], "/(bad)");
14066
14067
4.89k
      return true;
14068
14069
1.98k
    case tmm_mode:
14070
      /* All 3 TMM registers must be distinct.  */
14071
1.98k
      if (reg >= 8)
14072
518
  oappend (ins, "(bad)");
14073
1.46k
      else
14074
1.46k
  {
14075
    /* This must be the 3rd operand.  */
14076
1.46k
    if (ins->obufp != ins->op_out[2])
14077
0
      abort ();
14078
1.46k
    oappend_register (ins, att_names_tmm[reg]);
14079
1.46k
    if (reg == ins->modrm.reg || reg == ins->modrm.rm)
14080
763
      strcpy (ins->obufp, "/(bad)");
14081
1.46k
  }
14082
14083
1.98k
      if (ins->modrm.reg == ins->modrm.rm || ins->modrm.reg == reg
14084
814
    || ins->modrm.rm == reg)
14085
1.57k
  {
14086
1.57k
    if (ins->modrm.reg <= 8
14087
1.23k
        && (ins->modrm.reg == ins->modrm.rm || ins->modrm.reg == reg))
14088
836
      strcat (ins->op_out[0], "/(bad)");
14089
1.57k
    if (ins->modrm.rm <= 8
14090
1.22k
        && (ins->modrm.rm == ins->modrm.reg || ins->modrm.rm == reg))
14091
851
      strcat (ins->op_out[1], "/(bad)");
14092
1.57k
  }
14093
14094
1.98k
      return true;
14095
14096
2.92k
    case v_mode:
14097
7.11k
    case dq_mode:
14098
7.11k
      if (ins->rex & REX_W)
14099
949
  oappend_register (ins, att_names64[reg]);
14100
6.16k
      else if (bytemode == v_mode
14101
2.44k
         && !(sizeflag & DFLAG))
14102
342
  oappend_register (ins, att_names16[reg]);
14103
5.82k
      else
14104
5.82k
  oappend_register (ins, att_names32[reg]);
14105
7.11k
      return true;
14106
14107
477
    case b_mode:
14108
477
      oappend_register (ins, att_names8rex[reg]);
14109
477
      return true;
14110
14111
750
    case q_mode:
14112
750
      oappend_register (ins, att_names64[reg]);
14113
750
      return true;
14114
51.6k
    }
14115
14116
29.1k
  switch (ins->vex.length)
14117
29.1k
    {
14118
13.0k
    case 128:
14119
13.0k
      switch (bytemode)
14120
13.0k
  {
14121
13.0k
  case x_mode:
14122
13.0k
    names = att_names_xmm;
14123
13.0k
    ins->evex_used |= EVEX_len_used;
14124
13.0k
    break;
14125
0
  case mask_bd_mode:
14126
0
  case mask_mode:
14127
0
    if (reg > 0x7)
14128
0
      {
14129
0
        oappend (ins, "(bad)");
14130
0
        return true;
14131
0
      }
14132
0
    names = att_names_mask;
14133
0
    break;
14134
0
  default:
14135
0
    abort ();
14136
0
    return true;
14137
13.0k
  }
14138
13.0k
      break;
14139
13.0k
    case 256:
14140
7.76k
      switch (bytemode)
14141
7.76k
  {
14142
6.52k
  case x_mode:
14143
6.52k
    names = att_names_ymm;
14144
6.52k
    ins->evex_used |= EVEX_len_used;
14145
6.52k
    break;
14146
0
  case mask_bd_mode:
14147
1.23k
  case mask_mode:
14148
1.23k
    if (reg <= 0x7)
14149
600
      {
14150
600
        names = att_names_mask;
14151
600
        break;
14152
600
      }
14153
    /* Fall through.  */
14154
637
  default:
14155
    /* See PR binutils/20893 for a reproducer.  */
14156
637
    oappend (ins, "(bad)");
14157
637
    return true;
14158
7.76k
  }
14159
7.12k
      break;
14160
8.31k
    case 512:
14161
8.31k
      names = att_names_zmm;
14162
8.31k
      ins->evex_used |= EVEX_len_used;
14163
8.31k
      break;
14164
0
    default:
14165
0
      abort ();
14166
0
      break;
14167
29.1k
    }
14168
28.4k
  oappend_register (ins, names[reg]);
14169
28.4k
  return true;
14170
29.1k
}
14171
14172
static bool
14173
OP_VexR (instr_info *ins, int bytemode, int sizeflag)
14174
4.02k
{
14175
4.02k
  if (ins->modrm.mod == 3)
14176
1.83k
    return OP_VEX (ins, bytemode, sizeflag);
14177
2.18k
  return true;
14178
4.02k
}
14179
14180
static bool
14181
OP_VexW (instr_info *ins, int bytemode, int sizeflag)
14182
1.03k
{
14183
1.03k
  OP_VEX (ins, bytemode, sizeflag);
14184
14185
1.03k
  if (ins->vex.w)
14186
723
    {
14187
      /* Swap 2nd and 3rd operands.  */
14188
723
      char *tmp = ins->op_out[2];
14189
14190
723
      ins->op_out[2] = ins->op_out[1];
14191
723
      ins->op_out[1] = tmp;
14192
723
    }
14193
1.03k
  return true;
14194
1.03k
}
14195
14196
static bool
14197
OP_REG_VexI4 (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
14198
1.92k
{
14199
1.92k
  int reg;
14200
1.92k
  const char (*names)[8] = att_names_xmm;
14201
14202
1.92k
  if (!fetch_code (ins->info, ins->codep + 1))
14203
203
    return false;
14204
1.72k
  reg = *ins->codep++;
14205
14206
1.72k
  if (bytemode != x_mode && bytemode != scalar_mode)
14207
0
    abort ();
14208
14209
1.72k
  reg >>= 4;
14210
1.72k
  if (ins->address_mode != mode_64bit)
14211
452
    reg &= 7;
14212
14213
1.72k
  if (bytemode == x_mode && ins->vex.length == 256)
14214
683
    names = att_names_ymm;
14215
14216
1.72k
  oappend_register (ins, names[reg]);
14217
14218
1.72k
  if (ins->vex.w)
14219
781
    {
14220
      /* Swap 3rd and 4th operands.  */
14221
781
      char *tmp = ins->op_out[3];
14222
14223
781
      ins->op_out[3] = ins->op_out[2];
14224
781
      ins->op_out[2] = tmp;
14225
781
    }
14226
1.72k
  return true;
14227
1.72k
}
14228
14229
static bool
14230
OP_VexI4 (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
14231
    int sizeflag ATTRIBUTE_UNUSED)
14232
1.18k
{
14233
1.18k
  oappend_immediate (ins, ins->codep[-1] & 0xf);
14234
1.18k
  return true;
14235
1.18k
}
14236
14237
static bool
14238
VPCMP_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
14239
       int sizeflag ATTRIBUTE_UNUSED)
14240
2.76k
{
14241
2.76k
  unsigned int cmp_type;
14242
14243
2.76k
  if (!ins->vex.evex)
14244
0
    abort ();
14245
14246
2.76k
  if (!fetch_code (ins->info, ins->codep + 1))
14247
247
    return false;
14248
2.51k
  cmp_type = *ins->codep++;
14249
  /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
14250
     If it's the case, print suffix, otherwise - print the immediate.  */
14251
2.51k
  if (cmp_type < ARRAY_SIZE (simd_cmp_op)
14252
1.87k
      && cmp_type != 3
14253
1.64k
      && cmp_type != 7)
14254
1.29k
    {
14255
1.29k
      char suffix[3];
14256
1.29k
      char *p = ins->mnemonicendp - 2;
14257
14258
      /* vpcmp* can have both one- and two-lettered suffix.  */
14259
1.29k
      if (p[0] == 'p')
14260
1.05k
  {
14261
1.05k
    p++;
14262
1.05k
    suffix[0] = p[0];
14263
1.05k
    suffix[1] = '\0';
14264
1.05k
  }
14265
238
      else
14266
238
  {
14267
238
    suffix[0] = p[0];
14268
238
    suffix[1] = p[1];
14269
238
    suffix[2] = '\0';
14270
238
  }
14271
14272
1.29k
      sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
14273
1.29k
      ins->mnemonicendp += simd_cmp_op[cmp_type].len;
14274
1.29k
    }
14275
1.22k
  else
14276
1.22k
    {
14277
      /* We have a reserved extension byte.  Output it directly.  */
14278
1.22k
      oappend_immediate (ins, cmp_type);
14279
1.22k
    }
14280
2.51k
  return true;
14281
2.76k
}
14282
14283
static const struct op xop_cmp_op[] =
14284
{
14285
  { STRING_COMMA_LEN ("lt") },
14286
  { STRING_COMMA_LEN ("le") },
14287
  { STRING_COMMA_LEN ("gt") },
14288
  { STRING_COMMA_LEN ("ge") },
14289
  { STRING_COMMA_LEN ("eq") },
14290
  { STRING_COMMA_LEN ("neq") },
14291
  { STRING_COMMA_LEN ("false") },
14292
  { STRING_COMMA_LEN ("true") }
14293
};
14294
14295
static bool
14296
VPCOM_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
14297
       int sizeflag ATTRIBUTE_UNUSED)
14298
1.44k
{
14299
1.44k
  unsigned int cmp_type;
14300
14301
1.44k
  if (!fetch_code (ins->info, ins->codep + 1))
14302
110
    return false;
14303
1.33k
  cmp_type = *ins->codep++;
14304
1.33k
  if (cmp_type < ARRAY_SIZE (xop_cmp_op))
14305
598
    {
14306
598
      char suffix[3];
14307
598
      char *p = ins->mnemonicendp - 2;
14308
14309
      /* vpcom* can have both one- and two-lettered suffix.  */
14310
598
      if (p[0] == 'm')
14311
226
  {
14312
226
    p++;
14313
226
    suffix[0] = p[0];
14314
226
    suffix[1] = '\0';
14315
226
  }
14316
372
      else
14317
372
  {
14318
372
    suffix[0] = p[0];
14319
372
    suffix[1] = p[1];
14320
372
    suffix[2] = '\0';
14321
372
  }
14322
14323
598
      sprintf (p, "%s%s", xop_cmp_op[cmp_type].name, suffix);
14324
598
      ins->mnemonicendp += xop_cmp_op[cmp_type].len;
14325
598
    }
14326
737
  else
14327
737
    {
14328
      /* We have a reserved extension byte.  Output it directly.  */
14329
737
      oappend_immediate (ins, cmp_type);
14330
737
    }
14331
1.33k
  return true;
14332
1.44k
}
14333
14334
static const struct op pclmul_op[] =
14335
{
14336
  { STRING_COMMA_LEN ("lql") },
14337
  { STRING_COMMA_LEN ("hql") },
14338
  { STRING_COMMA_LEN ("lqh") },
14339
  { STRING_COMMA_LEN ("hqh") }
14340
};
14341
14342
static bool
14343
PCLMUL_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
14344
        int sizeflag ATTRIBUTE_UNUSED)
14345
2.72k
{
14346
2.72k
  unsigned int pclmul_type;
14347
14348
2.72k
  if (!fetch_code (ins->info, ins->codep + 1))
14349
167
    return false;
14350
2.56k
  pclmul_type = *ins->codep++;
14351
2.56k
  switch (pclmul_type)
14352
2.56k
    {
14353
327
    case 0x10:
14354
327
      pclmul_type = 2;
14355
327
      break;
14356
394
    case 0x11:
14357
394
      pclmul_type = 3;
14358
394
      break;
14359
1.84k
    default:
14360
1.84k
      break;
14361
2.56k
    }
14362
2.56k
  if (pclmul_type < ARRAY_SIZE (pclmul_op))
14363
984
    {
14364
984
      char suffix[4];
14365
984
      char *p = ins->mnemonicendp - 3;
14366
984
      suffix[0] = p[0];
14367
984
      suffix[1] = p[1];
14368
984
      suffix[2] = p[2];
14369
984
      suffix[3] = '\0';
14370
984
      sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
14371
984
      ins->mnemonicendp += pclmul_op[pclmul_type].len;
14372
984
    }
14373
1.57k
  else
14374
1.57k
    {
14375
      /* We have a reserved extension byte.  Output it directly.  */
14376
1.57k
      oappend_immediate (ins, pclmul_type);
14377
1.57k
    }
14378
2.56k
  return true;
14379
2.56k
}
14380
14381
static bool
14382
MOVSXD_Fixup (instr_info *ins, int bytemode, int sizeflag)
14383
13.8k
{
14384
  /* Add proper suffix to "movsxd".  */
14385
13.8k
  char *p = ins->mnemonicendp;
14386
14387
13.8k
  switch (bytemode)
14388
13.8k
    {
14389
13.8k
    case movsxd_mode:
14390
13.8k
      if (!ins->intel_syntax)
14391
10.8k
  {
14392
10.8k
    USED_REX (REX_W);
14393
10.8k
    if (ins->rex & REX_W)
14394
833
      {
14395
833
        *p++ = 'l';
14396
833
        *p++ = 'q';
14397
833
        break;
14398
833
      }
14399
10.8k
  }
14400
14401
13.0k
      *p++ = 'x';
14402
13.0k
      *p++ = 'd';
14403
13.0k
      break;
14404
0
    default:
14405
0
      oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
14406
0
      break;
14407
13.8k
    }
14408
14409
13.8k
  ins->mnemonicendp = p;
14410
13.8k
  *p = '\0';
14411
13.8k
  return OP_E (ins, bytemode, sizeflag);
14412
13.8k
}
14413
14414
static bool
14415
DistinctDest_Fixup (instr_info *ins, int bytemode, int sizeflag)
14416
5.66k
{
14417
5.66k
  unsigned int reg = ins->vex.register_specifier;
14418
5.66k
  unsigned int modrm_reg = ins->modrm.reg;
14419
5.66k
  unsigned int modrm_rm = ins->modrm.rm;
14420
14421
  /* Calc destination register number.  */
14422
5.66k
  if (ins->rex & REX_R)
14423
718
    modrm_reg += 8;
14424
5.66k
  if (ins->rex2 & REX_R)
14425
1.33k
    modrm_reg += 16;
14426
14427
  /* Calc src1 register number.  */
14428
5.66k
  if (ins->address_mode != mode_64bit)
14429
1.08k
    reg &= 7;
14430
4.58k
  else if (ins->vex.evex && !ins->vex.v)
14431
2.34k
    reg += 16;
14432
14433
  /* Calc src2 register number.  */
14434
5.66k
  if (ins->modrm.mod == 3)
14435
1.96k
    {
14436
1.96k
      if (ins->rex & REX_B)
14437
1.29k
        modrm_rm += 8;
14438
1.96k
      if (ins->rex & REX_X)
14439
570
        modrm_rm += 16;
14440
1.96k
    }
14441
14442
  /* Destination and source registers must be distinct, output bad if
14443
     dest == src1 or dest == src2.  */
14444
5.66k
  if (modrm_reg == reg
14445
3.64k
      || (ins->modrm.mod == 3
14446
1.96k
    && modrm_reg == modrm_rm))
14447
2.24k
    {
14448
2.24k
      oappend (ins, "(bad)");
14449
2.24k
      return true;
14450
2.24k
    }
14451
3.41k
  return OP_XMM (ins, bytemode, sizeflag);
14452
5.66k
}
14453
14454
static bool
14455
OP_Rounding (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
14456
20.3k
{
14457
20.3k
  if (ins->modrm.mod != 3 || !ins->vex.b)
14458
16.3k
    return true;
14459
14460
3.96k
  ins->evex_used |= EVEX_b_used;
14461
3.96k
  switch (bytemode)
14462
3.96k
    {
14463
1.08k
    case evex_rounding_64_mode:
14464
1.08k
      if (ins->address_mode != mode_64bit || !ins->vex.w)
14465
713
        return true;
14466
      /* Fall through.  */
14467
2.39k
    case evex_rounding_mode:
14468
2.39k
      oappend (ins, names_rounding[ins->vex.ll]);
14469
2.39k
      break;
14470
858
    case evex_sae_mode:
14471
858
      oappend (ins, "{");
14472
858
      break;
14473
0
    default:
14474
0
      abort ();
14475
3.96k
    }
14476
3.25k
  oappend (ins, "sae}");
14477
3.25k
  return true;
14478
3.96k
}
14479
14480
static bool
14481
PREFETCHI_Fixup (instr_info *ins, int bytemode, int sizeflag)
14482
1.81k
{
14483
1.81k
  if (ins->modrm.mod != 0 || ins->modrm.rm != 5)
14484
1.60k
    {
14485
1.60k
      if (ins->intel_syntax)
14486
425
  {
14487
425
    ins->mnemonicendp = stpcpy (ins->obuf, "nop   ");
14488
425
  }
14489
1.17k
      else
14490
1.17k
  {
14491
1.17k
    USED_REX (REX_W);
14492
1.17k
    if (ins->rex & REX_W)
14493
401
      ins->mnemonicendp = stpcpy (ins->obuf, "nopq  ");
14494
775
    else
14495
775
      {
14496
775
        if (sizeflag & DFLAG)
14497
583
    ins->mnemonicendp = stpcpy (ins->obuf, "nopl  ");
14498
192
        else
14499
192
    ins->mnemonicendp = stpcpy (ins->obuf, "nopw  ");
14500
775
        ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
14501
775
      }
14502
1.17k
  }
14503
1.60k
      bytemode = v_mode;
14504
1.60k
    }
14505
14506
1.81k
  return OP_M (ins, bytemode, sizeflag);
14507
1.81k
}
14508
14509
static bool
14510
PUSH2_POP2_Fixup (instr_info *ins, int bytemode, int sizeflag)
14511
2.05k
{
14512
2.05k
  if (ins->modrm.mod != 3)
14513
305
    return true;
14514
14515
1.75k
  unsigned int vvvv_reg = ins->vex.register_specifier
14516
1.75k
    | (!ins->vex.v << 4);
14517
1.75k
  unsigned int rm_reg = ins->modrm.rm + (ins->rex & REX_B ? 8 : 0)
14518
1.75k
    + (ins->rex2 & REX_B ? 16 : 0);
14519
14520
  /* Push2/Pop2 cannot use RSP and Pop2 cannot pop two same registers.  */
14521
1.75k
  if (!ins->vex.nd || vvvv_reg == 0x4 || rm_reg == 0x4
14522
940
      || (!ins->modrm.reg
14523
403
    && vvvv_reg == rm_reg))
14524
1.00k
    {
14525
1.00k
      oappend (ins, "(bad)");
14526
1.00k
      return true;
14527
1.00k
    }
14528
14529
750
  return OP_VEX (ins, bytemode, sizeflag);
14530
1.75k
}
14531
14532
static bool
14533
JMPABS_Fixup (instr_info *ins, int bytemode, int sizeflag)
14534
15.4k
{
14535
15.4k
  if (ins->last_rex2_prefix >= 0)
14536
1.78k
    {
14537
1.78k
      uint64_t op;
14538
14539
1.78k
      if ((ins->prefixes & (PREFIX_OPCODE | PREFIX_ADDR | PREFIX_LOCK)) != 0x0
14540
1.51k
    || (ins->rex & REX_W) != 0x0)
14541
1.22k
  {
14542
1.22k
    oappend (ins, "(bad)");
14543
1.22k
    return true;
14544
1.22k
  }
14545
14546
560
      if (bytemode == eAX_reg)
14547
280
  return true;
14548
14549
280
      if (!get64 (ins, &op))
14550
63
  return false;
14551
14552
217
      ins->mnemonicendp = stpcpy (ins->obuf, "jmpabs");
14553
217
      ins->rex2 |= REX2_SPECIAL;
14554
217
      oappend_immediate (ins, op);
14555
14556
217
      return true;
14557
280
    }
14558
14559
13.6k
  if (bytemode == eAX_reg)
14560
6.81k
    return OP_IMREG (ins, bytemode, sizeflag);
14561
6.81k
  return OP_OFF64 (ins, bytemode, sizeflag);
14562
13.6k
}
14563
14564
static bool
14565
CFCMOV_Fixup (instr_info *ins, int opnd, int sizeflag)
14566
4.90k
{
14567
  /* EVEX.NF is used as a direction bit in the 2-operand case to reverse the
14568
     source and destination operands.  */
14569
4.90k
  bool dstmem = !ins->vex.nd && ins->vex.nf;
14570
14571
4.90k
  if (opnd == 0)
14572
2.48k
    {
14573
2.48k
      if (dstmem)
14574
510
  return OP_E (ins, v_swap_mode, sizeflag);
14575
1.97k
      return OP_G (ins, v_mode, sizeflag);
14576
2.48k
    }
14577
14578
  /* These bits have been consumed and should be cleared.  */
14579
2.42k
  ins->vex.nf = false;
14580
2.42k
  ins->vex.mask_register_specifier = 0;
14581
14582
2.42k
  if (dstmem)
14583
448
    return OP_G (ins, v_mode, sizeflag);
14584
1.97k
  return OP_E (ins, v_mode, sizeflag);
14585
2.42k
}