Coverage Report

Created: 2026-07-25 10:20

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
235M
#define STYLE_MARKER_CHAR '\002'
120
121
/* The maximum operand buffer size.  */
122
#define MAX_OPERAND_BUFFER_SIZE 128
123
124
/* The comment buffer size.  */
125
0
#define COMMENT_BUFFER_SIZE 128
126
127
enum address_mode
128
{
129
  mode_16bit,
130
  mode_32bit,
131
  mode_64bit
132
};
133
134
static const char *prefix_name (enum address_mode, uint8_t, int);
135
136
enum x86_64_isa
137
{
138
  amd64 = 1,
139
  intel64
140
};
141
142
enum evex_type
143
{
144
  evex_default = 0,
145
  evex_from_legacy,
146
  evex_from_vex,
147
};
148
149
struct instr_info
150
{
151
  enum address_mode address_mode;
152
153
  /* Flags for the prefixes for the current instruction.  See below.  */
154
  int prefixes;
155
156
  /* REX prefix the current instruction.  See below.  */
157
  uint8_t rex;
158
  /* Bits of REX we've already used.  */
159
  uint8_t rex_used;
160
161
  /* Record W R4 X4 B4 bits for rex2.  */
162
  unsigned char rex2;
163
  /* Bits of rex2 we've already used.  */
164
  unsigned char rex2_used;
165
  unsigned char rex2_payload;
166
167
  bool need_modrm;
168
  unsigned char condition_code;
169
  unsigned char need_vex;
170
  bool has_sib;
171
172
  /* Flags for ins->prefixes which we somehow handled when printing the
173
     current instruction.  */
174
  int used_prefixes;
175
176
  /* Flags for EVEX bits which we somehow handled when printing the
177
     current instruction.  */
178
  int evex_used;
179
180
  char obuf[MAX_OPERAND_BUFFER_SIZE];
181
  char *obufp;
182
  char *cbufp;
183
  char *mnemonicendp;
184
  const uint8_t *start_codep;
185
  uint8_t *codep;
186
  const uint8_t *end_codep;
187
  unsigned char nr_prefixes;
188
  signed char last_lock_prefix;
189
  signed char last_repz_prefix;
190
  signed char last_repnz_prefix;
191
  signed char last_data_prefix;
192
  signed char last_addr_prefix;
193
  signed char last_rex_prefix;
194
  signed char last_rex2_prefix;
195
  signed char last_seg_prefix;
196
  signed char fwait_prefix;
197
  /* The active segment register prefix.  */
198
  unsigned char active_seg_prefix;
199
200
11.5M
#define MAX_CODE_LENGTH 15
201
  /* We can up to 14 ins->prefixes since the maximum instruction length is
202
     15bytes.  */
203
  uint8_t all_prefixes[MAX_CODE_LENGTH - 1];
204
  disassemble_info *info;
205
206
  struct
207
  {
208
    int mod;
209
    int reg;
210
    int rm;
211
  }
212
  modrm;
213
214
  struct
215
  {
216
    int scale;
217
    int index;
218
    int base;
219
  }
220
  sib;
221
222
  struct
223
  {
224
    int register_specifier;
225
    int length;
226
    int prefix;
227
    int mask_register_specifier;
228
    int scc;
229
    int ll;
230
    bool w;
231
    bool evex;
232
    bool v;
233
    bool zeroing;
234
    bool b;
235
    bool no_broadcast;
236
    bool nf;
237
  }
238
  vex;
239
240
/* For APX EVEX-promoted prefix, EVEX.ND shares the same bit as vex.b.  */
241
15.3M
#define nd b
242
243
  enum evex_type evex_type;
244
245
  /* Remember if the current op is a jump instruction.  */
246
  bool op_is_jump;
247
248
  bool two_source_ops;
249
250
  /* Record whether EVEX masking is used incorrectly.  */
251
  bool illegal_masking;
252
253
  /* Record whether the modrm byte has been skipped.  */
254
  bool has_skipped_modrm;
255
256
  unsigned char op_ad;
257
  signed char op_index[MAX_OPERANDS];
258
  bool op_riprel[MAX_OPERANDS];
259
  char *op_out[MAX_OPERANDS];
260
  char *cm_out[MAX_OPERANDS];
261
  bfd_vma op_address[MAX_OPERANDS];
262
  bfd_vma start_pc;
263
264
  /* On the 386's of 1988, the maximum length of an instruction is 15 bytes.
265
   *   (see topic "Redundant ins->prefixes" in the "Differences from 8086"
266
   *   section of the "Virtual 8086 Mode" chapter.)
267
   * 'pc' should be the address of this instruction, it will
268
   *   be used to print the target address if this is a relative jump or call
269
   * The function returns the length of this instruction in bytes.
270
   */
271
  char intel_syntax;
272
  bool intel_mnemonic;
273
  char open_char;
274
  char close_char;
275
  char separator_char;
276
  char scale_char;
277
278
  bool annotate_immediates;
279
280
  enum x86_64_isa isa64;
281
};
282
283
struct dis_private {
284
  bfd_vma insn_start;
285
  int orig_sizeflag;
286
287
  /* Indexes first byte not fetched.  */
288
  unsigned int fetched;
289
  uint8_t the_buffer[2 * MAX_CODE_LENGTH - 1];
290
};
291
292
/* Mark parts used in the REX prefix.  When we are testing for
293
   empty prefix (for 8bit register REX extension), just mask it
294
   out.  Otherwise test for REX bit is excuse for existence of REX
295
   only in case value is nonzero.  */
296
#define USED_REX(value)         \
297
7.44M
  {             \
298
7.44M
    if (value)           \
299
7.44M
      {             \
300
7.04M
  if (ins->rex & value)       \
301
7.04M
    ins->rex_used |= (value) | REX_OPCODE; \
302
7.04M
  if (ins->rex2 & value)       \
303
7.04M
    {           \
304
77.9k
      ins->rex2_used |= (value);      \
305
77.9k
      ins->rex_used |= REX_OPCODE;   \
306
77.9k
    }            \
307
7.04M
      }              \
308
7.44M
    else            \
309
7.44M
      ins->rex_used |= REX_OPCODE;     \
310
7.44M
  }
311
312
313
48.7k
#define EVEX_b_used 1
314
121k
#define EVEX_len_used 2
315
316
317
/* {rex2} is not printed when the REX2_SPECIAL is set.  */
318
34.0k
#define REX2_SPECIAL 16
319
320
/* Flags stored in PREFIXES.  */
321
467k
#define PREFIX_REPZ 1
322
639k
#define PREFIX_REPNZ 2
323
6.07M
#define PREFIX_CS 4
324
5.10M
#define PREFIX_SS 8
325
5.98M
#define PREFIX_DS 0x10
326
5.12M
#define PREFIX_ES 0x20
327
5.24M
#define PREFIX_FS 0x40
328
5.23M
#define PREFIX_GS 0x80
329
1.59M
#define PREFIX_LOCK 0x100
330
12.9M
#define PREFIX_DATA 0x200
331
13.1M
#define PREFIX_ADDR 0x400
332
5.31M
#define PREFIX_FWAIT 0x800
333
10.2M
#define PREFIX_REX2 0x1000
334
33.3k
#define PREFIX_NP_OR_DATA 0x2000
335
27.1k
#define NO_PREFIX   0x4000
336
337
/* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
338
   to ADDR (exclusive) are valid.  Returns true for success, false
339
   on error.  */
340
static bool
341
fetch_code (struct disassemble_info *info, const uint8_t *until)
342
17.2M
{
343
17.2M
  int status = -1;
344
17.2M
  struct dis_private *priv = info->private_data;
345
17.2M
  bfd_vma start = priv->insn_start + priv->fetched;
346
17.2M
  uint8_t *fetch_end = priv->the_buffer + priv->fetched;
347
17.2M
  ptrdiff_t needed = until - fetch_end;
348
349
17.2M
  if (needed <= 0)
350
5.24M
    return true;
351
352
11.9M
  if (priv->fetched + (size_t) needed <= ARRAY_SIZE (priv->the_buffer))
353
11.9M
    status = (*info->read_memory_func) (start, fetch_end, needed, info);
354
11.9M
  if (status != 0)
355
51.3k
    {
356
      /* If we did manage to read at least one byte, then
357
   print_insn_i386 will do something sensible.  Otherwise, print
358
   an error.  We do that here because this is where we know
359
   STATUS.  */
360
51.3k
      if (!priv->fetched)
361
822
  (*info->memory_error_func) (status, start, info);
362
51.3k
      return false;
363
51.3k
    }
364
365
11.9M
  priv->fetched += needed;
366
11.9M
  return true;
367
11.9M
}
368
369
static bool
370
fetch_modrm (instr_info *ins)
371
3.36M
{
372
3.36M
  if (!fetch_code (ins->info, ins->codep + 1))
373
7.14k
    return false;
374
375
3.35M
  ins->modrm.mod = (*ins->codep >> 6) & 3;
376
3.35M
  ins->modrm.reg = (*ins->codep >> 3) & 7;
377
3.35M
  ins->modrm.rm = *ins->codep & 7;
378
379
3.35M
  return true;
380
3.36M
}
381
382
static int
383
fetch_error (const instr_info *ins)
384
52.4k
{
385
  /* Getting here means we tried for data but didn't get it.  That
386
     means we have an incomplete instruction of some sort.  Just
387
     print the first byte as a prefix or a .byte pseudo-op.  */
388
52.4k
  const struct dis_private *priv = ins->info->private_data;
389
52.4k
  const char *name = NULL;
390
391
52.4k
  if (ins->codep <= priv->the_buffer)
392
822
    return -1;
393
394
51.6k
  if (ins->prefixes || ins->fwait_prefix >= 0 || (ins->rex & REX_OPCODE))
395
34.2k
    name = prefix_name (ins->address_mode, priv->the_buffer[0],
396
34.2k
      priv->orig_sizeflag);
397
51.6k
  if (name != NULL)
398
33.9k
    i386_dis_printf (ins->info, dis_style_mnemonic, "%s", name);
399
17.6k
  else
400
17.6k
    {
401
      /* Just print the first byte as a .byte instruction.  */
402
17.6k
      i386_dis_printf (ins->info, dis_style_assembler_directive, ".byte ");
403
17.6k
      i386_dis_printf (ins->info, dis_style_immediate, "%#x",
404
17.6k
           (unsigned int) priv->the_buffer[0]);
405
17.6k
    }
406
407
51.6k
  return 1;
408
52.4k
}
409
410
/* Possible values for prefix requirement.  */
411
10.2M
#define PREFIX_IGNORED_SHIFT  16
412
13.5k
#define PREFIX_IGNORED_REPZ (PREFIX_REPZ << PREFIX_IGNORED_SHIFT)
413
13.5k
#define PREFIX_IGNORED_REPNZ  (PREFIX_REPNZ << PREFIX_IGNORED_SHIFT)
414
13.5k
#define PREFIX_IGNORED_DATA (PREFIX_DATA << PREFIX_IGNORED_SHIFT)
415
#define PREFIX_IGNORED_ADDR (PREFIX_ADDR << PREFIX_IGNORED_SHIFT)
416
#define PREFIX_IGNORED_LOCK (PREFIX_LOCK << PREFIX_IGNORED_SHIFT)
417
10.2M
#define PREFIX_REX2_ILLEGAL (PREFIX_REX2 << PREFIX_IGNORED_SHIFT)
418
419
/* Opcode prefixes.  */
420
58.2k
#define PREFIX_OPCODE   (PREFIX_REPZ \
421
58.2k
         | PREFIX_REPNZ \
422
58.2k
         | PREFIX_DATA)
423
424
/* Prefixes ignored.  */
425
13.5k
#define PREFIX_IGNORED    (PREFIX_IGNORED_REPZ \
426
13.5k
         | PREFIX_IGNORED_REPNZ \
427
13.5k
         | PREFIX_IGNORED_DATA)
428
429
#define XX { NULL, 0 }
430
#define Bad_Opcode NULL, { { NULL, 0 } }, 0
431
432
#define Eb { OP_E, b_mode }
433
#define Ebnd { OP_E, bnd_mode }
434
#define EbS { OP_E, b_swap_mode }
435
#define EbndS { OP_E, bnd_swap_mode }
436
#define Ev { OP_E, v_mode }
437
#define Eva { OP_E, va_mode }
438
#define Ev_bnd { OP_E, v_bnd_mode }
439
#define EvS { OP_E, v_swap_mode }
440
#define Ed { OP_E, d_mode }
441
#define Edq { OP_E, dq_mode }
442
#define Edb { OP_E, db_mode }
443
#define Edw { OP_E, dw_mode }
444
#define Eq { OP_E, q_mode }
445
#define indirEv { OP_indirE, indir_v_mode }
446
#define indirEp { OP_indirE, f_mode }
447
#define stackEv { OP_E, stack_v_mode }
448
#define Em { OP_E, m_mode }
449
#define Ew { OP_E, w_mode }
450
#define M { OP_M, 0 }   /* lea, lgdt, etc. */
451
#define Ma { OP_M, a_mode }
452
#define Mb { OP_M, b_mode }
453
#define Md { OP_M, d_mode }
454
#define Mdq { OP_M, dq_mode }
455
#define Mo { OP_M, o_mode }
456
#define Mp { OP_M, f_mode }   /* 32 or 48 bit memory operand for LDS, LES etc */
457
#define Mq { OP_M, q_mode }
458
#define Mv { OP_M, v_mode }
459
#define Mv_bnd { OP_M, v_bndmk_mode }
460
#define Mw { OP_M, w_mode }
461
#define Mx { OP_M, x_mode }
462
#define Mxmm { OP_M, xmm_mode }
463
#define Mymm { OP_M, ymm_mode }
464
#define Gb { OP_G, b_mode }
465
#define Gbnd { OP_G, bnd_mode }
466
#define Gv { OP_G, v_mode }
467
#define Gd { OP_G, d_mode }
468
#define Gdq { OP_G, dq_mode }
469
#define Gq { OP_G, q_mode }
470
#define Gm { OP_G, m_mode }
471
#define Gva { OP_G, va_mode }
472
#define Gw { OP_G, w_mode }
473
#define Ib { OP_I, b_mode }
474
#define sIb { OP_sI, b_mode } /* sign extened byte */
475
#define sIbT { OP_sI, b_T_mode } /* sign extened byte like 'T' */
476
#define Iv { OP_I, v_mode }
477
#define sIv { OP_sI, v_mode }
478
#define Iv64 { OP_I64, v_mode }
479
#define Id { OP_I, d_mode }
480
#define Iw { OP_I, w_mode }
481
#define I1 { OP_I, const_1_mode }
482
#define Jb { OP_J, b_mode }
483
#define Jv { OP_J, v_mode }
484
#define Jdqw { OP_J, dqw_mode }
485
#define Cm { OP_C, m_mode }
486
#define Dm { OP_D, m_mode }
487
#define Td { OP_T, d_mode }
488
#define Skip_MODRM { OP_Skip_MODRM, 0 }
489
490
#define RMeAX { OP_REG, eAX_reg }
491
#define RMeBX { OP_REG, eBX_reg }
492
#define RMeCX { OP_REG, eCX_reg }
493
#define RMeDX { OP_REG, eDX_reg }
494
#define RMeSP { OP_REG, eSP_reg }
495
#define RMeBP { OP_REG, eBP_reg }
496
#define RMeSI { OP_REG, eSI_reg }
497
#define RMeDI { OP_REG, eDI_reg }
498
#define RMrAX { OP_REG, rAX_reg }
499
#define RMrBX { OP_REG, rBX_reg }
500
#define RMrCX { OP_REG, rCX_reg }
501
#define RMrDX { OP_REG, rDX_reg }
502
#define RMrSP { OP_REG, rSP_reg }
503
#define RMrBP { OP_REG, rBP_reg }
504
#define RMrSI { OP_REG, rSI_reg }
505
#define RMrDI { OP_REG, rDI_reg }
506
#define RMAL { OP_REG, al_reg }
507
#define RMCL { OP_REG, cl_reg }
508
#define RMDL { OP_REG, dl_reg }
509
#define RMBL { OP_REG, bl_reg }
510
#define RMAH { OP_REG, ah_reg }
511
#define RMCH { OP_REG, ch_reg }
512
#define RMDH { OP_REG, dh_reg }
513
#define RMBH { OP_REG, bh_reg }
514
#define RMAX { OP_REG, ax_reg }
515
#define RMDX { OP_REG, dx_reg }
516
517
#define eAX { OP_IMREG, eAX_reg }
518
#define AL { OP_IMREG, al_reg }
519
#define CL { OP_IMREG, cl_reg }
520
#define zAX { OP_IMREG, z_mode_ax_reg }
521
#define indirDX { OP_IMREG, indir_dx_reg }
522
523
#define Sw { OP_SEG, w_mode }
524
#define Sv { OP_SEG, v_mode }
525
#define Ap { OP_DIR, 0 }
526
#define Ob { OP_OFF64, b_mode }
527
#define Ov { OP_OFF64, v_mode }
528
#define Xb { OP_DSreg, eSI_reg }
529
#define Xv { OP_DSreg, eSI_reg }
530
#define Xz { OP_DSreg, eSI_reg }
531
#define Yb { OP_ESreg, eDI_reg }
532
#define Yv { OP_ESreg, eDI_reg }
533
#define DSCX { OP_DSreg, eCX_reg }
534
#define DSBX { OP_DSreg, eBX_reg }
535
536
#define es { OP_REG, es_reg }
537
#define ss { OP_REG, ss_reg }
538
#define cs { OP_REG, cs_reg }
539
#define ds { OP_REG, ds_reg }
540
#define fs { OP_REG, fs_reg }
541
#define gs { OP_REG, gs_reg }
542
543
#define MX { OP_MMX, 0 }
544
#define XM { OP_XMM, 0 }
545
#define XMScalar { OP_XMM, scalar_mode }
546
#define XMGatherD { OP_XMM, vex_vsib_d_w_dq_mode }
547
#define XMGatherQ { OP_XMM, vex_vsib_q_w_dq_mode }
548
#define XMM { OP_XMM, xmm_mode }
549
#define TMM { OP_XMM, tmm_mode }
550
#define XMxmmq { OP_XMM, xmmq_mode }
551
#define EM { OP_EM, v_mode }
552
#define EMS { OP_EM, v_swap_mode }
553
#define EMd { OP_EM, d_mode }
554
#define EMx { OP_EM, x_mode }
555
#define EXbwUnit { OP_EX, bw_unit_mode }
556
#define EXb { OP_EX, b_mode }
557
#define EXw { OP_EX, w_mode }
558
#define EXd { OP_EX, d_mode }
559
#define EXdS { OP_EX, d_swap_mode }
560
#define EXwS { OP_EX, w_swap_mode }
561
#define EXq { OP_EX, q_mode }
562
#define EXqS { OP_EX, q_swap_mode }
563
#define EXdq { OP_EX, dq_mode }
564
#define EXx { OP_EX, x_mode }
565
#define EXxh { OP_EX, xh_mode }
566
#define EXxS { OP_EX, x_swap_mode }
567
#define EXxmm { OP_EX, xmm_mode }
568
#define EXymm { OP_EX, ymm_mode }
569
#define EXxmmq { OP_EX, xmmq_mode }
570
#define EXxmmqh { OP_EX, evex_half_bcst_xmmqh_mode }
571
#define EXEvexHalfBcstXmmq { OP_EX, evex_half_bcst_xmmq_mode }
572
#define EXxmmdw { OP_EX, xmmdw_mode }
573
#define EXxmmqd { OP_EX, xmmqd_mode }
574
#define EXxmmqdh { OP_EX, evex_half_bcst_xmmqdh_mode }
575
#define EXymmq { OP_EX, ymmq_mode }
576
#define EXEvexXGscat { OP_EX, evex_x_gscat_mode }
577
#define EXEvexXNoBcst { OP_EX, evex_x_nobcst_mode }
578
#define Rd { OP_R, d_mode }
579
#define Rdq { OP_R, dq_mode }
580
#define Rq { OP_R, q_mode }
581
#define Nq { OP_R, q_mm_mode }
582
#define Ux { OP_R, x_mode }
583
#define Uxmm { OP_R, xmm_mode }
584
#define Rxmmq { OP_R, xmmq_mode }
585
#define Rymm { OP_R, ymm_mode }
586
#define Rtmm { OP_R, tmm_mode }
587
#define EMCq { OP_EMC, q_mode }
588
#define MXC { OP_MXC, 0 }
589
#define OPSUF { OP_3DNowSuffix, 0 }
590
#define SEP { SEP_Fixup, 0 }
591
#define CMP { CMP_Fixup, 0 }
592
#define XMM0 { XMM_Fixup, 0 }
593
#define FXSAVE { FXSAVE_Fixup, 0 }
594
595
#define Vex { OP_VEX, x_mode }
596
#define VexW { OP_VexW, x_mode }
597
#define VexScalar { OP_VEX, scalar_mode }
598
#define VexScalarR { OP_VexR, scalar_mode }
599
#define VexGatherD { OP_VEX, vex_vsib_d_w_dq_mode }
600
#define VexGatherQ { OP_VEX, vex_vsib_q_w_dq_mode }
601
#define VexGdq { OP_VEX, dq_mode }
602
#define VexGb { OP_VEX, b_mode }
603
#define VexGv { OP_VEX, v_mode }
604
#define VexTmm { OP_VEX, tmm_mode }
605
#define XMVexI4 { OP_REG_VexI4, x_mode }
606
#define XMVexScalarI4 { OP_REG_VexI4, scalar_mode }
607
#define VexI4 { OP_VexI4, 0 }
608
#define PCLMUL { PCLMUL_Fixup, 0 }
609
#define VPCMP { VPCMP_Fixup, 0 }
610
#define VPCOM { VPCOM_Fixup, 0 }
611
612
#define EXxEVexR { OP_Rounding, evex_rounding_mode }
613
#define EXxEVexR64 { OP_Rounding, evex_rounding_64_mode }
614
#define EXxEVexS { OP_Rounding, evex_sae_mode }
615
616
#define MaskG { OP_G, mask_mode }
617
#define MaskE { OP_E, mask_mode }
618
#define MaskR { OP_R, mask_mode }
619
#define MaskBDE { OP_E, mask_bd_mode }
620
#define MaskVex { OP_VEX, mask_mode }
621
622
#define MVexVSIBDWpX { OP_M, vex_vsib_d_w_dq_mode }
623
#define MVexVSIBQWpX { OP_M, vex_vsib_q_w_dq_mode }
624
625
#define MVexSIBMEM { OP_M, vex_sibmem_mode }
626
627
/* Used handle "rep" prefix for string instructions.  */
628
#define Xbr { REP_Fixup, eSI_reg }
629
#define Xvr { REP_Fixup, eSI_reg }
630
#define Ybr { REP_Fixup, eDI_reg }
631
#define Yvr { REP_Fixup, eDI_reg }
632
#define Yzr { REP_Fixup, eDI_reg }
633
#define indirDXr { REP_Fixup, indir_dx_reg }
634
#define ALr { REP_Fixup, al_reg }
635
#define eAXr { REP_Fixup, eAX_reg }
636
637
/* Used handle HLE prefix for lockable instructions.  */
638
#define Ebh1 { HLE_Fixup1, b_mode }
639
#define Evh1 { HLE_Fixup1, v_mode }
640
#define Ebh2 { HLE_Fixup2, b_mode }
641
#define Evh2 { HLE_Fixup2, v_mode }
642
#define Ebh3 { HLE_Fixup3, b_mode }
643
#define Evh3 { HLE_Fixup3, v_mode }
644
645
#define BND { BND_Fixup, 0 }
646
#define NOTRACK { NOTRACK_Fixup, 0 }
647
648
#define cond_jump_flag { NULL, cond_jump_mode }
649
#define loop_jcxz_flag { NULL, loop_jcxz_mode }
650
651
/* bits in sizeflag */
652
3.28M
#define SUFFIX_ALWAYS 4
653
13.3M
#define AFLAG 2
654
7.50M
#define DFLAG 1
655
656
enum
657
{
658
  /* byte operand */
659
  b_mode = 1,
660
  /* byte operand with operand swapped */
661
  b_swap_mode,
662
  /* byte operand, sign extend like 'T' suffix */
663
  b_T_mode,
664
  /* operand size depends on prefixes */
665
  v_mode,
666
  /* operand size depends on prefixes with operand swapped */
667
  v_swap_mode,
668
  /* operand size depends on address prefix */
669
  va_mode,
670
  /* word operand */
671
  w_mode,
672
  /* double word operand  */
673
  d_mode,
674
  /* word operand with operand swapped  */
675
  w_swap_mode,
676
  /* double word operand with operand swapped */
677
  d_swap_mode,
678
  /* quad word operand */
679
  q_mode,
680
  /* 8-byte MM operand */
681
  q_mm_mode,
682
  /* quad word operand with operand swapped */
683
  q_swap_mode,
684
  /* ten-byte operand */
685
  t_mode,
686
  /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand.  In EVEX with
687
     broadcast enabled.  */
688
  x_mode,
689
  /* Similar to x_mode, but with different EVEX mem shifts.  */
690
  evex_x_gscat_mode,
691
  /* Similar to x_mode, but with yet different EVEX mem shifts.  */
692
  bw_unit_mode,
693
  /* Similar to x_mode, but with disabled broadcast.  */
694
  evex_x_nobcst_mode,
695
  /* Similar to x_mode, but with operands swapped and disabled broadcast
696
     in EVEX.  */
697
  x_swap_mode,
698
  /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand.  In EVEX with
699
     broadcast of 16bit enabled.  */
700
  xh_mode,
701
  /* 16-byte XMM operand */
702
  xmm_mode,
703
  /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
704
     memory operand (depending on vector length).  Broadcast isn't
705
     allowed.  */
706
  xmmq_mode,
707
  /* Same as xmmq_mode, but broadcast is allowed.  */
708
  evex_half_bcst_xmmq_mode,
709
  /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
710
     memory operand (depending on vector length).  16bit broadcast.  */
711
  evex_half_bcst_xmmqh_mode,
712
  /* 16-byte XMM, word, double word or quad word operand.  */
713
  xmmdw_mode,
714
  /* 16-byte XMM, double word, quad word operand or xmm word operand.  */
715
  xmmqd_mode,
716
  /* 16-byte XMM, double word, quad word operand or xmm word operand.
717
     16bit broadcast.  */
718
  evex_half_bcst_xmmqdh_mode,
719
  /* 32-byte YMM operand */
720
  ymm_mode,
721
  /* quad word, ymmword or zmmword memory operand.  */
722
  ymmq_mode,
723
  /* TMM operand */
724
  tmm_mode,
725
  /* d_mode in 32bit, q_mode in 64bit mode.  */
726
  m_mode,
727
  /* pair of v_mode operands */
728
  a_mode,
729
  cond_jump_mode,
730
  loop_jcxz_mode,
731
  movsxd_mode,
732
  v_bnd_mode,
733
  /* like v_bnd_mode in 32bit, no RIP-rel in 64bit mode.  */
734
  v_bndmk_mode,
735
  /* operand size depends on REX.W / VEX.W.  */
736
  dq_mode,
737
  /* Displacements like v_mode without considering Intel64 ISA.  */
738
  dqw_mode,
739
  /* bounds operand */
740
  bnd_mode,
741
  /* bounds operand with operand swapped */
742
  bnd_swap_mode,
743
  /* 4- or 6-byte pointer operand */
744
  f_mode,
745
  const_1_mode,
746
  /* v_mode for indirect branch opcodes.  */
747
  indir_v_mode,
748
  /* v_mode for stack-related opcodes.  */
749
  stack_v_mode,
750
  /* non-quad operand size depends on prefixes */
751
  z_mode,
752
  /* 16-byte operand */
753
  o_mode,
754
  /* registers like d_mode, memory like b_mode.  */
755
  db_mode,
756
  /* registers like d_mode, memory like w_mode.  */
757
  dw_mode,
758
759
  /* Operand size depends on the VEX.W bit, with VSIB dword indices.  */
760
  vex_vsib_d_w_dq_mode,
761
  /* Operand size depends on the VEX.W bit, with VSIB qword indices.  */
762
  vex_vsib_q_w_dq_mode,
763
  /* mandatory non-vector SIB.  */
764
  vex_sibmem_mode,
765
766
  /* scalar, ignore vector length.  */
767
  scalar_mode,
768
769
  /* Static rounding.  */
770
  evex_rounding_mode,
771
  /* Static rounding, 64-bit mode only.  */
772
  evex_rounding_64_mode,
773
  /* Supress all exceptions.  */
774
  evex_sae_mode,
775
776
  /* Mask register operand.  */
777
  mask_mode,
778
  /* Mask register operand.  */
779
  mask_bd_mode,
780
781
  es_reg,
782
  cs_reg,
783
  ss_reg,
784
  ds_reg,
785
  fs_reg,
786
  gs_reg,
787
788
  eAX_reg,
789
  eCX_reg,
790
  eDX_reg,
791
  eBX_reg,
792
  eSP_reg,
793
  eBP_reg,
794
  eSI_reg,
795
  eDI_reg,
796
797
  al_reg,
798
  cl_reg,
799
  dl_reg,
800
  bl_reg,
801
  ah_reg,
802
  ch_reg,
803
  dh_reg,
804
  bh_reg,
805
806
  ax_reg,
807
  cx_reg,
808
  dx_reg,
809
  bx_reg,
810
  sp_reg,
811
  bp_reg,
812
  si_reg,
813
  di_reg,
814
815
  rAX_reg,
816
  rCX_reg,
817
  rDX_reg,
818
  rBX_reg,
819
  rSP_reg,
820
  rBP_reg,
821
  rSI_reg,
822
  rDI_reg,
823
824
  z_mode_ax_reg,
825
  indir_dx_reg
826
};
827
828
enum
829
{
830
  FLOATCODE = 1,
831
  USE_REG_TABLE,
832
  USE_MOD_TABLE,
833
  USE_RM_TABLE,
834
  USE_PREFIX_TABLE,
835
  USE_X86_64_TABLE,
836
  USE_X86_64_EVEX_FROM_VEX_TABLE,
837
  USE_X86_64_EVEX_PFX_TABLE,
838
  USE_X86_64_EVEX_W_TABLE,
839
  USE_X86_64_EVEX_MEM_W_TABLE,
840
  USE_3BYTE_TABLE,
841
  USE_XOP_8F_TABLE,
842
  USE_VEX_C4_TABLE,
843
  USE_VEX_C5_TABLE,
844
  USE_VEX_LEN_TABLE,
845
  USE_VEX_W_TABLE,
846
  USE_EVEX_TABLE,
847
  USE_EVEX_LEN_TABLE
848
};
849
850
#define FLOAT     NULL, { { NULL, FLOATCODE } }, 0
851
852
#define DIS386(T, I)    NULL, { { NULL, (T)}, { NULL,  (I) } }, 0
853
#define REG_TABLE(I)    DIS386 (USE_REG_TABLE, (I))
854
#define MOD_TABLE(I)    DIS386 (USE_MOD_TABLE, (I))
855
#define RM_TABLE(I)   DIS386 (USE_RM_TABLE, (I))
856
#define PREFIX_TABLE(I)   DIS386 (USE_PREFIX_TABLE, (I))
857
#define X86_64_TABLE(I)   DIS386 (USE_X86_64_TABLE, (I))
858
#define X86_64_EVEX_FROM_VEX_TABLE(I) \
859
  DIS386 (USE_X86_64_EVEX_FROM_VEX_TABLE, (I))
860
#define X86_64_EVEX_PFX_TABLE(I) DIS386 (USE_X86_64_EVEX_PFX_TABLE, (I))
861
#define X86_64_EVEX_W_TABLE(I) DIS386 (USE_X86_64_EVEX_W_TABLE, (I))
862
#define X86_64_EVEX_MEM_W_TABLE(I) DIS386 (USE_X86_64_EVEX_MEM_W_TABLE, (I))
863
#define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
864
#define XOP_8F_TABLE()    DIS386 (USE_XOP_8F_TABLE, 0)
865
#define VEX_C4_TABLE()    DIS386 (USE_VEX_C4_TABLE, 0)
866
#define VEX_C5_TABLE()    DIS386 (USE_VEX_C5_TABLE, 0)
867
#define VEX_LEN_TABLE(I)  DIS386 (USE_VEX_LEN_TABLE, (I))
868
#define VEX_W_TABLE(I)    DIS386 (USE_VEX_W_TABLE, (I))
869
#define EVEX_TABLE()    DIS386 (USE_EVEX_TABLE, 0)
870
#define EVEX_LEN_TABLE(I) DIS386 (USE_EVEX_LEN_TABLE, (I))
871
872
enum
873
{
874
  REG_80 = 0,
875
  REG_81,
876
  REG_83,
877
  REG_8F,
878
  REG_C0,
879
  REG_C1,
880
  REG_C6,
881
  REG_C7,
882
  REG_D0,
883
  REG_D1,
884
  REG_D2,
885
  REG_D3,
886
  REG_F6,
887
  REG_F7,
888
  REG_FE,
889
  REG_FF,
890
  REG_0F00,
891
  REG_0F01,
892
  REG_0F0D,
893
  REG_0F18,
894
  REG_0F1C_P_0_MOD_0,
895
  REG_0F1E_P_1_MOD_3,
896
  REG_0F38D8_PREFIX_1,
897
  REG_0F3A0F_P_1,
898
  REG_0F71,
899
  REG_0F72,
900
  REG_0F73,
901
  REG_0FA6,
902
  REG_0FA7,
903
  REG_0FAE,
904
  REG_0FBA,
905
  REG_0FC7,
906
  REG_VEX_0F71,
907
  REG_VEX_0F72,
908
  REG_VEX_0F73,
909
  REG_VEX_0FAE,
910
  REG_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0,
911
  REG_VEX_0F38F3_L_0_P_0,
912
  REG_VEX_MAP7_F6_L_0_W_0,
913
  REG_VEX_MAP7_F8_L_0_W_0,
914
915
  REG_XOP_09_01_L_0,
916
  REG_XOP_09_02_L_0,
917
  REG_XOP_09_12_L_0,
918
  REG_XOP_0A_12_L_0,
919
920
  REG_EVEX_0F71,
921
  REG_EVEX_0F72,
922
  REG_EVEX_0F73,
923
  REG_EVEX_0F38C6_L_2,
924
  REG_EVEX_0F38C7_L_2,
925
  REG_EVEX_MAP4_80,
926
  REG_EVEX_MAP4_81,
927
  REG_EVEX_MAP4_83,
928
  REG_EVEX_MAP4_8F,
929
  REG_EVEX_MAP4_F6,
930
  REG_EVEX_MAP4_F7,
931
  REG_EVEX_MAP4_FE,
932
  REG_EVEX_MAP4_FF,
933
};
934
935
enum
936
{
937
  MOD_62_32BIT = 0,
938
  MOD_C4_32BIT,
939
  MOD_C5_32BIT,
940
  MOD_0F01_REG_0,
941
  MOD_0F01_REG_1,
942
  MOD_0F01_REG_2,
943
  MOD_0F01_REG_3,
944
  MOD_0F01_REG_5,
945
  MOD_0F01_REG_7,
946
  MOD_0F12_PREFIX_0,
947
  MOD_0F16_PREFIX_0,
948
  MOD_0F18_REG_0,
949
  MOD_0F18_REG_1,
950
  MOD_0F18_REG_2,
951
  MOD_0F18_REG_3,
952
  MOD_0F18_REG_4,
953
  MOD_0F18_REG_6,
954
  MOD_0F18_REG_7,
955
  MOD_0F1A_PREFIX_0,
956
  MOD_0F1B_PREFIX_0,
957
  MOD_0F1B_PREFIX_1,
958
  MOD_0F1C_PREFIX_0,
959
  MOD_0F1E_PREFIX_1,
960
  MOD_0FAE_REG_0,
961
  MOD_0FAE_REG_1,
962
  MOD_0FAE_REG_2,
963
  MOD_0FAE_REG_3,
964
  MOD_0FAE_REG_4,
965
  MOD_0FAE_REG_5,
966
  MOD_0FAE_REG_6,
967
  MOD_0FAE_REG_7,
968
  MOD_0FC7_REG_6,
969
  MOD_0FC7_REG_7,
970
  MOD_0F38DC_PREFIX_1,
971
  MOD_0F38F8,
972
973
  MOD_VEX_0F3849_X86_64_L_0_W_0,
974
975
  MOD_EVEX_MAP4_60,
976
  MOD_EVEX_MAP4_61,
977
  MOD_EVEX_MAP4_F8_P_1,
978
  MOD_EVEX_MAP4_F8_P_3,
979
};
980
981
enum
982
{
983
  RM_C6_REG_7 = 0,
984
  RM_C7_REG_7,
985
  RM_0F01_REG_0,
986
  RM_0F01_REG_1,
987
  RM_0F01_REG_2,
988
  RM_0F01_REG_3,
989
  RM_0F01_REG_5_MOD_3,
990
  RM_0F01_REG_7_MOD_3,
991
  RM_0F1E_P_1_MOD_3_REG_7,
992
  RM_0FAE_REG_6_MOD_3_P_0,
993
  RM_0FAE_REG_7_MOD_3,
994
  RM_0F3A0F_P_1_R_0,
995
996
  RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0_R_0,
997
  RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_3,
998
};
999
1000
enum
1001
{
1002
  PREFIX_90 = 0,
1003
  PREFIX_0F00_REG_6_X86_64,
1004
  PREFIX_0F01_REG_0_MOD_3_RM_6,
1005
  PREFIX_0F01_REG_0_MOD_3_RM_7,
1006
  PREFIX_0F01_REG_1_RM_2,
1007
  PREFIX_0F01_REG_1_RM_4,
1008
  PREFIX_0F01_REG_1_RM_5,
1009
  PREFIX_0F01_REG_1_RM_6,
1010
  PREFIX_0F01_REG_1_RM_7,
1011
  PREFIX_0F01_REG_3_RM_1,
1012
  PREFIX_0F01_REG_5_MOD_0,
1013
  PREFIX_0F01_REG_5_MOD_3_RM_0,
1014
  PREFIX_0F01_REG_5_MOD_3_RM_1,
1015
  PREFIX_0F01_REG_5_MOD_3_RM_2,
1016
  PREFIX_0F01_REG_5_MOD_3_RM_4,
1017
  PREFIX_0F01_REG_5_MOD_3_RM_5,
1018
  PREFIX_0F01_REG_5_MOD_3_RM_6,
1019
  PREFIX_0F01_REG_5_MOD_3_RM_7,
1020
  PREFIX_0F01_REG_7_MOD_3_RM_2,
1021
  PREFIX_0F01_REG_7_MOD_3_RM_5,
1022
  PREFIX_0F01_REG_7_MOD_3_RM_6,
1023
  PREFIX_0F01_REG_7_MOD_3_RM_7,
1024
  PREFIX_0F09,
1025
  PREFIX_0F10,
1026
  PREFIX_0F11,
1027
  PREFIX_0F12,
1028
  PREFIX_0F16,
1029
  PREFIX_0F18_REG_6_MOD_0_X86_64,
1030
  PREFIX_0F18_REG_7_MOD_0_X86_64,
1031
  PREFIX_0F1A,
1032
  PREFIX_0F1B,
1033
  PREFIX_0F1C,
1034
  PREFIX_0F1E,
1035
  PREFIX_0F2A,
1036
  PREFIX_0F2B,
1037
  PREFIX_0F2C,
1038
  PREFIX_0F2D,
1039
  PREFIX_0F2E,
1040
  PREFIX_0F2F,
1041
  PREFIX_0F51,
1042
  PREFIX_0F52,
1043
  PREFIX_0F53,
1044
  PREFIX_0F58,
1045
  PREFIX_0F59,
1046
  PREFIX_0F5A,
1047
  PREFIX_0F5B,
1048
  PREFIX_0F5C,
1049
  PREFIX_0F5D,
1050
  PREFIX_0F5E,
1051
  PREFIX_0F5F,
1052
  PREFIX_0F60,
1053
  PREFIX_0F61,
1054
  PREFIX_0F62,
1055
  PREFIX_0F6F,
1056
  PREFIX_0F70,
1057
  PREFIX_0F78,
1058
  PREFIX_0F79,
1059
  PREFIX_0F7C,
1060
  PREFIX_0F7D,
1061
  PREFIX_0F7E,
1062
  PREFIX_0F7F,
1063
  PREFIX_0FA6_REG_0,
1064
  PREFIX_0FA6_REG_5,
1065
  PREFIX_0FA7_REG_6,
1066
  PREFIX_0FAE_REG_0_MOD_3,
1067
  PREFIX_0FAE_REG_1_MOD_3,
1068
  PREFIX_0FAE_REG_2_MOD_3,
1069
  PREFIX_0FAE_REG_3_MOD_3,
1070
  PREFIX_0FAE_REG_4_MOD_0,
1071
  PREFIX_0FAE_REG_4_MOD_3,
1072
  PREFIX_0FAE_REG_5_MOD_3,
1073
  PREFIX_0FAE_REG_6_MOD_0,
1074
  PREFIX_0FAE_REG_6_MOD_3,
1075
  PREFIX_0FAE_REG_7_MOD_0,
1076
  PREFIX_0FB8,
1077
  PREFIX_0FBC,
1078
  PREFIX_0FBD,
1079
  PREFIX_0FC2,
1080
  PREFIX_0FC7_REG_6_MOD_0,
1081
  PREFIX_0FC7_REG_6_MOD_3,
1082
  PREFIX_0FC7_REG_7_MOD_3,
1083
  PREFIX_0FD0,
1084
  PREFIX_0FD6,
1085
  PREFIX_0FE6,
1086
  PREFIX_0FE7,
1087
  PREFIX_0FF0,
1088
  PREFIX_0FF7,
1089
  PREFIX_0F38D8,
1090
  PREFIX_0F38DC,
1091
  PREFIX_0F38DD,
1092
  PREFIX_0F38DE,
1093
  PREFIX_0F38DF,
1094
  PREFIX_0F38F0,
1095
  PREFIX_0F38F1,
1096
  PREFIX_0F38F6,
1097
  PREFIX_0F38F8_M_0,
1098
  PREFIX_0F38F8_M_1_X86_64,
1099
  PREFIX_0F38FA,
1100
  PREFIX_0F38FB,
1101
  PREFIX_0F38FC,
1102
  PREFIX_0F3A0F,
1103
  PREFIX_VEX_0F12,
1104
  PREFIX_VEX_0F16,
1105
  PREFIX_VEX_0F2A,
1106
  PREFIX_VEX_0F2C,
1107
  PREFIX_VEX_0F2D,
1108
  PREFIX_VEX_0F41_L_1_W_0,
1109
  PREFIX_VEX_0F41_L_1_W_1,
1110
  PREFIX_VEX_0F42_L_1_W_0,
1111
  PREFIX_VEX_0F42_L_1_W_1,
1112
  PREFIX_VEX_0F44_L_0_W_0,
1113
  PREFIX_VEX_0F44_L_0_W_1,
1114
  PREFIX_VEX_0F45_L_1_W_0,
1115
  PREFIX_VEX_0F45_L_1_W_1,
1116
  PREFIX_VEX_0F46_L_1_W_0,
1117
  PREFIX_VEX_0F46_L_1_W_1,
1118
  PREFIX_VEX_0F47_L_1_W_0,
1119
  PREFIX_VEX_0F47_L_1_W_1,
1120
  PREFIX_VEX_0F4A_L_1_W_0,
1121
  PREFIX_VEX_0F4A_L_1_W_1,
1122
  PREFIX_VEX_0F4B_L_1_W_0,
1123
  PREFIX_VEX_0F4B_L_1_W_1,
1124
  PREFIX_VEX_0F6F,
1125
  PREFIX_VEX_0F70,
1126
  PREFIX_VEX_0F7E,
1127
  PREFIX_VEX_0F7F,
1128
  PREFIX_VEX_0F90_L_0_W_0,
1129
  PREFIX_VEX_0F90_L_0_W_1,
1130
  PREFIX_VEX_0F91_L_0_W_0,
1131
  PREFIX_VEX_0F91_L_0_W_1,
1132
  PREFIX_VEX_0F92_L_0_W_0,
1133
  PREFIX_VEX_0F92_L_0_W_1,
1134
  PREFIX_VEX_0F93_L_0_W_0,
1135
  PREFIX_VEX_0F93_L_0_W_1,
1136
  PREFIX_VEX_0F98_L_0_W_0,
1137
  PREFIX_VEX_0F98_L_0_W_1,
1138
  PREFIX_VEX_0F99_L_0_W_0,
1139
  PREFIX_VEX_0F99_L_0_W_1,
1140
  PREFIX_VEX_0F3848_X86_64_L_0_W_0,
1141
  PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_0,
1142
  PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_1,
1143
  PREFIX_VEX_0F384A_X86_64_W_0_L_0,
1144
  PREFIX_VEX_0F384B_X86_64_L_0_W_0,
1145
  PREFIX_VEX_0F3850_W_0,
1146
  PREFIX_VEX_0F3851_W_0,
1147
  PREFIX_VEX_0F385C_X86_64_L_0_W_0,
1148
  PREFIX_VEX_0F385E_X86_64_L_0_W_0,
1149
  PREFIX_VEX_0F385F_X86_64_L_0_W_0,
1150
  PREFIX_VEX_0F386B_X86_64_L_0_W_0,
1151
  PREFIX_VEX_0F386C_X86_64_L_0_W_0,
1152
  PREFIX_VEX_0F386E_X86_64_L_0_W_0,
1153
  PREFIX_VEX_0F386F_X86_64_L_0_W_0,
1154
  PREFIX_VEX_0F3872,
1155
  PREFIX_VEX_0F38B0_W_0,
1156
  PREFIX_VEX_0F38B1_W_0,
1157
  PREFIX_VEX_0F38D2_W_0,
1158
  PREFIX_VEX_0F38D3_W_0,
1159
  PREFIX_VEX_0F38CB,
1160
  PREFIX_VEX_0F38CC,
1161
  PREFIX_VEX_0F38CD,
1162
  PREFIX_VEX_0F38DA_W_0,
1163
  PREFIX_VEX_0F38F2_L_0,
1164
  PREFIX_VEX_0F38F3_L_0,
1165
  PREFIX_VEX_0F38F5_L_0,
1166
  PREFIX_VEX_0F38F6_L_0,
1167
  PREFIX_VEX_0F38F7_L_0,
1168
  PREFIX_VEX_0F3AF0_L_0,
1169
  PREFIX_VEX_MAP5_F8_X86_64_L_0_W_0,
1170
  PREFIX_VEX_MAP5_F9_X86_64_L_0_W_0,
1171
  PREFIX_VEX_MAP5_FD_X86_64_L_0_W_0,
1172
  PREFIX_VEX_MAP7_F6_L_0_W_0_R_0_X86_64,
1173
  PREFIX_VEX_MAP7_F8_L_0_W_0_R_0_X86_64,
1174
1175
  PREFIX_EVEX_0F2E,
1176
  PREFIX_EVEX_0F2F,
1177
  PREFIX_EVEX_0F5B,
1178
  PREFIX_EVEX_0F6F,
1179
  PREFIX_EVEX_0F70,
1180
  PREFIX_EVEX_0F78,
1181
  PREFIX_EVEX_0F79,
1182
  PREFIX_EVEX_0F7A,
1183
  PREFIX_EVEX_0F7B,
1184
  PREFIX_EVEX_0F7E,
1185
  PREFIX_EVEX_0F7F,
1186
  PREFIX_EVEX_0FC2,
1187
  PREFIX_EVEX_0FE6,
1188
  PREFIX_EVEX_0F3810,
1189
  PREFIX_EVEX_0F3811,
1190
  PREFIX_EVEX_0F3812,
1191
  PREFIX_EVEX_0F3813,
1192
  PREFIX_EVEX_0F3814,
1193
  PREFIX_EVEX_0F3815,
1194
  PREFIX_EVEX_0F3820,
1195
  PREFIX_EVEX_0F3821,
1196
  PREFIX_EVEX_0F3822,
1197
  PREFIX_EVEX_0F3823,
1198
  PREFIX_EVEX_0F3824,
1199
  PREFIX_EVEX_0F3825,
1200
  PREFIX_EVEX_0F3826,
1201
  PREFIX_EVEX_0F3827,
1202
  PREFIX_EVEX_0F3828,
1203
  PREFIX_EVEX_0F3829,
1204
  PREFIX_EVEX_0F382A,
1205
  PREFIX_EVEX_0F3830,
1206
  PREFIX_EVEX_0F3831,
1207
  PREFIX_EVEX_0F3832,
1208
  PREFIX_EVEX_0F3833,
1209
  PREFIX_EVEX_0F3834,
1210
  PREFIX_EVEX_0F3835,
1211
  PREFIX_EVEX_0F3838,
1212
  PREFIX_EVEX_0F3839,
1213
  PREFIX_EVEX_0F383A,
1214
  PREFIX_EVEX_0F384A_X86_64_W_0_L_2,
1215
  PREFIX_EVEX_0F3852,
1216
  PREFIX_EVEX_0F3853,
1217
  PREFIX_EVEX_0F3868,
1218
  PREFIX_EVEX_0F386D_X86_64_W_0_L_2,
1219
  PREFIX_EVEX_0F3872,
1220
  PREFIX_EVEX_0F3874,
1221
  PREFIX_EVEX_0F389A,
1222
  PREFIX_EVEX_0F389B,
1223
  PREFIX_EVEX_0F38AA,
1224
  PREFIX_EVEX_0F38AB,
1225
1226
  PREFIX_EVEX_0F3A07_X86_64_W_0_L_2,
1227
  PREFIX_EVEX_0F3A08,
1228
  PREFIX_EVEX_0F3A0A,
1229
  PREFIX_EVEX_0F3A26,
1230
  PREFIX_EVEX_0F3A27,
1231
  PREFIX_EVEX_0F3A42_W_0,
1232
  PREFIX_EVEX_0F3A52,
1233
  PREFIX_EVEX_0F3A53,
1234
  PREFIX_EVEX_0F3A56,
1235
  PREFIX_EVEX_0F3A57,
1236
  PREFIX_EVEX_0F3A66,
1237
  PREFIX_EVEX_0F3A67,
1238
  PREFIX_EVEX_0F3A77_X86_64_W_0_L_2,
1239
  PREFIX_EVEX_0F3AC2,
1240
1241
  PREFIX_EVEX_MAP4_4x,
1242
  PREFIX_EVEX_MAP4_F0,
1243
  PREFIX_EVEX_MAP4_F1,
1244
  PREFIX_EVEX_MAP4_F2,
1245
  PREFIX_EVEX_MAP4_F8,
1246
1247
  PREFIX_EVEX_MAP5_10,
1248
  PREFIX_EVEX_MAP5_11,
1249
  PREFIX_EVEX_MAP5_18,
1250
  PREFIX_EVEX_MAP5_1B,
1251
  PREFIX_EVEX_MAP5_1D,
1252
  PREFIX_EVEX_MAP5_1E,
1253
  PREFIX_EVEX_MAP5_2A,
1254
  PREFIX_EVEX_MAP5_2C,
1255
  PREFIX_EVEX_MAP5_2D,
1256
  PREFIX_EVEX_MAP5_2E,
1257
  PREFIX_EVEX_MAP5_2F,
1258
  PREFIX_EVEX_MAP5_51,
1259
  PREFIX_EVEX_MAP5_58,
1260
  PREFIX_EVEX_MAP5_59,
1261
  PREFIX_EVEX_MAP5_5A,
1262
  PREFIX_EVEX_MAP5_5B,
1263
  PREFIX_EVEX_MAP5_5C,
1264
  PREFIX_EVEX_MAP5_5D,
1265
  PREFIX_EVEX_MAP5_5E,
1266
  PREFIX_EVEX_MAP5_5F,
1267
  PREFIX_EVEX_MAP5_68,
1268
  PREFIX_EVEX_MAP5_69,
1269
  PREFIX_EVEX_MAP5_6A,
1270
  PREFIX_EVEX_MAP5_6B,
1271
  PREFIX_EVEX_MAP5_6C,
1272
  PREFIX_EVEX_MAP5_6D,
1273
  PREFIX_EVEX_MAP5_6E_L_0,
1274
  PREFIX_EVEX_MAP5_6F_X86_64,
1275
  PREFIX_EVEX_MAP5_74,
1276
  PREFIX_EVEX_MAP5_78,
1277
  PREFIX_EVEX_MAP5_79,
1278
  PREFIX_EVEX_MAP5_7A,
1279
  PREFIX_EVEX_MAP5_7B,
1280
  PREFIX_EVEX_MAP5_7C,
1281
  PREFIX_EVEX_MAP5_7D,
1282
  PREFIX_EVEX_MAP5_7E_L_0,
1283
1284
  PREFIX_EVEX_MAP6_13,
1285
  PREFIX_EVEX_MAP6_2C,
1286
  PREFIX_EVEX_MAP6_42,
1287
  PREFIX_EVEX_MAP6_4C,
1288
  PREFIX_EVEX_MAP6_4E,
1289
  PREFIX_EVEX_MAP6_56,
1290
  PREFIX_EVEX_MAP6_57,
1291
  PREFIX_EVEX_MAP6_98,
1292
  PREFIX_EVEX_MAP6_9A,
1293
  PREFIX_EVEX_MAP6_9C,
1294
  PREFIX_EVEX_MAP6_9E,
1295
  PREFIX_EVEX_MAP6_A8,
1296
  PREFIX_EVEX_MAP6_AA,
1297
  PREFIX_EVEX_MAP6_AC,
1298
  PREFIX_EVEX_MAP6_AE,
1299
  PREFIX_EVEX_MAP6_B8,
1300
  PREFIX_EVEX_MAP6_BA,
1301
  PREFIX_EVEX_MAP6_BC,
1302
  PREFIX_EVEX_MAP6_BE,
1303
  PREFIX_EVEX_MAP6_D6,
1304
  PREFIX_EVEX_MAP6_D7,
1305
};
1306
1307
enum
1308
{
1309
  X86_64_06 = 0,
1310
  X86_64_07,
1311
  X86_64_0E,
1312
  X86_64_16,
1313
  X86_64_17,
1314
  X86_64_1E,
1315
  X86_64_1F,
1316
  X86_64_27,
1317
  X86_64_2F,
1318
  X86_64_37,
1319
  X86_64_3F,
1320
  X86_64_60,
1321
  X86_64_61,
1322
  X86_64_62,
1323
  X86_64_63,
1324
  X86_64_6D,
1325
  X86_64_6F,
1326
  X86_64_82,
1327
  X86_64_9A,
1328
  X86_64_C2,
1329
  X86_64_C3,
1330
  X86_64_C4,
1331
  X86_64_C5,
1332
  X86_64_CE,
1333
  X86_64_D4,
1334
  X86_64_D5,
1335
  X86_64_D6,
1336
  X86_64_E8,
1337
  X86_64_E9,
1338
  X86_64_EA,
1339
  X86_64_0F00_REG_6,
1340
  X86_64_0F01_REG_0,
1341
  X86_64_0F01_REG_0_MOD_3_RM_6_P_1,
1342
  X86_64_0F01_REG_0_MOD_3_RM_6_P_3,
1343
  X86_64_0F01_REG_0_MOD_3_RM_7_P_0,
1344
  X86_64_0F01_REG_1,
1345
  X86_64_0F01_REG_1_RM_2_PREFIX_1,
1346
  X86_64_0F01_REG_1_RM_2_PREFIX_3,
1347
  X86_64_0F01_REG_1_RM_5_PREFIX_2,
1348
  X86_64_0F01_REG_1_RM_6_PREFIX_2,
1349
  X86_64_0F01_REG_1_RM_7_PREFIX_2,
1350
  X86_64_0F01_REG_2,
1351
  X86_64_0F01_REG_3,
1352
  X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1,
1353
  X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1,
1354
  X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1,
1355
  X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1,
1356
  X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_1,
1357
  X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_3,
1358
  X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1,
1359
  X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3,
1360
  X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1,
1361
  X86_64_0F18_REG_6_MOD_0,
1362
  X86_64_0F18_REG_7_MOD_0,
1363
  X86_64_0F24,
1364
  X86_64_0F26,
1365
  X86_64_0F388A,
1366
  X86_64_0F388B,
1367
  X86_64_0F38F8_M_1,
1368
  X86_64_0FAE_REG_0_MOD_3_PREFIX_1,
1369
  X86_64_0FAE_REG_1_MOD_3_PREFIX_1,
1370
  X86_64_0FAE_REG_2_MOD_3_PREFIX_1,
1371
  X86_64_0FAE_REG_3_MOD_3_PREFIX_1,
1372
  X86_64_0FC7_REG_6_MOD_3_PREFIX_1,
1373
1374
  X86_64_VEX_0F3848,
1375
  X86_64_VEX_0F3849,
1376
  X86_64_VEX_0F384A,
1377
  X86_64_VEX_0F384B,
1378
  X86_64_VEX_0F385C,
1379
  X86_64_VEX_0F385E,
1380
  X86_64_VEX_0F385F,
1381
  X86_64_VEX_0F386B,
1382
  X86_64_VEX_0F386C,
1383
  X86_64_VEX_0F386E,
1384
  X86_64_VEX_0F386F,
1385
  X86_64_VEX_0F38Ex,
1386
1387
  X86_64_VEX_MAP5_F8,
1388
  X86_64_VEX_MAP5_F9,
1389
  X86_64_VEX_MAP5_FD,
1390
  X86_64_VEX_MAP7_F6_L_0_W_0_R_0,
1391
  X86_64_VEX_MAP7_F8_L_0_W_0_R_0,
1392
1393
  X86_64_EVEX_0F384A,
1394
  X86_64_EVEX_0F386D,
1395
  X86_64_EVEX_0F3A07,
1396
  X86_64_EVEX_0F3A77,
1397
1398
  X86_64_EVEX_MAP5_6F,
1399
};
1400
1401
enum
1402
{
1403
  THREE_BYTE_0F38 = 0,
1404
  THREE_BYTE_0F3A
1405
};
1406
1407
enum
1408
{
1409
  XOP_08 = 0,
1410
  XOP_09,
1411
  XOP_0A
1412
};
1413
1414
enum
1415
{
1416
  VEX_0F = 0,
1417
  VEX_0F38,
1418
  VEX_0F3A,
1419
  VEX_MAP5,
1420
  VEX_MAP7,
1421
};
1422
1423
enum
1424
{
1425
  EVEX_0F = 0,
1426
  EVEX_0F38,
1427
  EVEX_0F3A,
1428
  EVEX_MAP4,
1429
  EVEX_MAP5,
1430
  EVEX_MAP6,
1431
  EVEX_MAP7,
1432
};
1433
1434
enum
1435
{
1436
  VEX_LEN_0F12_P_0 = 0,
1437
  VEX_LEN_0F12_P_2,
1438
  VEX_LEN_0F13,
1439
  VEX_LEN_0F16_P_0,
1440
  VEX_LEN_0F16_P_2,
1441
  VEX_LEN_0F17,
1442
  VEX_LEN_0F41,
1443
  VEX_LEN_0F42,
1444
  VEX_LEN_0F44,
1445
  VEX_LEN_0F45,
1446
  VEX_LEN_0F46,
1447
  VEX_LEN_0F47,
1448
  VEX_LEN_0F4A,
1449
  VEX_LEN_0F4B,
1450
  VEX_LEN_0F6E,
1451
  VEX_LEN_0F77,
1452
  VEX_LEN_0F7E_P_1,
1453
  VEX_LEN_0F7E_P_2,
1454
  VEX_LEN_0F90,
1455
  VEX_LEN_0F91,
1456
  VEX_LEN_0F92,
1457
  VEX_LEN_0F93,
1458
  VEX_LEN_0F98,
1459
  VEX_LEN_0F99,
1460
  VEX_LEN_0FAE_R_2,
1461
  VEX_LEN_0FAE_R_3,
1462
  VEX_LEN_0FC4,
1463
  VEX_LEN_0FD6,
1464
  VEX_LEN_0F3816,
1465
  VEX_LEN_0F3819,
1466
  VEX_LEN_0F381A,
1467
  VEX_LEN_0F3836,
1468
  VEX_LEN_0F3841,
1469
  VEX_LEN_0F3848_X86_64,
1470
  VEX_LEN_0F3849_X86_64,
1471
  VEX_LEN_0F384A_X86_64_W_0,
1472
  VEX_LEN_0F384B_X86_64,
1473
  VEX_LEN_0F385A,
1474
  VEX_LEN_0F385C_X86_64,
1475
  VEX_LEN_0F385E_X86_64,
1476
  VEX_LEN_0F385F_X86_64,
1477
  VEX_LEN_0F386B_X86_64,
1478
  VEX_LEN_0F386C_X86_64,
1479
  VEX_LEN_0F386E_X86_64,
1480
  VEX_LEN_0F386F_X86_64,
1481
  VEX_LEN_0F38CB_P_3_W_0,
1482
  VEX_LEN_0F38CC_P_3_W_0,
1483
  VEX_LEN_0F38CD_P_3_W_0,
1484
  VEX_LEN_0F38DA_W_0_P_0,
1485
  VEX_LEN_0F38DA_W_0_P_2,
1486
  VEX_LEN_0F38DB,
1487
  VEX_LEN_0F38F2,
1488
  VEX_LEN_0F38F3,
1489
  VEX_LEN_0F38F5,
1490
  VEX_LEN_0F38F6,
1491
  VEX_LEN_0F38F7,
1492
  VEX_LEN_0F3A00,
1493
  VEX_LEN_0F3A01,
1494
  VEX_LEN_0F3A06,
1495
  VEX_LEN_0F3A14,
1496
  VEX_LEN_0F3A15,
1497
  VEX_LEN_0F3A16,
1498
  VEX_LEN_0F3A17,
1499
  VEX_LEN_0F3A18,
1500
  VEX_LEN_0F3A19,
1501
  VEX_LEN_0F3A20,
1502
  VEX_LEN_0F3A21,
1503
  VEX_LEN_0F3A22,
1504
  VEX_LEN_0F3A30,
1505
  VEX_LEN_0F3A31,
1506
  VEX_LEN_0F3A32,
1507
  VEX_LEN_0F3A33,
1508
  VEX_LEN_0F3A38,
1509
  VEX_LEN_0F3A39,
1510
  VEX_LEN_0F3A41,
1511
  VEX_LEN_0F3A46,
1512
  VEX_LEN_0F3A60,
1513
  VEX_LEN_0F3A61,
1514
  VEX_LEN_0F3A62,
1515
  VEX_LEN_0F3A63,
1516
  VEX_LEN_0F3ADE_W_0,
1517
  VEX_LEN_0F3ADF,
1518
  VEX_LEN_0F3AF0,
1519
  VEX_LEN_MAP5_F8_X86_64,
1520
  VEX_LEN_MAP5_F9_X86_64,
1521
  VEX_LEN_MAP5_FD_X86_64,
1522
  VEX_LEN_MAP7_F6,
1523
  VEX_LEN_MAP7_F8,
1524
  VEX_LEN_XOP_08_85,
1525
  VEX_LEN_XOP_08_86,
1526
  VEX_LEN_XOP_08_87,
1527
  VEX_LEN_XOP_08_8E,
1528
  VEX_LEN_XOP_08_8F,
1529
  VEX_LEN_XOP_08_95,
1530
  VEX_LEN_XOP_08_96,
1531
  VEX_LEN_XOP_08_97,
1532
  VEX_LEN_XOP_08_9E,
1533
  VEX_LEN_XOP_08_9F,
1534
  VEX_LEN_XOP_08_A3,
1535
  VEX_LEN_XOP_08_A6,
1536
  VEX_LEN_XOP_08_B6,
1537
  VEX_LEN_XOP_08_C0,
1538
  VEX_LEN_XOP_08_C1,
1539
  VEX_LEN_XOP_08_C2,
1540
  VEX_LEN_XOP_08_C3,
1541
  VEX_LEN_XOP_08_CC,
1542
  VEX_LEN_XOP_08_CD,
1543
  VEX_LEN_XOP_08_CE,
1544
  VEX_LEN_XOP_08_CF,
1545
  VEX_LEN_XOP_08_EC,
1546
  VEX_LEN_XOP_08_ED,
1547
  VEX_LEN_XOP_08_EE,
1548
  VEX_LEN_XOP_08_EF,
1549
  VEX_LEN_XOP_09_01,
1550
  VEX_LEN_XOP_09_02,
1551
  VEX_LEN_XOP_09_12,
1552
  VEX_LEN_XOP_09_82_W_0,
1553
  VEX_LEN_XOP_09_83_W_0,
1554
  VEX_LEN_XOP_09_90,
1555
  VEX_LEN_XOP_09_91,
1556
  VEX_LEN_XOP_09_92,
1557
  VEX_LEN_XOP_09_93,
1558
  VEX_LEN_XOP_09_94,
1559
  VEX_LEN_XOP_09_95,
1560
  VEX_LEN_XOP_09_96,
1561
  VEX_LEN_XOP_09_97,
1562
  VEX_LEN_XOP_09_98,
1563
  VEX_LEN_XOP_09_99,
1564
  VEX_LEN_XOP_09_9A,
1565
  VEX_LEN_XOP_09_9B,
1566
  VEX_LEN_XOP_09_C1,
1567
  VEX_LEN_XOP_09_C2,
1568
  VEX_LEN_XOP_09_C3,
1569
  VEX_LEN_XOP_09_C6,
1570
  VEX_LEN_XOP_09_C7,
1571
  VEX_LEN_XOP_09_CB,
1572
  VEX_LEN_XOP_09_D1,
1573
  VEX_LEN_XOP_09_D2,
1574
  VEX_LEN_XOP_09_D3,
1575
  VEX_LEN_XOP_09_D6,
1576
  VEX_LEN_XOP_09_D7,
1577
  VEX_LEN_XOP_09_DB,
1578
  VEX_LEN_XOP_09_E1,
1579
  VEX_LEN_XOP_09_E2,
1580
  VEX_LEN_XOP_09_E3,
1581
  VEX_LEN_XOP_0A_12,
1582
};
1583
1584
enum
1585
{
1586
  EVEX_LEN_0F7E_P_1_W_0 = 0,
1587
  EVEX_LEN_0FD6_P_2_W_0,
1588
  EVEX_LEN_0F3816,
1589
  EVEX_LEN_0F3819,
1590
  EVEX_LEN_0F381A,
1591
  EVEX_LEN_0F381B,
1592
  EVEX_LEN_0F3836,
1593
  EVEX_LEN_0F384A_X86_64_W_0,
1594
  EVEX_LEN_0F385A,
1595
  EVEX_LEN_0F385B,
1596
  EVEX_LEN_0F386D_X86_64_W_0,
1597
  EVEX_LEN_0F38C6,
1598
  EVEX_LEN_0F38C7,
1599
  EVEX_LEN_0F3A00,
1600
  EVEX_LEN_0F3A01,
1601
  EVEX_LEN_0F3A07_X86_64_W_0,
1602
  EVEX_LEN_0F3A18,
1603
  EVEX_LEN_0F3A19,
1604
  EVEX_LEN_0F3A1A,
1605
  EVEX_LEN_0F3A1B,
1606
  EVEX_LEN_0F3A23,
1607
  EVEX_LEN_0F3A38,
1608
  EVEX_LEN_0F3A39,
1609
  EVEX_LEN_0F3A3A,
1610
  EVEX_LEN_0F3A3B,
1611
  EVEX_LEN_0F3A43,
1612
  EVEX_LEN_0F3A77_X86_64_W_0,
1613
1614
  EVEX_LEN_MAP5_6E,
1615
  EVEX_LEN_MAP5_7E,
1616
  EVEX_LEN_MAP6_80_W_0,
1617
  EVEX_LEN_MAP6_80_W_1,
1618
};
1619
1620
enum
1621
{
1622
  VEX_W_0F41_L_1 = 0,
1623
  VEX_W_0F42_L_1,
1624
  VEX_W_0F44_L_0,
1625
  VEX_W_0F45_L_1,
1626
  VEX_W_0F46_L_1,
1627
  VEX_W_0F47_L_1,
1628
  VEX_W_0F4A_L_1,
1629
  VEX_W_0F4B_L_1,
1630
  VEX_W_0F90_L_0,
1631
  VEX_W_0F91_L_0,
1632
  VEX_W_0F92_L_0,
1633
  VEX_W_0F93_L_0,
1634
  VEX_W_0F98_L_0,
1635
  VEX_W_0F99_L_0,
1636
  VEX_W_0F380C,
1637
  VEX_W_0F380D,
1638
  VEX_W_0F380E,
1639
  VEX_W_0F380F,
1640
  VEX_W_0F3813,
1641
  VEX_W_0F3816_L_1,
1642
  VEX_W_0F3818,
1643
  VEX_W_0F3819_L_1,
1644
  VEX_W_0F381A_L_1,
1645
  VEX_W_0F382C,
1646
  VEX_W_0F382D,
1647
  VEX_W_0F382E,
1648
  VEX_W_0F382F,
1649
  VEX_W_0F3836,
1650
  VEX_W_0F3846,
1651
  VEX_W_0F3848_X86_64_L_0,
1652
  VEX_W_0F3849_X86_64_L_0,
1653
  VEX_W_0F384A_X86_64,
1654
  VEX_W_0F384B_X86_64_L_0,
1655
  VEX_W_0F3850,
1656
  VEX_W_0F3851,
1657
  VEX_W_0F3852,
1658
  VEX_W_0F3853,
1659
  VEX_W_0F3858,
1660
  VEX_W_0F3859,
1661
  VEX_W_0F385A_L_0,
1662
  VEX_W_0F385C_X86_64_L_0,
1663
  VEX_W_0F385E_X86_64_L_0,
1664
  VEX_W_0F385F_X86_64_L_0,
1665
  VEX_W_0F386B_X86_64_L_0,
1666
  VEX_W_0F386C_X86_64_L_0,
1667
  VEX_W_0F386E_X86_64_L_0,
1668
  VEX_W_0F386F_X86_64_L_0,
1669
  VEX_W_0F3872_P_1,
1670
  VEX_W_0F3878,
1671
  VEX_W_0F3879,
1672
  VEX_W_0F38B0,
1673
  VEX_W_0F38B1,
1674
  VEX_W_0F38B4,
1675
  VEX_W_0F38B5,
1676
  VEX_W_0F38CB_P_3,
1677
  VEX_W_0F38CC_P_3,
1678
  VEX_W_0F38CD_P_3,
1679
  VEX_W_0F38CF,
1680
  VEX_W_0F38D2,
1681
  VEX_W_0F38D3,
1682
  VEX_W_0F38DA,
1683
  VEX_W_0F3A00_L_1,
1684
  VEX_W_0F3A01_L_1,
1685
  VEX_W_0F3A02,
1686
  VEX_W_0F3A04,
1687
  VEX_W_0F3A05,
1688
  VEX_W_0F3A06_L_1,
1689
  VEX_W_0F3A18_L_1,
1690
  VEX_W_0F3A19_L_1,
1691
  VEX_W_0F3A1D,
1692
  VEX_W_0F3A38_L_1,
1693
  VEX_W_0F3A39_L_1,
1694
  VEX_W_0F3A46_L_1,
1695
  VEX_W_0F3A4A,
1696
  VEX_W_0F3A4B,
1697
  VEX_W_0F3A4C,
1698
  VEX_W_0F3ACE,
1699
  VEX_W_0F3ACF,
1700
  VEX_W_0F3ADE,
1701
  VEX_W_MAP5_F8_X86_64_L_0,
1702
  VEX_W_MAP5_F9_X86_64_L_0,
1703
  VEX_W_MAP5_FD_X86_64_L_0,
1704
  VEX_W_MAP7_F6_L_0,
1705
  VEX_W_MAP7_F8_L_0,
1706
1707
  VEX_W_XOP_08_85_L_0,
1708
  VEX_W_XOP_08_86_L_0,
1709
  VEX_W_XOP_08_87_L_0,
1710
  VEX_W_XOP_08_8E_L_0,
1711
  VEX_W_XOP_08_8F_L_0,
1712
  VEX_W_XOP_08_95_L_0,
1713
  VEX_W_XOP_08_96_L_0,
1714
  VEX_W_XOP_08_97_L_0,
1715
  VEX_W_XOP_08_9E_L_0,
1716
  VEX_W_XOP_08_9F_L_0,
1717
  VEX_W_XOP_08_A6_L_0,
1718
  VEX_W_XOP_08_B6_L_0,
1719
  VEX_W_XOP_08_C0_L_0,
1720
  VEX_W_XOP_08_C1_L_0,
1721
  VEX_W_XOP_08_C2_L_0,
1722
  VEX_W_XOP_08_C3_L_0,
1723
  VEX_W_XOP_08_CC_L_0,
1724
  VEX_W_XOP_08_CD_L_0,
1725
  VEX_W_XOP_08_CE_L_0,
1726
  VEX_W_XOP_08_CF_L_0,
1727
  VEX_W_XOP_08_EC_L_0,
1728
  VEX_W_XOP_08_ED_L_0,
1729
  VEX_W_XOP_08_EE_L_0,
1730
  VEX_W_XOP_08_EF_L_0,
1731
1732
  VEX_W_XOP_09_80,
1733
  VEX_W_XOP_09_81,
1734
  VEX_W_XOP_09_82,
1735
  VEX_W_XOP_09_83,
1736
  VEX_W_XOP_09_C1_L_0,
1737
  VEX_W_XOP_09_C2_L_0,
1738
  VEX_W_XOP_09_C3_L_0,
1739
  VEX_W_XOP_09_C6_L_0,
1740
  VEX_W_XOP_09_C7_L_0,
1741
  VEX_W_XOP_09_CB_L_0,
1742
  VEX_W_XOP_09_D1_L_0,
1743
  VEX_W_XOP_09_D2_L_0,
1744
  VEX_W_XOP_09_D3_L_0,
1745
  VEX_W_XOP_09_D6_L_0,
1746
  VEX_W_XOP_09_D7_L_0,
1747
  VEX_W_XOP_09_DB_L_0,
1748
  VEX_W_XOP_09_E1_L_0,
1749
  VEX_W_XOP_09_E2_L_0,
1750
  VEX_W_XOP_09_E3_L_0,
1751
1752
  EVEX_W_0F5B_P_0,
1753
  EVEX_W_0F62,
1754
  EVEX_W_0F66,
1755
  EVEX_W_0F6A,
1756
  EVEX_W_0F6B,
1757
  EVEX_W_0F6C,
1758
  EVEX_W_0F6D,
1759
  EVEX_W_0F6F_P_1,
1760
  EVEX_W_0F6F_P_2,
1761
  EVEX_W_0F6F_P_3,
1762
  EVEX_W_0F70_P_2,
1763
  EVEX_W_0F72_R_2,
1764
  EVEX_W_0F72_R_4,
1765
  EVEX_W_0F72_R_6,
1766
  EVEX_W_0F73_R_2,
1767
  EVEX_W_0F73_R_6,
1768
  EVEX_W_0F76,
1769
  EVEX_W_0F78_P_0,
1770
  EVEX_W_0F78_P_2,
1771
  EVEX_W_0F79_P_0,
1772
  EVEX_W_0F79_P_2,
1773
  EVEX_W_0F7A_P_1,
1774
  EVEX_W_0F7A_P_2,
1775
  EVEX_W_0F7A_P_3,
1776
  EVEX_W_0F7B_P_2,
1777
  EVEX_W_0F7E_P_1,
1778
  EVEX_W_0F7F_P_1,
1779
  EVEX_W_0F7F_P_2,
1780
  EVEX_W_0F7F_P_3,
1781
  EVEX_W_0FD2,
1782
  EVEX_W_0FD3,
1783
  EVEX_W_0FD4,
1784
  EVEX_W_0FD6,
1785
  EVEX_W_0FE2,
1786
  EVEX_W_0FE6_P_1,
1787
  EVEX_W_0FE7,
1788
  EVEX_W_0FF2,
1789
  EVEX_W_0FF3,
1790
  EVEX_W_0FF4,
1791
  EVEX_W_0FFA,
1792
  EVEX_W_0FFB,
1793
  EVEX_W_0FFE,
1794
1795
  EVEX_W_0F3810_P_1,
1796
  EVEX_W_0F3810_P_2,
1797
  EVEX_W_0F3811_P_1,
1798
  EVEX_W_0F3811_P_2,
1799
  EVEX_W_0F3812_P_1,
1800
  EVEX_W_0F3812_P_2,
1801
  EVEX_W_0F3813_P_1,
1802
  EVEX_W_0F3814_P_1,
1803
  EVEX_W_0F3815_P_1,
1804
  EVEX_W_0F3819_L_n,
1805
  EVEX_W_0F381A_L_n,
1806
  EVEX_W_0F381B_L_2,
1807
  EVEX_W_0F381E,
1808
  EVEX_W_0F381F,
1809
  EVEX_W_0F3820_P_1,
1810
  EVEX_W_0F3821_P_1,
1811
  EVEX_W_0F3822_P_1,
1812
  EVEX_W_0F3823_P_1,
1813
  EVEX_W_0F3824_P_1,
1814
  EVEX_W_0F3825_P_1,
1815
  EVEX_W_0F3825_P_2,
1816
  EVEX_W_0F3828_P_2,
1817
  EVEX_W_0F3829_P_2,
1818
  EVEX_W_0F382A_P_1,
1819
  EVEX_W_0F382A_P_2,
1820
  EVEX_W_0F382B,
1821
  EVEX_W_0F3830_P_1,
1822
  EVEX_W_0F3831_P_1,
1823
  EVEX_W_0F3832_P_1,
1824
  EVEX_W_0F3833_P_1,
1825
  EVEX_W_0F3834_P_1,
1826
  EVEX_W_0F3835_P_1,
1827
  EVEX_W_0F3835_P_2,
1828
  EVEX_W_0F3837,
1829
  EVEX_W_0F383A_P_1,
1830
  EVEX_W_0F384A_X86_64,
1831
  EVEX_W_0F3859,
1832
  EVEX_W_0F385A_L_n,
1833
  EVEX_W_0F385B_L_2,
1834
  EVEX_W_0F386D_X86_64,
1835
  EVEX_W_0F3870,
1836
  EVEX_W_0F3872_P_2,
1837
  EVEX_W_0F387A,
1838
  EVEX_W_0F387B,
1839
  EVEX_W_0F3883,
1840
1841
  EVEX_W_0F3A07_X86_64,
1842
  EVEX_W_0F3A18_L_n,
1843
  EVEX_W_0F3A19_L_n,
1844
  EVEX_W_0F3A1A_L_2,
1845
  EVEX_W_0F3A1B_L_2,
1846
  EVEX_W_0F3A21,
1847
  EVEX_W_0F3A23_L_n,
1848
  EVEX_W_0F3A38_L_n,
1849
  EVEX_W_0F3A39_L_n,
1850
  EVEX_W_0F3A3A_L_2,
1851
  EVEX_W_0F3A3B_L_2,
1852
  EVEX_W_0F3A42,
1853
  EVEX_W_0F3A43_L_n,
1854
  EVEX_W_0F3A70,
1855
  EVEX_W_0F3A72,
1856
  EVEX_W_0F3A77_X86_64,
1857
1858
  EVEX_W_MAP4_8F_R_0,
1859
  EVEX_W_MAP4_F8_P1_M_1,
1860
  EVEX_W_MAP4_F8_P3_M_1,
1861
  EVEX_W_MAP4_FF_R_6,
1862
1863
  EVEX_W_MAP5_5B_P_0,
1864
  EVEX_W_MAP5_6C_P_0,
1865
  EVEX_W_MAP5_6C_P_2,
1866
  EVEX_W_MAP5_6D_P_0,
1867
  EVEX_W_MAP5_6D_P_2,
1868
  EVEX_W_MAP5_6E_P_1,
1869
  EVEX_W_MAP5_7A_P_3,
1870
  EVEX_W_MAP5_7E_P_1,
1871
  EVEX_W_MAP6_80,
1872
  EVEX_W_MAP6_81,
1873
};
1874
1875
typedef bool (*op_rtn) (instr_info *ins, int bytemode, int sizeflag);
1876
1877
struct dis386 {
1878
  const char *name;
1879
  struct
1880
    {
1881
      op_rtn rtn;
1882
      int bytemode;
1883
    } op[MAX_OPERANDS];
1884
  unsigned int prefix_requirement;
1885
};
1886
1887
/* Upper case letters in the instruction names here are macros.
1888
   'A' => print 'b' if no (suitable) register operand or suffix_always is true
1889
   'B' => print 'b' if suffix_always is true
1890
   'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
1891
    size prefix
1892
   'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
1893
    suffix_always is true
1894
   'E' => print 'e' if 32-bit form of jcxz
1895
   'F' => print 'w' or 'l' depending on address size prefix (loop insns)
1896
   'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
1897
   'H' => print ",pt" or ",pn" branch hint
1898
   'I' unused.
1899
   'J' unused.
1900
   'K' => print 'd' or 'q' if rex prefix is present.
1901
   'L' => print 'l' or 'q' if suffix_always is true
1902
   'M' => print 'r' if intel_mnemonic is false.
1903
   'N' => print 'n' if instruction has no wait "prefix"
1904
   'O' => print 'd' or 'o' (or 'q' in Intel mode)
1905
   'P' => behave as 'T' except with register operand outside of suffix_always
1906
    mode
1907
   'Q' => print 'w', 'l' or 'q' if no (suitable) register operand or
1908
    suffix_always is true
1909
   'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
1910
   'S' => print 'w', 'l' or 'q' if suffix_always is true
1911
   'T' => print 'w', 'l'/'d', or 'q' if instruction has an operand size
1912
    prefix or if suffix_always is true.
1913
   'U' unused.
1914
   'V' => print 'v' for VEX/EVEX and nothing for legacy encodings.
1915
   'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
1916
   'X' => print 's', 'd' depending on data16 prefix (for XMM)
1917
   'Y' => no output, mark EVEX.aaa != 0 as bad.
1918
   'Z' => print 'q' in 64bit mode and 'l' otherwise, if suffix_always is true.
1919
   '!' => change condition from true to false or from false to true.
1920
   '%' => add 1 upper case letter to the macro.
1921
   '^' => print 'w', 'l', or 'q' (Intel64 ISA only) depending on operand size
1922
    prefix or suffix_always is true (lcall/ljmp).
1923
   '@' => in 64bit mode for Intel64 ISA or if instruction
1924
    has no operand sizing prefix, print 'q' if suffix_always is true or
1925
    nothing otherwise; behave as 'P' in all other cases
1926
1927
   2 upper case letter macros:
1928
   "CC" => print condition code
1929
   "XY" => print 'x' or 'y' if suffix_always is true or no register
1930
     operands and no broadcast.
1931
   "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
1932
     register operands and no broadcast.
1933
   "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
1934
   "XD" => print 'd' if !EVEX or EVEX.W=1, EVEX.W=0 is not a valid encoding
1935
   "XH" => print 'h' if EVEX.W=0, EVEX.W=1 is not a valid encoding (for FP16)
1936
   "XB" => print 'bf16' if EVEX.W=0, EVEX.W=1 is not a valid encoding
1937
     (for BF16)
1938
   "XS" => print 's' if !EVEX or EVEX.W=0, EVEX.W=1 is not a valid encoding
1939
   "XV" => print "{vex} " pseudo prefix
1940
   "XE" => print "{evex} " pseudo prefix if no EVEX-specific functionality is
1941
     is used by an EVEX-encoded (AVX512VL) instruction.
1942
   "ME" => Similar to "XE", but only print "{evex} " when there is no
1943
     memory operand.
1944
   "NF" => print "{nf} " pseudo prefix when EVEX.NF = 1 and print "{evex} "
1945
     pseudo prefix when instructions without NF, EGPR and VVVV,
1946
   "NE" => don't print "{evex} " pseudo prefix for some special instructions
1947
     in MAP4.
1948
   "ZU" => print 'zu' if EVEX.ZU=1.
1949
   "SC" => print suffix SCC for SCC insns
1950
   "YK" keep unused, to avoid ambiguity with the combined use of Y and K.
1951
   "YX" keep unused, to avoid ambiguity with the combined use of Y and X.
1952
   "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand, cond
1953
     being false, or no operand at all in 64bit mode, or if suffix_always
1954
     is true.
1955
   "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
1956
   "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
1957
   "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
1958
   "DQ" => print 'd' or 'q' depending on the VEX.W bit
1959
   "DF" => print default flag value for SCC insns
1960
   "BW" => print 'b' or 'w' depending on the VEX.W bit
1961
   "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
1962
     an operand size prefix, or suffix_always is true.  print
1963
     'q' if rex prefix is present.
1964
1965
   Many of the above letters print nothing in Intel mode.  See "putop"
1966
   for the details.
1967
1968
   Braces '{' and '}', and vertical bars '|', indicate alternative
1969
   mnemonic strings for AT&T and Intel.  */
1970
1971
static const struct dis386 dis386[] = {
1972
  /* 00 */
1973
  { "addB",   { Ebh1, Gb }, 0 },
1974
  { "addS",   { Evh1, Gv }, 0 },
1975
  { "addB",   { Gb, EbS }, 0 },
1976
  { "addS",   { Gv, EvS }, 0 },
1977
  { "addB",   { AL, Ib }, 0 },
1978
  { "addS",   { eAX, Iv }, 0 },
1979
  { X86_64_TABLE (X86_64_06) },
1980
  { X86_64_TABLE (X86_64_07) },
1981
  /* 08 */
1982
  { "orB",    { Ebh1, Gb }, 0 },
1983
  { "orS",    { Evh1, Gv }, 0 },
1984
  { "orB",    { Gb, EbS }, 0 },
1985
  { "orS",    { Gv, EvS }, 0 },
1986
  { "orB",    { AL, Ib }, 0 },
1987
  { "orS",    { eAX, Iv }, 0 },
1988
  { X86_64_TABLE (X86_64_0E) },
1989
  { Bad_Opcode }, /* 0x0f extended opcode escape */
1990
  /* 10 */
1991
  { "adcB",   { Ebh1, Gb }, 0 },
1992
  { "adcS",   { Evh1, Gv }, 0 },
1993
  { "adcB",   { Gb, EbS }, 0 },
1994
  { "adcS",   { Gv, EvS }, 0 },
1995
  { "adcB",   { AL, Ib }, 0 },
1996
  { "adcS",   { eAX, Iv }, 0 },
1997
  { X86_64_TABLE (X86_64_16) },
1998
  { X86_64_TABLE (X86_64_17) },
1999
  /* 18 */
2000
  { "sbbB",   { Ebh1, Gb }, 0 },
2001
  { "sbbS",   { Evh1, Gv }, 0 },
2002
  { "sbbB",   { Gb, EbS }, 0 },
2003
  { "sbbS",   { Gv, EvS }, 0 },
2004
  { "sbbB",   { AL, Ib }, 0 },
2005
  { "sbbS",   { eAX, Iv }, 0 },
2006
  { X86_64_TABLE (X86_64_1E) },
2007
  { X86_64_TABLE (X86_64_1F) },
2008
  /* 20 */
2009
  { "andB",   { Ebh1, Gb }, 0 },
2010
  { "andS",   { Evh1, Gv }, 0 },
2011
  { "andB",   { Gb, EbS }, 0 },
2012
  { "andS",   { Gv, EvS }, 0 },
2013
  { "andB",   { AL, Ib }, 0 },
2014
  { "andS",   { eAX, Iv }, 0 },
2015
  { Bad_Opcode }, /* SEG ES prefix */
2016
  { X86_64_TABLE (X86_64_27) },
2017
  /* 28 */
2018
  { "subB",   { Ebh1, Gb }, 0 },
2019
  { "subS",   { Evh1, Gv }, 0 },
2020
  { "subB",   { Gb, EbS }, 0 },
2021
  { "subS",   { Gv, EvS }, 0 },
2022
  { "subB",   { AL, Ib }, 0 },
2023
  { "subS",   { eAX, Iv }, 0 },
2024
  { Bad_Opcode }, /* SEG CS prefix */
2025
  { X86_64_TABLE (X86_64_2F) },
2026
  /* 30 */
2027
  { "xorB",   { Ebh1, Gb }, 0 },
2028
  { "xorS",   { Evh1, Gv }, 0 },
2029
  { "xorB",   { Gb, EbS }, 0 },
2030
  { "xorS",   { Gv, EvS }, 0 },
2031
  { "xorB",   { AL, Ib }, 0 },
2032
  { "xorS",   { eAX, Iv }, 0 },
2033
  { Bad_Opcode }, /* SEG SS prefix */
2034
  { X86_64_TABLE (X86_64_37) },
2035
  /* 38 */
2036
  { "cmpB",   { Eb, Gb }, 0 },
2037
  { "cmpS",   { Ev, Gv }, 0 },
2038
  { "cmpB",   { Gb, EbS }, 0 },
2039
  { "cmpS",   { Gv, EvS }, 0 },
2040
  { "cmpB",   { AL, Ib }, 0 },
2041
  { "cmpS",   { eAX, Iv }, 0 },
2042
  { Bad_Opcode }, /* SEG DS prefix */
2043
  { X86_64_TABLE (X86_64_3F) },
2044
  /* 40 */
2045
  { "inc{S|}",    { RMeAX }, 0 },
2046
  { "inc{S|}",    { RMeCX }, 0 },
2047
  { "inc{S|}",    { RMeDX }, 0 },
2048
  { "inc{S|}",    { RMeBX }, 0 },
2049
  { "inc{S|}",    { RMeSP }, 0 },
2050
  { "inc{S|}",    { RMeBP }, 0 },
2051
  { "inc{S|}",    { RMeSI }, 0 },
2052
  { "inc{S|}",    { RMeDI }, 0 },
2053
  /* 48 */
2054
  { "dec{S|}",    { RMeAX }, 0 },
2055
  { "dec{S|}",    { RMeCX }, 0 },
2056
  { "dec{S|}",    { RMeDX }, 0 },
2057
  { "dec{S|}",    { RMeBX }, 0 },
2058
  { "dec{S|}",    { RMeSP }, 0 },
2059
  { "dec{S|}",    { RMeBP }, 0 },
2060
  { "dec{S|}",    { RMeSI }, 0 },
2061
  { "dec{S|}",    { RMeDI }, 0 },
2062
  /* 50 */
2063
  { "push!P",   { RMrAX }, 0 },
2064
  { "push!P",   { RMrCX }, 0 },
2065
  { "push!P",   { RMrDX }, 0 },
2066
  { "push!P",   { RMrBX }, 0 },
2067
  { "push!P",   { RMrSP }, 0 },
2068
  { "push!P",   { RMrBP }, 0 },
2069
  { "push!P",   { RMrSI }, 0 },
2070
  { "push!P",   { RMrDI }, 0 },
2071
  /* 58 */
2072
  { "pop!P",    { RMrAX }, 0 },
2073
  { "pop!P",    { RMrCX }, 0 },
2074
  { "pop!P",    { RMrDX }, 0 },
2075
  { "pop!P",    { RMrBX }, 0 },
2076
  { "pop!P",    { RMrSP }, 0 },
2077
  { "pop!P",    { RMrBP }, 0 },
2078
  { "pop!P",    { RMrSI }, 0 },
2079
  { "pop!P",    { RMrDI }, 0 },
2080
  /* 60 */
2081
  { X86_64_TABLE (X86_64_60) },
2082
  { X86_64_TABLE (X86_64_61) },
2083
  { X86_64_TABLE (X86_64_62) },
2084
  { X86_64_TABLE (X86_64_63) },
2085
  { Bad_Opcode }, /* seg fs */
2086
  { Bad_Opcode }, /* seg gs */
2087
  { Bad_Opcode }, /* op size prefix */
2088
  { Bad_Opcode }, /* adr size prefix */
2089
  /* 68 */
2090
  { "pushP",    { sIv }, 0 },
2091
  { "imulS",    { Gv, Ev, Iv }, 0 },
2092
  { "pushP",    { sIbT }, 0 },
2093
  { "imulS",    { Gv, Ev, sIb }, 0 },
2094
  { "ins{b|}",    { Ybr, indirDX }, 0 },
2095
  { X86_64_TABLE (X86_64_6D) },
2096
  { "outs{b|}",   { indirDXr, Xb }, 0 },
2097
  { X86_64_TABLE (X86_64_6F) },
2098
  /* 70 */
2099
  { "joH",    { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2100
  { "jnoH",   { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2101
  { "jbH",    { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2102
  { "jaeH",   { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2103
  { "jeH",    { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2104
  { "jneH",   { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2105
  { "jbeH",   { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2106
  { "jaH",    { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2107
  /* 78 */
2108
  { "jsH",    { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2109
  { "jnsH",   { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2110
  { "jpH",    { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2111
  { "jnpH",   { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2112
  { "jlH",    { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2113
  { "jgeH",   { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2114
  { "jleH",   { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2115
  { "jgH",    { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2116
  /* 80 */
2117
  { REG_TABLE (REG_80) },
2118
  { REG_TABLE (REG_81) },
2119
  { X86_64_TABLE (X86_64_82) },
2120
  { REG_TABLE (REG_83) },
2121
  { "testB",    { Eb, Gb }, 0 },
2122
  { "testS",    { Ev, Gv }, 0 },
2123
  { "xchgB",    { Ebh2, Gb }, 0 },
2124
  { "xchgS",    { Evh2, Gv }, 0 },
2125
  /* 88 */
2126
  { "movB",   { Ebh3, Gb }, 0 },
2127
  { "movS",   { Evh3, Gv }, 0 },
2128
  { "movB",   { Gb, EbS }, 0 },
2129
  { "movS",   { Gv, EvS }, 0 },
2130
  { "movD",   { Sv, Sw }, 0 },
2131
  { "leaS",   { Gv, M }, 0 },
2132
  { "movD",   { Sw, Sv }, 0 },
2133
  { REG_TABLE (REG_8F) },
2134
  /* 90 */
2135
  { PREFIX_TABLE (PREFIX_90) },
2136
  { "xchgS",    { RMeCX, eAX }, 0 },
2137
  { "xchgS",    { RMeDX, eAX }, 0 },
2138
  { "xchgS",    { RMeBX, eAX }, 0 },
2139
  { "xchgS",    { RMeSP, eAX }, 0 },
2140
  { "xchgS",    { RMeBP, eAX }, 0 },
2141
  { "xchgS",    { RMeSI, eAX }, 0 },
2142
  { "xchgS",    { RMeDI, eAX }, 0 },
2143
  /* 98 */
2144
  { "cW{t|}R",    { XX }, 0 },
2145
  { "cR{t|}O",    { XX }, 0 },
2146
  { X86_64_TABLE (X86_64_9A) },
2147
  { Bad_Opcode }, /* fwait */
2148
  { "pushfP",   { XX }, 0 },
2149
  { "popfP",    { XX }, 0 },
2150
  { "sahf",   { XX }, 0 },
2151
  { "lahf",   { XX }, 0 },
2152
  /* a0 */
2153
  { "mov%LB",   { AL, Ob }, PREFIX_REX2_ILLEGAL },
2154
  { "mov%LS",   { { JMPABS_Fixup, eAX_reg }, { JMPABS_Fixup, v_mode } }, PREFIX_REX2_ILLEGAL },
2155
  { "mov%LB",   { Ob, AL }, PREFIX_REX2_ILLEGAL },
2156
  { "mov%LS",   { Ov, eAX }, PREFIX_REX2_ILLEGAL },
2157
  { "movs{b|}",   { Ybr, Xb }, PREFIX_REX2_ILLEGAL },
2158
  { "movs{R|}",   { Yvr, Xv }, PREFIX_REX2_ILLEGAL },
2159
  { "cmps{b|}",   { Xb, Yb }, PREFIX_REX2_ILLEGAL },
2160
  { "cmps{R|}",   { Xv, Yv }, PREFIX_REX2_ILLEGAL },
2161
  /* a8 */
2162
  { "testB",    { AL, Ib }, PREFIX_REX2_ILLEGAL },
2163
  { "testS",    { eAX, Iv }, PREFIX_REX2_ILLEGAL },
2164
  { "stosB",    { Ybr, AL }, PREFIX_REX2_ILLEGAL },
2165
  { "stosS",    { Yvr, eAX }, PREFIX_REX2_ILLEGAL },
2166
  { "lodsB",    { ALr, Xb }, PREFIX_REX2_ILLEGAL },
2167
  { "lodsS",    { eAXr, Xv }, PREFIX_REX2_ILLEGAL },
2168
  { "scasB",    { AL, Yb }, PREFIX_REX2_ILLEGAL },
2169
  { "scasS",    { eAX, Yv }, PREFIX_REX2_ILLEGAL },
2170
  /* b0 */
2171
  { "movB",   { RMAL, Ib }, 0 },
2172
  { "movB",   { RMCL, Ib }, 0 },
2173
  { "movB",   { RMDL, Ib }, 0 },
2174
  { "movB",   { RMBL, Ib }, 0 },
2175
  { "movB",   { RMAH, Ib }, 0 },
2176
  { "movB",   { RMCH, Ib }, 0 },
2177
  { "movB",   { RMDH, Ib }, 0 },
2178
  { "movB",   { RMBH, Ib }, 0 },
2179
  /* b8 */
2180
  { "mov%LV",   { RMeAX, Iv64 }, 0 },
2181
  { "mov%LV",   { RMeCX, Iv64 }, 0 },
2182
  { "mov%LV",   { RMeDX, Iv64 }, 0 },
2183
  { "mov%LV",   { RMeBX, Iv64 }, 0 },
2184
  { "mov%LV",   { RMeSP, Iv64 }, 0 },
2185
  { "mov%LV",   { RMeBP, Iv64 }, 0 },
2186
  { "mov%LV",   { RMeSI, Iv64 }, 0 },
2187
  { "mov%LV",   { RMeDI, Iv64 }, 0 },
2188
  /* c0 */
2189
  { REG_TABLE (REG_C0) },
2190
  { REG_TABLE (REG_C1) },
2191
  { X86_64_TABLE (X86_64_C2) },
2192
  { X86_64_TABLE (X86_64_C3) },
2193
  { X86_64_TABLE (X86_64_C4) },
2194
  { X86_64_TABLE (X86_64_C5) },
2195
  { REG_TABLE (REG_C6) },
2196
  { REG_TABLE (REG_C7) },
2197
  /* c8 */
2198
  { "enterP",   { Iw, Ib }, 0 },
2199
  { "leaveP",   { XX }, 0 },
2200
  { "{l|}ret{|f}%LP", { Iw }, 0 },
2201
  { "{l|}ret{|f}%LP", { XX }, 0 },
2202
  { "int3",   { XX }, 0 },
2203
  { "int",    { Ib }, 0 },
2204
  { X86_64_TABLE (X86_64_CE) },
2205
  { "iret%LP",    { XX }, 0 },
2206
  /* d0 */
2207
  { REG_TABLE (REG_D0) },
2208
  { REG_TABLE (REG_D1) },
2209
  { REG_TABLE (REG_D2) },
2210
  { REG_TABLE (REG_D3) },
2211
  { X86_64_TABLE (X86_64_D4) },
2212
  { X86_64_TABLE (X86_64_D5) },
2213
  { X86_64_TABLE (X86_64_D6) },
2214
  { "xlat",   { DSBX }, 0 },
2215
  /* d8 */
2216
  { FLOAT },
2217
  { FLOAT },
2218
  { FLOAT },
2219
  { FLOAT },
2220
  { FLOAT },
2221
  { FLOAT },
2222
  { FLOAT },
2223
  { FLOAT },
2224
  /* e0 */
2225
  { "loopneFH",   { Jb, XX, loop_jcxz_flag }, PREFIX_REX2_ILLEGAL },
2226
  { "loopeFH",    { Jb, XX, loop_jcxz_flag }, PREFIX_REX2_ILLEGAL },
2227
  { "loopFH",   { Jb, XX, loop_jcxz_flag }, PREFIX_REX2_ILLEGAL },
2228
  { "jEcxzH",   { Jb, XX, loop_jcxz_flag }, PREFIX_REX2_ILLEGAL },
2229
  { "inB",    { AL, Ib }, PREFIX_REX2_ILLEGAL },
2230
  { "inG",    { zAX, Ib }, PREFIX_REX2_ILLEGAL },
2231
  { "outB",   { Ib, AL }, PREFIX_REX2_ILLEGAL },
2232
  { "outG",   { Ib, zAX }, PREFIX_REX2_ILLEGAL },
2233
  /* e8 */
2234
  { X86_64_TABLE (X86_64_E8) },
2235
  { X86_64_TABLE (X86_64_E9) },
2236
  { X86_64_TABLE (X86_64_EA) },
2237
  { "jmp",    { Jb, BND }, PREFIX_REX2_ILLEGAL },
2238
  { "inB",    { AL, indirDX }, PREFIX_REX2_ILLEGAL },
2239
  { "inG",    { zAX, indirDX }, PREFIX_REX2_ILLEGAL },
2240
  { "outB",   { indirDX, AL }, PREFIX_REX2_ILLEGAL },
2241
  { "outG",   { indirDX, zAX }, PREFIX_REX2_ILLEGAL },
2242
  /* f0 */
2243
  { Bad_Opcode }, /* lock prefix */
2244
  { "int1",   { XX }, 0 },
2245
  { Bad_Opcode }, /* repne */
2246
  { Bad_Opcode }, /* repz */
2247
  { "hlt",    { XX }, 0 },
2248
  { "cmc",    { XX }, 0 },
2249
  { REG_TABLE (REG_F6) },
2250
  { REG_TABLE (REG_F7) },
2251
  /* f8 */
2252
  { "clc",    { XX }, 0 },
2253
  { "stc",    { XX }, 0 },
2254
  { "cli",    { XX }, 0 },
2255
  { "sti",    { XX }, 0 },
2256
  { "cld",    { XX }, 0 },
2257
  { "std",    { XX }, 0 },
2258
  { REG_TABLE (REG_FE) },
2259
  { REG_TABLE (REG_FF) },
2260
};
2261
2262
static const struct dis386 dis386_twobyte[] = {
2263
  /* 00 */
2264
  { REG_TABLE (REG_0F00 ) },
2265
  { REG_TABLE (REG_0F01 ) },
2266
  { "larS",   { Gv, Sv }, 0 },
2267
  { "lslS",   { Gv, Sv }, 0 },
2268
  { Bad_Opcode },
2269
  { "syscall",    { XX }, 0 },
2270
  { "clts",   { XX }, 0 },
2271
  { "sysret%LQ",    { XX }, 0 },
2272
  /* 08 */
2273
  { "invd",   { XX }, 0 },
2274
  { PREFIX_TABLE (PREFIX_0F09) },
2275
  { Bad_Opcode },
2276
  { "ud2",    { XX }, 0 },
2277
  { Bad_Opcode },
2278
  { REG_TABLE (REG_0F0D) },
2279
  { "femms",    { XX }, 0 },
2280
  { "",     { MX, EM, OPSUF }, 0 }, /* See OP_3DNowSuffix.  */
2281
  /* 10 */
2282
  { PREFIX_TABLE (PREFIX_0F10) },
2283
  { PREFIX_TABLE (PREFIX_0F11) },
2284
  { PREFIX_TABLE (PREFIX_0F12) },
2285
  { "movlpX",   { Mq, XM }, PREFIX_OPCODE },
2286
  { "unpcklpX",   { XM, EXx }, PREFIX_OPCODE },
2287
  { "unpckhpX",   { XM, EXx }, PREFIX_OPCODE },
2288
  { PREFIX_TABLE (PREFIX_0F16) },
2289
  { "movhpX",   { Mq, XM }, PREFIX_OPCODE },
2290
  /* 18 */
2291
  { REG_TABLE (REG_0F18) },
2292
  { "nopQ",   { Ev }, 0 },
2293
  { PREFIX_TABLE (PREFIX_0F1A) },
2294
  { PREFIX_TABLE (PREFIX_0F1B) },
2295
  { PREFIX_TABLE (PREFIX_0F1C) },
2296
  { "nopQ",   { Ev }, 0 },
2297
  { PREFIX_TABLE (PREFIX_0F1E) },
2298
  { "nopQ",   { Ev }, 0 },
2299
  /* 20 */
2300
  { "movZ",   { Em, Cm }, 0 },
2301
  { "movZ",   { Em, Dm }, 0 },
2302
  { "movZ",   { Cm, Em }, 0 },
2303
  { "movZ",   { Dm, Em }, 0 },
2304
  { X86_64_TABLE (X86_64_0F24) },
2305
  { Bad_Opcode },
2306
  { X86_64_TABLE (X86_64_0F26) },
2307
  { Bad_Opcode },
2308
  /* 28 */
2309
  { "movapX",   { XM, EXx }, PREFIX_OPCODE },
2310
  { "movapX",   { EXxS, XM }, PREFIX_OPCODE },
2311
  { PREFIX_TABLE (PREFIX_0F2A) },
2312
  { PREFIX_TABLE (PREFIX_0F2B) },
2313
  { PREFIX_TABLE (PREFIX_0F2C) },
2314
  { PREFIX_TABLE (PREFIX_0F2D) },
2315
  { PREFIX_TABLE (PREFIX_0F2E) },
2316
  { PREFIX_TABLE (PREFIX_0F2F) },
2317
  /* 30 */
2318
  { "wrmsr",    { XX }, PREFIX_REX2_ILLEGAL },
2319
  { "rdtsc",    { XX }, PREFIX_REX2_ILLEGAL },
2320
  { "rdmsr",    { XX }, PREFIX_REX2_ILLEGAL },
2321
  { "rdpmc",    { XX }, PREFIX_REX2_ILLEGAL },
2322
  { "sysenter",   { SEP }, PREFIX_REX2_ILLEGAL },
2323
  { "sysexit%LQ", { SEP }, PREFIX_REX2_ILLEGAL },
2324
  { Bad_Opcode },
2325
  { "getsec",   { XX }, PREFIX_REX2_ILLEGAL },
2326
  /* 38 */
2327
  { THREE_BYTE_TABLE (THREE_BYTE_0F38) },
2328
  { Bad_Opcode },
2329
  { THREE_BYTE_TABLE (THREE_BYTE_0F3A) },
2330
  { Bad_Opcode },
2331
  { Bad_Opcode },
2332
  { Bad_Opcode },
2333
  { Bad_Opcode },
2334
  { Bad_Opcode },
2335
  /* 40 */
2336
  { "cmovoS",   { Gv, Ev }, 0 },
2337
  { "cmovnoS",    { Gv, Ev }, 0 },
2338
  { "cmovbS",   { Gv, Ev }, 0 },
2339
  { "cmovaeS",    { Gv, Ev }, 0 },
2340
  { "cmoveS",   { Gv, Ev }, 0 },
2341
  { "cmovneS",    { Gv, Ev }, 0 },
2342
  { "cmovbeS",    { Gv, Ev }, 0 },
2343
  { "cmovaS",   { Gv, Ev }, 0 },
2344
  /* 48 */
2345
  { "cmovsS",   { Gv, Ev }, 0 },
2346
  { "cmovnsS",    { Gv, Ev }, 0 },
2347
  { "cmovpS",   { Gv, Ev }, 0 },
2348
  { "cmovnpS",    { Gv, Ev }, 0 },
2349
  { "cmovlS",   { Gv, Ev }, 0 },
2350
  { "cmovgeS",    { Gv, Ev }, 0 },
2351
  { "cmovleS",    { Gv, Ev }, 0 },
2352
  { "cmovgS",   { Gv, Ev }, 0 },
2353
  /* 50 */
2354
  { "movmskpX",   { Gdq, Ux }, PREFIX_OPCODE },
2355
  { PREFIX_TABLE (PREFIX_0F51) },
2356
  { PREFIX_TABLE (PREFIX_0F52) },
2357
  { PREFIX_TABLE (PREFIX_0F53) },
2358
  { "andpX",    { XM, EXx }, PREFIX_OPCODE },
2359
  { "andnpX",   { XM, EXx }, PREFIX_OPCODE },
2360
  { "orpX",   { XM, EXx }, PREFIX_OPCODE },
2361
  { "xorpX",    { XM, EXx }, PREFIX_OPCODE },
2362
  /* 58 */
2363
  { PREFIX_TABLE (PREFIX_0F58) },
2364
  { PREFIX_TABLE (PREFIX_0F59) },
2365
  { PREFIX_TABLE (PREFIX_0F5A) },
2366
  { PREFIX_TABLE (PREFIX_0F5B) },
2367
  { PREFIX_TABLE (PREFIX_0F5C) },
2368
  { PREFIX_TABLE (PREFIX_0F5D) },
2369
  { PREFIX_TABLE (PREFIX_0F5E) },
2370
  { PREFIX_TABLE (PREFIX_0F5F) },
2371
  /* 60 */
2372
  { PREFIX_TABLE (PREFIX_0F60) },
2373
  { PREFIX_TABLE (PREFIX_0F61) },
2374
  { PREFIX_TABLE (PREFIX_0F62) },
2375
  { "packsswb",   { MX, EM }, PREFIX_OPCODE },
2376
  { "pcmpgtb",    { MX, EM }, PREFIX_OPCODE },
2377
  { "pcmpgtw",    { MX, EM }, PREFIX_OPCODE },
2378
  { "pcmpgtd",    { MX, EM }, PREFIX_OPCODE },
2379
  { "packuswb",   { MX, EM }, PREFIX_OPCODE },
2380
  /* 68 */
2381
  { "punpckhbw",  { MX, EM }, PREFIX_OPCODE },
2382
  { "punpckhwd",  { MX, EM }, PREFIX_OPCODE },
2383
  { "punpckhdq",  { MX, EM }, PREFIX_OPCODE },
2384
  { "packssdw",   { MX, EM }, PREFIX_OPCODE },
2385
  { "punpcklqdq", { XM, EXx }, PREFIX_DATA },
2386
  { "punpckhqdq", { XM, EXx }, PREFIX_DATA },
2387
  { "movK",   { MX, Edq }, PREFIX_OPCODE },
2388
  { PREFIX_TABLE (PREFIX_0F6F) },
2389
  /* 70 */
2390
  { PREFIX_TABLE (PREFIX_0F70) },
2391
  { REG_TABLE (REG_0F71) },
2392
  { REG_TABLE (REG_0F72) },
2393
  { REG_TABLE (REG_0F73) },
2394
  { "pcmpeqb",    { MX, EM }, PREFIX_OPCODE },
2395
  { "pcmpeqw",    { MX, EM }, PREFIX_OPCODE },
2396
  { "pcmpeqd",    { MX, EM }, PREFIX_OPCODE },
2397
  { "emms",   { XX }, PREFIX_OPCODE },
2398
  /* 78 */
2399
  { PREFIX_TABLE (PREFIX_0F78) },
2400
  { PREFIX_TABLE (PREFIX_0F79) },
2401
  { Bad_Opcode },
2402
  { Bad_Opcode },
2403
  { PREFIX_TABLE (PREFIX_0F7C) },
2404
  { PREFIX_TABLE (PREFIX_0F7D) },
2405
  { PREFIX_TABLE (PREFIX_0F7E) },
2406
  { PREFIX_TABLE (PREFIX_0F7F) },
2407
  /* 80 */
2408
  { "jo@H",   { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2409
  { "jno@H",    { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2410
  { "jb@H",   { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2411
  { "jae@H",    { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2412
  { "je@H",   { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2413
  { "jne@H",    { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2414
  { "jbe@H",    { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2415
  { "ja@H",   { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2416
  /* 88 */
2417
  { "js@H",   { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2418
  { "jns@H",    { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2419
  { "jp@H",   { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2420
  { "jnp@H",    { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2421
  { "jl@H",   { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2422
  { "jge@H",    { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2423
  { "jle@H",    { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2424
  { "jg@H",   { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2425
  /* 90 */
2426
  { "seto",   { Eb }, 0 },
2427
  { "setno",    { Eb }, 0 },
2428
  { "setb",   { Eb }, 0 },
2429
  { "setae",    { Eb }, 0 },
2430
  { "sete",   { Eb }, 0 },
2431
  { "setne",    { Eb }, 0 },
2432
  { "setbe",    { Eb }, 0 },
2433
  { "seta",   { Eb }, 0 },
2434
  /* 98 */
2435
  { "sets",   { Eb }, 0 },
2436
  { "setns",    { Eb }, 0 },
2437
  { "setp",   { Eb }, 0 },
2438
  { "setnp",    { Eb }, 0 },
2439
  { "setl",   { Eb }, 0 },
2440
  { "setge",    { Eb }, 0 },
2441
  { "setle",    { Eb }, 0 },
2442
  { "setg",   { Eb }, 0 },
2443
  /* a0 */
2444
  { "pushP",    { fs }, 0 },
2445
  { "popP",   { fs }, 0 },
2446
  { "cpuid",    { XX }, 0 },
2447
  { "btS",    { Ev, Gv }, 0 },
2448
  { "shldS",    { Ev, Gv, Ib }, 0 },
2449
  { "shldS",    { Ev, Gv, CL }, 0 },
2450
  { REG_TABLE (REG_0FA6) },
2451
  { REG_TABLE (REG_0FA7) },
2452
  /* a8 */
2453
  { "pushP",    { gs }, 0 },
2454
  { "popP",   { gs }, 0 },
2455
  { "rsm",    { XX }, 0 },
2456
  { "btsS",   { Evh1, Gv }, 0 },
2457
  { "shrdS",    { Ev, Gv, Ib }, 0 },
2458
  { "shrdS",    { Ev, Gv, CL }, 0 },
2459
  { REG_TABLE (REG_0FAE) },
2460
  { "imulS",    { Gv, Ev }, 0 },
2461
  /* b0 */
2462
  { "cmpxchgB",   { Ebh1, Gb }, 0 },
2463
  { "cmpxchgS",   { Evh1, Gv }, 0 },
2464
  { "lssS",   { Gv, Mp }, 0 },
2465
  { "btrS",   { Evh1, Gv }, 0 },
2466
  { "lfsS",   { Gv, Mp }, 0 },
2467
  { "lgsS",   { Gv, Mp }, 0 },
2468
  { "movz{bR|x}", { Gv, Eb }, 0 },
2469
  { "movz{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movzww ! */
2470
  /* b8 */
2471
  { PREFIX_TABLE (PREFIX_0FB8) },
2472
  { "ud1S",   { Gv, Ev }, 0 },
2473
  { REG_TABLE (REG_0FBA) },
2474
  { "btcS",   { Evh1, Gv }, 0 },
2475
  { PREFIX_TABLE (PREFIX_0FBC) },
2476
  { PREFIX_TABLE (PREFIX_0FBD) },
2477
  { "movs{bR|x}", { Gv, Eb }, 0 },
2478
  { "movs{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movsww ! */
2479
  /* c0 */
2480
  { "xaddB",    { Ebh1, Gb }, 0 },
2481
  { "xaddS",    { Evh1, Gv }, 0 },
2482
  { PREFIX_TABLE (PREFIX_0FC2) },
2483
  { "movntiS",    { Mdq, Gdq }, PREFIX_OPCODE },
2484
  { "pinsrw",   { MX, Edw, Ib }, PREFIX_OPCODE },
2485
  { "pextrw",   { Gd, Nq, Ib }, PREFIX_OPCODE },
2486
  { "shufpX",   { XM, EXx, Ib }, PREFIX_OPCODE },
2487
  { REG_TABLE (REG_0FC7) },
2488
  /* c8 */
2489
  { "bswap",    { RMeAX }, 0 },
2490
  { "bswap",    { RMeCX }, 0 },
2491
  { "bswap",    { RMeDX }, 0 },
2492
  { "bswap",    { RMeBX }, 0 },
2493
  { "bswap",    { RMeSP }, 0 },
2494
  { "bswap",    { RMeBP }, 0 },
2495
  { "bswap",    { RMeSI }, 0 },
2496
  { "bswap",    { RMeDI }, 0 },
2497
  /* d0 */
2498
  { PREFIX_TABLE (PREFIX_0FD0) },
2499
  { "psrlw",    { MX, EM }, PREFIX_OPCODE },
2500
  { "psrld",    { MX, EM }, PREFIX_OPCODE },
2501
  { "psrlq",    { MX, EM }, PREFIX_OPCODE },
2502
  { "paddq",    { MX, EM }, PREFIX_OPCODE },
2503
  { "pmullw",   { MX, EM }, PREFIX_OPCODE },
2504
  { PREFIX_TABLE (PREFIX_0FD6) },
2505
  { "pmovmskb",   { Gdq, Nq }, PREFIX_OPCODE },
2506
  /* d8 */
2507
  { "psubusb",    { MX, EM }, PREFIX_OPCODE },
2508
  { "psubusw",    { MX, EM }, PREFIX_OPCODE },
2509
  { "pminub",   { MX, EM }, PREFIX_OPCODE },
2510
  { "pand",   { MX, EM }, PREFIX_OPCODE },
2511
  { "paddusb",    { MX, EM }, PREFIX_OPCODE },
2512
  { "paddusw",    { MX, EM }, PREFIX_OPCODE },
2513
  { "pmaxub",   { MX, EM }, PREFIX_OPCODE },
2514
  { "pandn",    { MX, EM }, PREFIX_OPCODE },
2515
  /* e0 */
2516
  { "pavgb",    { MX, EM }, PREFIX_OPCODE },
2517
  { "psraw",    { MX, EM }, PREFIX_OPCODE },
2518
  { "psrad",    { MX, EM }, PREFIX_OPCODE },
2519
  { "pavgw",    { MX, EM }, PREFIX_OPCODE },
2520
  { "pmulhuw",    { MX, EM }, PREFIX_OPCODE },
2521
  { "pmulhw",   { MX, EM }, PREFIX_OPCODE },
2522
  { PREFIX_TABLE (PREFIX_0FE6) },
2523
  { PREFIX_TABLE (PREFIX_0FE7) },
2524
  /* e8 */
2525
  { "psubsb",   { MX, EM }, PREFIX_OPCODE },
2526
  { "psubsw",   { MX, EM }, PREFIX_OPCODE },
2527
  { "pminsw",   { MX, EM }, PREFIX_OPCODE },
2528
  { "por",    { MX, EM }, PREFIX_OPCODE },
2529
  { "paddsb",   { MX, EM }, PREFIX_OPCODE },
2530
  { "paddsw",   { MX, EM }, PREFIX_OPCODE },
2531
  { "pmaxsw",   { MX, EM }, PREFIX_OPCODE },
2532
  { "pxor",   { MX, EM }, PREFIX_OPCODE },
2533
  /* f0 */
2534
  { PREFIX_TABLE (PREFIX_0FF0) },
2535
  { "psllw",    { MX, EM }, PREFIX_OPCODE },
2536
  { "pslld",    { MX, EM }, PREFIX_OPCODE },
2537
  { "psllq",    { MX, EM }, PREFIX_OPCODE },
2538
  { "pmuludq",    { MX, EM }, PREFIX_OPCODE },
2539
  { "pmaddwd",    { MX, EM }, PREFIX_OPCODE },
2540
  { "psadbw",   { MX, EM }, PREFIX_OPCODE },
2541
  { PREFIX_TABLE (PREFIX_0FF7) },
2542
  /* f8 */
2543
  { "psubb",    { MX, EM }, PREFIX_OPCODE },
2544
  { "psubw",    { MX, EM }, PREFIX_OPCODE },
2545
  { "psubd",    { MX, EM }, PREFIX_OPCODE },
2546
  { "psubq",    { MX, EM }, PREFIX_OPCODE },
2547
  { "paddb",    { MX, EM }, PREFIX_OPCODE },
2548
  { "paddw",    { MX, EM }, PREFIX_OPCODE },
2549
  { "paddd",    { MX, EM }, PREFIX_OPCODE },
2550
  { "ud0S",   { Gv, Ev }, 0 },
2551
};
2552
2553
static const bool onebyte_has_modrm[256] = {
2554
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2555
  /*       -------------------------------        */
2556
  /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2557
  /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2558
  /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2559
  /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2560
  /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2561
  /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2562
  /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2563
  /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2564
  /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2565
  /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2566
  /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2567
  /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2568
  /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2569
  /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2570
  /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2571
  /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1  /* f0 */
2572
  /*       -------------------------------        */
2573
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2574
};
2575
2576
static const bool twobyte_has_modrm[256] = {
2577
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2578
  /*       -------------------------------        */
2579
  /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
2580
  /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
2581
  /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
2582
  /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
2583
  /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
2584
  /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2585
  /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
2586
  /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
2587
  /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2588
  /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
2589
  /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
2590
  /* b0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bf */
2591
  /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
2592
  /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
2593
  /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
2594
  /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1  /* ff */
2595
  /*       -------------------------------        */
2596
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2597
};
2598
2599
2600
struct op
2601
  {
2602
    const char *name;
2603
    unsigned int len;
2604
  };
2605
2606
/* If we are accessing mod/rm/reg without need_modrm set, then the
2607
   values are stale.  Hitting this abort likely indicates that you
2608
   need to update onebyte_has_modrm or twobyte_has_modrm.  */
2609
2.57M
#define MODRM_CHECK  if (!ins->need_modrm) abort ()
2610
2611
static const char intel_index16[][6] = {
2612
  "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2613
};
2614
2615
static const char att_names64[][8] = {
2616
  "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
2617
  "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15",
2618
  "%r16", "%r17", "%r18", "%r19", "%r20", "%r21", "%r22", "%r23",
2619
  "%r24", "%r25", "%r26", "%r27", "%r28", "%r29", "%r30", "%r31",
2620
};
2621
static const char att_names32[][8] = {
2622
  "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
2623
  "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d",
2624
  "%r16d", "%r17d", "%r18d", "%r19d", "%r20d", "%r21d", "%r22d", "%r23d",
2625
  "%r24d", "%r25d", "%r26d", "%r27d", "%r28d", "%r29d", "%r30d", "%r31d",
2626
};
2627
static const char att_names16[][8] = {
2628
  "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
2629
  "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w",
2630
  "%r16w", "%r17w", "%r18w", "%r19w", "%r20w", "%r21w", "%r22w", "%r23w",
2631
  "%r24w", "%r25w", "%r26w", "%r27w", "%r28w", "%r29w", "%r30w", "%r31w",
2632
};
2633
static const char att_names8[][8] = {
2634
  "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
2635
};
2636
static const char att_names8rex[][8] = {
2637
  "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
2638
  "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b",
2639
  "%r16b", "%r17b", "%r18b", "%r19b", "%r20b", "%r21b", "%r22b", "%r23b",
2640
  "%r24b", "%r25b", "%r26b", "%r27b", "%r28b", "%r29b", "%r30b", "%r31b",
2641
};
2642
static const char att_names_seg[][4] = {
2643
  "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
2644
};
2645
static const char att_index64[] = "%riz";
2646
static const char att_index32[] = "%eiz";
2647
static const char att_index16[][8] = {
2648
  "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
2649
};
2650
2651
static const char att_names_mm[][8] = {
2652
  "%mm0", "%mm1", "%mm2", "%mm3",
2653
  "%mm4", "%mm5", "%mm6", "%mm7"
2654
};
2655
2656
static const char att_names_bnd[][8] = {
2657
  "%bnd0", "%bnd1", "%bnd2", "%bnd3"
2658
};
2659
2660
static const char att_names_xmm[][8] = {
2661
  "%xmm0", "%xmm1", "%xmm2", "%xmm3",
2662
  "%xmm4", "%xmm5", "%xmm6", "%xmm7",
2663
  "%xmm8", "%xmm9", "%xmm10", "%xmm11",
2664
  "%xmm12", "%xmm13", "%xmm14", "%xmm15",
2665
  "%xmm16", "%xmm17", "%xmm18", "%xmm19",
2666
  "%xmm20", "%xmm21", "%xmm22", "%xmm23",
2667
  "%xmm24", "%xmm25", "%xmm26", "%xmm27",
2668
  "%xmm28", "%xmm29", "%xmm30", "%xmm31"
2669
};
2670
2671
static const char att_names_ymm[][8] = {
2672
  "%ymm0", "%ymm1", "%ymm2", "%ymm3",
2673
  "%ymm4", "%ymm5", "%ymm6", "%ymm7",
2674
  "%ymm8", "%ymm9", "%ymm10", "%ymm11",
2675
  "%ymm12", "%ymm13", "%ymm14", "%ymm15",
2676
  "%ymm16", "%ymm17", "%ymm18", "%ymm19",
2677
  "%ymm20", "%ymm21", "%ymm22", "%ymm23",
2678
  "%ymm24", "%ymm25", "%ymm26", "%ymm27",
2679
  "%ymm28", "%ymm29", "%ymm30", "%ymm31"
2680
};
2681
2682
static const char att_names_zmm[][8] = {
2683
  "%zmm0", "%zmm1", "%zmm2", "%zmm3",
2684
  "%zmm4", "%zmm5", "%zmm6", "%zmm7",
2685
  "%zmm8", "%zmm9", "%zmm10", "%zmm11",
2686
  "%zmm12", "%zmm13", "%zmm14", "%zmm15",
2687
  "%zmm16", "%zmm17", "%zmm18", "%zmm19",
2688
  "%zmm20", "%zmm21", "%zmm22", "%zmm23",
2689
  "%zmm24", "%zmm25", "%zmm26", "%zmm27",
2690
  "%zmm28", "%zmm29", "%zmm30", "%zmm31"
2691
};
2692
2693
static const char att_names_tmm[][8] = {
2694
  "%tmm0", "%tmm1", "%tmm2", "%tmm3",
2695
  "%tmm4", "%tmm5", "%tmm6", "%tmm7"
2696
};
2697
2698
static const char att_names_mask[][8] = {
2699
  "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
2700
};
2701
2702
static const char *const names_rounding[] =
2703
{
2704
  "{rn-",
2705
  "{rd-",
2706
  "{ru-",
2707
  "{rz-"
2708
};
2709
2710
static const struct dis386 reg_table[][8] = {
2711
  /* REG_80 */
2712
  {
2713
    { "addA", { Ebh1, Ib }, 0 },
2714
    { "orA",  { Ebh1, Ib }, 0 },
2715
    { "adcA", { Ebh1, Ib }, 0 },
2716
    { "sbbA", { Ebh1, Ib }, 0 },
2717
    { "andA", { Ebh1, Ib }, 0 },
2718
    { "subA", { Ebh1, Ib }, 0 },
2719
    { "xorA", { Ebh1, Ib }, 0 },
2720
    { "cmpA", { Eb, Ib }, 0 },
2721
  },
2722
  /* REG_81 */
2723
  {
2724
    { "addQ", { Evh1, Iv }, 0 },
2725
    { "orQ",  { Evh1, Iv }, 0 },
2726
    { "adcQ", { Evh1, Iv }, 0 },
2727
    { "sbbQ", { Evh1, Iv }, 0 },
2728
    { "andQ", { Evh1, Iv }, 0 },
2729
    { "subQ", { Evh1, Iv }, 0 },
2730
    { "xorQ", { Evh1, Iv }, 0 },
2731
    { "cmpQ", { Ev, Iv }, 0 },
2732
  },
2733
  /* REG_83 */
2734
  {
2735
    { "addQ", { Evh1, sIb }, 0 },
2736
    { "orQ",  { Evh1, sIb }, 0 },
2737
    { "adcQ", { Evh1, sIb }, 0 },
2738
    { "sbbQ", { Evh1, sIb }, 0 },
2739
    { "andQ", { Evh1, sIb }, 0 },
2740
    { "subQ", { Evh1, sIb }, 0 },
2741
    { "xorQ", { Evh1, sIb }, 0 },
2742
    { "cmpQ", { Ev, sIb }, 0 },
2743
  },
2744
  /* REG_8F */
2745
  {
2746
    { "pop{P|}", { stackEv }, 0 },
2747
    { XOP_8F_TABLE () },
2748
    { Bad_Opcode },
2749
    { Bad_Opcode },
2750
    { Bad_Opcode },
2751
    { XOP_8F_TABLE () },
2752
  },
2753
  /* REG_C0 */
2754
  {
2755
    { "%NFrolA",  { VexGb, Eb, Ib }, NO_PREFIX },
2756
    { "%NFrorA",  { VexGb, Eb, Ib }, NO_PREFIX },
2757
    { "rclA", { VexGb, Eb, Ib }, NO_PREFIX },
2758
    { "rcrA", { VexGb, Eb, Ib }, NO_PREFIX },
2759
    { "%NFshlA",  { VexGb, Eb, Ib }, NO_PREFIX },
2760
    { "%NFshrA",  { VexGb, Eb, Ib }, NO_PREFIX },
2761
    { "%NFshlA",  { VexGb, Eb, Ib }, NO_PREFIX },
2762
    { "%NFsarA",  { VexGb, Eb, Ib }, NO_PREFIX },
2763
  },
2764
  /* REG_C1 */
2765
  {
2766
    { "%NFrolQ",  { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
2767
    { "%NFrorQ",  { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
2768
    { "rclQ", { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
2769
    { "rcrQ", { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
2770
    { "%NFshlQ",  { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
2771
    { "%NFshrQ",  { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
2772
    { "%NFshlQ",  { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
2773
    { "%NFsarQ",  { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
2774
  },
2775
  /* REG_C6 */
2776
  {
2777
    { "movA", { Ebh3, Ib }, 0 },
2778
    { Bad_Opcode },
2779
    { Bad_Opcode },
2780
    { Bad_Opcode },
2781
    { Bad_Opcode },
2782
    { Bad_Opcode },
2783
    { Bad_Opcode },
2784
    { RM_TABLE (RM_C6_REG_7) },
2785
  },
2786
  /* REG_C7 */
2787
  {
2788
    { "movQ", { Evh3, Iv }, 0 },
2789
    { Bad_Opcode },
2790
    { Bad_Opcode },
2791
    { Bad_Opcode },
2792
    { Bad_Opcode },
2793
    { Bad_Opcode },
2794
    { Bad_Opcode },
2795
    { RM_TABLE (RM_C7_REG_7) },
2796
  },
2797
  /* REG_D0 */
2798
  {
2799
    { "%NFrolA",  { VexGb, Eb, I1 }, NO_PREFIX },
2800
    { "%NFrorA",  { VexGb, Eb, I1 }, NO_PREFIX },
2801
    { "rclA", { VexGb, Eb, I1 }, NO_PREFIX },
2802
    { "rcrA", { VexGb, Eb, I1 }, NO_PREFIX },
2803
    { "%NFshlA",  { VexGb, Eb, I1 }, NO_PREFIX },
2804
    { "%NFshrA",  { VexGb, Eb, I1 }, NO_PREFIX },
2805
    { "%NFshlA",  { VexGb, Eb, I1 }, NO_PREFIX },
2806
    { "%NFsarA",  { VexGb, Eb, I1 }, NO_PREFIX },
2807
  },
2808
  /* REG_D1 */
2809
  {
2810
    { "%NFrolQ",  { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
2811
    { "%NFrorQ",  { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
2812
    { "rclQ", { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
2813
    { "rcrQ", { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
2814
    { "%NFshlQ",  { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
2815
    { "%NFshrQ",  { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
2816
    { "%NFshlQ",  { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
2817
    { "%NFsarQ",  { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
2818
  },
2819
  /* REG_D2 */
2820
  {
2821
    { "%NFrolA",  { VexGb, Eb, CL }, NO_PREFIX },
2822
    { "%NFrorA",  { VexGb, Eb, CL }, NO_PREFIX },
2823
    { "rclA", { VexGb, Eb, CL }, NO_PREFIX },
2824
    { "rcrA", { VexGb, Eb, CL }, NO_PREFIX },
2825
    { "%NFshlA",  { VexGb, Eb, CL }, NO_PREFIX },
2826
    { "%NFshrA",  { VexGb, Eb, CL }, NO_PREFIX },
2827
    { "%NFshlA",  { VexGb, Eb, CL }, NO_PREFIX },
2828
    { "%NFsarA",  { VexGb, Eb, CL }, NO_PREFIX },
2829
  },
2830
  /* REG_D3 */
2831
  {
2832
    { "%NFrolQ",  { VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
2833
    { "%NFrorQ",  { VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
2834
    { "rclQ", { VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
2835
    { "rcrQ", { VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
2836
    { "%NFshlQ",  { VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
2837
    { "%NFshrQ",  { VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
2838
    { "%NFshlQ",  { VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
2839
    { "%NFsarQ",  { VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
2840
  },
2841
  /* REG_F6 */
2842
  {
2843
    { "testA",  { Eb, Ib }, 0 },
2844
    { "testA",  { Eb, Ib }, 0 },
2845
    { "notA", { Ebh1 }, 0 },
2846
    { "negA", { Ebh1 }, 0 },
2847
    { "mulA", { Eb }, 0 },  /* Don't print the implicit %al register,  */
2848
    { "imulA",  { Eb }, 0 },  /* to distinguish these opcodes from other */
2849
    { "divA", { Eb }, 0 },  /* mul/imul opcodes.  Do the same for div  */
2850
    { "idivA",  { Eb }, 0 },  /* and idiv for consistency.       */
2851
  },
2852
  /* REG_F7 */
2853
  {
2854
    { "testQ",  { Ev, Iv }, 0 },
2855
    { "testQ",  { Ev, Iv }, 0 },
2856
    { "notQ", { Evh1 }, 0 },
2857
    { "negQ", { Evh1 }, 0 },
2858
    { "mulQ", { Ev }, 0 },  /* Don't print the implicit register.  */
2859
    { "imulQ",  { Ev }, 0 },
2860
    { "divQ", { Ev }, 0 },
2861
    { "idivQ",  { Ev }, 0 },
2862
  },
2863
  /* REG_FE */
2864
  {
2865
    { "incA", { Ebh1 }, 0 },
2866
    { "decA", { Ebh1 }, 0 },
2867
  },
2868
  /* REG_FF */
2869
  {
2870
    { "incQ", { Evh1 }, 0 },
2871
    { "decQ", { Evh1 }, 0 },
2872
    { "call{@|}", { NOTRACK, indirEv, BND }, 0 },
2873
    { "{l|}call^", { indirEp }, 0 },
2874
    { "jmp{@|}", { NOTRACK, indirEv, BND }, 0 },
2875
    { "{l|}jmp^", { indirEp }, 0 },
2876
    { "push{P|}", { stackEv }, 0 },
2877
    { Bad_Opcode },
2878
  },
2879
  /* REG_0F00 */
2880
  {
2881
    { "sldtD",  { Sv }, 0 },
2882
    { "strD", { Sv }, 0 },
2883
    { "lldtD",  { Sv }, 0 },
2884
    { "ltrD", { Sv }, 0 },
2885
    { "verrD",  { Sv }, 0 },
2886
    { "verwD",  { Sv }, 0 },
2887
    { X86_64_TABLE (X86_64_0F00_REG_6) },
2888
    { Bad_Opcode },
2889
  },
2890
  /* REG_0F01 */
2891
  {
2892
    { MOD_TABLE (MOD_0F01_REG_0) },
2893
    { MOD_TABLE (MOD_0F01_REG_1) },
2894
    { MOD_TABLE (MOD_0F01_REG_2) },
2895
    { MOD_TABLE (MOD_0F01_REG_3) },
2896
    { "smswD",  { Sv }, 0 },
2897
    { MOD_TABLE (MOD_0F01_REG_5) },
2898
    { "lmsw", { Ew }, 0 },
2899
    { MOD_TABLE (MOD_0F01_REG_7) },
2900
  },
2901
  /* REG_0F0D */
2902
  {
2903
    { "prefetch", { Mb }, 0 },
2904
    { "prefetchw",  { Mb }, 0 },
2905
    { "prefetchwt1",  { Mb }, 0 },
2906
    { "prefetch", { Mb }, 0 },
2907
    { "prefetch", { Mb }, 0 },
2908
    { "prefetch", { Mb }, 0 },
2909
    { "prefetch", { Mb }, 0 },
2910
    { "prefetch", { Mb }, 0 },
2911
  },
2912
  /* REG_0F18 */
2913
  {
2914
    { MOD_TABLE (MOD_0F18_REG_0) },
2915
    { MOD_TABLE (MOD_0F18_REG_1) },
2916
    { MOD_TABLE (MOD_0F18_REG_2) },
2917
    { MOD_TABLE (MOD_0F18_REG_3) },
2918
    { MOD_TABLE (MOD_0F18_REG_4) },
2919
    { "nopQ",   { Ev }, 0 },
2920
    { MOD_TABLE (MOD_0F18_REG_6) },
2921
    { MOD_TABLE (MOD_0F18_REG_7) },
2922
  },
2923
  /* REG_0F1C_P_0_MOD_0 */
2924
  {
2925
    { "cldemote", { Mb }, 0 },
2926
    { "nopQ",   { Ev }, 0 },
2927
    { "nopQ",   { Ev }, 0 },
2928
    { "nopQ",   { Ev }, 0 },
2929
    { "nopQ",   { Ev }, 0 },
2930
    { "nopQ",   { Ev }, 0 },
2931
    { "nopQ",   { Ev }, 0 },
2932
    { "nopQ",   { Ev }, 0 },
2933
  },
2934
  /* REG_0F1E_P_1_MOD_3 */
2935
  {
2936
    { "nopQ",   { Ev }, PREFIX_IGNORED },
2937
    { "rdsspK",   { Edq }, 0 },
2938
    { "nopQ",   { Ev }, PREFIX_IGNORED },
2939
    { "nopQ",   { Ev }, PREFIX_IGNORED },
2940
    { "nopQ",   { Ev }, PREFIX_IGNORED },
2941
    { "nopQ",   { Ev }, PREFIX_IGNORED },
2942
    { "nopQ",   { Ev }, PREFIX_IGNORED },
2943
    { RM_TABLE (RM_0F1E_P_1_MOD_3_REG_7) },
2944
  },
2945
  /* REG_0F38D8_PREFIX_1 */
2946
  {
2947
    { "aesencwide128kl",  { M }, 0 },
2948
    { "aesdecwide128kl",  { M }, 0 },
2949
    { "aesencwide256kl",  { M }, 0 },
2950
    { "aesdecwide256kl",  { M }, 0 },
2951
  },
2952
  /* REG_0F3A0F_P_1 */
2953
  {
2954
    { RM_TABLE (RM_0F3A0F_P_1_R_0) },
2955
  },
2956
  /* REG_0F71 */
2957
  {
2958
    { Bad_Opcode },
2959
    { Bad_Opcode },
2960
    { "psrlw",    { Nq, Ib }, PREFIX_OPCODE },
2961
    { Bad_Opcode },
2962
    { "psraw",    { Nq, Ib }, PREFIX_OPCODE },
2963
    { Bad_Opcode },
2964
    { "psllw",    { Nq, Ib }, PREFIX_OPCODE },
2965
  },
2966
  /* REG_0F72 */
2967
  {
2968
    { Bad_Opcode },
2969
    { Bad_Opcode },
2970
    { "psrld",    { Nq, Ib }, PREFIX_OPCODE },
2971
    { Bad_Opcode },
2972
    { "psrad",    { Nq, Ib }, PREFIX_OPCODE },
2973
    { Bad_Opcode },
2974
    { "pslld",    { Nq, Ib }, PREFIX_OPCODE },
2975
  },
2976
  /* REG_0F73 */
2977
  {
2978
    { Bad_Opcode },
2979
    { Bad_Opcode },
2980
    { "psrlq",    { Nq, Ib }, PREFIX_OPCODE },
2981
    { "psrldq",   { Ux, Ib }, PREFIX_DATA },
2982
    { Bad_Opcode },
2983
    { Bad_Opcode },
2984
    { "psllq",    { Nq, Ib }, PREFIX_OPCODE },
2985
    { "pslldq",   { Ux, Ib }, PREFIX_DATA },
2986
  },
2987
  /* REG_0FA6 */
2988
  {
2989
    { PREFIX_TABLE (PREFIX_0FA6_REG_0) },
2990
    { "xsha1",    { { OP_0f07, 0 } }, 0 },
2991
    { "xsha256",  { { OP_0f07, 0 } }, 0 },
2992
    { "xsha384",  { { OP_0f07, 0 } }, 0 },
2993
    { "xsha512",  { { OP_0f07, 0 } }, 0 },
2994
    { PREFIX_TABLE (PREFIX_0FA6_REG_5) },
2995
    { "montmul2", { { OP_0f07, 0 } }, 0 },
2996
    { "xmodexp",  { { OP_0f07, 0 } }, 0 },
2997
  },
2998
  /* REG_0FA7 */
2999
  {
3000
    { "xstore-rng", { { OP_0f07, 0 } }, 0 },
3001
    { "xcrypt-ecb", { { OP_0f07, 0 } }, 0 },
3002
    { "xcrypt-cbc", { { OP_0f07, 0 } }, 0 },
3003
    { "xcrypt-ctr", { { OP_0f07, 0 } }, 0 },
3004
    { "xcrypt-cfb", { { OP_0f07, 0 } }, 0 },
3005
    { "xcrypt-ofb", { { OP_0f07, 0 } }, 0 },
3006
    { PREFIX_TABLE (PREFIX_0FA7_REG_6) },
3007
    { "xrng2",    { { OP_0f07, 0 } }, 0 },
3008
  },
3009
  /* REG_0FAE */
3010
  {
3011
    { MOD_TABLE (MOD_0FAE_REG_0) },
3012
    { MOD_TABLE (MOD_0FAE_REG_1) },
3013
    { MOD_TABLE (MOD_0FAE_REG_2) },
3014
    { MOD_TABLE (MOD_0FAE_REG_3) },
3015
    { MOD_TABLE (MOD_0FAE_REG_4) },
3016
    { MOD_TABLE (MOD_0FAE_REG_5) },
3017
    { MOD_TABLE (MOD_0FAE_REG_6) },
3018
    { MOD_TABLE (MOD_0FAE_REG_7) },
3019
  },
3020
  /* REG_0FBA */
3021
  {
3022
    { Bad_Opcode },
3023
    { Bad_Opcode },
3024
    { Bad_Opcode },
3025
    { Bad_Opcode },
3026
    { "btQ",  { Ev, Ib }, 0 },
3027
    { "btsQ", { Evh1, Ib }, 0 },
3028
    { "btrQ", { Evh1, Ib }, 0 },
3029
    { "btcQ", { Evh1, Ib }, 0 },
3030
  },
3031
  /* REG_0FC7 */
3032
  {
3033
    { Bad_Opcode },
3034
    { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } }, 0 },
3035
    { Bad_Opcode },
3036
    { "xrstors", { FXSAVE }, PREFIX_REX2_ILLEGAL },
3037
    { "xsavec", { FXSAVE }, PREFIX_REX2_ILLEGAL },
3038
    { "xsaves", { FXSAVE }, PREFIX_REX2_ILLEGAL },
3039
    { MOD_TABLE (MOD_0FC7_REG_6) },
3040
    { MOD_TABLE (MOD_0FC7_REG_7) },
3041
  },
3042
  /* REG_VEX_0F71 */
3043
  {
3044
    { Bad_Opcode },
3045
    { Bad_Opcode },
3046
    { "vpsrlw",   { Vex, Ux, Ib }, PREFIX_DATA },
3047
    { Bad_Opcode },
3048
    { "vpsraw",   { Vex, Ux, Ib }, PREFIX_DATA },
3049
    { Bad_Opcode },
3050
    { "vpsllw",   { Vex, Ux, Ib }, PREFIX_DATA },
3051
  },
3052
  /* REG_VEX_0F72 */
3053
  {
3054
    { Bad_Opcode },
3055
    { Bad_Opcode },
3056
    { "vpsrld",   { Vex, Ux, Ib }, PREFIX_DATA },
3057
    { Bad_Opcode },
3058
    { "vpsrad",   { Vex, Ux, Ib }, PREFIX_DATA },
3059
    { Bad_Opcode },
3060
    { "vpslld",   { Vex, Ux, Ib }, PREFIX_DATA },
3061
  },
3062
  /* REG_VEX_0F73 */
3063
  {
3064
    { Bad_Opcode },
3065
    { Bad_Opcode },
3066
    { "vpsrlq",   { Vex, Ux, Ib }, PREFIX_DATA },
3067
    { "vpsrldq",  { Vex, Ux, Ib }, PREFIX_DATA },
3068
    { Bad_Opcode },
3069
    { Bad_Opcode },
3070
    { "vpsllq",   { Vex, Ux, Ib }, PREFIX_DATA },
3071
    { "vpslldq",  { Vex, Ux, Ib }, PREFIX_DATA },
3072
  },
3073
  /* REG_VEX_0FAE */
3074
  {
3075
    { Bad_Opcode },
3076
    { Bad_Opcode },
3077
    { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2) },
3078
    { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3) },
3079
  },
3080
  /* REG_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0 */
3081
  {
3082
    { RM_TABLE (RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0_R_0) },
3083
  },
3084
  /* REG_VEX_0F38F3_L_0_P_0 */
3085
  {
3086
    { Bad_Opcode },
3087
    { "%NFblsrS",   { VexGdq, Edq }, 0 },
3088
    { "%NFblsmskS",   { VexGdq, Edq }, 0 },
3089
    { "%NFblsiS",   { VexGdq, Edq }, 0 },
3090
  },
3091
  /* REG_VEX_MAP7_F6_L_0_W_0 */
3092
  {
3093
    { X86_64_TABLE (X86_64_VEX_MAP7_F6_L_0_W_0_R_0) },
3094
  },
3095
  /* REG_VEX_MAP7_F8_L_0_W_0 */
3096
  {
3097
    { X86_64_TABLE (X86_64_VEX_MAP7_F8_L_0_W_0_R_0) },
3098
  },
3099
  /* REG_XOP_09_01_L_0 */
3100
  {
3101
    { Bad_Opcode },
3102
    { "blcfill",  { VexGdq, Edq }, 0 },
3103
    { "blsfill",  { VexGdq, Edq }, 0 },
3104
    { "blcs", { VexGdq, Edq }, 0 },
3105
    { "tzmsk",  { VexGdq, Edq }, 0 },
3106
    { "blcic",  { VexGdq, Edq }, 0 },
3107
    { "blsic",  { VexGdq, Edq }, 0 },
3108
    { "t1mskc", { VexGdq, Edq }, 0 },
3109
  },
3110
  /* REG_XOP_09_02_L_0 */
3111
  {
3112
    { Bad_Opcode },
3113
    { "blcmsk", { VexGdq, Edq }, 0 },
3114
    { Bad_Opcode },
3115
    { Bad_Opcode },
3116
    { Bad_Opcode },
3117
    { Bad_Opcode },
3118
    { "blci", { VexGdq, Edq }, 0 },
3119
  },
3120
  /* REG_XOP_09_12_L_0 */
3121
  {
3122
    { "llwpcb", { Rdq }, 0 },
3123
    { "slwpcb", { Rdq }, 0 },
3124
  },
3125
  /* REG_XOP_0A_12_L_0 */
3126
  {
3127
    { "lwpins", { VexGdq, Ed, Id }, 0 },
3128
    { "lwpval", { VexGdq, Ed, Id }, 0 },
3129
  },
3130
3131
#include "i386-dis-evex-reg.h"
3132
};
3133
3134
static const struct dis386 prefix_table[][4] = {
3135
  /* PREFIX_90 */
3136
  {
3137
    { "xchgS", { { NOP_Fixup, 0 }, { NOP_Fixup, 1 } }, 0 },
3138
    { "pause", { XX }, 0 },
3139
    { "xchgS", { { NOP_Fixup, 0 }, { NOP_Fixup, 1 } }, 0 },
3140
    { NULL, { { NULL, 0 } }, PREFIX_IGNORED }
3141
  },
3142
3143
  /* PREFIX_0F00_REG_6_X86_64 */
3144
  {
3145
    { Bad_Opcode },
3146
    { Bad_Opcode },
3147
    { Bad_Opcode },
3148
    { "lkgsD", { Sv }, 0 },
3149
  },
3150
3151
  /* PREFIX_0F01_REG_0_MOD_3_RM_6 */
3152
  {
3153
    { "wrmsrns",        { Skip_MODRM }, 0 },
3154
    { X86_64_TABLE (X86_64_0F01_REG_0_MOD_3_RM_6_P_1) },
3155
    { Bad_Opcode },
3156
    { X86_64_TABLE (X86_64_0F01_REG_0_MOD_3_RM_6_P_3) },
3157
  },
3158
3159
  /* PREFIX_0F01_REG_0_MOD_3_RM_7 */
3160
  {
3161
    { X86_64_TABLE (X86_64_0F01_REG_0_MOD_3_RM_7_P_0) },
3162
  },
3163
3164
  /* PREFIX_0F01_REG_1_RM_2 */
3165
  {
3166
    { "clac",   { Skip_MODRM }, 0 },
3167
    { X86_64_TABLE (X86_64_0F01_REG_1_RM_2_PREFIX_1) },
3168
    { Bad_Opcode },
3169
    { X86_64_TABLE (X86_64_0F01_REG_1_RM_2_PREFIX_3)},
3170
  },
3171
3172
  /* PREFIX_0F01_REG_1_RM_4 */
3173
  {
3174
    { Bad_Opcode },
3175
    { Bad_Opcode },
3176
    { "tdcall",   { Skip_MODRM }, 0 },
3177
    { Bad_Opcode },
3178
  },
3179
3180
  /* PREFIX_0F01_REG_1_RM_5 */
3181
  {
3182
    { Bad_Opcode },
3183
    { Bad_Opcode },
3184
    { X86_64_TABLE (X86_64_0F01_REG_1_RM_5_PREFIX_2) },
3185
    { Bad_Opcode },
3186
  },
3187
3188
  /* PREFIX_0F01_REG_1_RM_6 */
3189
  {
3190
    { Bad_Opcode },
3191
    { Bad_Opcode },
3192
    { X86_64_TABLE (X86_64_0F01_REG_1_RM_6_PREFIX_2) },
3193
    { Bad_Opcode },
3194
  },
3195
3196
  /* PREFIX_0F01_REG_1_RM_7 */
3197
  {
3198
    { "encls",    { Skip_MODRM }, 0 },
3199
    { Bad_Opcode },
3200
    { X86_64_TABLE (X86_64_0F01_REG_1_RM_7_PREFIX_2) },
3201
    { Bad_Opcode },
3202
  },
3203
3204
  /* PREFIX_0F01_REG_3_RM_1 */
3205
  {
3206
    { "vmmcall",  { Skip_MODRM }, 0 },
3207
    { "vmgexit",  { Skip_MODRM }, 0 },
3208
    { Bad_Opcode },
3209
    { "vmgexit",  { Skip_MODRM }, 0 },
3210
  },
3211
3212
  /* PREFIX_0F01_REG_5_MOD_0 */
3213
  {
3214
    { Bad_Opcode },
3215
    { "rstorssp", { Mq }, PREFIX_OPCODE },
3216
  },
3217
3218
  /* PREFIX_0F01_REG_5_MOD_3_RM_0 */
3219
  {
3220
    { "serialize",  { Skip_MODRM }, PREFIX_OPCODE },
3221
    { "setssbsy", { Skip_MODRM }, PREFIX_OPCODE },
3222
    { Bad_Opcode },
3223
    { "xsusldtrk",  { Skip_MODRM }, PREFIX_OPCODE },
3224
  },
3225
3226
  /* PREFIX_0F01_REG_5_MOD_3_RM_1 */
3227
  {
3228
    { Bad_Opcode },
3229
    { Bad_Opcode },
3230
    { Bad_Opcode },
3231
    { "xresldtrk",     { Skip_MODRM }, PREFIX_OPCODE },
3232
  },
3233
3234
  /* PREFIX_0F01_REG_5_MOD_3_RM_2 */
3235
  {
3236
    { Bad_Opcode },
3237
    { "saveprevssp",  { Skip_MODRM }, PREFIX_OPCODE },
3238
  },
3239
3240
  /* PREFIX_0F01_REG_5_MOD_3_RM_4 */
3241
  {
3242
    { Bad_Opcode },
3243
    { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1) },
3244
  },
3245
3246
  /* PREFIX_0F01_REG_5_MOD_3_RM_5 */
3247
  {
3248
    { Bad_Opcode },
3249
    { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1) },
3250
  },
3251
3252
  /* PREFIX_0F01_REG_5_MOD_3_RM_6 */
3253
  {
3254
    { "rdpkru", { Skip_MODRM }, 0 },
3255
    { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1) },
3256
  },
3257
3258
  /* PREFIX_0F01_REG_5_MOD_3_RM_7 */
3259
  {
3260
    { "wrpkru", { Skip_MODRM }, 0 },
3261
    { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1) },
3262
  },
3263
3264
  /* PREFIX_0F01_REG_7_MOD_3_RM_2 */
3265
  {
3266
    { "monitorx", { { OP_Monitor, 0 } }, 0  },
3267
    { "mcommit",  { Skip_MODRM }, 0 },
3268
  },
3269
3270
  /* PREFIX_0F01_REG_7_MOD_3_RM_5 */
3271
  {
3272
    { "rdpru", { Skip_MODRM }, 0 },
3273
    { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_1) },
3274
    { Bad_Opcode },
3275
    { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_3) },
3276
  },
3277
3278
  /* PREFIX_0F01_REG_7_MOD_3_RM_6 */
3279
  {
3280
    { "invlpgb",        { Skip_MODRM }, 0 },
3281
    { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1) },
3282
    { Bad_Opcode },
3283
    { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3) },
3284
  },
3285
3286
  /* PREFIX_0F01_REG_7_MOD_3_RM_7 */
3287
  {
3288
    { "tlbsync",        { Skip_MODRM }, 0 },
3289
    { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1) },
3290
    { Bad_Opcode },
3291
    { "pvalidate",      { Skip_MODRM }, 0 },
3292
  },
3293
3294
  /* PREFIX_0F09 */
3295
  {
3296
    { "wbinvd",   { XX }, 0 },
3297
    { "wbnoinvd", { XX }, 0 },
3298
  },
3299
3300
  /* PREFIX_0F10 */
3301
  {
3302
    { "%XEVmovupX", { XM, EXEvexXNoBcst }, 0 },
3303
    { "%XEVmovs%XS",  { XMScalar, VexScalarR, EXd }, 0 },
3304
    { "%XEVmovupX", { XM, EXEvexXNoBcst }, 0 },
3305
    { "%XEVmovs%XD",  { XMScalar, VexScalarR, EXq }, 0 },
3306
  },
3307
3308
  /* PREFIX_0F11 */
3309
  {
3310
    { "%XEVmovupX", { EXxS, XM }, 0 },
3311
    { "%XEVmovs%XS",  { EXdS, VexScalarR, XMScalar }, 0 },
3312
    { "%XEVmovupX", { EXxS, XM }, 0 },
3313
    { "%XEVmovs%XD",  { EXqS, VexScalarR, XMScalar }, 0 },
3314
  },
3315
3316
  /* PREFIX_0F12 */
3317
  {
3318
    { MOD_TABLE (MOD_0F12_PREFIX_0) },
3319
    { "movsldup", { XM, EXx }, 0 },
3320
    { "%XEVmovlpYX",  { XM, Vex, Mq }, 0 },
3321
    { "movddup",  { XM, EXq }, 0 },
3322
  },
3323
3324
  /* PREFIX_0F16 */
3325
  {
3326
    { MOD_TABLE (MOD_0F16_PREFIX_0) },
3327
    { "movshdup", { XM, EXx }, 0 },
3328
    { "%XEVmovhpYX",  { XM, Vex, Mq }, 0 },
3329
  },
3330
3331
  /* PREFIX_0F18_REG_6_MOD_0_X86_64 */
3332
  {
3333
    { "prefetchit1",  { { PREFETCHI_Fixup, b_mode } }, 0 },
3334
    { "nopQ",   { Ev }, 0 },
3335
    { "nopQ",   { Ev }, 0 },
3336
    { "nopQ",   { Ev }, 0 },
3337
  },
3338
3339
  /* PREFIX_0F18_REG_7_MOD_0_X86_64 */
3340
  {
3341
    { "prefetchit0",  { { PREFETCHI_Fixup, b_mode } }, 0 },
3342
    { "nopQ",   { Ev }, 0 },
3343
    { "nopQ",   { Ev }, 0 },
3344
    { "nopQ",   { Ev }, 0 },
3345
  },
3346
3347
  /* PREFIX_0F1A */
3348
  {
3349
    { MOD_TABLE (MOD_0F1A_PREFIX_0) },
3350
    { "bndcl",  { Gbnd, Ev_bnd }, 0 },
3351
    { "bndmov", { Gbnd, Ebnd }, 0 },
3352
    { "bndcu",  { Gbnd, Ev_bnd }, 0 },
3353
  },
3354
3355
  /* PREFIX_0F1B */
3356
  {
3357
    { MOD_TABLE (MOD_0F1B_PREFIX_0) },
3358
    { MOD_TABLE (MOD_0F1B_PREFIX_1) },
3359
    { "bndmov", { EbndS, Gbnd }, 0 },
3360
    { "bndcn",  { Gbnd, Ev_bnd }, 0 },
3361
  },
3362
3363
  /* PREFIX_0F1C */
3364
  {
3365
    { MOD_TABLE (MOD_0F1C_PREFIX_0) },
3366
    { "nopQ", { Ev }, PREFIX_IGNORED },
3367
    { "nopQ", { Ev }, 0 },
3368
    { "nopQ", { Ev }, PREFIX_IGNORED },
3369
  },
3370
3371
  /* PREFIX_0F1E */
3372
  {
3373
    { "nopQ", { Ev }, 0 },
3374
    { MOD_TABLE (MOD_0F1E_PREFIX_1) },
3375
    { "nopQ", { Ev }, 0 },
3376
    { NULL, { XX }, PREFIX_IGNORED },
3377
  },
3378
3379
  /* PREFIX_0F2A */
3380
  {
3381
    { "cvtpi2ps", { XM, EMCq }, PREFIX_OPCODE },
3382
    { "cvtsi2ss{%LQ|}", { XM, Edq }, PREFIX_OPCODE },
3383
    { "cvtpi2pd", { XM, EMCq }, PREFIX_OPCODE },
3384
    { "cvtsi2sd{%LQ|}", { XM, Edq }, 0 },
3385
  },
3386
3387
  /* PREFIX_0F2B */
3388
  {
3389
    { "movntps", { Mx, XM }, 0 },
3390
    { "movntss", { Md, XM }, 0 },
3391
    { "movntpd", { Mx, XM }, 0 },
3392
    { "movntsd", { Mq, XM }, 0 },
3393
  },
3394
3395
  /* PREFIX_0F2C */
3396
  {
3397
    { "cvttps2pi", { MXC, EXq }, PREFIX_OPCODE },
3398
    { "cvttss2si", { Gdq, EXd }, PREFIX_OPCODE },
3399
    { "cvttpd2pi", { MXC, EXx }, PREFIX_OPCODE },
3400
    { "cvttsd2si", { Gdq, EXq }, PREFIX_OPCODE },
3401
  },
3402
3403
  /* PREFIX_0F2D */
3404
  {
3405
    { "cvtps2pi", { MXC, EXq }, PREFIX_OPCODE },
3406
    { "cvtss2si", { Gdq, EXd }, PREFIX_OPCODE },
3407
    { "cvtpd2pi", { MXC, EXx }, PREFIX_OPCODE },
3408
    { "cvtsd2si", { Gdq, EXq }, PREFIX_OPCODE },
3409
  },
3410
3411
  /* PREFIX_0F2E */
3412
  {
3413
    { "VucomisYX",  { XMScalar, EXd, EXxEVexS }, 0 },
3414
    { Bad_Opcode },
3415
    { "VucomisYX",  { XMScalar, EXq, EXxEVexS }, 0 },
3416
  },
3417
3418
  /* PREFIX_0F2F */
3419
  {
3420
    { "VcomisYX", { XMScalar, EXd, EXxEVexS }, 0 },
3421
    { Bad_Opcode },
3422
    { "VcomisYX", { XMScalar, EXq, EXxEVexS }, 0 },
3423
  },
3424
3425
  /* PREFIX_0F51 */
3426
  {
3427
    { "%XEVsqrtpX", { XM, EXx, EXxEVexR }, 0 },
3428
    { "%XEVsqrts%XS", { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
3429
    { "%XEVsqrtpX", { XM, EXx, EXxEVexR }, 0 },
3430
    { "%XEVsqrts%XD", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3431
  },
3432
3433
  /* PREFIX_0F52 */
3434
  {
3435
    { "Vrsqrtps", { XM, EXx }, 0 },
3436
    { "Vrsqrtss", { XMScalar, VexScalar, EXd }, 0 },
3437
  },
3438
3439
  /* PREFIX_0F53 */
3440
  {
3441
    { "Vrcpps",   { XM, EXx }, 0 },
3442
    { "Vrcpss",   { XMScalar, VexScalar, EXd }, 0 },
3443
  },
3444
3445
  /* PREFIX_0F58 */
3446
  {
3447
    { "%XEVaddpX",  { XM, Vex, EXx, EXxEVexR }, 0 },
3448
    { "%XEVadds%XS",  { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
3449
    { "%XEVaddpX",  { XM, Vex, EXx, EXxEVexR }, 0 },
3450
    { "%XEVadds%XD",  { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3451
  },
3452
3453
  /* PREFIX_0F59 */
3454
  {
3455
    { "%XEVmulpX",  { XM, Vex, EXx, EXxEVexR }, 0 },
3456
    { "%XEVmuls%XS",  { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
3457
    { "%XEVmulpX",  { XM, Vex, EXx, EXxEVexR }, 0 },
3458
    { "%XEVmuls%XD",  { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3459
  },
3460
3461
  /* PREFIX_0F5A */
3462
  {
3463
    { "%XEVcvtp%XS2pd", { XM, EXEvexHalfBcstXmmq, EXxEVexS }, 0 },
3464
    { "%XEVcvts%XS2sd", { XMScalar, VexScalar, EXd, EXxEVexS }, 0 },
3465
    { "%XEVcvtp%XD2ps%XY", { XMxmmq, EXx, EXxEVexR }, 0 },
3466
    { "%XEVcvts%XD2ss", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3467
  },
3468
3469
  /* PREFIX_0F5B */
3470
  {
3471
    { "Vcvtdq2ps",  { XM, EXx }, 0 },
3472
    { "Vcvttps2dq", { XM, EXx }, 0 },
3473
    { "Vcvtps2dq",  { XM, EXx }, 0 },
3474
  },
3475
3476
  /* PREFIX_0F5C */
3477
  {
3478
    { "%XEVsubpX",  { XM, Vex, EXx, EXxEVexR }, 0 },
3479
    { "%XEVsubs%XS",  { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
3480
    { "%XEVsubpX",  { XM, Vex, EXx, EXxEVexR }, 0 },
3481
    { "%XEVsubs%XD",  { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3482
  },
3483
3484
  /* PREFIX_0F5D */
3485
  {
3486
    { "%XEVminpX",  { XM, Vex, EXx, EXxEVexS }, 0 },
3487
    { "%XEVmins%XS",  { XMScalar, VexScalar, EXd, EXxEVexS }, 0 },
3488
    { "%XEVminpX",  { XM, Vex, EXx, EXxEVexS }, 0 },
3489
    { "%XEVmins%XD",  { XMScalar, VexScalar, EXq, EXxEVexS }, 0 },
3490
  },
3491
3492
  /* PREFIX_0F5E */
3493
  {
3494
    { "%XEVdivpX",  { XM, Vex, EXx, EXxEVexR }, 0 },
3495
    { "%XEVdivs%XS",  { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
3496
    { "%XEVdivpX",  { XM, Vex, EXx, EXxEVexR }, 0 },
3497
    { "%XEVdivs%XD",  { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3498
  },
3499
3500
  /* PREFIX_0F5F */
3501
  {
3502
    { "%XEVmaxpX",  { XM, Vex, EXx, EXxEVexS }, 0 },
3503
    { "%XEVmaxs%XS",  { XMScalar, VexScalar, EXd, EXxEVexS }, 0 },
3504
    { "%XEVmaxpX",  { XM, Vex, EXx, EXxEVexS }, 0 },
3505
    { "%XEVmaxs%XD",  { XMScalar, VexScalar, EXq, EXxEVexS }, 0 },
3506
  },
3507
3508
  /* PREFIX_0F60 */
3509
  {
3510
    { "punpcklbw",{ MX, EMd }, PREFIX_OPCODE },
3511
    { Bad_Opcode },
3512
    { "punpcklbw",{ MX, EMx }, PREFIX_OPCODE },
3513
  },
3514
3515
  /* PREFIX_0F61 */
3516
  {
3517
    { "punpcklwd",{ MX, EMd }, PREFIX_OPCODE },
3518
    { Bad_Opcode },
3519
    { "punpcklwd",{ MX, EMx }, PREFIX_OPCODE },
3520
  },
3521
3522
  /* PREFIX_0F62 */
3523
  {
3524
    { "punpckldq",{ MX, EMd }, PREFIX_OPCODE },
3525
    { Bad_Opcode },
3526
    { "punpckldq",{ MX, EMx }, PREFIX_OPCODE },
3527
  },
3528
3529
  /* PREFIX_0F6F */
3530
  {
3531
    { "movq", { MX, EM }, PREFIX_OPCODE },
3532
    { "movdqu", { XM, EXx }, PREFIX_OPCODE },
3533
    { "movdqa", { XM, EXx }, PREFIX_OPCODE },
3534
  },
3535
3536
  /* PREFIX_0F70 */
3537
  {
3538
    { "pshufw", { MX, EM, Ib }, PREFIX_OPCODE },
3539
    { "pshufhw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3540
    { "pshufd", { XM, EXx, Ib }, PREFIX_OPCODE },
3541
    { "pshuflw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3542
  },
3543
3544
  /* PREFIX_0F78 */
3545
  {
3546
    {"vmread",  { Em, Gm }, 0 },
3547
    { Bad_Opcode },
3548
    {"extrq", { Uxmm, Ib, Ib }, 0 },
3549
    {"insertq", { XM, Uxmm, Ib, Ib }, 0 },
3550
  },
3551
3552
  /* PREFIX_0F79 */
3553
  {
3554
    {"vmwrite", { Gm, Em }, 0 },
3555
    { Bad_Opcode },
3556
    {"extrq", { XM, Uxmm }, 0 },
3557
    {"insertq", { XM, Uxmm }, 0 },
3558
  },
3559
3560
  /* PREFIX_0F7C */
3561
  {
3562
    { Bad_Opcode },
3563
    { Bad_Opcode },
3564
    { "Vhaddpd",  { XM, Vex, EXx }, 0 },
3565
    { "Vhaddps",  { XM, Vex, EXx }, 0 },
3566
  },
3567
3568
  /* PREFIX_0F7D */
3569
  {
3570
    { Bad_Opcode },
3571
    { Bad_Opcode },
3572
    { "Vhsubpd",  { XM, Vex, EXx }, 0 },
3573
    { "Vhsubps",  { XM, Vex, EXx }, 0 },
3574
  },
3575
3576
  /* PREFIX_0F7E */
3577
  {
3578
    { "movK", { Edq, MX }, PREFIX_OPCODE },
3579
    { "movq", { XM, EXq }, PREFIX_OPCODE },
3580
    { "movK", { Edq, XM }, PREFIX_OPCODE },
3581
  },
3582
3583
  /* PREFIX_0F7F */
3584
  {
3585
    { "movq", { EMS, MX }, PREFIX_OPCODE },
3586
    { "movdqu", { EXxS, XM }, PREFIX_OPCODE },
3587
    { "movdqa", { EXxS, XM }, PREFIX_OPCODE },
3588
  },
3589
3590
  /* PREFIX_0FA6_REG_0 */
3591
  {
3592
    { Bad_Opcode },
3593
    { "montmul",  { { MONTMUL_Fixup, 0 } }, 0},
3594
    { Bad_Opcode },
3595
    { "sm2",  { Skip_MODRM }, 0 },
3596
  },
3597
3598
  /* PREFIX_0FA6_REG_5 */
3599
  {
3600
    { Bad_Opcode },
3601
    { "sm3",  { Skip_MODRM }, 0 },
3602
  },
3603
3604
  /* PREFIX_0FA7_REG_6 */
3605
  {
3606
    { Bad_Opcode },
3607
    { "sm4",  { Skip_MODRM }, 0 },
3608
  },
3609
3610
  /* PREFIX_0FAE_REG_0_MOD_3 */
3611
  {
3612
    { Bad_Opcode },
3613
    { X86_64_TABLE (X86_64_0FAE_REG_0_MOD_3_PREFIX_1) },
3614
  },
3615
3616
  /* PREFIX_0FAE_REG_1_MOD_3 */
3617
  {
3618
    { Bad_Opcode },
3619
    { X86_64_TABLE (X86_64_0FAE_REG_1_MOD_3_PREFIX_1) },
3620
  },
3621
3622
  /* PREFIX_0FAE_REG_2_MOD_3 */
3623
  {
3624
    { Bad_Opcode },
3625
    { X86_64_TABLE (X86_64_0FAE_REG_2_MOD_3_PREFIX_1) },
3626
  },
3627
3628
  /* PREFIX_0FAE_REG_3_MOD_3 */
3629
  {
3630
    { Bad_Opcode },
3631
    { X86_64_TABLE (X86_64_0FAE_REG_3_MOD_3_PREFIX_1) },
3632
  },
3633
3634
  /* PREFIX_0FAE_REG_4_MOD_0 */
3635
  {
3636
    { "xsave",  { FXSAVE }, PREFIX_REX2_ILLEGAL },
3637
    { "ptwrite{%LQ|}", { Edq }, 0 },
3638
  },
3639
3640
  /* PREFIX_0FAE_REG_4_MOD_3 */
3641
  {
3642
    { Bad_Opcode },
3643
    { "ptwrite{%LQ|}", { Edq }, 0 },
3644
  },
3645
3646
  /* PREFIX_0FAE_REG_5_MOD_3 */
3647
  {
3648
    { "lfence",   { Skip_MODRM }, 0 },
3649
    { "incsspK",  { Edq }, PREFIX_OPCODE },
3650
  },
3651
3652
  /* PREFIX_0FAE_REG_6_MOD_0 */
3653
  {
3654
    { "xsaveopt", { FXSAVE }, PREFIX_OPCODE | PREFIX_REX2_ILLEGAL },
3655
    { "clrssbsy", { Mq }, PREFIX_OPCODE },
3656
    { "clwb", { Mb }, PREFIX_OPCODE },
3657
  },
3658
3659
  /* PREFIX_0FAE_REG_6_MOD_3 */
3660
  {
3661
    { RM_TABLE (RM_0FAE_REG_6_MOD_3_P_0) },
3662
    { "umonitor", { Eva }, PREFIX_OPCODE },
3663
    { "tpause", { Edq }, PREFIX_OPCODE },
3664
    { "umwait", { Edq }, PREFIX_OPCODE },
3665
  },
3666
3667
  /* PREFIX_0FAE_REG_7_MOD_0 */
3668
  {
3669
    { "clflush",  { Mb }, 0 },
3670
    { Bad_Opcode },
3671
    { "clflushopt", { Mb }, 0 },
3672
  },
3673
3674
  /* PREFIX_0FB8 */
3675
  {
3676
    { Bad_Opcode },
3677
    { "popcntS", { Gv, Ev }, 0 },
3678
  },
3679
3680
  /* PREFIX_0FBC */
3681
  {
3682
    { "bsfS", { Gv, Ev }, 0 },
3683
    { "tzcntS", { Gv, Ev }, 0 },
3684
    { "bsfS", { Gv, Ev }, 0 },
3685
  },
3686
3687
  /* PREFIX_0FBD */
3688
  {
3689
    { "bsrS", { Gv, Ev }, 0 },
3690
    { "lzcntS", { Gv, Ev }, 0 },
3691
    { "bsrS", { Gv, Ev }, 0 },
3692
  },
3693
3694
  /* PREFIX_0FC2 */
3695
  {
3696
    { "VcmppX", { XM, Vex, EXx, CMP }, 0 },
3697
    { "Vcmpss", { XMScalar, VexScalar, EXd, CMP }, 0 },
3698
    { "VcmppX", { XM, Vex, EXx, CMP }, 0 },
3699
    { "Vcmpsd", { XMScalar, VexScalar, EXq, CMP }, 0 },
3700
  },
3701
3702
  /* PREFIX_0FC7_REG_6_MOD_0 */
3703
  {
3704
    { "vmptrld",{ Mq }, 0 },
3705
    { "vmxon",  { Mq }, 0 },
3706
    { "vmclear",{ Mq }, 0 },
3707
  },
3708
3709
  /* PREFIX_0FC7_REG_6_MOD_3 */
3710
  {
3711
    { "rdrand", { Ev }, 0 },
3712
    { X86_64_TABLE (X86_64_0FC7_REG_6_MOD_3_PREFIX_1) },
3713
    { "rdrand", { Ev }, 0 }
3714
  },
3715
3716
  /* PREFIX_0FC7_REG_7_MOD_3 */
3717
  {
3718
    { "rdseed", { Ev }, 0 },
3719
    { "rdpid",  { Em }, 0 },
3720
    { "rdseed", { Ev }, 0 },
3721
  },
3722
3723
  /* PREFIX_0FD0 */
3724
  {
3725
    { Bad_Opcode },
3726
    { Bad_Opcode },
3727
    { "VaddsubpX",  { XM, Vex, EXx }, 0 },
3728
    { "VaddsubpX",  { XM, Vex, EXx }, 0 },
3729
  },
3730
3731
  /* PREFIX_0FD6 */
3732
  {
3733
    { Bad_Opcode },
3734
    { "movq2dq",{ XM, Nq }, 0 },
3735
    { "movq", { EXqS, XM }, 0 },
3736
    { "movdq2q",{ MX, Ux }, 0 },
3737
  },
3738
3739
  /* PREFIX_0FE6 */
3740
  {
3741
    { Bad_Opcode },
3742
    { "Vcvtdq2pd",  { XM, EXxmmq }, 0 },
3743
    { "Vcvttpd2dq%XY",  { XMM, EXx }, 0 },
3744
    { "Vcvtpd2dq%XY", { XMM, EXx }, 0 },
3745
  },
3746
3747
  /* PREFIX_0FE7 */
3748
  {
3749
    { "movntq",   { Mq, MX }, 0 },
3750
    { Bad_Opcode },
3751
    { "movntdq",  { Mx, XM }, 0 },
3752
  },
3753
3754
  /* PREFIX_0FF0 */
3755
  {
3756
    { Bad_Opcode },
3757
    { Bad_Opcode },
3758
    { Bad_Opcode },
3759
    { "Vlddqu",   { XM, M }, 0 },
3760
  },
3761
3762
  /* PREFIX_0FF7 */
3763
  {
3764
    { "maskmovq", { MX, Nq }, PREFIX_OPCODE },
3765
    { Bad_Opcode },
3766
    { "maskmovdqu", { XM, Ux }, PREFIX_OPCODE },
3767
  },
3768
3769
  /* PREFIX_0F38D8 */
3770
  {
3771
    { Bad_Opcode },
3772
    { REG_TABLE (REG_0F38D8_PREFIX_1) },
3773
  },
3774
3775
  /* PREFIX_0F38DC */
3776
  {
3777
    { Bad_Opcode },
3778
    { MOD_TABLE (MOD_0F38DC_PREFIX_1) },
3779
    { "aesenc", { XM, EXx }, 0 },
3780
  },
3781
3782
  /* PREFIX_0F38DD */
3783
  {
3784
    { Bad_Opcode },
3785
    { "aesdec128kl", { XM, M }, 0 },
3786
    { "aesenclast", { XM, EXx }, 0 },
3787
  },
3788
3789
  /* PREFIX_0F38DE */
3790
  {
3791
    { Bad_Opcode },
3792
    { "aesenc256kl", { XM, M }, 0 },
3793
    { "aesdec", { XM, EXx }, 0 },
3794
  },
3795
3796
  /* PREFIX_0F38DF */
3797
  {
3798
    { Bad_Opcode },
3799
    { "aesdec256kl", { XM, M }, 0 },
3800
    { "aesdeclast", { XM, EXx }, 0 },
3801
  },
3802
3803
  /* PREFIX_0F38F0 */
3804
  {
3805
    { "movbeS", { Gv, Mv }, PREFIX_OPCODE },
3806
    { Bad_Opcode },
3807
    { "movbeS", { Gv, Mv }, PREFIX_OPCODE },
3808
    { "crc32A", { Gdq, Eb }, PREFIX_OPCODE },
3809
  },
3810
3811
  /* PREFIX_0F38F1 */
3812
  {
3813
    { "movbeS", { Mv, Gv }, PREFIX_OPCODE },
3814
    { Bad_Opcode },
3815
    { "movbeS", { Mv, Gv }, PREFIX_OPCODE },
3816
    { "crc32Q", { Gdq, Ev }, PREFIX_OPCODE },
3817
  },
3818
3819
  /* PREFIX_0F38F6 */
3820
  {
3821
    { "wrssK",  { M, Gdq }, 0 },
3822
    { "adoxL",  { VexGdq, Gdq, Edq }, 0 },
3823
    { "adcxL",  { VexGdq, Gdq, Edq }, 0 },
3824
    { Bad_Opcode },
3825
  },
3826
3827
  /* PREFIX_0F38F8_M_0 */
3828
  {
3829
    { Bad_Opcode },
3830
    { "enqcmds", { Gva, M }, 0 },
3831
    { "movdir64b", { Gva, M }, 0 },
3832
    { "enqcmd", { Gva, M }, 0 },
3833
  },
3834
3835
  /* PREFIX_0F38F8_M_1_X86_64 */
3836
  {
3837
    { Bad_Opcode },
3838
    { "uwrmsr",   { Gq, Rq }, 0 },
3839
    { Bad_Opcode },
3840
    { "urdmsr",   { Rq, Gq }, 0 },
3841
  },
3842
3843
  /* PREFIX_0F38FA */
3844
  {
3845
    { Bad_Opcode },
3846
    { "encodekey128", { Gd, Rd }, 0 },
3847
  },
3848
3849
  /* PREFIX_0F38FB */
3850
  {
3851
    { Bad_Opcode },
3852
    { "encodekey256", { Gd, Rd }, 0 },
3853
  },
3854
3855
  /* PREFIX_0F38FC */
3856
  {
3857
    { "aadd", { Mdq, Gdq }, 0 },
3858
    { "axor", { Mdq, Gdq }, 0 },
3859
    { "aand", { Mdq, Gdq }, 0 },
3860
    { "aor",  { Mdq, Gdq }, 0 },
3861
  },
3862
3863
  /* PREFIX_0F3A0F */
3864
  {
3865
    { Bad_Opcode },
3866
    { REG_TABLE (REG_0F3A0F_P_1) },
3867
  },
3868
3869
  /* PREFIX_VEX_0F12 */
3870
  {
3871
    { VEX_LEN_TABLE (VEX_LEN_0F12_P_0) },
3872
    { "%XEvmov%XSldup", { XM, EXEvexXNoBcst }, 0 },
3873
    { VEX_LEN_TABLE (VEX_LEN_0F12_P_2) },
3874
    { "%XEvmov%XDdup",  { XM, EXymmq }, 0 },
3875
  },
3876
3877
  /* PREFIX_VEX_0F16 */
3878
  {
3879
    { VEX_LEN_TABLE (VEX_LEN_0F16_P_0) },
3880
    { "%XEvmov%XShdup", { XM, EXEvexXNoBcst }, 0 },
3881
    { VEX_LEN_TABLE (VEX_LEN_0F16_P_2) },
3882
  },
3883
3884
  /* PREFIX_VEX_0F2A */
3885
  {
3886
    { Bad_Opcode },
3887
    { "%XEvcvtsi2ssY{%LQ|}",  { XMScalar, VexScalar, EXxEVexR, Edq }, 0 },
3888
    { Bad_Opcode },
3889
    { "%XEvcvtsi2sdY{%LQ|}",  { XMScalar, VexScalar, EXxEVexR64, Edq }, 0 },
3890
  },
3891
3892
  /* PREFIX_VEX_0F2C */
3893
  {
3894
    { Bad_Opcode },
3895
    { "%XEvcvttss2si",  { Gdq, EXd, EXxEVexS }, 0 },
3896
    { Bad_Opcode },
3897
    { "%XEvcvttsd2si",  { Gdq, EXq, EXxEVexS }, 0 },
3898
  },
3899
3900
  /* PREFIX_VEX_0F2D */
3901
  {
3902
    { Bad_Opcode },
3903
    { "%XEvcvtss2si", { Gdq, EXd, EXxEVexR }, 0 },
3904
    { Bad_Opcode },
3905
    { "%XEvcvtsd2si", { Gdq, EXq, EXxEVexR }, 0 },
3906
  },
3907
3908
  /* PREFIX_VEX_0F41_L_1_W_0 */
3909
  {
3910
    { "kandw",          { MaskG, MaskVex, MaskR }, 0 },
3911
    { Bad_Opcode },
3912
    { "kandb",          { MaskG, MaskVex, MaskR }, 0 },
3913
  },
3914
3915
  /* PREFIX_VEX_0F41_L_1_W_1 */
3916
  {
3917
    { "kandq",          { MaskG, MaskVex, MaskR }, 0 },
3918
    { Bad_Opcode },
3919
    { "kandd",          { MaskG, MaskVex, MaskR }, 0 },
3920
  },
3921
3922
  /* PREFIX_VEX_0F42_L_1_W_0 */
3923
  {
3924
    { "kandnw",         { MaskG, MaskVex, MaskR }, 0 },
3925
    { Bad_Opcode },
3926
    { "kandnb",         { MaskG, MaskVex, MaskR }, 0 },
3927
  },
3928
3929
  /* PREFIX_VEX_0F42_L_1_W_1 */
3930
  {
3931
    { "kandnq",         { MaskG, MaskVex, MaskR }, 0 },
3932
    { Bad_Opcode },
3933
    { "kandnd",         { MaskG, MaskVex, MaskR }, 0 },
3934
  },
3935
3936
  /* PREFIX_VEX_0F44_L_0_W_0 */
3937
  {
3938
    { "knotw",          { MaskG, MaskR }, 0 },
3939
    { Bad_Opcode },
3940
    { "knotb",          { MaskG, MaskR }, 0 },
3941
  },
3942
3943
  /* PREFIX_VEX_0F44_L_0_W_1 */
3944
  {
3945
    { "knotq",          { MaskG, MaskR }, 0 },
3946
    { Bad_Opcode },
3947
    { "knotd",          { MaskG, MaskR }, 0 },
3948
  },
3949
3950
  /* PREFIX_VEX_0F45_L_1_W_0 */
3951
  {
3952
    { "korw",       { MaskG, MaskVex, MaskR }, 0 },
3953
    { Bad_Opcode },
3954
    { "korb",       { MaskG, MaskVex, MaskR }, 0 },
3955
  },
3956
3957
  /* PREFIX_VEX_0F45_L_1_W_1 */
3958
  {
3959
    { "korq",       { MaskG, MaskVex, MaskR }, 0 },
3960
    { Bad_Opcode },
3961
    { "kord",       { MaskG, MaskVex, MaskR }, 0 },
3962
  },
3963
3964
  /* PREFIX_VEX_0F46_L_1_W_0 */
3965
  {
3966
    { "kxnorw",     { MaskG, MaskVex, MaskR }, 0 },
3967
    { Bad_Opcode },
3968
    { "kxnorb",     { MaskG, MaskVex, MaskR }, 0 },
3969
  },
3970
3971
  /* PREFIX_VEX_0F46_L_1_W_1 */
3972
  {
3973
    { "kxnorq",     { MaskG, MaskVex, MaskR }, 0 },
3974
    { Bad_Opcode },
3975
    { "kxnord",     { MaskG, MaskVex, MaskR }, 0 },
3976
  },
3977
3978
  /* PREFIX_VEX_0F47_L_1_W_0 */
3979
  {
3980
    { "kxorw",      { MaskG, MaskVex, MaskR }, 0 },
3981
    { Bad_Opcode },
3982
    { "kxorb",      { MaskG, MaskVex, MaskR }, 0 },
3983
  },
3984
3985
  /* PREFIX_VEX_0F47_L_1_W_1 */
3986
  {
3987
    { "kxorq",      { MaskG, MaskVex, MaskR }, 0 },
3988
    { Bad_Opcode },
3989
    { "kxord",      { MaskG, MaskVex, MaskR }, 0 },
3990
  },
3991
3992
  /* PREFIX_VEX_0F4A_L_1_W_0 */
3993
  {
3994
    { "kaddw",          { MaskG, MaskVex, MaskR }, 0 },
3995
    { Bad_Opcode },
3996
    { "kaddb",          { MaskG, MaskVex, MaskR }, 0 },
3997
  },
3998
3999
  /* PREFIX_VEX_0F4A_L_1_W_1 */
4000
  {
4001
    { "kaddq",          { MaskG, MaskVex, MaskR }, 0 },
4002
    { Bad_Opcode },
4003
    { "kaddd",          { MaskG, MaskVex, MaskR }, 0 },
4004
  },
4005
4006
  /* PREFIX_VEX_0F4B_L_1_W_0 */
4007
  {
4008
    { "kunpckwd",   { MaskG, MaskVex, MaskR }, 0 },
4009
    { Bad_Opcode },
4010
    { "kunpckbw",   { MaskG, MaskVex, MaskR }, 0 },
4011
  },
4012
4013
  /* PREFIX_VEX_0F4B_L_1_W_1 */
4014
  {
4015
    { "kunpckdq",   { MaskG, MaskVex, MaskR }, 0 },
4016
  },
4017
4018
  /* PREFIX_VEX_0F6F */
4019
  {
4020
    { Bad_Opcode },
4021
    { "vmovdqu",  { XM, EXx }, 0 },
4022
    { "vmovdqa",  { XM, EXx }, 0 },
4023
  },
4024
4025
  /* PREFIX_VEX_0F70 */
4026
  {
4027
    { Bad_Opcode },
4028
    { "vpshufhw", { XM, EXx, Ib }, 0 },
4029
    { "vpshufd",  { XM, EXx, Ib }, 0 },
4030
    { "vpshuflw", { XM, EXx, Ib }, 0 },
4031
  },
4032
4033
  /* PREFIX_VEX_0F7E */
4034
  {
4035
    { Bad_Opcode },
4036
    { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1) },
4037
    { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2) },
4038
  },
4039
4040
  /* PREFIX_VEX_0F7F */
4041
  {
4042
    { Bad_Opcode },
4043
    { "vmovdqu",  { EXxS, XM }, 0 },
4044
    { "vmovdqa",  { EXxS, XM }, 0 },
4045
  },
4046
4047
  /* PREFIX_VEX_0F90_L_0_W_0 */
4048
  {
4049
    { "%XEkmovw",   { MaskG, MaskE }, 0 },
4050
    { Bad_Opcode },
4051
    { "%XEkmovb",   { MaskG, MaskBDE }, 0 },
4052
  },
4053
4054
  /* PREFIX_VEX_0F90_L_0_W_1 */
4055
  {
4056
    { "%XEkmovq",   { MaskG, MaskE }, 0 },
4057
    { Bad_Opcode },
4058
    { "%XEkmovd",   { MaskG, MaskBDE }, 0 },
4059
  },
4060
4061
  /* PREFIX_VEX_0F91_L_0_W_0 */
4062
  {
4063
    { "%XEkmovw",   { Mw, MaskG }, 0 },
4064
    { Bad_Opcode },
4065
    { "%XEkmovb",   { Mb, MaskG }, 0 },
4066
  },
4067
4068
  /* PREFIX_VEX_0F91_L_0_W_1 */
4069
  {
4070
    { "%XEkmovq",   { Mq, MaskG }, 0 },
4071
    { Bad_Opcode },
4072
    { "%XEkmovd",   { Md, MaskG }, 0 },
4073
  },
4074
4075
  /* PREFIX_VEX_0F92_L_0_W_0 */
4076
  {
4077
    { "%XEkmovw",   { MaskG, Rdq }, 0 },
4078
    { Bad_Opcode },
4079
    { "%XEkmovb",   { MaskG, Rdq }, 0 },
4080
    { "%XEkmovd",   { MaskG, Rdq }, 0 },
4081
  },
4082
4083
  /* PREFIX_VEX_0F92_L_0_W_1 */
4084
  {
4085
    { Bad_Opcode },
4086
    { Bad_Opcode },
4087
    { Bad_Opcode },
4088
    { "%XEkmovK",   { MaskG, Rdq }, 0 },
4089
  },
4090
4091
  /* PREFIX_VEX_0F93_L_0_W_0 */
4092
  {
4093
    { "%XEkmovw",   { Gdq, MaskR }, 0 },
4094
    { Bad_Opcode },
4095
    { "%XEkmovb",   { Gdq, MaskR }, 0 },
4096
    { "%XEkmovd",   { Gdq, MaskR }, 0 },
4097
  },
4098
4099
  /* PREFIX_VEX_0F93_L_0_W_1 */
4100
  {
4101
    { Bad_Opcode },
4102
    { Bad_Opcode },
4103
    { Bad_Opcode },
4104
    { "%XEkmovK",   { Gdq, MaskR }, 0 },
4105
  },
4106
4107
  /* PREFIX_VEX_0F98_L_0_W_0 */
4108
  {
4109
    { "kortestw", { MaskG, MaskR }, 0 },
4110
    { Bad_Opcode },
4111
    { "kortestb", { MaskG, MaskR }, 0 },
4112
  },
4113
4114
  /* PREFIX_VEX_0F98_L_0_W_1 */
4115
  {
4116
    { "kortestq", { MaskG, MaskR }, 0 },
4117
    { Bad_Opcode },
4118
    { "kortestd", { MaskG, MaskR }, 0 },
4119
  },
4120
4121
  /* PREFIX_VEX_0F99_L_0_W_0 */
4122
  {
4123
    { "ktestw", { MaskG, MaskR }, 0 },
4124
    { Bad_Opcode },
4125
    { "ktestb", { MaskG, MaskR }, 0 },
4126
  },
4127
4128
  /* PREFIX_VEX_0F99_L_0_W_1 */
4129
  {
4130
    { "ktestq", { MaskG, MaskR }, 0 },
4131
    { Bad_Opcode },
4132
    { "ktestd", { MaskG, MaskR }, 0 },
4133
  },
4134
4135
  /* PREFIX_VEX_0F3848_X86_64_L_0_W_0 */
4136
  {
4137
    { "ttmmultf32ps", { TMM, Rtmm, VexTmm }, 0 },
4138
    { Bad_Opcode },
4139
    { "tmmultf32ps",  { TMM, Rtmm, VexTmm }, 0 },
4140
  },
4141
4142
  /* PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_0 */
4143
  {
4144
    { "ldtilecfg", { M }, 0 },
4145
    { Bad_Opcode },
4146
    { "sttilecfg", { M }, 0 },
4147
  },
4148
4149
  /* PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_1 */
4150
  {
4151
    { REG_TABLE (REG_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0) },
4152
    { Bad_Opcode },
4153
    { Bad_Opcode },
4154
    { RM_TABLE (RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_3) },
4155
  },
4156
4157
  /* PREFIX_VEX_0F384A_X86_64_W_0_L_0 */
4158
  {
4159
    { Bad_Opcode },
4160
    { Bad_Opcode },
4161
    { "tileloaddrst1",  { TMM, MVexSIBMEM }, 0 },
4162
    { "tileloaddrs",  { TMM, MVexSIBMEM }, 0 },
4163
  },
4164
4165
  /* PREFIX_VEX_0F384B_X86_64_L_0_W_0 */
4166
  {
4167
    { Bad_Opcode },
4168
    { "tilestored", { MVexSIBMEM, TMM }, 0 },
4169
    { "tileloaddt1",  { TMM, MVexSIBMEM }, 0 },
4170
    { "tileloadd",  { TMM, MVexSIBMEM }, 0 },
4171
  },
4172
4173
  /* PREFIX_VEX_0F3850_W_0 */
4174
  {
4175
    { "%XEvpdpbuud",  { XM, Vex, EXx }, 0 },
4176
    { "%XEvpdpbsud",  { XM, Vex, EXx }, 0 },
4177
    { "%XVvpdpbusd",  { XM, Vex, EXx }, 0 },
4178
    { "%XEvpdpbssd",  { XM, Vex, EXx }, 0 },
4179
  },
4180
4181
  /* PREFIX_VEX_0F3851_W_0 */
4182
  {
4183
    { "%XEvpdpbuuds", { XM, Vex, EXx }, 0 },
4184
    { "%XEvpdpbsuds", { XM, Vex, EXx }, 0 },
4185
    { "%XVvpdpbusds", { XM, Vex, EXx }, 0 },
4186
    { "%XEvpdpbssds", { XM, Vex, EXx }, 0 },
4187
  },
4188
  /* PREFIX_VEX_0F385C_X86_64_L_0_W_0 */
4189
  {
4190
    { Bad_Opcode },
4191
    { "tdpbf16ps", { TMM, Rtmm, VexTmm }, 0 },
4192
    { Bad_Opcode },
4193
    { "tdpfp16ps", { TMM, Rtmm, VexTmm }, 0 },
4194
  },
4195
4196
  /* PREFIX_VEX_0F385E_X86_64_L_0_W_0 */
4197
  {
4198
    { "tdpbuud", {TMM, Rtmm, VexTmm }, 0 },
4199
    { "tdpbsud", {TMM, Rtmm, VexTmm }, 0 },
4200
    { "tdpbusd", {TMM, Rtmm, VexTmm }, 0 },
4201
    { "tdpbssd", {TMM, Rtmm, VexTmm }, 0 },
4202
  },
4203
4204
  /* PREFIX_VEX_0F385F_X86_64_L_0_W_0 */
4205
  {
4206
    { Bad_Opcode },
4207
    { "ttransposed",  { TMM, Rtmm }, 0 },
4208
  },
4209
4210
  /* PREFIX_VEX_0F386B_X86_64_L_0_W_0 */
4211
  {
4212
    { "tconjtcmmimfp16ps",  { TMM, Rtmm, VexTmm }, 0 },
4213
    { "ttcmmrlfp16ps",  { TMM, Rtmm, VexTmm }, 0 },
4214
    { "tconjtfp16", { TMM, Rtmm }, 0 },
4215
    { "ttcmmimfp16ps",  { TMM, Rtmm, VexTmm }, 0 },
4216
  },
4217
4218
  /* PREFIX_VEX_0F386C_X86_64_L_0_W_0 */
4219
  {
4220
    { "tcmmrlfp16ps", { TMM, Rtmm, VexTmm }, 0 },
4221
    { "ttdpbf16ps", { TMM, Rtmm, VexTmm }, 0 },
4222
    { "tcmmimfp16ps", { TMM, Rtmm, VexTmm }, 0 },
4223
    { "ttdpfp16ps", { TMM, Rtmm, VexTmm }, 0 },
4224
  },
4225
4226
  /* PREFIX_VEX_0F386E_X86_64_L_0_W_0 */
4227
  {
4228
    { "t2rpntlvwz0",  { TMM, MVexSIBMEM }, 0 },
4229
    { Bad_Opcode },
4230
    { "t2rpntlvwz1",  { TMM, MVexSIBMEM }, 0 },
4231
  },
4232
4233
  /* PREFIX_VEX_0F386F_X86_64_L_0_W_0 */
4234
  {
4235
    { "t2rpntlvwz0t1",  { TMM, MVexSIBMEM }, 0 },
4236
    { Bad_Opcode },
4237
    { "t2rpntlvwz1t1",  { TMM, MVexSIBMEM }, 0 },
4238
  },
4239
4240
  /* PREFIX_VEX_0F3872 */
4241
  {
4242
    { Bad_Opcode },
4243
    { VEX_W_TABLE (VEX_W_0F3872_P_1) },
4244
  },
4245
4246
  /* PREFIX_VEX_0F38B0_W_0 */
4247
  {
4248
    { "vcvtneoph2ps", { XM, Mx }, 0 },
4249
    { "vcvtneebf162ps", { XM, Mx }, 0 },
4250
    { "vcvtneeph2ps", { XM, Mx }, 0 },
4251
    { "vcvtneobf162ps", { XM, Mx }, 0 },
4252
  },
4253
4254
  /* PREFIX_VEX_0F38B1_W_0 */
4255
  {
4256
    { Bad_Opcode },
4257
    { "vbcstnebf162ps", { XM, Mw }, 0 },
4258
    { "vbcstnesh2ps", { XM, Mw }, 0 },
4259
  },
4260
4261
  /* PREFIX_VEX_0F38D2_W_0 */
4262
  {
4263
    { "%XEvpdpwuud",  { XM, Vex, EXx }, 0 },
4264
    { "%XEvpdpwsud",  { XM, Vex, EXx }, 0 },
4265
    { "%XEvpdpwusd",  { XM, Vex, EXx }, 0 },
4266
  },
4267
4268
  /* PREFIX_VEX_0F38D3_W_0 */
4269
  {
4270
    { "%XEvpdpwuuds", { XM, Vex, EXx }, 0 },
4271
    { "%XEvpdpwsuds", { XM, Vex, EXx }, 0 },
4272
    { "%XEvpdpwusds", { XM, Vex, EXx }, 0 },
4273
  },
4274
4275
  /* PREFIX_VEX_0F38CB */
4276
  {
4277
    { Bad_Opcode },
4278
    { Bad_Opcode },
4279
    { Bad_Opcode },
4280
    { VEX_W_TABLE (VEX_W_0F38CB_P_3) },
4281
  },
4282
4283
  /* PREFIX_VEX_0F38CC */
4284
  {
4285
    { Bad_Opcode },
4286
    { Bad_Opcode },
4287
    { Bad_Opcode },
4288
    { VEX_W_TABLE (VEX_W_0F38CC_P_3) },
4289
  },
4290
4291
  /* PREFIX_VEX_0F38CD */
4292
  {
4293
    { Bad_Opcode },
4294
    { Bad_Opcode },
4295
    { Bad_Opcode },
4296
    { VEX_W_TABLE (VEX_W_0F38CD_P_3) },
4297
  },
4298
4299
  /* PREFIX_VEX_0F38DA_W_0 */
4300
  {
4301
    { VEX_LEN_TABLE (VEX_LEN_0F38DA_W_0_P_0) },
4302
    { "%XEvsm4key4",  { XM, Vex, EXx }, 0 },
4303
    { VEX_LEN_TABLE (VEX_LEN_0F38DA_W_0_P_2) },
4304
    { "%XEvsm4rnds4", { XM, Vex, EXx }, 0 },
4305
  },
4306
4307
  /* PREFIX_VEX_0F38F2_L_0 */
4308
  {
4309
    { "%NFandnS",          { Gdq, VexGdq, Edq }, 0 },
4310
  },
4311
4312
  /* PREFIX_VEX_0F38F3_L_0 */
4313
  {
4314
    { REG_TABLE (REG_VEX_0F38F3_L_0_P_0) },
4315
  },
4316
4317
  /* PREFIX_VEX_0F38F5_L_0 */
4318
  {
4319
    { "%NFbzhiS", { Gdq, Edq, VexGdq }, 0 },
4320
    { "%XEpextS",   { Gdq, VexGdq, Edq }, 0 },
4321
    { Bad_Opcode },
4322
    { "%XEpdepS",   { Gdq, VexGdq, Edq }, 0 },
4323
  },
4324
4325
  /* PREFIX_VEX_0F38F6_L_0 */
4326
  {
4327
    { Bad_Opcode },
4328
    { Bad_Opcode },
4329
    { Bad_Opcode },
4330
    { "%XEmulxS",   { Gdq, VexGdq, Edq }, 0 },
4331
  },
4332
4333
  /* PREFIX_VEX_0F38F7_L_0 */
4334
  {
4335
    { "%NFbextrS",  { Gdq, Edq, VexGdq }, 0 },
4336
    { "%XEsarxS",   { Gdq, Edq, VexGdq }, 0 },
4337
    { "%XEshlxS",   { Gdq, Edq, VexGdq }, 0 },
4338
    { "%XEshrxS",   { Gdq, Edq, VexGdq }, 0 },
4339
  },
4340
4341
  /* PREFIX_VEX_0F3AF0_L_0 */
4342
  {
4343
    { Bad_Opcode },
4344
    { Bad_Opcode },
4345
    { Bad_Opcode },
4346
    { "%XErorxS",   { Gdq, Edq, Ib }, 0 },
4347
  },
4348
4349
  /* PREFIX_VEX_MAP5_F8_X86_64_L_0_W_0 */
4350
  {
4351
    { "t2rpntlvwz0rs",  { TMM, MVexSIBMEM }, 0 },
4352
    { Bad_Opcode },
4353
    { "t2rpntlvwz1rs",  { TMM, MVexSIBMEM }, 0 },
4354
  },
4355
4356
  /* PREFIX_VEX_MAP5_F9_X86_64_L_0_W_0 */
4357
  {
4358
    { "t2rpntlvwz0rst1",  { TMM, MVexSIBMEM }, 0 },
4359
    { Bad_Opcode },
4360
    { "t2rpntlvwz1rst1",  { TMM, MVexSIBMEM }, 0 },
4361
  },
4362
4363
  /* PREFIX_VEX_MAP5_FD_X86_64_L_0_W_0 */
4364
  {
4365
    { "tdpbf8ps", { TMM, Rtmm, VexTmm }, 0 },
4366
    { "tdphbf8ps",  { TMM, Rtmm, VexTmm }, 0 },
4367
    { "tdphf8ps", { TMM, Rtmm, VexTmm }, 0 },
4368
    { "tdpbhf8ps",  { TMM, Rtmm, VexTmm }, 0 },
4369
  },
4370
4371
  /* PREFIX_VEX_MAP7_F6_L_0_W_0_R_0_X86_64 */
4372
  {
4373
    { Bad_Opcode },
4374
    { "wrmsrns",  { Skip_MODRM, Id, Rq }, 0 },
4375
    { Bad_Opcode },
4376
    { "rdmsr",    { Rq, Id }, 0 },
4377
  },
4378
4379
  /* PREFIX_VEX_MAP7_F8_L_0_W_0_R_0_X86_64 */
4380
  {
4381
    { Bad_Opcode },
4382
    { "uwrmsr", { Skip_MODRM, Id, Rq }, 0 },
4383
    { Bad_Opcode },
4384
    { "urdmsr", { Rq, Id }, 0 },
4385
  },
4386
4387
#include "i386-dis-evex-prefix.h"
4388
};
4389
4390
static const struct dis386 x86_64_table[][2] = {
4391
  /* X86_64_06 */
4392
  {
4393
    { "pushP", { es }, 0 },
4394
  },
4395
4396
  /* X86_64_07 */
4397
  {
4398
    { "popP", { es }, 0 },
4399
  },
4400
4401
  /* X86_64_0E */
4402
  {
4403
    { "pushP", { cs }, 0 },
4404
  },
4405
4406
  /* X86_64_16 */
4407
  {
4408
    { "pushP", { ss }, 0 },
4409
  },
4410
4411
  /* X86_64_17 */
4412
  {
4413
    { "popP", { ss }, 0 },
4414
  },
4415
4416
  /* X86_64_1E */
4417
  {
4418
    { "pushP", { ds }, 0 },
4419
  },
4420
4421
  /* X86_64_1F */
4422
  {
4423
    { "popP", { ds }, 0 },
4424
  },
4425
4426
  /* X86_64_27 */
4427
  {
4428
    { "daa", { XX }, 0 },
4429
  },
4430
4431
  /* X86_64_2F */
4432
  {
4433
    { "das", { XX }, 0 },
4434
  },
4435
4436
  /* X86_64_37 */
4437
  {
4438
    { "aaa", { XX }, 0 },
4439
  },
4440
4441
  /* X86_64_3F */
4442
  {
4443
    { "aas", { XX }, 0 },
4444
  },
4445
4446
  /* X86_64_60 */
4447
  {
4448
    { "pushaP", { XX }, 0 },
4449
  },
4450
4451
  /* X86_64_61 */
4452
  {
4453
    { "popaP", { XX }, 0 },
4454
  },
4455
4456
  /* X86_64_62 */
4457
  {
4458
    { MOD_TABLE (MOD_62_32BIT) },
4459
    { EVEX_TABLE () },
4460
  },
4461
4462
  /* X86_64_63 */
4463
  {
4464
    { "arplS", { Sv, Gv }, 0 },
4465
    { "movs", { Gv, { MOVSXD_Fixup, movsxd_mode } }, 0 },
4466
  },
4467
4468
  /* X86_64_6D */
4469
  {
4470
    { "ins{R|}", { Yzr, indirDX }, 0 },
4471
    { "ins{G|}", { Yzr, indirDX }, 0 },
4472
  },
4473
4474
  /* X86_64_6F */
4475
  {
4476
    { "outs{R|}", { indirDXr, Xz }, 0 },
4477
    { "outs{G|}", { indirDXr, Xz }, 0 },
4478
  },
4479
4480
  /* X86_64_82 */
4481
  {
4482
    /* Opcode 0x82 is an alias of opcode 0x80 in 32-bit mode.  */
4483
    { REG_TABLE (REG_80) },
4484
  },
4485
4486
  /* X86_64_9A */
4487
  {
4488
    { "{l|}call{P|}", { Ap }, 0 },
4489
  },
4490
4491
  /* X86_64_C2 */
4492
  {
4493
    { "retP",   { Iw, BND }, 0 },
4494
    { "ret@",   { Iw, BND }, 0 },
4495
  },
4496
4497
  /* X86_64_C3 */
4498
  {
4499
    { "retP",   { BND }, 0 },
4500
    { "ret@",   { BND }, 0 },
4501
  },
4502
4503
  /* X86_64_C4 */
4504
  {
4505
    { MOD_TABLE (MOD_C4_32BIT) },
4506
    { VEX_C4_TABLE () },
4507
  },
4508
4509
  /* X86_64_C5 */
4510
  {
4511
    { MOD_TABLE (MOD_C5_32BIT) },
4512
    { VEX_C5_TABLE () },
4513
  },
4514
4515
  /* X86_64_CE */
4516
  {
4517
    { "into", { XX }, 0 },
4518
  },
4519
4520
  /* X86_64_D4 */
4521
  {
4522
    { "aam", { Ib }, 0 },
4523
  },
4524
4525
  /* X86_64_D5 */
4526
  {
4527
    { "aad", { Ib }, 0 },
4528
  },
4529
4530
  /* X86_64_D6 */
4531
  {
4532
    { "salc", { XX }, 0 },
4533
    { "udb", { XX }, 0 },
4534
  },
4535
4536
  /* X86_64_E8 */
4537
  {
4538
    { "callP",    { Jv, BND }, 0 },
4539
    { "call@",    { Jv, BND }, PREFIX_REX2_ILLEGAL }
4540
  },
4541
4542
  /* X86_64_E9 */
4543
  {
4544
    { "jmpP",   { Jv, BND }, 0 },
4545
    { "jmp@",   { Jv, BND }, PREFIX_REX2_ILLEGAL }
4546
  },
4547
4548
  /* X86_64_EA */
4549
  {
4550
    { "{l|}jmp{P|}", { Ap }, 0 },
4551
  },
4552
4553
  /* X86_64_0F00_REG_6 */
4554
  {
4555
    { Bad_Opcode },
4556
    { PREFIX_TABLE (PREFIX_0F00_REG_6_X86_64) },
4557
  },
4558
4559
  /* X86_64_0F01_REG_0 */
4560
  {
4561
    { "sgdt{Q|Q}", { M }, 0 },
4562
    { "sgdt", { M }, 0 },
4563
  },
4564
4565
  /* X86_64_0F01_REG_0_MOD_3_RM_6_P_1 */
4566
  {
4567
    { Bad_Opcode },
4568
    { "wrmsrlist",  { Skip_MODRM }, 0 },
4569
  },
4570
4571
  /* X86_64_0F01_REG_0_MOD_3_RM_6_P_3 */
4572
  {
4573
    { Bad_Opcode },
4574
    { "rdmsrlist",  { Skip_MODRM }, 0 },
4575
  },
4576
4577
  /* X86_64_0F01_REG_0_MOD_3_RM_7_P_0 */
4578
  {
4579
    { Bad_Opcode },
4580
    { "pbndkb",   { Skip_MODRM }, 0 },
4581
  },
4582
4583
  /* X86_64_0F01_REG_1 */
4584
  {
4585
    { "sidt{Q|Q}", { M }, 0 },
4586
    { "sidt", { M }, 0 },
4587
  },
4588
4589
  /* X86_64_0F01_REG_1_RM_2_PREFIX_1 */
4590
  {
4591
    { Bad_Opcode },
4592
    { "eretu",    { Skip_MODRM }, 0 },
4593
  },
4594
4595
  /* X86_64_0F01_REG_1_RM_2_PREFIX_3 */
4596
  {
4597
    { Bad_Opcode },
4598
    { "erets",    { Skip_MODRM }, 0 },
4599
  },
4600
4601
  /* X86_64_0F01_REG_1_RM_5_PREFIX_2 */
4602
  {
4603
    { Bad_Opcode },
4604
    { "seamret",  { Skip_MODRM }, 0 },
4605
  },
4606
4607
  /* X86_64_0F01_REG_1_RM_6_PREFIX_2 */
4608
  {
4609
    { Bad_Opcode },
4610
    { "seamops",  { Skip_MODRM }, 0 },
4611
  },
4612
4613
  /* X86_64_0F01_REG_1_RM_7_PREFIX_2 */
4614
  {
4615
    { Bad_Opcode },
4616
    { "seamcall", { Skip_MODRM }, 0 },
4617
  },
4618
4619
  /* X86_64_0F01_REG_2 */
4620
  {
4621
    { "lgdt{Q|Q}", { M }, 0 },
4622
    { "lgdt", { M }, 0 },
4623
  },
4624
4625
  /* X86_64_0F01_REG_3 */
4626
  {
4627
    { "lidt{Q|Q}", { M }, 0 },
4628
    { "lidt", { M }, 0 },
4629
  },
4630
4631
  /* X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1 */
4632
  {
4633
    { Bad_Opcode },
4634
    { "uiret",  { Skip_MODRM }, 0 },
4635
  },
4636
4637
  /* X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1 */
4638
  {
4639
    { Bad_Opcode },
4640
    { "testui", { Skip_MODRM }, 0 },
4641
  },
4642
4643
  /* X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1 */
4644
  {
4645
    { Bad_Opcode },
4646
    { "clui", { Skip_MODRM }, 0 },
4647
  },
4648
4649
  /* X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1 */
4650
  {
4651
    { Bad_Opcode },
4652
    { "stui", { Skip_MODRM }, 0 },
4653
  },
4654
4655
  /* X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_1 */
4656
  {
4657
    { Bad_Opcode },
4658
    { "rmpquery", { Skip_MODRM }, 0 },
4659
  },
4660
4661
  /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3 */
4662
  {
4663
    { Bad_Opcode },
4664
    { "rmpread",  { DSCX, RMrAX, Skip_MODRM }, 0 },
4665
  },
4666
4667
  /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1 */
4668
  {
4669
    { Bad_Opcode },
4670
    { "rmpadjust",  { Skip_MODRM }, 0 },
4671
  },
4672
4673
  /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3 */
4674
  {
4675
    { Bad_Opcode },
4676
    { "rmpupdate",  { RMrAX, DSCX, Skip_MODRM }, 0 },
4677
  },
4678
4679
  /* X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1 */
4680
  {
4681
    { Bad_Opcode },
4682
    { "psmash", { Skip_MODRM }, 0 },
4683
  },
4684
4685
  /* X86_64_0F18_REG_6_MOD_0 */
4686
  {
4687
    { "nopQ",   { Ev }, 0 },
4688
    { PREFIX_TABLE (PREFIX_0F18_REG_6_MOD_0_X86_64) },
4689
  },
4690
4691
  /* X86_64_0F18_REG_7_MOD_0 */
4692
  {
4693
    { "nopQ",   { Ev }, 0 },
4694
    { PREFIX_TABLE (PREFIX_0F18_REG_7_MOD_0_X86_64) },
4695
  },
4696
4697
  {
4698
    /* X86_64_0F24 */
4699
    { "movZ",   { Em, Td }, 0 },
4700
  },
4701
4702
  {
4703
    /* X86_64_0F26 */
4704
    { "movZ",   { Td, Em }, 0 },
4705
  },
4706
4707
  {
4708
    /* X86_64_0F388A */
4709
    { Bad_Opcode },
4710
    { "movrsB",   { Gb, Mb }, PREFIX_OPCODE },
4711
  },
4712
4713
  {
4714
    /* X86_64_0F388B */
4715
    { Bad_Opcode },
4716
    { "movrsS",   { Gv, Mv }, PREFIX_OPCODE },
4717
  },
4718
4719
  {
4720
    /* X86_64_0F38F8_M_1 */
4721
    { Bad_Opcode },
4722
    { PREFIX_TABLE (PREFIX_0F38F8_M_1_X86_64) },
4723
  },
4724
4725
  /* X86_64_0FAE_REG_0_MOD_3_PREFIX_1 */
4726
  {
4727
    { Bad_Opcode },
4728
    { "rdfsbase", { Edq }, 0 },
4729
  },
4730
4731
  /* X86_64_0FAE_REG_1_MOD_3_PREFIX_1 */
4732
  {
4733
    { Bad_Opcode },
4734
    { "rdgsbase", { Edq }, 0 },
4735
  },
4736
4737
  /* X86_64_0FAE_REG_2_MOD_3_PREFIX_1 */
4738
  {
4739
    { Bad_Opcode },
4740
    { "wrfsbase", { Edq }, 0 },
4741
  },
4742
4743
  /* X86_64_0FAE_REG_3_MOD_3_PREFIX_1 */
4744
  {
4745
    { Bad_Opcode },
4746
    { "wrgsbase", { Edq }, 0 },
4747
  },
4748
4749
  /* X86_64_0FC7_REG_6_MOD_3_PREFIX_1 */
4750
  {
4751
    { Bad_Opcode },
4752
    { "senduipi", { Eq }, 0 },
4753
  },
4754
4755
  /* X86_64_VEX_0F3848 */
4756
  {
4757
    { Bad_Opcode },
4758
    { VEX_LEN_TABLE (VEX_LEN_0F3848_X86_64) },
4759
  },
4760
4761
  /* X86_64_VEX_0F3849 */
4762
  {
4763
    { Bad_Opcode },
4764
    { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64) },
4765
  },
4766
4767
  /* X86_64_VEX_0F384A */
4768
  {
4769
    { Bad_Opcode },
4770
    { VEX_W_TABLE (VEX_W_0F384A_X86_64) },
4771
  },
4772
4773
  /* X86_64_VEX_0F384B */
4774
  {
4775
    { Bad_Opcode },
4776
    { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64) },
4777
  },
4778
4779
  /* X86_64_VEX_0F385C */
4780
  {
4781
    { Bad_Opcode },
4782
    { VEX_LEN_TABLE (VEX_LEN_0F385C_X86_64) },
4783
  },
4784
4785
  /* X86_64_VEX_0F385E */
4786
  {
4787
    { Bad_Opcode },
4788
    { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64) },
4789
  },
4790
4791
  /* X86_64_VEX_0F385F */
4792
  {
4793
    { Bad_Opcode },
4794
    { VEX_LEN_TABLE (VEX_LEN_0F385F_X86_64) },
4795
  },
4796
4797
  /* X86_64_VEX_0F386B */
4798
  {
4799
    { Bad_Opcode },
4800
    { VEX_LEN_TABLE (VEX_LEN_0F386B_X86_64) },
4801
  },
4802
4803
  /* X86_64_VEX_0F386C */
4804
  {
4805
    { Bad_Opcode },
4806
    { VEX_LEN_TABLE (VEX_LEN_0F386C_X86_64) },
4807
  },
4808
4809
  /* X86_64_VEX_0F386E */
4810
  {
4811
    { Bad_Opcode },
4812
    { VEX_LEN_TABLE (VEX_LEN_0F386E_X86_64) },
4813
  },
4814
4815
  /* X86_64_VEX_0F386F */
4816
  {
4817
    { Bad_Opcode },
4818
    { VEX_LEN_TABLE (VEX_LEN_0F386F_X86_64) },
4819
  },
4820
4821
  /* X86_64_VEX_0F38Ex */
4822
  {
4823
    { Bad_Opcode },
4824
    { "%XEcmp%CCxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4825
  },
4826
4827
  /* X86_64_VEX_MAP5_F8 */
4828
  {
4829
    { Bad_Opcode },
4830
    { VEX_LEN_TABLE (VEX_LEN_MAP5_F8_X86_64) },
4831
  },
4832
4833
  /* X86_64_VEX_MAP5_F9 */
4834
  {
4835
    { Bad_Opcode },
4836
    { VEX_LEN_TABLE (VEX_LEN_MAP5_F9_X86_64) },
4837
  },
4838
4839
  /* X86_64_VEX_MAP5_FD */
4840
  {
4841
    { Bad_Opcode },
4842
    { VEX_LEN_TABLE (VEX_LEN_MAP5_FD_X86_64) },
4843
  },
4844
4845
  /* X86_64_VEX_MAP7_F6_L_0_W_0_R_0 */
4846
  {
4847
    { Bad_Opcode },
4848
    { PREFIX_TABLE (PREFIX_VEX_MAP7_F6_L_0_W_0_R_0_X86_64) },
4849
  },
4850
4851
  /* X86_64_VEX_MAP7_F8_L_0_W_0_R_0 */
4852
  {
4853
    { Bad_Opcode },
4854
    { PREFIX_TABLE (PREFIX_VEX_MAP7_F8_L_0_W_0_R_0_X86_64) },
4855
  },
4856
4857
#include "i386-dis-evex-x86-64.h"
4858
};
4859
4860
static const struct dis386 three_byte_table[][256] = {
4861
4862
  /* THREE_BYTE_0F38 */
4863
  {
4864
    /* 00 */
4865
    { "pshufb",   { MX, EM }, PREFIX_OPCODE },
4866
    { "phaddw",   { MX, EM }, PREFIX_OPCODE },
4867
    { "phaddd",   { MX, EM }, PREFIX_OPCODE },
4868
    { "phaddsw",  { MX, EM }, PREFIX_OPCODE },
4869
    { "pmaddubsw",  { MX, EM }, PREFIX_OPCODE },
4870
    { "phsubw",   { MX, EM }, PREFIX_OPCODE },
4871
    { "phsubd",   { MX, EM }, PREFIX_OPCODE },
4872
    { "phsubsw",  { MX, EM }, PREFIX_OPCODE },
4873
    /* 08 */
4874
    { "psignb",   { MX, EM }, PREFIX_OPCODE },
4875
    { "psignw",   { MX, EM }, PREFIX_OPCODE },
4876
    { "psignd",   { MX, EM }, PREFIX_OPCODE },
4877
    { "pmulhrsw", { MX, EM }, PREFIX_OPCODE },
4878
    { Bad_Opcode },
4879
    { Bad_Opcode },
4880
    { Bad_Opcode },
4881
    { Bad_Opcode },
4882
    /* 10 */
4883
    { "pblendvb", { XM, EXx, XMM0 }, PREFIX_DATA },
4884
    { Bad_Opcode },
4885
    { Bad_Opcode },
4886
    { Bad_Opcode },
4887
    { "blendvps", { XM, EXx, XMM0 }, PREFIX_DATA },
4888
    { "blendvpd", { XM, EXx, XMM0 }, PREFIX_DATA },
4889
    { Bad_Opcode },
4890
    { "ptest",  { XM, EXx }, PREFIX_DATA },
4891
    /* 18 */
4892
    { Bad_Opcode },
4893
    { Bad_Opcode },
4894
    { Bad_Opcode },
4895
    { Bad_Opcode },
4896
    { "pabsb",    { MX, EM }, PREFIX_OPCODE },
4897
    { "pabsw",    { MX, EM }, PREFIX_OPCODE },
4898
    { "pabsd",    { MX, EM }, PREFIX_OPCODE },
4899
    { Bad_Opcode },
4900
    /* 20 */
4901
    { "pmovsxbw", { XM, EXq }, PREFIX_DATA },
4902
    { "pmovsxbd", { XM, EXd }, PREFIX_DATA },
4903
    { "pmovsxbq", { XM, EXw }, PREFIX_DATA },
4904
    { "pmovsxwd", { XM, EXq }, PREFIX_DATA },
4905
    { "pmovsxwq", { XM, EXd }, PREFIX_DATA },
4906
    { "pmovsxdq", { XM, EXq }, PREFIX_DATA },
4907
    { Bad_Opcode },
4908
    { Bad_Opcode },
4909
    /* 28 */
4910
    { "pmuldq", { XM, EXx }, PREFIX_DATA },
4911
    { "pcmpeqq", { XM, EXx }, PREFIX_DATA },
4912
    { "movntdqa", { XM, Mx }, PREFIX_DATA },
4913
    { "packusdw", { XM, EXx }, PREFIX_DATA },
4914
    { Bad_Opcode },
4915
    { Bad_Opcode },
4916
    { Bad_Opcode },
4917
    { Bad_Opcode },
4918
    /* 30 */
4919
    { "pmovzxbw", { XM, EXq }, PREFIX_DATA },
4920
    { "pmovzxbd", { XM, EXd }, PREFIX_DATA },
4921
    { "pmovzxbq", { XM, EXw }, PREFIX_DATA },
4922
    { "pmovzxwd", { XM, EXq }, PREFIX_DATA },
4923
    { "pmovzxwq", { XM, EXd }, PREFIX_DATA },
4924
    { "pmovzxdq", { XM, EXq }, PREFIX_DATA },
4925
    { Bad_Opcode },
4926
    { "pcmpgtq", { XM, EXx }, PREFIX_DATA },
4927
    /* 38 */
4928
    { "pminsb", { XM, EXx }, PREFIX_DATA },
4929
    { "pminsd", { XM, EXx }, PREFIX_DATA },
4930
    { "pminuw", { XM, EXx }, PREFIX_DATA },
4931
    { "pminud", { XM, EXx }, PREFIX_DATA },
4932
    { "pmaxsb", { XM, EXx }, PREFIX_DATA },
4933
    { "pmaxsd", { XM, EXx }, PREFIX_DATA },
4934
    { "pmaxuw", { XM, EXx }, PREFIX_DATA },
4935
    { "pmaxud", { XM, EXx }, PREFIX_DATA },
4936
    /* 40 */
4937
    { "pmulld", { XM, EXx }, PREFIX_DATA },
4938
    { "phminposuw", { XM, EXx }, PREFIX_DATA },
4939
    { Bad_Opcode },
4940
    { Bad_Opcode },
4941
    { Bad_Opcode },
4942
    { Bad_Opcode },
4943
    { Bad_Opcode },
4944
    { Bad_Opcode },
4945
    /* 48 */
4946
    { Bad_Opcode },
4947
    { Bad_Opcode },
4948
    { Bad_Opcode },
4949
    { Bad_Opcode },
4950
    { Bad_Opcode },
4951
    { Bad_Opcode },
4952
    { Bad_Opcode },
4953
    { Bad_Opcode },
4954
    /* 50 */
4955
    { Bad_Opcode },
4956
    { Bad_Opcode },
4957
    { Bad_Opcode },
4958
    { Bad_Opcode },
4959
    { Bad_Opcode },
4960
    { Bad_Opcode },
4961
    { Bad_Opcode },
4962
    { Bad_Opcode },
4963
    /* 58 */
4964
    { Bad_Opcode },
4965
    { Bad_Opcode },
4966
    { Bad_Opcode },
4967
    { Bad_Opcode },
4968
    { Bad_Opcode },
4969
    { Bad_Opcode },
4970
    { Bad_Opcode },
4971
    { Bad_Opcode },
4972
    /* 60 */
4973
    { Bad_Opcode },
4974
    { Bad_Opcode },
4975
    { Bad_Opcode },
4976
    { Bad_Opcode },
4977
    { Bad_Opcode },
4978
    { Bad_Opcode },
4979
    { Bad_Opcode },
4980
    { Bad_Opcode },
4981
    /* 68 */
4982
    { Bad_Opcode },
4983
    { Bad_Opcode },
4984
    { Bad_Opcode },
4985
    { Bad_Opcode },
4986
    { Bad_Opcode },
4987
    { Bad_Opcode },
4988
    { Bad_Opcode },
4989
    { Bad_Opcode },
4990
    /* 70 */
4991
    { Bad_Opcode },
4992
    { Bad_Opcode },
4993
    { Bad_Opcode },
4994
    { Bad_Opcode },
4995
    { Bad_Opcode },
4996
    { Bad_Opcode },
4997
    { Bad_Opcode },
4998
    { Bad_Opcode },
4999
    /* 78 */
5000
    { Bad_Opcode },
5001
    { Bad_Opcode },
5002
    { Bad_Opcode },
5003
    { Bad_Opcode },
5004
    { Bad_Opcode },
5005
    { Bad_Opcode },
5006
    { Bad_Opcode },
5007
    { Bad_Opcode },
5008
    /* 80 */
5009
    { "invept", { Gm, Mo }, PREFIX_DATA },
5010
    { "invvpid", { Gm, Mo }, PREFIX_DATA },
5011
    { "invpcid", { Gm, M }, PREFIX_DATA },
5012
    { Bad_Opcode },
5013
    { Bad_Opcode },
5014
    { Bad_Opcode },
5015
    { Bad_Opcode },
5016
    { Bad_Opcode },
5017
    /* 88 */
5018
    { Bad_Opcode },
5019
    { Bad_Opcode },
5020
    { X86_64_TABLE (X86_64_0F388A) },
5021
    { X86_64_TABLE (X86_64_0F388B) },
5022
    { Bad_Opcode },
5023
    { Bad_Opcode },
5024
    { Bad_Opcode },
5025
    { Bad_Opcode },
5026
    /* 90 */
5027
    { Bad_Opcode },
5028
    { Bad_Opcode },
5029
    { Bad_Opcode },
5030
    { Bad_Opcode },
5031
    { Bad_Opcode },
5032
    { Bad_Opcode },
5033
    { Bad_Opcode },
5034
    { Bad_Opcode },
5035
    /* 98 */
5036
    { Bad_Opcode },
5037
    { Bad_Opcode },
5038
    { Bad_Opcode },
5039
    { Bad_Opcode },
5040
    { Bad_Opcode },
5041
    { Bad_Opcode },
5042
    { Bad_Opcode },
5043
    { Bad_Opcode },
5044
    /* a0 */
5045
    { Bad_Opcode },
5046
    { Bad_Opcode },
5047
    { Bad_Opcode },
5048
    { Bad_Opcode },
5049
    { Bad_Opcode },
5050
    { Bad_Opcode },
5051
    { Bad_Opcode },
5052
    { Bad_Opcode },
5053
    /* a8 */
5054
    { Bad_Opcode },
5055
    { Bad_Opcode },
5056
    { Bad_Opcode },
5057
    { Bad_Opcode },
5058
    { Bad_Opcode },
5059
    { Bad_Opcode },
5060
    { Bad_Opcode },
5061
    { Bad_Opcode },
5062
    /* b0 */
5063
    { Bad_Opcode },
5064
    { Bad_Opcode },
5065
    { Bad_Opcode },
5066
    { Bad_Opcode },
5067
    { Bad_Opcode },
5068
    { Bad_Opcode },
5069
    { Bad_Opcode },
5070
    { Bad_Opcode },
5071
    /* b8 */
5072
    { Bad_Opcode },
5073
    { Bad_Opcode },
5074
    { Bad_Opcode },
5075
    { Bad_Opcode },
5076
    { Bad_Opcode },
5077
    { Bad_Opcode },
5078
    { Bad_Opcode },
5079
    { Bad_Opcode },
5080
    /* c0 */
5081
    { Bad_Opcode },
5082
    { Bad_Opcode },
5083
    { Bad_Opcode },
5084
    { Bad_Opcode },
5085
    { Bad_Opcode },
5086
    { Bad_Opcode },
5087
    { Bad_Opcode },
5088
    { Bad_Opcode },
5089
    /* c8 */
5090
    { "sha1nexte", { XM, EXxmm }, PREFIX_OPCODE },
5091
    { "sha1msg1", { XM, EXxmm }, PREFIX_OPCODE },
5092
    { "sha1msg2", { XM, EXxmm }, PREFIX_OPCODE },
5093
    { "sha256rnds2", { XM, EXxmm, XMM0 }, PREFIX_OPCODE },
5094
    { "sha256msg1", { XM, EXxmm }, PREFIX_OPCODE },
5095
    { "sha256msg2", { XM, EXxmm }, PREFIX_OPCODE },
5096
    { Bad_Opcode },
5097
    { "gf2p8mulb", { XM, EXxmm }, PREFIX_DATA },
5098
    /* d0 */
5099
    { Bad_Opcode },
5100
    { Bad_Opcode },
5101
    { Bad_Opcode },
5102
    { Bad_Opcode },
5103
    { Bad_Opcode },
5104
    { Bad_Opcode },
5105
    { Bad_Opcode },
5106
    { Bad_Opcode },
5107
    /* d8 */
5108
    { PREFIX_TABLE (PREFIX_0F38D8) },
5109
    { Bad_Opcode },
5110
    { Bad_Opcode },
5111
    { "aesimc", { XM, EXx }, PREFIX_DATA },
5112
    { PREFIX_TABLE (PREFIX_0F38DC) },
5113
    { PREFIX_TABLE (PREFIX_0F38DD) },
5114
    { PREFIX_TABLE (PREFIX_0F38DE) },
5115
    { PREFIX_TABLE (PREFIX_0F38DF) },
5116
    /* e0 */
5117
    { Bad_Opcode },
5118
    { Bad_Opcode },
5119
    { Bad_Opcode },
5120
    { Bad_Opcode },
5121
    { Bad_Opcode },
5122
    { Bad_Opcode },
5123
    { Bad_Opcode },
5124
    { Bad_Opcode },
5125
    /* e8 */
5126
    { Bad_Opcode },
5127
    { Bad_Opcode },
5128
    { Bad_Opcode },
5129
    { Bad_Opcode },
5130
    { Bad_Opcode },
5131
    { Bad_Opcode },
5132
    { Bad_Opcode },
5133
    { Bad_Opcode },
5134
    /* f0 */
5135
    { PREFIX_TABLE (PREFIX_0F38F0) },
5136
    { PREFIX_TABLE (PREFIX_0F38F1) },
5137
    { Bad_Opcode },
5138
    { Bad_Opcode },
5139
    { Bad_Opcode },
5140
    { "wrussK",   { M, Gdq }, PREFIX_DATA },
5141
    { PREFIX_TABLE (PREFIX_0F38F6) },
5142
    { Bad_Opcode },
5143
    /* f8 */
5144
    { MOD_TABLE (MOD_0F38F8) },
5145
    { "movdiri",  { Mdq, Gdq }, PREFIX_OPCODE },
5146
    { PREFIX_TABLE (PREFIX_0F38FA) },
5147
    { PREFIX_TABLE (PREFIX_0F38FB) },
5148
    { PREFIX_TABLE (PREFIX_0F38FC) },
5149
    { Bad_Opcode },
5150
    { Bad_Opcode },
5151
    { Bad_Opcode },
5152
  },
5153
  /* THREE_BYTE_0F3A */
5154
  {
5155
    /* 00 */
5156
    { Bad_Opcode },
5157
    { Bad_Opcode },
5158
    { Bad_Opcode },
5159
    { Bad_Opcode },
5160
    { Bad_Opcode },
5161
    { Bad_Opcode },
5162
    { Bad_Opcode },
5163
    { Bad_Opcode },
5164
    /* 08 */
5165
    { "roundps", { XM, EXx, Ib }, PREFIX_DATA },
5166
    { "roundpd", { XM, EXx, Ib }, PREFIX_DATA },
5167
    { "roundss", { XM, EXd, Ib }, PREFIX_DATA },
5168
    { "roundsd", { XM, EXq, Ib }, PREFIX_DATA },
5169
    { "blendps", { XM, EXx, Ib }, PREFIX_DATA },
5170
    { "blendpd", { XM, EXx, Ib }, PREFIX_DATA },
5171
    { "pblendw", { XM, EXx, Ib }, PREFIX_DATA },
5172
    { "palignr",  { MX, EM, Ib }, PREFIX_OPCODE },
5173
    /* 10 */
5174
    { Bad_Opcode },
5175
    { Bad_Opcode },
5176
    { Bad_Opcode },
5177
    { Bad_Opcode },
5178
    { "pextrb", { Edb, XM, Ib }, PREFIX_DATA },
5179
    { "pextrw", { Edw, XM, Ib }, PREFIX_DATA },
5180
    { "pextrK", { Edq, XM, Ib }, PREFIX_DATA },
5181
    { "extractps", { Ed, XM, Ib }, PREFIX_DATA },
5182
    /* 18 */
5183
    { Bad_Opcode },
5184
    { Bad_Opcode },
5185
    { Bad_Opcode },
5186
    { Bad_Opcode },
5187
    { Bad_Opcode },
5188
    { Bad_Opcode },
5189
    { Bad_Opcode },
5190
    { Bad_Opcode },
5191
    /* 20 */
5192
    { "pinsrb", { XM, Edb, Ib }, PREFIX_DATA },
5193
    { "insertps", { XM, EXd, Ib }, PREFIX_DATA },
5194
    { "pinsrK", { XM, Edq, Ib }, PREFIX_DATA },
5195
    { Bad_Opcode },
5196
    { Bad_Opcode },
5197
    { Bad_Opcode },
5198
    { Bad_Opcode },
5199
    { Bad_Opcode },
5200
    /* 28 */
5201
    { Bad_Opcode },
5202
    { Bad_Opcode },
5203
    { Bad_Opcode },
5204
    { Bad_Opcode },
5205
    { Bad_Opcode },
5206
    { Bad_Opcode },
5207
    { Bad_Opcode },
5208
    { Bad_Opcode },
5209
    /* 30 */
5210
    { Bad_Opcode },
5211
    { Bad_Opcode },
5212
    { Bad_Opcode },
5213
    { Bad_Opcode },
5214
    { Bad_Opcode },
5215
    { Bad_Opcode },
5216
    { Bad_Opcode },
5217
    { Bad_Opcode },
5218
    /* 38 */
5219
    { Bad_Opcode },
5220
    { Bad_Opcode },
5221
    { Bad_Opcode },
5222
    { Bad_Opcode },
5223
    { Bad_Opcode },
5224
    { Bad_Opcode },
5225
    { Bad_Opcode },
5226
    { Bad_Opcode },
5227
    /* 40 */
5228
    { "dpps", { XM, EXx, Ib }, PREFIX_DATA },
5229
    { "dppd", { XM, EXx, Ib }, PREFIX_DATA },
5230
    { "mpsadbw", { XM, EXx, Ib }, PREFIX_DATA },
5231
    { Bad_Opcode },
5232
    { "pclmulqdq", { XM, EXx, PCLMUL }, PREFIX_DATA },
5233
    { Bad_Opcode },
5234
    { Bad_Opcode },
5235
    { Bad_Opcode },
5236
    /* 48 */
5237
    { Bad_Opcode },
5238
    { Bad_Opcode },
5239
    { Bad_Opcode },
5240
    { Bad_Opcode },
5241
    { Bad_Opcode },
5242
    { Bad_Opcode },
5243
    { Bad_Opcode },
5244
    { Bad_Opcode },
5245
    /* 50 */
5246
    { Bad_Opcode },
5247
    { Bad_Opcode },
5248
    { Bad_Opcode },
5249
    { Bad_Opcode },
5250
    { Bad_Opcode },
5251
    { Bad_Opcode },
5252
    { Bad_Opcode },
5253
    { Bad_Opcode },
5254
    /* 58 */
5255
    { Bad_Opcode },
5256
    { Bad_Opcode },
5257
    { Bad_Opcode },
5258
    { Bad_Opcode },
5259
    { Bad_Opcode },
5260
    { Bad_Opcode },
5261
    { Bad_Opcode },
5262
    { Bad_Opcode },
5263
    /* 60 */
5264
    { "pcmpestrm!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
5265
    { "pcmpestri!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
5266
    { "pcmpistrm", { XM, EXx, Ib }, PREFIX_DATA },
5267
    { "pcmpistri", { XM, EXx, Ib }, PREFIX_DATA },
5268
    { Bad_Opcode },
5269
    { Bad_Opcode },
5270
    { Bad_Opcode },
5271
    { Bad_Opcode },
5272
    /* 68 */
5273
    { Bad_Opcode },
5274
    { Bad_Opcode },
5275
    { Bad_Opcode },
5276
    { Bad_Opcode },
5277
    { Bad_Opcode },
5278
    { Bad_Opcode },
5279
    { Bad_Opcode },
5280
    { Bad_Opcode },
5281
    /* 70 */
5282
    { Bad_Opcode },
5283
    { Bad_Opcode },
5284
    { Bad_Opcode },
5285
    { Bad_Opcode },
5286
    { Bad_Opcode },
5287
    { Bad_Opcode },
5288
    { Bad_Opcode },
5289
    { Bad_Opcode },
5290
    /* 78 */
5291
    { Bad_Opcode },
5292
    { Bad_Opcode },
5293
    { Bad_Opcode },
5294
    { Bad_Opcode },
5295
    { Bad_Opcode },
5296
    { Bad_Opcode },
5297
    { Bad_Opcode },
5298
    { Bad_Opcode },
5299
    /* 80 */
5300
    { Bad_Opcode },
5301
    { Bad_Opcode },
5302
    { Bad_Opcode },
5303
    { Bad_Opcode },
5304
    { Bad_Opcode },
5305
    { Bad_Opcode },
5306
    { Bad_Opcode },
5307
    { Bad_Opcode },
5308
    /* 88 */
5309
    { Bad_Opcode },
5310
    { Bad_Opcode },
5311
    { Bad_Opcode },
5312
    { Bad_Opcode },
5313
    { Bad_Opcode },
5314
    { Bad_Opcode },
5315
    { Bad_Opcode },
5316
    { Bad_Opcode },
5317
    /* 90 */
5318
    { Bad_Opcode },
5319
    { Bad_Opcode },
5320
    { Bad_Opcode },
5321
    { Bad_Opcode },
5322
    { Bad_Opcode },
5323
    { Bad_Opcode },
5324
    { Bad_Opcode },
5325
    { Bad_Opcode },
5326
    /* 98 */
5327
    { Bad_Opcode },
5328
    { Bad_Opcode },
5329
    { Bad_Opcode },
5330
    { Bad_Opcode },
5331
    { Bad_Opcode },
5332
    { Bad_Opcode },
5333
    { Bad_Opcode },
5334
    { Bad_Opcode },
5335
    /* a0 */
5336
    { Bad_Opcode },
5337
    { Bad_Opcode },
5338
    { Bad_Opcode },
5339
    { Bad_Opcode },
5340
    { Bad_Opcode },
5341
    { Bad_Opcode },
5342
    { Bad_Opcode },
5343
    { Bad_Opcode },
5344
    /* a8 */
5345
    { Bad_Opcode },
5346
    { Bad_Opcode },
5347
    { Bad_Opcode },
5348
    { Bad_Opcode },
5349
    { Bad_Opcode },
5350
    { Bad_Opcode },
5351
    { Bad_Opcode },
5352
    { Bad_Opcode },
5353
    /* b0 */
5354
    { Bad_Opcode },
5355
    { Bad_Opcode },
5356
    { Bad_Opcode },
5357
    { Bad_Opcode },
5358
    { Bad_Opcode },
5359
    { Bad_Opcode },
5360
    { Bad_Opcode },
5361
    { Bad_Opcode },
5362
    /* b8 */
5363
    { Bad_Opcode },
5364
    { Bad_Opcode },
5365
    { Bad_Opcode },
5366
    { Bad_Opcode },
5367
    { Bad_Opcode },
5368
    { Bad_Opcode },
5369
    { Bad_Opcode },
5370
    { Bad_Opcode },
5371
    /* c0 */
5372
    { Bad_Opcode },
5373
    { Bad_Opcode },
5374
    { Bad_Opcode },
5375
    { Bad_Opcode },
5376
    { Bad_Opcode },
5377
    { Bad_Opcode },
5378
    { Bad_Opcode },
5379
    { Bad_Opcode },
5380
    /* c8 */
5381
    { Bad_Opcode },
5382
    { Bad_Opcode },
5383
    { Bad_Opcode },
5384
    { Bad_Opcode },
5385
    { "sha1rnds4", { XM, EXxmm, Ib }, PREFIX_OPCODE },
5386
    { Bad_Opcode },
5387
    { "gf2p8affineqb", { XM, EXxmm, Ib }, PREFIX_DATA },
5388
    { "gf2p8affineinvqb", { XM, EXxmm, Ib }, PREFIX_DATA },
5389
    /* d0 */
5390
    { Bad_Opcode },
5391
    { Bad_Opcode },
5392
    { Bad_Opcode },
5393
    { Bad_Opcode },
5394
    { Bad_Opcode },
5395
    { Bad_Opcode },
5396
    { Bad_Opcode },
5397
    { Bad_Opcode },
5398
    /* d8 */
5399
    { Bad_Opcode },
5400
    { Bad_Opcode },
5401
    { Bad_Opcode },
5402
    { Bad_Opcode },
5403
    { Bad_Opcode },
5404
    { Bad_Opcode },
5405
    { Bad_Opcode },
5406
    { "aeskeygenassist", { XM, EXx, Ib }, PREFIX_DATA },
5407
    /* e0 */
5408
    { Bad_Opcode },
5409
    { Bad_Opcode },
5410
    { Bad_Opcode },
5411
    { Bad_Opcode },
5412
    { Bad_Opcode },
5413
    { Bad_Opcode },
5414
    { Bad_Opcode },
5415
    { Bad_Opcode },
5416
    /* e8 */
5417
    { Bad_Opcode },
5418
    { Bad_Opcode },
5419
    { Bad_Opcode },
5420
    { Bad_Opcode },
5421
    { Bad_Opcode },
5422
    { Bad_Opcode },
5423
    { Bad_Opcode },
5424
    { Bad_Opcode },
5425
    /* f0 */
5426
    { PREFIX_TABLE (PREFIX_0F3A0F) },
5427
    { Bad_Opcode },
5428
    { Bad_Opcode },
5429
    { Bad_Opcode },
5430
    { Bad_Opcode },
5431
    { Bad_Opcode },
5432
    { Bad_Opcode },
5433
    { Bad_Opcode },
5434
    /* f8 */
5435
    { Bad_Opcode },
5436
    { Bad_Opcode },
5437
    { Bad_Opcode },
5438
    { Bad_Opcode },
5439
    { Bad_Opcode },
5440
    { Bad_Opcode },
5441
    { Bad_Opcode },
5442
    { Bad_Opcode },
5443
  },
5444
};
5445
5446
static const struct dis386 xop_table[][256] = {
5447
  /* XOP_08 */
5448
  {
5449
    /* 00 */
5450
    { Bad_Opcode },
5451
    { Bad_Opcode },
5452
    { Bad_Opcode },
5453
    { Bad_Opcode },
5454
    { Bad_Opcode },
5455
    { Bad_Opcode },
5456
    { Bad_Opcode },
5457
    { Bad_Opcode },
5458
    /* 08 */
5459
    { Bad_Opcode },
5460
    { Bad_Opcode },
5461
    { Bad_Opcode },
5462
    { Bad_Opcode },
5463
    { Bad_Opcode },
5464
    { Bad_Opcode },
5465
    { Bad_Opcode },
5466
    { Bad_Opcode },
5467
    /* 10 */
5468
    { Bad_Opcode },
5469
    { Bad_Opcode },
5470
    { Bad_Opcode },
5471
    { Bad_Opcode },
5472
    { Bad_Opcode },
5473
    { Bad_Opcode },
5474
    { Bad_Opcode },
5475
    { Bad_Opcode },
5476
    /* 18 */
5477
    { Bad_Opcode },
5478
    { Bad_Opcode },
5479
    { Bad_Opcode },
5480
    { Bad_Opcode },
5481
    { Bad_Opcode },
5482
    { Bad_Opcode },
5483
    { Bad_Opcode },
5484
    { Bad_Opcode },
5485
    /* 20 */
5486
    { Bad_Opcode },
5487
    { Bad_Opcode },
5488
    { Bad_Opcode },
5489
    { Bad_Opcode },
5490
    { Bad_Opcode },
5491
    { Bad_Opcode },
5492
    { Bad_Opcode },
5493
    { Bad_Opcode },
5494
    /* 28 */
5495
    { Bad_Opcode },
5496
    { Bad_Opcode },
5497
    { Bad_Opcode },
5498
    { Bad_Opcode },
5499
    { Bad_Opcode },
5500
    { Bad_Opcode },
5501
    { Bad_Opcode },
5502
    { Bad_Opcode },
5503
    /* 30 */
5504
    { Bad_Opcode },
5505
    { Bad_Opcode },
5506
    { Bad_Opcode },
5507
    { Bad_Opcode },
5508
    { Bad_Opcode },
5509
    { Bad_Opcode },
5510
    { Bad_Opcode },
5511
    { Bad_Opcode },
5512
    /* 38 */
5513
    { Bad_Opcode },
5514
    { Bad_Opcode },
5515
    { Bad_Opcode },
5516
    { Bad_Opcode },
5517
    { Bad_Opcode },
5518
    { Bad_Opcode },
5519
    { Bad_Opcode },
5520
    { Bad_Opcode },
5521
    /* 40 */
5522
    { Bad_Opcode },
5523
    { Bad_Opcode },
5524
    { Bad_Opcode },
5525
    { Bad_Opcode },
5526
    { Bad_Opcode },
5527
    { Bad_Opcode },
5528
    { Bad_Opcode },
5529
    { Bad_Opcode },
5530
    /* 48 */
5531
    { Bad_Opcode },
5532
    { Bad_Opcode },
5533
    { Bad_Opcode },
5534
    { Bad_Opcode },
5535
    { Bad_Opcode },
5536
    { Bad_Opcode },
5537
    { Bad_Opcode },
5538
    { Bad_Opcode },
5539
    /* 50 */
5540
    { Bad_Opcode },
5541
    { Bad_Opcode },
5542
    { Bad_Opcode },
5543
    { Bad_Opcode },
5544
    { Bad_Opcode },
5545
    { Bad_Opcode },
5546
    { Bad_Opcode },
5547
    { Bad_Opcode },
5548
    /* 58 */
5549
    { Bad_Opcode },
5550
    { Bad_Opcode },
5551
    { Bad_Opcode },
5552
    { Bad_Opcode },
5553
    { Bad_Opcode },
5554
    { Bad_Opcode },
5555
    { Bad_Opcode },
5556
    { Bad_Opcode },
5557
    /* 60 */
5558
    { Bad_Opcode },
5559
    { Bad_Opcode },
5560
    { Bad_Opcode },
5561
    { Bad_Opcode },
5562
    { Bad_Opcode },
5563
    { Bad_Opcode },
5564
    { Bad_Opcode },
5565
    { Bad_Opcode },
5566
    /* 68 */
5567
    { Bad_Opcode },
5568
    { Bad_Opcode },
5569
    { Bad_Opcode },
5570
    { Bad_Opcode },
5571
    { Bad_Opcode },
5572
    { Bad_Opcode },
5573
    { Bad_Opcode },
5574
    { Bad_Opcode },
5575
    /* 70 */
5576
    { Bad_Opcode },
5577
    { Bad_Opcode },
5578
    { Bad_Opcode },
5579
    { Bad_Opcode },
5580
    { Bad_Opcode },
5581
    { Bad_Opcode },
5582
    { Bad_Opcode },
5583
    { Bad_Opcode },
5584
    /* 78 */
5585
    { Bad_Opcode },
5586
    { Bad_Opcode },
5587
    { Bad_Opcode },
5588
    { Bad_Opcode },
5589
    { Bad_Opcode },
5590
    { Bad_Opcode },
5591
    { Bad_Opcode },
5592
    { Bad_Opcode },
5593
    /* 80 */
5594
    { Bad_Opcode },
5595
    { Bad_Opcode },
5596
    { Bad_Opcode },
5597
    { Bad_Opcode },
5598
    { Bad_Opcode },
5599
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_85) },
5600
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_86) },
5601
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_87) },
5602
    /* 88 */
5603
    { Bad_Opcode },
5604
    { Bad_Opcode },
5605
    { Bad_Opcode },
5606
    { Bad_Opcode },
5607
    { Bad_Opcode },
5608
    { Bad_Opcode },
5609
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_8E) },
5610
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_8F) },
5611
    /* 90 */
5612
    { Bad_Opcode },
5613
    { Bad_Opcode },
5614
    { Bad_Opcode },
5615
    { Bad_Opcode },
5616
    { Bad_Opcode },
5617
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_95) },
5618
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_96) },
5619
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_97) },
5620
    /* 98 */
5621
    { Bad_Opcode },
5622
    { Bad_Opcode },
5623
    { Bad_Opcode },
5624
    { Bad_Opcode },
5625
    { Bad_Opcode },
5626
    { Bad_Opcode },
5627
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_9E) },
5628
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_9F) },
5629
    /* a0 */
5630
    { Bad_Opcode },
5631
    { Bad_Opcode },
5632
    { "vpcmov",   { XM, Vex, EXx, XMVexI4 }, 0 },
5633
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_A3) },
5634
    { Bad_Opcode },
5635
    { Bad_Opcode },
5636
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_A6) },
5637
    { Bad_Opcode },
5638
    /* a8 */
5639
    { Bad_Opcode },
5640
    { Bad_Opcode },
5641
    { Bad_Opcode },
5642
    { Bad_Opcode },
5643
    { Bad_Opcode },
5644
    { Bad_Opcode },
5645
    { Bad_Opcode },
5646
    { Bad_Opcode },
5647
    /* b0 */
5648
    { Bad_Opcode },
5649
    { Bad_Opcode },
5650
    { Bad_Opcode },
5651
    { Bad_Opcode },
5652
    { Bad_Opcode },
5653
    { Bad_Opcode },
5654
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_B6) },
5655
    { Bad_Opcode },
5656
    /* b8 */
5657
    { Bad_Opcode },
5658
    { Bad_Opcode },
5659
    { Bad_Opcode },
5660
    { Bad_Opcode },
5661
    { Bad_Opcode },
5662
    { Bad_Opcode },
5663
    { Bad_Opcode },
5664
    { Bad_Opcode },
5665
    /* c0 */
5666
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_C0) },
5667
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_C1) },
5668
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_C2) },
5669
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_C3) },
5670
    { Bad_Opcode },
5671
    { Bad_Opcode },
5672
    { Bad_Opcode },
5673
    { Bad_Opcode },
5674
    /* c8 */
5675
    { Bad_Opcode },
5676
    { Bad_Opcode },
5677
    { Bad_Opcode },
5678
    { Bad_Opcode },
5679
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_CC) },
5680
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_CD) },
5681
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_CE) },
5682
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_CF) },
5683
    /* d0 */
5684
    { Bad_Opcode },
5685
    { Bad_Opcode },
5686
    { Bad_Opcode },
5687
    { Bad_Opcode },
5688
    { Bad_Opcode },
5689
    { Bad_Opcode },
5690
    { Bad_Opcode },
5691
    { Bad_Opcode },
5692
    /* d8 */
5693
    { Bad_Opcode },
5694
    { Bad_Opcode },
5695
    { Bad_Opcode },
5696
    { Bad_Opcode },
5697
    { Bad_Opcode },
5698
    { Bad_Opcode },
5699
    { Bad_Opcode },
5700
    { Bad_Opcode },
5701
    /* e0 */
5702
    { Bad_Opcode },
5703
    { Bad_Opcode },
5704
    { Bad_Opcode },
5705
    { Bad_Opcode },
5706
    { Bad_Opcode },
5707
    { Bad_Opcode },
5708
    { Bad_Opcode },
5709
    { Bad_Opcode },
5710
    /* e8 */
5711
    { Bad_Opcode },
5712
    { Bad_Opcode },
5713
    { Bad_Opcode },
5714
    { Bad_Opcode },
5715
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_EC) },
5716
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_ED) },
5717
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_EE) },
5718
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_EF) },
5719
    /* f0 */
5720
    { Bad_Opcode },
5721
    { Bad_Opcode },
5722
    { Bad_Opcode },
5723
    { Bad_Opcode },
5724
    { Bad_Opcode },
5725
    { Bad_Opcode },
5726
    { Bad_Opcode },
5727
    { Bad_Opcode },
5728
    /* f8 */
5729
    { Bad_Opcode },
5730
    { Bad_Opcode },
5731
    { Bad_Opcode },
5732
    { Bad_Opcode },
5733
    { Bad_Opcode },
5734
    { Bad_Opcode },
5735
    { Bad_Opcode },
5736
    { Bad_Opcode },
5737
  },
5738
  /* XOP_09 */
5739
  {
5740
    /* 00 */
5741
    { Bad_Opcode },
5742
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_01) },
5743
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_02) },
5744
    { Bad_Opcode },
5745
    { Bad_Opcode },
5746
    { Bad_Opcode },
5747
    { Bad_Opcode },
5748
    { Bad_Opcode },
5749
    /* 08 */
5750
    { Bad_Opcode },
5751
    { Bad_Opcode },
5752
    { Bad_Opcode },
5753
    { Bad_Opcode },
5754
    { Bad_Opcode },
5755
    { Bad_Opcode },
5756
    { Bad_Opcode },
5757
    { Bad_Opcode },
5758
    /* 10 */
5759
    { Bad_Opcode },
5760
    { Bad_Opcode },
5761
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_12) },
5762
    { Bad_Opcode },
5763
    { Bad_Opcode },
5764
    { Bad_Opcode },
5765
    { Bad_Opcode },
5766
    { Bad_Opcode },
5767
    /* 18 */
5768
    { Bad_Opcode },
5769
    { Bad_Opcode },
5770
    { Bad_Opcode },
5771
    { Bad_Opcode },
5772
    { Bad_Opcode },
5773
    { Bad_Opcode },
5774
    { Bad_Opcode },
5775
    { Bad_Opcode },
5776
    /* 20 */
5777
    { Bad_Opcode },
5778
    { Bad_Opcode },
5779
    { Bad_Opcode },
5780
    { Bad_Opcode },
5781
    { Bad_Opcode },
5782
    { Bad_Opcode },
5783
    { Bad_Opcode },
5784
    { Bad_Opcode },
5785
    /* 28 */
5786
    { Bad_Opcode },
5787
    { Bad_Opcode },
5788
    { Bad_Opcode },
5789
    { Bad_Opcode },
5790
    { Bad_Opcode },
5791
    { Bad_Opcode },
5792
    { Bad_Opcode },
5793
    { Bad_Opcode },
5794
    /* 30 */
5795
    { Bad_Opcode },
5796
    { Bad_Opcode },
5797
    { Bad_Opcode },
5798
    { Bad_Opcode },
5799
    { Bad_Opcode },
5800
    { Bad_Opcode },
5801
    { Bad_Opcode },
5802
    { Bad_Opcode },
5803
    /* 38 */
5804
    { Bad_Opcode },
5805
    { Bad_Opcode },
5806
    { Bad_Opcode },
5807
    { Bad_Opcode },
5808
    { Bad_Opcode },
5809
    { Bad_Opcode },
5810
    { Bad_Opcode },
5811
    { Bad_Opcode },
5812
    /* 40 */
5813
    { Bad_Opcode },
5814
    { Bad_Opcode },
5815
    { Bad_Opcode },
5816
    { Bad_Opcode },
5817
    { Bad_Opcode },
5818
    { Bad_Opcode },
5819
    { Bad_Opcode },
5820
    { Bad_Opcode },
5821
    /* 48 */
5822
    { Bad_Opcode },
5823
    { Bad_Opcode },
5824
    { Bad_Opcode },
5825
    { Bad_Opcode },
5826
    { Bad_Opcode },
5827
    { Bad_Opcode },
5828
    { Bad_Opcode },
5829
    { Bad_Opcode },
5830
    /* 50 */
5831
    { Bad_Opcode },
5832
    { Bad_Opcode },
5833
    { Bad_Opcode },
5834
    { Bad_Opcode },
5835
    { Bad_Opcode },
5836
    { Bad_Opcode },
5837
    { Bad_Opcode },
5838
    { Bad_Opcode },
5839
    /* 58 */
5840
    { Bad_Opcode },
5841
    { Bad_Opcode },
5842
    { Bad_Opcode },
5843
    { Bad_Opcode },
5844
    { Bad_Opcode },
5845
    { Bad_Opcode },
5846
    { Bad_Opcode },
5847
    { Bad_Opcode },
5848
    /* 60 */
5849
    { Bad_Opcode },
5850
    { Bad_Opcode },
5851
    { Bad_Opcode },
5852
    { Bad_Opcode },
5853
    { Bad_Opcode },
5854
    { Bad_Opcode },
5855
    { Bad_Opcode },
5856
    { Bad_Opcode },
5857
    /* 68 */
5858
    { Bad_Opcode },
5859
    { Bad_Opcode },
5860
    { Bad_Opcode },
5861
    { Bad_Opcode },
5862
    { Bad_Opcode },
5863
    { Bad_Opcode },
5864
    { Bad_Opcode },
5865
    { Bad_Opcode },
5866
    /* 70 */
5867
    { Bad_Opcode },
5868
    { Bad_Opcode },
5869
    { Bad_Opcode },
5870
    { Bad_Opcode },
5871
    { Bad_Opcode },
5872
    { Bad_Opcode },
5873
    { Bad_Opcode },
5874
    { Bad_Opcode },
5875
    /* 78 */
5876
    { Bad_Opcode },
5877
    { Bad_Opcode },
5878
    { Bad_Opcode },
5879
    { Bad_Opcode },
5880
    { Bad_Opcode },
5881
    { Bad_Opcode },
5882
    { Bad_Opcode },
5883
    { Bad_Opcode },
5884
    /* 80 */
5885
    { VEX_W_TABLE (VEX_W_XOP_09_80) },
5886
    { VEX_W_TABLE (VEX_W_XOP_09_81) },
5887
    { VEX_W_TABLE (VEX_W_XOP_09_82) },
5888
    { VEX_W_TABLE (VEX_W_XOP_09_83) },
5889
    { Bad_Opcode },
5890
    { Bad_Opcode },
5891
    { Bad_Opcode },
5892
    { Bad_Opcode },
5893
    /* 88 */
5894
    { Bad_Opcode },
5895
    { Bad_Opcode },
5896
    { Bad_Opcode },
5897
    { Bad_Opcode },
5898
    { Bad_Opcode },
5899
    { Bad_Opcode },
5900
    { Bad_Opcode },
5901
    { Bad_Opcode },
5902
    /* 90 */
5903
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_90) },
5904
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_91) },
5905
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_92) },
5906
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_93) },
5907
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_94) },
5908
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_95) },
5909
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_96) },
5910
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_97) },
5911
    /* 98 */
5912
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_98) },
5913
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_99) },
5914
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_9A) },
5915
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_9B) },
5916
    { Bad_Opcode },
5917
    { Bad_Opcode },
5918
    { Bad_Opcode },
5919
    { Bad_Opcode },
5920
    /* a0 */
5921
    { Bad_Opcode },
5922
    { Bad_Opcode },
5923
    { Bad_Opcode },
5924
    { Bad_Opcode },
5925
    { Bad_Opcode },
5926
    { Bad_Opcode },
5927
    { Bad_Opcode },
5928
    { Bad_Opcode },
5929
    /* a8 */
5930
    { Bad_Opcode },
5931
    { Bad_Opcode },
5932
    { Bad_Opcode },
5933
    { Bad_Opcode },
5934
    { Bad_Opcode },
5935
    { Bad_Opcode },
5936
    { Bad_Opcode },
5937
    { Bad_Opcode },
5938
    /* b0 */
5939
    { Bad_Opcode },
5940
    { Bad_Opcode },
5941
    { Bad_Opcode },
5942
    { Bad_Opcode },
5943
    { Bad_Opcode },
5944
    { Bad_Opcode },
5945
    { Bad_Opcode },
5946
    { Bad_Opcode },
5947
    /* b8 */
5948
    { Bad_Opcode },
5949
    { Bad_Opcode },
5950
    { Bad_Opcode },
5951
    { Bad_Opcode },
5952
    { Bad_Opcode },
5953
    { Bad_Opcode },
5954
    { Bad_Opcode },
5955
    { Bad_Opcode },
5956
    /* c0 */
5957
    { Bad_Opcode },
5958
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_C1) },
5959
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_C2) },
5960
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_C3) },
5961
    { Bad_Opcode },
5962
    { Bad_Opcode },
5963
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_C6) },
5964
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_C7) },
5965
    /* c8 */
5966
    { Bad_Opcode },
5967
    { Bad_Opcode },
5968
    { Bad_Opcode },
5969
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_CB) },
5970
    { Bad_Opcode },
5971
    { Bad_Opcode },
5972
    { Bad_Opcode },
5973
    { Bad_Opcode },
5974
    /* d0 */
5975
    { Bad_Opcode },
5976
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_D1) },
5977
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_D2) },
5978
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_D3) },
5979
    { Bad_Opcode },
5980
    { Bad_Opcode },
5981
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_D6) },
5982
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_D7) },
5983
    /* d8 */
5984
    { Bad_Opcode },
5985
    { Bad_Opcode },
5986
    { Bad_Opcode },
5987
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_DB) },
5988
    { Bad_Opcode },
5989
    { Bad_Opcode },
5990
    { Bad_Opcode },
5991
    { Bad_Opcode },
5992
    /* e0 */
5993
    { Bad_Opcode },
5994
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_E1) },
5995
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_E2) },
5996
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_E3) },
5997
    { Bad_Opcode },
5998
    { Bad_Opcode },
5999
    { Bad_Opcode },
6000
    { Bad_Opcode },
6001
    /* e8 */
6002
    { Bad_Opcode },
6003
    { Bad_Opcode },
6004
    { Bad_Opcode },
6005
    { Bad_Opcode },
6006
    { Bad_Opcode },
6007
    { Bad_Opcode },
6008
    { Bad_Opcode },
6009
    { Bad_Opcode },
6010
    /* f0 */
6011
    { Bad_Opcode },
6012
    { Bad_Opcode },
6013
    { Bad_Opcode },
6014
    { Bad_Opcode },
6015
    { Bad_Opcode },
6016
    { Bad_Opcode },
6017
    { Bad_Opcode },
6018
    { Bad_Opcode },
6019
    /* f8 */
6020
    { Bad_Opcode },
6021
    { Bad_Opcode },
6022
    { Bad_Opcode },
6023
    { Bad_Opcode },
6024
    { Bad_Opcode },
6025
    { Bad_Opcode },
6026
    { Bad_Opcode },
6027
    { Bad_Opcode },
6028
  },
6029
  /* XOP_0A */
6030
  {
6031
    /* 00 */
6032
    { Bad_Opcode },
6033
    { Bad_Opcode },
6034
    { Bad_Opcode },
6035
    { Bad_Opcode },
6036
    { Bad_Opcode },
6037
    { Bad_Opcode },
6038
    { Bad_Opcode },
6039
    { Bad_Opcode },
6040
    /* 08 */
6041
    { Bad_Opcode },
6042
    { Bad_Opcode },
6043
    { Bad_Opcode },
6044
    { Bad_Opcode },
6045
    { Bad_Opcode },
6046
    { Bad_Opcode },
6047
    { Bad_Opcode },
6048
    { Bad_Opcode },
6049
    /* 10 */
6050
    { "bextrS", { Gdq, Edq, Id }, 0 },
6051
    { Bad_Opcode },
6052
    { VEX_LEN_TABLE (VEX_LEN_XOP_0A_12) },
6053
    { Bad_Opcode },
6054
    { Bad_Opcode },
6055
    { Bad_Opcode },
6056
    { Bad_Opcode },
6057
    { Bad_Opcode },
6058
    /* 18 */
6059
    { Bad_Opcode },
6060
    { Bad_Opcode },
6061
    { Bad_Opcode },
6062
    { Bad_Opcode },
6063
    { Bad_Opcode },
6064
    { Bad_Opcode },
6065
    { Bad_Opcode },
6066
    { Bad_Opcode },
6067
    /* 20 */
6068
    { Bad_Opcode },
6069
    { Bad_Opcode },
6070
    { Bad_Opcode },
6071
    { Bad_Opcode },
6072
    { Bad_Opcode },
6073
    { Bad_Opcode },
6074
    { Bad_Opcode },
6075
    { Bad_Opcode },
6076
    /* 28 */
6077
    { Bad_Opcode },
6078
    { Bad_Opcode },
6079
    { Bad_Opcode },
6080
    { Bad_Opcode },
6081
    { Bad_Opcode },
6082
    { Bad_Opcode },
6083
    { Bad_Opcode },
6084
    { Bad_Opcode },
6085
    /* 30 */
6086
    { Bad_Opcode },
6087
    { Bad_Opcode },
6088
    { Bad_Opcode },
6089
    { Bad_Opcode },
6090
    { Bad_Opcode },
6091
    { Bad_Opcode },
6092
    { Bad_Opcode },
6093
    { Bad_Opcode },
6094
    /* 38 */
6095
    { Bad_Opcode },
6096
    { Bad_Opcode },
6097
    { Bad_Opcode },
6098
    { Bad_Opcode },
6099
    { Bad_Opcode },
6100
    { Bad_Opcode },
6101
    { Bad_Opcode },
6102
    { Bad_Opcode },
6103
    /* 40 */
6104
    { Bad_Opcode },
6105
    { Bad_Opcode },
6106
    { Bad_Opcode },
6107
    { Bad_Opcode },
6108
    { Bad_Opcode },
6109
    { Bad_Opcode },
6110
    { Bad_Opcode },
6111
    { Bad_Opcode },
6112
    /* 48 */
6113
    { Bad_Opcode },
6114
    { Bad_Opcode },
6115
    { Bad_Opcode },
6116
    { Bad_Opcode },
6117
    { Bad_Opcode },
6118
    { Bad_Opcode },
6119
    { Bad_Opcode },
6120
    { Bad_Opcode },
6121
    /* 50 */
6122
    { Bad_Opcode },
6123
    { Bad_Opcode },
6124
    { Bad_Opcode },
6125
    { Bad_Opcode },
6126
    { Bad_Opcode },
6127
    { Bad_Opcode },
6128
    { Bad_Opcode },
6129
    { Bad_Opcode },
6130
    /* 58 */
6131
    { Bad_Opcode },
6132
    { Bad_Opcode },
6133
    { Bad_Opcode },
6134
    { Bad_Opcode },
6135
    { Bad_Opcode },
6136
    { Bad_Opcode },
6137
    { Bad_Opcode },
6138
    { Bad_Opcode },
6139
    /* 60 */
6140
    { Bad_Opcode },
6141
    { Bad_Opcode },
6142
    { Bad_Opcode },
6143
    { Bad_Opcode },
6144
    { Bad_Opcode },
6145
    { Bad_Opcode },
6146
    { Bad_Opcode },
6147
    { Bad_Opcode },
6148
    /* 68 */
6149
    { Bad_Opcode },
6150
    { Bad_Opcode },
6151
    { Bad_Opcode },
6152
    { Bad_Opcode },
6153
    { Bad_Opcode },
6154
    { Bad_Opcode },
6155
    { Bad_Opcode },
6156
    { Bad_Opcode },
6157
    /* 70 */
6158
    { Bad_Opcode },
6159
    { Bad_Opcode },
6160
    { Bad_Opcode },
6161
    { Bad_Opcode },
6162
    { Bad_Opcode },
6163
    { Bad_Opcode },
6164
    { Bad_Opcode },
6165
    { Bad_Opcode },
6166
    /* 78 */
6167
    { Bad_Opcode },
6168
    { Bad_Opcode },
6169
    { Bad_Opcode },
6170
    { Bad_Opcode },
6171
    { Bad_Opcode },
6172
    { Bad_Opcode },
6173
    { Bad_Opcode },
6174
    { Bad_Opcode },
6175
    /* 80 */
6176
    { Bad_Opcode },
6177
    { Bad_Opcode },
6178
    { Bad_Opcode },
6179
    { Bad_Opcode },
6180
    { Bad_Opcode },
6181
    { Bad_Opcode },
6182
    { Bad_Opcode },
6183
    { Bad_Opcode },
6184
    /* 88 */
6185
    { Bad_Opcode },
6186
    { Bad_Opcode },
6187
    { Bad_Opcode },
6188
    { Bad_Opcode },
6189
    { Bad_Opcode },
6190
    { Bad_Opcode },
6191
    { Bad_Opcode },
6192
    { Bad_Opcode },
6193
    /* 90 */
6194
    { Bad_Opcode },
6195
    { Bad_Opcode },
6196
    { Bad_Opcode },
6197
    { Bad_Opcode },
6198
    { Bad_Opcode },
6199
    { Bad_Opcode },
6200
    { Bad_Opcode },
6201
    { Bad_Opcode },
6202
    /* 98 */
6203
    { Bad_Opcode },
6204
    { Bad_Opcode },
6205
    { Bad_Opcode },
6206
    { Bad_Opcode },
6207
    { Bad_Opcode },
6208
    { Bad_Opcode },
6209
    { Bad_Opcode },
6210
    { Bad_Opcode },
6211
    /* a0 */
6212
    { Bad_Opcode },
6213
    { Bad_Opcode },
6214
    { Bad_Opcode },
6215
    { Bad_Opcode },
6216
    { Bad_Opcode },
6217
    { Bad_Opcode },
6218
    { Bad_Opcode },
6219
    { Bad_Opcode },
6220
    /* a8 */
6221
    { Bad_Opcode },
6222
    { Bad_Opcode },
6223
    { Bad_Opcode },
6224
    { Bad_Opcode },
6225
    { Bad_Opcode },
6226
    { Bad_Opcode },
6227
    { Bad_Opcode },
6228
    { Bad_Opcode },
6229
    /* b0 */
6230
    { Bad_Opcode },
6231
    { Bad_Opcode },
6232
    { Bad_Opcode },
6233
    { Bad_Opcode },
6234
    { Bad_Opcode },
6235
    { Bad_Opcode },
6236
    { Bad_Opcode },
6237
    { Bad_Opcode },
6238
    /* b8 */
6239
    { Bad_Opcode },
6240
    { Bad_Opcode },
6241
    { Bad_Opcode },
6242
    { Bad_Opcode },
6243
    { Bad_Opcode },
6244
    { Bad_Opcode },
6245
    { Bad_Opcode },
6246
    { Bad_Opcode },
6247
    /* c0 */
6248
    { Bad_Opcode },
6249
    { Bad_Opcode },
6250
    { Bad_Opcode },
6251
    { Bad_Opcode },
6252
    { Bad_Opcode },
6253
    { Bad_Opcode },
6254
    { Bad_Opcode },
6255
    { Bad_Opcode },
6256
    /* c8 */
6257
    { Bad_Opcode },
6258
    { Bad_Opcode },
6259
    { Bad_Opcode },
6260
    { Bad_Opcode },
6261
    { Bad_Opcode },
6262
    { Bad_Opcode },
6263
    { Bad_Opcode },
6264
    { Bad_Opcode },
6265
    /* d0 */
6266
    { Bad_Opcode },
6267
    { Bad_Opcode },
6268
    { Bad_Opcode },
6269
    { Bad_Opcode },
6270
    { Bad_Opcode },
6271
    { Bad_Opcode },
6272
    { Bad_Opcode },
6273
    { Bad_Opcode },
6274
    /* d8 */
6275
    { Bad_Opcode },
6276
    { Bad_Opcode },
6277
    { Bad_Opcode },
6278
    { Bad_Opcode },
6279
    { Bad_Opcode },
6280
    { Bad_Opcode },
6281
    { Bad_Opcode },
6282
    { Bad_Opcode },
6283
    /* e0 */
6284
    { Bad_Opcode },
6285
    { Bad_Opcode },
6286
    { Bad_Opcode },
6287
    { Bad_Opcode },
6288
    { Bad_Opcode },
6289
    { Bad_Opcode },
6290
    { Bad_Opcode },
6291
    { Bad_Opcode },
6292
    /* e8 */
6293
    { Bad_Opcode },
6294
    { Bad_Opcode },
6295
    { Bad_Opcode },
6296
    { Bad_Opcode },
6297
    { Bad_Opcode },
6298
    { Bad_Opcode },
6299
    { Bad_Opcode },
6300
    { Bad_Opcode },
6301
    /* f0 */
6302
    { Bad_Opcode },
6303
    { Bad_Opcode },
6304
    { Bad_Opcode },
6305
    { Bad_Opcode },
6306
    { Bad_Opcode },
6307
    { Bad_Opcode },
6308
    { Bad_Opcode },
6309
    { Bad_Opcode },
6310
    /* f8 */
6311
    { Bad_Opcode },
6312
    { Bad_Opcode },
6313
    { Bad_Opcode },
6314
    { Bad_Opcode },
6315
    { Bad_Opcode },
6316
    { Bad_Opcode },
6317
    { Bad_Opcode },
6318
    { Bad_Opcode },
6319
  },
6320
};
6321
6322
static const struct dis386 vex_table[][256] = {
6323
  /* VEX_0F */
6324
  {
6325
    /* 00 */
6326
    { Bad_Opcode },
6327
    { Bad_Opcode },
6328
    { Bad_Opcode },
6329
    { Bad_Opcode },
6330
    { Bad_Opcode },
6331
    { Bad_Opcode },
6332
    { Bad_Opcode },
6333
    { Bad_Opcode },
6334
    /* 08 */
6335
    { Bad_Opcode },
6336
    { Bad_Opcode },
6337
    { Bad_Opcode },
6338
    { Bad_Opcode },
6339
    { Bad_Opcode },
6340
    { Bad_Opcode },
6341
    { Bad_Opcode },
6342
    { Bad_Opcode },
6343
    /* 10 */
6344
    { PREFIX_TABLE (PREFIX_0F10) },
6345
    { PREFIX_TABLE (PREFIX_0F11) },
6346
    { PREFIX_TABLE (PREFIX_VEX_0F12) },
6347
    { VEX_LEN_TABLE (VEX_LEN_0F13) },
6348
    { "vunpcklpX",  { XM, Vex, EXx }, PREFIX_OPCODE },
6349
    { "vunpckhpX",  { XM, Vex, EXx }, PREFIX_OPCODE },
6350
    { PREFIX_TABLE (PREFIX_VEX_0F16) },
6351
    { VEX_LEN_TABLE (VEX_LEN_0F17) },
6352
    /* 18 */
6353
    { Bad_Opcode },
6354
    { Bad_Opcode },
6355
    { Bad_Opcode },
6356
    { Bad_Opcode },
6357
    { Bad_Opcode },
6358
    { Bad_Opcode },
6359
    { Bad_Opcode },
6360
    { Bad_Opcode },
6361
    /* 20 */
6362
    { Bad_Opcode },
6363
    { Bad_Opcode },
6364
    { Bad_Opcode },
6365
    { Bad_Opcode },
6366
    { Bad_Opcode },
6367
    { Bad_Opcode },
6368
    { Bad_Opcode },
6369
    { Bad_Opcode },
6370
    /* 28 */
6371
    { "vmovapX",  { XM, EXx }, PREFIX_OPCODE },
6372
    { "vmovapX",  { EXxS, XM }, PREFIX_OPCODE },
6373
    { PREFIX_TABLE (PREFIX_VEX_0F2A) },
6374
    { "vmovntpX", { Mx, XM }, PREFIX_OPCODE },
6375
    { PREFIX_TABLE (PREFIX_VEX_0F2C) },
6376
    { PREFIX_TABLE (PREFIX_VEX_0F2D) },
6377
    { PREFIX_TABLE (PREFIX_0F2E) },
6378
    { PREFIX_TABLE (PREFIX_0F2F) },
6379
    /* 30 */
6380
    { Bad_Opcode },
6381
    { Bad_Opcode },
6382
    { Bad_Opcode },
6383
    { Bad_Opcode },
6384
    { Bad_Opcode },
6385
    { Bad_Opcode },
6386
    { Bad_Opcode },
6387
    { Bad_Opcode },
6388
    /* 38 */
6389
    { Bad_Opcode },
6390
    { Bad_Opcode },
6391
    { Bad_Opcode },
6392
    { Bad_Opcode },
6393
    { Bad_Opcode },
6394
    { Bad_Opcode },
6395
    { Bad_Opcode },
6396
    { Bad_Opcode },
6397
    /* 40 */
6398
    { Bad_Opcode },
6399
    { VEX_LEN_TABLE (VEX_LEN_0F41) },
6400
    { VEX_LEN_TABLE (VEX_LEN_0F42) },
6401
    { Bad_Opcode },
6402
    { VEX_LEN_TABLE (VEX_LEN_0F44) },
6403
    { VEX_LEN_TABLE (VEX_LEN_0F45) },
6404
    { VEX_LEN_TABLE (VEX_LEN_0F46) },
6405
    { VEX_LEN_TABLE (VEX_LEN_0F47) },
6406
    /* 48 */
6407
    { Bad_Opcode },
6408
    { Bad_Opcode },
6409
    { VEX_LEN_TABLE (VEX_LEN_0F4A) },
6410
    { VEX_LEN_TABLE (VEX_LEN_0F4B) },
6411
    { Bad_Opcode },
6412
    { Bad_Opcode },
6413
    { Bad_Opcode },
6414
    { Bad_Opcode },
6415
    /* 50 */
6416
    { "vmovmskpX",  { Gdq, Ux }, PREFIX_OPCODE },
6417
    { PREFIX_TABLE (PREFIX_0F51) },
6418
    { PREFIX_TABLE (PREFIX_0F52) },
6419
    { PREFIX_TABLE (PREFIX_0F53) },
6420
    { "vandpX",   { XM, Vex, EXx }, PREFIX_OPCODE },
6421
    { "vandnpX",  { XM, Vex, EXx }, PREFIX_OPCODE },
6422
    { "vorpX",    { XM, Vex, EXx }, PREFIX_OPCODE },
6423
    { "vxorpX",   { XM, Vex, EXx }, PREFIX_OPCODE },
6424
    /* 58 */
6425
    { PREFIX_TABLE (PREFIX_0F58) },
6426
    { PREFIX_TABLE (PREFIX_0F59) },
6427
    { PREFIX_TABLE (PREFIX_0F5A) },
6428
    { PREFIX_TABLE (PREFIX_0F5B) },
6429
    { PREFIX_TABLE (PREFIX_0F5C) },
6430
    { PREFIX_TABLE (PREFIX_0F5D) },
6431
    { PREFIX_TABLE (PREFIX_0F5E) },
6432
    { PREFIX_TABLE (PREFIX_0F5F) },
6433
    /* 60 */
6434
    { "vpunpcklbw", { XM, Vex, EXx }, PREFIX_DATA },
6435
    { "vpunpcklwd", { XM, Vex, EXx }, PREFIX_DATA },
6436
    { "vpunpckldq", { XM, Vex, EXx }, PREFIX_DATA },
6437
    { "vpacksswb",  { XM, Vex, EXx }, PREFIX_DATA },
6438
    { "vpcmpgtb", { XM, Vex, EXx }, PREFIX_DATA },
6439
    { "vpcmpgtw", { XM, Vex, EXx }, PREFIX_DATA },
6440
    { "vpcmpgtd", { XM, Vex, EXx }, PREFIX_DATA },
6441
    { "vpackuswb",  { XM, Vex, EXx }, PREFIX_DATA },
6442
    /* 68 */
6443
    { "vpunpckhbw", { XM, Vex, EXx }, PREFIX_DATA },
6444
    { "vpunpckhwd", { XM, Vex, EXx }, PREFIX_DATA },
6445
    { "vpunpckhdq", { XM, Vex, EXx }, PREFIX_DATA },
6446
    { "vpackssdw",  { XM, Vex, EXx }, PREFIX_DATA },
6447
    { "vpunpcklqdq",  { XM, Vex, EXx }, PREFIX_DATA },
6448
    { "vpunpckhqdq",  { XM, Vex, EXx }, PREFIX_DATA },
6449
    { VEX_LEN_TABLE (VEX_LEN_0F6E) },
6450
    { PREFIX_TABLE (PREFIX_VEX_0F6F) },
6451
    /* 70 */
6452
    { PREFIX_TABLE (PREFIX_VEX_0F70) },
6453
    { REG_TABLE (REG_VEX_0F71) },
6454
    { REG_TABLE (REG_VEX_0F72) },
6455
    { REG_TABLE (REG_VEX_0F73) },
6456
    { "vpcmpeqb", { XM, Vex, EXx }, PREFIX_DATA },
6457
    { "vpcmpeqw", { XM, Vex, EXx }, PREFIX_DATA },
6458
    { "vpcmpeqd", { XM, Vex, EXx }, PREFIX_DATA },
6459
    { VEX_LEN_TABLE (VEX_LEN_0F77) },
6460
    /* 78 */
6461
    { Bad_Opcode },
6462
    { Bad_Opcode },
6463
    { Bad_Opcode },
6464
    { Bad_Opcode },
6465
    { PREFIX_TABLE (PREFIX_0F7C) },
6466
    { PREFIX_TABLE (PREFIX_0F7D) },
6467
    { PREFIX_TABLE (PREFIX_VEX_0F7E) },
6468
    { PREFIX_TABLE (PREFIX_VEX_0F7F) },
6469
    /* 80 */
6470
    { Bad_Opcode },
6471
    { Bad_Opcode },
6472
    { Bad_Opcode },
6473
    { Bad_Opcode },
6474
    { Bad_Opcode },
6475
    { Bad_Opcode },
6476
    { Bad_Opcode },
6477
    { Bad_Opcode },
6478
    /* 88 */
6479
    { Bad_Opcode },
6480
    { Bad_Opcode },
6481
    { Bad_Opcode },
6482
    { Bad_Opcode },
6483
    { Bad_Opcode },
6484
    { Bad_Opcode },
6485
    { Bad_Opcode },
6486
    { Bad_Opcode },
6487
    /* 90 */
6488
    { VEX_LEN_TABLE (VEX_LEN_0F90) },
6489
    { VEX_LEN_TABLE (VEX_LEN_0F91) },
6490
    { VEX_LEN_TABLE (VEX_LEN_0F92) },
6491
    { VEX_LEN_TABLE (VEX_LEN_0F93) },
6492
    { Bad_Opcode },
6493
    { Bad_Opcode },
6494
    { Bad_Opcode },
6495
    { Bad_Opcode },
6496
    /* 98 */
6497
    { VEX_LEN_TABLE (VEX_LEN_0F98) },
6498
    { VEX_LEN_TABLE (VEX_LEN_0F99) },
6499
    { Bad_Opcode },
6500
    { Bad_Opcode },
6501
    { Bad_Opcode },
6502
    { Bad_Opcode },
6503
    { Bad_Opcode },
6504
    { Bad_Opcode },
6505
    /* a0 */
6506
    { Bad_Opcode },
6507
    { Bad_Opcode },
6508
    { Bad_Opcode },
6509
    { Bad_Opcode },
6510
    { Bad_Opcode },
6511
    { Bad_Opcode },
6512
    { Bad_Opcode },
6513
    { Bad_Opcode },
6514
    /* a8 */
6515
    { Bad_Opcode },
6516
    { Bad_Opcode },
6517
    { Bad_Opcode },
6518
    { Bad_Opcode },
6519
    { Bad_Opcode },
6520
    { Bad_Opcode },
6521
    { REG_TABLE (REG_VEX_0FAE) },
6522
    { Bad_Opcode },
6523
    /* b0 */
6524
    { Bad_Opcode },
6525
    { Bad_Opcode },
6526
    { Bad_Opcode },
6527
    { Bad_Opcode },
6528
    { Bad_Opcode },
6529
    { Bad_Opcode },
6530
    { Bad_Opcode },
6531
    { Bad_Opcode },
6532
    /* b8 */
6533
    { Bad_Opcode },
6534
    { Bad_Opcode },
6535
    { Bad_Opcode },
6536
    { Bad_Opcode },
6537
    { Bad_Opcode },
6538
    { Bad_Opcode },
6539
    { Bad_Opcode },
6540
    { Bad_Opcode },
6541
    /* c0 */
6542
    { Bad_Opcode },
6543
    { Bad_Opcode },
6544
    { PREFIX_TABLE (PREFIX_0FC2) },
6545
    { Bad_Opcode },
6546
    { VEX_LEN_TABLE (VEX_LEN_0FC4) },
6547
    { "vpextrw",  { Gd, Uxmm, Ib }, PREFIX_DATA },
6548
    { "vshufpX",  { XM, Vex, EXx, Ib }, PREFIX_OPCODE },
6549
    { Bad_Opcode },
6550
    /* c8 */
6551
    { Bad_Opcode },
6552
    { Bad_Opcode },
6553
    { Bad_Opcode },
6554
    { Bad_Opcode },
6555
    { Bad_Opcode },
6556
    { Bad_Opcode },
6557
    { Bad_Opcode },
6558
    { Bad_Opcode },
6559
    /* d0 */
6560
    { PREFIX_TABLE (PREFIX_0FD0) },
6561
    { "vpsrlw",   { XM, Vex, EXxmm }, PREFIX_DATA },
6562
    { "vpsrld",   { XM, Vex, EXxmm }, PREFIX_DATA },
6563
    { "vpsrlq",   { XM, Vex, EXxmm }, PREFIX_DATA },
6564
    { "vpaddq",   { XM, Vex, EXx }, PREFIX_DATA },
6565
    { "vpmullw",  { XM, Vex, EXx }, PREFIX_DATA },
6566
    { VEX_LEN_TABLE (VEX_LEN_0FD6) },
6567
    { "vpmovmskb",  { Gdq, Ux }, PREFIX_DATA },
6568
    /* d8 */
6569
    { "vpsubusb", { XM, Vex, EXx }, PREFIX_DATA },
6570
    { "vpsubusw", { XM, Vex, EXx }, PREFIX_DATA },
6571
    { "vpminub",  { XM, Vex, EXx }, PREFIX_DATA },
6572
    { "vpand",    { XM, Vex, EXx }, PREFIX_DATA },
6573
    { "vpaddusb", { XM, Vex, EXx }, PREFIX_DATA },
6574
    { "vpaddusw", { XM, Vex, EXx }, PREFIX_DATA },
6575
    { "vpmaxub",  { XM, Vex, EXx }, PREFIX_DATA },
6576
    { "vpandn",   { XM, Vex, EXx }, PREFIX_DATA },
6577
    /* e0 */
6578
    { "vpavgb",   { XM, Vex, EXx }, PREFIX_DATA },
6579
    { "vpsraw",   { XM, Vex, EXxmm }, PREFIX_DATA },
6580
    { "vpsrad",   { XM, Vex, EXxmm }, PREFIX_DATA },
6581
    { "vpavgw",   { XM, Vex, EXx }, PREFIX_DATA },
6582
    { "vpmulhuw", { XM, Vex, EXx }, PREFIX_DATA },
6583
    { "vpmulhw",  { XM, Vex, EXx }, PREFIX_DATA },
6584
    { PREFIX_TABLE (PREFIX_0FE6) },
6585
    { "vmovntdq", { Mx, XM }, PREFIX_DATA },
6586
    /* e8 */
6587
    { "vpsubsb",  { XM, Vex, EXx }, PREFIX_DATA },
6588
    { "vpsubsw",  { XM, Vex, EXx }, PREFIX_DATA },
6589
    { "vpminsw",  { XM, Vex, EXx }, PREFIX_DATA },
6590
    { "vpor",   { XM, Vex, EXx }, PREFIX_DATA },
6591
    { "vpaddsb",  { XM, Vex, EXx }, PREFIX_DATA },
6592
    { "vpaddsw",  { XM, Vex, EXx }, PREFIX_DATA },
6593
    { "vpmaxsw",  { XM, Vex, EXx }, PREFIX_DATA },
6594
    { "vpxor",    { XM, Vex, EXx }, PREFIX_DATA },
6595
    /* f0 */
6596
    { PREFIX_TABLE (PREFIX_0FF0) },
6597
    { "vpsllw",   { XM, Vex, EXxmm }, PREFIX_DATA },
6598
    { "vpslld",   { XM, Vex, EXxmm }, PREFIX_DATA },
6599
    { "vpsllq",   { XM, Vex, EXxmm }, PREFIX_DATA },
6600
    { "vpmuludq", { XM, Vex, EXx }, PREFIX_DATA },
6601
    { "vpmaddwd", { XM, Vex, EXx }, PREFIX_DATA },
6602
    { "vpsadbw",  { XM, Vex, EXx }, PREFIX_DATA },
6603
    { "vmaskmovdqu",  { XM, Uxmm }, PREFIX_DATA },
6604
    /* f8 */
6605
    { "vpsubb",   { XM, Vex, EXx }, PREFIX_DATA },
6606
    { "vpsubw",   { XM, Vex, EXx }, PREFIX_DATA },
6607
    { "vpsubd",   { XM, Vex, EXx }, PREFIX_DATA },
6608
    { "vpsubq",   { XM, Vex, EXx }, PREFIX_DATA },
6609
    { "vpaddb",   { XM, Vex, EXx }, PREFIX_DATA },
6610
    { "vpaddw",   { XM, Vex, EXx }, PREFIX_DATA },
6611
    { "vpaddd",   { XM, Vex, EXx }, PREFIX_DATA },
6612
    { Bad_Opcode },
6613
  },
6614
  /* VEX_0F38 */
6615
  {
6616
    /* 00 */
6617
    { "vpshufb",  { XM, Vex, EXx }, PREFIX_DATA },
6618
    { "vphaddw",  { XM, Vex, EXx }, PREFIX_DATA },
6619
    { "vphaddd",  { XM, Vex, EXx }, PREFIX_DATA },
6620
    { "vphaddsw", { XM, Vex, EXx }, PREFIX_DATA },
6621
    { "vpmaddubsw", { XM, Vex, EXx }, PREFIX_DATA },
6622
    { "vphsubw",  { XM, Vex, EXx }, PREFIX_DATA },
6623
    { "vphsubd",  { XM, Vex, EXx }, PREFIX_DATA },
6624
    { "vphsubsw", { XM, Vex, EXx }, PREFIX_DATA },
6625
    /* 08 */
6626
    { "vpsignb",  { XM, Vex, EXx }, PREFIX_DATA },
6627
    { "vpsignw",  { XM, Vex, EXx }, PREFIX_DATA },
6628
    { "vpsignd",  { XM, Vex, EXx }, PREFIX_DATA },
6629
    { "vpmulhrsw",  { XM, Vex, EXx }, PREFIX_DATA },
6630
    { VEX_W_TABLE (VEX_W_0F380C) },
6631
    { VEX_W_TABLE (VEX_W_0F380D) },
6632
    { VEX_W_TABLE (VEX_W_0F380E) },
6633
    { VEX_W_TABLE (VEX_W_0F380F) },
6634
    /* 10 */
6635
    { Bad_Opcode },
6636
    { Bad_Opcode },
6637
    { Bad_Opcode },
6638
    { VEX_W_TABLE (VEX_W_0F3813) },
6639
    { Bad_Opcode },
6640
    { Bad_Opcode },
6641
    { VEX_LEN_TABLE (VEX_LEN_0F3816) },
6642
    { "vptest",   { XM, EXx }, PREFIX_DATA },
6643
    /* 18 */
6644
    { VEX_W_TABLE (VEX_W_0F3818) },
6645
    { VEX_LEN_TABLE (VEX_LEN_0F3819) },
6646
    { VEX_LEN_TABLE (VEX_LEN_0F381A) },
6647
    { Bad_Opcode },
6648
    { "vpabsb",   { XM, EXx }, PREFIX_DATA },
6649
    { "vpabsw",   { XM, EXx }, PREFIX_DATA },
6650
    { "vpabsd",   { XM, EXx }, PREFIX_DATA },
6651
    { Bad_Opcode },
6652
    /* 20 */
6653
    { "vpmovsxbw",  { XM, EXxmmq }, PREFIX_DATA },
6654
    { "vpmovsxbd",  { XM, EXxmmqd }, PREFIX_DATA },
6655
    { "vpmovsxbq",  { XM, EXxmmdw }, PREFIX_DATA },
6656
    { "vpmovsxwd",  { XM, EXxmmq }, PREFIX_DATA },
6657
    { "vpmovsxwq",  { XM, EXxmmqd }, PREFIX_DATA },
6658
    { "vpmovsxdq",  { XM, EXxmmq }, PREFIX_DATA },
6659
    { Bad_Opcode },
6660
    { Bad_Opcode },
6661
    /* 28 */
6662
    { "vpmuldq",  { XM, Vex, EXx }, PREFIX_DATA },
6663
    { "vpcmpeqq", { XM, Vex, EXx }, PREFIX_DATA },
6664
    { "vmovntdqa",  { XM, Mx }, PREFIX_DATA },
6665
    { "vpackusdw",  { XM, Vex, EXx }, PREFIX_DATA },
6666
    { VEX_W_TABLE (VEX_W_0F382C) },
6667
    { VEX_W_TABLE (VEX_W_0F382D) },
6668
    { VEX_W_TABLE (VEX_W_0F382E) },
6669
    { VEX_W_TABLE (VEX_W_0F382F) },
6670
    /* 30 */
6671
    { "vpmovzxbw",  { XM, EXxmmq }, PREFIX_DATA },
6672
    { "vpmovzxbd",  { XM, EXxmmqd }, PREFIX_DATA },
6673
    { "vpmovzxbq",  { XM, EXxmmdw }, PREFIX_DATA },
6674
    { "vpmovzxwd",  { XM, EXxmmq }, PREFIX_DATA },
6675
    { "vpmovzxwq",  { XM, EXxmmqd }, PREFIX_DATA },
6676
    { "vpmovzxdq",  { XM, EXxmmq }, PREFIX_DATA },
6677
    { VEX_LEN_TABLE (VEX_LEN_0F3836) },
6678
    { "vpcmpgtq", { XM, Vex, EXx }, PREFIX_DATA },
6679
    /* 38 */
6680
    { "vpminsb",  { XM, Vex, EXx }, PREFIX_DATA },
6681
    { "vpminsd",  { XM, Vex, EXx }, PREFIX_DATA },
6682
    { "vpminuw",  { XM, Vex, EXx }, PREFIX_DATA },
6683
    { "vpminud",  { XM, Vex, EXx }, PREFIX_DATA },
6684
    { "vpmaxsb",  { XM, Vex, EXx }, PREFIX_DATA },
6685
    { "vpmaxsd",  { XM, Vex, EXx }, PREFIX_DATA },
6686
    { "vpmaxuw",  { XM, Vex, EXx }, PREFIX_DATA },
6687
    { "vpmaxud",  { XM, Vex, EXx }, PREFIX_DATA },
6688
    /* 40 */
6689
    { "vpmulld",  { XM, Vex, EXx }, PREFIX_DATA },
6690
    { VEX_LEN_TABLE (VEX_LEN_0F3841) },
6691
    { Bad_Opcode },
6692
    { Bad_Opcode },
6693
    { Bad_Opcode },
6694
    { "vpsrlv%DQ", { XM, Vex, EXx }, PREFIX_DATA },
6695
    { VEX_W_TABLE (VEX_W_0F3846) },
6696
    { "vpsllv%DQ", { XM, Vex, EXx }, PREFIX_DATA },
6697
    /* 48 */
6698
    { X86_64_TABLE (X86_64_VEX_0F3848) },
6699
    { X86_64_TABLE (X86_64_VEX_0F3849) },
6700
    { X86_64_TABLE (X86_64_VEX_0F384A) },
6701
    { X86_64_TABLE (X86_64_VEX_0F384B) },
6702
    { Bad_Opcode },
6703
    { Bad_Opcode },
6704
    { Bad_Opcode },
6705
    { Bad_Opcode },
6706
    /* 50 */
6707
    { VEX_W_TABLE (VEX_W_0F3850) },
6708
    { VEX_W_TABLE (VEX_W_0F3851) },
6709
    { VEX_W_TABLE (VEX_W_0F3852) },
6710
    { VEX_W_TABLE (VEX_W_0F3853) },
6711
    { Bad_Opcode },
6712
    { Bad_Opcode },
6713
    { Bad_Opcode },
6714
    { Bad_Opcode },
6715
    /* 58 */
6716
    { VEX_W_TABLE (VEX_W_0F3858) },
6717
    { VEX_W_TABLE (VEX_W_0F3859) },
6718
    { VEX_LEN_TABLE (VEX_LEN_0F385A) },
6719
    { Bad_Opcode },
6720
    { X86_64_TABLE (X86_64_VEX_0F385C) },
6721
    { Bad_Opcode },
6722
    { X86_64_TABLE (X86_64_VEX_0F385E) },
6723
    { X86_64_TABLE (X86_64_VEX_0F385F) },
6724
    /* 60 */
6725
    { Bad_Opcode },
6726
    { Bad_Opcode },
6727
    { Bad_Opcode },
6728
    { Bad_Opcode },
6729
    { Bad_Opcode },
6730
    { Bad_Opcode },
6731
    { Bad_Opcode },
6732
    { Bad_Opcode },
6733
    /* 68 */
6734
    { Bad_Opcode },
6735
    { Bad_Opcode },
6736
    { Bad_Opcode },
6737
    { X86_64_TABLE (X86_64_VEX_0F386B) },
6738
    { X86_64_TABLE (X86_64_VEX_0F386C) },
6739
    { Bad_Opcode },
6740
    { X86_64_TABLE (X86_64_VEX_0F386E) },
6741
    { X86_64_TABLE (X86_64_VEX_0F386F) },
6742
    /* 70 */
6743
    { Bad_Opcode },
6744
    { Bad_Opcode },
6745
    { PREFIX_TABLE (PREFIX_VEX_0F3872) },
6746
    { Bad_Opcode },
6747
    { Bad_Opcode },
6748
    { Bad_Opcode },
6749
    { Bad_Opcode },
6750
    { Bad_Opcode },
6751
    /* 78 */
6752
    { VEX_W_TABLE (VEX_W_0F3878) },
6753
    { VEX_W_TABLE (VEX_W_0F3879) },
6754
    { Bad_Opcode },
6755
    { Bad_Opcode },
6756
    { Bad_Opcode },
6757
    { Bad_Opcode },
6758
    { Bad_Opcode },
6759
    { Bad_Opcode },
6760
    /* 80 */
6761
    { Bad_Opcode },
6762
    { Bad_Opcode },
6763
    { Bad_Opcode },
6764
    { Bad_Opcode },
6765
    { Bad_Opcode },
6766
    { Bad_Opcode },
6767
    { Bad_Opcode },
6768
    { Bad_Opcode },
6769
    /* 88 */
6770
    { Bad_Opcode },
6771
    { Bad_Opcode },
6772
    { Bad_Opcode },
6773
    { Bad_Opcode },
6774
    { "vpmaskmov%DQ", { XM, Vex, Mx }, PREFIX_DATA },
6775
    { Bad_Opcode },
6776
    { "vpmaskmov%DQ", { Mx, Vex, XM }, PREFIX_DATA },
6777
    { Bad_Opcode },
6778
    /* 90 */
6779
    { "vpgatherd%DQ", { XM, MVexVSIBDWpX, VexGatherD }, PREFIX_DATA },
6780
    { "vpgatherq%DQ", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, PREFIX_DATA },
6781
    { "vgatherdp%XW", { XM, MVexVSIBDWpX, VexGatherD }, PREFIX_DATA },
6782
    { "vgatherqp%XW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, PREFIX_DATA },
6783
    { Bad_Opcode },
6784
    { Bad_Opcode },
6785
    { "vfmaddsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6786
    { "vfmsubadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6787
    /* 98 */
6788
    { "vfmadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6789
    { "vfmadd132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6790
    { "vfmsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6791
    { "vfmsub132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6792
    { "vfnmadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6793
    { "vfnmadd132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6794
    { "vfnmsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6795
    { "vfnmsub132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6796
    /* a0 */
6797
    { Bad_Opcode },
6798
    { Bad_Opcode },
6799
    { Bad_Opcode },
6800
    { Bad_Opcode },
6801
    { Bad_Opcode },
6802
    { Bad_Opcode },
6803
    { "vfmaddsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6804
    { "vfmsubadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6805
    /* a8 */
6806
    { "vfmadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6807
    { "vfmadd213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6808
    { "vfmsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6809
    { "vfmsub213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6810
    { "vfnmadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6811
    { "vfnmadd213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6812
    { "vfnmsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6813
    { "vfnmsub213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6814
    /* b0 */
6815
    { VEX_W_TABLE (VEX_W_0F38B0) },
6816
    { VEX_W_TABLE (VEX_W_0F38B1) },
6817
    { Bad_Opcode },
6818
    { Bad_Opcode },
6819
    { VEX_W_TABLE (VEX_W_0F38B4) },
6820
    { VEX_W_TABLE (VEX_W_0F38B5) },
6821
    { "vfmaddsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6822
    { "vfmsubadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6823
    /* b8 */
6824
    { "vfmadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6825
    { "vfmadd231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6826
    { "vfmsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6827
    { "vfmsub231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6828
    { "vfnmadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6829
    { "vfnmadd231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6830
    { "vfnmsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6831
    { "vfnmsub231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6832
    /* c0 */
6833
    { Bad_Opcode },
6834
    { Bad_Opcode },
6835
    { Bad_Opcode },
6836
    { Bad_Opcode },
6837
    { Bad_Opcode },
6838
    { Bad_Opcode },
6839
    { Bad_Opcode },
6840
    { Bad_Opcode },
6841
    /* c8 */
6842
    { Bad_Opcode },
6843
    { Bad_Opcode },
6844
    { Bad_Opcode },
6845
    { PREFIX_TABLE (PREFIX_VEX_0F38CB) },
6846
    { PREFIX_TABLE (PREFIX_VEX_0F38CC) },
6847
    { PREFIX_TABLE (PREFIX_VEX_0F38CD) },
6848
    { Bad_Opcode },
6849
    { VEX_W_TABLE (VEX_W_0F38CF) },
6850
    /* d0 */
6851
    { Bad_Opcode },
6852
    { Bad_Opcode },
6853
    { VEX_W_TABLE (VEX_W_0F38D2) },
6854
    { VEX_W_TABLE (VEX_W_0F38D3) },
6855
    { Bad_Opcode },
6856
    { Bad_Opcode },
6857
    { Bad_Opcode },
6858
    { Bad_Opcode },
6859
    /* d8 */
6860
    { Bad_Opcode },
6861
    { Bad_Opcode },
6862
    { VEX_W_TABLE (VEX_W_0F38DA) },
6863
    { VEX_LEN_TABLE (VEX_LEN_0F38DB) },
6864
    { "vaesenc",  { XM, Vex, EXx }, PREFIX_DATA },
6865
    { "vaesenclast",  { XM, Vex, EXx }, PREFIX_DATA },
6866
    { "vaesdec",  { XM, Vex, EXx }, PREFIX_DATA },
6867
    { "vaesdeclast",  { XM, Vex, EXx }, PREFIX_DATA },
6868
    /* e0 */
6869
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6870
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
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
    /* e8 */
6878
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6879
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6880
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6881
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6882
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6883
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6884
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6885
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6886
    /* f0 */
6887
    { Bad_Opcode },
6888
    { Bad_Opcode },
6889
    { VEX_LEN_TABLE (VEX_LEN_0F38F2) },
6890
    { VEX_LEN_TABLE (VEX_LEN_0F38F3) },
6891
    { Bad_Opcode },
6892
    { VEX_LEN_TABLE (VEX_LEN_0F38F5) },
6893
    { VEX_LEN_TABLE (VEX_LEN_0F38F6) },
6894
    { VEX_LEN_TABLE (VEX_LEN_0F38F7) },
6895
    /* f8 */
6896
    { Bad_Opcode },
6897
    { Bad_Opcode },
6898
    { Bad_Opcode },
6899
    { Bad_Opcode },
6900
    { Bad_Opcode },
6901
    { Bad_Opcode },
6902
    { Bad_Opcode },
6903
    { Bad_Opcode },
6904
  },
6905
  /* VEX_0F3A */
6906
  {
6907
    /* 00 */
6908
    { VEX_LEN_TABLE (VEX_LEN_0F3A00) },
6909
    { VEX_LEN_TABLE (VEX_LEN_0F3A01) },
6910
    { VEX_W_TABLE (VEX_W_0F3A02) },
6911
    { Bad_Opcode },
6912
    { VEX_W_TABLE (VEX_W_0F3A04) },
6913
    { VEX_W_TABLE (VEX_W_0F3A05) },
6914
    { VEX_LEN_TABLE (VEX_LEN_0F3A06) },
6915
    { Bad_Opcode },
6916
    /* 08 */
6917
    { "vroundps", { XM, EXx, Ib }, PREFIX_DATA },
6918
    { "vroundpd", { XM, EXx, Ib }, PREFIX_DATA },
6919
    { "vroundss", { XMScalar, VexScalar, EXd, Ib }, PREFIX_DATA },
6920
    { "vroundsd", { XMScalar, VexScalar, EXq, Ib }, PREFIX_DATA },
6921
    { "vblendps", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6922
    { "vblendpd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6923
    { "vpblendw", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6924
    { "vpalignr", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6925
    /* 10 */
6926
    { Bad_Opcode },
6927
    { Bad_Opcode },
6928
    { Bad_Opcode },
6929
    { Bad_Opcode },
6930
    { VEX_LEN_TABLE (VEX_LEN_0F3A14) },
6931
    { VEX_LEN_TABLE (VEX_LEN_0F3A15) },
6932
    { VEX_LEN_TABLE (VEX_LEN_0F3A16) },
6933
    { VEX_LEN_TABLE (VEX_LEN_0F3A17) },
6934
    /* 18 */
6935
    { VEX_LEN_TABLE (VEX_LEN_0F3A18) },
6936
    { VEX_LEN_TABLE (VEX_LEN_0F3A19) },
6937
    { Bad_Opcode },
6938
    { Bad_Opcode },
6939
    { Bad_Opcode },
6940
    { VEX_W_TABLE (VEX_W_0F3A1D) },
6941
    { Bad_Opcode },
6942
    { Bad_Opcode },
6943
    /* 20 */
6944
    { VEX_LEN_TABLE (VEX_LEN_0F3A20) },
6945
    { VEX_LEN_TABLE (VEX_LEN_0F3A21) },
6946
    { VEX_LEN_TABLE (VEX_LEN_0F3A22) },
6947
    { Bad_Opcode },
6948
    { Bad_Opcode },
6949
    { Bad_Opcode },
6950
    { Bad_Opcode },
6951
    { Bad_Opcode },
6952
    /* 28 */
6953
    { Bad_Opcode },
6954
    { Bad_Opcode },
6955
    { Bad_Opcode },
6956
    { Bad_Opcode },
6957
    { Bad_Opcode },
6958
    { Bad_Opcode },
6959
    { Bad_Opcode },
6960
    { Bad_Opcode },
6961
    /* 30 */
6962
    { VEX_LEN_TABLE (VEX_LEN_0F3A30) },
6963
    { VEX_LEN_TABLE (VEX_LEN_0F3A31) },
6964
    { VEX_LEN_TABLE (VEX_LEN_0F3A32) },
6965
    { VEX_LEN_TABLE (VEX_LEN_0F3A33) },
6966
    { Bad_Opcode },
6967
    { Bad_Opcode },
6968
    { Bad_Opcode },
6969
    { Bad_Opcode },
6970
    /* 38 */
6971
    { VEX_LEN_TABLE (VEX_LEN_0F3A38) },
6972
    { VEX_LEN_TABLE (VEX_LEN_0F3A39) },
6973
    { Bad_Opcode },
6974
    { Bad_Opcode },
6975
    { Bad_Opcode },
6976
    { Bad_Opcode },
6977
    { Bad_Opcode },
6978
    { Bad_Opcode },
6979
    /* 40 */
6980
    { "vdpps",    { XM, Vex, EXx, Ib }, PREFIX_DATA },
6981
    { VEX_LEN_TABLE (VEX_LEN_0F3A41) },
6982
    { "vmpsadbw", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6983
    { Bad_Opcode },
6984
    { "vpclmulqdq", { XM, Vex, EXx, PCLMUL }, PREFIX_DATA },
6985
    { Bad_Opcode },
6986
    { VEX_LEN_TABLE (VEX_LEN_0F3A46) },
6987
    { Bad_Opcode },
6988
    /* 48 */
6989
    { "vpermil2ps", { XM, Vex, EXx, XMVexI4, VexI4 }, PREFIX_DATA },
6990
    { "vpermil2pd", { XM, Vex, EXx, XMVexI4, VexI4 }, PREFIX_DATA },
6991
    { VEX_W_TABLE (VEX_W_0F3A4A) },
6992
    { VEX_W_TABLE (VEX_W_0F3A4B) },
6993
    { VEX_W_TABLE (VEX_W_0F3A4C) },
6994
    { Bad_Opcode },
6995
    { Bad_Opcode },
6996
    { Bad_Opcode },
6997
    /* 50 */
6998
    { Bad_Opcode },
6999
    { Bad_Opcode },
7000
    { Bad_Opcode },
7001
    { Bad_Opcode },
7002
    { Bad_Opcode },
7003
    { Bad_Opcode },
7004
    { Bad_Opcode },
7005
    { Bad_Opcode },
7006
    /* 58 */
7007
    { Bad_Opcode },
7008
    { Bad_Opcode },
7009
    { Bad_Opcode },
7010
    { Bad_Opcode },
7011
    { "vfmaddsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7012
    { "vfmaddsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7013
    { "vfmsubaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7014
    { "vfmsubaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7015
    /* 60 */
7016
    { VEX_LEN_TABLE (VEX_LEN_0F3A60) },
7017
    { VEX_LEN_TABLE (VEX_LEN_0F3A61) },
7018
    { VEX_LEN_TABLE (VEX_LEN_0F3A62) },
7019
    { VEX_LEN_TABLE (VEX_LEN_0F3A63) },
7020
    { Bad_Opcode },
7021
    { Bad_Opcode },
7022
    { Bad_Opcode },
7023
    { Bad_Opcode },
7024
    /* 68 */
7025
    { "vfmaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7026
    { "vfmaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7027
    { "vfmaddss", { XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA },
7028
    { "vfmaddsd", { XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA },
7029
    { "vfmsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7030
    { "vfmsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7031
    { "vfmsubss", { XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA },
7032
    { "vfmsubsd", { XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA },
7033
    /* 70 */
7034
    { Bad_Opcode },
7035
    { Bad_Opcode },
7036
    { Bad_Opcode },
7037
    { Bad_Opcode },
7038
    { Bad_Opcode },
7039
    { Bad_Opcode },
7040
    { Bad_Opcode },
7041
    { Bad_Opcode },
7042
    /* 78 */
7043
    { "vfnmaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7044
    { "vfnmaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7045
    { "vfnmaddss",  { XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA },
7046
    { "vfnmaddsd",  { XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA },
7047
    { "vfnmsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7048
    { "vfnmsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7049
    { "vfnmsubss",  { XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA },
7050
    { "vfnmsubsd",  { XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA },
7051
    /* 80 */
7052
    { Bad_Opcode },
7053
    { Bad_Opcode },
7054
    { Bad_Opcode },
7055
    { Bad_Opcode },
7056
    { Bad_Opcode },
7057
    { Bad_Opcode },
7058
    { Bad_Opcode },
7059
    { Bad_Opcode },
7060
    /* 88 */
7061
    { Bad_Opcode },
7062
    { Bad_Opcode },
7063
    { Bad_Opcode },
7064
    { Bad_Opcode },
7065
    { Bad_Opcode },
7066
    { Bad_Opcode },
7067
    { Bad_Opcode },
7068
    { Bad_Opcode },
7069
    /* 90 */
7070
    { Bad_Opcode },
7071
    { Bad_Opcode },
7072
    { Bad_Opcode },
7073
    { Bad_Opcode },
7074
    { Bad_Opcode },
7075
    { Bad_Opcode },
7076
    { Bad_Opcode },
7077
    { Bad_Opcode },
7078
    /* 98 */
7079
    { Bad_Opcode },
7080
    { Bad_Opcode },
7081
    { Bad_Opcode },
7082
    { Bad_Opcode },
7083
    { Bad_Opcode },
7084
    { Bad_Opcode },
7085
    { Bad_Opcode },
7086
    { Bad_Opcode },
7087
    /* a0 */
7088
    { Bad_Opcode },
7089
    { Bad_Opcode },
7090
    { Bad_Opcode },
7091
    { Bad_Opcode },
7092
    { Bad_Opcode },
7093
    { Bad_Opcode },
7094
    { Bad_Opcode },
7095
    { Bad_Opcode },
7096
    /* a8 */
7097
    { Bad_Opcode },
7098
    { Bad_Opcode },
7099
    { Bad_Opcode },
7100
    { Bad_Opcode },
7101
    { Bad_Opcode },
7102
    { Bad_Opcode },
7103
    { Bad_Opcode },
7104
    { Bad_Opcode },
7105
    /* b0 */
7106
    { Bad_Opcode },
7107
    { Bad_Opcode },
7108
    { Bad_Opcode },
7109
    { Bad_Opcode },
7110
    { Bad_Opcode },
7111
    { Bad_Opcode },
7112
    { Bad_Opcode },
7113
    { Bad_Opcode },
7114
    /* b8 */
7115
    { Bad_Opcode },
7116
    { Bad_Opcode },
7117
    { Bad_Opcode },
7118
    { Bad_Opcode },
7119
    { Bad_Opcode },
7120
    { Bad_Opcode },
7121
    { Bad_Opcode },
7122
    { Bad_Opcode },
7123
    /* c0 */
7124
    { Bad_Opcode },
7125
    { Bad_Opcode },
7126
    { Bad_Opcode },
7127
    { Bad_Opcode },
7128
    { Bad_Opcode },
7129
    { Bad_Opcode },
7130
    { Bad_Opcode },
7131
    { Bad_Opcode },
7132
    /* c8 */
7133
    { Bad_Opcode },
7134
    { Bad_Opcode },
7135
    { Bad_Opcode },
7136
    { Bad_Opcode },
7137
    { Bad_Opcode },
7138
    { Bad_Opcode },
7139
    { VEX_W_TABLE (VEX_W_0F3ACE) },
7140
    { VEX_W_TABLE (VEX_W_0F3ACF) },
7141
    /* d0 */
7142
    { Bad_Opcode },
7143
    { Bad_Opcode },
7144
    { Bad_Opcode },
7145
    { Bad_Opcode },
7146
    { Bad_Opcode },
7147
    { Bad_Opcode },
7148
    { Bad_Opcode },
7149
    { Bad_Opcode },
7150
    /* d8 */
7151
    { Bad_Opcode },
7152
    { Bad_Opcode },
7153
    { Bad_Opcode },
7154
    { Bad_Opcode },
7155
    { Bad_Opcode },
7156
    { Bad_Opcode },
7157
    { VEX_W_TABLE (VEX_W_0F3ADE) },
7158
    { VEX_LEN_TABLE (VEX_LEN_0F3ADF) },
7159
    /* e0 */
7160
    { Bad_Opcode },
7161
    { Bad_Opcode },
7162
    { Bad_Opcode },
7163
    { Bad_Opcode },
7164
    { Bad_Opcode },
7165
    { Bad_Opcode },
7166
    { Bad_Opcode },
7167
    { Bad_Opcode },
7168
    /* e8 */
7169
    { Bad_Opcode },
7170
    { Bad_Opcode },
7171
    { Bad_Opcode },
7172
    { Bad_Opcode },
7173
    { Bad_Opcode },
7174
    { Bad_Opcode },
7175
    { Bad_Opcode },
7176
    { Bad_Opcode },
7177
    /* f0 */
7178
    { VEX_LEN_TABLE (VEX_LEN_0F3AF0) },
7179
    { Bad_Opcode },
7180
    { Bad_Opcode },
7181
    { Bad_Opcode },
7182
    { Bad_Opcode },
7183
    { Bad_Opcode },
7184
    { Bad_Opcode },
7185
    { Bad_Opcode },
7186
    /* f8 */
7187
    { Bad_Opcode },
7188
    { Bad_Opcode },
7189
    { Bad_Opcode },
7190
    { Bad_Opcode },
7191
    { Bad_Opcode },
7192
    { Bad_Opcode },
7193
    { Bad_Opcode },
7194
    { Bad_Opcode },
7195
  },
7196
};
7197
7198
#include "i386-dis-evex.h"
7199
7200
static const struct dis386 vex_len_table[][2] = {
7201
  /* VEX_LEN_0F12_P_0 */
7202
  {
7203
    { MOD_TABLE (MOD_0F12_PREFIX_0) },
7204
  },
7205
7206
  /* VEX_LEN_0F12_P_2 */
7207
  {
7208
    { "%XEVmovlpYX",  { XM, Vex, Mq }, 0 },
7209
  },
7210
7211
  /* VEX_LEN_0F13 */
7212
  {
7213
    { "%XEVmovlpYX",  { Mq, XM }, PREFIX_OPCODE },
7214
  },
7215
7216
  /* VEX_LEN_0F16_P_0 */
7217
  {
7218
    { MOD_TABLE (MOD_0F16_PREFIX_0) },
7219
  },
7220
7221
  /* VEX_LEN_0F16_P_2 */
7222
  {
7223
    { "%XEVmovhpYX",  { XM, Vex, Mq }, 0 },
7224
  },
7225
7226
  /* VEX_LEN_0F17 */
7227
  {
7228
    { "%XEVmovhpYX",  { Mq, XM }, PREFIX_OPCODE },
7229
  },
7230
7231
  /* VEX_LEN_0F41 */
7232
  {
7233
    { Bad_Opcode },
7234
    { VEX_W_TABLE (VEX_W_0F41_L_1) },
7235
  },
7236
7237
  /* VEX_LEN_0F42 */
7238
  {
7239
    { Bad_Opcode },
7240
    { VEX_W_TABLE (VEX_W_0F42_L_1) },
7241
  },
7242
7243
  /* VEX_LEN_0F44 */
7244
  {
7245
    { VEX_W_TABLE (VEX_W_0F44_L_0) },
7246
  },
7247
7248
  /* VEX_LEN_0F45 */
7249
  {
7250
    { Bad_Opcode },
7251
    { VEX_W_TABLE (VEX_W_0F45_L_1) },
7252
  },
7253
7254
  /* VEX_LEN_0F46 */
7255
  {
7256
    { Bad_Opcode },
7257
    { VEX_W_TABLE (VEX_W_0F46_L_1) },
7258
  },
7259
7260
  /* VEX_LEN_0F47 */
7261
  {
7262
    { Bad_Opcode },
7263
    { VEX_W_TABLE (VEX_W_0F47_L_1) },
7264
  },
7265
7266
  /* VEX_LEN_0F4A */
7267
  {
7268
    { Bad_Opcode },
7269
    { VEX_W_TABLE (VEX_W_0F4A_L_1) },
7270
  },
7271
7272
  /* VEX_LEN_0F4B */
7273
  {
7274
    { Bad_Opcode },
7275
    { VEX_W_TABLE (VEX_W_0F4B_L_1) },
7276
  },
7277
7278
  /* VEX_LEN_0F6E */
7279
  {
7280
    { "%XEvmovYK",  { XMScalar, Edq }, PREFIX_DATA },
7281
  },
7282
7283
  /* VEX_LEN_0F77 */
7284
  {
7285
    { "vzeroupper", { XX }, 0 },
7286
    { "vzeroall", { XX }, 0 },
7287
  },
7288
7289
  /* VEX_LEN_0F7E_P_1 */
7290
  {
7291
    { "%XEvmovqY",  { XMScalar, EXq }, 0 },
7292
  },
7293
7294
  /* VEX_LEN_0F7E_P_2 */
7295
  {
7296
    { "%XEvmovK", { Edq, XMScalar }, 0 },
7297
  },
7298
7299
  /* VEX_LEN_0F90 */
7300
  {
7301
    { VEX_W_TABLE (VEX_W_0F90_L_0) },
7302
  },
7303
7304
  /* VEX_LEN_0F91 */
7305
  {
7306
    { VEX_W_TABLE (VEX_W_0F91_L_0) },
7307
  },
7308
7309
  /* VEX_LEN_0F92 */
7310
  {
7311
    { VEX_W_TABLE (VEX_W_0F92_L_0) },
7312
  },
7313
7314
  /* VEX_LEN_0F93 */
7315
  {
7316
    { VEX_W_TABLE (VEX_W_0F93_L_0) },
7317
  },
7318
7319
  /* VEX_LEN_0F98 */
7320
  {
7321
    { VEX_W_TABLE (VEX_W_0F98_L_0) },
7322
  },
7323
7324
  /* VEX_LEN_0F99 */
7325
  {
7326
    { VEX_W_TABLE (VEX_W_0F99_L_0) },
7327
  },
7328
7329
  /* VEX_LEN_0FAE_R_2 */
7330
  {
7331
    { "vldmxcsr", { Md }, 0 },
7332
  },
7333
7334
  /* VEX_LEN_0FAE_R_3 */
7335
  {
7336
    { "vstmxcsr", { Md }, 0 },
7337
  },
7338
7339
  /* VEX_LEN_0FC4 */
7340
  {
7341
    { "%XEvpinsrwY",  { XM, Vex, Edw, Ib }, PREFIX_DATA },
7342
  },
7343
7344
  /* VEX_LEN_0FD6 */
7345
  {
7346
    { "%XEvmovqY",  { EXqS, XMScalar }, PREFIX_DATA },
7347
  },
7348
7349
  /* VEX_LEN_0F3816 */
7350
  {
7351
    { Bad_Opcode },
7352
    { VEX_W_TABLE (VEX_W_0F3816_L_1) },
7353
  },
7354
7355
  /* VEX_LEN_0F3819 */
7356
  {
7357
    { Bad_Opcode },
7358
    { VEX_W_TABLE (VEX_W_0F3819_L_1) },
7359
  },
7360
7361
  /* VEX_LEN_0F381A */
7362
  {
7363
    { Bad_Opcode },
7364
    { VEX_W_TABLE (VEX_W_0F381A_L_1) },
7365
  },
7366
7367
  /* VEX_LEN_0F3836 */
7368
  {
7369
    { Bad_Opcode },
7370
    { VEX_W_TABLE (VEX_W_0F3836) },
7371
  },
7372
7373
  /* VEX_LEN_0F3841 */
7374
  {
7375
    { "vphminposuw",  { XM, EXx }, PREFIX_DATA },
7376
  },
7377
7378
  /* VEX_LEN_0F3848_X86_64 */
7379
  {
7380
    { VEX_W_TABLE (VEX_W_0F3848_X86_64_L_0) },
7381
  },
7382
7383
  /* VEX_LEN_0F3849_X86_64 */
7384
  {
7385
    { VEX_W_TABLE (VEX_W_0F3849_X86_64_L_0) },
7386
  },
7387
7388
  /* VEX_LEN_0F384A_X86_64_W_0 */
7389
  {
7390
    { PREFIX_TABLE (PREFIX_VEX_0F384A_X86_64_W_0_L_0) },
7391
  },
7392
7393
  /* VEX_LEN_0F384B_X86_64 */
7394
  {
7395
    { VEX_W_TABLE (VEX_W_0F384B_X86_64_L_0) },
7396
  },
7397
7398
  /* VEX_LEN_0F385A */
7399
  {
7400
    { Bad_Opcode },
7401
    { VEX_W_TABLE (VEX_W_0F385A_L_0) },
7402
  },
7403
7404
  /* VEX_LEN_0F385C_X86_64 */
7405
  {
7406
    { VEX_W_TABLE (VEX_W_0F385C_X86_64_L_0) },
7407
  },
7408
7409
  /* VEX_LEN_0F385E_X86_64 */
7410
  {
7411
    { VEX_W_TABLE (VEX_W_0F385E_X86_64_L_0) },
7412
  },
7413
7414
  /* VEX_LEN_0F385F_X86_64 */
7415
  {
7416
    { VEX_W_TABLE (VEX_W_0F385F_X86_64_L_0) },
7417
  },
7418
7419
  /* VEX_LEN_0F386B_X86_64 */
7420
  {
7421
    { VEX_W_TABLE (VEX_W_0F386B_X86_64_L_0) },
7422
  },
7423
7424
  /* VEX_LEN_0F386C_X86_64 */
7425
  {
7426
    { VEX_W_TABLE (VEX_W_0F386C_X86_64_L_0) },
7427
  },
7428
7429
  /* VEX_LEN_0F386E_X86_64 */
7430
  {
7431
    { VEX_W_TABLE (VEX_W_0F386E_X86_64_L_0) },
7432
  },
7433
7434
  /* VEX_LEN_0F386F_X86_64 */
7435
  {
7436
    { VEX_W_TABLE (VEX_W_0F386F_X86_64_L_0) },
7437
  },
7438
7439
  /* VEX_LEN_0F38CB_P_3_W_0 */
7440
  {
7441
    { Bad_Opcode },
7442
    { "vsha512rnds2", { XM, Vex, Rxmmq }, 0 },
7443
  },
7444
7445
  /* VEX_LEN_0F38CC_P_3_W_0 */
7446
  {
7447
    { Bad_Opcode },
7448
    { "vsha512msg1", { XM, Rxmmq }, 0 },
7449
  },
7450
7451
  /* VEX_LEN_0F38CD_P_3_W_0 */
7452
  {
7453
    { Bad_Opcode },
7454
    { "vsha512msg2", { XM, Rymm }, 0 },
7455
  },
7456
7457
  /* VEX_LEN_0F38DA_W_0_P_0 */
7458
  {
7459
    { "vsm3msg1", { XM, Vex, EXxmm }, 0 },
7460
  },
7461
7462
  /* VEX_LEN_0F38DA_W_0_P_2 */
7463
  {
7464
    { "vsm3msg2", { XM, Vex, EXxmm }, 0 },
7465
  },
7466
7467
  /* VEX_LEN_0F38DB */
7468
  {
7469
    { "vaesimc",  { XM, EXx }, PREFIX_DATA },
7470
  },
7471
7472
  /* VEX_LEN_0F38F2 */
7473
  {
7474
    { PREFIX_TABLE (PREFIX_VEX_0F38F2_L_0) },
7475
  },
7476
7477
  /* VEX_LEN_0F38F3 */
7478
  {
7479
    { PREFIX_TABLE (PREFIX_VEX_0F38F3_L_0) },
7480
  },
7481
7482
  /* VEX_LEN_0F38F5 */
7483
  {
7484
    { PREFIX_TABLE(PREFIX_VEX_0F38F5_L_0) },
7485
  },
7486
7487
  /* VEX_LEN_0F38F6 */
7488
  {
7489
    { PREFIX_TABLE(PREFIX_VEX_0F38F6_L_0) },
7490
  },
7491
7492
  /* VEX_LEN_0F38F7 */
7493
  {
7494
    { PREFIX_TABLE(PREFIX_VEX_0F38F7_L_0) },
7495
  },
7496
7497
  /* VEX_LEN_0F3A00 */
7498
  {
7499
    { Bad_Opcode },
7500
    { VEX_W_TABLE (VEX_W_0F3A00_L_1) },
7501
  },
7502
7503
  /* VEX_LEN_0F3A01 */
7504
  {
7505
    { Bad_Opcode },
7506
    { VEX_W_TABLE (VEX_W_0F3A01_L_1) },
7507
  },
7508
7509
  /* VEX_LEN_0F3A06 */
7510
  {
7511
    { Bad_Opcode },
7512
    { VEX_W_TABLE (VEX_W_0F3A06_L_1) },
7513
  },
7514
7515
  /* VEX_LEN_0F3A14 */
7516
  {
7517
    { "%XEvpextrb", { Edb, XM, Ib }, PREFIX_DATA },
7518
  },
7519
7520
  /* VEX_LEN_0F3A15 */
7521
  {
7522
    { "%XEvpextrw", { Edw, XM, Ib }, PREFIX_DATA },
7523
  },
7524
7525
  /* VEX_LEN_0F3A16  */
7526
  {
7527
    { "%XEvpextrK", { Edq, XM, Ib }, PREFIX_DATA },
7528
  },
7529
7530
  /* VEX_LEN_0F3A17 */
7531
  {
7532
    { "%XEvextractps",  { Ed, XM, Ib }, PREFIX_DATA },
7533
  },
7534
7535
  /* VEX_LEN_0F3A18 */
7536
  {
7537
    { Bad_Opcode },
7538
    { VEX_W_TABLE (VEX_W_0F3A18_L_1) },
7539
  },
7540
7541
  /* VEX_LEN_0F3A19 */
7542
  {
7543
    { Bad_Opcode },
7544
    { VEX_W_TABLE (VEX_W_0F3A19_L_1) },
7545
  },
7546
7547
  /* VEX_LEN_0F3A20 */
7548
  {
7549
    { "%XEvpinsrbY",  { XM, Vex, Edb, Ib }, PREFIX_DATA },
7550
  },
7551
7552
  /* VEX_LEN_0F3A21 */
7553
  {
7554
    { "%XEvinsertpsY",  { XM, Vex, EXd, Ib }, PREFIX_DATA },
7555
  },
7556
7557
  /* VEX_LEN_0F3A22 */
7558
  {
7559
    { "%XEvpinsrYK",  { XM, Vex, Edq, Ib }, PREFIX_DATA },
7560
  },
7561
7562
  /* VEX_LEN_0F3A30 */
7563
  {
7564
    { "kshiftr%BW", { MaskG, MaskR, Ib }, PREFIX_DATA },
7565
  },
7566
7567
  /* VEX_LEN_0F3A31 */
7568
  {
7569
    { "kshiftr%DQ", { MaskG, MaskR, Ib }, PREFIX_DATA },
7570
  },
7571
7572
  /* VEX_LEN_0F3A32 */
7573
  {
7574
    { "kshiftl%BW", { MaskG, MaskR, Ib }, PREFIX_DATA },
7575
  },
7576
7577
  /* VEX_LEN_0F3A33 */
7578
  {
7579
    { "kshiftl%DQ", { MaskG, MaskR, Ib }, PREFIX_DATA },
7580
  },
7581
7582
  /* VEX_LEN_0F3A38 */
7583
  {
7584
    { Bad_Opcode },
7585
    { VEX_W_TABLE (VEX_W_0F3A38_L_1) },
7586
  },
7587
7588
  /* VEX_LEN_0F3A39 */
7589
  {
7590
    { Bad_Opcode },
7591
    { VEX_W_TABLE (VEX_W_0F3A39_L_1) },
7592
  },
7593
7594
  /* VEX_LEN_0F3A41 */
7595
  {
7596
    { "vdppd",    { XM, Vex, EXx, Ib }, PREFIX_DATA },
7597
  },
7598
7599
  /* VEX_LEN_0F3A46 */
7600
  {
7601
    { Bad_Opcode },
7602
    { VEX_W_TABLE (VEX_W_0F3A46_L_1) },
7603
  },
7604
7605
  /* VEX_LEN_0F3A60 */
7606
  {
7607
    { "vpcmpestrm!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
7608
  },
7609
7610
  /* VEX_LEN_0F3A61 */
7611
  {
7612
    { "vpcmpestri!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
7613
  },
7614
7615
  /* VEX_LEN_0F3A62 */
7616
  {
7617
    { "vpcmpistrm", { XM, EXx, Ib }, PREFIX_DATA },
7618
  },
7619
7620
  /* VEX_LEN_0F3A63 */
7621
  {
7622
    { "vpcmpistri", { XM, EXx, Ib }, PREFIX_DATA },
7623
  },
7624
7625
  /* VEX_LEN_0F3ADE_W_0 */
7626
  {
7627
    { "vsm3rnds2", { XM, Vex, EXxmm, Ib }, PREFIX_DATA },
7628
  },
7629
7630
  /* VEX_LEN_0F3ADF */
7631
  {
7632
    { "vaeskeygenassist", { XM, EXx, Ib }, PREFIX_DATA },
7633
  },
7634
7635
  /* VEX_LEN_0F3AF0 */
7636
  {
7637
    { PREFIX_TABLE (PREFIX_VEX_0F3AF0_L_0) },
7638
  },
7639
7640
  /* VEX_LEN_MAP5_F8_X86_64 */
7641
  {
7642
    { VEX_W_TABLE (VEX_W_MAP5_F8_X86_64_L_0) },
7643
  },
7644
7645
  /* VEX_LEN_MAP5_F9_X86_64 */
7646
  {
7647
    { VEX_W_TABLE (VEX_W_MAP5_F9_X86_64_L_0) },
7648
  },
7649
7650
  /* VEX_LEN_MAP5_FD_X86_64 */
7651
  {
7652
    { VEX_W_TABLE (VEX_W_MAP5_FD_X86_64_L_0) },
7653
  },
7654
7655
  /* VEX_LEN_MAP7_F6 */
7656
  {
7657
    { VEX_W_TABLE (VEX_W_MAP7_F6_L_0) },
7658
  },
7659
7660
  /* VEX_LEN_MAP7_F8 */
7661
  {
7662
    { VEX_W_TABLE (VEX_W_MAP7_F8_L_0) },
7663
  },
7664
7665
  /* VEX_LEN_XOP_08_85 */
7666
  {
7667
    { VEX_W_TABLE (VEX_W_XOP_08_85_L_0) },
7668
  },
7669
7670
  /* VEX_LEN_XOP_08_86 */
7671
  {
7672
    { VEX_W_TABLE (VEX_W_XOP_08_86_L_0) },
7673
  },
7674
7675
  /* VEX_LEN_XOP_08_87 */
7676
  {
7677
    { VEX_W_TABLE (VEX_W_XOP_08_87_L_0) },
7678
  },
7679
7680
  /* VEX_LEN_XOP_08_8E */
7681
  {
7682
    { VEX_W_TABLE (VEX_W_XOP_08_8E_L_0) },
7683
  },
7684
7685
  /* VEX_LEN_XOP_08_8F */
7686
  {
7687
    { VEX_W_TABLE (VEX_W_XOP_08_8F_L_0) },
7688
  },
7689
7690
  /* VEX_LEN_XOP_08_95 */
7691
  {
7692
    { VEX_W_TABLE (VEX_W_XOP_08_95_L_0) },
7693
  },
7694
7695
  /* VEX_LEN_XOP_08_96 */
7696
  {
7697
    { VEX_W_TABLE (VEX_W_XOP_08_96_L_0) },
7698
  },
7699
7700
  /* VEX_LEN_XOP_08_97 */
7701
  {
7702
    { VEX_W_TABLE (VEX_W_XOP_08_97_L_0) },
7703
  },
7704
7705
  /* VEX_LEN_XOP_08_9E */
7706
  {
7707
    { VEX_W_TABLE (VEX_W_XOP_08_9E_L_0) },
7708
  },
7709
7710
  /* VEX_LEN_XOP_08_9F */
7711
  {
7712
    { VEX_W_TABLE (VEX_W_XOP_08_9F_L_0) },
7713
  },
7714
7715
  /* VEX_LEN_XOP_08_A3 */
7716
  {
7717
    { "vpperm",   { XM, Vex, EXx, XMVexI4 }, 0 },
7718
  },
7719
7720
  /* VEX_LEN_XOP_08_A6 */
7721
  {
7722
    { VEX_W_TABLE (VEX_W_XOP_08_A6_L_0) },
7723
  },
7724
7725
  /* VEX_LEN_XOP_08_B6 */
7726
  {
7727
    { VEX_W_TABLE (VEX_W_XOP_08_B6_L_0) },
7728
  },
7729
7730
  /* VEX_LEN_XOP_08_C0 */
7731
  {
7732
    { VEX_W_TABLE (VEX_W_XOP_08_C0_L_0) },
7733
  },
7734
7735
  /* VEX_LEN_XOP_08_C1 */
7736
  {
7737
    { VEX_W_TABLE (VEX_W_XOP_08_C1_L_0) },
7738
  },
7739
7740
  /* VEX_LEN_XOP_08_C2 */
7741
  {
7742
    { VEX_W_TABLE (VEX_W_XOP_08_C2_L_0) },
7743
  },
7744
7745
  /* VEX_LEN_XOP_08_C3 */
7746
  {
7747
    { VEX_W_TABLE (VEX_W_XOP_08_C3_L_0) },
7748
  },
7749
7750
  /* VEX_LEN_XOP_08_CC */
7751
  {
7752
    { VEX_W_TABLE (VEX_W_XOP_08_CC_L_0) },
7753
  },
7754
7755
  /* VEX_LEN_XOP_08_CD */
7756
  {
7757
    { VEX_W_TABLE (VEX_W_XOP_08_CD_L_0) },
7758
  },
7759
7760
  /* VEX_LEN_XOP_08_CE */
7761
  {
7762
    { VEX_W_TABLE (VEX_W_XOP_08_CE_L_0) },
7763
  },
7764
7765
  /* VEX_LEN_XOP_08_CF */
7766
  {
7767
    { VEX_W_TABLE (VEX_W_XOP_08_CF_L_0) },
7768
  },
7769
7770
  /* VEX_LEN_XOP_08_EC */
7771
  {
7772
    { VEX_W_TABLE (VEX_W_XOP_08_EC_L_0) },
7773
  },
7774
7775
  /* VEX_LEN_XOP_08_ED */
7776
  {
7777
    { VEX_W_TABLE (VEX_W_XOP_08_ED_L_0) },
7778
  },
7779
7780
  /* VEX_LEN_XOP_08_EE */
7781
  {
7782
    { VEX_W_TABLE (VEX_W_XOP_08_EE_L_0) },
7783
  },
7784
7785
  /* VEX_LEN_XOP_08_EF */
7786
  {
7787
    { VEX_W_TABLE (VEX_W_XOP_08_EF_L_0) },
7788
  },
7789
7790
  /* VEX_LEN_XOP_09_01 */
7791
  {
7792
    { REG_TABLE (REG_XOP_09_01_L_0) },
7793
  },
7794
7795
  /* VEX_LEN_XOP_09_02 */
7796
  {
7797
    { REG_TABLE (REG_XOP_09_02_L_0) },
7798
  },
7799
7800
  /* VEX_LEN_XOP_09_12 */
7801
  {
7802
    { REG_TABLE (REG_XOP_09_12_L_0) },
7803
  },
7804
7805
  /* VEX_LEN_XOP_09_82_W_0 */
7806
  {
7807
    { "vfrczss",  { XM, EXd }, 0 },
7808
  },
7809
7810
  /* VEX_LEN_XOP_09_83_W_0 */
7811
  {
7812
    { "vfrczsd",  { XM, EXq }, 0 },
7813
  },
7814
7815
  /* VEX_LEN_XOP_09_90 */
7816
  {
7817
    { "vprotb",   { XM, EXx, VexW }, 0 },
7818
  },
7819
7820
  /* VEX_LEN_XOP_09_91 */
7821
  {
7822
    { "vprotw",   { XM, EXx, VexW }, 0 },
7823
  },
7824
7825
  /* VEX_LEN_XOP_09_92 */
7826
  {
7827
    { "vprotd",   { XM, EXx, VexW }, 0 },
7828
  },
7829
7830
  /* VEX_LEN_XOP_09_93 */
7831
  {
7832
    { "vprotq",   { XM, EXx, VexW }, 0 },
7833
  },
7834
7835
  /* VEX_LEN_XOP_09_94 */
7836
  {
7837
    { "vpshlb",   { XM, EXx, VexW }, 0 },
7838
  },
7839
7840
  /* VEX_LEN_XOP_09_95 */
7841
  {
7842
    { "vpshlw",   { XM, EXx, VexW }, 0 },
7843
  },
7844
7845
  /* VEX_LEN_XOP_09_96 */
7846
  {
7847
    { "vpshld",   { XM, EXx, VexW }, 0 },
7848
  },
7849
7850
  /* VEX_LEN_XOP_09_97 */
7851
  {
7852
    { "vpshlq",   { XM, EXx, VexW }, 0 },
7853
  },
7854
7855
  /* VEX_LEN_XOP_09_98 */
7856
  {
7857
    { "vpshab",   { XM, EXx, VexW }, 0 },
7858
  },
7859
7860
  /* VEX_LEN_XOP_09_99 */
7861
  {
7862
    { "vpshaw",   { XM, EXx, VexW }, 0 },
7863
  },
7864
7865
  /* VEX_LEN_XOP_09_9A */
7866
  {
7867
    { "vpshad",   { XM, EXx, VexW }, 0 },
7868
  },
7869
7870
  /* VEX_LEN_XOP_09_9B */
7871
  {
7872
    { "vpshaq",   { XM, EXx, VexW }, 0 },
7873
  },
7874
7875
  /* VEX_LEN_XOP_09_C1 */
7876
  {
7877
    { VEX_W_TABLE (VEX_W_XOP_09_C1_L_0) },
7878
  },
7879
7880
  /* VEX_LEN_XOP_09_C2 */
7881
  {
7882
    { VEX_W_TABLE (VEX_W_XOP_09_C2_L_0) },
7883
  },
7884
7885
  /* VEX_LEN_XOP_09_C3 */
7886
  {
7887
    { VEX_W_TABLE (VEX_W_XOP_09_C3_L_0) },
7888
  },
7889
7890
  /* VEX_LEN_XOP_09_C6 */
7891
  {
7892
    { VEX_W_TABLE (VEX_W_XOP_09_C6_L_0) },
7893
  },
7894
7895
  /* VEX_LEN_XOP_09_C7 */
7896
  {
7897
    { VEX_W_TABLE (VEX_W_XOP_09_C7_L_0) },
7898
  },
7899
7900
  /* VEX_LEN_XOP_09_CB */
7901
  {
7902
    { VEX_W_TABLE (VEX_W_XOP_09_CB_L_0) },
7903
  },
7904
7905
  /* VEX_LEN_XOP_09_D1 */
7906
  {
7907
    { VEX_W_TABLE (VEX_W_XOP_09_D1_L_0) },
7908
  },
7909
7910
  /* VEX_LEN_XOP_09_D2 */
7911
  {
7912
    { VEX_W_TABLE (VEX_W_XOP_09_D2_L_0) },
7913
  },
7914
7915
  /* VEX_LEN_XOP_09_D3 */
7916
  {
7917
    { VEX_W_TABLE (VEX_W_XOP_09_D3_L_0) },
7918
  },
7919
7920
  /* VEX_LEN_XOP_09_D6 */
7921
  {
7922
    { VEX_W_TABLE (VEX_W_XOP_09_D6_L_0) },
7923
  },
7924
7925
  /* VEX_LEN_XOP_09_D7 */
7926
  {
7927
    { VEX_W_TABLE (VEX_W_XOP_09_D7_L_0) },
7928
  },
7929
7930
  /* VEX_LEN_XOP_09_DB */
7931
  {
7932
    { VEX_W_TABLE (VEX_W_XOP_09_DB_L_0) },
7933
  },
7934
7935
  /* VEX_LEN_XOP_09_E1 */
7936
  {
7937
    { VEX_W_TABLE (VEX_W_XOP_09_E1_L_0) },
7938
  },
7939
7940
  /* VEX_LEN_XOP_09_E2 */
7941
  {
7942
    { VEX_W_TABLE (VEX_W_XOP_09_E2_L_0) },
7943
  },
7944
7945
  /* VEX_LEN_XOP_09_E3 */
7946
  {
7947
    { VEX_W_TABLE (VEX_W_XOP_09_E3_L_0) },
7948
  },
7949
7950
  /* VEX_LEN_XOP_0A_12 */
7951
  {
7952
    { REG_TABLE (REG_XOP_0A_12_L_0) },
7953
  },
7954
};
7955
7956
#include "i386-dis-evex-len.h"
7957
7958
static const struct dis386 vex_w_table[][2] = {
7959
  {
7960
    /* VEX_W_0F41_L_1_M_1 */
7961
    { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_W_0) },
7962
    { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_W_1) },
7963
  },
7964
  {
7965
    /* VEX_W_0F42_L_1_M_1 */
7966
    { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_W_0) },
7967
    { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_W_1) },
7968
  },
7969
  {
7970
    /* VEX_W_0F44_L_0_M_1 */
7971
    { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_W_0) },
7972
    { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_W_1) },
7973
  },
7974
  {
7975
    /* VEX_W_0F45_L_1_M_1 */
7976
    { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_W_0) },
7977
    { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_W_1) },
7978
  },
7979
  {
7980
    /* VEX_W_0F46_L_1_M_1 */
7981
    { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_W_0) },
7982
    { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_W_1) },
7983
  },
7984
  {
7985
    /* VEX_W_0F47_L_1_M_1 */
7986
    { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_W_0) },
7987
    { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_W_1) },
7988
  },
7989
  {
7990
    /* VEX_W_0F4A_L_1_M_1 */
7991
    { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_W_0) },
7992
    { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_W_1) },
7993
  },
7994
  {
7995
    /* VEX_W_0F4B_L_1_M_1 */
7996
    { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_W_0) },
7997
    { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_W_1) },
7998
  },
7999
  {
8000
    /* VEX_W_0F90_L_0 */
8001
    { PREFIX_TABLE (PREFIX_VEX_0F90_L_0_W_0) },
8002
    { PREFIX_TABLE (PREFIX_VEX_0F90_L_0_W_1) },
8003
  },
8004
  {
8005
    /* VEX_W_0F91_L_0_M_0 */
8006
    { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_W_0) },
8007
    { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_W_1) },
8008
  },
8009
  {
8010
    /* VEX_W_0F92_L_0_M_1 */
8011
    { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_W_0) },
8012
    { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_W_1) },
8013
  },
8014
  {
8015
    /* VEX_W_0F93_L_0_M_1 */
8016
    { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_W_0) },
8017
    { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_W_1) },
8018
  },
8019
  {
8020
    /* VEX_W_0F98_L_0_M_1 */
8021
    { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_W_0) },
8022
    { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_W_1) },
8023
  },
8024
  {
8025
    /* VEX_W_0F99_L_0_M_1 */
8026
    { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_W_0) },
8027
    { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_W_1) },
8028
  },
8029
  {
8030
    /* VEX_W_0F380C  */
8031
    { "%XEvpermilps", { XM, Vex, EXx }, PREFIX_DATA },
8032
  },
8033
  {
8034
    /* VEX_W_0F380D  */
8035
    { "vpermilpd",  { XM, Vex, EXx }, PREFIX_DATA },
8036
  },
8037
  {
8038
    /* VEX_W_0F380E  */
8039
    { "vtestps",  { XM, EXx }, PREFIX_DATA },
8040
  },
8041
  {
8042
    /* VEX_W_0F380F  */
8043
    { "vtestpd",  { XM, EXx }, PREFIX_DATA },
8044
  },
8045
  {
8046
    /* VEX_W_0F3813 */
8047
    { "vcvtph2ps", { XM, EXxmmq }, PREFIX_DATA },
8048
  },
8049
  {
8050
    /* VEX_W_0F3816_L_1  */
8051
    { "vpermps",  { XM, Vex, EXx }, PREFIX_DATA },
8052
  },
8053
  {
8054
    /* VEX_W_0F3818 */
8055
    { "%XEvbroadcastss",  { XM, EXd }, PREFIX_DATA },
8056
  },
8057
  {
8058
    /* VEX_W_0F3819_L_1 */
8059
    { "vbroadcastsd", { XM, EXq }, PREFIX_DATA },
8060
  },
8061
  {
8062
    /* VEX_W_0F381A_L_1 */
8063
    { "vbroadcastf128", { XM, Mxmm }, PREFIX_DATA },
8064
  },
8065
  {
8066
    /* VEX_W_0F382C */
8067
    { "vmaskmovps", { XM, Vex, Mx }, PREFIX_DATA },
8068
  },
8069
  {
8070
    /* VEX_W_0F382D */
8071
    { "vmaskmovpd", { XM, Vex, Mx }, PREFIX_DATA },
8072
  },
8073
  {
8074
    /* VEX_W_0F382E */
8075
    { "vmaskmovps", { Mx, Vex, XM }, PREFIX_DATA },
8076
  },
8077
  {
8078
    /* VEX_W_0F382F */
8079
    { "vmaskmovpd", { Mx, Vex, XM }, PREFIX_DATA },
8080
  },
8081
  {
8082
    /* VEX_W_0F3836  */
8083
    { "vpermd",   { XM, Vex, EXx }, PREFIX_DATA },
8084
  },
8085
  {
8086
    /* VEX_W_0F3846 */
8087
    { "vpsravd",  { XM, Vex, EXx }, PREFIX_DATA },
8088
  },
8089
  {
8090
    /* VEX_W_0F3848_X86_64_L_0 */
8091
    { PREFIX_TABLE (PREFIX_VEX_0F3848_X86_64_L_0_W_0) },
8092
  },
8093
  {
8094
    /* VEX_W_0F3849_X86_64_L_0 */
8095
    { MOD_TABLE (MOD_VEX_0F3849_X86_64_L_0_W_0) },
8096
  },
8097
  {
8098
    /* VEX_W_0F384A_X86_64 */
8099
    { VEX_LEN_TABLE (VEX_LEN_0F384A_X86_64_W_0) },
8100
  },
8101
  {
8102
    /* VEX_W_0F384B_X86_64_L_0 */
8103
    { PREFIX_TABLE (PREFIX_VEX_0F384B_X86_64_L_0_W_0) },
8104
  },
8105
  {
8106
    /* VEX_W_0F3850 */
8107
    { PREFIX_TABLE (PREFIX_VEX_0F3850_W_0) },
8108
  },
8109
  {
8110
    /* VEX_W_0F3851 */
8111
    { PREFIX_TABLE (PREFIX_VEX_0F3851_W_0) },
8112
  },
8113
  {
8114
    /* VEX_W_0F3852 */
8115
    { "%XVvpdpwssd",  { XM, Vex, EXx }, PREFIX_DATA },
8116
  },
8117
  {
8118
    /* VEX_W_0F3853 */
8119
    { "%XVvpdpwssds", { XM, Vex, EXx }, PREFIX_DATA },
8120
  },
8121
  {
8122
    /* VEX_W_0F3858 */
8123
    { "%XEvpbroadcastd", { XM, EXd }, PREFIX_DATA },
8124
  },
8125
  {
8126
    /* VEX_W_0F3859 */
8127
    { "vpbroadcastq", { XM, EXq }, PREFIX_DATA },
8128
  },
8129
  {
8130
    /* VEX_W_0F385A_L_0 */
8131
    { "vbroadcasti128", { XM, Mxmm }, PREFIX_DATA },
8132
  },
8133
  {
8134
    /* VEX_W_0F385C_X86_64_L_0 */
8135
    { PREFIX_TABLE (PREFIX_VEX_0F385C_X86_64_L_0_W_0) },
8136
  },
8137
  {
8138
    /* VEX_W_0F385E_X86_64_L_0 */
8139
    { PREFIX_TABLE (PREFIX_VEX_0F385E_X86_64_L_0_W_0) },
8140
  },
8141
  {
8142
    /* VEX_W_0F385F_X86_64_L_0 */
8143
    { PREFIX_TABLE (PREFIX_VEX_0F385F_X86_64_L_0_W_0) },
8144
  },
8145
  {
8146
    /* VEX_W_0F386B_X86_64_L_0 */
8147
    { PREFIX_TABLE (PREFIX_VEX_0F386B_X86_64_L_0_W_0) },
8148
  },
8149
  {
8150
    /* VEX_W_0F386C_X86_64_L_0 */
8151
    { PREFIX_TABLE (PREFIX_VEX_0F386C_X86_64_L_0_W_0) },
8152
  },
8153
  {
8154
    /* VEX_W_0F386E_X86_64_L_0 */
8155
    { PREFIX_TABLE (PREFIX_VEX_0F386E_X86_64_L_0_W_0) },
8156
  },
8157
  {
8158
    /* VEX_W_0F386F_X86_64_L_0 */
8159
    { PREFIX_TABLE (PREFIX_VEX_0F386F_X86_64_L_0_W_0) },
8160
  },
8161
  {
8162
    /* VEX_W_0F3872_P_1 */
8163
    { "%XVvcvtneps2bf16%XY", { XMM, EXx }, 0 },
8164
  },
8165
  {
8166
    /* VEX_W_0F3878 */
8167
    { "%XEvpbroadcastb",  { XM, EXb }, PREFIX_DATA },
8168
  },
8169
  {
8170
    /* VEX_W_0F3879 */
8171
    { "%XEvpbroadcastw",  { XM, EXw }, PREFIX_DATA },
8172
  },
8173
  {
8174
    /* VEX_W_0F38B0 */
8175
    { PREFIX_TABLE (PREFIX_VEX_0F38B0_W_0) },
8176
  },
8177
  {
8178
    /* VEX_W_0F38B1 */
8179
    { PREFIX_TABLE (PREFIX_VEX_0F38B1_W_0) },
8180
  },
8181
  {
8182
    /* VEX_W_0F38B4 */
8183
    { Bad_Opcode },
8184
    { "%XVvpmadd52luq", { XM, Vex, EXx }, PREFIX_DATA },
8185
  },
8186
  {
8187
    /* VEX_W_0F38B5 */
8188
    { Bad_Opcode },
8189
    { "%XVvpmadd52huq", { XM, Vex, EXx }, PREFIX_DATA },
8190
  },
8191
  {
8192
    /* VEX_W_0F38CB_P_3 */
8193
    { VEX_LEN_TABLE (VEX_LEN_0F38CB_P_3_W_0) },
8194
  },
8195
  {
8196
    /* VEX_W_0F38CC_P_3 */
8197
    { VEX_LEN_TABLE (VEX_LEN_0F38CC_P_3_W_0) },
8198
  },
8199
  {
8200
    /* VEX_W_0F38CD_P_3 */
8201
    { VEX_LEN_TABLE (VEX_LEN_0F38CD_P_3_W_0) },
8202
  },
8203
  {
8204
    /* VEX_W_0F38CF */
8205
    { "%XEvgf2p8mulb", { XM, Vex, EXx }, PREFIX_DATA },
8206
  },
8207
  {
8208
    /* VEX_W_0F38D2 */
8209
    { PREFIX_TABLE (PREFIX_VEX_0F38D2_W_0) },
8210
  },
8211
  {
8212
    /* VEX_W_0F38D3 */
8213
    { PREFIX_TABLE (PREFIX_VEX_0F38D3_W_0) },
8214
  },
8215
  {
8216
    /* VEX_W_0F38DA */
8217
    { PREFIX_TABLE (PREFIX_VEX_0F38DA_W_0) },
8218
  },
8219
  {
8220
    /* VEX_W_0F3A00_L_1 */
8221
    { Bad_Opcode },
8222
    { "%XEvpermq",    { XM, EXx, Ib }, PREFIX_DATA },
8223
  },
8224
  {
8225
    /* VEX_W_0F3A01_L_1 */
8226
    { Bad_Opcode },
8227
    { "%XEvpermpd", { XM, EXx, Ib }, PREFIX_DATA },
8228
  },
8229
  {
8230
    /* VEX_W_0F3A02 */
8231
    { "vpblendd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
8232
  },
8233
  {
8234
    /* VEX_W_0F3A04 */
8235
    { "%XEvpermilps", { XM, EXx, Ib }, PREFIX_DATA },
8236
  },
8237
  {
8238
    /* VEX_W_0F3A05 */
8239
    { "vpermilpd",  { XM, EXx, Ib }, PREFIX_DATA },
8240
  },
8241
  {
8242
    /* VEX_W_0F3A06_L_1 */
8243
    { "vperm2f128", { XM, Vex, EXx, Ib }, PREFIX_DATA },
8244
  },
8245
  {
8246
    /* VEX_W_0F3A18_L_1 */
8247
    { "vinsertf128",  { XM, Vex, EXxmm, Ib }, PREFIX_DATA },
8248
  },
8249
  {
8250
    /* VEX_W_0F3A19_L_1 */
8251
    { "vextractf128", { EXxmm, XM, Ib }, PREFIX_DATA },
8252
  },
8253
  {
8254
    /* VEX_W_0F3A1D */
8255
    { "%XEvcvtps2ph", { EXxmmq, XM, EXxEVexS, Ib }, PREFIX_DATA },
8256
  },
8257
  {
8258
    /* VEX_W_0F3A38_L_1 */
8259
    { "vinserti128",  { XM, Vex, EXxmm, Ib }, PREFIX_DATA },
8260
  },
8261
  {
8262
    /* VEX_W_0F3A39_L_1 */
8263
    { "vextracti128", { EXxmm, XM, Ib }, PREFIX_DATA },
8264
  },
8265
  {
8266
    /* VEX_W_0F3A46_L_1 */
8267
    { "vperm2i128", { XM, Vex, EXx, Ib }, PREFIX_DATA },
8268
  },
8269
  {
8270
    /* VEX_W_0F3A4A */
8271
    { "vblendvps",  { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
8272
  },
8273
  {
8274
    /* VEX_W_0F3A4B */
8275
    { "vblendvpd",  { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
8276
  },
8277
  {
8278
    /* VEX_W_0F3A4C */
8279
    { "vpblendvb",  { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
8280
  },
8281
  {
8282
    /* VEX_W_0F3ACE */
8283
    { Bad_Opcode },
8284
    { "%XEvgf2p8affineqb", { XM, Vex, EXx, Ib }, PREFIX_DATA },
8285
  },
8286
  {
8287
    /* VEX_W_0F3ACF */
8288
    { Bad_Opcode },
8289
    { "%XEvgf2p8affineinvqb",  { XM, Vex, EXx, Ib }, PREFIX_DATA },
8290
  },
8291
  {
8292
    /* VEX_W_0F3ADE */
8293
    { VEX_LEN_TABLE (VEX_LEN_0F3ADE_W_0) },
8294
  },
8295
  {
8296
    /* VEX_W_MAP5_F8_X86_64 */
8297
    { PREFIX_TABLE (PREFIX_VEX_MAP5_F8_X86_64_L_0_W_0) },
8298
  },
8299
  {
8300
    /* VEX_W_MAP5_F9_X86_64 */
8301
    { PREFIX_TABLE (PREFIX_VEX_MAP5_F9_X86_64_L_0_W_0) },
8302
  },
8303
  {
8304
    /* VEX_W_MAP5_FD_X86_64 */
8305
    { PREFIX_TABLE (PREFIX_VEX_MAP5_FD_X86_64_L_0_W_0) },
8306
  },
8307
  {
8308
    /* VEX_W_MAP7_F6_L_0 */
8309
    { REG_TABLE (REG_VEX_MAP7_F6_L_0_W_0) },
8310
  },
8311
  {
8312
    /* VEX_W_MAP7_F8_L_0 */
8313
    { REG_TABLE (REG_VEX_MAP7_F8_L_0_W_0) },
8314
  },
8315
  /* VEX_W_XOP_08_85_L_0 */
8316
  {
8317
    { "vpmacssww",  { XM, Vex, EXx, XMVexI4 }, 0 },
8318
  },
8319
  /* VEX_W_XOP_08_86_L_0 */
8320
  {
8321
    { "vpmacsswd",  { XM, Vex, EXx, XMVexI4 }, 0 },
8322
  },
8323
  /* VEX_W_XOP_08_87_L_0 */
8324
  {
8325
    { "vpmacssdql",   { XM, Vex, EXx, XMVexI4 }, 0 },
8326
  },
8327
  /* VEX_W_XOP_08_8E_L_0 */
8328
  {
8329
    { "vpmacssdd",  { XM, Vex, EXx, XMVexI4 }, 0 },
8330
  },
8331
  /* VEX_W_XOP_08_8F_L_0 */
8332
  {
8333
    { "vpmacssdqh",   { XM, Vex, EXx, XMVexI4 }, 0 },
8334
  },
8335
  /* VEX_W_XOP_08_95_L_0 */
8336
  {
8337
    { "vpmacsww",   { XM, Vex, EXx, XMVexI4 }, 0 },
8338
  },
8339
  /* VEX_W_XOP_08_96_L_0 */
8340
  {
8341
    { "vpmacswd",   { XM, Vex, EXx, XMVexI4 }, 0 },
8342
  },
8343
  /* VEX_W_XOP_08_97_L_0 */
8344
  {
8345
    { "vpmacsdql",  { XM, Vex, EXx, XMVexI4 }, 0 },
8346
  },
8347
  /* VEX_W_XOP_08_9E_L_0 */
8348
  {
8349
    { "vpmacsdd",   { XM, Vex, EXx, XMVexI4 }, 0 },
8350
  },
8351
  /* VEX_W_XOP_08_9F_L_0 */
8352
  {
8353
    { "vpmacsdqh",  { XM, Vex, EXx, XMVexI4 }, 0 },
8354
  },
8355
  /* VEX_W_XOP_08_A6_L_0 */
8356
  {
8357
    { "vpmadcsswd",   { XM, Vex, EXx, XMVexI4 }, 0 },
8358
  },
8359
  /* VEX_W_XOP_08_B6_L_0 */
8360
  {
8361
    { "vpmadcswd",  { XM, Vex, EXx, XMVexI4 }, 0 },
8362
  },
8363
  /* VEX_W_XOP_08_C0_L_0 */
8364
  {
8365
    { "vprotb",   { XM, EXx, Ib }, 0 },
8366
  },
8367
  /* VEX_W_XOP_08_C1_L_0 */
8368
  {
8369
    { "vprotw",   { XM, EXx, Ib }, 0 },
8370
  },
8371
  /* VEX_W_XOP_08_C2_L_0 */
8372
  {
8373
    { "vprotd",   { XM, EXx, Ib }, 0 },
8374
  },
8375
  /* VEX_W_XOP_08_C3_L_0 */
8376
  {
8377
    { "vprotq",   { XM, EXx, Ib }, 0 },
8378
  },
8379
  /* VEX_W_XOP_08_CC_L_0 */
8380
  {
8381
     { "vpcomb",  { XM, Vex, EXx, VPCOM }, 0 },
8382
  },
8383
  /* VEX_W_XOP_08_CD_L_0 */
8384
  {
8385
     { "vpcomw",  { XM, Vex, EXx, VPCOM }, 0 },
8386
  },
8387
  /* VEX_W_XOP_08_CE_L_0 */
8388
  {
8389
     { "vpcomd",  { XM, Vex, EXx, VPCOM }, 0 },
8390
  },
8391
  /* VEX_W_XOP_08_CF_L_0 */
8392
  {
8393
     { "vpcomq",  { XM, Vex, EXx, VPCOM }, 0 },
8394
  },
8395
  /* VEX_W_XOP_08_EC_L_0 */
8396
  {
8397
     { "vpcomub", { XM, Vex, EXx, VPCOM }, 0 },
8398
  },
8399
  /* VEX_W_XOP_08_ED_L_0 */
8400
  {
8401
     { "vpcomuw", { XM, Vex, EXx, VPCOM }, 0 },
8402
  },
8403
  /* VEX_W_XOP_08_EE_L_0 */
8404
  {
8405
     { "vpcomud", { XM, Vex, EXx, VPCOM }, 0 },
8406
  },
8407
  /* VEX_W_XOP_08_EF_L_0 */
8408
  {
8409
     { "vpcomuq", { XM, Vex, EXx, VPCOM }, 0 },
8410
  },
8411
  /* VEX_W_XOP_09_80 */
8412
  {
8413
    { "vfrczps",  { XM, EXx }, 0 },
8414
  },
8415
  /* VEX_W_XOP_09_81 */
8416
  {
8417
    { "vfrczpd",  { XM, EXx }, 0 },
8418
  },
8419
  /* VEX_W_XOP_09_82 */
8420
  {
8421
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_82_W_0) },
8422
  },
8423
  /* VEX_W_XOP_09_83 */
8424
  {
8425
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_83_W_0) },
8426
  },
8427
  /* VEX_W_XOP_09_C1_L_0 */
8428
  {
8429
    { "vphaddbw", { XM, EXxmm }, 0 },
8430
  },
8431
  /* VEX_W_XOP_09_C2_L_0 */
8432
  {
8433
    { "vphaddbd", { XM, EXxmm }, 0 },
8434
  },
8435
  /* VEX_W_XOP_09_C3_L_0 */
8436
  {
8437
    { "vphaddbq", { XM, EXxmm }, 0 },
8438
  },
8439
  /* VEX_W_XOP_09_C6_L_0 */
8440
  {
8441
    { "vphaddwd", { XM, EXxmm }, 0 },
8442
  },
8443
  /* VEX_W_XOP_09_C7_L_0 */
8444
  {
8445
    { "vphaddwq", { XM, EXxmm }, 0 },
8446
  },
8447
  /* VEX_W_XOP_09_CB_L_0 */
8448
  {
8449
    { "vphadddq", { XM, EXxmm }, 0 },
8450
  },
8451
  /* VEX_W_XOP_09_D1_L_0 */
8452
  {
8453
    { "vphaddubw",  { XM, EXxmm }, 0 },
8454
  },
8455
  /* VEX_W_XOP_09_D2_L_0 */
8456
  {
8457
    { "vphaddubd",  { XM, EXxmm }, 0 },
8458
  },
8459
  /* VEX_W_XOP_09_D3_L_0 */
8460
  {
8461
    { "vphaddubq",  { XM, EXxmm }, 0 },
8462
  },
8463
  /* VEX_W_XOP_09_D6_L_0 */
8464
  {
8465
    { "vphadduwd",  { XM, EXxmm }, 0 },
8466
  },
8467
  /* VEX_W_XOP_09_D7_L_0 */
8468
  {
8469
    { "vphadduwq",  { XM, EXxmm }, 0 },
8470
  },
8471
  /* VEX_W_XOP_09_DB_L_0 */
8472
  {
8473
    { "vphaddudq",  { XM, EXxmm }, 0 },
8474
  },
8475
  /* VEX_W_XOP_09_E1_L_0 */
8476
  {
8477
    { "vphsubbw", { XM, EXxmm }, 0 },
8478
  },
8479
  /* VEX_W_XOP_09_E2_L_0 */
8480
  {
8481
    { "vphsubwd", { XM, EXxmm }, 0 },
8482
  },
8483
  /* VEX_W_XOP_09_E3_L_0 */
8484
  {
8485
    { "vphsubdq", { XM, EXxmm }, 0 },
8486
  },
8487
8488
#include "i386-dis-evex-w.h"
8489
};
8490
8491
static const struct dis386 mod_table[][2] = {
8492
  {
8493
    /* MOD_62_32BIT */
8494
    { "bound{S|}",  { Gv, Ma }, 0 },
8495
    { EVEX_TABLE () },
8496
  },
8497
  {
8498
    /* MOD_C4_32BIT */
8499
    { "lesS",   { Gv, Mp }, 0 },
8500
    { VEX_C4_TABLE () },
8501
  },
8502
  {
8503
    /* MOD_C5_32BIT */
8504
    { "ldsS",   { Gv, Mp }, 0 },
8505
    { VEX_C5_TABLE () },
8506
  },
8507
  {
8508
    /* MOD_0F01_REG_0 */
8509
    { X86_64_TABLE (X86_64_0F01_REG_0) },
8510
    { RM_TABLE (RM_0F01_REG_0) },
8511
  },
8512
  {
8513
    /* MOD_0F01_REG_1 */
8514
    { X86_64_TABLE (X86_64_0F01_REG_1) },
8515
    { RM_TABLE (RM_0F01_REG_1) },
8516
  },
8517
  {
8518
    /* MOD_0F01_REG_2 */
8519
    { X86_64_TABLE (X86_64_0F01_REG_2) },
8520
    { RM_TABLE (RM_0F01_REG_2) },
8521
  },
8522
  {
8523
    /* MOD_0F01_REG_3 */
8524
    { X86_64_TABLE (X86_64_0F01_REG_3) },
8525
    { RM_TABLE (RM_0F01_REG_3) },
8526
  },
8527
  {
8528
    /* MOD_0F01_REG_5 */
8529
    { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_0) },
8530
    { RM_TABLE (RM_0F01_REG_5_MOD_3) },
8531
  },
8532
  {
8533
    /* MOD_0F01_REG_7 */
8534
    { "invlpg",   { Mb }, 0 },
8535
    { RM_TABLE (RM_0F01_REG_7_MOD_3) },
8536
  },
8537
  {
8538
    /* MOD_0F12_PREFIX_0 */
8539
    { "%XEVmovlpYX",  { XM, Vex, EXq }, 0 },
8540
    { "%XEVmovhlpY%XS", { XM, Vex, EXq }, 0 },
8541
  },
8542
  {
8543
    /* MOD_0F16_PREFIX_0 */
8544
    { "%XEVmovhpYX",  { XM, Vex, EXq }, 0 },
8545
    { "%XEVmovlhpY%XS", { XM, Vex, EXq }, 0 },
8546
  },
8547
  {
8548
    /* MOD_0F18_REG_0 */
8549
    { "prefetchnta",  { Mb }, 0 },
8550
    { "nopQ",   { Ev }, 0 },
8551
  },
8552
  {
8553
    /* MOD_0F18_REG_1 */
8554
    { "prefetcht0", { Mb }, 0 },
8555
    { "nopQ",   { Ev }, 0 },
8556
  },
8557
  {
8558
    /* MOD_0F18_REG_2 */
8559
    { "prefetcht1", { Mb }, 0 },
8560
    { "nopQ",   { Ev }, 0 },
8561
  },
8562
  {
8563
    /* MOD_0F18_REG_3 */
8564
    { "prefetcht2", { Mb }, 0 },
8565
    { "nopQ",   { Ev }, 0 },
8566
  },
8567
  {
8568
    /* MOD_0F18_REG_4 */
8569
    { "prefetchrst2", { Mb }, 0 },
8570
    { "nopQ",   { Ev }, 0 },
8571
  },
8572
  {
8573
    /* MOD_0F18_REG_6 */
8574
    { X86_64_TABLE (X86_64_0F18_REG_6_MOD_0) },
8575
    { "nopQ",   { Ev }, 0 },
8576
  },
8577
  {
8578
    /* MOD_0F18_REG_7 */
8579
    { X86_64_TABLE (X86_64_0F18_REG_7_MOD_0) },
8580
    { "nopQ",   { Ev }, 0 },
8581
  },
8582
  {
8583
    /* MOD_0F1A_PREFIX_0 */
8584
    { "bndldx",   { Gbnd, Mv_bnd }, 0 },
8585
    { "nopQ",   { Ev }, 0 },
8586
  },
8587
  {
8588
    /* MOD_0F1B_PREFIX_0 */
8589
    { "bndstx",   { Mv_bnd, Gbnd }, 0 },
8590
    { "nopQ",   { Ev }, 0 },
8591
  },
8592
  {
8593
    /* MOD_0F1B_PREFIX_1 */
8594
    { "bndmk",    { Gbnd, Mv_bnd }, 0 },
8595
    { "nopQ",   { Ev }, PREFIX_IGNORED },
8596
  },
8597
  {
8598
    /* MOD_0F1C_PREFIX_0 */
8599
    { REG_TABLE (REG_0F1C_P_0_MOD_0) },
8600
    { "nopQ",   { Ev }, 0 },
8601
  },
8602
  {
8603
    /* MOD_0F1E_PREFIX_1 */
8604
    { "nopQ",   { Ev }, PREFIX_IGNORED },
8605
    { REG_TABLE (REG_0F1E_P_1_MOD_3) },
8606
  },
8607
  {
8608
    /* MOD_0FAE_REG_0 */
8609
    { "fxsave",   { FXSAVE }, 0 },
8610
    { PREFIX_TABLE (PREFIX_0FAE_REG_0_MOD_3) },
8611
  },
8612
  {
8613
    /* MOD_0FAE_REG_1 */
8614
    { "fxrstor",  { FXSAVE }, 0 },
8615
    { PREFIX_TABLE (PREFIX_0FAE_REG_1_MOD_3) },
8616
  },
8617
  {
8618
    /* MOD_0FAE_REG_2 */
8619
    { "ldmxcsr",  { Md }, 0 },
8620
    { PREFIX_TABLE (PREFIX_0FAE_REG_2_MOD_3) },
8621
  },
8622
  {
8623
    /* MOD_0FAE_REG_3 */
8624
    { "stmxcsr",  { Md }, 0 },
8625
    { PREFIX_TABLE (PREFIX_0FAE_REG_3_MOD_3) },
8626
  },
8627
  {
8628
    /* MOD_0FAE_REG_4 */
8629
    { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_0) },
8630
    { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_3) },
8631
  },
8632
  {
8633
    /* MOD_0FAE_REG_5 */
8634
    { "xrstor",   { FXSAVE }, PREFIX_OPCODE | PREFIX_REX2_ILLEGAL },
8635
    { PREFIX_TABLE (PREFIX_0FAE_REG_5_MOD_3) },
8636
  },
8637
  {
8638
    /* MOD_0FAE_REG_6 */
8639
    { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_0) },
8640
    { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_3) },
8641
  },
8642
  {
8643
    /* MOD_0FAE_REG_7 */
8644
    { PREFIX_TABLE (PREFIX_0FAE_REG_7_MOD_0) },
8645
    { RM_TABLE (RM_0FAE_REG_7_MOD_3) },
8646
  },
8647
  {
8648
    /* MOD_0FC7_REG_6 */
8649
    { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_0) },
8650
    { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_3) }
8651
  },
8652
  {
8653
    /* MOD_0FC7_REG_7 */
8654
    { "vmptrst",  { Mq }, 0 },
8655
    { PREFIX_TABLE (PREFIX_0FC7_REG_7_MOD_3) }
8656
  },
8657
  {
8658
    /* MOD_0F38DC_PREFIX_1 */
8659
    { "aesenc128kl",    { XM, M }, 0 },
8660
    { "loadiwkey",      { XM, EXx }, 0 },
8661
  },
8662
  /* MOD_0F38F8 */
8663
  {
8664
    { PREFIX_TABLE (PREFIX_0F38F8_M_0) },
8665
    { X86_64_TABLE (X86_64_0F38F8_M_1) },
8666
  },
8667
  {
8668
    /* MOD_VEX_0F3849_X86_64_L_0_W_0 */
8669
    { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_0) },
8670
    { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_1) },
8671
  },
8672
8673
#include "i386-dis-evex-mod.h"
8674
};
8675
8676
static const struct dis386 rm_table[][8] = {
8677
  {
8678
    /* RM_C6_REG_7 */
8679
    { "xabort",   { Skip_MODRM, Ib }, 0 },
8680
  },
8681
  {
8682
    /* RM_C7_REG_7 */
8683
    { "xbeginT",  { Skip_MODRM, Jdqw }, 0 },
8684
  },
8685
  {
8686
    /* RM_0F01_REG_0 */
8687
    { "enclv",    { Skip_MODRM }, 0 },
8688
    { "vmcall",   { Skip_MODRM }, 0 },
8689
    { "vmlaunch", { Skip_MODRM }, 0 },
8690
    { "vmresume", { Skip_MODRM }, 0 },
8691
    { "vmxoff",   { Skip_MODRM }, 0 },
8692
    { "pconfig",  { Skip_MODRM }, 0 },
8693
    { PREFIX_TABLE (PREFIX_0F01_REG_0_MOD_3_RM_6) },
8694
    { PREFIX_TABLE (PREFIX_0F01_REG_0_MOD_3_RM_7) },
8695
  },
8696
  {
8697
    /* RM_0F01_REG_1 */
8698
    { "monitor",  { { OP_Monitor, 0 } }, 0 },
8699
    { "mwait",    { { OP_Mwait, 0 } }, 0 },
8700
    { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_2) },
8701
    { "stac",   { Skip_MODRM }, 0 },
8702
    { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_4) },
8703
    { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_5) },
8704
    { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_6) },
8705
    { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_7) },
8706
  },
8707
  {
8708
    /* RM_0F01_REG_2 */
8709
    { "xgetbv",   { Skip_MODRM }, 0 },
8710
    { "xsetbv",   { Skip_MODRM }, 0 },
8711
    { Bad_Opcode },
8712
    { Bad_Opcode },
8713
    { "vmfunc",   { Skip_MODRM }, 0 },
8714
    { "xend",   { Skip_MODRM }, 0 },
8715
    { "xtest",    { Skip_MODRM }, 0 },
8716
    { "enclu",    { Skip_MODRM }, 0 },
8717
  },
8718
  {
8719
    /* RM_0F01_REG_3 */
8720
    { "vmrun",    { Skip_MODRM }, 0 },
8721
    { PREFIX_TABLE (PREFIX_0F01_REG_3_RM_1) },
8722
    { "vmload",   { Skip_MODRM }, 0 },
8723
    { "vmsave",   { Skip_MODRM }, 0 },
8724
    { "stgi",   { Skip_MODRM }, 0 },
8725
    { "clgi",   { Skip_MODRM }, 0 },
8726
    { "skinit",   { Skip_MODRM }, 0 },
8727
    { "invlpga",  { Skip_MODRM }, 0 },
8728
  },
8729
  {
8730
    /* RM_0F01_REG_5_MOD_3 */
8731
    { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_0) },
8732
    { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_1) },
8733
    { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_2) },
8734
    { Bad_Opcode },
8735
    { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_4) },
8736
    { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_5) },
8737
    { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_6) },
8738
    { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_7) },
8739
  },
8740
  {
8741
    /* RM_0F01_REG_7_MOD_3 */
8742
    { "swapgs",   { Skip_MODRM }, 0  },
8743
    { "rdtscp",   { Skip_MODRM }, 0  },
8744
    { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_2) },
8745
    { "mwaitx",   { { OP_Mwait, eBX_reg } }, PREFIX_OPCODE },
8746
    { "clzero",   { Skip_MODRM }, 0  },
8747
    { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_5) },
8748
    { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_6) },
8749
    { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_7) },
8750
  },
8751
  {
8752
    /* RM_0F1E_P_1_MOD_3_REG_7 */
8753
    { "nopQ",   { Ev }, PREFIX_IGNORED },
8754
    { "nopQ",   { Ev }, PREFIX_IGNORED },
8755
    { "endbr64",  { Skip_MODRM }, 0 },
8756
    { "endbr32",  { Skip_MODRM }, 0 },
8757
    { "nopQ",   { Ev }, PREFIX_IGNORED },
8758
    { "nopQ",   { Ev }, PREFIX_IGNORED },
8759
    { "nopQ",   { Ev }, PREFIX_IGNORED },
8760
    { "nopQ",   { Ev }, PREFIX_IGNORED },
8761
  },
8762
  {
8763
    /* RM_0FAE_REG_6_MOD_3 */
8764
    { "mfence",   { Skip_MODRM }, 0 },
8765
  },
8766
  {
8767
    /* RM_0FAE_REG_7_MOD_3 */
8768
    { "sfence",   { Skip_MODRM }, 0 },
8769
  },
8770
  {
8771
    /* RM_0F3A0F_P_1_R_0 */
8772
    { "hreset",   { Skip_MODRM, Ib }, 0 },
8773
  },
8774
  {
8775
    /* RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0_R_0 */
8776
    { "tilerelease",  { Skip_MODRM }, 0 },
8777
  },
8778
  {
8779
    /* RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_3 */
8780
    { "tilezero", { TMM, Skip_MODRM }, 0 },
8781
  },
8782
};
8783
8784
0
#define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
8785
8786
/* The values used here must be non-zero, fit in 'unsigned char', and not be
8787
   in conflict with actual prefix opcodes.  */
8788
1.43k
#define REP_PREFIX  0x01
8789
3.79k
#define XACQUIRE_PREFIX 0x02
8790
5.61k
#define XRELEASE_PREFIX 0x03
8791
4.47k
#define BND_PREFIX  0x04
8792
4.55k
#define NOTRACK_PREFIX  0x05
8793
8794
static enum {
8795
  ckp_okay,
8796
  ckp_bogus,
8797
  ckp_fetch_error,
8798
}
8799
ckprefix (instr_info *ins)
8800
5.42M
{
8801
5.42M
  int i, length;
8802
5.42M
  uint8_t newrex;
8803
8804
5.42M
  i = 0;
8805
5.42M
  length = 0;
8806
  /* The maximum instruction length is 15bytes.  */
8807
6.46M
  while (length < MAX_CODE_LENGTH - 1)
8808
6.45M
    {
8809
6.45M
      if (!fetch_code (ins->info, ins->codep + 1))
8810
3.95k
  return ckp_fetch_error;
8811
6.45M
      newrex = 0;
8812
6.45M
      switch (*ins->codep)
8813
6.45M
  {
8814
  /* REX prefixes family.  */
8815
28.1k
  case 0x40:
8816
64.8k
  case 0x41:
8817
89.8k
  case 0x42:
8818
110k
  case 0x43:
8819
132k
  case 0x44:
8820
157k
  case 0x45:
8821
191k
  case 0x46:
8822
215k
  case 0x47:
8823
274k
  case 0x48:
8824
312k
  case 0x49:
8825
329k
  case 0x4a:
8826
341k
  case 0x4b:
8827
375k
  case 0x4c:
8828
398k
  case 0x4d:
8829
421k
  case 0x4e:
8830
481k
  case 0x4f:
8831
481k
    if (ins->address_mode == mode_64bit)
8832
434k
      newrex = *ins->codep;
8833
47.2k
    else
8834
47.2k
      return ckp_okay;
8835
434k
    ins->last_rex_prefix = i;
8836
434k
    break;
8837
  /* REX2 must be the last prefix. */
8838
52.3k
  case REX2_OPCODE:
8839
52.3k
    if (ins->address_mode == mode_64bit)
8840
49.6k
      {
8841
49.6k
        if (ins->last_rex_prefix >= 0)
8842
783
    return ckp_bogus;
8843
8844
48.8k
        ins->codep++;
8845
48.8k
        if (!fetch_code (ins->info, ins->codep + 1))
8846
140
    return ckp_fetch_error;
8847
48.6k
        ins->rex2_payload = *ins->codep;
8848
48.6k
        ins->rex2 = ins->rex2_payload >> 4;
8849
48.6k
        ins->rex = (ins->rex2_payload & 0xf) | REX_OPCODE;
8850
48.6k
        ins->codep++;
8851
48.6k
        ins->last_rex2_prefix = i;
8852
48.6k
        ins->all_prefixes[i] = REX2_OPCODE;
8853
48.6k
      }
8854
51.4k
    return ckp_okay;
8855
42.5k
  case 0xf3:
8856
42.5k
    ins->prefixes |= PREFIX_REPZ;
8857
42.5k
    ins->last_repz_prefix = i;
8858
42.5k
    break;
8859
50.3k
  case 0xf2:
8860
50.3k
    ins->prefixes |= PREFIX_REPNZ;
8861
50.3k
    ins->last_repnz_prefix = i;
8862
50.3k
    break;
8863
51.5k
  case 0xf0:
8864
51.5k
    ins->prefixes |= PREFIX_LOCK;
8865
51.5k
    ins->last_lock_prefix = i;
8866
51.5k
    break;
8867
58.8k
  case 0x2e:
8868
58.8k
    ins->prefixes |= PREFIX_CS;
8869
58.8k
    ins->last_seg_prefix = i;
8870
58.8k
    if (ins->address_mode != mode_64bit)
8871
15.2k
      ins->active_seg_prefix = PREFIX_CS;
8872
58.8k
    break;
8873
25.2k
  case 0x36:
8874
25.2k
    ins->prefixes |= PREFIX_SS;
8875
25.2k
    ins->last_seg_prefix = i;
8876
25.2k
    if (ins->address_mode != mode_64bit)
8877
5.40k
      ins->active_seg_prefix = PREFIX_SS;
8878
25.2k
    break;
8879
114k
  case 0x3e:
8880
114k
    ins->prefixes |= PREFIX_DS;
8881
114k
    ins->last_seg_prefix = i;
8882
114k
    if (ins->address_mode != mode_64bit)
8883
15.5k
      ins->active_seg_prefix = PREFIX_DS;
8884
114k
    break;
8885
38.3k
  case 0x26:
8886
38.3k
    ins->prefixes |= PREFIX_ES;
8887
38.3k
    ins->last_seg_prefix = i;
8888
38.3k
    if (ins->address_mode != mode_64bit)
8889
10.7k
      ins->active_seg_prefix = PREFIX_ES;
8890
38.3k
    break;
8891
79.3k
  case 0x64:
8892
79.3k
    ins->prefixes |= PREFIX_FS;
8893
79.3k
    ins->last_seg_prefix = i;
8894
79.3k
    ins->active_seg_prefix = PREFIX_FS;
8895
79.3k
    break;
8896
67.3k
  case 0x65:
8897
67.3k
    ins->prefixes |= PREFIX_GS;
8898
67.3k
    ins->last_seg_prefix = i;
8899
67.3k
    ins->active_seg_prefix = PREFIX_GS;
8900
67.3k
    break;
8901
86.1k
  case 0x66:
8902
86.1k
    ins->prefixes |= PREFIX_DATA;
8903
86.1k
    ins->last_data_prefix = i;
8904
86.1k
    break;
8905
103k
  case 0x67:
8906
103k
    ins->prefixes |= PREFIX_ADDR;
8907
103k
    ins->last_addr_prefix = i;
8908
103k
    break;
8909
23.3k
  case FWAIT_OPCODE:
8910
    /* fwait is really an instruction.  If there are prefixes
8911
       before the fwait, they belong to the fwait, *not* to the
8912
       following instruction.  */
8913
23.3k
    ins->fwait_prefix = i;
8914
23.3k
    if (ins->prefixes || ins->rex)
8915
8.98k
      {
8916
8.98k
        ins->prefixes |= PREFIX_FWAIT;
8917
8.98k
        ins->codep++;
8918
        /* This ensures that the previous REX prefixes are noticed
8919
     as unused prefixes, as in the return case below.  */
8920
8.98k
        return ins->rex ? ckp_bogus : ckp_okay;
8921
8.98k
      }
8922
14.3k
    ins->prefixes = PREFIX_FWAIT;
8923
14.3k
    break;
8924
5.17M
  default:
8925
5.17M
    return ckp_okay;
8926
6.45M
  }
8927
      /* Rex is ignored when followed by another prefix.  */
8928
1.16M
      if (ins->rex)
8929
129k
  return ckp_bogus;
8930
1.03M
      if (*ins->codep != FWAIT_OPCODE)
8931
1.02M
  ins->all_prefixes[i++] = *ins->codep;
8932
1.03M
      ins->rex = newrex;
8933
1.03M
      ins->codep++;
8934
1.03M
      length++;
8935
1.03M
    }
8936
3.76k
  return ckp_bogus;
8937
5.42M
}
8938
8939
/* Return the name of the prefix byte PREF, or NULL if PREF is not a
8940
   prefix byte.  */
8941
8942
static const char *
8943
prefix_name (enum address_mode mode, uint8_t pref, int sizeflag)
8944
665k
{
8945
665k
  static const char *rexes [16] =
8946
665k
    {
8947
665k
      "rex",    /* 0x40 */
8948
665k
      "rex.B",    /* 0x41 */
8949
665k
      "rex.X",    /* 0x42 */
8950
665k
      "rex.XB",   /* 0x43 */
8951
665k
      "rex.R",    /* 0x44 */
8952
665k
      "rex.RB",   /* 0x45 */
8953
665k
      "rex.RX",   /* 0x46 */
8954
665k
      "rex.RXB",  /* 0x47 */
8955
665k
      "rex.W",    /* 0x48 */
8956
665k
      "rex.WB",   /* 0x49 */
8957
665k
      "rex.WX",   /* 0x4a */
8958
665k
      "rex.WXB",  /* 0x4b */
8959
665k
      "rex.WR",   /* 0x4c */
8960
665k
      "rex.WRB",  /* 0x4d */
8961
665k
      "rex.WRX",  /* 0x4e */
8962
665k
      "rex.WRXB", /* 0x4f */
8963
665k
    };
8964
8965
665k
  switch (pref)
8966
665k
    {
8967
    /* REX prefixes family.  */
8968
17.6k
    case 0x40:
8969
27.8k
    case 0x41:
8970
43.3k
    case 0x42:
8971
54.0k
    case 0x43:
8972
64.3k
    case 0x44:
8973
75.8k
    case 0x45:
8974
95.1k
    case 0x46:
8975
109k
    case 0x47:
8976
128k
    case 0x48:
8977
146k
    case 0x49:
8978
157k
    case 0x4a:
8979
164k
    case 0x4b:
8980
181k
    case 0x4c:
8981
194k
    case 0x4d:
8982
208k
    case 0x4e:
8983
243k
    case 0x4f:
8984
243k
      return rexes [pref - 0x40];
8985
25.7k
    case 0xf3:
8986
25.7k
      return "repz";
8987
26.9k
    case 0xf2:
8988
26.9k
      return "repnz";
8989
40.4k
    case 0xf0:
8990
40.4k
      return "lock";
8991
39.5k
    case 0x2e:
8992
39.5k
      return "cs";
8993
17.9k
    case 0x36:
8994
17.9k
      return "ss";
8995
35.8k
    case 0x3e:
8996
35.8k
      return "ds";
8997
25.6k
    case 0x26:
8998
25.6k
      return "es";
8999
47.9k
    case 0x64:
9000
47.9k
      return "fs";
9001
32.4k
    case 0x65:
9002
32.4k
      return "gs";
9003
38.3k
    case 0x66:
9004
38.3k
      return (sizeflag & DFLAG) ? "data16" : "data32";
9005
57.1k
    case 0x67:
9006
57.1k
      if (mode == mode_64bit)
9007
39.3k
  return (sizeflag & AFLAG) ? "addr32" : "addr64";
9008
17.8k
      else
9009
17.8k
  return (sizeflag & AFLAG) ? "addr16" : "addr32";
9010
187
    case FWAIT_OPCODE:
9011
187
      return "fwait";
9012
717
    case REP_PREFIX:
9013
717
      return "rep";
9014
1.83k
    case XACQUIRE_PREFIX:
9015
1.83k
      return "xacquire";
9016
2.61k
    case XRELEASE_PREFIX:
9017
2.61k
      return "xrelease";
9018
2.23k
    case BND_PREFIX:
9019
2.23k
      return "bnd";
9020
2.18k
    case NOTRACK_PREFIX:
9021
2.18k
      return "notrack";
9022
24.1k
    case REX2_OPCODE:
9023
24.1k
      return "rex2";
9024
307
    default:
9025
307
      return NULL;
9026
665k
    }
9027
665k
}
9028
9029
void
9030
print_i386_disassembler_options (FILE *stream)
9031
0
{
9032
0
  fprintf (stream, _("\n\
9033
0
The following i386/x86-64 specific disassembler options are supported for use\n\
9034
0
with the -M switch (multiple options should be separated by commas):\n"));
9035
9036
0
  fprintf (stream, _("  x86-64      Disassemble in 64bit mode\n"));
9037
0
  fprintf (stream, _("  i386        Disassemble in 32bit mode\n"));
9038
0
  fprintf (stream, _("  i8086       Disassemble in 16bit mode\n"));
9039
0
  fprintf (stream, _("  att         Display instruction in AT&T syntax\n"));
9040
0
  fprintf (stream, _("  intel       Display instruction in Intel syntax\n"));
9041
0
  fprintf (stream, _("  att-mnemonic  (AT&T syntax only)\n"
9042
0
         "              Display instruction with AT&T mnemonic\n"));
9043
0
  fprintf (stream, _("  intel-mnemonic  (AT&T syntax only)\n"
9044
0
         "              Display instruction with Intel mnemonic\n"));
9045
0
  fprintf (stream, _("  addr64      Assume 64bit address size\n"));
9046
0
  fprintf (stream, _("  addr32      Assume 32bit address size\n"));
9047
0
  fprintf (stream, _("  addr16      Assume 16bit address size\n"));
9048
0
  fprintf (stream, _("  data32      Assume 32bit data size\n"));
9049
0
  fprintf (stream, _("  data16      Assume 16bit data size\n"));
9050
0
  fprintf (stream, _("  suffix      Always display instruction suffix in AT&T syntax\n"));
9051
0
  fprintf (stream, _("  amd64       Display instruction in AMD64 ISA\n"));
9052
0
  fprintf (stream, _("  intel64     Display instruction in Intel64 ISA\n"));
9053
0
  fprintf (stream, _("  annotate-immediates  Annotate immediate operands that match symbols\n"));
9054
0
}
9055
9056
/* Bad opcode.  */
9057
static const struct dis386 bad_opcode = { "(bad)", { XX }, 0 };
9058
9059
/* Fetch error indicator.  */
9060
static const struct dis386 err_opcode = { NULL, { XX }, 0 };
9061
9062
static const struct dis386 map5_f8_opcode = { X86_64_TABLE (X86_64_VEX_MAP5_F8) };
9063
static const struct dis386 map5_f9_opcode = { X86_64_TABLE (X86_64_VEX_MAP5_F9) };
9064
static const struct dis386 map5_fd_opcode = { X86_64_TABLE (X86_64_VEX_MAP5_FD) };
9065
static const struct dis386 map7_f6_opcode = { VEX_LEN_TABLE (VEX_LEN_MAP7_F6) };
9066
static const struct dis386 map7_f8_opcode = { VEX_LEN_TABLE (VEX_LEN_MAP7_F8) };
9067
9068
/* Get a pointer to struct dis386 with a valid name.  */
9069
9070
static const struct dis386 *
9071
get_valid_dis386 (const struct dis386 *dp, instr_info *ins)
9072
6.35M
{
9073
6.35M
  int vindex, vex_table_index;
9074
9075
6.35M
  if (dp->name != NULL)
9076
3.73M
    return dp;
9077
9078
2.62M
  switch (dp->op[0].bytemode)
9079
2.62M
    {
9080
762k
    case USE_REG_TABLE:
9081
762k
      dp = &reg_table[dp->op[1].bytemode][ins->modrm.reg];
9082
762k
      break;
9083
9084
61.4k
    case USE_MOD_TABLE:
9085
61.4k
      vindex = ins->modrm.mod == 0x3 ? 1 : 0;
9086
61.4k
      dp = &mod_table[dp->op[1].bytemode][vindex];
9087
61.4k
      break;
9088
9089
7.87k
    case USE_RM_TABLE:
9090
7.87k
      dp = &rm_table[dp->op[1].bytemode][ins->modrm.rm];
9091
7.87k
      break;
9092
9093
126k
    case USE_PREFIX_TABLE:
9094
127k
    use_prefix_table:
9095
127k
      if (ins->need_vex)
9096
62.9k
  {
9097
    /* The prefix in VEX is implicit.  */
9098
62.9k
    switch (ins->vex.prefix)
9099
62.9k
      {
9100
14.2k
      case 0:
9101
14.2k
        vindex = 0;
9102
14.2k
        break;
9103
16.1k
      case REPE_PREFIX_OPCODE:
9104
16.1k
        vindex = 1;
9105
16.1k
        break;
9106
18.6k
      case DATA_PREFIX_OPCODE:
9107
18.6k
        vindex = 2;
9108
18.6k
        break;
9109
13.9k
      case REPNE_PREFIX_OPCODE:
9110
13.9k
        vindex = 3;
9111
13.9k
        break;
9112
0
      default:
9113
0
        abort ();
9114
0
        break;
9115
62.9k
      }
9116
62.9k
  }
9117
64.3k
      else
9118
64.3k
  {
9119
64.3k
    int last_prefix = -1;
9120
64.3k
    int prefix = 0;
9121
64.3k
    vindex = 0;
9122
    /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
9123
       When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
9124
       last one wins.  */
9125
64.3k
    if ((ins->prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
9126
10.9k
      {
9127
10.9k
        if (ins->last_repz_prefix > ins->last_repnz_prefix)
9128
5.34k
    {
9129
5.34k
      vindex = 1;
9130
5.34k
      prefix = PREFIX_REPZ;
9131
5.34k
      last_prefix = ins->last_repz_prefix;
9132
5.34k
    }
9133
5.61k
        else
9134
5.61k
    {
9135
5.61k
      vindex = 3;
9136
5.61k
      prefix = PREFIX_REPNZ;
9137
5.61k
      last_prefix = ins->last_repnz_prefix;
9138
5.61k
    }
9139
9140
        /* Check if prefix should be ignored.  */
9141
10.9k
        if ((((prefix_table[dp->op[1].bytemode][vindex].prefix_requirement
9142
10.9k
         & PREFIX_IGNORED) >> PREFIX_IGNORED_SHIFT)
9143
10.9k
       & prefix) != 0
9144
2.70k
      && !prefix_table[dp->op[1].bytemode][vindex].name)
9145
563
    vindex = 0;
9146
10.9k
      }
9147
9148
64.3k
    if (vindex == 0 && (ins->prefixes & PREFIX_DATA) != 0)
9149
8.21k
      {
9150
8.21k
        vindex = 2;
9151
8.21k
        prefix = PREFIX_DATA;
9152
8.21k
        last_prefix = ins->last_data_prefix;
9153
8.21k
      }
9154
9155
64.3k
    if (vindex != 0)
9156
18.6k
      {
9157
18.6k
        ins->used_prefixes |= prefix;
9158
18.6k
        ins->all_prefixes[last_prefix] = 0;
9159
18.6k
      }
9160
64.3k
  }
9161
127k
      dp = &prefix_table[dp->op[1].bytemode][vindex];
9162
127k
      break;
9163
9164
3.94k
    case USE_X86_64_EVEX_FROM_VEX_TABLE:
9165
6.05k
    case USE_X86_64_EVEX_PFX_TABLE:
9166
7.37k
    case USE_X86_64_EVEX_W_TABLE:
9167
8.67k
    case USE_X86_64_EVEX_MEM_W_TABLE:
9168
8.67k
      ins->evex_type = evex_from_vex;
9169
      /* EVEX from VEX instructions are 64-bit only and require that EVEX.z,
9170
   EVEX.L'L, EVEX.b, and the lower 2 bits of EVEX.aaa must be 0.  */
9171
8.67k
      if (ins->address_mode != mode_64bit
9172
7.91k
    || (ins->vex.mask_register_specifier & 0x3) != 0
9173
6.77k
    || ins->vex.ll != 0
9174
6.31k
    || ins->vex.zeroing != 0
9175
5.97k
    || ins->vex.b)
9176
3.10k
  return &bad_opcode;
9177
9178
5.57k
      if (dp->op[0].bytemode == USE_X86_64_EVEX_PFX_TABLE)
9179
1.04k
  goto use_prefix_table;
9180
4.53k
      if (dp->op[0].bytemode == USE_X86_64_EVEX_W_TABLE)
9181
918
  goto use_vex_w_table;
9182
3.61k
      if (dp->op[0].bytemode == USE_X86_64_EVEX_MEM_W_TABLE)
9183
852
  {
9184
852
    if (ins->modrm.mod == 3)
9185
577
      return &bad_opcode;
9186
275
    goto use_vex_w_table;
9187
852
  }
9188
9189
      /* Fall through.  */
9190
668k
    case USE_X86_64_TABLE:
9191
668k
      vindex = ins->address_mode == mode_64bit ? 1 : 0;
9192
668k
      dp = &x86_64_table[dp->op[1].bytemode][vindex];
9193
668k
      break;
9194
9195
6.86k
    case USE_3BYTE_TABLE:
9196
6.86k
      if (ins->last_rex2_prefix >= 0)
9197
1.12k
  return &err_opcode;
9198
5.74k
      if (!fetch_code (ins->info, ins->codep + 2))
9199
78
  return &err_opcode;
9200
5.66k
      vindex = *ins->codep++;
9201
5.66k
      dp = &three_byte_table[dp->op[1].bytemode][vindex];
9202
5.66k
      ins->end_codep = ins->codep;
9203
5.66k
      if (!fetch_modrm (ins))
9204
0
  return &err_opcode;
9205
5.66k
      break;
9206
9207
22.0k
    case USE_VEX_LEN_TABLE:
9208
22.0k
      if (!ins->need_vex)
9209
0
  abort ();
9210
9211
22.0k
      switch (ins->vex.length)
9212
22.0k
  {
9213
16.1k
  case 128:
9214
16.1k
    vindex = 0;
9215
16.1k
    break;
9216
735
  case 512:
9217
    /* This allows re-using in particular table entries where only
9218
       128-bit operand size (VEX.L=0 / EVEX.L'L=0) are valid.  */
9219
735
    if (ins->vex.evex)
9220
735
      {
9221
5.94k
  case 256:
9222
5.94k
        vindex = 1;
9223
5.94k
        break;
9224
735
      }
9225
  /* Fall through.  */
9226
0
  default:
9227
0
    abort ();
9228
0
    break;
9229
22.0k
  }
9230
9231
22.0k
      dp = &vex_len_table[dp->op[1].bytemode][vindex];
9232
22.0k
      break;
9233
9234
4.36k
    case USE_EVEX_LEN_TABLE:
9235
4.36k
      if (!ins->vex.evex)
9236
0
  abort ();
9237
9238
4.36k
      switch (ins->vex.length)
9239
4.36k
  {
9240
1.10k
  case 128:
9241
1.10k
    vindex = 0;
9242
1.10k
    break;
9243
946
  case 256:
9244
946
    vindex = 1;
9245
946
    break;
9246
2.30k
  case 512:
9247
2.30k
    vindex = 2;
9248
2.30k
    break;
9249
0
  default:
9250
0
    abort ();
9251
0
    break;
9252
4.36k
  }
9253
9254
4.36k
      dp = &evex_len_table[dp->op[1].bytemode][vindex];
9255
4.36k
      break;
9256
9257
26.2k
    case USE_XOP_8F_TABLE:
9258
26.2k
      if (!fetch_code (ins->info, ins->codep + 3))
9259
182
  return &err_opcode;
9260
26.0k
      ins->rex = ~(*ins->codep >> 5) & 0x7;
9261
9262
      /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm".  */
9263
26.0k
      switch ((*ins->codep & 0x1f))
9264
26.0k
  {
9265
18.8k
  default:
9266
18.8k
    dp = &bad_opcode;
9267
18.8k
    return dp;
9268
2.27k
  case 0x8:
9269
2.27k
    vex_table_index = XOP_08;
9270
2.27k
    break;
9271
3.10k
  case 0x9:
9272
3.10k
    vex_table_index = XOP_09;
9273
3.10k
    break;
9274
1.84k
  case 0xa:
9275
1.84k
    vex_table_index = XOP_0A;
9276
1.84k
    break;
9277
26.0k
  }
9278
7.22k
      ins->codep++;
9279
7.22k
      ins->vex.w = *ins->codep & 0x80;
9280
7.22k
      if (ins->vex.w && ins->address_mode == mode_64bit)
9281
2.24k
  ins->rex |= REX_W;
9282
9283
7.22k
      ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf;
9284
7.22k
      if (ins->address_mode != mode_64bit)
9285
1.95k
  {
9286
    /* In 16/32-bit mode REX_B is silently ignored.  */
9287
1.95k
    ins->rex &= ~REX_B;
9288
1.95k
  }
9289
9290
7.22k
      ins->vex.length = (*ins->codep & 0x4) ? 256 : 128;
9291
7.22k
      switch ((*ins->codep & 0x3))
9292
7.22k
  {
9293
5.26k
  case 0:
9294
5.26k
    break;
9295
715
  case 1:
9296
715
    ins->vex.prefix = DATA_PREFIX_OPCODE;
9297
715
    break;
9298
731
  case 2:
9299
731
    ins->vex.prefix = REPE_PREFIX_OPCODE;
9300
731
    break;
9301
521
  case 3:
9302
521
    ins->vex.prefix = REPNE_PREFIX_OPCODE;
9303
521
    break;
9304
7.22k
  }
9305
7.22k
      ins->need_vex = 3;
9306
7.22k
      ins->codep++;
9307
7.22k
      vindex = *ins->codep++;
9308
7.22k
      dp = &xop_table[vex_table_index][vindex];
9309
9310
7.22k
      ins->end_codep = ins->codep;
9311
7.22k
      if (!fetch_modrm (ins))
9312
366
  return &err_opcode;
9313
9314
      /* No XOP encoding so far allows for a non-zero embedded prefix. Avoid
9315
   having to decode the bits for every otherwise valid encoding.  */
9316
6.86k
      if (ins->vex.prefix)
9317
1.74k
  return &bad_opcode;
9318
5.11k
      break;
9319
9320
58.2k
    case USE_VEX_C4_TABLE:
9321
      /* VEX prefix.  */
9322
58.2k
      if (!fetch_code (ins->info, ins->codep + 3))
9323
295
  return &err_opcode;
9324
57.9k
      ins->rex = ~(*ins->codep >> 5) & 0x7;
9325
57.9k
      switch ((*ins->codep & 0x1f))
9326
57.9k
  {
9327
26.7k
  default:
9328
26.7k
    dp = &bad_opcode;
9329
26.7k
    return dp;
9330
3.78k
  case 0x1:
9331
3.78k
    vex_table_index = VEX_0F;
9332
3.78k
    break;
9333
15.7k
  case 0x2:
9334
15.7k
    vex_table_index = VEX_0F38;
9335
15.7k
    break;
9336
6.12k
  case 0x3:
9337
6.12k
    vex_table_index = VEX_0F3A;
9338
6.12k
    break;
9339
3.97k
  case 0x5:
9340
3.97k
    vex_table_index = VEX_MAP5;
9341
3.97k
    break;
9342
1.55k
  case 0x7:
9343
1.55k
    vex_table_index = VEX_MAP7;
9344
1.55k
    break;
9345
57.9k
  }
9346
31.1k
      ins->codep++;
9347
31.1k
      ins->vex.w = *ins->codep & 0x80;
9348
31.1k
      if (ins->address_mode == mode_64bit)
9349
24.7k
  {
9350
24.7k
    if (ins->vex.w)
9351
7.98k
      ins->rex |= REX_W;
9352
24.7k
  }
9353
6.41k
      else
9354
6.41k
  {
9355
    /* For the 3-byte VEX prefix in 32-bit mode, the REX_B bit
9356
       is ignored, other REX bits are 0 and the highest bit in
9357
       VEX.vvvv is also ignored (but we mustn't clear it here).  */
9358
6.41k
    ins->rex = 0;
9359
6.41k
  }
9360
31.1k
      ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf;
9361
31.1k
      ins->vex.length = (*ins->codep & 0x4) ? 256 : 128;
9362
31.1k
      switch ((*ins->codep & 0x3))
9363
31.1k
  {
9364
11.6k
  case 0:
9365
11.6k
    break;
9366
8.01k
  case 1:
9367
8.01k
    ins->vex.prefix = DATA_PREFIX_OPCODE;
9368
8.01k
    break;
9369
6.11k
  case 2:
9370
6.11k
    ins->vex.prefix = REPE_PREFIX_OPCODE;
9371
6.11k
    break;
9372
5.36k
  case 3:
9373
5.36k
    ins->vex.prefix = REPNE_PREFIX_OPCODE;
9374
5.36k
    break;
9375
31.1k
  }
9376
31.1k
      ins->need_vex = 3;
9377
31.1k
      ins->codep++;
9378
31.1k
      vindex = *ins->codep++;
9379
31.1k
      ins->condition_code = vindex & 0xf;
9380
31.1k
      if (vex_table_index != VEX_MAP7 && vex_table_index != VEX_MAP5)
9381
25.6k
  dp = &vex_table[vex_table_index][vindex];
9382
5.53k
      else if (vindex == 0xf6)
9383
542
  dp = &map7_f6_opcode;
9384
4.99k
      else if (vindex == 0xf8)
9385
1.85k
  {
9386
1.85k
    if (vex_table_index == VEX_MAP5)
9387
1.13k
      dp = &map5_f8_opcode;
9388
717
    else
9389
717
      dp = &map7_f8_opcode;
9390
1.85k
  }
9391
3.14k
      else if (vindex == 0xf9)
9392
259
  dp = &map5_f9_opcode;
9393
2.88k
      else if (vindex == 0xfd)
9394
548
  dp = &map5_fd_opcode;
9395
2.33k
      else
9396
2.33k
  dp = &bad_opcode;
9397
31.1k
      ins->end_codep = ins->codep;
9398
      /* There is no MODRM byte for VEX0F 77.  */
9399
31.1k
      if ((vex_table_index != VEX_0F || vindex != 0x77)
9400
30.7k
    && !fetch_modrm (ins))
9401
771
  return &err_opcode;
9402
30.3k
      break;
9403
9404
30.3k
    case USE_VEX_C5_TABLE:
9405
      /* VEX prefix.  */
9406
29.6k
      if (!fetch_code (ins->info, ins->codep + 2))
9407
221
  return &err_opcode;
9408
29.4k
      ins->rex = (*ins->codep & 0x80) ? 0 : REX_R;
9409
9410
      /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in
9411
   VEX.vvvv is 1.  */
9412
29.4k
      ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf;
9413
29.4k
      ins->vex.length = (*ins->codep & 0x4) ? 256 : 128;
9414
29.4k
      switch ((*ins->codep & 0x3))
9415
29.4k
  {
9416
5.29k
  case 0:
9417
5.29k
    break;
9418
15.3k
  case 1:
9419
15.3k
    ins->vex.prefix = DATA_PREFIX_OPCODE;
9420
15.3k
    break;
9421
2.75k
  case 2:
9422
2.75k
    ins->vex.prefix = REPE_PREFIX_OPCODE;
9423
2.75k
    break;
9424
6.02k
  case 3:
9425
6.02k
    ins->vex.prefix = REPNE_PREFIX_OPCODE;
9426
6.02k
    break;
9427
29.4k
  }
9428
29.4k
      ins->need_vex = 2;
9429
29.4k
      ins->codep++;
9430
29.4k
      vindex = *ins->codep++;
9431
29.4k
      dp = &vex_table[VEX_0F][vindex];
9432
29.4k
      ins->end_codep = ins->codep;
9433
      /* There is no MODRM byte for VEX 77.  */
9434
29.4k
      if (vindex != 0x77 && !fetch_modrm (ins))
9435
311
  return &err_opcode;
9436
29.1k
      break;
9437
9438
29.1k
    case USE_VEX_W_TABLE:
9439
29.1k
    use_vex_w_table:
9440
29.1k
      if (!ins->need_vex)
9441
0
  abort ();
9442
9443
29.1k
      dp = &vex_w_table[dp->op[1].bytemode][ins->vex.w];
9444
29.1k
      break;
9445
9446
141k
    case USE_EVEX_TABLE:
9447
141k
      ins->two_source_ops = false;
9448
      /* EVEX prefix.  */
9449
141k
      ins->vex.evex = true;
9450
141k
      if (!fetch_code (ins->info, ins->codep + 4))
9451
473
  return &err_opcode;
9452
      /* The first byte after 0x62.  */
9453
140k
      if (*ins->codep & 0x8)
9454
25.9k
  ins->rex2 |= REX_B;
9455
140k
      if (!(*ins->codep & 0x10))
9456
74.2k
  ins->rex2 |= REX_R;
9457
9458
140k
      ins->rex = ~(*ins->codep >> 5) & 0x7;
9459
140k
      switch (*ins->codep & 0x7)
9460
140k
  {
9461
7.97k
  default:
9462
7.97k
    return &bad_opcode;
9463
23.7k
  case 0x1:
9464
23.7k
    vex_table_index = EVEX_0F;
9465
23.7k
    break;
9466
40.2k
  case 0x2:
9467
40.2k
    vex_table_index = EVEX_0F38;
9468
40.2k
    break;
9469
15.8k
  case 0x3:
9470
15.8k
    vex_table_index = EVEX_0F3A;
9471
15.8k
    break;
9472
23.1k
  case 0x4:
9473
23.1k
    vex_table_index = EVEX_MAP4;
9474
23.1k
    ins->evex_type = evex_from_legacy;
9475
23.1k
    if (ins->address_mode != mode_64bit)
9476
794
      return &bad_opcode;
9477
22.3k
    ins->rex |= REX_OPCODE;
9478
22.3k
    break;
9479
11.3k
  case 0x5:
9480
11.3k
    vex_table_index = EVEX_MAP5;
9481
11.3k
    break;
9482
13.8k
  case 0x6:
9483
13.8k
    vex_table_index = EVEX_MAP6;
9484
13.8k
    break;
9485
4.67k
  case 0x7:
9486
4.67k
    vex_table_index = EVEX_MAP7;
9487
4.67k
    break;
9488
140k
  }
9489
9490
      /* The second byte after 0x62.  */
9491
132k
      ins->codep++;
9492
132k
      ins->vex.w = *ins->codep & 0x80;
9493
132k
      if (ins->vex.w && ins->address_mode == mode_64bit)
9494
47.3k
  ins->rex |= REX_W;
9495
9496
132k
      ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf;
9497
9498
132k
      if (!(*ins->codep & 0x4))
9499
32.8k
  ins->rex2 |= REX_X;
9500
9501
132k
      switch ((*ins->codep & 0x3))
9502
132k
  {
9503
36.0k
  case 0:
9504
36.0k
    break;
9505
34.4k
  case 1:
9506
34.4k
    ins->vex.prefix = DATA_PREFIX_OPCODE;
9507
34.4k
    break;
9508
35.8k
  case 2:
9509
35.8k
    ins->vex.prefix = REPE_PREFIX_OPCODE;
9510
35.8k
    break;
9511
25.8k
  case 3:
9512
25.8k
    ins->vex.prefix = REPNE_PREFIX_OPCODE;
9513
25.8k
    break;
9514
132k
  }
9515
9516
      /* The third byte after 0x62.  */
9517
132k
      ins->codep++;
9518
9519
      /* Remember the static rounding bits.  */
9520
132k
      ins->vex.ll = (*ins->codep >> 5) & 3;
9521
132k
      ins->vex.b = *ins->codep & 0x10;
9522
9523
132k
      ins->vex.v = *ins->codep & 0x8;
9524
132k
      ins->vex.mask_register_specifier = *ins->codep & 0x7;
9525
132k
      ins->vex.scc = *ins->codep & 0xf;
9526
132k
      ins->vex.zeroing = *ins->codep & 0x80;
9527
      /* Set the NF bit for EVEX-Promoted instructions, this bit will be cleared
9528
   when it's an evex_default one.  */
9529
132k
      ins->vex.nf = *ins->codep & 0x4;
9530
9531
132k
      if (ins->address_mode != mode_64bit)
9532
10.7k
  {
9533
    /* Report bad for !evex_default and when two fixed values of evex
9534
       change.  */
9535
10.7k
    if (ins->evex_type != evex_default
9536
10.7k
        || (ins->rex2 & (REX_B | REX_X)))
9537
1.51k
      return &bad_opcode;
9538
    /* In 16/32-bit mode silently ignore following bits.  */
9539
9.25k
    ins->rex &= ~REX_B;
9540
9.25k
    ins->rex2 &= ~REX_R;
9541
9.25k
  }
9542
9543
130k
      ins->need_vex = 4;
9544
9545
130k
      ins->codep++;
9546
130k
      vindex = *ins->codep++;
9547
130k
      ins->condition_code = vindex & 0xf;
9548
130k
      if (vex_table_index != EVEX_MAP7)
9549
126k
  dp = &evex_table[vex_table_index][vindex];
9550
4.18k
      else if (vindex == 0xf8)
9551
348
  dp = &map7_f8_opcode;
9552
3.83k
      else if (vindex == 0xf6)
9553
647
  dp = &map7_f6_opcode;
9554
3.18k
      else
9555
3.18k
  dp = &bad_opcode;
9556
130k
      ins->end_codep = ins->codep;
9557
130k
      if (!fetch_modrm (ins))
9558
948
  return &err_opcode;
9559
9560
129k
      if (ins->modrm.mod == 3 && (ins->rex2 & REX_X))
9561
4.54k
  return &bad_opcode;
9562
9563
      /* Set vector length. For EVEX-promoted instructions, evex.ll == 0b00,
9564
   which has the same encoding as vex.length == 128 and they can share
9565
   the same processing with vex.length in OP_VEX.  */
9566
125k
      if (ins->modrm.mod == 3 && ins->vex.b && ins->evex_type != evex_from_legacy)
9567
12.8k
  ins->vex.length = 512;
9568
112k
      else
9569
112k
  {
9570
112k
    switch (ins->vex.ll)
9571
112k
      {
9572
40.1k
      case 0x0:
9573
40.1k
        ins->vex.length = 128;
9574
40.1k
        break;
9575
27.3k
      case 0x1:
9576
27.3k
        ins->vex.length = 256;
9577
27.3k
        break;
9578
32.6k
      case 0x2:
9579
32.6k
        ins->vex.length = 512;
9580
32.6k
        break;
9581
12.0k
      default:
9582
12.0k
        return &bad_opcode;
9583
112k
      }
9584
112k
  }
9585
112k
      break;
9586
9587
674k
    case 0:
9588
674k
      dp = &bad_opcode;
9589
674k
      break;
9590
9591
0
    default:
9592
0
      abort ();
9593
2.62M
    }
9594
9595
2.54M
  if (dp->name != NULL)
9596
1.38M
    return dp;
9597
1.15M
  else
9598
1.15M
    return get_valid_dis386 (dp, ins);
9599
2.54M
}
9600
9601
static bool
9602
get_sib (instr_info *ins, int sizeflag)
9603
5.26M
{
9604
  /* If modrm.mod == 3, operand must be register.  */
9605
5.26M
  if (ins->need_modrm
9606
3.15M
      && ((sizeflag & AFLAG) || ins->address_mode == mode_64bit)
9607
2.93M
      && ins->modrm.mod != 3
9608
2.14M
      && ins->modrm.rm == 4)
9609
143k
    {
9610
143k
      if (!fetch_code (ins->info, ins->codep + 2))
9611
1.87k
  return false;
9612
141k
      ins->sib.index = (ins->codep[1] >> 3) & 7;
9613
141k
      ins->sib.scale = (ins->codep[1] >> 6) & 3;
9614
141k
      ins->sib.base = ins->codep[1] & 7;
9615
141k
      ins->has_sib = true;
9616
141k
    }
9617
5.11M
  else
9618
5.11M
    ins->has_sib = false;
9619
9620
5.25M
  return true;
9621
5.26M
}
9622
9623
/* Like oappend_with_style (below) but always with text style.  */
9624
9625
static void
9626
oappend (instr_info *ins, const char *s)
9627
1.95M
{
9628
1.95M
  oappend_with_style (ins, s, dis_style_text);
9629
1.95M
}
9630
9631
/* Like oappend (above), but S is a string starting with '%'.  In
9632
   Intel syntax, the '%' is elided.  */
9633
9634
static void
9635
oappend_register (instr_info *ins, const char *s)
9636
6.42M
{
9637
6.42M
  oappend_with_style (ins, s + ins->intel_syntax, dis_style_register);
9638
6.42M
}
9639
9640
/* Wrap around a call to INS->info->fprintf_styled_func, printing FMT.
9641
   STYLE is the default style to use in the fprintf_styled_func calls,
9642
   however, FMT might include embedded style markers (see oappend_style),
9643
   these embedded markers are not printed, but instead change the style
9644
   used in the next fprintf_styled_func call.  */
9645
9646
static void ATTRIBUTE_PRINTF_3
9647
i386_dis_printf (const disassemble_info *info, enum disassembler_style style,
9648
     const char *fmt, ...)
9649
15.9M
{
9650
15.9M
  va_list ap;
9651
15.9M
  enum disassembler_style curr_style = style;
9652
15.9M
  const char *start, *curr;
9653
15.9M
  char staging_area[50];
9654
9655
15.9M
  va_start (ap, fmt);
9656
  /* In particular print_insn()'s processing of op_txt[] can hand rather long
9657
     strings here.  Bypass vsnprintf() in such cases to avoid capacity issues
9658
     with the staging area.  */
9659
15.9M
  if (strcmp (fmt, "%s"))
9660
9.07M
    {
9661
9.07M
      int res = vsnprintf (staging_area, sizeof (staging_area), fmt, ap);
9662
9663
9.07M
      va_end (ap);
9664
9665
9.07M
      if (res < 0)
9666
0
  return;
9667
9668
9.07M
      if ((size_t) res >= sizeof (staging_area))
9669
0
  abort ();
9670
9671
9.07M
      start = curr = staging_area;
9672
9.07M
    }
9673
6.89M
  else
9674
6.89M
    {
9675
6.89M
      start = curr = va_arg (ap, const char *);
9676
6.89M
      va_end (ap);
9677
6.89M
    }
9678
9679
15.9M
  do
9680
110M
    {
9681
110M
      if (*curr == '\0'
9682
94.9M
    || (*curr == STYLE_MARKER_CHAR
9683
94.9M
        && ISXDIGIT (*(curr + 1))
9684
14.4M
        && *(curr + 2) == STYLE_MARKER_CHAR))
9685
30.3M
  {
9686
    /* Output content between our START position and CURR.  */
9687
30.3M
    int len = curr - start;
9688
30.3M
    int n = (*info->fprintf_styled_func) (info->stream, curr_style,
9689
30.3M
            "%.*s", len, start);
9690
30.3M
    if (n < 0)
9691
0
      break;
9692
9693
30.3M
    if (*curr == '\0')
9694
15.9M
      break;
9695
9696
    /* Skip over the initial STYLE_MARKER_CHAR.  */
9697
14.4M
    ++curr;
9698
9699
    /* Update the CURR_STYLE.  As there are less than 16 styles, it
9700
       is possible, that if the input is corrupted in some way, that
9701
       we might set CURR_STYLE to an invalid value.  Don't worry
9702
       though, we check for this situation.  */
9703
14.4M
    if (*curr >= '0' && *curr <= '9')
9704
14.4M
      curr_style = (enum disassembler_style) (*curr - '0');
9705
0
    else if (*curr >= 'a' && *curr <= 'f')
9706
0
      curr_style = (enum disassembler_style) (*curr - 'a' + 10);
9707
0
    else
9708
0
      curr_style = dis_style_text;
9709
9710
    /* Check for an invalid style having been selected.  This should
9711
       never happen, but it doesn't hurt to be a little paranoid.  */
9712
14.4M
    if (curr_style > dis_style_comment_start)
9713
0
      curr_style = dis_style_text;
9714
9715
    /* Skip the hex character, and the closing STYLE_MARKER_CHAR.  */
9716
14.4M
    curr += 2;
9717
9718
    /* Reset the START to after the style marker.  */
9719
14.4M
    start = curr;
9720
14.4M
  }
9721
80.5M
      else
9722
80.5M
  ++curr;
9723
110M
    }
9724
15.9M
  while (true);
9725
15.9M
}
9726
9727
static int
9728
print_insn (bfd_vma pc, disassemble_info *info, int intel_syntax)
9729
5.42M
{
9730
5.42M
  const struct dis386 *dp;
9731
5.42M
  int i;
9732
5.42M
  int ret;
9733
5.42M
  char *op_txt[MAX_OPERANDS];
9734
5.42M
  int needcomma;
9735
5.42M
  bool intel_swap_2_3;
9736
5.42M
  int sizeflag, orig_sizeflag;
9737
5.42M
  const char *p;
9738
5.42M
  struct dis_private priv;
9739
5.42M
  int prefix_length;
9740
5.42M
  int op_count;
9741
5.42M
  instr_info ins = {
9742
5.42M
    .info = info,
9743
5.42M
    .intel_syntax = intel_syntax >= 0
9744
5.42M
        ? intel_syntax
9745
5.42M
        : (info->mach & bfd_mach_i386_intel_syntax) != 0,
9746
5.42M
    .intel_mnemonic = !SYSV386_COMPAT,
9747
5.42M
    .op_index[0 ... MAX_OPERANDS - 1] = -1,
9748
5.42M
    .start_pc = pc,
9749
5.42M
    .start_codep = priv.the_buffer,
9750
5.42M
    .codep = priv.the_buffer,
9751
5.42M
    .obufp = ins.obuf,
9752
5.42M
    .last_lock_prefix = -1,
9753
5.42M
    .last_repz_prefix = -1,
9754
5.42M
    .last_repnz_prefix = -1,
9755
5.42M
    .last_data_prefix = -1,
9756
5.42M
    .last_addr_prefix = -1,
9757
5.42M
    .last_rex_prefix = -1,
9758
5.42M
    .last_rex2_prefix = -1,
9759
5.42M
    .last_seg_prefix = -1,
9760
5.42M
    .fwait_prefix = -1,
9761
5.42M
  };
9762
5.42M
  char op_out[MAX_OPERANDS][MAX_OPERAND_BUFFER_SIZE];
9763
5.42M
  char cm_out[MAX_OPERANDS][COMMENT_BUFFER_SIZE];
9764
9765
5.42M
  priv.orig_sizeflag = AFLAG | DFLAG;
9766
5.42M
  if ((info->mach & bfd_mach_i386_i386) != 0)
9767
613k
    ins.address_mode = mode_32bit;
9768
4.81M
  else if (info->mach == bfd_mach_i386_i8086)
9769
336k
    {
9770
336k
      ins.address_mode = mode_16bit;
9771
336k
      priv.orig_sizeflag = 0;
9772
336k
    }
9773
4.47M
  else
9774
4.47M
    ins.address_mode = mode_64bit;
9775
9776
6.10M
  for (p = info->disassembler_options; p != NULL;)
9777
681k
    {
9778
681k
      if (startswith (p, "amd64"))
9779
1.68k
  ins.isa64 = amd64;
9780
679k
      else if (startswith (p, "intel64"))
9781
9.64k
  ins.isa64 = intel64;
9782
669k
      else if (startswith (p, "x86-64"))
9783
1.50k
  {
9784
1.50k
    ins.address_mode = mode_64bit;
9785
1.50k
    priv.orig_sizeflag |= AFLAG | DFLAG;
9786
1.50k
  }
9787
668k
      else if (startswith (p, "i386"))
9788
2.47k
  {
9789
2.47k
    ins.address_mode = mode_32bit;
9790
2.47k
    priv.orig_sizeflag |= AFLAG | DFLAG;
9791
2.47k
  }
9792
665k
      else if (startswith (p, "i8086"))
9793
26.1k
  {
9794
26.1k
    ins.address_mode = mode_16bit;
9795
26.1k
    priv.orig_sizeflag &= ~(AFLAG | DFLAG);
9796
26.1k
  }
9797
639k
      else if (startswith (p, "intel"))
9798
69.1k
  {
9799
69.1k
    if (startswith (p + 5, "-mnemonic"))
9800
562
      ins.intel_mnemonic = true;
9801
68.6k
    else
9802
68.6k
      ins.intel_syntax = 1;
9803
69.1k
  }
9804
570k
      else if (startswith (p, "att"))
9805
4.95k
  {
9806
4.95k
    ins.intel_syntax = 0;
9807
4.95k
    if (startswith (p + 3, "-mnemonic"))
9808
262
      ins.intel_mnemonic = false;
9809
4.95k
  }
9810
565k
      else if (startswith (p, "addr"))
9811
30.6k
  {
9812
30.6k
    if (ins.address_mode == mode_64bit)
9813
25.6k
      {
9814
25.6k
        if (p[4] == '3' && p[5] == '2')
9815
2.96k
    priv.orig_sizeflag &= ~AFLAG;
9816
22.6k
        else if (p[4] == '6' && p[5] == '4')
9817
386
    priv.orig_sizeflag |= AFLAG;
9818
25.6k
      }
9819
5.01k
    else
9820
5.01k
      {
9821
5.01k
        if (p[4] == '1' && p[5] == '6')
9822
590
    priv.orig_sizeflag &= ~AFLAG;
9823
4.42k
        else if (p[4] == '3' && p[5] == '2')
9824
1.71k
    priv.orig_sizeflag |= AFLAG;
9825
5.01k
      }
9826
30.6k
  }
9827
534k
      else if (startswith (p, "data"))
9828
20.0k
  {
9829
20.0k
    if (p[4] == '1' && p[5] == '6')
9830
13.4k
      priv.orig_sizeflag &= ~DFLAG;
9831
6.66k
    else if (p[4] == '3' && p[5] == '2')
9832
384
      priv.orig_sizeflag |= DFLAG;
9833
20.0k
  }
9834
514k
      else if (startswith (p, "suffix"))
9835
72.6k
  priv.orig_sizeflag |= SUFFIX_ALWAYS;
9836
442k
      else if (startswith (p, "annotate"))
9837
978
  ins.annotate_immediates = true;
9838
9839
681k
      p = strchr (p, ',');
9840
681k
      if (p != NULL)
9841
217k
  p++;
9842
681k
    }
9843
9844
5.42M
  if (ins.address_mode == mode_64bit && sizeof (bfd_vma) < 8)
9845
0
    {
9846
0
      i386_dis_printf (info, dis_style_text, _("64-bit address is disabled"));
9847
0
      return -1;
9848
0
    }
9849
9850
5.42M
  if (ins.intel_syntax)
9851
1.20M
    {
9852
1.20M
      ins.open_char = '[';
9853
1.20M
      ins.close_char = ']';
9854
1.20M
      ins.separator_char = '+';
9855
1.20M
      ins.scale_char = '*';
9856
1.20M
    }
9857
4.22M
  else
9858
4.22M
    {
9859
4.22M
      ins.open_char = '(';
9860
4.22M
      ins.close_char =  ')';
9861
4.22M
      ins.separator_char = ',';
9862
4.22M
      ins.scale_char = ',';
9863
4.22M
    }
9864
9865
  /* The output looks better if we put 7 bytes on a line, since that
9866
     puts most long word instructions on a single line.  */
9867
5.42M
  info->bytes_per_line = 7;
9868
9869
5.42M
  info->private_data = &priv;
9870
5.42M
  priv.fetched = 0;
9871
5.42M
  priv.insn_start = pc;
9872
9873
32.5M
  for (i = 0; i < MAX_OPERANDS; ++i)
9874
27.1M
    {
9875
27.1M
      op_out[i][0] = 0;
9876
27.1M
      ins.op_out[i] = op_out[i];
9877
27.1M
      cm_out[i][0] = 0;
9878
27.1M
      ins.cm_out[i] = cm_out[i];
9879
27.1M
    }
9880
9881
5.42M
  sizeflag = priv.orig_sizeflag;
9882
9883
5.42M
  switch (ckprefix (&ins))
9884
5.42M
    {
9885
5.28M
    case ckp_okay:
9886
5.28M
      break;
9887
9888
135k
    case ckp_bogus:
9889
      /* Too many prefixes or unused REX prefixes.  */
9890
135k
      for (i = 0;
9891
326k
     i < (int) ARRAY_SIZE (ins.all_prefixes) && ins.all_prefixes[i];
9892
191k
     i++)
9893
191k
  i386_dis_printf (info, dis_style_mnemonic, "%s%s",
9894
191k
       (i == 0 ? "" : " "),
9895
191k
       prefix_name (ins.address_mode, ins.all_prefixes[i],
9896
191k
              sizeflag));
9897
135k
      ret = i;
9898
135k
      goto out;
9899
9900
4.09k
    case ckp_fetch_error:
9901
4.09k
      goto fetch_error_out;
9902
5.42M
    }
9903
9904
5.28M
  ins.nr_prefixes = ins.codep - ins.start_codep;
9905
9906
5.28M
  if (!fetch_code (info, ins.codep + 1))
9907
288
    {
9908
52.4k
    fetch_error_out:
9909
52.4k
      ret = fetch_error (&ins);
9910
52.4k
      goto out;
9911
288
    }
9912
9913
5.28M
  ins.two_source_ops = (*ins.codep == 0x62 || *ins.codep == 0xc8);
9914
9915
5.28M
  if ((ins.prefixes & PREFIX_FWAIT)
9916
15.0k
      && (*ins.codep < 0xd8 || *ins.codep > 0xdf))
9917
13.8k
    {
9918
      /* Handle ins.prefixes before fwait.  */
9919
15.3k
      for (i = 0; i < ins.fwait_prefix && ins.all_prefixes[i];
9920
13.8k
     i++)
9921
1.50k
  i386_dis_printf (info, dis_style_mnemonic, "%s ",
9922
1.50k
       prefix_name (ins.address_mode, ins.all_prefixes[i],
9923
1.50k
              sizeflag));
9924
13.8k
      i386_dis_printf (info, dis_style_mnemonic, "fwait");
9925
13.8k
      ret = i + 1;
9926
13.8k
      goto out;
9927
13.8k
    }
9928
9929
  /* REX2.M in rex2 prefix represents map0 or map1.  */
9930
5.27M
  if (ins.last_rex2_prefix < 0 ? *ins.codep == 0x0f : (ins.rex2 & REX2_M))
9931
134k
    {
9932
134k
      if (!ins.rex2)
9933
111k
  {
9934
111k
    ins.codep++;
9935
111k
    if (!fetch_code (info, ins.codep + 1))
9936
190
      goto fetch_error_out;
9937
111k
  }
9938
9939
134k
      dp = &dis386_twobyte[*ins.codep];
9940
134k
      ins.need_modrm = twobyte_has_modrm[*ins.codep];
9941
134k
    }
9942
5.13M
  else
9943
5.13M
    {
9944
5.13M
      dp = &dis386[*ins.codep];
9945
5.13M
      ins.need_modrm = onebyte_has_modrm[*ins.codep];
9946
5.13M
    }
9947
5.27M
  ins.condition_code = *ins.codep & 0xf;
9948
5.27M
  ins.codep++;
9949
9950
  /* Save sizeflag for printing the extra ins.prefixes later before updating
9951
     it for mnemonic and operand processing.  The prefix names depend
9952
     only on the address mode.  */
9953
5.27M
  orig_sizeflag = sizeflag;
9954
5.27M
  if (ins.prefixes & PREFIX_ADDR)
9955
52.3k
    sizeflag ^= AFLAG;
9956
5.27M
  if ((ins.prefixes & PREFIX_DATA))
9957
54.6k
    sizeflag ^= DFLAG;
9958
9959
5.27M
  ins.end_codep = ins.codep;
9960
5.27M
  if (ins.need_modrm && !fetch_modrm (&ins))
9961
4.75k
    goto fetch_error_out;
9962
9963
5.26M
  if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
9964
60.8k
    {
9965
60.8k
      if (!get_sib (&ins, sizeflag)
9966
60.6k
    || !dofloat (&ins, sizeflag))
9967
1.10k
  goto fetch_error_out;
9968
60.8k
    }
9969
5.20M
  else
9970
5.20M
    {
9971
5.20M
      dp = get_valid_dis386 (dp, &ins);
9972
5.20M
      if (dp == &err_opcode)
9973
4.76k
  goto fetch_error_out;
9974
9975
      /* For APX instructions promoted from legacy maps 0/1, embedded prefix
9976
   is interpreted as the operand size override.  */
9977
5.20M
      if (ins.evex_type == evex_from_legacy
9978
23.0k
    && ins.vex.prefix == DATA_PREFIX_OPCODE)
9979
4.85k
  sizeflag ^= DFLAG;
9980
9981
5.20M
      if(ins.evex_type == evex_default)
9982
5.16M
  ins.vex.nf = false;
9983
31.6k
      else
9984
  /* For EVEX-promoted formats, we need to clear EVEX.NF (ccmp and ctest
9985
     are cleared separately.) in mask_register_specifier and keep the low
9986
     2 bits of mask_register_specifier to report errors for invalid cases
9987
     .  */
9988
31.6k
  ins.vex.mask_register_specifier &= 0x3;
9989
9990
5.20M
      if (dp != NULL && putop (&ins, dp->name, sizeflag) == 0)
9991
5.20M
  {
9992
5.20M
    if (!get_sib (&ins, sizeflag))
9993
1.66k
      goto fetch_error_out;
9994
31.0M
    for (i = 0; i < MAX_OPERANDS; ++i)
9995
25.8M
      {
9996
25.8M
        ins.obufp = ins.op_out[i];
9997
25.8M
        ins.cbufp = ins.cm_out[i];
9998
25.8M
        ins.op_ad = MAX_OPERANDS - 1 - i;
9999
25.8M
        if (dp->op[i].rtn
10000
7.99M
      && !dp->op[i].rtn (&ins, dp->op[i].bytemode, sizeflag))
10001
35.5k
    goto fetch_error_out;
10002
        /* For EVEX instruction after the last operand masking
10003
     should be printed.  */
10004
25.8M
        if (i == 0 && ins.vex.evex)
10005
138k
    {
10006
      /* Don't print {%k0}.  */
10007
138k
      if (ins.vex.mask_register_specifier)
10008
91.0k
        {
10009
91.0k
          const char *reg_name
10010
91.0k
      = att_names_mask[ins.vex.mask_register_specifier];
10011
10012
91.0k
          oappend (&ins, "{");
10013
91.0k
          oappend_register (&ins, reg_name);
10014
91.0k
          oappend (&ins, "}");
10015
10016
91.0k
          if (ins.vex.zeroing)
10017
36.2k
      oappend (&ins, "{z}");
10018
91.0k
        }
10019
47.3k
      else if (ins.vex.zeroing)
10020
7.65k
        {
10021
7.65k
          oappend (&ins, "{bad}");
10022
7.65k
          continue;
10023
7.65k
        }
10024
10025
      /* Instructions with a mask register destination allow for
10026
         zeroing-masking only (if any masking at all), which is
10027
         _not_ expressed by EVEX.z.  */
10028
130k
      if (ins.vex.zeroing && dp->op[0].bytemode == mask_mode)
10029
3.56k
        ins.illegal_masking = true;
10030
10031
      /* S/G insns require a mask and don't allow
10032
         zeroing-masking.  */
10033
130k
      if ((dp->op[0].bytemode == vex_vsib_d_w_dq_mode
10034
127k
           || dp->op[0].bytemode == vex_vsib_q_w_dq_mode)
10035
6.76k
          && (ins.vex.mask_register_specifier == 0
10036
6.17k
        || ins.vex.zeroing))
10037
4.08k
        ins.illegal_masking = true;
10038
10039
130k
      if (ins.illegal_masking)
10040
17.3k
        oappend (&ins, "/(bad)");
10041
130k
    }
10042
25.8M
      }
10043
    /* vex.nf is cleared after being consumed.  */
10044
5.16M
    if (ins.vex.nf)
10045
8.14k
      oappend (&ins, "{bad-nf}");
10046
10047
    /* Check whether rounding control was enabled for an insn not
10048
       supporting it, when evex.b is not treated as evex.nd.  */
10049
5.16M
    if (ins.modrm.mod == 3 && ins.vex.b && ins.evex_type == evex_default
10050
14.3k
        && !(ins.evex_used & EVEX_b_used))
10051
9.47k
      {
10052
26.2k
        for (i = 0; i < MAX_OPERANDS; ++i)
10053
26.2k
    {
10054
26.2k
      ins.obufp = ins.op_out[i];
10055
26.2k
      if (*ins.obufp)
10056
16.7k
        continue;
10057
9.47k
      oappend (&ins, names_rounding[ins.vex.ll]);
10058
9.47k
      oappend (&ins, "bad}");
10059
9.47k
      break;
10060
26.2k
    }
10061
9.47k
      }
10062
5.16M
  }
10063
5.20M
    }
10064
10065
  /* Clear instruction information.  */
10066
5.22M
  info->insn_info_valid = 0;
10067
5.22M
  info->branch_delay_insns = 0;
10068
5.22M
  info->data_size = 0;
10069
5.22M
  info->insn_type = dis_noninsn;
10070
5.22M
  info->target = 0;
10071
5.22M
  info->target2 = 0;
10072
10073
  /* Reset jump operation indicator.  */
10074
5.22M
  ins.op_is_jump = false;
10075
5.22M
  {
10076
5.22M
    int jump_detection = 0;
10077
10078
    /* Extract flags.  */
10079
31.3M
    for (i = 0; i < MAX_OPERANDS; ++i)
10080
26.1M
      {
10081
26.1M
  if ((dp->op[i].rtn == OP_J)
10082
25.7M
      || (dp->op[i].rtn == OP_indirE))
10083
384k
    jump_detection |= 1;
10084
25.7M
  else if ((dp->op[i].rtn == BND_Fixup)
10085
25.3M
     || (!dp->op[i].rtn && !dp->op[i].bytemode))
10086
18.2M
    jump_detection |= 2;
10087
7.51M
  else if ((dp->op[i].bytemode == cond_jump_mode)
10088
7.28M
     || (dp->op[i].bytemode == loop_jcxz_mode))
10089
279k
    jump_detection |= 4;
10090
26.1M
      }
10091
10092
    /* Determine if this is a jump or branch.  */
10093
5.22M
    if ((jump_detection & 0x3) == 0x3)
10094
384k
      {
10095
384k
  ins.op_is_jump = true;
10096
384k
  if (jump_detection & 0x4)
10097
279k
    info->insn_type = dis_condbranch;
10098
104k
  else
10099
104k
    info->insn_type = (dp->name && !strncmp (dp->name, "call", 4))
10100
104k
      ? dis_jsr : dis_branch;
10101
384k
      }
10102
5.22M
  }
10103
  /* The purpose of placing the check here is to wait for the EVEX prefix for
10104
     conditional CMP and TEST to be consumed and cleared, and then make a
10105
     unified judgment. Because they are both in map4, we can not distinguish
10106
     EVEX prefix for conditional CMP and TEST from others during the
10107
     EVEX prefix stage of parsing.  */
10108
5.22M
  if (ins.evex_type == evex_from_legacy)
10109
19.5k
    {
10110
      /* EVEX from legacy instructions, when the EVEX.ND bit is 0,
10111
   all bits of EVEX.vvvv and EVEX.V' must be 1.  */
10112
19.5k
      if (!ins.vex.nd && (ins.vex.register_specifier || !ins.vex.v))
10113
7.57k
  {
10114
7.57k
    i386_dis_printf (info, dis_style_text, "(bad)");
10115
7.57k
    ret = ins.end_codep - priv.the_buffer;
10116
7.57k
    goto out;
10117
7.57k
  }
10118
10119
      /* EVEX from legacy instructions require that EVEX.z, EVEX.L’L and the
10120
   lower 2 bits of EVEX.aaa must be 0.  */
10121
11.9k
      if ((ins.vex.mask_register_specifier & 0x3) != 0
10122
7.79k
    || ins.vex.ll != 0 || ins.vex.zeroing != 0)
10123
7.85k
  {
10124
7.85k
    i386_dis_printf (info, dis_style_text, "(bad)");
10125
7.85k
    ret = ins.end_codep - priv.the_buffer;
10126
7.85k
    goto out;
10127
7.85k
  }
10128
11.9k
    }
10129
  /* If VEX.vvvv and EVEX.vvvv are unused, they must be all 1s, which
10130
     are all 0s in inverted form.  */
10131
5.20M
  if (ins.need_vex && ins.vex.register_specifier != 0)
10132
95.4k
    {
10133
95.4k
      i386_dis_printf (info, dis_style_text, "(bad)");
10134
95.4k
      ret = ins.end_codep - priv.the_buffer;
10135
95.4k
      goto out;
10136
95.4k
    }
10137
10138
5.11M
  if ((dp->prefix_requirement & PREFIX_REX2_ILLEGAL)
10139
628k
      && ins.last_rex2_prefix >= 0 && (ins.rex2 & REX2_SPECIAL) == 0)
10140
4.56k
    {
10141
4.56k
      i386_dis_printf (info, dis_style_text, "(bad)");
10142
4.56k
      ret = ins.end_codep - priv.the_buffer;
10143
4.56k
      goto out;
10144
4.56k
    }
10145
10146
5.10M
  switch (dp->prefix_requirement & ~PREFIX_REX2_ILLEGAL)
10147
5.10M
    {
10148
36.5k
    case PREFIX_DATA:
10149
      /* If only the data prefix is marked as mandatory, its absence renders
10150
   the encoding invalid.  Most other PREFIX_OPCODE rules still apply.  */
10151
36.5k
      if (ins.need_vex ? !ins.vex.prefix : !(ins.prefixes & PREFIX_DATA))
10152
14.4k
  {
10153
14.4k
    i386_dis_printf (info, dis_style_text, "(bad)");
10154
14.4k
    ret = ins.end_codep - priv.the_buffer;
10155
14.4k
    goto out;
10156
14.4k
  }
10157
22.1k
      ins.used_prefixes |= PREFIX_DATA;
10158
      /* Fall through.  */
10159
51.4k
    case PREFIX_OPCODE:
10160
      /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
10161
   unused, opcode is invalid.  Since the PREFIX_DATA prefix may be
10162
   used by putop and MMX/SSE operand and may be overridden by the
10163
   PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
10164
   separately.  */
10165
51.4k
      if (((ins.need_vex
10166
51.4k
      ? ins.vex.prefix == REPE_PREFIX_OPCODE
10167
18.4k
        || ins.vex.prefix == REPNE_PREFIX_OPCODE
10168
51.4k
      : (ins.prefixes
10169
28.2k
         & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
10170
14.2k
     && (ins.used_prefixes
10171
14.2k
         & (PREFIX_REPZ | PREFIX_REPNZ)) == 0)
10172
38.0k
    || (((ins.need_vex
10173
38.0k
    ? ins.vex.prefix == DATA_PREFIX_OPCODE
10174
38.0k
    : ((ins.prefixes
10175
26.3k
        & (PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA))
10176
26.3k
       == PREFIX_DATA))
10177
13.8k
         && (ins.used_prefixes & PREFIX_DATA) == 0))
10178
37.6k
    || (ins.vex.evex && dp->prefix_requirement != PREFIX_DATA
10179
839
        && !ins.vex.w != !(ins.used_prefixes & PREFIX_DATA)))
10180
14.1k
  {
10181
14.1k
    i386_dis_printf (info, dis_style_text, "(bad)");
10182
14.1k
    ret = ins.end_codep - priv.the_buffer;
10183
14.1k
    goto out;
10184
14.1k
  }
10185
37.2k
      break;
10186
10187
37.2k
    case PREFIX_IGNORED:
10188
      /* Zap data size and rep prefixes from used_prefixes and reinstate their
10189
   origins in all_prefixes.  */
10190
2.56k
      ins.used_prefixes &= ~PREFIX_OPCODE;
10191
2.56k
      if (ins.last_data_prefix >= 0)
10192
783
  ins.all_prefixes[ins.last_data_prefix] = 0x66;
10193
2.56k
      if (ins.last_repz_prefix >= 0)
10194
1.35k
  ins.all_prefixes[ins.last_repz_prefix] = 0xf3;
10195
2.56k
      if (ins.last_repnz_prefix >= 0)
10196
1.42k
  ins.all_prefixes[ins.last_repnz_prefix] = 0xf2;
10197
2.56k
      break;
10198
10199
33.3k
    case PREFIX_NP_OR_DATA:
10200
33.3k
      if (ins.vex.prefix == REPE_PREFIX_OPCODE
10201
32.8k
    || ins.vex.prefix == REPNE_PREFIX_OPCODE)
10202
993
  {
10203
993
    i386_dis_printf (info, dis_style_text, "(bad)");
10204
993
    ret = ins.end_codep - priv.the_buffer;
10205
993
    goto out;
10206
993
  }
10207
32.3k
      break;
10208
10209
32.3k
    case NO_PREFIX:
10210
27.1k
      if (ins.vex.prefix)
10211
620
  {
10212
620
    i386_dis_printf (info, dis_style_text, "(bad)");
10213
620
    ret = ins.end_codep - priv.the_buffer;
10214
620
    goto out;
10215
620
  }
10216
26.5k
      break;
10217
5.10M
    }
10218
10219
  /* Check if the REX prefix is used.  */
10220
5.07M
  if ((ins.rex ^ ins.rex_used) == 0
10221
4.51M
      && !ins.need_vex && ins.last_rex_prefix >= 0)
10222
64.8k
    ins.all_prefixes[ins.last_rex_prefix] = 0;
10223
10224
  /* Check if the REX2 prefix is used.  */
10225
5.07M
  if (ins.last_rex2_prefix >= 0
10226
26.8k
      && ((ins.rex2 & REX2_SPECIAL)
10227
25.1k
    || (((ins.rex2 & 7) ^ (ins.rex2_used & 7)) == 0
10228
5.70k
        && (ins.rex ^ ins.rex_used) == 0
10229
3.54k
        && (ins.rex2 & 7))))
10230
4.22k
    ins.all_prefixes[ins.last_rex2_prefix] = 0;
10231
10232
  /* Check if the SEG prefix is used.  */
10233
5.07M
  if ((ins.prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
10234
5.07M
           | PREFIX_FS | PREFIX_GS)) != 0
10235
138k
      && (ins.used_prefixes & ins.active_seg_prefix) != 0)
10236
45.6k
    ins.all_prefixes[ins.last_seg_prefix] = 0;
10237
10238
  /* Check if the ADDR prefix is used.  */
10239
5.07M
  if ((ins.prefixes & PREFIX_ADDR) != 0
10240
45.6k
      && (ins.used_prefixes & PREFIX_ADDR) != 0)
10241
25.7k
    ins.all_prefixes[ins.last_addr_prefix] = 0;
10242
10243
  /* Check if the DATA prefix is used.  */
10244
5.07M
  if ((ins.prefixes & PREFIX_DATA) != 0
10245
47.5k
      && (ins.used_prefixes & PREFIX_DATA) != 0
10246
31.6k
      && !ins.need_vex)
10247
31.1k
    ins.all_prefixes[ins.last_data_prefix] = 0;
10248
10249
  /* Print the extra ins.prefixes.  */
10250
5.07M
  prefix_length = 0;
10251
76.1M
  for (i = 0; i < (int) ARRAY_SIZE (ins.all_prefixes); i++)
10252
71.0M
    if (ins.all_prefixes[i])
10253
438k
      {
10254
438k
  const char *name = prefix_name (ins.address_mode, ins.all_prefixes[i],
10255
438k
          orig_sizeflag);
10256
10257
438k
  if (name == NULL)
10258
0
    abort ();
10259
438k
  prefix_length += strlen (name) + 1;
10260
438k
  if (ins.all_prefixes[i] == REX2_OPCODE)
10261
22.6k
    i386_dis_printf (info, dis_style_mnemonic, "{%s 0x%x} ", name,
10262
22.6k
         (unsigned int) ins.rex2_payload);
10263
416k
  else
10264
416k
    i386_dis_printf (info, dis_style_mnemonic, "%s ", name);
10265
438k
      }
10266
10267
  /* Check maximum code length.  */
10268
5.07M
  if ((ins.codep - ins.start_codep) > MAX_CODE_LENGTH)
10269
1.48k
    {
10270
1.48k
      i386_dis_printf (info, dis_style_text, "(bad)");
10271
1.48k
      ret = MAX_CODE_LENGTH;
10272
1.48k
      goto out;
10273
1.48k
    }
10274
10275
  /* Calculate the number of operands this instruction has.  */
10276
5.07M
  op_count = 0;
10277
30.4M
  for (i = 0; i < MAX_OPERANDS; ++i)
10278
25.3M
    if (*ins.op_out[i] != '\0')
10279
7.15M
      ++op_count;
10280
10281
  /* Calculate the number of spaces to print after the mnemonic.  */
10282
5.07M
  ins.obufp = ins.mnemonicendp;
10283
5.07M
  if (op_count > 0)
10284
3.97M
    {
10285
3.97M
      i = strlen (ins.obuf) + prefix_length;
10286
3.97M
      if (i < 7)
10287
3.70M
  i = 7 - i;
10288
268k
      else
10289
268k
  i = 1;
10290
3.97M
    }
10291
1.09M
  else
10292
1.09M
    i = 0;
10293
10294
  /* Print the instruction mnemonic along with any trailing whitespace.  */
10295
5.07M
  i386_dis_printf (info, dis_style_mnemonic, "%s%*s", ins.obuf, i, "");
10296
10297
  /* The enter and bound instructions are printed with operands in the same
10298
     order as the intel book; everything else is printed in reverse order.  */
10299
5.07M
  intel_swap_2_3 = false;
10300
5.07M
  if (ins.intel_syntax || ins.two_source_ops)
10301
1.10M
    {
10302
6.61M
      for (i = 0; i < MAX_OPERANDS; ++i)
10303
5.51M
  op_txt[i] = ins.op_out[i];
10304
10305
1.10M
      if (ins.intel_syntax && dp && dp->op[2].rtn == OP_Rounding
10306
5.02k
          && dp->op[3].rtn == OP_E && dp->op[4].rtn == NULL)
10307
1.82k
  {
10308
1.82k
    op_txt[2] = ins.op_out[3];
10309
1.82k
    op_txt[3] = ins.op_out[2];
10310
1.82k
    intel_swap_2_3 = true;
10311
1.82k
  }
10312
10313
3.30M
      for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
10314
2.20M
  {
10315
2.20M
    bool riprel;
10316
10317
2.20M
    ins.op_ad = ins.op_index[i];
10318
2.20M
    ins.op_index[i] = ins.op_index[MAX_OPERANDS - 1 - i];
10319
2.20M
    ins.op_index[MAX_OPERANDS - 1 - i] = ins.op_ad;
10320
2.20M
    riprel = ins.op_riprel[i];
10321
2.20M
    ins.op_riprel[i] = ins.op_riprel[MAX_OPERANDS - 1 - i];
10322
2.20M
    ins.op_riprel[MAX_OPERANDS - 1 - i] = riprel;
10323
10324
2.20M
    char *tmp = ins.cm_out[i];
10325
2.20M
    ins.cm_out[i] = ins.cm_out[MAX_OPERANDS - 1 - i];
10326
2.20M
    ins.cm_out[MAX_OPERANDS - 1 - i] = tmp;
10327
2.20M
  }
10328
1.10M
    }
10329
3.97M
  else
10330
3.97M
    {
10331
23.8M
      for (i = 0; i < MAX_OPERANDS; ++i)
10332
19.8M
  op_txt[MAX_OPERANDS - 1 - i] = ins.op_out[i];
10333
3.97M
    }
10334
10335
5.07M
  needcomma = 0;
10336
30.4M
  for (i = 0; i < MAX_OPERANDS; ++i)
10337
25.3M
    if (*op_txt[i])
10338
7.15M
      {
10339
  /* In Intel syntax embedded rounding / SAE are not separate operands.
10340
     Instead they're attached to the prior register operand.  Simply
10341
     suppress emission of the comma to achieve that effect.  */
10342
7.15M
  switch (i & -(ins.intel_syntax && dp))
10343
7.15M
    {
10344
42.1k
    case 2:
10345
42.1k
      if (dp->op[2].rtn == OP_Rounding && !intel_swap_2_3)
10346
490
        needcomma = 0;
10347
42.1k
      break;
10348
3.35k
    case 3:
10349
3.35k
      if (dp->op[3].rtn == OP_Rounding || intel_swap_2_3)
10350
1.01k
        needcomma = 0;
10351
3.35k
      break;
10352
7.15M
    }
10353
7.15M
  if (needcomma)
10354
3.17M
    i386_dis_printf (info, dis_style_text, ",");
10355
7.15M
  if (ins.op_index[i] != -1 && !ins.op_riprel[i])
10356
325k
    {
10357
325k
      bfd_vma target = (bfd_vma) ins.op_address[ins.op_index[i]];
10358
10359
325k
      if (ins.op_is_jump)
10360
325k
        {
10361
325k
    info->insn_info_valid = 1;
10362
325k
    info->branch_delay_insns = 0;
10363
325k
    info->data_size = 0;
10364
325k
    info->target = target;
10365
325k
    info->target2 = 0;
10366
325k
        }
10367
325k
      (*info->print_address_func) (target, info);
10368
325k
    }
10369
6.82M
  else
10370
6.82M
    i386_dis_printf (info, dis_style_text, "%s", op_txt[i]);
10371
7.15M
  needcomma = 1;
10372
7.15M
      }
10373
10374
5.07M
  const char *sep = "        # ";
10375
30.4M
  for (i = 0; i < MAX_OPERANDS; i++)
10376
25.3M
    if (ins.op_index[i] != -1 && ins.op_riprel[i])
10377
39.6k
      {
10378
39.6k
  i386_dis_printf (info, dis_style_comment_start, "%s", sep);
10379
39.6k
  sep = ", ";
10380
39.6k
  (*info->print_address_func)
10381
39.6k
    ((bfd_vma)(ins.start_pc + (ins.codep - ins.start_codep)
10382
39.6k
         + ins.op_address[ins.op_index[i]]),
10383
39.6k
     info);
10384
39.6k
      }
10385
25.3M
    else if (*ins.cm_out[i])
10386
0
      {
10387
0
  i386_dis_printf (info, dis_style_comment_start, "%s", sep);
10388
0
  sep = ", ";
10389
0
  i386_dis_printf (info, dis_style_symbol, "%s", ins.cm_out[i]);
10390
0
      }
10391
10392
5.07M
  ret = ins.codep - priv.the_buffer;
10393
5.42M
 out:
10394
5.42M
  info->private_data = NULL;
10395
5.42M
  return ret;
10396
5.07M
}
10397
10398
/* Here for backwards compatibility.  When gdb stops using
10399
   print_insn_i386_att and print_insn_i386_intel these functions can
10400
   disappear, and print_insn_i386 be merged into print_insn.  */
10401
int
10402
print_insn_i386_att (bfd_vma pc, disassemble_info *info)
10403
0
{
10404
0
  return print_insn (pc, info, 0);
10405
0
}
10406
10407
int
10408
print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
10409
0
{
10410
0
  return print_insn (pc, info, 1);
10411
0
}
10412
10413
int
10414
print_insn_i386 (bfd_vma pc, disassemble_info *info)
10415
5.42M
{
10416
5.42M
  return print_insn (pc, info, -1);
10417
5.42M
}
10418
10419
static const char *float_mem[] = {
10420
  /* d8 */
10421
  "fadd{s|}",
10422
  "fmul{s|}",
10423
  "fcom{s|}",
10424
  "fcomp{s|}",
10425
  "fsub{s|}",
10426
  "fsubr{s|}",
10427
  "fdiv{s|}",
10428
  "fdivr{s|}",
10429
  /* d9 */
10430
  "fld{s|}",
10431
  "(bad)",
10432
  "fst{s|}",
10433
  "fstp{s|}",
10434
  "fldenv{C|C}",
10435
  "fldcw",
10436
  "fNstenv{C|C}",
10437
  "fNstcw",
10438
  /* da */
10439
  "fiadd{l|}",
10440
  "fimul{l|}",
10441
  "ficom{l|}",
10442
  "ficomp{l|}",
10443
  "fisub{l|}",
10444
  "fisubr{l|}",
10445
  "fidiv{l|}",
10446
  "fidivr{l|}",
10447
  /* db */
10448
  "fild{l|}",
10449
  "fisttp{l|}",
10450
  "fist{l|}",
10451
  "fistp{l|}",
10452
  "(bad)",
10453
  "fld{t|}",
10454
  "(bad)",
10455
  "fstp{t|}",
10456
  /* dc */
10457
  "fadd{l|}",
10458
  "fmul{l|}",
10459
  "fcom{l|}",
10460
  "fcomp{l|}",
10461
  "fsub{l|}",
10462
  "fsubr{l|}",
10463
  "fdiv{l|}",
10464
  "fdivr{l|}",
10465
  /* dd */
10466
  "fld{l|}",
10467
  "fisttp{ll|}",
10468
  "fst{l||}",
10469
  "fstp{l|}",
10470
  "frstor{C|C}",
10471
  "(bad)",
10472
  "fNsave{C|C}",
10473
  "fNstsw",
10474
  /* de */
10475
  "fiadd{s|}",
10476
  "fimul{s|}",
10477
  "ficom{s|}",
10478
  "ficomp{s|}",
10479
  "fisub{s|}",
10480
  "fisubr{s|}",
10481
  "fidiv{s|}",
10482
  "fidivr{s|}",
10483
  /* df */
10484
  "fild{s|}",
10485
  "fisttp{s|}",
10486
  "fist{s|}",
10487
  "fistp{s|}",
10488
  "fbld",
10489
  "fild{ll|}",
10490
  "fbstp",
10491
  "fistp{ll|}",
10492
};
10493
10494
static const unsigned char float_mem_mode[] = {
10495
  /* d8 */
10496
  d_mode,
10497
  d_mode,
10498
  d_mode,
10499
  d_mode,
10500
  d_mode,
10501
  d_mode,
10502
  d_mode,
10503
  d_mode,
10504
  /* d9 */
10505
  d_mode,
10506
  0,
10507
  d_mode,
10508
  d_mode,
10509
  0,
10510
  w_mode,
10511
  0,
10512
  w_mode,
10513
  /* da */
10514
  d_mode,
10515
  d_mode,
10516
  d_mode,
10517
  d_mode,
10518
  d_mode,
10519
  d_mode,
10520
  d_mode,
10521
  d_mode,
10522
  /* db */
10523
  d_mode,
10524
  d_mode,
10525
  d_mode,
10526
  d_mode,
10527
  0,
10528
  t_mode,
10529
  0,
10530
  t_mode,
10531
  /* dc */
10532
  q_mode,
10533
  q_mode,
10534
  q_mode,
10535
  q_mode,
10536
  q_mode,
10537
  q_mode,
10538
  q_mode,
10539
  q_mode,
10540
  /* dd */
10541
  q_mode,
10542
  q_mode,
10543
  q_mode,
10544
  q_mode,
10545
  0,
10546
  0,
10547
  0,
10548
  w_mode,
10549
  /* de */
10550
  w_mode,
10551
  w_mode,
10552
  w_mode,
10553
  w_mode,
10554
  w_mode,
10555
  w_mode,
10556
  w_mode,
10557
  w_mode,
10558
  /* df */
10559
  w_mode,
10560
  w_mode,
10561
  w_mode,
10562
  w_mode,
10563
  t_mode,
10564
  q_mode,
10565
  t_mode,
10566
  q_mode
10567
};
10568
10569
#define ST { OP_ST, 0 }
10570
#define STi { OP_STi, 0 }
10571
10572
#define FGRPd9_2 NULL, { { NULL, 1 } }, 0
10573
#define FGRPd9_4 NULL, { { NULL, 2 } }, 0
10574
#define FGRPd9_5 NULL, { { NULL, 3 } }, 0
10575
#define FGRPd9_6 NULL, { { NULL, 4 } }, 0
10576
#define FGRPd9_7 NULL, { { NULL, 5 } }, 0
10577
#define FGRPda_5 NULL, { { NULL, 6 } }, 0
10578
#define FGRPdb_4 NULL, { { NULL, 7 } }, 0
10579
#define FGRPde_3 NULL, { { NULL, 8 } }, 0
10580
#define FGRPdf_4 NULL, { { NULL, 9 } }, 0
10581
10582
static const struct dis386 float_reg[][8] = {
10583
  /* d8 */
10584
  {
10585
    { "fadd", { ST, STi }, 0 },
10586
    { "fmul", { ST, STi }, 0 },
10587
    { "fcom", { STi }, 0 },
10588
    { "fcomp",  { STi }, 0 },
10589
    { "fsub", { ST, STi }, 0 },
10590
    { "fsubr",  { ST, STi }, 0 },
10591
    { "fdiv", { ST, STi }, 0 },
10592
    { "fdivr",  { ST, STi }, 0 },
10593
  },
10594
  /* d9 */
10595
  {
10596
    { "fld",  { STi }, 0 },
10597
    { "fxch", { STi }, 0 },
10598
    { FGRPd9_2 },
10599
    { Bad_Opcode },
10600
    { FGRPd9_4 },
10601
    { FGRPd9_5 },
10602
    { FGRPd9_6 },
10603
    { FGRPd9_7 },
10604
  },
10605
  /* da */
10606
  {
10607
    { "fcmovb", { ST, STi }, 0 },
10608
    { "fcmove", { ST, STi }, 0 },
10609
    { "fcmovbe",{ ST, STi }, 0 },
10610
    { "fcmovu", { ST, STi }, 0 },
10611
    { Bad_Opcode },
10612
    { FGRPda_5 },
10613
    { Bad_Opcode },
10614
    { Bad_Opcode },
10615
  },
10616
  /* db */
10617
  {
10618
    { "fcmovnb",{ ST, STi }, 0 },
10619
    { "fcmovne",{ ST, STi }, 0 },
10620
    { "fcmovnbe",{ ST, STi }, 0 },
10621
    { "fcmovnu",{ ST, STi }, 0 },
10622
    { FGRPdb_4 },
10623
    { "fucomi", { ST, STi }, 0 },
10624
    { "fcomi",  { ST, STi }, 0 },
10625
    { Bad_Opcode },
10626
  },
10627
  /* dc */
10628
  {
10629
    { "fadd", { STi, ST }, 0 },
10630
    { "fmul", { STi, ST }, 0 },
10631
    { Bad_Opcode },
10632
    { Bad_Opcode },
10633
    { "fsub{!M|r}", { STi, ST }, 0 },
10634
    { "fsub{M|}", { STi, ST }, 0 },
10635
    { "fdiv{!M|r}", { STi, ST }, 0 },
10636
    { "fdiv{M|}", { STi, ST }, 0 },
10637
  },
10638
  /* dd */
10639
  {
10640
    { "ffree",  { STi }, 0 },
10641
    { Bad_Opcode },
10642
    { "fst",  { STi }, 0 },
10643
    { "fstp", { STi }, 0 },
10644
    { "fucom",  { STi }, 0 },
10645
    { "fucomp", { STi }, 0 },
10646
    { Bad_Opcode },
10647
    { Bad_Opcode },
10648
  },
10649
  /* de */
10650
  {
10651
    { "faddp",  { STi, ST }, 0 },
10652
    { "fmulp",  { STi, ST }, 0 },
10653
    { Bad_Opcode },
10654
    { FGRPde_3 },
10655
    { "fsub{!M|r}p",  { STi, ST }, 0 },
10656
    { "fsub{M|}p",  { STi, ST }, 0 },
10657
    { "fdiv{!M|r}p",  { STi, ST }, 0 },
10658
    { "fdiv{M|}p",  { STi, ST }, 0 },
10659
  },
10660
  /* df */
10661
  {
10662
    { "ffreep", { STi }, 0 },
10663
    { Bad_Opcode },
10664
    { Bad_Opcode },
10665
    { Bad_Opcode },
10666
    { FGRPdf_4 },
10667
    { "fucomip", { ST, STi }, 0 },
10668
    { "fcomip", { ST, STi }, 0 },
10669
    { Bad_Opcode },
10670
  },
10671
};
10672
10673
static const char *const fgrps[][8] = {
10674
  /* Bad opcode 0 */
10675
  {
10676
    "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10677
  },
10678
10679
  /* d9_2  1 */
10680
  {
10681
    "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10682
  },
10683
10684
  /* d9_4  2 */
10685
  {
10686
    "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
10687
  },
10688
10689
  /* d9_5  3 */
10690
  {
10691
    "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
10692
  },
10693
10694
  /* d9_6  4 */
10695
  {
10696
    "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
10697
  },
10698
10699
  /* d9_7  5 */
10700
  {
10701
    "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
10702
  },
10703
10704
  /* da_5  6 */
10705
  {
10706
    "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10707
  },
10708
10709
  /* db_4  7 */
10710
  {
10711
    "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
10712
    "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
10713
  },
10714
10715
  /* de_3  8 */
10716
  {
10717
    "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10718
  },
10719
10720
  /* df_4  9 */
10721
  {
10722
    "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10723
  },
10724
};
10725
10726
static const char *const oszc_flags[16] = {
10727
  " {dfv=}", " {dfv=cf}", " {dfv=zf}", " {dfv=zf, cf}", " {dfv=sf}",
10728
  " {dfv=sf, cf}", " {dfv=sf, zf}", " {dfv=sf, zf, cf}", " {dfv=of}",
10729
  " {dfv=of, cf}", " {dfv=of, zf}", " {dfv=of, zf, cf}", " {dfv=of, sf}",
10730
  " {dfv=of, sf, cf}", " {dfv=of, sf, zf}", " {dfv=of, sf, zf, cf}"
10731
};
10732
10733
static const char *const scc_suffix[16] = {
10734
  "o", "no", "b", "ae", "e", "ne", "be", "a", "s", "ns", "t", "f",
10735
  "l", "ge", "le", "g"
10736
};
10737
10738
static void
10739
swap_operand (instr_info *ins)
10740
2.50k
{
10741
2.50k
  char *p = ins->mnemonicendp;
10742
10743
2.50k
  if (p[-1] == '}')
10744
430
    {
10745
5.16k
      while (*--p != '{')
10746
4.73k
  {
10747
4.73k
    if (p <= ins->obuf + 2)
10748
0
      abort ();
10749
4.73k
  }
10750
430
      if (p[-1] == ' ')
10751
210
  --p;
10752
430
    }
10753
2.50k
  memmove (p + 2, p, ins->mnemonicendp - p + 1);
10754
2.50k
  p[0] = '.';
10755
2.50k
  p[1] = 's';
10756
2.50k
  ins->mnemonicendp += 2;
10757
2.50k
}
10758
10759
static bool
10760
dofloat (instr_info *ins, int sizeflag)
10761
60.6k
{
10762
60.6k
  const struct dis386 *dp;
10763
60.6k
  unsigned char floatop = ins->codep[-1];
10764
10765
60.6k
  if (ins->modrm.mod != 3)
10766
27.6k
    {
10767
27.6k
      int fp_indx = (floatop - 0xd8) * 8 + ins->modrm.reg;
10768
10769
27.6k
      putop (ins, float_mem[fp_indx], sizeflag);
10770
27.6k
      ins->obufp = ins->op_out[0];
10771
27.6k
      ins->cbufp = ins->cm_out[0];
10772
27.6k
      ins->op_ad = 2;
10773
27.6k
      return OP_E (ins, float_mem_mode[fp_indx], sizeflag);
10774
27.6k
    }
10775
  /* Skip mod/rm byte.  */
10776
33.0k
  MODRM_CHECK;
10777
33.0k
  ins->codep++;
10778
10779
33.0k
  dp = &float_reg[floatop - 0xd8][ins->modrm.reg];
10780
33.0k
  if (dp->name == NULL)
10781
20.0k
    {
10782
20.0k
      putop (ins, fgrps[dp->op[0].bytemode][ins->modrm.rm], sizeflag);
10783
10784
      /* Instruction fnstsw is only one with strange arg.  */
10785
20.0k
      if (floatop == 0xdf && ins->codep[-1] == 0xe0)
10786
458
  strcpy (ins->op_out[0], att_names16[0] + ins->intel_syntax);
10787
20.0k
    }
10788
12.9k
  else
10789
12.9k
    {
10790
12.9k
      putop (ins, dp->name, sizeflag);
10791
10792
12.9k
      ins->obufp = ins->op_out[0];
10793
12.9k
      ins->cbufp = ins->cm_out[0];
10794
12.9k
      ins->op_ad = 2;
10795
12.9k
      if (dp->op[0].rtn
10796
12.9k
    && !dp->op[0].rtn (ins, dp->op[0].bytemode, sizeflag))
10797
0
  return false;
10798
10799
12.9k
      ins->obufp = ins->op_out[1];
10800
12.9k
      ins->cbufp = ins->cm_out[1];
10801
12.9k
      ins->op_ad = 1;
10802
12.9k
      if (dp->op[1].rtn
10803
7.11k
    && !dp->op[1].rtn (ins, dp->op[1].bytemode, sizeflag))
10804
0
  return false;
10805
12.9k
    }
10806
33.0k
  return true;
10807
33.0k
}
10808
10809
static bool
10810
OP_ST (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
10811
       int sizeflag ATTRIBUTE_UNUSED)
10812
7.11k
{
10813
7.11k
  oappend_register (ins, "%st");
10814
7.11k
  return true;
10815
7.11k
}
10816
10817
static bool
10818
OP_STi (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
10819
  int sizeflag ATTRIBUTE_UNUSED)
10820
12.9k
{
10821
12.9k
  char scratch[8];
10822
12.9k
  int res = snprintf (scratch, ARRAY_SIZE (scratch), "%%st(%d)", ins->modrm.rm);
10823
10824
12.9k
  if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
10825
0
    abort ();
10826
12.9k
  oappend_register (ins, scratch);
10827
12.9k
  return true;
10828
12.9k
}
10829
10830
/* Capital letters in template are macros.  */
10831
static int
10832
putop (instr_info *ins, const char *in_template, int sizeflag)
10833
5.26M
{
10834
5.26M
  const char *p;
10835
5.26M
  int alt = 0;
10836
5.26M
  int cond = 1;
10837
5.26M
  unsigned int l = 0, len = 0;
10838
5.26M
  char last[4];
10839
5.26M
  bool evex_printed = false;
10840
10841
  /* We don't want to add any prefix or suffix to (bad), so return early.  */
10842
5.26M
  if (!strncmp (in_template, "(bad)", 5))
10843
776k
    {
10844
776k
      oappend (ins, "(bad)");
10845
776k
      *ins->obufp = 0;
10846
776k
      ins->mnemonicendp = ins->obufp;
10847
776k
      return 0;
10848
776k
    }
10849
10850
25.5M
  for (p = in_template; *p; p++)
10851
21.0M
    {
10852
21.0M
      if (len > l)
10853
324k
  {
10854
324k
    if (l >= sizeof (last) || !ISUPPER (*p))
10855
0
      abort ();
10856
324k
    last[l++] = *p;
10857
324k
    continue;
10858
324k
  }
10859
20.7M
      switch (*p)
10860
20.7M
  {
10861
15.0M
  default:
10862
15.0M
    if (ins->evex_type == evex_from_legacy && !ins->vex.nd
10863
24.2k
        && !(ins->rex2 & 7) && !evex_printed)
10864
840
      {
10865
840
        oappend (ins, "{evex} ");
10866
840
        evex_printed = true;
10867
840
      }
10868
15.0M
    *ins->obufp++ = *p;
10869
15.0M
    break;
10870
324k
  case '%':
10871
324k
    len++;
10872
324k
    break;
10873
209k
  case '!':
10874
209k
    cond = 0;
10875
209k
    break;
10876
509k
  case '{':
10877
509k
    if (ins->intel_syntax)
10878
154k
      {
10879
305k
        while (*++p != '|')
10880
151k
    if (*p == '}' || *p == '\0')
10881
0
      abort ();
10882
154k
        alt = 1;
10883
154k
      }
10884
509k
    break;
10885
509k
  case '|':
10886
388k
    while (*++p != '}')
10887
33.5k
      {
10888
33.5k
        if (*p == '\0')
10889
0
    abort ();
10890
33.5k
      }
10891
354k
    break;
10892
354k
  case '}':
10893
154k
    alt = 0;
10894
154k
    break;
10895
63.2k
  case 'A':
10896
63.2k
    if (ins->intel_syntax)
10897
13.0k
      break;
10898
50.2k
    if ((ins->need_modrm && ins->modrm.mod != 3 && !ins->vex.nd)
10899
15.0k
        || (sizeflag & SUFFIX_ALWAYS))
10900
35.6k
      *ins->obufp++ = 'b';
10901
50.2k
    break;
10902
1.86M
  case 'B':
10903
1.86M
    if (l == 0)
10904
1.84M
      {
10905
1.86M
      case_B:
10906
1.86M
        if (ins->intel_syntax)
10907
313k
    break;
10908
1.54M
        if (sizeflag & SUFFIX_ALWAYS)
10909
16.2k
    *ins->obufp++ = 'b';
10910
1.54M
      }
10911
22.4k
    else if (l == 1 && last[0] == 'L')
10912
21.1k
      {
10913
21.1k
        if (ins->address_mode == mode_64bit
10914
17.1k
      && !(ins->prefixes & PREFIX_ADDR))
10915
16.3k
    {
10916
16.3k
      *ins->obufp++ = 'a';
10917
16.3k
      *ins->obufp++ = 'b';
10918
16.3k
      *ins->obufp++ = 's';
10919
16.3k
    }
10920
10921
21.1k
        goto case_B;
10922
21.1k
      }
10923
1.26k
    else if (l && last[0] == 'X')
10924
1.26k
      {
10925
1.26k
        if (!ins->vex.w)
10926
826
    oappend (ins, "bf16");
10927
441
        else
10928
441
    oappend (ins, "{bad}");
10929
1.26k
      }
10930
0
    else
10931
0
      abort ();
10932
1.54M
    break;
10933
1.54M
  case 'C':
10934
11.5k
    if (l == 1 && last[0] == 'C')
10935
6.32k
      {
10936
        /* Condition code (taken from the map-0 Jcc entries).  */
10937
6.32k
        for (const char *q = dis386[0x70 | ins->condition_code].name + 1;
10938
9.39k
       ISLOWER(*q); ++q)
10939
9.39k
    *ins->obufp++ = *q;
10940
6.32k
        break;
10941
6.32k
      }
10942
5.23k
    else if (l == 1 && last[0] == 'S')
10943
1.29k
      {
10944
        /* Add scc suffix.  */
10945
1.29k
        oappend (ins, scc_suffix[ins->vex.scc]);
10946
10947
        /* For SCC insns, the ND bit is required to be set to 0.  */
10948
1.29k
        if (ins->vex.nd)
10949
656
    oappend (ins, "(bad)");
10950
10951
        /* These bits have been consumed and should be cleared or restored
10952
     to default values.  */
10953
1.29k
        ins->vex.v = 1;
10954
1.29k
        ins->vex.nf = false;
10955
1.29k
        ins->vex.mask_register_specifier = 0;
10956
1.29k
        break;
10957
1.29k
      }
10958
10959
3.93k
    if (l)
10960
0
      abort ();
10961
3.93k
    if (ins->intel_syntax && !alt)
10962
0
      break;
10963
3.93k
    if ((ins->prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
10964
1.75k
      {
10965
1.75k
        if (sizeflag & DFLAG)
10966
681
    *ins->obufp++ = ins->intel_syntax ? 'd' : 'l';
10967
1.07k
        else
10968
1.07k
    *ins->obufp++ = ins->intel_syntax ? 'w' : 's';
10969
1.75k
        ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
10970
1.75k
      }
10971
3.93k
    break;
10972
23.4k
  case 'D':
10973
23.4k
    if (l == 1)
10974
7.91k
      {
10975
7.91k
        switch (last[0])
10976
7.91k
        {
10977
7.91k
        case 'X':
10978
7.91k
    if (!ins->vex.evex || ins->vex.w)
10979
7.34k
      *ins->obufp++ = 'd';
10980
573
    else
10981
573
      oappend (ins, "{bad}");
10982
7.91k
    break;
10983
0
        default:
10984
0
    abort ();
10985
7.91k
        }
10986
7.91k
        break;
10987
7.91k
      }
10988
15.5k
    if (l)
10989
0
      abort ();
10990
15.5k
    if (ins->intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
10991
14.3k
      break;
10992
1.13k
    USED_REX (REX_W);
10993
1.13k
    if (ins->modrm.mod == 3)
10994
610
      {
10995
610
        if (ins->rex & REX_W)
10996
228
    *ins->obufp++ = 'q';
10997
382
        else
10998
382
    {
10999
382
      if (sizeflag & DFLAG)
11000
192
        *ins->obufp++ = ins->intel_syntax ? 'd' : 'l';
11001
190
      else
11002
190
        *ins->obufp++ = 'w';
11003
382
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11004
382
    }
11005
610
      }
11006
526
    else
11007
526
      *ins->obufp++ = 'w';
11008
1.13k
    break;
11009
59.2k
  case 'E':
11010
59.2k
    if (l == 1)
11011
44.2k
      {
11012
44.2k
        switch (last[0])
11013
44.2k
    {
11014
1.06k
    case 'M':
11015
1.06k
      if (ins->modrm.mod != 3)
11016
412
        break;
11017
    /* Fall through.  */
11018
42.5k
    case 'X':
11019
42.5k
      if (!ins->vex.evex || ins->vex.b || ins->vex.ll >= 2
11020
14.9k
          || (ins->rex2 & 7)
11021
8.45k
          || (ins->modrm.mod == 3 && (ins->rex & REX_X))
11022
7.44k
          || !ins->vex.v || ins->vex.mask_register_specifier)
11023
37.9k
        break;
11024
      /* AVX512 extends a number of V*D insns to also have V*Q variants,
11025
         merely distinguished by EVEX.W.  Look for a use of the
11026
         respective macro.  */
11027
4.55k
      if (ins->vex.w)
11028
1.87k
        {
11029
1.87k
          const char *pct = strchr (p + 1, '%');
11030
11031
1.87k
          if (pct != NULL && pct[1] == 'D' && pct[2] == 'Q')
11032
633
      break;
11033
1.87k
        }
11034
3.92k
      *ins->obufp++ = '{';
11035
3.92k
      *ins->obufp++ = 'e';
11036
3.92k
      *ins->obufp++ = 'v';
11037
3.92k
      *ins->obufp++ = 'e';
11038
3.92k
      *ins->obufp++ = 'x';
11039
3.92k
      *ins->obufp++ = '}';
11040
3.92k
      *ins->obufp++ = ' ';
11041
3.92k
      break;
11042
1.30k
    case 'N':
11043
      /* Skip printing {evex} for some special instructions in MAP4.  */
11044
1.30k
      evex_printed = true;
11045
1.30k
      break;
11046
0
    default:
11047
0
      abort ();
11048
44.2k
    }
11049
44.2k
    break;
11050
44.2k
      }
11051
    /* For jcxz/jecxz */
11052
15.0k
    if (ins->address_mode == mode_64bit)
11053
11.9k
      {
11054
11.9k
        if (sizeflag & AFLAG)
11055
11.5k
    *ins->obufp++ = 'r';
11056
427
        else
11057
427
    *ins->obufp++ = 'e';
11058
11.9k
      }
11059
3.02k
    else
11060
3.02k
      if (sizeflag & AFLAG)
11061
1.61k
        *ins->obufp++ = 'e';
11062
15.0k
    ins->used_prefixes |= (ins->prefixes & PREFIX_ADDR);
11063
15.0k
    break;
11064
85.2k
  case 'F':
11065
85.2k
    if (l == 0)
11066
29.1k
      {
11067
29.1k
        if (ins->intel_syntax)
11068
5.07k
    break;
11069
24.0k
        if ((ins->prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
11070
1.72k
    {
11071
1.72k
      if (sizeflag & AFLAG)
11072
945
        *ins->obufp++ = ins->address_mode == mode_64bit ? 'q' : 'l';
11073
776
      else
11074
776
        *ins->obufp++ = ins->address_mode == mode_64bit ? 'l' : 'w';
11075
1.72k
      ins->used_prefixes |= (ins->prefixes & PREFIX_ADDR);
11076
1.72k
    }
11077
24.0k
      }
11078
56.1k
    else if (l == 1 && last[0] == 'C')
11079
3.05k
      {
11080
3.05k
        if (ins->vex.nd && !ins->vex.nf)
11081
1.28k
    break;
11082
1.77k
        *ins->obufp++ = 'c';
11083
1.77k
        *ins->obufp++ = 'f';
11084
        /* Skip printing {evex} */
11085
1.77k
        evex_printed = true;
11086
1.77k
      }
11087
53.0k
    else if (l == 1 && last[0] == 'N')
11088
51.7k
      {
11089
51.7k
        if (ins->vex.nf)
11090
3.44k
    {
11091
3.44k
      oappend (ins, "{nf} ");
11092
      /* This bit needs to be cleared after it is consumed.  */
11093
3.44k
      ins->vex.nf = false;
11094
3.44k
      evex_printed = true;
11095
3.44k
    }
11096
48.3k
        else if (ins->evex_type == evex_from_vex && !(ins->rex2 & 7)
11097
702
           && ins->vex.v)
11098
429
    {
11099
429
      oappend (ins, "{evex} ");
11100
429
      evex_printed = true;
11101
429
    }
11102
51.7k
      }
11103
1.29k
    else if (l == 1 && last[0] == 'D')
11104
1.29k
      {
11105
        /* Get oszc flags value from register_specifier.  */
11106
1.29k
        int oszc_value = ~ins->vex.register_specifier & 0xf;
11107
11108
        /* Add {dfv=of, sf, zf, cf} flags.  */
11109
1.29k
        oappend (ins, oszc_flags[oszc_value]);
11110
11111
        /* These bits have been consumed and should be cleared.  */
11112
1.29k
        ins->vex.register_specifier = 0;
11113
1.29k
      }
11114
0
    else
11115
0
      abort ();
11116
78.8k
    break;
11117
78.8k
  case 'G':
11118
71.6k
    if (ins->intel_syntax || (ins->obufp[-1] != 's'
11119
35.0k
            && !(sizeflag & SUFFIX_ALWAYS)))
11120
45.5k
      break;
11121
26.1k
    if ((ins->rex & REX_W) || (sizeflag & DFLAG))
11122
25.3k
      *ins->obufp++ = 'l';
11123
824
    else
11124
824
      *ins->obufp++ = 'w';
11125
26.1k
    if (!(ins->rex & REX_W))
11126
24.9k
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11127
26.1k
    break;
11128
297k
  case 'H':
11129
297k
    if (l == 0)
11130
281k
      {
11131
281k
        if (ins->intel_syntax)
11132
53.9k
          break;
11133
227k
        if ((ins->prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
11134
218k
      || (ins->prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
11135
11.1k
    {
11136
11.1k
      ins->used_prefixes |= ins->prefixes & (PREFIX_CS | PREFIX_DS);
11137
11.1k
      *ins->obufp++ = ',';
11138
11.1k
      *ins->obufp++ = 'p';
11139
11140
      /* Set active_seg_prefix even if not set in 64-bit mode
11141
         because here it is a valid branch hint. */
11142
11.1k
      if (ins->prefixes & PREFIX_DS)
11143
1.92k
        {
11144
1.92k
          ins->active_seg_prefix = PREFIX_DS;
11145
1.92k
          *ins->obufp++ = 't';
11146
1.92k
        }
11147
9.24k
      else
11148
9.24k
        {
11149
9.24k
          ins->active_seg_prefix = PREFIX_CS;
11150
9.24k
          *ins->obufp++ = 'n';
11151
9.24k
        }
11152
11.1k
    }
11153
227k
      }
11154
16.0k
    else if (l == 1 && last[0] == 'X')
11155
16.0k
      {
11156
16.0k
        if (!ins->vex.w)
11157
7.64k
    *ins->obufp++ = 'h';
11158
8.41k
        else
11159
8.41k
    oappend (ins, "{bad}");
11160
16.0k
      }
11161
0
    else
11162
0
      abort ();
11163
243k
    break;
11164
243k
  case 'K':
11165
1.62k
    USED_REX (REX_W);
11166
1.62k
    if (ins->rex & REX_W)
11167
578
      *ins->obufp++ = 'q';
11168
1.04k
    else
11169
1.04k
      *ins->obufp++ = 'd';
11170
1.62k
    break;
11171
1.98k
  case 'L':
11172
1.98k
    if (ins->intel_syntax)
11173
524
      break;
11174
1.46k
    if (sizeflag & SUFFIX_ALWAYS)
11175
1.17k
      {
11176
1.17k
        if (ins->rex & REX_W)
11177
572
    *ins->obufp++ = 'q';
11178
602
        else
11179
602
    *ins->obufp++ = 'l';
11180
1.17k
      }
11181
1.46k
    break;
11182
1.90k
  case 'M':
11183
1.90k
    if (ins->intel_mnemonic != cond)
11184
794
      *ins->obufp++ = 'r';
11185
1.90k
    break;
11186
2.72k
  case 'N':
11187
2.72k
    if ((ins->prefixes & PREFIX_FWAIT) == 0)
11188
2.12k
      *ins->obufp++ = 'n';
11189
599
    else
11190
599
      ins->used_prefixes |= PREFIX_FWAIT;
11191
2.72k
    break;
11192
39.6k
  case 'O':
11193
39.6k
    USED_REX (REX_W);
11194
39.6k
    if (ins->rex & REX_W)
11195
2.25k
      *ins->obufp++ = 'o';
11196
37.4k
    else if (ins->intel_syntax && (sizeflag & DFLAG))
11197
3.52k
      *ins->obufp++ = 'q';
11198
33.8k
    else
11199
33.8k
      *ins->obufp++ = 'd';
11200
39.6k
    if (!(ins->rex & REX_W))
11201
37.4k
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11202
39.6k
    break;
11203
79.6k
  case '@':
11204
79.6k
    if (ins->address_mode == mode_64bit
11205
73.8k
        && (ins->isa64 == intel64 || (ins->rex & REX_W)
11206
69.1k
      || !(ins->prefixes & PREFIX_DATA)))
11207
72.7k
      {
11208
72.7k
        if (sizeflag & SUFFIX_ALWAYS)
11209
1.55k
    *ins->obufp++ = 'q';
11210
72.7k
        break;
11211
72.7k
      }
11212
    /* Fall through.  */
11213
375k
  case 'P':
11214
375k
    if (l == 0)
11215
331k
      {
11216
331k
        if (!cond && ins->last_rex2_prefix >= 0 && (ins->rex & REX_W))
11217
777
    {
11218
      /* For pushp and popp, p is printed and do not print {rex2}
11219
         for them.  */
11220
777
      *ins->obufp++ = 'p';
11221
777
      ins->rex2 |= REX2_SPECIAL;
11222
777
      break;
11223
777
    }
11224
11225
        /* For "!P" print nothing else in Intel syntax.  */
11226
330k
        if (!cond && ins->intel_syntax)
11227
39.7k
    break;
11228
11229
290k
        if ((ins->modrm.mod == 3 || !cond)
11230
173k
      && !(sizeflag & SUFFIX_ALWAYS))
11231
170k
    break;
11232
    /* Fall through.  */
11233
121k
  case 'T':
11234
121k
        if ((!(ins->rex & REX_W) && (ins->prefixes & PREFIX_DATA))
11235
117k
      || ((sizeflag & SUFFIX_ALWAYS)
11236
3.95k
          && ins->address_mode != mode_64bit))
11237
4.26k
    {
11238
4.26k
      *ins->obufp++ = (sizeflag & DFLAG)
11239
4.26k
          ? ins->intel_syntax ? 'd' : 'l' : 'w';
11240
4.26k
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11241
4.26k
    }
11242
116k
        else if (sizeflag & SUFFIX_ALWAYS)
11243
3.00k
    *ins->obufp++ = 'q';
11244
121k
      }
11245
44.0k
    else if (l == 1 && last[0] == 'L')
11246
44.0k
      {
11247
44.0k
        if ((ins->prefixes & PREFIX_DATA)
11248
43.1k
      || (ins->rex & REX_W)
11249
41.3k
      || (sizeflag & SUFFIX_ALWAYS))
11250
3.49k
    {
11251
3.49k
      USED_REX (REX_W);
11252
3.49k
      if (ins->rex & REX_W)
11253
1.73k
        *ins->obufp++ = 'q';
11254
1.76k
      else
11255
1.76k
        {
11256
1.76k
          if (sizeflag & DFLAG)
11257
980
      *ins->obufp++ = ins->intel_syntax ? 'd' : 'l';
11258
785
          else
11259
785
      *ins->obufp++ = 'w';
11260
1.76k
          ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11261
1.76k
        }
11262
3.49k
    }
11263
44.0k
      }
11264
0
    else
11265
0
      abort ();
11266
165k
    break;
11267
165k
  case 'Q':
11268
151k
    if (l == 0)
11269
135k
      {
11270
135k
        if (ins->intel_syntax && !alt)
11271
37.2k
    break;
11272
98.5k
        USED_REX (REX_W);
11273
98.5k
        if ((ins->need_modrm && ins->modrm.mod != 3 && !ins->vex.nd)
11274
32.5k
      || (sizeflag & SUFFIX_ALWAYS))
11275
66.5k
    {
11276
66.5k
      if (ins->rex & REX_W)
11277
2.02k
        *ins->obufp++ = 'q';
11278
64.5k
      else
11279
64.5k
        {
11280
64.5k
          if (sizeflag & DFLAG)
11281
57.1k
      *ins->obufp++ = ins->intel_syntax ? 'd' : 'l';
11282
7.41k
          else
11283
7.41k
      *ins->obufp++ = 'w';
11284
64.5k
          ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11285
64.5k
        }
11286
66.5k
    }
11287
98.5k
      }
11288
15.5k
    else if (l == 1 && last[0] == 'D')
11289
9.94k
      *ins->obufp++ = ins->vex.w ? 'q' : 'd';
11290
5.62k
    else if (l == 1 && last[0] == 'L')
11291
5.62k
      {
11292
5.62k
        if (cond ? ins->modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)
11293
5.62k
           : ins->address_mode != mode_64bit)
11294
1.70k
    break;
11295
3.91k
        if ((ins->rex & REX_W))
11296
1.29k
    {
11297
1.29k
      USED_REX (REX_W);
11298
1.29k
      *ins->obufp++ = 'q';
11299
1.29k
    }
11300
2.62k
        else if ((ins->address_mode == mode_64bit && cond)
11301
1.72k
          || (sizeflag & SUFFIX_ALWAYS))
11302
1.15k
    *ins->obufp++ = ins->intel_syntax? 'd' : 'l';
11303
3.91k
      }
11304
0
    else
11305
0
      abort ();
11306
112k
    break;
11307
112k
  case 'R':
11308
104k
    USED_REX (REX_W);
11309
104k
    if (ins->rex & REX_W)
11310
4.94k
      *ins->obufp++ = 'q';
11311
99.5k
    else if (sizeflag & DFLAG)
11312
93.8k
      {
11313
93.8k
        if (ins->intel_syntax)
11314
9.67k
      *ins->obufp++ = 'd';
11315
84.1k
        else
11316
84.1k
      *ins->obufp++ = 'l';
11317
93.8k
      }
11318
5.67k
    else
11319
5.67k
      *ins->obufp++ = 'w';
11320
104k
    if (ins->intel_syntax && !p[1]
11321
7.85k
        && ((ins->rex & REX_W) || (sizeflag & DFLAG)))
11322
7.29k
      *ins->obufp++ = 'e';
11323
104k
    if (!(ins->rex & REX_W))
11324
99.5k
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11325
104k
    break;
11326
746k
  case 'S':
11327
746k
    if (l == 0)
11328
720k
      {
11329
797k
      case_S:
11330
797k
        if (ins->intel_syntax)
11331
161k
    break;
11332
635k
        if (sizeflag & SUFFIX_ALWAYS)
11333
5.76k
    {
11334
5.76k
      if (ins->rex & REX_W)
11335
648
        *ins->obufp++ = 'q';
11336
5.11k
      else
11337
5.11k
        {
11338
5.11k
          if (sizeflag & DFLAG)
11339
4.60k
      *ins->obufp++ = 'l';
11340
516
          else
11341
516
      *ins->obufp++ = 'w';
11342
5.11k
          ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11343
5.11k
        }
11344
5.76k
    }
11345
635k
        break;
11346
797k
      }
11347
25.3k
    if (l != 1)
11348
0
      abort ();
11349
25.3k
    switch (last[0])
11350
25.3k
      {
11351
19.8k
      case 'L':
11352
19.8k
        if (ins->address_mode == mode_64bit
11353
13.0k
      && !(ins->prefixes & PREFIX_ADDR))
11354
12.3k
    {
11355
12.3k
      *ins->obufp++ = 'a';
11356
12.3k
      *ins->obufp++ = 'b';
11357
12.3k
      *ins->obufp++ = 's';
11358
12.3k
    }
11359
11360
19.8k
        goto case_S;
11361
5.47k
      case 'X':
11362
5.47k
        if (!ins->vex.evex || !ins->vex.w)
11363
4.41k
    *ins->obufp++ = 's';
11364
1.05k
        else
11365
1.05k
    oappend (ins, "{bad}");
11366
5.47k
        break;
11367
0
      default:
11368
0
        abort ();
11369
25.3k
      }
11370
5.47k
    break;
11371
5.47k
  case 'U':
11372
4.19k
    if (l == 1 && (last[0] == 'Z'))
11373
4.19k
      {
11374
        /* Although IMUL/SETcc does not support NDD, the EVEX.ND bit is
11375
     used to control whether its destination register has its upper
11376
     bits zeroed.  */
11377
4.19k
        if (ins->vex.nd)
11378
2.49k
    oappend (ins, "zu");
11379
4.19k
      }
11380
0
    else
11381
0
      abort ();
11382
4.19k
    break;
11383
74.2k
  case 'V':
11384
74.2k
    if (l == 0)
11385
16.6k
      {
11386
16.6k
        if (ins->need_vex)
11387
7.76k
    *ins->obufp++ = 'v';
11388
16.6k
      }
11389
57.5k
    else if (l == 1)
11390
57.5k
      {
11391
57.5k
        switch (last[0])
11392
57.5k
    {
11393
1.31k
    case 'X':
11394
1.31k
      if (ins->vex.evex)
11395
711
        break;
11396
603
      *ins->obufp++ = '{';
11397
603
      *ins->obufp++ = 'v';
11398
603
      *ins->obufp++ = 'e';
11399
603
      *ins->obufp++ = 'x';
11400
603
      *ins->obufp++ = '}';
11401
603
      *ins->obufp++ = ' ';
11402
603
      break;
11403
56.2k
    case 'L':
11404
56.2k
      if (ins->rex & REX_W)
11405
1.50k
        {
11406
1.50k
          *ins->obufp++ = 'a';
11407
1.50k
          *ins->obufp++ = 'b';
11408
1.50k
          *ins->obufp++ = 's';
11409
1.50k
        }
11410
56.2k
      goto case_S;
11411
0
    default:
11412
0
      abort ();
11413
57.5k
    }
11414
57.5k
      }
11415
0
    else
11416
0
      abort ();
11417
17.9k
    break;
11418
33.2k
  case 'W':
11419
33.2k
    if (l == 0)
11420
18.9k
      {
11421
        /* operand size flag for cwtl, cbtw */
11422
18.9k
        USED_REX (REX_W);
11423
18.9k
        if (ins->rex & REX_W)
11424
2.47k
    {
11425
2.47k
      if (ins->intel_syntax)
11426
1.15k
        *ins->obufp++ = 'd';
11427
1.32k
      else
11428
1.32k
        *ins->obufp++ = 'l';
11429
2.47k
    }
11430
16.4k
        else if (sizeflag & DFLAG)
11431
14.9k
    *ins->obufp++ = 'w';
11432
1.53k
        else
11433
1.53k
    *ins->obufp++ = 'b';
11434
18.9k
        if (!(ins->rex & REX_W))
11435
16.4k
    ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11436
18.9k
      }
11437
14.2k
    else if (l == 1)
11438
14.2k
      {
11439
14.2k
        if (!ins->need_vex)
11440
0
    abort ();
11441
14.2k
        if (last[0] == 'X')
11442
10.8k
    *ins->obufp++ = ins->vex.w ? 'd': 's';
11443
3.45k
        else if (last[0] == 'B')
11444
3.45k
    *ins->obufp++ = ins->vex.w ? 'w': 'b';
11445
0
        else
11446
0
    abort ();
11447
14.2k
      }
11448
0
    else
11449
0
      abort ();
11450
33.2k
    break;
11451
33.2k
  case 'X':
11452
10.6k
    if (l != 0)
11453
0
      abort ();
11454
10.6k
    if (ins->need_vex
11455
10.6k
        ? ins->vex.prefix == DATA_PREFIX_OPCODE
11456
10.6k
        : ins->prefixes & PREFIX_DATA)
11457
2.32k
      {
11458
2.32k
        *ins->obufp++ = 'd';
11459
2.32k
        ins->used_prefixes |= PREFIX_DATA;
11460
2.32k
      }
11461
8.33k
    else
11462
8.33k
      *ins->obufp++ = 's';
11463
10.6k
    break;
11464
15.9k
  case 'Y':
11465
15.9k
    if (l == 0)
11466
10.3k
      {
11467
10.3k
        if (ins->vex.mask_register_specifier)
11468
4.47k
    ins->illegal_masking = true;
11469
10.3k
      }
11470
5.65k
    else if (l == 1 && last[0] == 'X')
11471
5.65k
      {
11472
5.65k
        if (!ins->need_vex)
11473
562
    break;
11474
5.09k
        if (ins->intel_syntax
11475
4.09k
      || ((ins->modrm.mod == 3 || ins->vex.b)
11476
2.46k
          && !(sizeflag & SUFFIX_ALWAYS)))
11477
2.77k
    break;
11478
2.32k
        switch (ins->vex.length)
11479
2.32k
    {
11480
690
    case 128:
11481
690
      *ins->obufp++ = 'x';
11482
690
      break;
11483
1.01k
    case 256:
11484
1.01k
      *ins->obufp++ = 'y';
11485
1.01k
      break;
11486
622
    case 512:
11487
622
      if (!ins->vex.evex)
11488
0
    default:
11489
0
        abort ();
11490
2.32k
    }
11491
2.32k
      }
11492
0
    else
11493
0
      abort ();
11494
12.6k
    break;
11495
12.6k
  case 'Z':
11496
10.7k
    if (l == 0)
11497
6.95k
      {
11498
        /* These insns ignore ModR/M.mod: Force it to 3 for OP_E().  */
11499
6.95k
        ins->modrm.mod = 3;
11500
6.95k
        if (!ins->intel_syntax && (sizeflag & SUFFIX_ALWAYS))
11501
290
    *ins->obufp++ = ins->address_mode == mode_64bit ? 'q' : 'l';
11502
6.95k
      }
11503
3.75k
    else if (l == 1 && last[0] == 'X')
11504
3.75k
      {
11505
3.75k
        if (!ins->vex.evex)
11506
0
    abort ();
11507
3.75k
        if (ins->intel_syntax
11508
2.61k
      || ((ins->modrm.mod == 3 || ins->vex.b)
11509
1.52k
          && !(sizeflag & SUFFIX_ALWAYS)))
11510
2.41k
    break;
11511
1.33k
        switch (ins->vex.length)
11512
1.33k
    {
11513
287
    case 128:
11514
287
      *ins->obufp++ = 'x';
11515
287
      break;
11516
373
    case 256:
11517
373
      *ins->obufp++ = 'y';
11518
373
      break;
11519
679
    case 512:
11520
679
      *ins->obufp++ = 'z';
11521
679
      break;
11522
0
    default:
11523
0
      abort ();
11524
1.33k
    }
11525
1.33k
      }
11526
0
    else
11527
0
      abort ();
11528
8.29k
    break;
11529
21.1k
  case '^':
11530
21.1k
    if (ins->intel_syntax)
11531
6.14k
      break;
11532
15.0k
    if (ins->isa64 == intel64 && (ins->rex & REX_W))
11533
194
      {
11534
194
        USED_REX (REX_W);
11535
194
        *ins->obufp++ = 'q';
11536
194
        break;
11537
194
      }
11538
14.8k
    if ((ins->prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
11539
1.29k
      {
11540
1.29k
        if (sizeflag & DFLAG)
11541
665
    *ins->obufp++ = 'l';
11542
631
        else
11543
631
    *ins->obufp++ = 'w';
11544
1.29k
        ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11545
1.29k
      }
11546
14.8k
    break;
11547
20.7M
  }
11548
11549
20.7M
      if (len == l)
11550
20.4M
  len = l = 0;
11551
20.7M
    }
11552
4.48M
  *ins->obufp = 0;
11553
4.48M
  ins->mnemonicendp = ins->obufp;
11554
4.48M
  return 0;
11555
4.48M
}
11556
11557
/* Add a style marker to *INS->obufp that encodes STYLE.  This assumes that
11558
   the buffer pointed to by INS->obufp has space.  A style marker is made
11559
   from the STYLE_MARKER_CHAR followed by STYLE converted to a single hex
11560
   digit, followed by another STYLE_MARKER_CHAR.  This function assumes
11561
   that the number of styles is not greater than 16.  */
11562
11563
static void
11564
oappend_insert_style (instr_info *ins, enum disassembler_style style)
11565
15.7M
{
11566
15.7M
  unsigned num = (unsigned) style;
11567
11568
  /* We currently assume that STYLE can be encoded as a single hex
11569
     character.  If more styles are added then this might start to fail,
11570
     and we'll need to expand this code.  */
11571
15.7M
  if (num > 0xf)
11572
0
    abort ();
11573
11574
15.7M
  *ins->obufp++ = STYLE_MARKER_CHAR;
11575
15.7M
  *ins->obufp++ = (num < 10 ? ('0' + num)
11576
15.7M
       : ((num < 16) ? ('a' + (num - 10)) : '0'));
11577
15.7M
  *ins->obufp++ = STYLE_MARKER_CHAR;
11578
11579
  /* This final null character is not strictly necessary, after inserting a
11580
     style marker we should always be inserting some additional content.
11581
     However, having the buffer null terminated doesn't cost much, and make
11582
     it easier to debug what's going on.  Also, if we do ever forget to add
11583
     any additional content after this style marker, then the buffer will
11584
     still be well formed.  */
11585
15.7M
  *ins->obufp = '\0';
11586
15.7M
}
11587
11588
static void
11589
oappend_with_style (instr_info *ins, const char *s,
11590
        enum disassembler_style style)
11591
9.92M
{
11592
9.92M
  oappend_insert_style (ins, style);
11593
9.92M
  ins->obufp = stpcpy (ins->obufp, s);
11594
9.92M
}
11595
11596
/* Add a comment to the comment buffer.  */
11597
11598
static void
11599
cappend_with_style (instr_info *ins, const char *s,
11600
        enum disassembler_style style)
11601
0
{
11602
0
  size_t len = strlen (ins->cbufp);
11603
11604
0
  if (len + !!len + strlen (s) + 4 >= COMMENT_BUFFER_SIZE)
11605
0
    return;
11606
11607
0
  unsigned num = (unsigned) style;
11608
11609
0
  if (len)
11610
0
    *ins->cbufp++ = ' ';
11611
0
  *ins->cbufp++ = STYLE_MARKER_CHAR;
11612
0
  *ins->cbufp++ = (num < 10 ? ('0' + num)
11613
0
       : ((num < 16) ? ('a' + (num - 10)) : '0'));
11614
0
  *ins->cbufp++ = STYLE_MARKER_CHAR;
11615
11616
0
  ins->cbufp = stpcpy (ins->cbufp, s);
11617
0
}
11618
11619
/* Add a single character C to the buffer pointer to by INS->obufp, marking
11620
   the style for the character as STYLE.  */
11621
11622
static void
11623
oappend_char_with_style (instr_info *ins, const char c,
11624
       enum disassembler_style style)
11625
5.82M
{
11626
5.82M
  oappend_insert_style (ins, style);
11627
5.82M
  *ins->obufp++ = c;
11628
5.82M
  *ins->obufp = '\0';
11629
5.82M
}
11630
11631
/* Like oappend_char_with_style, but always uses dis_style_text.  */
11632
11633
static void
11634
oappend_char (instr_info *ins, const char c)
11635
5.08M
{
11636
5.08M
  oappend_char_with_style (ins, c, dis_style_text);
11637
5.08M
}
11638
11639
static void
11640
append_seg (instr_info *ins)
11641
2.39M
{
11642
  /* Only print the active segment register.  */
11643
2.39M
  if (!ins->active_seg_prefix)
11644
2.32M
    return;
11645
11646
66.6k
  ins->used_prefixes |= ins->active_seg_prefix;
11647
66.6k
  switch (ins->active_seg_prefix)
11648
66.6k
    {
11649
3.00k
    case PREFIX_CS:
11650
3.00k
      oappend_register (ins, att_names_seg[1]);
11651
3.00k
      break;
11652
27.4k
    case PREFIX_DS:
11653
27.4k
      oappend_register (ins, att_names_seg[3]);
11654
27.4k
      break;
11655
1.78k
    case PREFIX_SS:
11656
1.78k
      oappend_register (ins, att_names_seg[2]);
11657
1.78k
      break;
11658
1.82k
    case PREFIX_ES:
11659
1.82k
      oappend_register (ins, att_names_seg[0]);
11660
1.82k
      break;
11661
13.6k
    case PREFIX_FS:
11662
13.6k
      oappend_register (ins, att_names_seg[4]);
11663
13.6k
      break;
11664
18.8k
    case PREFIX_GS:
11665
18.8k
      oappend_register (ins, att_names_seg[5]);
11666
18.8k
      break;
11667
0
    default:
11668
0
      break;
11669
66.6k
    }
11670
66.6k
  oappend_char (ins, ':');
11671
66.6k
}
11672
11673
static void
11674
print_operand_value (instr_info *ins, bfd_vma disp,
11675
         enum disassembler_style style)
11676
979k
{
11677
979k
  char tmp[30];
11678
11679
979k
  if (ins->address_mode != mode_64bit)
11680
183k
    disp &= 0xffffffff;
11681
979k
  sprintf (tmp, "0x%" PRIx64, (uint64_t) disp);
11682
979k
  oappend_with_style (ins, tmp, style);
11683
979k
}
11684
11685
/* Like oappend, but called for immediate operands.  */
11686
11687
static void
11688
oappend_immediate (instr_info *ins, bfd_vma imm)
11689
598k
{
11690
598k
  if (!ins->intel_syntax)
11691
468k
    oappend_char_with_style (ins, '$', dis_style_immediate);
11692
11693
598k
  print_operand_value (ins, imm, dis_style_immediate);
11694
11695
  /* Determine if we can display some more information about this immediate.  */
11696
598k
  if (! ins->annotate_immediates
11697
      /* Don't bother with zero, even if there is symbol associated with it.  */
11698
592
      || imm == 0
11699
      /* For the next tests we need a BFD.  If we do not have one then do not proceed.  */
11700
402
      || ins->info->section == NULL
11701
0
      || ins->info->section->owner == NULL
11702
      /* Save time by avoiding immediates that cannot reference part of the address space.  */
11703
0
      || imm < ins->info->section->owner->start_address
11704
      /* Also skip static object files as their symbols have not been resolved.  */
11705
0
      || (ins->info->section->owner->flags & (EXEC_P | DYNAMIC)) == 0)
11706
598k
    return;
11707
11708
0
  asymbol * sym = ins->info->symbol_at_address_func (imm, ins->info);
11709
0
  if (sym == NULL)
11710
0
    return;
11711
11712
0
  char * annotation = NULL;
11713
11714
0
  if (asprintf (& annotation, "[%s]", sym->name) > 0)
11715
0
    {
11716
      /* Display the symbol associated with address 'imm'.  */
11717
0
      cappend_with_style (ins, annotation, dis_style_symbol);
11718
0
    }
11719
11720
0
  free (annotation);
11721
0
}
11722
11723
/* Put DISP in BUF as signed hex number.  */
11724
11725
static void
11726
print_displacement (instr_info *ins, bfd_signed_vma val)
11727
513k
{
11728
513k
  char tmp[30];
11729
11730
513k
  if (val < 0)
11731
146k
    {
11732
146k
      oappend_char_with_style (ins, '-', dis_style_address_offset);
11733
146k
      val = (bfd_vma) 0 - val;
11734
11735
      /* Check for possible overflow.  */
11736
146k
      if (val < 0)
11737
0
  {
11738
0
    switch (ins->address_mode)
11739
0
      {
11740
0
      case mode_64bit:
11741
0
        oappend_with_style (ins, "0x8000000000000000",
11742
0
          dis_style_address_offset);
11743
0
        break;
11744
0
      case mode_32bit:
11745
0
        oappend_with_style (ins, "0x80000000",
11746
0
          dis_style_address_offset);
11747
0
        break;
11748
0
      case mode_16bit:
11749
0
        oappend_with_style (ins, "0x8000",
11750
0
          dis_style_address_offset);
11751
0
        break;
11752
0
      }
11753
0
    return;
11754
0
  }
11755
146k
    }
11756
11757
513k
  sprintf (tmp, "0x%" PRIx64, (int64_t) val);
11758
513k
  oappend_with_style (ins, tmp, dis_style_address_offset);
11759
513k
}
11760
11761
static void
11762
intel_operand_size (instr_info *ins, int bytemode, int sizeflag)
11763
544k
{
11764
  /* Check if there is a broadcast, when evex.b is not treated as evex.nd.  */
11765
544k
  if (ins->vex.b && ins->evex_type == evex_default)
11766
6.57k
    {
11767
6.57k
      if (!ins->vex.no_broadcast)
11768
5.86k
  switch (bytemode)
11769
5.86k
    {
11770
2.02k
    case x_mode:
11771
2.67k
    case evex_half_bcst_xmmq_mode:
11772
2.67k
      if (ins->vex.w)
11773
1.52k
        oappend (ins, "QWORD BCST ");
11774
1.15k
      else
11775
1.15k
        oappend (ins, "DWORD BCST ");
11776
2.67k
      break;
11777
823
    case xh_mode:
11778
1.18k
    case evex_half_bcst_xmmqh_mode:
11779
1.49k
    case evex_half_bcst_xmmqdh_mode:
11780
1.49k
      oappend (ins, "WORD BCST ");
11781
1.49k
      break;
11782
1.68k
    default:
11783
1.68k
      ins->vex.no_broadcast = true;
11784
1.68k
      break;
11785
5.86k
    }
11786
6.57k
      return;
11787
6.57k
    }
11788
538k
  switch (bytemode)
11789
538k
    {
11790
289k
    case b_mode:
11791
309k
    case b_swap_mode:
11792
309k
    case db_mode:
11793
309k
      oappend (ins, "BYTE PTR ");
11794
309k
      break;
11795
6.95k
    case w_mode:
11796
7.35k
    case w_swap_mode:
11797
7.80k
    case dw_mode:
11798
7.80k
      oappend (ins, "WORD PTR ");
11799
7.80k
      break;
11800
9.26k
    case indir_v_mode:
11801
9.26k
      if (ins->address_mode == mode_64bit && ins->isa64 == intel64)
11802
194
  {
11803
194
    oappend (ins, "QWORD PTR ");
11804
194
    break;
11805
194
  }
11806
      /* Fall through.  */
11807
12.1k
    case stack_v_mode:
11808
12.1k
      if (ins->address_mode == mode_64bit && ((sizeflag & DFLAG)
11809
1.37k
                || (ins->rex & REX_W)))
11810
7.54k
  {
11811
7.54k
    oappend (ins, "QWORD PTR ");
11812
7.54k
    break;
11813
7.54k
  }
11814
      /* Fall through.  */
11815
91.4k
    case v_mode:
11816
119k
    case v_swap_mode:
11817
121k
    case dq_mode:
11818
121k
      USED_REX (REX_W);
11819
121k
      if (ins->rex & REX_W)
11820
4.37k
  oappend (ins, "QWORD PTR ");
11821
117k
      else if (bytemode == dq_mode)
11822
2.59k
  oappend (ins, "DWORD PTR ");
11823
114k
      else
11824
114k
  {
11825
114k
    if (sizeflag & DFLAG)
11826
106k
      oappend (ins, "DWORD PTR ");
11827
8.49k
    else
11828
8.49k
      oappend (ins, "WORD PTR ");
11829
114k
    ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11830
114k
  }
11831
121k
      break;
11832
19.4k
    case z_mode:
11833
19.4k
      if ((ins->rex & REX_W) || (sizeflag & DFLAG))
11834
16.9k
  *ins->obufp++ = 'D';
11835
19.4k
      oappend (ins, "WORD PTR ");
11836
19.4k
      if (!(ins->rex & REX_W))
11837
18.6k
  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11838
19.4k
      break;
11839
6.91k
    case a_mode:
11840
6.91k
      if (sizeflag & DFLAG)
11841
4.65k
  oappend (ins, "QWORD PTR ");
11842
2.26k
      else
11843
2.26k
  oappend (ins, "DWORD PTR ");
11844
6.91k
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11845
6.91k
      break;
11846
2.20k
    case movsxd_mode:
11847
2.20k
      if (!(sizeflag & DFLAG) && ins->isa64 == intel64)
11848
190
  oappend (ins, "WORD PTR ");
11849
2.01k
      else
11850
2.01k
  oappend (ins, "DWORD PTR ");
11851
2.20k
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11852
2.20k
      break;
11853
3.78k
    case d_mode:
11854
4.22k
    case d_swap_mode:
11855
4.22k
      oappend (ins, "DWORD PTR ");
11856
4.22k
      break;
11857
11.9k
    case q_mode:
11858
12.8k
    case q_swap_mode:
11859
12.8k
      oappend (ins, "QWORD PTR ");
11860
12.8k
      break;
11861
1.02k
    case m_mode:
11862
1.02k
      if (ins->address_mode == mode_64bit)
11863
536
  oappend (ins, "QWORD PTR ");
11864
488
      else
11865
488
  oappend (ins, "DWORD PTR ");
11866
1.02k
      break;
11867
7.30k
    case f_mode:
11868
7.30k
      if (sizeflag & DFLAG)
11869
4.66k
  oappend (ins, "FWORD PTR ");
11870
2.63k
      else
11871
2.63k
  oappend (ins, "DWORD PTR ");
11872
7.30k
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11873
7.30k
      break;
11874
768
    case t_mode:
11875
768
      oappend (ins, "TBYTE PTR ");
11876
768
      break;
11877
9.85k
    case x_mode:
11878
11.0k
    case xh_mode:
11879
12.3k
    case x_swap_mode:
11880
12.7k
    case evex_x_gscat_mode:
11881
13.3k
    case evex_x_nobcst_mode:
11882
13.9k
    case bw_unit_mode:
11883
13.9k
      if (ins->need_vex)
11884
9.07k
  {
11885
9.07k
    switch (ins->vex.length)
11886
9.07k
      {
11887
3.36k
      case 128:
11888
3.36k
        oappend (ins, "XMMWORD PTR ");
11889
3.36k
        break;
11890
3.31k
      case 256:
11891
3.31k
        oappend (ins, "YMMWORD PTR ");
11892
3.31k
        break;
11893
2.39k
      case 512:
11894
2.39k
        oappend (ins, "ZMMWORD PTR ");
11895
2.39k
        break;
11896
0
      default:
11897
0
        abort ();
11898
9.07k
      }
11899
9.07k
  }
11900
4.87k
      else
11901
4.87k
  oappend (ins, "XMMWORD PTR ");
11902
13.9k
      break;
11903
13.9k
    case xmm_mode:
11904
945
      oappend (ins, "XMMWORD PTR ");
11905
945
      break;
11906
634
    case ymm_mode:
11907
634
      oappend (ins, "YMMWORD PTR ");
11908
634
      break;
11909
628
    case xmmq_mode:
11910
1.19k
    case evex_half_bcst_xmmqh_mode:
11911
2.27k
    case evex_half_bcst_xmmq_mode:
11912
2.27k
      switch (ins->vex.length)
11913
2.27k
  {
11914
796
  case 0:
11915
1.33k
  case 128:
11916
1.33k
    oappend (ins, "QWORD PTR ");
11917
1.33k
    break;
11918
430
  case 256:
11919
430
    oappend (ins, "XMMWORD PTR ");
11920
430
    break;
11921
508
  case 512:
11922
508
    oappend (ins, "YMMWORD PTR ");
11923
508
    break;
11924
0
  default:
11925
0
    abort ();
11926
2.27k
  }
11927
2.27k
      break;
11928
2.27k
    case xmmdw_mode:
11929
1.24k
      if (!ins->need_vex)
11930
0
  abort ();
11931
11932
1.24k
      switch (ins->vex.length)
11933
1.24k
  {
11934
561
  case 128:
11935
561
    oappend (ins, "WORD PTR ");
11936
561
    break;
11937
401
  case 256:
11938
401
    oappend (ins, "DWORD PTR ");
11939
401
    break;
11940
286
  case 512:
11941
286
    oappend (ins, "QWORD PTR ");
11942
286
    break;
11943
0
  default:
11944
0
    abort ();
11945
1.24k
  }
11946
1.24k
      break;
11947
1.67k
    case xmmqd_mode:
11948
2.26k
    case evex_half_bcst_xmmqdh_mode:
11949
2.26k
      if (!ins->need_vex)
11950
0
  abort ();
11951
11952
2.26k
      switch (ins->vex.length)
11953
2.26k
  {
11954
597
  case 128:
11955
597
    oappend (ins, "DWORD PTR ");
11956
597
    break;
11957
932
  case 256:
11958
932
    oappend (ins, "QWORD PTR ");
11959
932
    break;
11960
732
  case 512:
11961
732
    oappend (ins, "XMMWORD PTR ");
11962
732
    break;
11963
0
  default:
11964
0
    abort ();
11965
2.26k
  }
11966
2.26k
      break;
11967
2.26k
    case ymmq_mode:
11968
1.45k
      if (!ins->need_vex)
11969
0
  abort ();
11970
11971
1.45k
      switch (ins->vex.length)
11972
1.45k
  {
11973
465
  case 128:
11974
465
    oappend (ins, "QWORD PTR ");
11975
465
    break;
11976
713
  case 256:
11977
713
    oappend (ins, "YMMWORD PTR ");
11978
713
    break;
11979
272
  case 512:
11980
272
    oappend (ins, "ZMMWORD PTR ");
11981
272
    break;
11982
0
  default:
11983
0
    abort ();
11984
1.45k
  }
11985
1.45k
      break;
11986
1.45k
    case o_mode:
11987
286
      oappend (ins, "OWORD PTR ");
11988
286
      break;
11989
1.45k
    case vex_vsib_d_w_dq_mode:
11990
3.31k
    case vex_vsib_q_w_dq_mode:
11991
3.31k
      if (!ins->need_vex)
11992
0
  abort ();
11993
3.31k
      if (ins->vex.w)
11994
1.71k
  oappend (ins, "QWORD PTR ");
11995
1.59k
      else
11996
1.59k
  oappend (ins, "DWORD PTR ");
11997
3.31k
      break;
11998
1.16k
    case mask_bd_mode:
11999
1.16k
      if (!ins->need_vex || ins->vex.length != 128)
12000
0
  abort ();
12001
1.16k
      if (ins->vex.w)
12002
467
  oappend (ins, "DWORD PTR ");
12003
695
      else
12004
695
  oappend (ins, "BYTE PTR ");
12005
1.16k
      break;
12006
1.20k
    case mask_mode:
12007
1.20k
      if (!ins->need_vex)
12008
0
  abort ();
12009
1.20k
      if (ins->vex.w)
12010
588
  oappend (ins, "QWORD PTR ");
12011
613
      else
12012
613
  oappend (ins, "WORD PTR ");
12013
1.20k
      break;
12014
713
    case v_bnd_mode:
12015
2.40k
    case v_bndmk_mode:
12016
7.64k
    default:
12017
7.64k
      break;
12018
538k
    }
12019
538k
}
12020
12021
static void
12022
print_register (instr_info *ins, unsigned int reg, unsigned int rexmask,
12023
    int bytemode, int sizeflag)
12024
2.36M
{
12025
2.36M
  const char (*names)[8];
12026
12027
  /* Masking is invalid for insns with GPR destination. Set the flag uniformly,
12028
     as the consumer will inspect it only for the destination operand.  */
12029
2.36M
  if (bytemode != mask_mode && ins->vex.mask_register_specifier)
12030
9.30k
    ins->illegal_masking = true;
12031
12032
2.36M
  USED_REX (rexmask);
12033
2.36M
  if (ins->rex & rexmask)
12034
63.6k
    reg += 8;
12035
2.36M
  if (ins->rex2 & rexmask)
12036
19.1k
    reg += 16;
12037
12038
2.36M
  switch (bytemode)
12039
2.36M
    {
12040
1.69M
    case b_mode:
12041
1.71M
    case b_swap_mode:
12042
1.71M
      if (reg & 4)
12043
367k
  USED_REX (0);
12044
1.71M
      if (ins->rex || ins->rex2)
12045
33.9k
  names = att_names8rex;
12046
1.68M
      else
12047
1.68M
  names = att_names8;
12048
1.71M
      break;
12049
462
    case w_mode:
12050
462
      names = att_names16;
12051
462
      break;
12052
13.9k
    case d_mode:
12053
14.8k
    case dw_mode:
12054
15.6k
    case db_mode:
12055
15.6k
      names = att_names32;
12056
15.6k
      break;
12057
2.80k
    case q_mode:
12058
2.80k
      names = att_names64;
12059
2.80k
      break;
12060
8.18k
    case m_mode:
12061
8.45k
    case v_bnd_mode:
12062
8.45k
      names = ins->address_mode == mode_64bit ? att_names64 : att_names32;
12063
8.45k
      break;
12064
8.59k
    case bnd_mode:
12065
9.06k
    case bnd_swap_mode:
12066
9.06k
      if (reg > 0x3)
12067
3.77k
  {
12068
3.77k
    oappend (ins, "(bad)");
12069
3.77k
    return;
12070
3.77k
  }
12071
5.29k
      names = att_names_bnd;
12072
5.29k
      break;
12073
13.0k
    case indir_v_mode:
12074
13.0k
      if (ins->address_mode == mode_64bit && ins->isa64 == intel64)
12075
340
  {
12076
340
    names = att_names64;
12077
340
    break;
12078
340
  }
12079
      /* Fall through.  */
12080
19.2k
    case stack_v_mode:
12081
19.2k
      if (ins->address_mode == mode_64bit && ((sizeflag & DFLAG)
12082
957
                || (ins->rex & REX_W)))
12083
13.1k
  {
12084
13.1k
    names = att_names64;
12085
13.1k
    break;
12086
13.1k
  }
12087
6.16k
      bytemode = v_mode;
12088
      /* Fall through.  */
12089
551k
    case v_mode:
12090
568k
    case v_swap_mode:
12091
580k
    case dq_mode:
12092
580k
      USED_REX (REX_W);
12093
580k
      if (ins->rex & REX_W)
12094
61.9k
  names = att_names64;
12095
518k
      else if (bytemode != v_mode && bytemode != v_swap_mode)
12096
10.2k
  names = att_names32;
12097
508k
      else
12098
508k
  {
12099
508k
    if (sizeflag & DFLAG)
12100
454k
      names = att_names32;
12101
53.7k
    else
12102
53.7k
      names = att_names16;
12103
508k
    ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12104
508k
  }
12105
580k
      break;
12106
3.14k
    case movsxd_mode:
12107
3.14k
      if (!(sizeflag & DFLAG) && ins->isa64 == intel64)
12108
190
  names = att_names16;
12109
2.95k
      else
12110
2.95k
  names = att_names32;
12111
3.14k
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12112
3.14k
      break;
12113
1.31k
    case va_mode:
12114
1.31k
      names = (ins->address_mode == mode_64bit
12115
1.31k
         ? att_names64 : att_names32);
12116
1.31k
      if (!(ins->prefixes & PREFIX_ADDR))
12117
980
  names = (ins->address_mode == mode_16bit
12118
980
         ? att_names16 : names);
12119
330
      else
12120
330
  {
12121
    /* Remove "addr16/addr32".  */
12122
330
    ins->all_prefixes[ins->last_addr_prefix] = 0;
12123
330
    names = (ins->address_mode != mode_32bit
12124
330
           ? att_names32 : att_names16);
12125
330
    ins->used_prefixes |= PREFIX_ADDR;
12126
330
  }
12127
1.31k
      break;
12128
427
    case mask_bd_mode:
12129
16.7k
    case mask_mode:
12130
16.7k
      if (reg > 0x7)
12131
10.0k
  {
12132
10.0k
    oappend (ins, "(bad)");
12133
10.0k
    return;
12134
10.0k
  }
12135
6.69k
      names = att_names_mask;
12136
6.69k
      break;
12137
525
    case 0:
12138
525
      return;
12139
0
    default:
12140
0
      oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
12141
0
      return;
12142
2.36M
    }
12143
2.35M
  oappend_register (ins, names[reg]);
12144
2.35M
}
12145
12146
static bool
12147
get8s (instr_info *ins, bfd_vma *res)
12148
648k
{
12149
648k
  if (!fetch_code (ins->info, ins->codep + 1))
12150
9.52k
    return false;
12151
638k
  *res = ((bfd_vma) *ins->codep++ ^ 0x80) - 0x80;
12152
638k
  return true;
12153
648k
}
12154
12155
static bool
12156
get16 (instr_info *ins, bfd_vma *res)
12157
72.3k
{
12158
72.3k
  if (!fetch_code (ins->info, ins->codep + 2))
12159
3.05k
    return false;
12160
69.3k
  *res = *ins->codep++;
12161
69.3k
  *res |= (bfd_vma) *ins->codep++ << 8;
12162
69.3k
  return true;
12163
72.3k
}
12164
12165
static bool
12166
get16s (instr_info *ins, bfd_vma *res)
12167
21.9k
{
12168
21.9k
  if (!get16 (ins, res))
12169
1.06k
    return false;
12170
20.8k
  *res = (*res ^ 0x8000) - 0x8000;
12171
20.8k
  return true;
12172
21.9k
}
12173
12174
static bool
12175
get32 (instr_info *ins, bfd_vma *res)
12176
437k
{
12177
437k
  if (!fetch_code (ins->info, ins->codep + 4))
12178
15.4k
    return false;
12179
422k
  *res = *ins->codep++;
12180
422k
  *res |= (bfd_vma) *ins->codep++ << 8;
12181
422k
  *res |= (bfd_vma) *ins->codep++ << 16;
12182
422k
  *res |= (bfd_vma) *ins->codep++ << 24;
12183
422k
  return true;
12184
437k
}
12185
12186
static bool
12187
get32s (instr_info *ins, bfd_vma *res)
12188
268k
{
12189
268k
  if (!get32 (ins, res))
12190
10.4k
    return false;
12191
12192
258k
  *res = (*res ^ ((bfd_vma) 1 << 31)) - ((bfd_vma) 1 << 31);
12193
12194
258k
  return true;
12195
268k
}
12196
12197
static bool
12198
get64 (instr_info *ins, uint64_t *res)
12199
29.1k
{
12200
29.1k
  unsigned int a;
12201
29.1k
  unsigned int b;
12202
12203
29.1k
  if (!fetch_code (ins->info, ins->codep + 8))
12204
1.27k
    return false;
12205
27.8k
  a = *ins->codep++;
12206
27.8k
  a |= (unsigned int) *ins->codep++ << 8;
12207
27.8k
  a |= (unsigned int) *ins->codep++ << 16;
12208
27.8k
  a |= (unsigned int) *ins->codep++ << 24;
12209
27.8k
  b = *ins->codep++;
12210
27.8k
  b |= (unsigned int) *ins->codep++ << 8;
12211
27.8k
  b |= (unsigned int) *ins->codep++ << 16;
12212
27.8k
  b |= (unsigned int) *ins->codep++ << 24;
12213
27.8k
  *res = a + ((uint64_t) b << 32);
12214
27.8k
  return true;
12215
29.1k
}
12216
12217
static void
12218
set_op (instr_info *ins, bfd_vma op, bool riprel)
12219
368k
{
12220
368k
  ins->op_index[ins->op_ad] = ins->op_ad;
12221
368k
  if (ins->address_mode == mode_64bit)
12222
312k
    ins->op_address[ins->op_ad] = op;
12223
56.2k
  else /* Mask to get a 32-bit address.  */
12224
56.2k
    ins->op_address[ins->op_ad] = op & 0xffffffff;
12225
368k
  ins->op_riprel[ins->op_ad] = riprel;
12226
368k
}
12227
12228
static bool
12229
BadOp (instr_info *ins)
12230
44.8k
{
12231
  /* Throw away prefixes and 1st. opcode byte.  */
12232
44.8k
  struct dis_private *priv = ins->info->private_data;
12233
12234
44.8k
  ins->codep = priv->the_buffer + ins->nr_prefixes + ins->need_vex + 1;
12235
44.8k
  ins->obufp = stpcpy (ins->obufp, "(bad)");
12236
44.8k
  return true;
12237
44.8k
}
12238
12239
static bool
12240
OP_Skip_MODRM (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
12241
         int sizeflag ATTRIBUTE_UNUSED)
12242
2.06k
{
12243
2.06k
  if (ins->modrm.mod != 3)
12244
784
    return BadOp (ins);
12245
12246
  /* Skip mod/rm byte.  */
12247
1.27k
  MODRM_CHECK;
12248
1.27k
  ins->codep++;
12249
1.27k
  ins->has_skipped_modrm = true;
12250
1.27k
  return true;
12251
1.27k
}
12252
12253
static bool
12254
OP_E_memory (instr_info *ins, int bytemode, int sizeflag)
12255
2.17M
{
12256
2.17M
  int add = (ins->rex & REX_B) ? 8 : 0;
12257
2.17M
  int riprel = 0;
12258
2.17M
  int shift;
12259
12260
2.17M
  add += (ins->rex2 & REX_B) ? 16 : 0;
12261
12262
  /* Handles EVEX other than APX EVEX-promoted instructions.  */
12263
2.17M
  if (ins->vex.evex && ins->evex_type == evex_default)
12264
52.3k
    {
12265
12266
      /* Zeroing-masking is invalid for memory destinations. Set the flag
12267
   uniformly, as the consumer will inspect it only for the destination
12268
   operand.  */
12269
52.3k
      if (ins->vex.zeroing)
12270
19.8k
  ins->illegal_masking = true;
12271
12272
52.3k
      switch (bytemode)
12273
52.3k
  {
12274
373
  case dw_mode:
12275
963
  case w_mode:
12276
1.38k
  case w_swap_mode:
12277
1.38k
    shift = 1;
12278
1.38k
    break;
12279
419
  case db_mode:
12280
779
  case b_mode:
12281
779
    shift = 0;
12282
779
    break;
12283
1.39k
  case dq_mode:
12284
1.39k
    if (ins->address_mode != mode_64bit)
12285
569
      {
12286
1.89k
  case d_mode:
12287
2.33k
  case d_swap_mode:
12288
2.33k
        shift = 2;
12289
2.33k
        break;
12290
1.89k
      }
12291
      /* fall through */
12292
3.82k
  case vex_vsib_d_w_dq_mode:
12293
7.01k
  case vex_vsib_q_w_dq_mode:
12294
7.54k
  case evex_x_gscat_mode:
12295
7.54k
    shift = ins->vex.w ? 3 : 2;
12296
7.54k
    break;
12297
4.53k
  case xh_mode:
12298
6.08k
  case evex_half_bcst_xmmqh_mode:
12299
7.76k
  case evex_half_bcst_xmmqdh_mode:
12300
7.76k
    if (ins->vex.b)
12301
4.09k
      {
12302
4.09k
        shift = ins->vex.w ? 2 : 1;
12303
4.09k
        break;
12304
4.09k
      }
12305
    /* Fall through.  */
12306
22.7k
  case x_mode:
12307
24.5k
  case evex_half_bcst_xmmq_mode:
12308
24.5k
    if (ins->vex.b)
12309
10.4k
      {
12310
10.4k
        shift = ins->vex.w ? 3 : 2;
12311
10.4k
        break;
12312
10.4k
      }
12313
    /* Fall through.  */
12314
15.4k
  case xmmqd_mode:
12315
16.3k
  case xmmdw_mode:
12316
16.7k
  case xmmq_mode:
12317
19.1k
  case ymmq_mode:
12318
19.5k
  case evex_x_nobcst_mode:
12319
20.1k
  case x_swap_mode:
12320
20.1k
    switch (ins->vex.length)
12321
20.1k
      {
12322
6.91k
      case 128:
12323
6.91k
        shift = 4;
12324
6.91k
        break;
12325
6.31k
      case 256:
12326
6.31k
        shift = 5;
12327
6.31k
        break;
12328
6.91k
      case 512:
12329
6.91k
        shift = 6;
12330
6.91k
        break;
12331
0
      default:
12332
0
        abort ();
12333
20.1k
      }
12334
    /* Make necessary corrections to shift for modes that need it.  */
12335
20.1k
    if (bytemode == xmmq_mode
12336
19.7k
        || bytemode == evex_half_bcst_xmmqh_mode
12337
19.1k
        || bytemode == evex_half_bcst_xmmq_mode
12338
18.6k
        || (bytemode == ymmq_mode && ins->vex.length == 128))
12339
3.09k
      shift -= 1;
12340
17.0k
    else if (bytemode == xmmqd_mode
12341
15.7k
             || bytemode == evex_half_bcst_xmmqdh_mode)
12342
2.27k
      shift -= 2;
12343
14.7k
    else if (bytemode == xmmdw_mode)
12344
987
      shift -= 3;
12345
20.1k
    break;
12346
697
  case ymm_mode:
12347
697
    shift = 5;
12348
697
    break;
12349
1.06k
  case xmm_mode:
12350
1.06k
    shift = 4;
12351
1.06k
    break;
12352
1.27k
  case q_mode:
12353
1.93k
  case q_swap_mode:
12354
1.93k
    shift = 3;
12355
1.93k
    break;
12356
1.91k
  case bw_unit_mode:
12357
1.91k
    shift = ins->vex.w ? 1 : 0;
12358
1.91k
    break;
12359
0
  default:
12360
0
    abort ();
12361
52.3k
  }
12362
52.3k
    }
12363
2.12M
  else
12364
2.12M
    shift = 0;
12365
12366
2.17M
  USED_REX (REX_B);
12367
2.17M
  if (ins->intel_syntax)
12368
419k
    intel_operand_size (ins, bytemode, sizeflag);
12369
2.17M
  append_seg (ins);
12370
12371
2.17M
  if ((sizeflag & AFLAG) || ins->address_mode == mode_64bit)
12372
2.03M
    {
12373
      /* 32/64 bit address mode */
12374
2.03M
      bfd_vma disp = 0;
12375
2.03M
      int havedisp;
12376
2.03M
      int havebase;
12377
2.03M
      int needindex;
12378
2.03M
      int needaddr32;
12379
2.03M
      int base, rbase;
12380
2.03M
      int vindex = 0;
12381
2.03M
      int scale = 0;
12382
2.03M
      int addr32flag = !((sizeflag & AFLAG)
12383
15.8k
       || bytemode == v_bnd_mode
12384
15.3k
       || bytemode == v_bndmk_mode
12385
14.4k
       || bytemode == bnd_mode
12386
13.9k
       || bytemode == bnd_swap_mode);
12387
2.03M
      bool check_gather = false;
12388
2.03M
      const char (*indexes)[8] = NULL;
12389
12390
2.03M
      havebase = 1;
12391
2.03M
      base = ins->modrm.rm;
12392
12393
2.03M
      if (base == 4)
12394
132k
  {
12395
132k
    vindex = ins->sib.index;
12396
132k
    USED_REX (REX_X);
12397
132k
    if (ins->rex & REX_X)
12398
5.60k
      vindex += 8;
12399
132k
    switch (bytemode)
12400
132k
      {
12401
3.73k
      case vex_vsib_d_w_dq_mode:
12402
6.86k
      case vex_vsib_q_w_dq_mode:
12403
6.86k
        if (!ins->need_vex)
12404
0
    abort ();
12405
6.86k
        if (ins->vex.evex)
12406
4.79k
    {
12407
      /* S/G EVEX insns require EVEX.X4 not to be set.  */
12408
4.79k
      if (ins->rex2 & REX_X)
12409
552
        {
12410
552
          oappend (ins, "(bad)");
12411
552
          return true;
12412
552
        }
12413
12414
4.24k
      if (!ins->vex.v)
12415
3.46k
        vindex += 16;
12416
4.24k
      check_gather = ins->obufp == ins->op_out[1];
12417
4.24k
    }
12418
12419
6.31k
        switch (ins->vex.length)
12420
6.31k
    {
12421
1.50k
    case 128:
12422
1.50k
      indexes = att_names_xmm;
12423
1.50k
      break;
12424
2.49k
    case 256:
12425
2.49k
      if (!ins->vex.w
12426
1.43k
          || bytemode == vex_vsib_q_w_dq_mode)
12427
1.40k
        indexes = att_names_ymm;
12428
1.08k
      else
12429
1.08k
        indexes = att_names_xmm;
12430
2.49k
      break;
12431
2.32k
    case 512:
12432
2.32k
      if (!ins->vex.w
12433
1.17k
          || bytemode == vex_vsib_q_w_dq_mode)
12434
1.91k
        indexes = att_names_zmm;
12435
407
      else
12436
407
        indexes = att_names_ymm;
12437
2.32k
      break;
12438
0
    default:
12439
0
      abort ();
12440
6.31k
    }
12441
6.31k
        break;
12442
125k
      default:
12443
125k
        if (ins->rex2 & REX_X)
12444
3.65k
    vindex += 16;
12445
12446
125k
        if (vindex != 4)
12447
104k
    indexes = ins->address_mode == mode_64bit && !addr32flag
12448
104k
        ? att_names64 : att_names32;
12449
125k
        break;
12450
132k
      }
12451
132k
    scale = ins->sib.scale;
12452
132k
    base = ins->sib.base;
12453
132k
    ins->codep++;
12454
132k
  }
12455
1.90M
      else
12456
1.90M
  {
12457
    /* Check for mandatory SIB.  */
12458
1.90M
    if (bytemode == vex_vsib_d_w_dq_mode
12459
1.90M
        || bytemode == vex_vsib_q_w_dq_mode
12460
1.90M
        || bytemode == vex_sibmem_mode)
12461
2.24k
      {
12462
2.24k
        oappend (ins, "(bad)");
12463
2.24k
        return true;
12464
2.24k
      }
12465
1.90M
  }
12466
2.03M
      rbase = base + add;
12467
12468
2.03M
      switch (ins->modrm.mod)
12469
2.03M
  {
12470
1.59M
  case 0:
12471
1.59M
    if (base == 5)
12472
60.1k
      {
12473
60.1k
        havebase = 0;
12474
60.1k
        if (ins->address_mode == mode_64bit && !ins->has_sib)
12475
44.7k
    riprel = 1;
12476
60.1k
        if (!get32s (ins, &disp))
12477
3.69k
    return false;
12478
56.4k
        if (riprel && bytemode == v_bndmk_mode)
12479
414
    {
12480
414
      oappend (ins, "(bad)");
12481
414
      return true;
12482
414
    }
12483
56.4k
      }
12484
1.59M
    break;
12485
1.59M
  case 1:
12486
289k
    if (!get8s (ins, &disp))
12487
6.13k
      return false;
12488
283k
    if (ins->vex.evex && shift > 0)
12489
19.3k
      disp <<= shift;
12490
283k
    break;
12491
149k
  case 2:
12492
149k
    if (!get32s (ins, &disp))
12493
4.52k
      return false;
12494
144k
    break;
12495
2.03M
  }
12496
12497
2.02M
      needindex = 0;
12498
2.02M
      needaddr32 = 0;
12499
2.02M
      if (ins->has_sib
12500
130k
    && !havebase
12501
8.25k
    && !indexes
12502
3.57k
    && ins->address_mode != mode_16bit)
12503
3.08k
  {
12504
3.08k
    if (ins->address_mode == mode_64bit)
12505
2.48k
      {
12506
2.48k
        if (addr32flag)
12507
666
    {
12508
      /* Without base nor index registers, zero-extend the
12509
         lower 32-bit displacement to 64 bits.  */
12510
666
      disp &= 0xffffffff;
12511
666
      needindex = 1;
12512
666
    }
12513
2.48k
        needaddr32 = 1;
12514
2.48k
      }
12515
603
    else
12516
603
      {
12517
        /* In 32-bit mode, we need index register to tell [offset]
12518
     from [eiz*1 + offset].  */
12519
603
        needindex = 1;
12520
603
      }
12521
3.08k
  }
12522
12523
2.02M
      havedisp = (havebase
12524
56.0k
      || needindex
12525
54.7k
      || (ins->has_sib && (indexes || scale != 0)));
12526
12527
2.02M
      if (!ins->intel_syntax)
12528
1.64M
  if (ins->modrm.mod != 0 || base == 5)
12529
364k
    {
12530
364k
      if (havedisp || riprel)
12531
359k
        print_displacement (ins, disp);
12532
4.50k
      else
12533
4.50k
        print_operand_value (ins, disp, dis_style_address_offset);
12534
364k
      if (riprel)
12535
34.9k
        {
12536
34.9k
    set_op (ins, disp, true);
12537
34.9k
    oappend_char (ins, '(');
12538
34.9k
    oappend_with_style (ins, !addr32flag ? "%rip" : "%eip",
12539
34.9k
            dis_style_register);
12540
34.9k
    oappend_char (ins, ')');
12541
34.9k
        }
12542
364k
    }
12543
12544
2.02M
      if ((havebase || indexes || needindex || needaddr32 || riprel)
12545
2.01M
    && (ins->address_mode != mode_64bit
12546
1.78M
        || ((bytemode != v_bnd_mode)
12547
1.78M
      && (bytemode != v_bndmk_mode)
12548
1.78M
      && (bytemode != bnd_mode)
12549
1.78M
      && (bytemode != bnd_swap_mode))))
12550
2.01M
  ins->used_prefixes |= PREFIX_ADDR;
12551
12552
2.02M
      if (havedisp || (ins->intel_syntax && riprel))
12553
1.97M
  {
12554
1.97M
    oappend_char (ins, ins->open_char);
12555
1.97M
    if (ins->intel_syntax && riprel)
12556
6.59k
      {
12557
6.59k
        set_op (ins, disp, true);
12558
6.59k
        oappend_with_style (ins, !addr32flag ? "rip" : "eip",
12559
6.59k
          dis_style_register);
12560
6.59k
      }
12561
1.97M
    if (havebase)
12562
1.96M
      oappend_register
12563
1.96M
        (ins,
12564
1.96M
         (ins->address_mode == mode_64bit && !addr32flag
12565
1.96M
    ? att_names64 : att_names32)[rbase]);
12566
1.97M
    if (ins->has_sib)
12567
128k
      {
12568
        /* ESP/RSP won't allow index.  If base isn't ESP/RSP,
12569
     print index to tell base + index from base.  */
12570
128k
        if (scale != 0
12571
69.6k
      || needindex
12572
68.9k
      || indexes
12573
7.03k
      || (havebase && base != ESP_REG_NUM))
12574
125k
    {
12575
125k
      if (!ins->intel_syntax || havebase)
12576
122k
        oappend_char (ins, ins->separator_char);
12577
125k
      if (indexes)
12578
109k
        {
12579
109k
          if (ins->address_mode == mode_64bit || vindex < 16)
12580
109k
      oappend_register (ins, indexes[vindex]);
12581
262
          else
12582
262
      oappend (ins, "(bad)");
12583
109k
        }
12584
15.5k
      else
12585
15.5k
        oappend_register (ins,
12586
15.5k
              ins->address_mode == mode_64bit
12587
11.0k
              && !addr32flag
12588
15.5k
              ? att_index64
12589
15.5k
              : att_index32);
12590
12591
125k
      oappend_char (ins, ins->scale_char);
12592
125k
      oappend_char_with_style (ins, '0' + (1 << scale),
12593
125k
             dis_style_immediate);
12594
125k
    }
12595
128k
      }
12596
1.97M
    if (ins->intel_syntax
12597
373k
        && (disp || ins->modrm.mod != 0 || base == 5))
12598
116k
      {
12599
116k
        if (!havedisp || (bfd_signed_vma) disp >= 0)
12600
82.4k
      oappend_char (ins, '+');
12601
116k
        if (havedisp)
12602
109k
    print_displacement (ins, disp);
12603
6.59k
        else
12604
6.59k
    print_operand_value (ins, disp, dis_style_address_offset);
12605
116k
      }
12606
12607
1.97M
    oappend_char (ins, ins->close_char);
12608
12609
1.97M
    if (check_gather)
12610
2.82k
      {
12611
        /* Both XMM/YMM/ZMM registers must be distinct.  */
12612
2.82k
        int modrm_reg = ins->modrm.reg;
12613
12614
2.82k
        if (ins->rex & REX_R)
12615
1.12k
          modrm_reg += 8;
12616
2.82k
        if (ins->rex2 & REX_R)
12617
1.83k
          modrm_reg += 16;
12618
2.82k
        if (vindex == modrm_reg)
12619
935
    oappend (ins, "/(bad)");
12620
2.82k
      }
12621
1.97M
  }
12622
42.9k
      else if (ins->intel_syntax)
12623
3.55k
  {
12624
3.55k
    if (ins->modrm.mod != 0 || base == 5)
12625
3.55k
      {
12626
3.55k
        if (!ins->active_seg_prefix)
12627
2.73k
    {
12628
2.73k
      oappend_register (ins, att_names_seg[ds_reg - es_reg]);
12629
2.73k
      oappend (ins, ":");
12630
2.73k
    }
12631
3.55k
        print_operand_value (ins, disp, dis_style_text);
12632
3.55k
      }
12633
3.55k
  }
12634
2.02M
    }
12635
138k
  else if (bytemode == v_bnd_mode
12636
137k
     || bytemode == v_bndmk_mode
12637
137k
     || bytemode == bnd_mode
12638
136k
     || bytemode == bnd_swap_mode
12639
135k
     || bytemode == vex_vsib_d_w_dq_mode
12640
134k
     || bytemode == vex_vsib_q_w_dq_mode)
12641
4.62k
    {
12642
4.62k
      oappend (ins, "(bad)");
12643
4.62k
      return true;
12644
4.62k
    }
12645
133k
  else
12646
133k
    {
12647
      /* 16 bit address mode */
12648
133k
      bfd_vma disp = 0;
12649
12650
133k
      ins->used_prefixes |= ins->prefixes & PREFIX_ADDR;
12651
133k
      switch (ins->modrm.mod)
12652
133k
  {
12653
92.9k
  case 0:
12654
92.9k
    if (ins->modrm.rm == 6)
12655
5.85k
      {
12656
19.0k
  case 2:
12657
19.0k
        if (!get16s (ins, &disp))
12658
645
    return false;
12659
19.0k
      }
12660
105k
    break;
12661
105k
  case 1:
12662
27.8k
    if (!get8s (ins, &disp))
12663
720
      return false;
12664
27.1k
    if (ins->vex.evex && shift > 0)
12665
872
      disp <<= shift;
12666
27.1k
    break;
12667
133k
  }
12668
12669
132k
      if (!ins->intel_syntax)
12670
103k
  if (ins->modrm.mod != 0 || ins->modrm.rm == 6)
12671
32.8k
    print_displacement (ins, disp);
12672
12673
132k
      if (ins->modrm.mod != 0 || ins->modrm.rm != 6)
12674
126k
  {
12675
126k
    oappend_char (ins, ins->open_char);
12676
126k
    oappend (ins, ins->intel_syntax ? intel_index16[ins->modrm.rm]
12677
126k
            : att_index16[ins->modrm.rm]);
12678
126k
    if (ins->intel_syntax
12679
26.7k
        && (disp || ins->modrm.mod != 0 || ins->modrm.rm == 6))
12680
10.6k
      {
12681
10.6k
        if ((bfd_signed_vma) disp >= 0)
12682
6.07k
    oappend_char (ins, '+');
12683
10.6k
        print_displacement (ins, disp);
12684
10.6k
      }
12685
12686
126k
    oappend_char (ins, ins->close_char);
12687
126k
  }
12688
5.77k
      else if (ins->intel_syntax)
12689
1.95k
  {
12690
1.95k
    if (!ins->active_seg_prefix)
12691
991
      {
12692
991
        oappend_register (ins, att_names_seg[ds_reg - es_reg]);
12693
991
        oappend (ins, ":");
12694
991
      }
12695
1.95k
    print_operand_value (ins, disp & 0xffff, dis_style_text);
12696
1.95k
  }
12697
132k
    }
12698
2.15M
  if (ins->vex.b && ins->evex_type == evex_default)
12699
21.4k
    {
12700
21.4k
      ins->evex_used |= EVEX_b_used;
12701
12702
      /* Broadcast can only ever be valid for memory sources.  */
12703
21.4k
      if (ins->obufp == ins->op_out[0])
12704
0
  ins->vex.no_broadcast = true;
12705
12706
21.4k
      if (!ins->vex.no_broadcast
12707
18.9k
    && (!ins->intel_syntax || !(ins->evex_used & EVEX_len_used)))
12708
15.8k
  {
12709
15.8k
    if (bytemode == xh_mode)
12710
1.83k
      {
12711
1.83k
        switch (ins->vex.length)
12712
1.83k
    {
12713
559
    case 128:
12714
559
      oappend (ins, "{1to8}");
12715
559
      break;
12716
873
    case 256:
12717
873
      oappend (ins, "{1to16}");
12718
873
      break;
12719
398
    case 512:
12720
398
      oappend (ins, "{1to32}");
12721
398
      break;
12722
0
    default:
12723
0
      abort ();
12724
1.83k
    }
12725
1.83k
      }
12726
14.0k
    else if (bytemode == q_mode
12727
13.6k
       || bytemode == ymmq_mode)
12728
1.44k
      ins->vex.no_broadcast = true;
12729
12.6k
    else if (ins->vex.w
12730
5.56k
       || bytemode == evex_half_bcst_xmmqdh_mode
12731
5.16k
       || bytemode == evex_half_bcst_xmmq_mode)
12732
8.11k
      {
12733
8.11k
        switch (ins->vex.length)
12734
8.11k
    {
12735
2.58k
    case 128:
12736
2.58k
      oappend (ins, "{1to2}");
12737
2.58k
      break;
12738
1.69k
    case 256:
12739
1.69k
      oappend (ins, "{1to4}");
12740
1.69k
      break;
12741
3.83k
    case 512:
12742
3.83k
      oappend (ins, "{1to8}");
12743
3.83k
      break;
12744
0
    default:
12745
0
      abort ();
12746
8.11k
    }
12747
8.11k
      }
12748
4.50k
    else if (bytemode == x_mode
12749
2.65k
       || bytemode == evex_half_bcst_xmmqh_mode)
12750
2.36k
      {
12751
2.36k
        switch (ins->vex.length)
12752
2.36k
    {
12753
747
    case 128:
12754
747
      oappend (ins, "{1to4}");
12755
747
      break;
12756
777
    case 256:
12757
777
      oappend (ins, "{1to8}");
12758
777
      break;
12759
838
    case 512:
12760
838
      oappend (ins, "{1to16}");
12761
838
      break;
12762
0
    default:
12763
0
      abort ();
12764
2.36k
    }
12765
2.36k
      }
12766
2.13k
    else
12767
2.13k
      ins->vex.no_broadcast = true;
12768
15.8k
  }
12769
21.4k
      if (ins->vex.no_broadcast)
12770
6.11k
  oappend (ins, "{bad}");
12771
21.4k
    }
12772
12773
2.15M
  return true;
12774
2.15M
}
12775
12776
static bool
12777
OP_E (instr_info *ins, int bytemode, int sizeflag)
12778
2.36M
{
12779
  /* Skip mod/rm byte.  */
12780
2.36M
  MODRM_CHECK;
12781
2.36M
  if (!ins->has_skipped_modrm)
12782
2.36M
    {
12783
2.36M
      ins->codep++;
12784
2.36M
      ins->has_skipped_modrm = true;
12785
2.36M
    }
12786
12787
2.36M
  if (ins->modrm.mod == 3)
12788
306k
    {
12789
306k
      if ((sizeflag & SUFFIX_ALWAYS)
12790
6.63k
    && (bytemode == b_swap_mode
12791
6.38k
        || bytemode == bnd_swap_mode
12792
6.19k
        || bytemode == v_swap_mode))
12793
930
  swap_operand (ins);
12794
12795
306k
      print_register (ins, ins->modrm.rm, REX_B, bytemode, sizeflag);
12796
306k
      return true;
12797
306k
    }
12798
12799
  /* Masking is invalid for insns with GPR-like memory destination. Set the
12800
     flag uniformly, as the consumer will inspect it only for the destination
12801
     operand.  */
12802
2.06M
  if (ins->vex.mask_register_specifier)
12803
6.89k
    ins->illegal_masking = true;
12804
12805
2.06M
  return OP_E_memory (ins, bytemode, sizeflag);
12806
2.36M
}
12807
12808
static bool
12809
OP_indirE (instr_info *ins, int bytemode, int sizeflag)
12810
58.6k
{
12811
58.6k
  if (ins->modrm.mod == 3 && bytemode == f_mode)
12812
    /* bad lcall/ljmp */
12813
4.94k
    return BadOp (ins);
12814
53.6k
  if (!ins->intel_syntax)
12815
35.0k
    oappend (ins, "*");
12816
53.6k
  return OP_E (ins, bytemode, sizeflag);
12817
58.6k
}
12818
12819
static bool
12820
OP_G (instr_info *ins, int bytemode, int sizeflag)
12821
2.06M
{
12822
2.06M
  print_register (ins, ins->modrm.reg, REX_R, bytemode, sizeflag);
12823
2.06M
  return true;
12824
2.06M
}
12825
12826
static bool
12827
OP_REG (instr_info *ins, int code, int sizeflag)
12828
516k
{
12829
516k
  const char *s;
12830
516k
  int add = 0;
12831
12832
516k
  switch (code)
12833
516k
    {
12834
11.1k
    case es_reg: case ss_reg: case cs_reg:
12835
16.6k
    case ds_reg: case fs_reg: case gs_reg:
12836
16.6k
      oappend_register (ins, att_names_seg[code - es_reg]);
12837
16.6k
      return true;
12838
516k
    }
12839
12840
500k
  USED_REX (REX_B);
12841
500k
  if (ins->rex & REX_B)
12842
17.6k
    add = 8;
12843
500k
  if (ins->rex2 & REX_B)
12844
1.15k
    add += 16;
12845
12846
500k
  switch (code)
12847
500k
    {
12848
0
    case ax_reg: case cx_reg: case dx_reg: case bx_reg:
12849
0
    case sp_reg: case bp_reg: case si_reg: case di_reg:
12850
0
      s = att_names16[code - ax_reg + add];
12851
0
      break;
12852
30.0k
    case ah_reg: case ch_reg: case dh_reg: case bh_reg:
12853
30.0k
      USED_REX (0);
12854
      /* Fall through.  */
12855
57.6k
    case al_reg: case cl_reg: case dl_reg: case bl_reg:
12856
57.6k
      if (ins->rex)
12857
2.19k
  s = att_names8rex[code - al_reg + add];
12858
55.4k
      else
12859
55.4k
  s = att_names8[code - al_reg];
12860
57.6k
      break;
12861
110k
    case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
12862
207k
    case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
12863
207k
      if (ins->address_mode == mode_64bit
12864
168k
    && ((sizeflag & DFLAG) || (ins->rex & REX_W)))
12865
166k
  {
12866
166k
    s = att_names64[code - rAX_reg + add];
12867
166k
    break;
12868
166k
  }
12869
41.7k
      code += eAX_reg - rAX_reg;
12870
      /* Fall through.  */
12871
200k
    case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
12872
276k
    case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
12873
276k
      USED_REX (REX_W);
12874
276k
      if (ins->rex & REX_W)
12875
3.31k
  s = att_names64[code - eAX_reg + add];
12876
272k
      else
12877
272k
  {
12878
272k
    if (sizeflag & DFLAG)
12879
227k
      s = att_names32[code - eAX_reg + add];
12880
45.4k
    else
12881
45.4k
      s = att_names16[code - eAX_reg + add];
12882
272k
    ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12883
272k
  }
12884
276k
      break;
12885
0
    default:
12886
0
      oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
12887
0
      return true;
12888
500k
    }
12889
500k
  oappend_register (ins, s);
12890
500k
  return true;
12891
500k
}
12892
12893
static bool
12894
OP_IMREG (instr_info *ins, int code, int sizeflag)
12895
714k
{
12896
714k
  const char *s;
12897
12898
714k
  switch (code)
12899
714k
    {
12900
159k
    case indir_dx_reg:
12901
159k
      if (!ins->intel_syntax)
12902
108k
  {
12903
108k
    oappend (ins, "(%dx)");
12904
108k
    return true;
12905
108k
  }
12906
51.1k
      s = att_names16[dx_reg - ax_reg];
12907
51.1k
      break;
12908
235k
    case al_reg: case cl_reg:
12909
235k
      s = att_names8[code - al_reg];
12910
235k
      break;
12911
273k
    case eAX_reg:
12912
273k
      USED_REX (REX_W);
12913
273k
      if (ins->rex & REX_W)
12914
5.86k
  {
12915
5.86k
    s = *att_names64;
12916
5.86k
    break;
12917
5.86k
  }
12918
      /* Fall through.  */
12919
313k
    case z_mode_ax_reg:
12920
313k
      if ((ins->rex & REX_W) || (sizeflag & DFLAG))
12921
294k
  s = *att_names32;
12922
19.1k
      else
12923
19.1k
  s = *att_names16;
12924
313k
      if (!(ins->rex & REX_W))
12925
312k
  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12926
313k
      break;
12927
0
    default:
12928
0
      oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
12929
0
      return true;
12930
714k
    }
12931
606k
  oappend_register (ins, s);
12932
606k
  return true;
12933
714k
}
12934
12935
static bool
12936
OP_I (instr_info *ins, int bytemode, int sizeflag)
12937
554k
{
12938
554k
  bfd_vma op;
12939
12940
554k
  switch (bytemode)
12941
554k
    {
12942
341k
    case b_mode:
12943
341k
      if (!fetch_code (ins->info, ins->codep + 1))
12944
5.35k
  return false;
12945
336k
      op = *ins->codep++;
12946
336k
      break;
12947
176k
    case v_mode:
12948
176k
      USED_REX (REX_W);
12949
176k
      if (ins->rex & REX_W)
12950
4.08k
  {
12951
4.08k
    if (!get32s (ins, &op))
12952
1.04k
      return false;
12953
4.08k
  }
12954
171k
      else
12955
171k
  {
12956
171k
    ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12957
171k
    if (sizeflag & DFLAG)
12958
156k
      {
12959
158k
    case d_mode:
12960
158k
        if (!get32 (ins, &op))
12961
4.02k
    return false;
12962
158k
      }
12963
15.0k
    else
12964
15.0k
      {
12965
        /* Fall through.  */
12966
38.1k
    case w_mode:
12967
38.1k
        if (!get16 (ins, &op))
12968
1.10k
    return false;
12969
38.1k
      }
12970
171k
  }
12971
194k
      break;
12972
194k
    case const_1_mode:
12973
12.7k
      if (ins->intel_syntax)
12974
2.97k
  oappend_with_style (ins, "1", dis_style_immediate);
12975
9.75k
      else
12976
9.75k
  oappend_with_style (ins, "$1", dis_style_immediate);
12977
12.7k
      return true;
12978
0
    default:
12979
0
      oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
12980
0
      return true;
12981
554k
    }
12982
12983
530k
  oappend_immediate (ins, op);
12984
530k
  return true;
12985
554k
}
12986
12987
static bool
12988
OP_I64 (instr_info *ins, int bytemode, int sizeflag)
12989
56.2k
{
12990
56.2k
  uint64_t op;
12991
12992
56.2k
  if (bytemode != v_mode || ins->address_mode != mode_64bit
12993
46.9k
      || !(ins->rex & REX_W))
12994
54.7k
    return OP_I (ins, bytemode, sizeflag);
12995
12996
1.50k
  USED_REX (REX_W);
12997
12998
1.50k
  if (!get64 (ins, &op))
12999
182
    return false;
13000
13001
1.32k
  oappend_immediate (ins, op);
13002
1.32k
  return true;
13003
1.50k
}
13004
13005
static bool
13006
OP_sI (instr_info *ins, int bytemode, int sizeflag)
13007
61.7k
{
13008
61.7k
  bfd_vma op;
13009
13010
61.7k
  switch (bytemode)
13011
61.7k
    {
13012
21.7k
    case b_mode:
13013
31.7k
    case b_T_mode:
13014
31.7k
      if (!get8s (ins, &op))
13015
1.13k
  return false;
13016
30.5k
      if (bytemode == b_T_mode)
13017
9.84k
  {
13018
9.84k
    if (ins->address_mode != mode_64bit
13019
7.31k
        || !((sizeflag & DFLAG) || (ins->rex & REX_W)))
13020
3.29k
      {
13021
        /* The operand-size prefix is overridden by a REX prefix.  */
13022
3.29k
        if ((sizeflag & DFLAG) || (ins->rex & REX_W))
13023
1.24k
    op &= 0xffffffff;
13024
2.04k
        else
13025
2.04k
    op &= 0xffff;
13026
3.29k
    }
13027
9.84k
  }
13028
20.7k
      else
13029
20.7k
  {
13030
20.7k
    if (!(ins->rex & REX_W))
13031
14.6k
      {
13032
14.6k
        if (sizeflag & DFLAG)
13033
13.1k
    op &= 0xffffffff;
13034
1.52k
        else
13035
1.52k
    op &= 0xffff;
13036
14.6k
      }
13037
20.7k
  }
13038
30.5k
      break;
13039
30.0k
    case v_mode:
13040
      /* The operand-size prefix is overridden by a REX prefix.  */
13041
30.0k
      if (!(sizeflag & DFLAG) && !(ins->rex & REX_W))
13042
1.96k
  {
13043
1.96k
    if (!get16 (ins, &op))
13044
126
      return false;
13045
1.96k
  }
13046
28.0k
      else if (!get32s (ins, &op))
13047
482
  return false;
13048
29.4k
      break;
13049
29.4k
    default:
13050
0
      oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
13051
0
      return true;
13052
61.7k
    }
13053
13054
59.9k
  oappend_immediate (ins, op);
13055
59.9k
  return true;
13056
61.7k
}
13057
13058
static bool
13059
OP_J (instr_info *ins, int bytemode, int sizeflag)
13060
329k
{
13061
329k
  bfd_vma disp;
13062
329k
  bfd_vma mask = -1;
13063
329k
  bfd_vma segment = 0;
13064
13065
329k
  switch (bytemode)
13066
329k
    {
13067
299k
    case b_mode:
13068
299k
      if (!get8s (ins, &disp))
13069
1.53k
  return false;
13070
297k
      break;
13071
297k
    case v_mode:
13072
30.2k
    case dqw_mode:
13073
30.2k
      if ((sizeflag & DFLAG)
13074
3.91k
    || (ins->address_mode == mode_64bit
13075
2.18k
        && ((ins->isa64 == intel64 && bytemode != dqw_mode)
13076
1.99k
      || (ins->rex & REX_W))))
13077
27.3k
  {
13078
27.3k
    if (!get32s (ins, &disp))
13079
678
      return false;
13080
27.3k
  }
13081
2.91k
      else
13082
2.91k
  {
13083
2.91k
    if (!get16s (ins, &disp))
13084
415
      return false;
13085
    /* In 16bit mode, address is wrapped around at 64k within
13086
       the same segment.  Otherwise, a data16 prefix on a jump
13087
       instruction means that the pc is masked to 16 bits after
13088
       the displacement is added!  */
13089
2.49k
    mask = 0xffff;
13090
2.49k
    if ((ins->prefixes & PREFIX_DATA) == 0)
13091
2.20k
      segment = ((ins->start_pc + (ins->codep - ins->start_codep))
13092
2.20k
           & ~((bfd_vma) 0xffff));
13093
2.49k
  }
13094
29.1k
      if (ins->address_mode != mode_64bit
13095
22.8k
    || (ins->isa64 != intel64 && !(ins->rex & REX_W)))
13096
26.9k
  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13097
29.1k
      break;
13098
0
    default:
13099
0
      oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
13100
0
      return true;
13101
329k
    }
13102
326k
  disp = ((ins->start_pc + (ins->codep - ins->start_codep) + disp) & mask)
13103
326k
   | segment;
13104
326k
  set_op (ins, disp, false);
13105
326k
  print_operand_value (ins, disp, dis_style_text);
13106
326k
  return true;
13107
329k
}
13108
13109
static bool
13110
OP_SEG (instr_info *ins, int bytemode, int sizeflag)
13111
33.3k
{
13112
33.3k
  if (bytemode == w_mode)
13113
12.4k
    {
13114
12.4k
      oappend_register (ins, att_names_seg[ins->modrm.reg]);
13115
12.4k
      return true;
13116
12.4k
    }
13117
20.9k
  return OP_E (ins, ins->modrm.mod == 3 ? bytemode : w_mode, sizeflag);
13118
33.3k
}
13119
13120
static bool
13121
OP_DIR (instr_info *ins, int dummy ATTRIBUTE_UNUSED, int sizeflag)
13122
4.30k
{
13123
4.30k
  bfd_vma seg, offset;
13124
4.30k
  int res;
13125
4.30k
  char scratch[24];
13126
13127
4.30k
  if (sizeflag & DFLAG)
13128
2.39k
    {
13129
2.39k
      if (!get32 (ins, &offset))
13130
2.17k
  return false;;
13131
2.17k
    }
13132
1.90k
  else if (!get16 (ins, &offset))
13133
120
    return false;
13134
3.95k
  if (!get16 (ins, &seg))
13135
3.61k
    return false;;
13136
3.61k
  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13137
13138
3.61k
  res = snprintf (scratch, ARRAY_SIZE (scratch),
13139
3.61k
      ins->intel_syntax ? "0x%x:0x%x" : "$0x%x,$0x%x",
13140
3.61k
      (unsigned) seg, (unsigned) offset);
13141
3.61k
  if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
13142
0
    abort ();
13143
3.61k
  oappend (ins, scratch);
13144
3.61k
  return true;
13145
3.61k
}
13146
13147
static bool
13148
OP_OFF (instr_info *ins, int bytemode, int sizeflag)
13149
12.3k
{
13150
12.3k
  bfd_vma off;
13151
13152
12.3k
  if (ins->intel_syntax && (sizeflag & SUFFIX_ALWAYS))
13153
594
    intel_operand_size (ins, bytemode, sizeflag);
13154
12.3k
  append_seg (ins);
13155
13156
12.3k
  if ((sizeflag & AFLAG) || ins->address_mode == mode_64bit)
13157
7.92k
    {
13158
7.92k
      if (!get32 (ins, &off))
13159
739
  return false;
13160
7.92k
    }
13161
4.41k
  else
13162
4.41k
    {
13163
4.41k
      if (!get16 (ins, &off))
13164
291
  return false;
13165
4.41k
    }
13166
13167
11.3k
  if (ins->intel_syntax)
13168
5.49k
    {
13169
5.49k
      if (!ins->active_seg_prefix)
13170
4.85k
  {
13171
4.85k
    oappend_register (ins, att_names_seg[ds_reg - es_reg]);
13172
4.85k
    oappend (ins, ":");
13173
4.85k
  }
13174
5.49k
    }
13175
11.3k
  print_operand_value (ins, off, dis_style_address_offset);
13176
11.3k
  return true;
13177
12.3k
}
13178
13179
static bool
13180
OP_OFF64 (instr_info *ins, int bytemode, int sizeflag)
13181
38.9k
{
13182
38.9k
  uint64_t off;
13183
13184
38.9k
  if (ins->address_mode != mode_64bit
13185
28.1k
      || (ins->prefixes & PREFIX_ADDR))
13186
12.3k
    return OP_OFF (ins, bytemode, sizeflag);
13187
13188
26.6k
  if (ins->intel_syntax && (sizeflag & SUFFIX_ALWAYS))
13189
416
    intel_operand_size (ins, bytemode, sizeflag);
13190
26.6k
  append_seg (ins);
13191
13192
26.6k
  if (!get64 (ins, &off))
13193
1.02k
    return false;
13194
13195
25.5k
  if (ins->intel_syntax)
13196
7.04k
    {
13197
7.04k
      if (!ins->active_seg_prefix)
13198
6.67k
  {
13199
6.67k
    oappend_register (ins, att_names_seg[ds_reg - es_reg]);
13200
6.67k
    oappend (ins, ":");
13201
6.67k
  }
13202
7.04k
    }
13203
25.5k
  print_operand_value (ins, off, dis_style_address_offset);
13204
25.5k
  return true;
13205
26.6k
}
13206
13207
static void
13208
ptr_reg (instr_info *ins, int code, int sizeflag)
13209
375k
{
13210
375k
  const char *s;
13211
13212
375k
  *ins->obufp++ = ins->open_char;
13213
375k
  ins->used_prefixes |= (ins->prefixes & PREFIX_ADDR);
13214
375k
  if (ins->address_mode == mode_64bit)
13215
327k
    {
13216
327k
      if (!(sizeflag & AFLAG))
13217
4.03k
  s = att_names32[code - eAX_reg];
13218
323k
      else
13219
323k
  s = att_names64[code - eAX_reg];
13220
327k
    }
13221
47.9k
  else if (sizeflag & AFLAG)
13222
30.4k
    s = att_names32[code - eAX_reg];
13223
17.5k
  else
13224
17.5k
    s = att_names16[code - eAX_reg];
13225
375k
  oappend_register (ins, s);
13226
375k
  oappend_char (ins, ins->close_char);
13227
375k
}
13228
13229
static bool
13230
OP_ESreg (instr_info *ins, int code, int sizeflag)
13231
201k
{
13232
201k
  if (ins->intel_syntax)
13233
71.9k
    {
13234
71.9k
      switch (ins->codep[-1])
13235
71.9k
  {
13236
11.4k
  case 0x6d:  /* insw/insl */
13237
11.4k
    intel_operand_size (ins, z_mode, sizeflag);
13238
11.4k
    break;
13239
2.06k
  case 0xa5:  /* movsw/movsl/movsq */
13240
5.52k
  case 0xa7:  /* cmpsw/cmpsl/cmpsq */
13241
7.32k
  case 0xab:  /* stosw/stosl */
13242
15.7k
  case 0xaf:  /* scasw/scasl */
13243
15.7k
    intel_operand_size (ins, v_mode, sizeflag);
13244
15.7k
    break;
13245
44.7k
  default:
13246
44.7k
    intel_operand_size (ins, b_mode, sizeflag);
13247
71.9k
  }
13248
71.9k
    }
13249
201k
  if (ins->address_mode != mode_64bit)
13250
23.6k
    {
13251
23.6k
      oappend_register (ins, att_names_seg[0]);
13252
23.6k
      oappend_char (ins, ':');
13253
23.6k
    }
13254
201k
  ptr_reg (ins, code, sizeflag);
13255
201k
  return true;
13256
201k
}
13257
13258
static bool
13259
OP_DSreg (instr_info *ins, int code, int sizeflag)
13260
174k
{
13261
174k
  if (ins->intel_syntax)
13262
52.5k
    {
13263
52.5k
      switch (ins->codep[-1])
13264
52.5k
  {
13265
211
  case 0x01:  /* rmpupdate/rmpread */
13266
211
    break;
13267
7.99k
  case 0x6f:  /* outsw/outsl */
13268
7.99k
    intel_operand_size (ins, z_mode, sizeflag);
13269
7.99k
    break;
13270
2.06k
  case 0xa5:  /* movsw/movsl/movsq */
13271
5.52k
  case 0xa7:  /* cmpsw/cmpsl/cmpsq */
13272
8.72k
  case 0xad:  /* lodsw/lodsl/lodsq */
13273
8.72k
    intel_operand_size (ins, v_mode, sizeflag);
13274
8.72k
    break;
13275
35.6k
  default:
13276
35.6k
    intel_operand_size (ins, b_mode, sizeflag);
13277
52.5k
  }
13278
52.5k
    }
13279
  /* Outside of 64-bit mode set ins->active_seg_prefix to PREFIX_DS if it
13280
     is unset, so that the default segment register DS is printed.  */
13281
174k
  if (ins->address_mode != mode_64bit && !ins->active_seg_prefix)
13282
22.8k
    ins->active_seg_prefix = PREFIX_DS;
13283
174k
  append_seg (ins);
13284
174k
  ptr_reg (ins, code, sizeflag);
13285
174k
  return true;
13286
174k
}
13287
13288
static bool
13289
OP_C (instr_info *ins, int dummy ATTRIBUTE_UNUSED,
13290
      int sizeflag ATTRIBUTE_UNUSED)
13291
4.06k
{
13292
4.06k
  int add, res;
13293
4.06k
  char scratch[8];
13294
13295
4.06k
  if (ins->rex & REX_R)
13296
1.11k
    {
13297
1.11k
      USED_REX (REX_R);
13298
1.11k
      add = 8;
13299
1.11k
    }
13300
2.95k
  else if (/* Only %cr0 -> %cr8 is dealt with this way (and also really only on
13301
        most AMD hardware).  */
13302
2.95k
     ins->modrm.reg == 0
13303
1.09k
     && (ins->prefixes & PREFIX_LOCK)
13304
396
     && ins->isa64 != intel64)
13305
206
    {
13306
206
      ins->all_prefixes[ins->last_lock_prefix] = 0;
13307
206
      ins->used_prefixes |= PREFIX_LOCK;
13308
206
      add = 8;
13309
206
    }
13310
2.74k
  else
13311
2.74k
    add = 0;
13312
4.06k
  res = snprintf (scratch, ARRAY_SIZE (scratch), "%%cr%d",
13313
4.06k
      ins->modrm.reg + add);
13314
4.06k
  if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
13315
0
    abort ();
13316
4.06k
  oappend_register (ins, scratch);
13317
4.06k
  return true;
13318
4.06k
}
13319
13320
static bool
13321
OP_D (instr_info *ins, int dummy ATTRIBUTE_UNUSED,
13322
      int sizeflag ATTRIBUTE_UNUSED)
13323
1.68k
{
13324
1.68k
  int add, res;
13325
1.68k
  char scratch[8];
13326
13327
1.68k
  USED_REX (REX_R);
13328
1.68k
  if (ins->rex & REX_R)
13329
598
    add = 8;
13330
1.08k
  else
13331
1.08k
    add = 0;
13332
1.68k
  res = snprintf (scratch, ARRAY_SIZE (scratch),
13333
1.68k
      ins->intel_syntax ? "dr%d" : "%%db%d",
13334
1.68k
      ins->modrm.reg + add);
13335
1.68k
  if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
13336
0
    abort ();
13337
1.68k
  oappend (ins, scratch);
13338
1.68k
  return true;
13339
1.68k
}
13340
13341
static bool
13342
OP_T (instr_info *ins, int dummy ATTRIBUTE_UNUSED,
13343
      int sizeflag ATTRIBUTE_UNUSED)
13344
1.20k
{
13345
1.20k
  int res;
13346
1.20k
  char scratch[8];
13347
13348
1.20k
  res = snprintf (scratch, ARRAY_SIZE (scratch), "%%tr%d", ins->modrm.reg);
13349
1.20k
  if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
13350
0
    abort ();
13351
1.20k
  oappend_register (ins, scratch);
13352
1.20k
  return true;
13353
1.20k
}
13354
13355
static bool
13356
OP_MMX (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13357
  int sizeflag ATTRIBUTE_UNUSED)
13358
39.3k
{
13359
39.3k
  int reg = ins->modrm.reg;
13360
39.3k
  const char (*names)[8];
13361
13362
39.3k
  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13363
39.3k
  if (ins->prefixes & PREFIX_DATA)
13364
2.20k
    {
13365
2.20k
      names = att_names_xmm;
13366
2.20k
      USED_REX (REX_R);
13367
2.20k
      if (ins->rex & REX_R)
13368
1.00k
  reg += 8;
13369
2.20k
    }
13370
37.1k
  else
13371
37.1k
    names = att_names_mm;
13372
39.3k
  oappend_register (ins, names[reg]);
13373
39.3k
  return true;
13374
39.3k
}
13375
13376
static void
13377
print_vector_reg (instr_info *ins, unsigned int reg, int bytemode)
13378
129k
{
13379
129k
  const char (*names)[8];
13380
13381
129k
  if (bytemode == xmmq_mode
13382
123k
      || bytemode == evex_half_bcst_xmmqh_mode
13383
123k
      || bytemode == evex_half_bcst_xmmq_mode)
13384
7.48k
    {
13385
7.48k
      switch (ins->vex.length)
13386
7.48k
  {
13387
1.68k
  case 0:
13388
2.85k
  case 128:
13389
4.66k
  case 256:
13390
4.66k
    names = att_names_xmm;
13391
4.66k
    break;
13392
2.81k
  case 512:
13393
2.81k
    names = att_names_ymm;
13394
2.81k
    ins->evex_used |= EVEX_len_used;
13395
2.81k
    break;
13396
0
  default:
13397
0
    abort ();
13398
7.48k
  }
13399
7.48k
    }
13400
122k
  else if (bytemode == ymm_mode)
13401
291
    names = att_names_ymm;
13402
121k
  else if (bytemode == tmm_mode)
13403
5.21k
    {
13404
5.21k
      if (reg >= 8)
13405
3.19k
  {
13406
3.19k
    oappend (ins, "(bad)");
13407
3.19k
    return;
13408
3.19k
  }
13409
2.02k
      names = att_names_tmm;
13410
2.02k
    }
13411
116k
  else if (ins->need_vex
13412
97.7k
     && bytemode != xmm_mode
13413
95.8k
     && bytemode != scalar_mode
13414
84.0k
     && bytemode != xmmdw_mode
13415
83.6k
     && bytemode != xmmqd_mode
13416
83.2k
     && bytemode != evex_half_bcst_xmmqdh_mode
13417
82.8k
     && bytemode != w_swap_mode
13418
82.2k
     && bytemode != b_mode
13419
81.6k
     && bytemode != w_mode
13420
81.1k
     && bytemode != d_mode
13421
80.1k
     && bytemode != q_mode)
13422
79.3k
    {
13423
79.3k
      ins->evex_used |= EVEX_len_used;
13424
79.3k
      switch (ins->vex.length)
13425
79.3k
  {
13426
33.4k
  case 128:
13427
33.4k
    names = att_names_xmm;
13428
33.4k
    break;
13429
22.0k
  case 256:
13430
22.0k
    if (ins->vex.w
13431
12.4k
        || bytemode != vex_vsib_q_w_dq_mode)
13432
20.3k
      names = att_names_ymm;
13433
1.68k
    else
13434
1.68k
      names = att_names_xmm;
13435
22.0k
    break;
13436
23.8k
  case 512:
13437
23.8k
    if (ins->vex.w
13438
13.6k
        || bytemode != vex_vsib_q_w_dq_mode)
13439
22.5k
      names = att_names_zmm;
13440
1.35k
    else
13441
1.35k
      names = att_names_ymm;
13442
23.8k
    break;
13443
0
  default:
13444
0
    abort ();
13445
79.3k
  }
13446
79.3k
    }
13447
37.3k
  else
13448
37.3k
    names = att_names_xmm;
13449
126k
  oappend_register (ins, names[reg]);
13450
126k
}
13451
13452
static bool
13453
OP_XMM (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13454
103k
{
13455
103k
  unsigned int reg = ins->modrm.reg;
13456
13457
103k
  USED_REX (REX_R);
13458
103k
  if (ins->rex & REX_R)
13459
46.8k
    reg += 8;
13460
103k
  if (ins->vex.evex)
13461
55.2k
    {
13462
55.2k
      if (ins->rex2 & REX_R)
13463
28.4k
  reg += 16;
13464
55.2k
    }
13465
13466
103k
  if (bytemode == tmm_mode)
13467
3.38k
    ins->modrm.reg = reg;
13468
99.6k
  else if (bytemode == scalar_mode)
13469
13.7k
    ins->vex.no_broadcast = true;
13470
13471
103k
  print_vector_reg (ins, reg, bytemode);
13472
103k
  return true;
13473
103k
}
13474
13475
static bool
13476
OP_EM (instr_info *ins, int bytemode, int sizeflag)
13477
38.7k
{
13478
38.7k
  int reg;
13479
38.7k
  const char (*names)[8];
13480
13481
38.7k
  if (ins->modrm.mod != 3)
13482
23.2k
    {
13483
23.2k
      if (ins->intel_syntax
13484
9.45k
    && (bytemode == v_mode || bytemode == v_swap_mode))
13485
8.83k
  {
13486
8.83k
    bytemode = (ins->prefixes & PREFIX_DATA) ? x_mode : q_mode;
13487
8.83k
    ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13488
8.83k
  }
13489
23.2k
      return OP_E (ins, bytemode, sizeflag);
13490
23.2k
    }
13491
13492
15.5k
  if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
13493
448
    swap_operand (ins);
13494
13495
  /* Skip mod/rm byte.  */
13496
15.5k
  MODRM_CHECK;
13497
15.5k
  ins->codep++;
13498
15.5k
  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13499
15.5k
  reg = ins->modrm.rm;
13500
15.5k
  if (ins->prefixes & PREFIX_DATA)
13501
1.55k
    {
13502
1.55k
      names = att_names_xmm;
13503
1.55k
      USED_REX (REX_B);
13504
1.55k
      if (ins->rex & REX_B)
13505
889
  reg += 8;
13506
1.55k
    }
13507
13.9k
  else
13508
13.9k
    names = att_names_mm;
13509
15.5k
  oappend_register (ins, names[reg]);
13510
15.5k
  return true;
13511
15.5k
}
13512
13513
/* cvt* are the only instructions in sse2 which have
13514
   both SSE and MMX operands and also have 0x66 prefix
13515
   in their opcode. 0x66 was originally used to differentiate
13516
   between SSE and MMX instruction(operands). So we have to handle the
13517
   cvt* separately using OP_EMC and OP_MXC */
13518
static bool
13519
OP_EMC (instr_info *ins, int bytemode, int sizeflag)
13520
1.23k
{
13521
1.23k
  if (ins->modrm.mod != 3)
13522
839
    {
13523
839
      if (ins->intel_syntax && bytemode == v_mode)
13524
0
  {
13525
0
    bytemode = (ins->prefixes & PREFIX_DATA) ? x_mode : q_mode;
13526
0
    ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13527
0
  }
13528
839
      return OP_E (ins, bytemode, sizeflag);
13529
839
    }
13530
13531
  /* Skip mod/rm byte.  */
13532
391
  MODRM_CHECK;
13533
391
  ins->codep++;
13534
391
  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13535
391
  oappend_register (ins, att_names_mm[ins->modrm.rm]);
13536
391
  return true;
13537
391
}
13538
13539
static bool
13540
OP_MXC (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13541
  int sizeflag ATTRIBUTE_UNUSED)
13542
565
{
13543
565
  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13544
565
  oappend_register (ins, att_names_mm[ins->modrm.reg]);
13545
565
  return true;
13546
565
}
13547
13548
static bool
13549
OP_EX (instr_info *ins, int bytemode, int sizeflag)
13550
93.8k
{
13551
93.8k
  int reg;
13552
13553
  /* Skip mod/rm byte.  */
13554
93.8k
  MODRM_CHECK;
13555
93.8k
  ins->codep++;
13556
13557
93.8k
  if (bytemode == dq_mode)
13558
604
    bytemode = ins->vex.w ? q_mode : d_mode;
13559
13560
93.8k
  if (ins->modrm.mod != 3)
13561
67.2k
    return OP_E_memory (ins, bytemode, sizeflag);
13562
13563
26.6k
  reg = ins->modrm.rm;
13564
26.6k
  USED_REX (REX_B);
13565
26.6k
  if (ins->rex & REX_B)
13566
5.95k
    reg += 8;
13567
26.6k
  if (ins->vex.evex)
13568
12.6k
    {
13569
12.6k
      USED_REX (REX_X);
13570
12.6k
      if ((ins->rex & REX_X))
13571
4.16k
  reg += 16;
13572
12.6k
      ins->rex2_used &= ~REX_B;
13573
12.6k
    }
13574
13.9k
  else if (ins->rex2 & REX_B)
13575
329
    reg += 16;
13576
13577
26.6k
  if ((sizeflag & SUFFIX_ALWAYS)
13578
2.42k
      && (bytemode == x_swap_mode
13579
2.08k
    || bytemode == w_swap_mode
13580
1.88k
    || bytemode == d_swap_mode
13581
1.48k
    || bytemode == q_swap_mode))
13582
1.12k
    swap_operand (ins);
13583
13584
26.6k
  if (bytemode == tmm_mode)
13585
1.83k
    ins->modrm.rm = reg;
13586
13587
26.6k
  print_vector_reg (ins, reg, bytemode);
13588
26.6k
  return true;
13589
93.8k
}
13590
13591
static bool
13592
OP_R (instr_info *ins, int bytemode, int sizeflag)
13593
21.5k
{
13594
21.5k
  if (ins->modrm.mod != 3)
13595
4.51k
    return BadOp (ins);
13596
13597
17.0k
  switch (bytemode)
13598
17.0k
    {
13599
849
    case d_mode:
13600
1.48k
    case dq_mode:
13601
2.31k
    case q_mode:
13602
4.39k
    case mask_mode:
13603
4.39k
      return OP_E (ins, bytemode, sizeflag);
13604
597
    case q_mm_mode:
13605
597
      return OP_EM (ins, x_mode, sizeflag);
13606
9.87k
    case xmm_mode:
13607
9.87k
      if (ins->vex.length <= 128)
13608
820
  break;
13609
9.05k
      return BadOp (ins);
13610
17.0k
    }
13611
13612
3.00k
  return OP_EX (ins, bytemode, sizeflag);
13613
17.0k
}
13614
13615
static bool
13616
OP_M (instr_info *ins, int bytemode, int sizeflag)
13617
53.5k
{
13618
  /* Skip mod/rm byte.  */
13619
53.5k
  MODRM_CHECK;
13620
53.5k
  ins->codep++;
13621
13622
53.5k
  if (ins->modrm.mod == 3)
13623
    /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
13624
4.58k
    return BadOp (ins);
13625
13626
49.0k
  if (bytemode == x_mode)
13627
457
    ins->vex.no_broadcast = true;
13628
13629
49.0k
  return OP_E_memory (ins, bytemode, sizeflag);
13630
53.5k
}
13631
13632
static bool
13633
OP_0f07 (instr_info *ins, int bytemode, int sizeflag)
13634
2.90k
{
13635
2.90k
  if (ins->modrm.mod != 3 || ins->modrm.rm != 0)
13636
2.38k
    return BadOp (ins);
13637
525
  return OP_E (ins, bytemode, sizeflag);
13638
2.90k
}
13639
13640
/* montmul instruction need display repz and skip modrm */
13641
13642
static bool
13643
MONTMUL_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13644
1.43k
{
13645
1.43k
  if (ins->modrm.mod != 3 || ins->modrm.rm != 0)
13646
965
    return BadOp (ins);
13647
13648
  /* The 0xf3 prefix should be displayed as "repz" for montmul. */
13649
471
  if (ins->prefixes & PREFIX_REPZ)
13650
471
    ins->all_prefixes[ins->last_repz_prefix] = 0xf3;
13651
13652
  /* Skip mod/rm byte.  */
13653
471
  MODRM_CHECK;
13654
471
  ins->codep++;
13655
471
  return true;
13656
471
}
13657
13658
/* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
13659
   32bit mode and "xchg %rax,%rax" in 64bit mode.  */
13660
13661
static bool
13662
NOP_Fixup (instr_info *ins, int opnd, int sizeflag)
13663
46.7k
{
13664
46.7k
  if ((ins->prefixes & PREFIX_DATA) == 0 && (ins->rex & REX_B) == 0)
13665
40.7k
    {
13666
40.7k
      ins->mnemonicendp = stpcpy (ins->obuf, "nop");
13667
40.7k
      return true;
13668
40.7k
    }
13669
6.04k
  if (opnd == 0)
13670
3.02k
    return OP_REG (ins, eAX_reg, sizeflag);
13671
3.02k
  return OP_IMREG (ins, eAX_reg, sizeflag);
13672
6.04k
}
13673
13674
static const char *const Suffix3DNow[] = {
13675
/* 00 */  NULL,   NULL,   NULL,   NULL,
13676
/* 04 */  NULL,   NULL,   NULL,   NULL,
13677
/* 08 */  NULL,   NULL,   NULL,   NULL,
13678
/* 0C */  "pi2fw",  "pi2fd",  NULL,   NULL,
13679
/* 10 */  NULL,   NULL,   NULL,   NULL,
13680
/* 14 */  NULL,   NULL,   NULL,   NULL,
13681
/* 18 */  NULL,   NULL,   NULL,   NULL,
13682
/* 1C */  "pf2iw",  "pf2id",  NULL,   NULL,
13683
/* 20 */  NULL,   NULL,   NULL,   NULL,
13684
/* 24 */  NULL,   NULL,   NULL,   NULL,
13685
/* 28 */  NULL,   NULL,   NULL,   NULL,
13686
/* 2C */  NULL,   NULL,   NULL,   NULL,
13687
/* 30 */  NULL,   NULL,   NULL,   NULL,
13688
/* 34 */  NULL,   NULL,   NULL,   NULL,
13689
/* 38 */  NULL,   NULL,   NULL,   NULL,
13690
/* 3C */  NULL,   NULL,   NULL,   NULL,
13691
/* 40 */  NULL,   NULL,   NULL,   NULL,
13692
/* 44 */  NULL,   NULL,   NULL,   NULL,
13693
/* 48 */  NULL,   NULL,   NULL,   NULL,
13694
/* 4C */  NULL,   NULL,   NULL,   NULL,
13695
/* 50 */  NULL,   NULL,   NULL,   NULL,
13696
/* 54 */  NULL,   NULL,   NULL,   NULL,
13697
/* 58 */  NULL,   NULL,   NULL,   NULL,
13698
/* 5C */  NULL,   NULL,   NULL,   NULL,
13699
/* 60 */  NULL,   NULL,   NULL,   NULL,
13700
/* 64 */  NULL,   NULL,   NULL,   NULL,
13701
/* 68 */  NULL,   NULL,   NULL,   NULL,
13702
/* 6C */  NULL,   NULL,   NULL,   NULL,
13703
/* 70 */  NULL,   NULL,   NULL,   NULL,
13704
/* 74 */  NULL,   NULL,   NULL,   NULL,
13705
/* 78 */  NULL,   NULL,   NULL,   NULL,
13706
/* 7C */  NULL,   NULL,   NULL,   NULL,
13707
/* 80 */  NULL,   NULL,   NULL,   NULL,
13708
/* 84 */  NULL,   NULL,   NULL,   NULL,
13709
/* 88 */  NULL,   NULL,   "pfnacc", NULL,
13710
/* 8C */  NULL,   NULL,   "pfpnacc",  NULL,
13711
/* 90 */  "pfcmpge",  NULL,   NULL,   NULL,
13712
/* 94 */  "pfmin",  NULL,   "pfrcp",  "pfrsqrt",
13713
/* 98 */  NULL,   NULL,   "pfsub",  NULL,
13714
/* 9C */  NULL,   NULL,   "pfadd",  NULL,
13715
/* A0 */  "pfcmpgt",  NULL,   NULL,   NULL,
13716
/* A4 */  "pfmax",  NULL,   "pfrcpit1", "pfrsqit1",
13717
/* A8 */  NULL,   NULL,   "pfsubr", NULL,
13718
/* AC */  NULL,   NULL,   "pfacc",  NULL,
13719
/* B0 */  "pfcmpeq",  NULL,   NULL,   NULL,
13720
/* B4 */  "pfmul",  NULL,   "pfrcpit2", "pmulhrw",
13721
/* B8 */  NULL,   NULL,   NULL,   "pswapd",
13722
/* BC */  NULL,   NULL,   NULL,   "pavgusb",
13723
/* C0 */  NULL,   NULL,   NULL,   NULL,
13724
/* C4 */  NULL,   NULL,   NULL,   NULL,
13725
/* C8 */  NULL,   NULL,   NULL,   NULL,
13726
/* CC */  NULL,   NULL,   NULL,   NULL,
13727
/* D0 */  NULL,   NULL,   NULL,   NULL,
13728
/* D4 */  NULL,   NULL,   NULL,   NULL,
13729
/* D8 */  NULL,   NULL,   NULL,   NULL,
13730
/* DC */  NULL,   NULL,   NULL,   NULL,
13731
/* E0 */  NULL,   NULL,   NULL,   NULL,
13732
/* E4 */  NULL,   NULL,   NULL,   NULL,
13733
/* E8 */  NULL,   NULL,   NULL,   NULL,
13734
/* EC */  NULL,   NULL,   NULL,   NULL,
13735
/* F0 */  NULL,   NULL,   NULL,   NULL,
13736
/* F4 */  NULL,   NULL,   NULL,   NULL,
13737
/* F8 */  NULL,   NULL,   NULL,   NULL,
13738
/* FC */  NULL,   NULL,   NULL,   NULL,
13739
};
13740
13741
static bool
13742
OP_3DNowSuffix (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13743
    int sizeflag ATTRIBUTE_UNUSED)
13744
18.5k
{
13745
18.5k
  const char *mnemonic;
13746
13747
18.5k
  if (!fetch_code (ins->info, ins->codep + 1))
13748
536
    return false;
13749
  /* AMD 3DNow! instructions are specified by an opcode suffix in the
13750
     place where an 8-bit immediate would normally go.  ie. the last
13751
     byte of the instruction.  */
13752
17.9k
  ins->obufp = ins->mnemonicendp;
13753
17.9k
  mnemonic = Suffix3DNow[*ins->codep++];
13754
17.9k
  if (mnemonic)
13755
566
    ins->obufp = stpcpy (ins->obufp, mnemonic);
13756
17.3k
  else
13757
17.3k
    {
13758
      /* Since a variable sized ins->modrm/ins->sib chunk is between the start
13759
   of the opcode (0x0f0f) and the opcode suffix, we need to do
13760
   all the ins->modrm processing first, and don't know until now that
13761
   we have a bad opcode.  This necessitates some cleaning up.  */
13762
17.3k
      ins->op_out[0][0] = '\0';
13763
17.3k
      ins->op_out[1][0] = '\0';
13764
17.3k
      BadOp (ins);
13765
17.3k
    }
13766
17.9k
  ins->mnemonicendp = ins->obufp;
13767
17.9k
  return true;
13768
18.5k
}
13769
13770
static const struct op simd_cmp_op[] =
13771
{
13772
  { STRING_COMMA_LEN ("eq") },
13773
  { STRING_COMMA_LEN ("lt") },
13774
  { STRING_COMMA_LEN ("le") },
13775
  { STRING_COMMA_LEN ("unord") },
13776
  { STRING_COMMA_LEN ("neq") },
13777
  { STRING_COMMA_LEN ("nlt") },
13778
  { STRING_COMMA_LEN ("nle") },
13779
  { STRING_COMMA_LEN ("ord") }
13780
};
13781
13782
static const struct op vex_cmp_op[] =
13783
{
13784
  { STRING_COMMA_LEN ("eq_uq") },
13785
  { STRING_COMMA_LEN ("nge") },
13786
  { STRING_COMMA_LEN ("ngt") },
13787
  { STRING_COMMA_LEN ("false") },
13788
  { STRING_COMMA_LEN ("neq_oq") },
13789
  { STRING_COMMA_LEN ("ge") },
13790
  { STRING_COMMA_LEN ("gt") },
13791
  { STRING_COMMA_LEN ("true") },
13792
  { STRING_COMMA_LEN ("eq_os") },
13793
  { STRING_COMMA_LEN ("lt_oq") },
13794
  { STRING_COMMA_LEN ("le_oq") },
13795
  { STRING_COMMA_LEN ("unord_s") },
13796
  { STRING_COMMA_LEN ("neq_us") },
13797
  { STRING_COMMA_LEN ("nlt_uq") },
13798
  { STRING_COMMA_LEN ("nle_uq") },
13799
  { STRING_COMMA_LEN ("ord_s") },
13800
  { STRING_COMMA_LEN ("eq_us") },
13801
  { STRING_COMMA_LEN ("nge_uq") },
13802
  { STRING_COMMA_LEN ("ngt_uq") },
13803
  { STRING_COMMA_LEN ("false_os") },
13804
  { STRING_COMMA_LEN ("neq_os") },
13805
  { STRING_COMMA_LEN ("ge_oq") },
13806
  { STRING_COMMA_LEN ("gt_oq") },
13807
  { STRING_COMMA_LEN ("true_us") },
13808
};
13809
13810
static bool
13811
CMP_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13812
     int sizeflag ATTRIBUTE_UNUSED)
13813
2.89k
{
13814
2.89k
  unsigned int cmp_type;
13815
13816
2.89k
  if (!fetch_code (ins->info, ins->codep + 1))
13817
551
    return false;
13818
2.34k
  cmp_type = *ins->codep++;
13819
2.34k
  if (cmp_type < ARRAY_SIZE (simd_cmp_op))
13820
728
    {
13821
728
      char suffix[3];
13822
728
      char *p = ins->mnemonicendp - 2;
13823
728
      suffix[0] = p[0];
13824
728
      suffix[1] = p[1];
13825
728
      suffix[2] = '\0';
13826
728
      sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
13827
728
      ins->mnemonicendp += simd_cmp_op[cmp_type].len;
13828
728
    }
13829
1.61k
  else if (ins->need_vex
13830
980
     && cmp_type < ARRAY_SIZE (simd_cmp_op) + ARRAY_SIZE (vex_cmp_op))
13831
282
    {
13832
282
      char suffix[3];
13833
282
      char *p = ins->mnemonicendp - 2;
13834
282
      suffix[0] = p[0];
13835
282
      suffix[1] = p[1];
13836
282
      suffix[2] = '\0';
13837
282
      cmp_type -= ARRAY_SIZE (simd_cmp_op);
13838
282
      sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
13839
282
      ins->mnemonicendp += vex_cmp_op[cmp_type].len;
13840
282
    }
13841
1.33k
  else
13842
1.33k
    {
13843
      /* We have a reserved extension byte.  Output it directly.  */
13844
1.33k
      oappend_immediate (ins, cmp_type);
13845
1.33k
    }
13846
2.34k
  return true;
13847
2.89k
}
13848
13849
static bool
13850
OP_Mwait (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13851
1.37k
{
13852
  /* mwait %eax,%ecx / mwaitx %eax,%ecx,%ebx  */
13853
1.37k
  if (!ins->intel_syntax)
13854
803
    {
13855
803
      strcpy (ins->op_out[0], att_names32[0] + ins->intel_syntax);
13856
803
      strcpy (ins->op_out[1], att_names32[1] + ins->intel_syntax);
13857
803
      if (bytemode == eBX_reg)
13858
294
  strcpy (ins->op_out[2], att_names32[3] + ins->intel_syntax);
13859
803
      ins->two_source_ops = true;
13860
803
    }
13861
  /* Skip mod/rm byte.  */
13862
1.37k
  MODRM_CHECK;
13863
1.37k
  ins->codep++;
13864
1.37k
  return true;
13865
1.37k
}
13866
13867
static bool
13868
OP_Monitor (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13869
      int sizeflag ATTRIBUTE_UNUSED)
13870
3.00k
{
13871
  /* monitor %{e,r,}ax,%ecx,%edx"  */
13872
3.00k
  if (!ins->intel_syntax)
13873
1.52k
    {
13874
1.52k
      const char (*names)[8] = (ins->address_mode == mode_64bit
13875
1.52k
        ? att_names64 : att_names32);
13876
13877
1.52k
      if (ins->prefixes & PREFIX_ADDR)
13878
749
  {
13879
    /* Remove "addr16/addr32".  */
13880
749
    ins->all_prefixes[ins->last_addr_prefix] = 0;
13881
749
    names = (ins->address_mode != mode_32bit
13882
749
       ? att_names32 : att_names16);
13883
749
    ins->used_prefixes |= PREFIX_ADDR;
13884
749
  }
13885
777
      else if (ins->address_mode == mode_16bit)
13886
475
  names = att_names16;
13887
1.52k
      strcpy (ins->op_out[0], names[0] + ins->intel_syntax);
13888
1.52k
      strcpy (ins->op_out[1], att_names32[1] + ins->intel_syntax);
13889
1.52k
      strcpy (ins->op_out[2], att_names32[2] + ins->intel_syntax);
13890
1.52k
      ins->two_source_ops = true;
13891
1.52k
    }
13892
  /* Skip mod/rm byte.  */
13893
3.00k
  MODRM_CHECK;
13894
3.00k
  ins->codep++;
13895
3.00k
  return true;
13896
3.00k
}
13897
13898
static bool
13899
REP_Fixup (instr_info *ins, int bytemode, int sizeflag)
13900
191k
{
13901
  /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
13902
     lods and stos.  */
13903
191k
  if (ins->prefixes & PREFIX_REPZ)
13904
717
    ins->all_prefixes[ins->last_repz_prefix] = REP_PREFIX;
13905
13906
191k
  switch (bytemode)
13907
191k
    {
13908
7.88k
    case al_reg:
13909
17.7k
    case eAX_reg:
13910
73.5k
    case indir_dx_reg:
13911
73.5k
      return OP_IMREG (ins, bytemode, sizeflag);
13912
117k
    case eDI_reg:
13913
117k
      return OP_ESreg (ins, bytemode, sizeflag);
13914
0
    case eSI_reg:
13915
0
      return OP_DSreg (ins, bytemode, sizeflag);
13916
0
    default:
13917
0
      abort ();
13918
0
      break;
13919
191k
    }
13920
0
  return true;
13921
191k
}
13922
13923
static bool
13924
SEP_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13925
     int sizeflag ATTRIBUTE_UNUSED)
13926
767
{
13927
767
  if (ins->isa64 != amd64)
13928
573
    return true;
13929
13930
194
  ins->obufp = ins->obuf;
13931
194
  BadOp (ins);
13932
194
  ins->mnemonicendp = ins->obufp;
13933
194
  ++ins->codep;
13934
194
  return true;
13935
767
}
13936
13937
/* For BND-prefixed instructions 0xF2 prefix should be displayed as
13938
   "bnd".  */
13939
13940
static bool
13941
BND_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13942
     int sizeflag ATTRIBUTE_UNUSED)
13943
355k
{
13944
355k
  if (ins->prefixes & PREFIX_REPNZ)
13945
2.23k
    ins->all_prefixes[ins->last_repnz_prefix] = BND_PREFIX;
13946
355k
  return true;
13947
355k
}
13948
13949
/* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as
13950
   "notrack".  */
13951
13952
static bool
13953
NOTRACK_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13954
         int sizeflag ATTRIBUTE_UNUSED)
13955
37.5k
{
13956
  /* Since active_seg_prefix is not set in 64-bit mode, check whether
13957
     we've seen a PREFIX_DS.  */
13958
37.5k
  if ((ins->prefixes & PREFIX_DS) != 0
13959
2.96k
      && (ins->address_mode != mode_64bit || ins->last_data_prefix < 0))
13960
2.37k
    {
13961
      /* NOTRACK prefix is only valid on indirect branch instructions.
13962
   NB: DATA prefix is unsupported for Intel64.  */
13963
2.37k
      ins->active_seg_prefix = 0;
13964
2.37k
      ins->all_prefixes[ins->last_seg_prefix] = NOTRACK_PREFIX;
13965
2.37k
    }
13966
37.5k
  return true;
13967
37.5k
}
13968
13969
/* Similar to OP_E.  But the 0xf2/0xf3 ins->prefixes should be displayed as
13970
   "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
13971
 */
13972
13973
static bool
13974
HLE_Fixup1 (instr_info *ins, int bytemode, int sizeflag)
13975
1.67M
{
13976
1.67M
  if (ins->modrm.mod != 3
13977
1.53M
      && (ins->prefixes & PREFIX_LOCK) != 0)
13978
5.95k
    {
13979
5.95k
      if (ins->prefixes & PREFIX_REPZ)
13980
1.11k
  ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX;
13981
5.95k
      if (ins->prefixes & PREFIX_REPNZ)
13982
399
  ins->all_prefixes[ins->last_repnz_prefix] = XACQUIRE_PREFIX;
13983
5.95k
    }
13984
13985
1.67M
  return OP_E (ins, bytemode, sizeflag);
13986
1.67M
}
13987
13988
/* Similar to OP_E.  But the 0xf2/0xf3 ins->prefixes should be displayed as
13989
   "xacquire"/"xrelease" for memory operand.  No check for LOCK prefix.
13990
 */
13991
13992
static bool
13993
HLE_Fixup2 (instr_info *ins, int bytemode, int sizeflag)
13994
18.2k
{
13995
18.2k
  if (ins->modrm.mod != 3)
13996
15.7k
    {
13997
15.7k
      if (ins->prefixes & PREFIX_REPZ)
13998
695
  ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX;
13999
15.7k
      if (ins->prefixes & PREFIX_REPNZ)
14000
1.29k
  ins->all_prefixes[ins->last_repnz_prefix] = XACQUIRE_PREFIX;
14001
15.7k
    }
14002
14003
18.2k
  return OP_E (ins, bytemode, sizeflag);
14004
18.2k
}
14005
14006
/* Similar to OP_E.  But the 0xf3 prefixes should be displayed as
14007
   "xrelease" for memory operand.  No check for LOCK prefix.   */
14008
14009
static bool
14010
HLE_Fixup3 (instr_info *ins, int bytemode, int sizeflag)
14011
37.4k
{
14012
37.4k
  if (ins->modrm.mod != 3
14013
19.0k
      && ins->last_repz_prefix > ins->last_repnz_prefix
14014
497
      && (ins->prefixes & PREFIX_REPZ) != 0)
14015
497
    ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX;
14016
14017
37.4k
  return OP_E (ins, bytemode, sizeflag);
14018
37.4k
}
14019
14020
static bool
14021
CMPXCHG8B_Fixup (instr_info *ins, int bytemode, int sizeflag)
14022
2.63k
{
14023
2.63k
  USED_REX (REX_W);
14024
2.63k
  if (ins->rex & REX_W)
14025
329
    {
14026
      /* Change cmpxchg8b to cmpxchg16b.  */
14027
329
      char *p = ins->mnemonicendp - 2;
14028
329
      ins->mnemonicendp = stpcpy (p, "16b");
14029
329
      bytemode = o_mode;
14030
329
    }
14031
2.30k
  else if ((ins->prefixes & PREFIX_LOCK) != 0)
14032
1.22k
    {
14033
1.22k
      if (ins->prefixes & PREFIX_REPZ)
14034
697
  ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX;
14035
1.22k
      if (ins->prefixes & PREFIX_REPNZ)
14036
265
  ins->all_prefixes[ins->last_repnz_prefix] = XACQUIRE_PREFIX;
14037
1.22k
    }
14038
14039
2.63k
  return OP_M (ins, bytemode, sizeflag);
14040
2.63k
}
14041
14042
static bool
14043
XMM_Fixup (instr_info *ins, int reg, int sizeflag ATTRIBUTE_UNUSED)
14044
524
{
14045
524
  const char (*names)[8] = att_names_xmm;
14046
14047
524
  if (ins->need_vex)
14048
0
    {
14049
0
      switch (ins->vex.length)
14050
0
  {
14051
0
  case 128:
14052
0
    break;
14053
0
  case 256:
14054
0
    names = att_names_ymm;
14055
0
    break;
14056
0
  default:
14057
0
    abort ();
14058
0
  }
14059
0
    }
14060
524
  oappend_register (ins, names[reg]);
14061
524
  return true;
14062
524
}
14063
14064
static bool
14065
FXSAVE_Fixup (instr_info *ins, int bytemode, int sizeflag)
14066
1.94k
{
14067
  /* Add proper suffix to "fxsave" and "fxrstor".  */
14068
1.94k
  USED_REX (REX_W);
14069
1.94k
  if (ins->rex & REX_W)
14070
586
    {
14071
586
      char *p = ins->mnemonicendp;
14072
586
      *p++ = '6';
14073
586
      *p++ = '4';
14074
586
      *p = '\0';
14075
586
      ins->mnemonicendp = p;
14076
586
    }
14077
1.94k
  return OP_M (ins, bytemode, sizeflag);
14078
1.94k
}
14079
14080
/* Display the destination register operand for instructions with
14081
   VEX. */
14082
14083
static bool
14084
OP_VEX (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
14085
131k
{
14086
131k
  int reg, modrm_reg, sib_index = -1;
14087
131k
  const char (*names)[8];
14088
14089
131k
  if (!ins->need_vex)
14090
63.0k
    return true;
14091
14092
68.7k
  if (ins->evex_type == evex_from_legacy)
14093
7.87k
    {
14094
7.87k
      ins->evex_used |= EVEX_b_used;
14095
7.87k
      if (!ins->vex.nd)
14096
3.01k
  return true;
14097
7.87k
    }
14098
14099
65.7k
  reg = ins->vex.register_specifier;
14100
65.7k
  ins->vex.register_specifier = 0;
14101
65.7k
  if (ins->address_mode != mode_64bit)
14102
10.4k
    {
14103
10.4k
      if (ins->vex.evex && !ins->vex.v)
14104
2.06k
  {
14105
2.06k
    oappend (ins, "(bad)");
14106
2.06k
    return true;
14107
2.06k
  }
14108
14109
8.34k
      reg &= 7;
14110
8.34k
    }
14111
55.2k
  else if (ins->vex.evex && !ins->vex.v)
14112
17.8k
    reg += 16;
14113
14114
63.6k
  switch (bytemode)
14115
63.6k
    {
14116
8.98k
    case scalar_mode:
14117
8.98k
      oappend_register (ins, att_names_xmm[reg]);
14118
8.98k
      return true;
14119
14120
2.85k
    case vex_vsib_d_w_dq_mode:
14121
5.15k
    case vex_vsib_q_w_dq_mode:
14122
      /* This must be the 3rd operand.  */
14123
5.15k
      if (ins->obufp != ins->op_out[2])
14124
0
  abort ();
14125
5.15k
      if (ins->vex.length == 128
14126
2.56k
    || (bytemode != vex_vsib_d_w_dq_mode
14127
1.43k
        && !ins->vex.w))
14128
3.46k
  oappend_register (ins, att_names_xmm[reg]);
14129
1.69k
      else
14130
1.69k
  oappend_register (ins, att_names_ymm[reg]);
14131
14132
      /* All 3 XMM/YMM registers must be distinct.  */
14133
5.15k
      modrm_reg = ins->modrm.reg;
14134
5.15k
      if (ins->rex & REX_R)
14135
1.16k
  modrm_reg += 8;
14136
14137
5.15k
      if (ins->has_sib && ins->modrm.rm == 4)
14138
1.82k
  {
14139
1.82k
    sib_index = ins->sib.index;
14140
1.82k
    if (ins->rex & REX_X)
14141
295
      sib_index += 8;
14142
1.82k
  }
14143
14144
5.15k
      if (reg == modrm_reg || reg == sib_index)
14145
815
  strcpy (ins->obufp, "/(bad)");
14146
5.15k
      if (modrm_reg == sib_index || modrm_reg == reg)
14147
1.25k
  strcat (ins->op_out[0], "/(bad)");
14148
5.15k
      if (sib_index == modrm_reg || sib_index == reg)
14149
926
  strcat (ins->op_out[1], "/(bad)");
14150
14151
5.15k
      return true;
14152
14153
3.09k
    case tmm_mode:
14154
      /* All 3 TMM registers must be distinct.  */
14155
3.09k
      if (reg >= 8)
14156
965
  oappend (ins, "(bad)");
14157
2.13k
      else
14158
2.13k
  {
14159
    /* This must be the 3rd operand.  */
14160
2.13k
    if (ins->obufp != ins->op_out[2])
14161
0
      abort ();
14162
2.13k
    oappend_register (ins, att_names_tmm[reg]);
14163
2.13k
    if (reg == ins->modrm.reg || reg == ins->modrm.rm)
14164
1.46k
      strcpy (ins->obufp, "/(bad)");
14165
2.13k
  }
14166
14167
3.09k
      if (ins->modrm.reg == ins->modrm.rm || ins->modrm.reg == reg
14168
1.83k
    || ins->modrm.rm == reg)
14169
2.33k
  {
14170
2.33k
    if (ins->modrm.reg <= 8
14171
1.95k
        && (ins->modrm.reg == ins->modrm.rm || ins->modrm.reg == reg))
14172
897
      strcat (ins->op_out[0], "/(bad)");
14173
2.33k
    if (ins->modrm.rm <= 8
14174
1.84k
        && (ins->modrm.rm == ins->modrm.reg || ins->modrm.rm == reg))
14175
1.42k
      strcat (ins->op_out[1], "/(bad)");
14176
2.33k
  }
14177
14178
3.09k
      return true;
14179
14180
3.60k
    case v_mode:
14181
7.72k
    case dq_mode:
14182
7.72k
      if (ins->rex & REX_W)
14183
1.13k
  oappend_register (ins, att_names64[reg]);
14184
6.58k
      else if (bytemode == v_mode
14185
2.83k
         && !(sizeflag & DFLAG))
14186
351
  oappend_register (ins, att_names16[reg]);
14187
6.23k
      else
14188
6.23k
  oappend_register (ins, att_names32[reg]);
14189
7.72k
      return true;
14190
14191
510
    case b_mode:
14192
510
      oappend_register (ins, att_names8rex[reg]);
14193
510
      return true;
14194
14195
746
    case q_mode:
14196
746
      oappend_register (ins, att_names64[reg]);
14197
746
      return true;
14198
63.6k
    }
14199
14200
37.4k
  switch (ins->vex.length)
14201
37.4k
    {
14202
16.5k
    case 128:
14203
16.5k
      switch (bytemode)
14204
16.5k
  {
14205
16.5k
  case x_mode:
14206
16.5k
    names = att_names_xmm;
14207
16.5k
    ins->evex_used |= EVEX_len_used;
14208
16.5k
    break;
14209
0
  case mask_bd_mode:
14210
0
  case mask_mode:
14211
0
    if (reg > 0x7)
14212
0
      {
14213
0
        oappend (ins, "(bad)");
14214
0
        return true;
14215
0
      }
14216
0
    names = att_names_mask;
14217
0
    break;
14218
0
  default:
14219
0
    abort ();
14220
0
    return true;
14221
16.5k
  }
14222
16.5k
      break;
14223
16.5k
    case 256:
14224
10.7k
      switch (bytemode)
14225
10.7k
  {
14226
8.71k
  case x_mode:
14227
8.71k
    names = att_names_ymm;
14228
8.71k
    ins->evex_used |= EVEX_len_used;
14229
8.71k
    break;
14230
0
  case mask_bd_mode:
14231
2.05k
  case mask_mode:
14232
2.05k
    if (reg <= 0x7)
14233
1.02k
      {
14234
1.02k
        names = att_names_mask;
14235
1.02k
        break;
14236
1.02k
      }
14237
    /* Fall through.  */
14238
1.03k
  default:
14239
    /* See PR binutils/20893 for a reproducer.  */
14240
1.03k
    oappend (ins, "(bad)");
14241
1.03k
    return true;
14242
10.7k
  }
14243
9.73k
      break;
14244
10.1k
    case 512:
14245
10.1k
      names = att_names_zmm;
14246
10.1k
      ins->evex_used |= EVEX_len_used;
14247
10.1k
      break;
14248
0
    default:
14249
0
      abort ();
14250
0
      break;
14251
37.4k
    }
14252
36.4k
  oappend_register (ins, names[reg]);
14253
36.4k
  return true;
14254
37.4k
}
14255
14256
static bool
14257
OP_VexR (instr_info *ins, int bytemode, int sizeflag)
14258
4.20k
{
14259
4.20k
  if (ins->modrm.mod == 3)
14260
2.18k
    return OP_VEX (ins, bytemode, sizeflag);
14261
2.01k
  return true;
14262
4.20k
}
14263
14264
static bool
14265
OP_VexW (instr_info *ins, int bytemode, int sizeflag)
14266
1.42k
{
14267
1.42k
  OP_VEX (ins, bytemode, sizeflag);
14268
14269
1.42k
  if (ins->vex.w)
14270
1.07k
    {
14271
      /* Swap 2nd and 3rd operands.  */
14272
1.07k
      char *tmp = ins->op_out[2];
14273
14274
1.07k
      ins->op_out[2] = ins->op_out[1];
14275
1.07k
      ins->op_out[1] = tmp;
14276
14277
1.07k
      tmp = ins->cm_out[2];
14278
1.07k
      ins->cm_out[2] = ins->cm_out[1];
14279
1.07k
      ins->cm_out[1] = tmp;
14280
1.07k
    }
14281
1.42k
  return true;
14282
1.42k
}
14283
14284
static bool
14285
OP_REG_VexI4 (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
14286
2.39k
{
14287
2.39k
  int reg;
14288
2.39k
  const char (*names)[8] = att_names_xmm;
14289
14290
2.39k
  if (!fetch_code (ins->info, ins->codep + 1))
14291
249
    return false;
14292
2.14k
  reg = *ins->codep++;
14293
14294
2.14k
  if (bytemode != x_mode && bytemode != scalar_mode)
14295
0
    abort ();
14296
14297
2.14k
  reg >>= 4;
14298
2.14k
  if (ins->address_mode != mode_64bit)
14299
629
    reg &= 7;
14300
14301
2.14k
  if (bytemode == x_mode && ins->vex.length == 256)
14302
1.08k
    names = att_names_ymm;
14303
14304
2.14k
  oappend_register (ins, names[reg]);
14305
14306
2.14k
  if (ins->vex.w)
14307
1.09k
    {
14308
      /* Swap 3rd and 4th operands.  */
14309
1.09k
      char *tmp = ins->op_out[3];
14310
14311
1.09k
      ins->op_out[3] = ins->op_out[2];
14312
1.09k
      ins->op_out[2] = tmp;
14313
14314
1.09k
      tmp = ins->cm_out[2];
14315
1.09k
      ins->cm_out[3] = ins->cm_out[2];
14316
1.09k
      ins->cm_out[2] = tmp;
14317
1.09k
    }
14318
2.14k
  return true;
14319
2.14k
}
14320
14321
static bool
14322
OP_VexI4 (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
14323
    int sizeflag ATTRIBUTE_UNUSED)
14324
1.32k
{
14325
1.32k
  oappend_immediate (ins, ins->codep[-1] & 0xf);
14326
1.32k
  return true;
14327
1.32k
}
14328
14329
static bool
14330
VPCMP_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
14331
       int sizeflag ATTRIBUTE_UNUSED)
14332
2.48k
{
14333
2.48k
  unsigned int cmp_type;
14334
14335
2.48k
  if (!ins->vex.evex)
14336
0
    abort ();
14337
14338
2.48k
  if (!fetch_code (ins->info, ins->codep + 1))
14339
240
    return false;
14340
2.24k
  cmp_type = *ins->codep++;
14341
  /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
14342
     If it's the case, print suffix, otherwise - print the immediate.  */
14343
2.24k
  if (cmp_type < ARRAY_SIZE (simd_cmp_op)
14344
1.82k
      && cmp_type != 3
14345
1.40k
      && cmp_type != 7)
14346
1.09k
    {
14347
1.09k
      char suffix[3];
14348
1.09k
      char *p = ins->mnemonicendp - 2;
14349
14350
      /* vpcmp* can have both one- and two-lettered suffix.  */
14351
1.09k
      if (p[0] == 'p')
14352
784
  {
14353
784
    p++;
14354
784
    suffix[0] = p[0];
14355
784
    suffix[1] = '\0';
14356
784
  }
14357
313
      else
14358
313
  {
14359
313
    suffix[0] = p[0];
14360
313
    suffix[1] = p[1];
14361
313
    suffix[2] = '\0';
14362
313
  }
14363
14364
1.09k
      sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
14365
1.09k
      ins->mnemonicendp += simd_cmp_op[cmp_type].len;
14366
1.09k
    }
14367
1.15k
  else
14368
1.15k
    {
14369
      /* We have a reserved extension byte.  Output it directly.  */
14370
1.15k
      oappend_immediate (ins, cmp_type);
14371
1.15k
    }
14372
2.24k
  return true;
14373
2.48k
}
14374
14375
static const struct op xop_cmp_op[] =
14376
{
14377
  { STRING_COMMA_LEN ("lt") },
14378
  { STRING_COMMA_LEN ("le") },
14379
  { STRING_COMMA_LEN ("gt") },
14380
  { STRING_COMMA_LEN ("ge") },
14381
  { STRING_COMMA_LEN ("eq") },
14382
  { STRING_COMMA_LEN ("neq") },
14383
  { STRING_COMMA_LEN ("false") },
14384
  { STRING_COMMA_LEN ("true") }
14385
};
14386
14387
static bool
14388
VPCOM_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
14389
       int sizeflag ATTRIBUTE_UNUSED)
14390
1.63k
{
14391
1.63k
  unsigned int cmp_type;
14392
14393
1.63k
  if (!fetch_code (ins->info, ins->codep + 1))
14394
134
    return false;
14395
1.50k
  cmp_type = *ins->codep++;
14396
1.50k
  if (cmp_type < ARRAY_SIZE (xop_cmp_op))
14397
821
    {
14398
821
      char suffix[3];
14399
821
      char *p = ins->mnemonicendp - 2;
14400
14401
      /* vpcom* can have both one- and two-lettered suffix.  */
14402
821
      if (p[0] == 'm')
14403
300
  {
14404
300
    p++;
14405
300
    suffix[0] = p[0];
14406
300
    suffix[1] = '\0';
14407
300
  }
14408
521
      else
14409
521
  {
14410
521
    suffix[0] = p[0];
14411
521
    suffix[1] = p[1];
14412
521
    suffix[2] = '\0';
14413
521
  }
14414
14415
821
      sprintf (p, "%s%s", xop_cmp_op[cmp_type].name, suffix);
14416
821
      ins->mnemonicendp += xop_cmp_op[cmp_type].len;
14417
821
    }
14418
682
  else
14419
682
    {
14420
      /* We have a reserved extension byte.  Output it directly.  */
14421
682
      oappend_immediate (ins, cmp_type);
14422
682
    }
14423
1.50k
  return true;
14424
1.63k
}
14425
14426
static const struct op pclmul_op[] =
14427
{
14428
  { STRING_COMMA_LEN ("lql") },
14429
  { STRING_COMMA_LEN ("hql") },
14430
  { STRING_COMMA_LEN ("lqh") },
14431
  { STRING_COMMA_LEN ("hqh") }
14432
};
14433
14434
static bool
14435
PCLMUL_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
14436
        int sizeflag ATTRIBUTE_UNUSED)
14437
3.61k
{
14438
3.61k
  unsigned int pclmul_type;
14439
14440
3.61k
  if (!fetch_code (ins->info, ins->codep + 1))
14441
163
    return false;
14442
3.45k
  pclmul_type = *ins->codep++;
14443
3.45k
  switch (pclmul_type)
14444
3.45k
    {
14445
790
    case 0x10:
14446
790
      pclmul_type = 2;
14447
790
      break;
14448
702
    case 0x11:
14449
702
      pclmul_type = 3;
14450
702
      break;
14451
1.95k
    default:
14452
1.95k
      break;
14453
3.45k
    }
14454
3.45k
  if (pclmul_type < ARRAY_SIZE (pclmul_op))
14455
1.95k
    {
14456
1.95k
      char suffix[4];
14457
1.95k
      char *p = ins->mnemonicendp - 3;
14458
1.95k
      suffix[0] = p[0];
14459
1.95k
      suffix[1] = p[1];
14460
1.95k
      suffix[2] = p[2];
14461
1.95k
      suffix[3] = '\0';
14462
1.95k
      sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
14463
1.95k
      ins->mnemonicendp += pclmul_op[pclmul_type].len;
14464
1.95k
    }
14465
1.49k
  else
14466
1.49k
    {
14467
      /* We have a reserved extension byte.  Output it directly.  */
14468
1.49k
      oappend_immediate (ins, pclmul_type);
14469
1.49k
    }
14470
3.45k
  return true;
14471
3.45k
}
14472
14473
static bool
14474
MOVSXD_Fixup (instr_info *ins, int bytemode, int sizeflag)
14475
17.9k
{
14476
  /* Add proper suffix to "movsxd".  */
14477
17.9k
  char *p = ins->mnemonicendp;
14478
14479
17.9k
  switch (bytemode)
14480
17.9k
    {
14481
17.9k
    case movsxd_mode:
14482
17.9k
      if (!ins->intel_syntax)
14483
14.6k
  {
14484
14.6k
    USED_REX (REX_W);
14485
14.6k
    if (ins->rex & REX_W)
14486
987
      {
14487
987
        *p++ = 'l';
14488
987
        *p++ = 'q';
14489
987
        break;
14490
987
      }
14491
14.6k
  }
14492
14493
16.9k
      *p++ = 'x';
14494
16.9k
      *p++ = 'd';
14495
16.9k
      break;
14496
0
    default:
14497
0
      oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
14498
0
      break;
14499
17.9k
    }
14500
14501
17.9k
  ins->mnemonicendp = p;
14502
17.9k
  *p = '\0';
14503
17.9k
  return OP_E (ins, bytemode, sizeflag);
14504
17.9k
}
14505
14506
static bool
14507
DistinctDest_Fixup (instr_info *ins, int bytemode, int sizeflag)
14508
6.63k
{
14509
6.63k
  unsigned int reg = ins->vex.register_specifier;
14510
6.63k
  unsigned int modrm_reg = ins->modrm.reg;
14511
6.63k
  unsigned int modrm_rm = ins->modrm.rm;
14512
14513
  /* Calc destination register number.  */
14514
6.63k
  if (ins->rex & REX_R)
14515
848
    modrm_reg += 8;
14516
6.63k
  if (ins->rex2 & REX_R)
14517
1.69k
    modrm_reg += 16;
14518
14519
  /* Calc src1 register number.  */
14520
6.63k
  if (ins->address_mode != mode_64bit)
14521
2.03k
    reg &= 7;
14522
4.60k
  else if (ins->vex.evex && !ins->vex.v)
14523
2.50k
    reg += 16;
14524
14525
  /* Calc src2 register number.  */
14526
6.63k
  if (ins->modrm.mod == 3)
14527
2.02k
    {
14528
2.02k
      if (ins->rex & REX_B)
14529
1.22k
        modrm_rm += 8;
14530
2.02k
      if (ins->rex & REX_X)
14531
497
        modrm_rm += 16;
14532
2.02k
    }
14533
14534
  /* Destination and source registers must be distinct, output bad if
14535
     dest == src1 or dest == src2.  */
14536
6.63k
  if (modrm_reg == reg
14537
3.85k
      || (ins->modrm.mod == 3
14538
2.02k
    && modrm_reg == modrm_rm))
14539
3.08k
    {
14540
3.08k
      oappend (ins, "(bad)");
14541
3.08k
      return true;
14542
3.08k
    }
14543
3.55k
  return OP_XMM (ins, bytemode, sizeflag);
14544
6.63k
}
14545
14546
static bool
14547
OP_Rounding (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
14548
28.2k
{
14549
28.2k
  if (ins->modrm.mod != 3 || !ins->vex.b)
14550
23.2k
    return true;
14551
14552
4.97k
  ins->evex_used |= EVEX_b_used;
14553
4.97k
  switch (bytemode)
14554
4.97k
    {
14555
1.92k
    case evex_rounding_64_mode:
14556
1.92k
      if (ins->address_mode != mode_64bit || !ins->vex.w)
14557
1.36k
        return true;
14558
      /* Fall through.  */
14559
2.64k
    case evex_rounding_mode:
14560
2.64k
      oappend (ins, names_rounding[ins->vex.ll]);
14561
2.64k
      break;
14562
969
    case evex_sae_mode:
14563
969
      oappend (ins, "{");
14564
969
      break;
14565
0
    default:
14566
0
      abort ();
14567
4.97k
    }
14568
3.60k
  oappend (ins, "sae}");
14569
3.60k
  return true;
14570
4.97k
}
14571
14572
static bool
14573
PREFETCHI_Fixup (instr_info *ins, int bytemode, int sizeflag)
14574
3.05k
{
14575
3.05k
  if (ins->modrm.mod != 0 || ins->modrm.rm != 5)
14576
2.25k
    {
14577
2.25k
      if (ins->intel_syntax)
14578
710
  {
14579
710
    ins->mnemonicendp = stpcpy (ins->obuf, "nop   ");
14580
710
  }
14581
1.54k
      else
14582
1.54k
  {
14583
1.54k
    USED_REX (REX_W);
14584
1.54k
    if (ins->rex & REX_W)
14585
464
      ins->mnemonicendp = stpcpy (ins->obuf, "nopq  ");
14586
1.07k
    else
14587
1.07k
      {
14588
1.07k
        if (sizeflag & DFLAG)
14589
863
    ins->mnemonicendp = stpcpy (ins->obuf, "nopl  ");
14590
216
        else
14591
216
    ins->mnemonicendp = stpcpy (ins->obuf, "nopw  ");
14592
1.07k
        ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
14593
1.07k
      }
14594
1.54k
  }
14595
2.25k
      bytemode = v_mode;
14596
2.25k
    }
14597
14598
3.05k
  return OP_M (ins, bytemode, sizeflag);
14599
3.05k
}
14600
14601
static bool
14602
PUSH2_POP2_Fixup (instr_info *ins, int bytemode, int sizeflag)
14603
2.32k
{
14604
2.32k
  if (ins->modrm.mod != 3)
14605
473
    return true;
14606
14607
1.85k
  unsigned int vvvv_reg = ins->vex.register_specifier
14608
1.85k
    | (!ins->vex.v << 4);
14609
1.85k
  unsigned int rm_reg = ins->modrm.rm + (ins->rex & REX_B ? 8 : 0)
14610
1.85k
    + (ins->rex2 & REX_B ? 16 : 0);
14611
14612
  /* Push2/Pop2 cannot use RSP and Pop2 cannot pop two same registers.  */
14613
1.85k
  if (!ins->vex.nd || vvvv_reg == 0x4 || rm_reg == 0x4
14614
936
      || (!ins->modrm.reg
14615
689
    && vvvv_reg == rm_reg))
14616
1.10k
    {
14617
1.10k
      oappend (ins, "(bad)");
14618
1.10k
      return true;
14619
1.10k
    }
14620
14621
746
  return OP_VEX (ins, bytemode, sizeflag);
14622
1.85k
}
14623
14624
static bool
14625
JMPABS_Fixup (instr_info *ins, int bytemode, int sizeflag)
14626
26.7k
{
14627
26.7k
  if (ins->last_rex2_prefix >= 0)
14628
4.26k
    {
14629
4.26k
      uint64_t op;
14630
14631
4.26k
      if ((ins->prefixes & (PREFIX_OPCODE | PREFIX_ADDR | PREFIX_LOCK)) != 0x0
14632
3.72k
    || (ins->rex & REX_W) != 0x0)
14633
2.29k
  {
14634
2.29k
    oappend (ins, "(bad)");
14635
2.29k
    return true;
14636
2.29k
  }
14637
14638
1.97k
      if (bytemode == eAX_reg)
14639
985
  return true;
14640
14641
985
      if (!get64 (ins, &op))
14642
69
  return false;
14643
14644
916
      ins->mnemonicendp = stpcpy (ins->obuf, "jmpabs");
14645
916
      ins->rex2 |= REX2_SPECIAL;
14646
916
      oappend_immediate (ins, op);
14647
14648
916
      return true;
14649
985
    }
14650
14651
22.4k
  if (bytemode == eAX_reg)
14652
11.2k
    return OP_IMREG (ins, bytemode, sizeflag);
14653
11.2k
  return OP_OFF64 (ins, bytemode, sizeflag);
14654
22.4k
}
14655
14656
static bool
14657
CFCMOV_Fixup (instr_info *ins, int opnd, int sizeflag)
14658
6.02k
{
14659
  /* EVEX.NF is used as a direction bit in the 2-operand case to reverse the
14660
     source and destination operands.  */
14661
6.02k
  bool dstmem = !ins->vex.nd && ins->vex.nf;
14662
14663
6.02k
  if (opnd == 0)
14664
3.04k
    {
14665
3.04k
      if (dstmem)
14666
704
  return OP_E (ins, v_swap_mode, sizeflag);
14667
2.33k
      return OP_G (ins, v_mode, sizeflag);
14668
3.04k
    }
14669
14670
  /* These bits have been consumed and should be cleared.  */
14671
2.98k
  ins->vex.nf = false;
14672
2.98k
  ins->vex.mask_register_specifier = 0;
14673
14674
2.98k
  if (dstmem)
14675
642
    return OP_G (ins, v_mode, sizeflag);
14676
2.33k
  return OP_E (ins, v_mode, sizeflag);
14677
2.98k
}