Coverage Report

Created: 2026-10-02 09:53

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
281M
#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
13.8M
#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
17.9M
#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
8.88M
  {             \
298
8.88M
    if (value)           \
299
8.88M
      {             \
300
8.39M
  if (ins->rex & value)       \
301
8.39M
    ins->rex_used |= (value) | REX_OPCODE; \
302
8.39M
  if (ins->rex2 & value)       \
303
8.39M
    {           \
304
83.1k
      ins->rex2_used |= (value);      \
305
83.1k
      ins->rex_used |= REX_OPCODE;   \
306
83.1k
    }            \
307
8.39M
      }              \
308
8.88M
    else            \
309
8.88M
      ins->rex_used |= REX_OPCODE;     \
310
8.88M
  }
311
312
313
52.5k
#define EVEX_b_used 1
314
125k
#define EVEX_len_used 2
315
316
317
/* {rex2} is not printed when the REX2_SPECIAL is set.  */
318
37.6k
#define REX2_SPECIAL 16
319
320
/* Flags stored in PREFIXES.  */
321
489k
#define PREFIX_REPZ 1
322
701k
#define PREFIX_REPNZ 2
323
7.33M
#define PREFIX_CS 4
324
6.21M
#define PREFIX_SS 8
325
7.20M
#define PREFIX_DS 0x10
326
6.23M
#define PREFIX_ES 0x20
327
6.37M
#define PREFIX_FS 0x40
328
6.36M
#define PREFIX_GS 0x80
329
1.97M
#define PREFIX_LOCK 0x100
330
15.4M
#define PREFIX_DATA 0x200
331
15.9M
#define PREFIX_ADDR 0x400
332
6.43M
#define PREFIX_FWAIT 0x800
333
12.4M
#define PREFIX_REX2 0x1000
334
39.8k
#define PREFIX_NP_OR_DATA 0x2000
335
32.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
20.5M
{
343
20.5M
  int status = -1;
344
20.5M
  struct dis_private *priv = info->private_data;
345
20.5M
  bfd_vma start = priv->insn_start + priv->fetched;
346
20.5M
  uint8_t *fetch_end = priv->the_buffer + priv->fetched;
347
20.5M
  ptrdiff_t needed = until - fetch_end;
348
349
20.5M
  if (needed <= 0)
350
6.36M
    return true;
351
352
14.2M
  if (priv->fetched + (size_t) needed <= ARRAY_SIZE (priv->the_buffer))
353
14.2M
    status = (*info->read_memory_func) (start, fetch_end, needed, info);
354
14.2M
  if (status != 0)
355
52.6k
    {
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
52.6k
      if (!priv->fetched)
361
724
  (*info->memory_error_func) (status, start, info);
362
52.6k
      return false;
363
52.6k
    }
364
365
14.1M
  priv->fetched += needed;
366
14.1M
  return true;
367
14.2M
}
368
369
static bool
370
fetch_modrm (instr_info *ins)
371
4.05M
{
372
4.05M
  if (!fetch_code (ins->info, ins->codep + 1))
373
7.43k
    return false;
374
375
4.04M
  ins->modrm.mod = (*ins->codep >> 6) & 3;
376
4.04M
  ins->modrm.reg = (*ins->codep >> 3) & 7;
377
4.04M
  ins->modrm.rm = *ins->codep & 7;
378
379
4.04M
  return true;
380
4.05M
}
381
382
static int
383
fetch_error (const instr_info *ins)
384
53.8k
{
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
53.8k
  const struct dis_private *priv = ins->info->private_data;
389
53.8k
  const char *name = NULL;
390
391
53.8k
  if (ins->codep <= priv->the_buffer)
392
724
    return -1;
393
394
53.1k
  if (ins->prefixes || ins->fwait_prefix >= 0 || (ins->rex & REX_OPCODE))
395
34.9k
    name = prefix_name (ins->address_mode, priv->the_buffer[0],
396
34.9k
      priv->orig_sizeflag);
397
53.1k
  if (name != NULL)
398
34.6k
    i386_dis_printf (ins->info, dis_style_mnemonic, "%s", name);
399
18.5k
  else
400
18.5k
    {
401
      /* Just print the first byte as a .byte instruction.  */
402
18.5k
      i386_dis_printf (ins->info, dis_style_assembler_directive, ".byte ");
403
18.5k
      i386_dis_printf (ins->info, dis_style_immediate, "%#x",
404
18.5k
           (unsigned int) priv->the_buffer[0]);
405
18.5k
    }
406
407
53.1k
  return 1;
408
53.8k
}
409
410
/* Possible values for prefix requirement.  */
411
12.4M
#define PREFIX_IGNORED_SHIFT  16
412
13.8k
#define PREFIX_IGNORED_REPZ (PREFIX_REPZ << PREFIX_IGNORED_SHIFT)
413
13.8k
#define PREFIX_IGNORED_REPNZ  (PREFIX_REPNZ << PREFIX_IGNORED_SHIFT)
414
13.8k
#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
12.4M
#define PREFIX_REX2_ILLEGAL (PREFIX_REX2 << PREFIX_IGNORED_SHIFT)
418
419
/* Opcode prefixes.  */
420
61.9k
#define PREFIX_OPCODE   (PREFIX_REPZ \
421
61.9k
         | PREFIX_REPNZ \
422
61.9k
         | PREFIX_DATA)
423
424
/* Prefixes ignored.  */
425
13.8k
#define PREFIX_IGNORED    (PREFIX_IGNORED_REPZ \
426
13.8k
         | PREFIX_IGNORED_REPNZ \
427
13.8k
         | 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
4.01M
#define SUFFIX_ALWAYS 4
653
16.1M
#define AFLAG 2
654
8.90M
#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_4,
1022
  PREFIX_0F01_REG_7_MOD_3_RM_5,
1023
  PREFIX_0F01_REG_7_MOD_3_RM_6,
1024
  PREFIX_0F01_REG_7_MOD_3_RM_7,
1025
  PREFIX_0F09,
1026
  PREFIX_0F10,
1027
  PREFIX_0F11,
1028
  PREFIX_0F12,
1029
  PREFIX_0F16,
1030
  PREFIX_0F18_REG_6_MOD_0_X86_64,
1031
  PREFIX_0F18_REG_7_MOD_0_X86_64,
1032
  PREFIX_0F1A,
1033
  PREFIX_0F1B,
1034
  PREFIX_0F1C,
1035
  PREFIX_0F1E,
1036
  PREFIX_0F2A,
1037
  PREFIX_0F2B,
1038
  PREFIX_0F2C,
1039
  PREFIX_0F2D,
1040
  PREFIX_0F2E,
1041
  PREFIX_0F2F,
1042
  PREFIX_0F51,
1043
  PREFIX_0F52,
1044
  PREFIX_0F53,
1045
  PREFIX_0F58,
1046
  PREFIX_0F59,
1047
  PREFIX_0F5A,
1048
  PREFIX_0F5B,
1049
  PREFIX_0F5C,
1050
  PREFIX_0F5D,
1051
  PREFIX_0F5E,
1052
  PREFIX_0F5F,
1053
  PREFIX_0F60,
1054
  PREFIX_0F61,
1055
  PREFIX_0F62,
1056
  PREFIX_0F6F,
1057
  PREFIX_0F70,
1058
  PREFIX_0F78,
1059
  PREFIX_0F79,
1060
  PREFIX_0F7C,
1061
  PREFIX_0F7D,
1062
  PREFIX_0F7E,
1063
  PREFIX_0F7F,
1064
  PREFIX_0FA6_REG_0,
1065
  PREFIX_0FA6_REG_5,
1066
  PREFIX_0FA7_REG_6,
1067
  PREFIX_0FAE_REG_0_MOD_3,
1068
  PREFIX_0FAE_REG_1_MOD_3,
1069
  PREFIX_0FAE_REG_2_MOD_3,
1070
  PREFIX_0FAE_REG_3_MOD_3,
1071
  PREFIX_0FAE_REG_4_MOD_0,
1072
  PREFIX_0FAE_REG_4_MOD_3,
1073
  PREFIX_0FAE_REG_5_MOD_3,
1074
  PREFIX_0FAE_REG_6_MOD_0,
1075
  PREFIX_0FAE_REG_6_MOD_3,
1076
  PREFIX_0FAE_REG_7_MOD_0,
1077
  PREFIX_0FB8,
1078
  PREFIX_0FBC,
1079
  PREFIX_0FBD,
1080
  PREFIX_0FC2,
1081
  PREFIX_0FC7_REG_6_MOD_0,
1082
  PREFIX_0FC7_REG_6_MOD_3,
1083
  PREFIX_0FC7_REG_7_MOD_3,
1084
  PREFIX_0FD0,
1085
  PREFIX_0FD6,
1086
  PREFIX_0FE6,
1087
  PREFIX_0FE7,
1088
  PREFIX_0FF0,
1089
  PREFIX_0FF7,
1090
  PREFIX_0F38D8,
1091
  PREFIX_0F38DC,
1092
  PREFIX_0F38DD,
1093
  PREFIX_0F38DE,
1094
  PREFIX_0F38DF,
1095
  PREFIX_0F38F0,
1096
  PREFIX_0F38F1,
1097
  PREFIX_0F38F6,
1098
  PREFIX_0F38F8_M_0,
1099
  PREFIX_0F38F8_M_1_X86_64,
1100
  PREFIX_0F38FA,
1101
  PREFIX_0F38FB,
1102
  PREFIX_0F38FC,
1103
  PREFIX_0F3A0F,
1104
  PREFIX_VEX_0F12,
1105
  PREFIX_VEX_0F16,
1106
  PREFIX_VEX_0F2A,
1107
  PREFIX_VEX_0F2C,
1108
  PREFIX_VEX_0F2D,
1109
  PREFIX_VEX_0F41_L_1_W_0,
1110
  PREFIX_VEX_0F41_L_1_W_1,
1111
  PREFIX_VEX_0F42_L_1_W_0,
1112
  PREFIX_VEX_0F42_L_1_W_1,
1113
  PREFIX_VEX_0F44_L_0_W_0,
1114
  PREFIX_VEX_0F44_L_0_W_1,
1115
  PREFIX_VEX_0F45_L_1_W_0,
1116
  PREFIX_VEX_0F45_L_1_W_1,
1117
  PREFIX_VEX_0F46_L_1_W_0,
1118
  PREFIX_VEX_0F46_L_1_W_1,
1119
  PREFIX_VEX_0F47_L_1_W_0,
1120
  PREFIX_VEX_0F47_L_1_W_1,
1121
  PREFIX_VEX_0F4A_L_1_W_0,
1122
  PREFIX_VEX_0F4A_L_1_W_1,
1123
  PREFIX_VEX_0F4B_L_1_W_0,
1124
  PREFIX_VEX_0F4B_L_1_W_1,
1125
  PREFIX_VEX_0F6F,
1126
  PREFIX_VEX_0F70,
1127
  PREFIX_VEX_0F7E,
1128
  PREFIX_VEX_0F7F,
1129
  PREFIX_VEX_0F90_L_0_W_0,
1130
  PREFIX_VEX_0F90_L_0_W_1,
1131
  PREFIX_VEX_0F91_L_0_W_0,
1132
  PREFIX_VEX_0F91_L_0_W_1,
1133
  PREFIX_VEX_0F92_L_0_W_0,
1134
  PREFIX_VEX_0F92_L_0_W_1,
1135
  PREFIX_VEX_0F93_L_0_W_0,
1136
  PREFIX_VEX_0F93_L_0_W_1,
1137
  PREFIX_VEX_0F98_L_0_W_0,
1138
  PREFIX_VEX_0F98_L_0_W_1,
1139
  PREFIX_VEX_0F99_L_0_W_0,
1140
  PREFIX_VEX_0F99_L_0_W_1,
1141
  PREFIX_VEX_0F3848_X86_64_L_0_W_0,
1142
  PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_0,
1143
  PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_1,
1144
  PREFIX_VEX_0F384A_X86_64_W_0_L_0,
1145
  PREFIX_VEX_0F384B_X86_64_L_0_W_0,
1146
  PREFIX_VEX_0F3850_W_0,
1147
  PREFIX_VEX_0F3851_W_0,
1148
  PREFIX_VEX_0F385C_X86_64_L_0_W_0,
1149
  PREFIX_VEX_0F385E_X86_64_L_0_W_0,
1150
  PREFIX_VEX_0F385F_X86_64_L_0_W_0,
1151
  PREFIX_VEX_0F386B_X86_64_L_0_W_0,
1152
  PREFIX_VEX_0F386C_X86_64_L_0_W_0,
1153
  PREFIX_VEX_0F386E_X86_64_L_0_W_0,
1154
  PREFIX_VEX_0F386F_X86_64_L_0_W_0,
1155
  PREFIX_VEX_0F3872,
1156
  PREFIX_VEX_0F38B0_W_0,
1157
  PREFIX_VEX_0F38B1_W_0,
1158
  PREFIX_VEX_0F38D2_W_0,
1159
  PREFIX_VEX_0F38D3_W_0,
1160
  PREFIX_VEX_0F38CB,
1161
  PREFIX_VEX_0F38CC,
1162
  PREFIX_VEX_0F38CD,
1163
  PREFIX_VEX_0F38DA_W_0,
1164
  PREFIX_VEX_0F38F2_L_0,
1165
  PREFIX_VEX_0F38F3_L_0,
1166
  PREFIX_VEX_0F38F5_L_0,
1167
  PREFIX_VEX_0F38F6_L_0,
1168
  PREFIX_VEX_0F38F7_L_0,
1169
  PREFIX_VEX_0F3AF0_L_0,
1170
  PREFIX_VEX_MAP5_F8_X86_64_L_0_W_0,
1171
  PREFIX_VEX_MAP5_F9_X86_64_L_0_W_0,
1172
  PREFIX_VEX_MAP5_FD_X86_64_L_0_W_0,
1173
  PREFIX_VEX_MAP7_F6_L_0_W_0_R_0_X86_64,
1174
  PREFIX_VEX_MAP7_F8_L_0_W_0_R_0_X86_64,
1175
1176
  PREFIX_EVEX_0F2E,
1177
  PREFIX_EVEX_0F2F,
1178
  PREFIX_EVEX_0F5B,
1179
  PREFIX_EVEX_0F6F,
1180
  PREFIX_EVEX_0F70,
1181
  PREFIX_EVEX_0F78,
1182
  PREFIX_EVEX_0F79,
1183
  PREFIX_EVEX_0F7A,
1184
  PREFIX_EVEX_0F7B,
1185
  PREFIX_EVEX_0F7E,
1186
  PREFIX_EVEX_0F7F,
1187
  PREFIX_EVEX_0FC2,
1188
  PREFIX_EVEX_0FE6,
1189
  PREFIX_EVEX_0F3810,
1190
  PREFIX_EVEX_0F3811,
1191
  PREFIX_EVEX_0F3812,
1192
  PREFIX_EVEX_0F3813,
1193
  PREFIX_EVEX_0F3814,
1194
  PREFIX_EVEX_0F3815,
1195
  PREFIX_EVEX_0F3820,
1196
  PREFIX_EVEX_0F3821,
1197
  PREFIX_EVEX_0F3822,
1198
  PREFIX_EVEX_0F3823,
1199
  PREFIX_EVEX_0F3824,
1200
  PREFIX_EVEX_0F3825,
1201
  PREFIX_EVEX_0F3826,
1202
  PREFIX_EVEX_0F3827,
1203
  PREFIX_EVEX_0F3828,
1204
  PREFIX_EVEX_0F3829,
1205
  PREFIX_EVEX_0F382A,
1206
  PREFIX_EVEX_0F3830,
1207
  PREFIX_EVEX_0F3831,
1208
  PREFIX_EVEX_0F3832,
1209
  PREFIX_EVEX_0F3833,
1210
  PREFIX_EVEX_0F3834,
1211
  PREFIX_EVEX_0F3835,
1212
  PREFIX_EVEX_0F3838,
1213
  PREFIX_EVEX_0F3839,
1214
  PREFIX_EVEX_0F383A,
1215
  PREFIX_EVEX_0F3841_W_0,
1216
  PREFIX_EVEX_0F384A_X86_64_W_0_L_2,
1217
  PREFIX_EVEX_0F3852,
1218
  PREFIX_EVEX_0F3853,
1219
  PREFIX_EVEX_0F3868,
1220
  PREFIX_EVEX_0F386D_X86_64_W_0_L_2,
1221
  PREFIX_EVEX_0F3872,
1222
  PREFIX_EVEX_0F3874,
1223
  PREFIX_EVEX_0F389A,
1224
  PREFIX_EVEX_0F389B,
1225
  PREFIX_EVEX_0F38AA,
1226
  PREFIX_EVEX_0F38AB,
1227
1228
  PREFIX_EVEX_0F3A07_X86_64_W_0_L_2,
1229
  PREFIX_EVEX_0F3A08,
1230
  PREFIX_EVEX_0F3A0A,
1231
  PREFIX_EVEX_0F3A26,
1232
  PREFIX_EVEX_0F3A27,
1233
  PREFIX_EVEX_0F3A42_W_0,
1234
  PREFIX_EVEX_0F3A52,
1235
  PREFIX_EVEX_0F3A53,
1236
  PREFIX_EVEX_0F3A56,
1237
  PREFIX_EVEX_0F3A57,
1238
  PREFIX_EVEX_0F3A66,
1239
  PREFIX_EVEX_0F3A67,
1240
  PREFIX_EVEX_0F3A77_X86_64_W_0_L_2,
1241
  PREFIX_EVEX_0F3AC2,
1242
1243
  PREFIX_EVEX_MAP4_4x,
1244
  PREFIX_EVEX_MAP4_F0,
1245
  PREFIX_EVEX_MAP4_F1,
1246
  PREFIX_EVEX_MAP4_F2,
1247
  PREFIX_EVEX_MAP4_F8,
1248
1249
  PREFIX_EVEX_MAP5_10,
1250
  PREFIX_EVEX_MAP5_11,
1251
  PREFIX_EVEX_MAP5_18,
1252
  PREFIX_EVEX_MAP5_1B,
1253
  PREFIX_EVEX_MAP5_1D,
1254
  PREFIX_EVEX_MAP5_1E,
1255
  PREFIX_EVEX_MAP5_2A,
1256
  PREFIX_EVEX_MAP5_2C,
1257
  PREFIX_EVEX_MAP5_2D,
1258
  PREFIX_EVEX_MAP5_2E,
1259
  PREFIX_EVEX_MAP5_2F,
1260
  PREFIX_EVEX_MAP5_51,
1261
  PREFIX_EVEX_MAP5_58,
1262
  PREFIX_EVEX_MAP5_59,
1263
  PREFIX_EVEX_MAP5_5A,
1264
  PREFIX_EVEX_MAP5_5B,
1265
  PREFIX_EVEX_MAP5_5C,
1266
  PREFIX_EVEX_MAP5_5D,
1267
  PREFIX_EVEX_MAP5_5E,
1268
  PREFIX_EVEX_MAP5_5F,
1269
  PREFIX_EVEX_MAP5_68,
1270
  PREFIX_EVEX_MAP5_69,
1271
  PREFIX_EVEX_MAP5_6A,
1272
  PREFIX_EVEX_MAP5_6B,
1273
  PREFIX_EVEX_MAP5_6C,
1274
  PREFIX_EVEX_MAP5_6D,
1275
  PREFIX_EVEX_MAP5_6E_L_0,
1276
  PREFIX_EVEX_MAP5_6F_X86_64,
1277
  PREFIX_EVEX_MAP5_36,
1278
  PREFIX_EVEX_MAP5_37,
1279
  PREFIX_EVEX_MAP5_38_W_0,
1280
  PREFIX_EVEX_MAP5_39_W_0,
1281
  PREFIX_EVEX_MAP5_3A_W_0,
1282
  PREFIX_EVEX_MAP5_3B_W_0,
1283
  PREFIX_EVEX_MAP5_3C_W_0,
1284
  PREFIX_EVEX_MAP5_3D,
1285
  PREFIX_EVEX_MAP5_3E_W_1,
1286
  PREFIX_EVEX_MAP5_74,
1287
  PREFIX_EVEX_MAP5_78,
1288
  PREFIX_EVEX_MAP5_79,
1289
  PREFIX_EVEX_MAP5_7A,
1290
  PREFIX_EVEX_MAP5_7B,
1291
  PREFIX_EVEX_MAP5_7C,
1292
  PREFIX_EVEX_MAP5_7D,
1293
  PREFIX_EVEX_MAP5_7E_L_0,
1294
1295
  PREFIX_EVEX_MAP6_13,
1296
  PREFIX_EVEX_MAP6_2C,
1297
  PREFIX_EVEX_MAP6_42,
1298
  PREFIX_EVEX_MAP6_4C,
1299
  PREFIX_EVEX_MAP6_4E,
1300
  PREFIX_EVEX_MAP6_56,
1301
  PREFIX_EVEX_MAP6_57,
1302
  PREFIX_EVEX_MAP6_98,
1303
  PREFIX_EVEX_MAP6_9A,
1304
  PREFIX_EVEX_MAP6_9C,
1305
  PREFIX_EVEX_MAP6_9E,
1306
  PREFIX_EVEX_MAP6_A8,
1307
  PREFIX_EVEX_MAP6_AA,
1308
  PREFIX_EVEX_MAP6_AC,
1309
  PREFIX_EVEX_MAP6_AE,
1310
  PREFIX_EVEX_MAP6_B8,
1311
  PREFIX_EVEX_MAP6_BA,
1312
  PREFIX_EVEX_MAP6_BC,
1313
  PREFIX_EVEX_MAP6_BE,
1314
  PREFIX_EVEX_MAP6_D6,
1315
  PREFIX_EVEX_MAP6_D7,
1316
};
1317
1318
enum
1319
{
1320
  X86_64_06 = 0,
1321
  X86_64_07,
1322
  X86_64_0E,
1323
  X86_64_16,
1324
  X86_64_17,
1325
  X86_64_1E,
1326
  X86_64_1F,
1327
  X86_64_27,
1328
  X86_64_2F,
1329
  X86_64_37,
1330
  X86_64_3F,
1331
  X86_64_60,
1332
  X86_64_61,
1333
  X86_64_62,
1334
  X86_64_63,
1335
  X86_64_6D,
1336
  X86_64_6F,
1337
  X86_64_82,
1338
  X86_64_9A,
1339
  X86_64_C2,
1340
  X86_64_C3,
1341
  X86_64_C4,
1342
  X86_64_C5,
1343
  X86_64_CE,
1344
  X86_64_D4,
1345
  X86_64_D5,
1346
  X86_64_D6,
1347
  X86_64_E8,
1348
  X86_64_E9,
1349
  X86_64_EA,
1350
  X86_64_0F00_REG_6,
1351
  X86_64_0F01_REG_0,
1352
  X86_64_0F01_REG_0_MOD_3_RM_6_P_1,
1353
  X86_64_0F01_REG_0_MOD_3_RM_6_P_3,
1354
  X86_64_0F01_REG_0_MOD_3_RM_7_P_0,
1355
  X86_64_0F01_REG_1,
1356
  X86_64_0F01_REG_1_RM_2_PREFIX_1,
1357
  X86_64_0F01_REG_1_RM_2_PREFIX_3,
1358
  X86_64_0F01_REG_1_RM_5_PREFIX_2,
1359
  X86_64_0F01_REG_1_RM_6_PREFIX_2,
1360
  X86_64_0F01_REG_1_RM_7_PREFIX_2,
1361
  X86_64_0F01_REG_2,
1362
  X86_64_0F01_REG_3,
1363
  X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1,
1364
  X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1,
1365
  X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1,
1366
  X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1,
1367
  X86_64_0F01_REG_7_MOD_3_RM_4_PREFIX_1,
1368
  X86_64_0F01_REG_7_MOD_3_RM_4_PREFIX_3,
1369
  X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_1,
1370
  X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_3,
1371
  X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1,
1372
  X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3,
1373
  X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1,
1374
  X86_64_0F18_REG_6_MOD_0,
1375
  X86_64_0F18_REG_7_MOD_0,
1376
  X86_64_0F24,
1377
  X86_64_0F26,
1378
  X86_64_0F388A,
1379
  X86_64_0F388B,
1380
  X86_64_0F38F8_M_1,
1381
  X86_64_0FAE_REG_0_MOD_3_PREFIX_1,
1382
  X86_64_0FAE_REG_1_MOD_3_PREFIX_1,
1383
  X86_64_0FAE_REG_2_MOD_3_PREFIX_1,
1384
  X86_64_0FAE_REG_3_MOD_3_PREFIX_1,
1385
  X86_64_0FC7_REG_6_MOD_3_PREFIX_1,
1386
1387
  X86_64_VEX_0F3848,
1388
  X86_64_VEX_0F3849,
1389
  X86_64_VEX_0F384A,
1390
  X86_64_VEX_0F384B,
1391
  X86_64_VEX_0F385C,
1392
  X86_64_VEX_0F385E,
1393
  X86_64_VEX_0F385F,
1394
  X86_64_VEX_0F386B,
1395
  X86_64_VEX_0F386C,
1396
  X86_64_VEX_0F386E,
1397
  X86_64_VEX_0F386F,
1398
  X86_64_VEX_0F38Ex,
1399
1400
  X86_64_VEX_MAP5_F8,
1401
  X86_64_VEX_MAP5_F9,
1402
  X86_64_VEX_MAP5_FD,
1403
  X86_64_VEX_MAP7_F6_L_0_W_0_R_0,
1404
  X86_64_VEX_MAP7_F8_L_0_W_0_R_0,
1405
1406
  X86_64_EVEX_0F384A,
1407
  X86_64_EVEX_0F386D,
1408
  X86_64_EVEX_0F3A07,
1409
  X86_64_EVEX_0F3A77,
1410
1411
  X86_64_EVEX_MAP5_6F,
1412
};
1413
1414
enum
1415
{
1416
  THREE_BYTE_0F38 = 0,
1417
  THREE_BYTE_0F3A
1418
};
1419
1420
enum
1421
{
1422
  XOP_08 = 0,
1423
  XOP_09,
1424
  XOP_0A
1425
};
1426
1427
enum
1428
{
1429
  VEX_0F = 0,
1430
  VEX_0F38,
1431
  VEX_0F3A,
1432
  VEX_MAP5,
1433
  VEX_MAP7,
1434
};
1435
1436
enum
1437
{
1438
  EVEX_0F = 0,
1439
  EVEX_0F38,
1440
  EVEX_0F3A,
1441
  EVEX_MAP4,
1442
  EVEX_MAP5,
1443
  EVEX_MAP6,
1444
  EVEX_MAP7,
1445
};
1446
1447
enum
1448
{
1449
  VEX_LEN_0F12_P_0 = 0,
1450
  VEX_LEN_0F12_P_2,
1451
  VEX_LEN_0F13,
1452
  VEX_LEN_0F16_P_0,
1453
  VEX_LEN_0F16_P_2,
1454
  VEX_LEN_0F17,
1455
  VEX_LEN_0F41,
1456
  VEX_LEN_0F42,
1457
  VEX_LEN_0F44,
1458
  VEX_LEN_0F45,
1459
  VEX_LEN_0F46,
1460
  VEX_LEN_0F47,
1461
  VEX_LEN_0F4A,
1462
  VEX_LEN_0F4B,
1463
  VEX_LEN_0F6E,
1464
  VEX_LEN_0F77,
1465
  VEX_LEN_0F7E_P_1,
1466
  VEX_LEN_0F7E_P_2,
1467
  VEX_LEN_0F90,
1468
  VEX_LEN_0F91,
1469
  VEX_LEN_0F92,
1470
  VEX_LEN_0F93,
1471
  VEX_LEN_0F98,
1472
  VEX_LEN_0F99,
1473
  VEX_LEN_0FAE_R_2,
1474
  VEX_LEN_0FAE_R_3,
1475
  VEX_LEN_0FC4,
1476
  VEX_LEN_0FD6,
1477
  VEX_LEN_0F3816,
1478
  VEX_LEN_0F3819,
1479
  VEX_LEN_0F381A,
1480
  VEX_LEN_0F3836,
1481
  VEX_LEN_0F3841,
1482
  VEX_LEN_0F3848_X86_64,
1483
  VEX_LEN_0F3849_X86_64,
1484
  VEX_LEN_0F384A_X86_64_W_0,
1485
  VEX_LEN_0F384B_X86_64,
1486
  VEX_LEN_0F385A,
1487
  VEX_LEN_0F385C_X86_64,
1488
  VEX_LEN_0F385E_X86_64,
1489
  VEX_LEN_0F385F_X86_64,
1490
  VEX_LEN_0F386B_X86_64,
1491
  VEX_LEN_0F386C_X86_64,
1492
  VEX_LEN_0F386E_X86_64,
1493
  VEX_LEN_0F386F_X86_64,
1494
  VEX_LEN_0F38CB_P_3_W_0,
1495
  VEX_LEN_0F38CC_P_3_W_0,
1496
  VEX_LEN_0F38CD_P_3_W_0,
1497
  VEX_LEN_0F38DA_W_0_P_0,
1498
  VEX_LEN_0F38DA_W_0_P_2,
1499
  VEX_LEN_0F38DB,
1500
  VEX_LEN_0F38F2,
1501
  VEX_LEN_0F38F3,
1502
  VEX_LEN_0F38F5,
1503
  VEX_LEN_0F38F6,
1504
  VEX_LEN_0F38F7,
1505
  VEX_LEN_0F3A00,
1506
  VEX_LEN_0F3A01,
1507
  VEX_LEN_0F3A06,
1508
  VEX_LEN_0F3A14,
1509
  VEX_LEN_0F3A15,
1510
  VEX_LEN_0F3A16,
1511
  VEX_LEN_0F3A17,
1512
  VEX_LEN_0F3A18,
1513
  VEX_LEN_0F3A19,
1514
  VEX_LEN_0F3A20,
1515
  VEX_LEN_0F3A21,
1516
  VEX_LEN_0F3A22,
1517
  VEX_LEN_0F3A30,
1518
  VEX_LEN_0F3A31,
1519
  VEX_LEN_0F3A32,
1520
  VEX_LEN_0F3A33,
1521
  VEX_LEN_0F3A38,
1522
  VEX_LEN_0F3A39,
1523
  VEX_LEN_0F3A41,
1524
  VEX_LEN_0F3A46,
1525
  VEX_LEN_0F3A60,
1526
  VEX_LEN_0F3A61,
1527
  VEX_LEN_0F3A62,
1528
  VEX_LEN_0F3A63,
1529
  VEX_LEN_0F3ADE_W_0,
1530
  VEX_LEN_0F3ADF,
1531
  VEX_LEN_0F3AF0,
1532
  VEX_LEN_MAP5_F8_X86_64,
1533
  VEX_LEN_MAP5_F9_X86_64,
1534
  VEX_LEN_MAP5_FD_X86_64,
1535
  VEX_LEN_MAP7_F6,
1536
  VEX_LEN_MAP7_F8,
1537
  VEX_LEN_XOP_08_85,
1538
  VEX_LEN_XOP_08_86,
1539
  VEX_LEN_XOP_08_87,
1540
  VEX_LEN_XOP_08_8E,
1541
  VEX_LEN_XOP_08_8F,
1542
  VEX_LEN_XOP_08_95,
1543
  VEX_LEN_XOP_08_96,
1544
  VEX_LEN_XOP_08_97,
1545
  VEX_LEN_XOP_08_9E,
1546
  VEX_LEN_XOP_08_9F,
1547
  VEX_LEN_XOP_08_A3,
1548
  VEX_LEN_XOP_08_A6,
1549
  VEX_LEN_XOP_08_B6,
1550
  VEX_LEN_XOP_08_C0,
1551
  VEX_LEN_XOP_08_C1,
1552
  VEX_LEN_XOP_08_C2,
1553
  VEX_LEN_XOP_08_C3,
1554
  VEX_LEN_XOP_08_CC,
1555
  VEX_LEN_XOP_08_CD,
1556
  VEX_LEN_XOP_08_CE,
1557
  VEX_LEN_XOP_08_CF,
1558
  VEX_LEN_XOP_08_EC,
1559
  VEX_LEN_XOP_08_ED,
1560
  VEX_LEN_XOP_08_EE,
1561
  VEX_LEN_XOP_08_EF,
1562
  VEX_LEN_XOP_09_01,
1563
  VEX_LEN_XOP_09_02,
1564
  VEX_LEN_XOP_09_12,
1565
  VEX_LEN_XOP_09_82_W_0,
1566
  VEX_LEN_XOP_09_83_W_0,
1567
  VEX_LEN_XOP_09_90,
1568
  VEX_LEN_XOP_09_91,
1569
  VEX_LEN_XOP_09_92,
1570
  VEX_LEN_XOP_09_93,
1571
  VEX_LEN_XOP_09_94,
1572
  VEX_LEN_XOP_09_95,
1573
  VEX_LEN_XOP_09_96,
1574
  VEX_LEN_XOP_09_97,
1575
  VEX_LEN_XOP_09_98,
1576
  VEX_LEN_XOP_09_99,
1577
  VEX_LEN_XOP_09_9A,
1578
  VEX_LEN_XOP_09_9B,
1579
  VEX_LEN_XOP_09_C1,
1580
  VEX_LEN_XOP_09_C2,
1581
  VEX_LEN_XOP_09_C3,
1582
  VEX_LEN_XOP_09_C6,
1583
  VEX_LEN_XOP_09_C7,
1584
  VEX_LEN_XOP_09_CB,
1585
  VEX_LEN_XOP_09_D1,
1586
  VEX_LEN_XOP_09_D2,
1587
  VEX_LEN_XOP_09_D3,
1588
  VEX_LEN_XOP_09_D6,
1589
  VEX_LEN_XOP_09_D7,
1590
  VEX_LEN_XOP_09_DB,
1591
  VEX_LEN_XOP_09_E1,
1592
  VEX_LEN_XOP_09_E2,
1593
  VEX_LEN_XOP_09_E3,
1594
  VEX_LEN_XOP_0A_12,
1595
};
1596
1597
enum
1598
{
1599
  EVEX_LEN_0F7E_P_1_W_0 = 0,
1600
  EVEX_LEN_0FD6_P_2_W_0,
1601
  EVEX_LEN_0F3816,
1602
  EVEX_LEN_0F3819,
1603
  EVEX_LEN_0F381A,
1604
  EVEX_LEN_0F381B,
1605
  EVEX_LEN_0F3836,
1606
  EVEX_LEN_0F384A_X86_64_W_0,
1607
  EVEX_LEN_0F385A,
1608
  EVEX_LEN_0F385B,
1609
  EVEX_LEN_0F386D_X86_64_W_0,
1610
  EVEX_LEN_0F38C6,
1611
  EVEX_LEN_0F38C7,
1612
  EVEX_LEN_0F3A00,
1613
  EVEX_LEN_0F3A01,
1614
  EVEX_LEN_0F3A07_X86_64_W_0,
1615
  EVEX_LEN_0F3A18,
1616
  EVEX_LEN_0F3A19,
1617
  EVEX_LEN_0F3A1A,
1618
  EVEX_LEN_0F3A1B,
1619
  EVEX_LEN_0F3A23,
1620
  EVEX_LEN_0F3A38,
1621
  EVEX_LEN_0F3A39,
1622
  EVEX_LEN_0F3A3A,
1623
  EVEX_LEN_0F3A3B,
1624
  EVEX_LEN_0F3A43,
1625
  EVEX_LEN_0F3A77_X86_64_W_0,
1626
1627
  EVEX_LEN_MAP5_6E,
1628
  EVEX_LEN_MAP5_7E,
1629
  EVEX_LEN_MAP6_80_W_0,
1630
  EVEX_LEN_MAP6_80_W_1,
1631
};
1632
1633
enum
1634
{
1635
  VEX_W_0F41_L_1 = 0,
1636
  VEX_W_0F42_L_1,
1637
  VEX_W_0F44_L_0,
1638
  VEX_W_0F45_L_1,
1639
  VEX_W_0F46_L_1,
1640
  VEX_W_0F47_L_1,
1641
  VEX_W_0F4A_L_1,
1642
  VEX_W_0F4B_L_1,
1643
  VEX_W_0F90_L_0,
1644
  VEX_W_0F91_L_0,
1645
  VEX_W_0F92_L_0,
1646
  VEX_W_0F93_L_0,
1647
  VEX_W_0F98_L_0,
1648
  VEX_W_0F99_L_0,
1649
  VEX_W_0F380C,
1650
  VEX_W_0F380D,
1651
  VEX_W_0F380E,
1652
  VEX_W_0F380F,
1653
  VEX_W_0F3813,
1654
  VEX_W_0F3816_L_1,
1655
  VEX_W_0F3818,
1656
  VEX_W_0F3819_L_1,
1657
  VEX_W_0F381A_L_1,
1658
  VEX_W_0F382C,
1659
  VEX_W_0F382D,
1660
  VEX_W_0F382E,
1661
  VEX_W_0F382F,
1662
  VEX_W_0F3836,
1663
  VEX_W_0F3846,
1664
  VEX_W_0F3848_X86_64_L_0,
1665
  VEX_W_0F3849_X86_64_L_0,
1666
  VEX_W_0F384A_X86_64,
1667
  VEX_W_0F384B_X86_64_L_0,
1668
  VEX_W_0F3850,
1669
  VEX_W_0F3851,
1670
  VEX_W_0F3852,
1671
  VEX_W_0F3853,
1672
  VEX_W_0F3858,
1673
  VEX_W_0F3859,
1674
  VEX_W_0F385A_L_0,
1675
  VEX_W_0F385C_X86_64_L_0,
1676
  VEX_W_0F385E_X86_64_L_0,
1677
  VEX_W_0F385F_X86_64_L_0,
1678
  VEX_W_0F386B_X86_64_L_0,
1679
  VEX_W_0F386C_X86_64_L_0,
1680
  VEX_W_0F386E_X86_64_L_0,
1681
  VEX_W_0F386F_X86_64_L_0,
1682
  VEX_W_0F3872_P_1,
1683
  VEX_W_0F3878,
1684
  VEX_W_0F3879,
1685
  VEX_W_0F38B0,
1686
  VEX_W_0F38B1,
1687
  VEX_W_0F38B4,
1688
  VEX_W_0F38B5,
1689
  VEX_W_0F38CB_P_3,
1690
  VEX_W_0F38CC_P_3,
1691
  VEX_W_0F38CD_P_3,
1692
  VEX_W_0F38CF,
1693
  VEX_W_0F38D2,
1694
  VEX_W_0F38D3,
1695
  VEX_W_0F38DA,
1696
  VEX_W_0F3A00_L_1,
1697
  VEX_W_0F3A01_L_1,
1698
  VEX_W_0F3A02,
1699
  VEX_W_0F3A04,
1700
  VEX_W_0F3A05,
1701
  VEX_W_0F3A06_L_1,
1702
  VEX_W_0F3A18_L_1,
1703
  VEX_W_0F3A19_L_1,
1704
  VEX_W_0F3A1D,
1705
  VEX_W_0F3A38_L_1,
1706
  VEX_W_0F3A39_L_1,
1707
  VEX_W_0F3A46_L_1,
1708
  VEX_W_0F3A4A,
1709
  VEX_W_0F3A4B,
1710
  VEX_W_0F3A4C,
1711
  VEX_W_0F3ACE,
1712
  VEX_W_0F3ACF,
1713
  VEX_W_0F3ADE,
1714
  VEX_W_MAP5_F8_X86_64_L_0,
1715
  VEX_W_MAP5_F9_X86_64_L_0,
1716
  VEX_W_MAP5_FD_X86_64_L_0,
1717
  VEX_W_MAP7_F6_L_0,
1718
  VEX_W_MAP7_F8_L_0,
1719
1720
  VEX_W_XOP_08_85_L_0,
1721
  VEX_W_XOP_08_86_L_0,
1722
  VEX_W_XOP_08_87_L_0,
1723
  VEX_W_XOP_08_8E_L_0,
1724
  VEX_W_XOP_08_8F_L_0,
1725
  VEX_W_XOP_08_95_L_0,
1726
  VEX_W_XOP_08_96_L_0,
1727
  VEX_W_XOP_08_97_L_0,
1728
  VEX_W_XOP_08_9E_L_0,
1729
  VEX_W_XOP_08_9F_L_0,
1730
  VEX_W_XOP_08_A6_L_0,
1731
  VEX_W_XOP_08_B6_L_0,
1732
  VEX_W_XOP_08_C0_L_0,
1733
  VEX_W_XOP_08_C1_L_0,
1734
  VEX_W_XOP_08_C2_L_0,
1735
  VEX_W_XOP_08_C3_L_0,
1736
  VEX_W_XOP_08_CC_L_0,
1737
  VEX_W_XOP_08_CD_L_0,
1738
  VEX_W_XOP_08_CE_L_0,
1739
  VEX_W_XOP_08_CF_L_0,
1740
  VEX_W_XOP_08_EC_L_0,
1741
  VEX_W_XOP_08_ED_L_0,
1742
  VEX_W_XOP_08_EE_L_0,
1743
  VEX_W_XOP_08_EF_L_0,
1744
1745
  VEX_W_XOP_09_80,
1746
  VEX_W_XOP_09_81,
1747
  VEX_W_XOP_09_82,
1748
  VEX_W_XOP_09_83,
1749
  VEX_W_XOP_09_C1_L_0,
1750
  VEX_W_XOP_09_C2_L_0,
1751
  VEX_W_XOP_09_C3_L_0,
1752
  VEX_W_XOP_09_C6_L_0,
1753
  VEX_W_XOP_09_C7_L_0,
1754
  VEX_W_XOP_09_CB_L_0,
1755
  VEX_W_XOP_09_D1_L_0,
1756
  VEX_W_XOP_09_D2_L_0,
1757
  VEX_W_XOP_09_D3_L_0,
1758
  VEX_W_XOP_09_D6_L_0,
1759
  VEX_W_XOP_09_D7_L_0,
1760
  VEX_W_XOP_09_DB_L_0,
1761
  VEX_W_XOP_09_E1_L_0,
1762
  VEX_W_XOP_09_E2_L_0,
1763
  VEX_W_XOP_09_E3_L_0,
1764
1765
  EVEX_W_0F5B_P_0,
1766
  EVEX_W_0F62,
1767
  EVEX_W_0F66,
1768
  EVEX_W_0F6A,
1769
  EVEX_W_0F6B,
1770
  EVEX_W_0F6C,
1771
  EVEX_W_0F6D,
1772
  EVEX_W_0F6F_P_1,
1773
  EVEX_W_0F6F_P_2,
1774
  EVEX_W_0F6F_P_3,
1775
  EVEX_W_0F70_P_2,
1776
  EVEX_W_0F72_R_2,
1777
  EVEX_W_0F72_R_4,
1778
  EVEX_W_0F72_R_6,
1779
  EVEX_W_0F73_R_2,
1780
  EVEX_W_0F73_R_6,
1781
  EVEX_W_0F76,
1782
  EVEX_W_0F78_P_0,
1783
  EVEX_W_0F78_P_2,
1784
  EVEX_W_0F79_P_0,
1785
  EVEX_W_0F79_P_2,
1786
  EVEX_W_0F7A_P_1,
1787
  EVEX_W_0F7A_P_2,
1788
  EVEX_W_0F7A_P_3,
1789
  EVEX_W_0F7B_P_2,
1790
  EVEX_W_0F7E_P_1,
1791
  EVEX_W_0F7F_P_1,
1792
  EVEX_W_0F7F_P_2,
1793
  EVEX_W_0F7F_P_3,
1794
  EVEX_W_0FD2,
1795
  EVEX_W_0FD3,
1796
  EVEX_W_0FD4,
1797
  EVEX_W_0FD6,
1798
  EVEX_W_0FE2,
1799
  EVEX_W_0FE6_P_1,
1800
  EVEX_W_0FE7,
1801
  EVEX_W_0FF2,
1802
  EVEX_W_0FF3,
1803
  EVEX_W_0FF4,
1804
  EVEX_W_0FFA,
1805
  EVEX_W_0FFB,
1806
  EVEX_W_0FFE,
1807
1808
  EVEX_W_0F3810_P_1,
1809
  EVEX_W_0F3810_P_2,
1810
  EVEX_W_0F3811_P_1,
1811
  EVEX_W_0F3811_P_2,
1812
  EVEX_W_0F3812_P_1,
1813
  EVEX_W_0F3812_P_2,
1814
  EVEX_W_0F3813_P_1,
1815
  EVEX_W_0F3814_P_1,
1816
  EVEX_W_0F3815_P_1,
1817
  EVEX_W_0F3819_L_n,
1818
  EVEX_W_0F381A_L_n,
1819
  EVEX_W_0F381B_L_2,
1820
  EVEX_W_0F381E,
1821
  EVEX_W_0F381F,
1822
  EVEX_W_0F3820_P_1,
1823
  EVEX_W_0F3821_P_1,
1824
  EVEX_W_0F3822_P_1,
1825
  EVEX_W_0F3823_P_1,
1826
  EVEX_W_0F3824_P_1,
1827
  EVEX_W_0F3825_P_1,
1828
  EVEX_W_0F3825_P_2,
1829
  EVEX_W_0F3828_P_2,
1830
  EVEX_W_0F3829_P_2,
1831
  EVEX_W_0F382A_P_1,
1832
  EVEX_W_0F382A_P_2,
1833
  EVEX_W_0F382B,
1834
  EVEX_W_0F3830_P_1,
1835
  EVEX_W_0F3831_P_1,
1836
  EVEX_W_0F3832_P_1,
1837
  EVEX_W_0F3833_P_1,
1838
  EVEX_W_0F3834_P_1,
1839
  EVEX_W_0F3835_P_1,
1840
  EVEX_W_0F3835_P_2,
1841
  EVEX_W_0F3837,
1842
  EVEX_W_0F383A_P_1,
1843
  EVEX_W_0F3841,
1844
  EVEX_W_0F384A_X86_64,
1845
  EVEX_W_0F3859,
1846
  EVEX_W_0F385A_L_n,
1847
  EVEX_W_0F385B_L_2,
1848
  EVEX_W_0F386D_X86_64,
1849
  EVEX_W_0F3870,
1850
  EVEX_W_0F3872_P_2,
1851
  EVEX_W_0F387A,
1852
  EVEX_W_0F387B,
1853
  EVEX_W_0F3883,
1854
1855
  EVEX_W_0F3A07_X86_64,
1856
  EVEX_W_0F3A18_L_n,
1857
  EVEX_W_0F3A19_L_n,
1858
  EVEX_W_0F3A1A_L_2,
1859
  EVEX_W_0F3A1B_L_2,
1860
  EVEX_W_0F3A21,
1861
  EVEX_W_0F3A23_L_n,
1862
  EVEX_W_0F3A38_L_n,
1863
  EVEX_W_0F3A39_L_n,
1864
  EVEX_W_0F3A3A_L_2,
1865
  EVEX_W_0F3A3B_L_2,
1866
  EVEX_W_0F3A3D,
1867
  EVEX_W_0F3A42,
1868
  EVEX_W_0F3A43_L_n,
1869
  EVEX_W_0F3A70,
1870
  EVEX_W_0F3A72,
1871
  EVEX_W_0F3A77_X86_64,
1872
1873
  EVEX_W_MAP4_8F_R_0,
1874
  EVEX_W_MAP4_F8_P1_M_1,
1875
  EVEX_W_MAP4_F8_P3_M_1,
1876
  EVEX_W_MAP4_FF_R_6,
1877
1878
  EVEX_W_MAP5_37_P_0,
1879
  EVEX_W_MAP5_38,
1880
  EVEX_W_MAP5_39,
1881
  EVEX_W_MAP5_3A,
1882
  EVEX_W_MAP5_3B,
1883
  EVEX_W_MAP5_3C,
1884
  EVEX_W_MAP5_3E,
1885
  EVEX_W_MAP5_5B_P_0,
1886
  EVEX_W_MAP5_6C_P_0,
1887
  EVEX_W_MAP5_6C_P_2,
1888
  EVEX_W_MAP5_6D_P_0,
1889
  EVEX_W_MAP5_6D_P_2,
1890
  EVEX_W_MAP5_6E_P_1,
1891
  EVEX_W_MAP5_7A_P_3,
1892
  EVEX_W_MAP5_7E_P_1,
1893
  EVEX_W_MAP6_80,
1894
  EVEX_W_MAP6_81,
1895
};
1896
1897
typedef bool (*op_rtn) (instr_info *ins, int bytemode, int sizeflag);
1898
1899
struct dis386 {
1900
  const char *name;
1901
  struct
1902
    {
1903
      op_rtn rtn;
1904
      int bytemode;
1905
    } op[MAX_OPERANDS];
1906
  unsigned int prefix_requirement;
1907
};
1908
1909
/* Upper case letters in the instruction names here are macros.
1910
   'A' => print 'b' if no (suitable) register operand or suffix_always is true
1911
   'B' => print 'b' if suffix_always is true
1912
   'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
1913
    size prefix
1914
   'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
1915
    suffix_always is true
1916
   'E' => print 'e' if 32-bit form of jcxz
1917
   'F' => print 'w' or 'l' depending on address size prefix (loop insns)
1918
   'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
1919
   'H' => print ",pt" or ",pn" branch hint
1920
   'I' unused.
1921
   'J' unused.
1922
   'K' => print 'd' or 'q' if rex prefix is present.
1923
   'L' => print 'l' or 'q' if suffix_always is true
1924
   'M' => print 'r' if intel_mnemonic is false.
1925
   'N' => print 'n' if instruction has no wait "prefix"
1926
   'O' => print 'd' or 'o' (or 'q' in Intel mode)
1927
   'P' => behave as 'T' except with register operand outside of suffix_always
1928
    mode
1929
   'Q' => print 'w', 'l' or 'q' if no (suitable) register operand or
1930
    suffix_always is true
1931
   'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
1932
   'S' => print 'w', 'l' or 'q' if suffix_always is true
1933
   'T' => print 'w', 'l'/'d', or 'q' if instruction has an operand size
1934
    prefix or if suffix_always is true.
1935
   'U' unused.
1936
   'V' => print 'v' for VEX/EVEX and nothing for legacy encodings.
1937
   'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
1938
   'X' => print 's', 'd' depending on data16 prefix (for XMM)
1939
   'Y' => no output, mark EVEX.aaa != 0 as bad.
1940
   'Z' => print 'q' in 64bit mode and 'l' otherwise, if suffix_always is true.
1941
   '!' => change condition from true to false or from false to true.
1942
   '%' => add 1 upper case letter to the macro.
1943
   '^' => print 'w', 'l', or 'q' (Intel64 ISA only) depending on operand size
1944
    prefix or suffix_always is true (lcall/ljmp).
1945
   '@' => in 64bit mode for Intel64 ISA or if instruction
1946
    has no operand sizing prefix, print 'q' if suffix_always is true or
1947
    nothing otherwise; behave as 'P' in all other cases
1948
1949
   2 upper case letter macros:
1950
   "CC" => print condition code
1951
   "XY" => print 'x' or 'y' if suffix_always is true or no register
1952
     operands and no broadcast.
1953
   "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
1954
     register operands and no broadcast.
1955
   "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
1956
   "XD" => print 'd' if !EVEX or EVEX.W=1, EVEX.W=0 is not a valid encoding
1957
   "XH" => print 'h' if EVEX.W=0, EVEX.W=1 is not a valid encoding (for FP16)
1958
   "XB" => print 'bf16' if EVEX.W=0, EVEX.W=1 is not a valid encoding
1959
     (for BF16)
1960
   "HB" => print 'hf' if EVEX.W=0 or 'bf' if EVEX.W=1
1961
   "XS" => print 's' if !EVEX or EVEX.W=0, EVEX.W=1 is not a valid encoding
1962
   "XV" => print "{vex} " pseudo prefix
1963
   "XE" => print "{evex} " pseudo prefix if no EVEX-specific functionality is
1964
     is used by an EVEX-encoded (AVX512VL) instruction.
1965
   "ME" => Similar to "XE", but only print "{evex} " when there is no
1966
     memory operand.
1967
   "NF" => print "{nf} " pseudo prefix when EVEX.NF = 1 and print "{evex} "
1968
     pseudo prefix when instructions without NF, EGPR and VVVV,
1969
   "NE" => don't print "{evex} " pseudo prefix for some special instructions
1970
     in MAP4.
1971
   "ZU" => print 'zu' if EVEX.ZU=1.
1972
   "SC" => print suffix SCC for SCC insns
1973
   "YK" keep unused, to avoid ambiguity with the combined use of Y and K.
1974
   "YX" keep unused, to avoid ambiguity with the combined use of Y and X.
1975
   "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand, cond
1976
     being false, or no operand at all in 64bit mode, or if suffix_always
1977
     is true.
1978
   "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
1979
   "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
1980
   "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
1981
   "DQ" => print 'd' or 'q' depending on the VEX.W bit
1982
   "DF" => print default flag value for SCC insns
1983
   "BW" => print 'b' or 'w' depending on the VEX.W bit
1984
   "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
1985
     an operand size prefix, or suffix_always is true.  print
1986
     'q' if rex prefix is present.
1987
1988
   Many of the above letters print nothing in Intel mode.  See "putop"
1989
   for the details.
1990
1991
   Braces '{' and '}', and vertical bars '|', indicate alternative
1992
   mnemonic strings for AT&T and Intel.  */
1993
1994
static const struct dis386 dis386[] = {
1995
  /* 00 */
1996
  { "addB",   { Ebh1, Gb }, 0 },
1997
  { "addS",   { Evh1, Gv }, 0 },
1998
  { "addB",   { Gb, EbS }, 0 },
1999
  { "addS",   { Gv, EvS }, 0 },
2000
  { "addB",   { AL, Ib }, 0 },
2001
  { "addS",   { eAX, Iv }, 0 },
2002
  { X86_64_TABLE (X86_64_06) },
2003
  { X86_64_TABLE (X86_64_07) },
2004
  /* 08 */
2005
  { "orB",    { Ebh1, Gb }, 0 },
2006
  { "orS",    { Evh1, Gv }, 0 },
2007
  { "orB",    { Gb, EbS }, 0 },
2008
  { "orS",    { Gv, EvS }, 0 },
2009
  { "orB",    { AL, Ib }, 0 },
2010
  { "orS",    { eAX, Iv }, 0 },
2011
  { X86_64_TABLE (X86_64_0E) },
2012
  { Bad_Opcode }, /* 0x0f extended opcode escape */
2013
  /* 10 */
2014
  { "adcB",   { Ebh1, Gb }, 0 },
2015
  { "adcS",   { Evh1, Gv }, 0 },
2016
  { "adcB",   { Gb, EbS }, 0 },
2017
  { "adcS",   { Gv, EvS }, 0 },
2018
  { "adcB",   { AL, Ib }, 0 },
2019
  { "adcS",   { eAX, Iv }, 0 },
2020
  { X86_64_TABLE (X86_64_16) },
2021
  { X86_64_TABLE (X86_64_17) },
2022
  /* 18 */
2023
  { "sbbB",   { Ebh1, Gb }, 0 },
2024
  { "sbbS",   { Evh1, Gv }, 0 },
2025
  { "sbbB",   { Gb, EbS }, 0 },
2026
  { "sbbS",   { Gv, EvS }, 0 },
2027
  { "sbbB",   { AL, Ib }, 0 },
2028
  { "sbbS",   { eAX, Iv }, 0 },
2029
  { X86_64_TABLE (X86_64_1E) },
2030
  { X86_64_TABLE (X86_64_1F) },
2031
  /* 20 */
2032
  { "andB",   { Ebh1, Gb }, 0 },
2033
  { "andS",   { Evh1, Gv }, 0 },
2034
  { "andB",   { Gb, EbS }, 0 },
2035
  { "andS",   { Gv, EvS }, 0 },
2036
  { "andB",   { AL, Ib }, 0 },
2037
  { "andS",   { eAX, Iv }, 0 },
2038
  { Bad_Opcode }, /* SEG ES prefix */
2039
  { X86_64_TABLE (X86_64_27) },
2040
  /* 28 */
2041
  { "subB",   { Ebh1, Gb }, 0 },
2042
  { "subS",   { Evh1, Gv }, 0 },
2043
  { "subB",   { Gb, EbS }, 0 },
2044
  { "subS",   { Gv, EvS }, 0 },
2045
  { "subB",   { AL, Ib }, 0 },
2046
  { "subS",   { eAX, Iv }, 0 },
2047
  { Bad_Opcode }, /* SEG CS prefix */
2048
  { X86_64_TABLE (X86_64_2F) },
2049
  /* 30 */
2050
  { "xorB",   { Ebh1, Gb }, 0 },
2051
  { "xorS",   { Evh1, Gv }, 0 },
2052
  { "xorB",   { Gb, EbS }, 0 },
2053
  { "xorS",   { Gv, EvS }, 0 },
2054
  { "xorB",   { AL, Ib }, 0 },
2055
  { "xorS",   { eAX, Iv }, 0 },
2056
  { Bad_Opcode }, /* SEG SS prefix */
2057
  { X86_64_TABLE (X86_64_37) },
2058
  /* 38 */
2059
  { "cmpB",   { Eb, Gb }, 0 },
2060
  { "cmpS",   { Ev, Gv }, 0 },
2061
  { "cmpB",   { Gb, EbS }, 0 },
2062
  { "cmpS",   { Gv, EvS }, 0 },
2063
  { "cmpB",   { AL, Ib }, 0 },
2064
  { "cmpS",   { eAX, Iv }, 0 },
2065
  { Bad_Opcode }, /* SEG DS prefix */
2066
  { X86_64_TABLE (X86_64_3F) },
2067
  /* 40 */
2068
  { "inc{S|}",    { RMeAX }, 0 },
2069
  { "inc{S|}",    { RMeCX }, 0 },
2070
  { "inc{S|}",    { RMeDX }, 0 },
2071
  { "inc{S|}",    { RMeBX }, 0 },
2072
  { "inc{S|}",    { RMeSP }, 0 },
2073
  { "inc{S|}",    { RMeBP }, 0 },
2074
  { "inc{S|}",    { RMeSI }, 0 },
2075
  { "inc{S|}",    { RMeDI }, 0 },
2076
  /* 48 */
2077
  { "dec{S|}",    { RMeAX }, 0 },
2078
  { "dec{S|}",    { RMeCX }, 0 },
2079
  { "dec{S|}",    { RMeDX }, 0 },
2080
  { "dec{S|}",    { RMeBX }, 0 },
2081
  { "dec{S|}",    { RMeSP }, 0 },
2082
  { "dec{S|}",    { RMeBP }, 0 },
2083
  { "dec{S|}",    { RMeSI }, 0 },
2084
  { "dec{S|}",    { RMeDI }, 0 },
2085
  /* 50 */
2086
  { "push!P",   { RMrAX }, 0 },
2087
  { "push!P",   { RMrCX }, 0 },
2088
  { "push!P",   { RMrDX }, 0 },
2089
  { "push!P",   { RMrBX }, 0 },
2090
  { "push!P",   { RMrSP }, 0 },
2091
  { "push!P",   { RMrBP }, 0 },
2092
  { "push!P",   { RMrSI }, 0 },
2093
  { "push!P",   { RMrDI }, 0 },
2094
  /* 58 */
2095
  { "pop!P",    { RMrAX }, 0 },
2096
  { "pop!P",    { RMrCX }, 0 },
2097
  { "pop!P",    { RMrDX }, 0 },
2098
  { "pop!P",    { RMrBX }, 0 },
2099
  { "pop!P",    { RMrSP }, 0 },
2100
  { "pop!P",    { RMrBP }, 0 },
2101
  { "pop!P",    { RMrSI }, 0 },
2102
  { "pop!P",    { RMrDI }, 0 },
2103
  /* 60 */
2104
  { X86_64_TABLE (X86_64_60) },
2105
  { X86_64_TABLE (X86_64_61) },
2106
  { X86_64_TABLE (X86_64_62) },
2107
  { X86_64_TABLE (X86_64_63) },
2108
  { Bad_Opcode }, /* seg fs */
2109
  { Bad_Opcode }, /* seg gs */
2110
  { Bad_Opcode }, /* op size prefix */
2111
  { Bad_Opcode }, /* adr size prefix */
2112
  /* 68 */
2113
  { "pushP",    { sIv }, 0 },
2114
  { "imulS",    { Gv, Ev, Iv }, 0 },
2115
  { "pushP",    { sIbT }, 0 },
2116
  { "imulS",    { Gv, Ev, sIb }, 0 },
2117
  { "ins{b|}",    { Ybr, indirDX }, 0 },
2118
  { X86_64_TABLE (X86_64_6D) },
2119
  { "outs{b|}",   { indirDXr, Xb }, 0 },
2120
  { X86_64_TABLE (X86_64_6F) },
2121
  /* 70 */
2122
  { "joH",    { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2123
  { "jnoH",   { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2124
  { "jbH",    { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2125
  { "jaeH",   { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2126
  { "jeH",    { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2127
  { "jneH",   { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2128
  { "jbeH",   { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2129
  { "jaH",    { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2130
  /* 78 */
2131
  { "jsH",    { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2132
  { "jnsH",   { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2133
  { "jpH",    { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2134
  { "jnpH",   { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2135
  { "jlH",    { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2136
  { "jgeH",   { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2137
  { "jleH",   { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2138
  { "jgH",    { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2139
  /* 80 */
2140
  { REG_TABLE (REG_80) },
2141
  { REG_TABLE (REG_81) },
2142
  { X86_64_TABLE (X86_64_82) },
2143
  { REG_TABLE (REG_83) },
2144
  { "testB",    { Eb, Gb }, 0 },
2145
  { "testS",    { Ev, Gv }, 0 },
2146
  { "xchgB",    { Ebh2, Gb }, 0 },
2147
  { "xchgS",    { Evh2, Gv }, 0 },
2148
  /* 88 */
2149
  { "movB",   { Ebh3, Gb }, 0 },
2150
  { "movS",   { Evh3, Gv }, 0 },
2151
  { "movB",   { Gb, EbS }, 0 },
2152
  { "movS",   { Gv, EvS }, 0 },
2153
  { "movD",   { Sv, Sw }, 0 },
2154
  { "leaS",   { Gv, M }, 0 },
2155
  { "movD",   { Sw, Sv }, 0 },
2156
  { REG_TABLE (REG_8F) },
2157
  /* 90 */
2158
  { PREFIX_TABLE (PREFIX_90) },
2159
  { "xchgS",    { RMeCX, eAX }, 0 },
2160
  { "xchgS",    { RMeDX, eAX }, 0 },
2161
  { "xchgS",    { RMeBX, eAX }, 0 },
2162
  { "xchgS",    { RMeSP, eAX }, 0 },
2163
  { "xchgS",    { RMeBP, eAX }, 0 },
2164
  { "xchgS",    { RMeSI, eAX }, 0 },
2165
  { "xchgS",    { RMeDI, eAX }, 0 },
2166
  /* 98 */
2167
  { "cW{t|}R",    { XX }, 0 },
2168
  { "cR{t|}O",    { XX }, 0 },
2169
  { X86_64_TABLE (X86_64_9A) },
2170
  { Bad_Opcode }, /* fwait */
2171
  { "pushfP",   { XX }, 0 },
2172
  { "popfP",    { XX }, 0 },
2173
  { "sahf",   { XX }, 0 },
2174
  { "lahf",   { XX }, 0 },
2175
  /* a0 */
2176
  { "mov%LB",   { AL, Ob }, PREFIX_REX2_ILLEGAL },
2177
  { "mov%LS",   { { JMPABS_Fixup, eAX_reg }, { JMPABS_Fixup, v_mode } }, PREFIX_REX2_ILLEGAL },
2178
  { "mov%LB",   { Ob, AL }, PREFIX_REX2_ILLEGAL },
2179
  { "mov%LS",   { Ov, eAX }, PREFIX_REX2_ILLEGAL },
2180
  { "movs{b|}",   { Ybr, Xb }, PREFIX_REX2_ILLEGAL },
2181
  { "movs{R|}",   { Yvr, Xv }, PREFIX_REX2_ILLEGAL },
2182
  { "cmps{b|}",   { Xb, Yb }, PREFIX_REX2_ILLEGAL },
2183
  { "cmps{R|}",   { Xv, Yv }, PREFIX_REX2_ILLEGAL },
2184
  /* a8 */
2185
  { "testB",    { AL, Ib }, PREFIX_REX2_ILLEGAL },
2186
  { "testS",    { eAX, Iv }, PREFIX_REX2_ILLEGAL },
2187
  { "stosB",    { Ybr, AL }, PREFIX_REX2_ILLEGAL },
2188
  { "stosS",    { Yvr, eAX }, PREFIX_REX2_ILLEGAL },
2189
  { "lodsB",    { ALr, Xb }, PREFIX_REX2_ILLEGAL },
2190
  { "lodsS",    { eAXr, Xv }, PREFIX_REX2_ILLEGAL },
2191
  { "scasB",    { AL, Yb }, PREFIX_REX2_ILLEGAL },
2192
  { "scasS",    { eAX, Yv }, PREFIX_REX2_ILLEGAL },
2193
  /* b0 */
2194
  { "movB",   { RMAL, Ib }, 0 },
2195
  { "movB",   { RMCL, Ib }, 0 },
2196
  { "movB",   { RMDL, Ib }, 0 },
2197
  { "movB",   { RMBL, Ib }, 0 },
2198
  { "movB",   { RMAH, Ib }, 0 },
2199
  { "movB",   { RMCH, Ib }, 0 },
2200
  { "movB",   { RMDH, Ib }, 0 },
2201
  { "movB",   { RMBH, Ib }, 0 },
2202
  /* b8 */
2203
  { "mov%LV",   { RMeAX, Iv64 }, 0 },
2204
  { "mov%LV",   { RMeCX, Iv64 }, 0 },
2205
  { "mov%LV",   { RMeDX, Iv64 }, 0 },
2206
  { "mov%LV",   { RMeBX, Iv64 }, 0 },
2207
  { "mov%LV",   { RMeSP, Iv64 }, 0 },
2208
  { "mov%LV",   { RMeBP, Iv64 }, 0 },
2209
  { "mov%LV",   { RMeSI, Iv64 }, 0 },
2210
  { "mov%LV",   { RMeDI, Iv64 }, 0 },
2211
  /* c0 */
2212
  { REG_TABLE (REG_C0) },
2213
  { REG_TABLE (REG_C1) },
2214
  { X86_64_TABLE (X86_64_C2) },
2215
  { X86_64_TABLE (X86_64_C3) },
2216
  { X86_64_TABLE (X86_64_C4) },
2217
  { X86_64_TABLE (X86_64_C5) },
2218
  { REG_TABLE (REG_C6) },
2219
  { REG_TABLE (REG_C7) },
2220
  /* c8 */
2221
  { "enterP",   { Iw, Ib }, 0 },
2222
  { "leaveP",   { XX }, 0 },
2223
  { "{l|}ret{|f}%LP", { Iw }, 0 },
2224
  { "{l|}ret{|f}%LP", { XX }, 0 },
2225
  { "int3",   { XX }, 0 },
2226
  { "int",    { Ib }, 0 },
2227
  { X86_64_TABLE (X86_64_CE) },
2228
  { "iret%LP",    { XX }, 0 },
2229
  /* d0 */
2230
  { REG_TABLE (REG_D0) },
2231
  { REG_TABLE (REG_D1) },
2232
  { REG_TABLE (REG_D2) },
2233
  { REG_TABLE (REG_D3) },
2234
  { X86_64_TABLE (X86_64_D4) },
2235
  { X86_64_TABLE (X86_64_D5) },
2236
  { X86_64_TABLE (X86_64_D6) },
2237
  { "xlat",   { DSBX }, 0 },
2238
  /* d8 */
2239
  { FLOAT },
2240
  { FLOAT },
2241
  { FLOAT },
2242
  { FLOAT },
2243
  { FLOAT },
2244
  { FLOAT },
2245
  { FLOAT },
2246
  { FLOAT },
2247
  /* e0 */
2248
  { "loopneFH",   { Jb, XX, loop_jcxz_flag }, PREFIX_REX2_ILLEGAL },
2249
  { "loopeFH",    { Jb, XX, loop_jcxz_flag }, PREFIX_REX2_ILLEGAL },
2250
  { "loopFH",   { Jb, XX, loop_jcxz_flag }, PREFIX_REX2_ILLEGAL },
2251
  { "jEcxzH",   { Jb, XX, loop_jcxz_flag }, PREFIX_REX2_ILLEGAL },
2252
  { "inB",    { AL, Ib }, PREFIX_REX2_ILLEGAL },
2253
  { "inG",    { zAX, Ib }, PREFIX_REX2_ILLEGAL },
2254
  { "outB",   { Ib, AL }, PREFIX_REX2_ILLEGAL },
2255
  { "outG",   { Ib, zAX }, PREFIX_REX2_ILLEGAL },
2256
  /* e8 */
2257
  { X86_64_TABLE (X86_64_E8) },
2258
  { X86_64_TABLE (X86_64_E9) },
2259
  { X86_64_TABLE (X86_64_EA) },
2260
  { "jmp",    { Jb, BND }, PREFIX_REX2_ILLEGAL },
2261
  { "inB",    { AL, indirDX }, PREFIX_REX2_ILLEGAL },
2262
  { "inG",    { zAX, indirDX }, PREFIX_REX2_ILLEGAL },
2263
  { "outB",   { indirDX, AL }, PREFIX_REX2_ILLEGAL },
2264
  { "outG",   { indirDX, zAX }, PREFIX_REX2_ILLEGAL },
2265
  /* f0 */
2266
  { Bad_Opcode }, /* lock prefix */
2267
  { "int1",   { XX }, 0 },
2268
  { Bad_Opcode }, /* repne */
2269
  { Bad_Opcode }, /* repz */
2270
  { "hlt",    { XX }, 0 },
2271
  { "cmc",    { XX }, 0 },
2272
  { REG_TABLE (REG_F6) },
2273
  { REG_TABLE (REG_F7) },
2274
  /* f8 */
2275
  { "clc",    { XX }, 0 },
2276
  { "stc",    { XX }, 0 },
2277
  { "cli",    { XX }, 0 },
2278
  { "sti",    { XX }, 0 },
2279
  { "cld",    { XX }, 0 },
2280
  { "std",    { XX }, 0 },
2281
  { REG_TABLE (REG_FE) },
2282
  { REG_TABLE (REG_FF) },
2283
};
2284
2285
static const struct dis386 dis386_twobyte[] = {
2286
  /* 00 */
2287
  { REG_TABLE (REG_0F00 ) },
2288
  { REG_TABLE (REG_0F01 ) },
2289
  { "larS",   { Gv, Sv }, 0 },
2290
  { "lslS",   { Gv, Sv }, 0 },
2291
  { Bad_Opcode },
2292
  { "syscall",    { XX }, 0 },
2293
  { "clts",   { XX }, 0 },
2294
  { "sysret%LQ",    { XX }, 0 },
2295
  /* 08 */
2296
  { "invd",   { XX }, 0 },
2297
  { PREFIX_TABLE (PREFIX_0F09) },
2298
  { Bad_Opcode },
2299
  { "ud2",    { XX }, 0 },
2300
  { Bad_Opcode },
2301
  { REG_TABLE (REG_0F0D) },
2302
  { "femms",    { XX }, 0 },
2303
  { "",     { MX, EM, OPSUF }, 0 }, /* See OP_3DNowSuffix.  */
2304
  /* 10 */
2305
  { PREFIX_TABLE (PREFIX_0F10) },
2306
  { PREFIX_TABLE (PREFIX_0F11) },
2307
  { PREFIX_TABLE (PREFIX_0F12) },
2308
  { "movlpX",   { Mq, XM }, PREFIX_OPCODE },
2309
  { "unpcklpX",   { XM, EXx }, PREFIX_OPCODE },
2310
  { "unpckhpX",   { XM, EXx }, PREFIX_OPCODE },
2311
  { PREFIX_TABLE (PREFIX_0F16) },
2312
  { "movhpX",   { Mq, XM }, PREFIX_OPCODE },
2313
  /* 18 */
2314
  { REG_TABLE (REG_0F18) },
2315
  { "nopQ",   { Ev }, 0 },
2316
  { PREFIX_TABLE (PREFIX_0F1A) },
2317
  { PREFIX_TABLE (PREFIX_0F1B) },
2318
  { PREFIX_TABLE (PREFIX_0F1C) },
2319
  { "nopQ",   { Ev }, 0 },
2320
  { PREFIX_TABLE (PREFIX_0F1E) },
2321
  { "nopQ",   { Ev }, 0 },
2322
  /* 20 */
2323
  { "movZ",   { Em, Cm }, 0 },
2324
  { "movZ",   { Em, Dm }, 0 },
2325
  { "movZ",   { Cm, Em }, 0 },
2326
  { "movZ",   { Dm, Em }, 0 },
2327
  { X86_64_TABLE (X86_64_0F24) },
2328
  { Bad_Opcode },
2329
  { X86_64_TABLE (X86_64_0F26) },
2330
  { Bad_Opcode },
2331
  /* 28 */
2332
  { "movapX",   { XM, EXx }, PREFIX_OPCODE },
2333
  { "movapX",   { EXxS, XM }, PREFIX_OPCODE },
2334
  { PREFIX_TABLE (PREFIX_0F2A) },
2335
  { PREFIX_TABLE (PREFIX_0F2B) },
2336
  { PREFIX_TABLE (PREFIX_0F2C) },
2337
  { PREFIX_TABLE (PREFIX_0F2D) },
2338
  { PREFIX_TABLE (PREFIX_0F2E) },
2339
  { PREFIX_TABLE (PREFIX_0F2F) },
2340
  /* 30 */
2341
  { "wrmsr",    { XX }, PREFIX_REX2_ILLEGAL },
2342
  { "rdtsc",    { XX }, PREFIX_REX2_ILLEGAL },
2343
  { "rdmsr",    { XX }, PREFIX_REX2_ILLEGAL },
2344
  { "rdpmc",    { XX }, PREFIX_REX2_ILLEGAL },
2345
  { "sysenter",   { SEP }, PREFIX_REX2_ILLEGAL },
2346
  { "sysexit%LQ", { SEP }, PREFIX_REX2_ILLEGAL },
2347
  { Bad_Opcode },
2348
  { "getsec",   { XX }, PREFIX_REX2_ILLEGAL },
2349
  /* 38 */
2350
  { THREE_BYTE_TABLE (THREE_BYTE_0F38) },
2351
  { Bad_Opcode },
2352
  { THREE_BYTE_TABLE (THREE_BYTE_0F3A) },
2353
  { Bad_Opcode },
2354
  { Bad_Opcode },
2355
  { Bad_Opcode },
2356
  { Bad_Opcode },
2357
  { Bad_Opcode },
2358
  /* 40 */
2359
  { "cmovoS",   { Gv, Ev }, 0 },
2360
  { "cmovnoS",    { Gv, Ev }, 0 },
2361
  { "cmovbS",   { Gv, Ev }, 0 },
2362
  { "cmovaeS",    { Gv, Ev }, 0 },
2363
  { "cmoveS",   { Gv, Ev }, 0 },
2364
  { "cmovneS",    { Gv, Ev }, 0 },
2365
  { "cmovbeS",    { Gv, Ev }, 0 },
2366
  { "cmovaS",   { Gv, Ev }, 0 },
2367
  /* 48 */
2368
  { "cmovsS",   { Gv, Ev }, 0 },
2369
  { "cmovnsS",    { Gv, Ev }, 0 },
2370
  { "cmovpS",   { Gv, Ev }, 0 },
2371
  { "cmovnpS",    { Gv, Ev }, 0 },
2372
  { "cmovlS",   { Gv, Ev }, 0 },
2373
  { "cmovgeS",    { Gv, Ev }, 0 },
2374
  { "cmovleS",    { Gv, Ev }, 0 },
2375
  { "cmovgS",   { Gv, Ev }, 0 },
2376
  /* 50 */
2377
  { "movmskpX",   { Gdq, Ux }, PREFIX_OPCODE },
2378
  { PREFIX_TABLE (PREFIX_0F51) },
2379
  { PREFIX_TABLE (PREFIX_0F52) },
2380
  { PREFIX_TABLE (PREFIX_0F53) },
2381
  { "andpX",    { XM, EXx }, PREFIX_OPCODE },
2382
  { "andnpX",   { XM, EXx }, PREFIX_OPCODE },
2383
  { "orpX",   { XM, EXx }, PREFIX_OPCODE },
2384
  { "xorpX",    { XM, EXx }, PREFIX_OPCODE },
2385
  /* 58 */
2386
  { PREFIX_TABLE (PREFIX_0F58) },
2387
  { PREFIX_TABLE (PREFIX_0F59) },
2388
  { PREFIX_TABLE (PREFIX_0F5A) },
2389
  { PREFIX_TABLE (PREFIX_0F5B) },
2390
  { PREFIX_TABLE (PREFIX_0F5C) },
2391
  { PREFIX_TABLE (PREFIX_0F5D) },
2392
  { PREFIX_TABLE (PREFIX_0F5E) },
2393
  { PREFIX_TABLE (PREFIX_0F5F) },
2394
  /* 60 */
2395
  { PREFIX_TABLE (PREFIX_0F60) },
2396
  { PREFIX_TABLE (PREFIX_0F61) },
2397
  { PREFIX_TABLE (PREFIX_0F62) },
2398
  { "packsswb",   { MX, EM }, PREFIX_OPCODE },
2399
  { "pcmpgtb",    { MX, EM }, PREFIX_OPCODE },
2400
  { "pcmpgtw",    { MX, EM }, PREFIX_OPCODE },
2401
  { "pcmpgtd",    { MX, EM }, PREFIX_OPCODE },
2402
  { "packuswb",   { MX, EM }, PREFIX_OPCODE },
2403
  /* 68 */
2404
  { "punpckhbw",  { MX, EM }, PREFIX_OPCODE },
2405
  { "punpckhwd",  { MX, EM }, PREFIX_OPCODE },
2406
  { "punpckhdq",  { MX, EM }, PREFIX_OPCODE },
2407
  { "packssdw",   { MX, EM }, PREFIX_OPCODE },
2408
  { "punpcklqdq", { XM, EXx }, PREFIX_DATA },
2409
  { "punpckhqdq", { XM, EXx }, PREFIX_DATA },
2410
  { "movK",   { MX, Edq }, PREFIX_OPCODE },
2411
  { PREFIX_TABLE (PREFIX_0F6F) },
2412
  /* 70 */
2413
  { PREFIX_TABLE (PREFIX_0F70) },
2414
  { REG_TABLE (REG_0F71) },
2415
  { REG_TABLE (REG_0F72) },
2416
  { REG_TABLE (REG_0F73) },
2417
  { "pcmpeqb",    { MX, EM }, PREFIX_OPCODE },
2418
  { "pcmpeqw",    { MX, EM }, PREFIX_OPCODE },
2419
  { "pcmpeqd",    { MX, EM }, PREFIX_OPCODE },
2420
  { "emms",   { XX }, PREFIX_OPCODE },
2421
  /* 78 */
2422
  { PREFIX_TABLE (PREFIX_0F78) },
2423
  { PREFIX_TABLE (PREFIX_0F79) },
2424
  { Bad_Opcode },
2425
  { Bad_Opcode },
2426
  { PREFIX_TABLE (PREFIX_0F7C) },
2427
  { PREFIX_TABLE (PREFIX_0F7D) },
2428
  { PREFIX_TABLE (PREFIX_0F7E) },
2429
  { PREFIX_TABLE (PREFIX_0F7F) },
2430
  /* 80 */
2431
  { "jo@H",   { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2432
  { "jno@H",    { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2433
  { "jb@H",   { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2434
  { "jae@H",    { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2435
  { "je@H",   { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2436
  { "jne@H",    { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2437
  { "jbe@H",    { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2438
  { "ja@H",   { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2439
  /* 88 */
2440
  { "js@H",   { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2441
  { "jns@H",    { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2442
  { "jp@H",   { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2443
  { "jnp@H",    { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2444
  { "jl@H",   { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2445
  { "jge@H",    { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2446
  { "jle@H",    { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2447
  { "jg@H",   { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2448
  /* 90 */
2449
  { "seto",   { Eb }, 0 },
2450
  { "setno",    { Eb }, 0 },
2451
  { "setb",   { Eb }, 0 },
2452
  { "setae",    { Eb }, 0 },
2453
  { "sete",   { Eb }, 0 },
2454
  { "setne",    { Eb }, 0 },
2455
  { "setbe",    { Eb }, 0 },
2456
  { "seta",   { Eb }, 0 },
2457
  /* 98 */
2458
  { "sets",   { Eb }, 0 },
2459
  { "setns",    { Eb }, 0 },
2460
  { "setp",   { Eb }, 0 },
2461
  { "setnp",    { Eb }, 0 },
2462
  { "setl",   { Eb }, 0 },
2463
  { "setge",    { Eb }, 0 },
2464
  { "setle",    { Eb }, 0 },
2465
  { "setg",   { Eb }, 0 },
2466
  /* a0 */
2467
  { "pushP",    { fs }, 0 },
2468
  { "popP",   { fs }, 0 },
2469
  { "cpuid",    { XX }, 0 },
2470
  { "btS",    { Ev, Gv }, 0 },
2471
  { "shldS",    { Ev, Gv, Ib }, 0 },
2472
  { "shldS",    { Ev, Gv, CL }, 0 },
2473
  { REG_TABLE (REG_0FA6) },
2474
  { REG_TABLE (REG_0FA7) },
2475
  /* a8 */
2476
  { "pushP",    { gs }, 0 },
2477
  { "popP",   { gs }, 0 },
2478
  { "rsm",    { XX }, 0 },
2479
  { "btsS",   { Evh1, Gv }, 0 },
2480
  { "shrdS",    { Ev, Gv, Ib }, 0 },
2481
  { "shrdS",    { Ev, Gv, CL }, 0 },
2482
  { REG_TABLE (REG_0FAE) },
2483
  { "imulS",    { Gv, Ev }, 0 },
2484
  /* b0 */
2485
  { "cmpxchgB",   { Ebh1, Gb }, 0 },
2486
  { "cmpxchgS",   { Evh1, Gv }, 0 },
2487
  { "lssS",   { Gv, Mp }, 0 },
2488
  { "btrS",   { Evh1, Gv }, 0 },
2489
  { "lfsS",   { Gv, Mp }, 0 },
2490
  { "lgsS",   { Gv, Mp }, 0 },
2491
  { "movz{bR|x}", { Gv, Eb }, 0 },
2492
  { "movz{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movzww ! */
2493
  /* b8 */
2494
  { PREFIX_TABLE (PREFIX_0FB8) },
2495
  { "ud1S",   { Gv, Ev }, 0 },
2496
  { REG_TABLE (REG_0FBA) },
2497
  { "btcS",   { Evh1, Gv }, 0 },
2498
  { PREFIX_TABLE (PREFIX_0FBC) },
2499
  { PREFIX_TABLE (PREFIX_0FBD) },
2500
  { "movs{bR|x}", { Gv, Eb }, 0 },
2501
  { "movs{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movsww ! */
2502
  /* c0 */
2503
  { "xaddB",    { Ebh1, Gb }, 0 },
2504
  { "xaddS",    { Evh1, Gv }, 0 },
2505
  { PREFIX_TABLE (PREFIX_0FC2) },
2506
  { "movntiS",    { Mdq, Gdq }, PREFIX_OPCODE },
2507
  { "pinsrw",   { MX, Edw, Ib }, PREFIX_OPCODE },
2508
  { "pextrw",   { Gd, Nq, Ib }, PREFIX_OPCODE },
2509
  { "shufpX",   { XM, EXx, Ib }, PREFIX_OPCODE },
2510
  { REG_TABLE (REG_0FC7) },
2511
  /* c8 */
2512
  { "bswap",    { RMeAX }, 0 },
2513
  { "bswap",    { RMeCX }, 0 },
2514
  { "bswap",    { RMeDX }, 0 },
2515
  { "bswap",    { RMeBX }, 0 },
2516
  { "bswap",    { RMeSP }, 0 },
2517
  { "bswap",    { RMeBP }, 0 },
2518
  { "bswap",    { RMeSI }, 0 },
2519
  { "bswap",    { RMeDI }, 0 },
2520
  /* d0 */
2521
  { PREFIX_TABLE (PREFIX_0FD0) },
2522
  { "psrlw",    { MX, EM }, PREFIX_OPCODE },
2523
  { "psrld",    { MX, EM }, PREFIX_OPCODE },
2524
  { "psrlq",    { MX, EM }, PREFIX_OPCODE },
2525
  { "paddq",    { MX, EM }, PREFIX_OPCODE },
2526
  { "pmullw",   { MX, EM }, PREFIX_OPCODE },
2527
  { PREFIX_TABLE (PREFIX_0FD6) },
2528
  { "pmovmskb",   { Gdq, Nq }, PREFIX_OPCODE },
2529
  /* d8 */
2530
  { "psubusb",    { MX, EM }, PREFIX_OPCODE },
2531
  { "psubusw",    { MX, EM }, PREFIX_OPCODE },
2532
  { "pminub",   { MX, EM }, PREFIX_OPCODE },
2533
  { "pand",   { MX, EM }, PREFIX_OPCODE },
2534
  { "paddusb",    { MX, EM }, PREFIX_OPCODE },
2535
  { "paddusw",    { MX, EM }, PREFIX_OPCODE },
2536
  { "pmaxub",   { MX, EM }, PREFIX_OPCODE },
2537
  { "pandn",    { MX, EM }, PREFIX_OPCODE },
2538
  /* e0 */
2539
  { "pavgb",    { MX, EM }, PREFIX_OPCODE },
2540
  { "psraw",    { MX, EM }, PREFIX_OPCODE },
2541
  { "psrad",    { MX, EM }, PREFIX_OPCODE },
2542
  { "pavgw",    { MX, EM }, PREFIX_OPCODE },
2543
  { "pmulhuw",    { MX, EM }, PREFIX_OPCODE },
2544
  { "pmulhw",   { MX, EM }, PREFIX_OPCODE },
2545
  { PREFIX_TABLE (PREFIX_0FE6) },
2546
  { PREFIX_TABLE (PREFIX_0FE7) },
2547
  /* e8 */
2548
  { "psubsb",   { MX, EM }, PREFIX_OPCODE },
2549
  { "psubsw",   { MX, EM }, PREFIX_OPCODE },
2550
  { "pminsw",   { MX, EM }, PREFIX_OPCODE },
2551
  { "por",    { MX, EM }, PREFIX_OPCODE },
2552
  { "paddsb",   { MX, EM }, PREFIX_OPCODE },
2553
  { "paddsw",   { MX, EM }, PREFIX_OPCODE },
2554
  { "pmaxsw",   { MX, EM }, PREFIX_OPCODE },
2555
  { "pxor",   { MX, EM }, PREFIX_OPCODE },
2556
  /* f0 */
2557
  { PREFIX_TABLE (PREFIX_0FF0) },
2558
  { "psllw",    { MX, EM }, PREFIX_OPCODE },
2559
  { "pslld",    { MX, EM }, PREFIX_OPCODE },
2560
  { "psllq",    { MX, EM }, PREFIX_OPCODE },
2561
  { "pmuludq",    { MX, EM }, PREFIX_OPCODE },
2562
  { "pmaddwd",    { MX, EM }, PREFIX_OPCODE },
2563
  { "psadbw",   { MX, EM }, PREFIX_OPCODE },
2564
  { PREFIX_TABLE (PREFIX_0FF7) },
2565
  /* f8 */
2566
  { "psubb",    { MX, EM }, PREFIX_OPCODE },
2567
  { "psubw",    { MX, EM }, PREFIX_OPCODE },
2568
  { "psubd",    { MX, EM }, PREFIX_OPCODE },
2569
  { "psubq",    { MX, EM }, PREFIX_OPCODE },
2570
  { "paddb",    { MX, EM }, PREFIX_OPCODE },
2571
  { "paddw",    { MX, EM }, PREFIX_OPCODE },
2572
  { "paddd",    { MX, EM }, PREFIX_OPCODE },
2573
  { "ud0S",   { Gv, Ev }, 0 },
2574
};
2575
2576
static const bool onebyte_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,1,1,1,1,0,0,0,0, /* 00 */
2580
  /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2581
  /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2582
  /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2583
  /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2584
  /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2585
  /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2586
  /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2587
  /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2588
  /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2589
  /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2590
  /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2591
  /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2592
  /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2593
  /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2594
  /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1  /* f0 */
2595
  /*       -------------------------------        */
2596
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2597
};
2598
2599
static const bool twobyte_has_modrm[256] = {
2600
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2601
  /*       -------------------------------        */
2602
  /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
2603
  /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
2604
  /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
2605
  /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
2606
  /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
2607
  /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2608
  /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
2609
  /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
2610
  /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2611
  /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
2612
  /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
2613
  /* b0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bf */
2614
  /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
2615
  /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
2616
  /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
2617
  /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1  /* ff */
2618
  /*       -------------------------------        */
2619
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2620
};
2621
2622
2623
struct op
2624
  {
2625
    const char *name;
2626
    unsigned int len;
2627
  };
2628
2629
/* If we are accessing mod/rm/reg without need_modrm set, then the
2630
   values are stale.  Hitting this abort likely indicates that you
2631
   need to update onebyte_has_modrm or twobyte_has_modrm.  */
2632
3.11M
#define MODRM_CHECK  if (!ins->need_modrm) abort ()
2633
2634
static const char intel_index16[][6] = {
2635
  "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2636
};
2637
2638
static const char att_names64[][8] = {
2639
  "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
2640
  "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15",
2641
  "%r16", "%r17", "%r18", "%r19", "%r20", "%r21", "%r22", "%r23",
2642
  "%r24", "%r25", "%r26", "%r27", "%r28", "%r29", "%r30", "%r31",
2643
};
2644
static const char att_names32[][8] = {
2645
  "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
2646
  "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d",
2647
  "%r16d", "%r17d", "%r18d", "%r19d", "%r20d", "%r21d", "%r22d", "%r23d",
2648
  "%r24d", "%r25d", "%r26d", "%r27d", "%r28d", "%r29d", "%r30d", "%r31d",
2649
};
2650
static const char att_names16[][8] = {
2651
  "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
2652
  "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w",
2653
  "%r16w", "%r17w", "%r18w", "%r19w", "%r20w", "%r21w", "%r22w", "%r23w",
2654
  "%r24w", "%r25w", "%r26w", "%r27w", "%r28w", "%r29w", "%r30w", "%r31w",
2655
};
2656
static const char att_names8[][8] = {
2657
  "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
2658
};
2659
static const char att_names8rex[][8] = {
2660
  "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
2661
  "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b",
2662
  "%r16b", "%r17b", "%r18b", "%r19b", "%r20b", "%r21b", "%r22b", "%r23b",
2663
  "%r24b", "%r25b", "%r26b", "%r27b", "%r28b", "%r29b", "%r30b", "%r31b",
2664
};
2665
static const char att_names_seg[][4] = {
2666
  "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
2667
};
2668
static const char att_index64[] = "%riz";
2669
static const char att_index32[] = "%eiz";
2670
static const char att_index16[][8] = {
2671
  "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
2672
};
2673
2674
static const char att_names_mm[][8] = {
2675
  "%mm0", "%mm1", "%mm2", "%mm3",
2676
  "%mm4", "%mm5", "%mm6", "%mm7"
2677
};
2678
2679
static const char att_names_bnd[][8] = {
2680
  "%bnd0", "%bnd1", "%bnd2", "%bnd3"
2681
};
2682
2683
static const char att_names_xmm[][8] = {
2684
  "%xmm0", "%xmm1", "%xmm2", "%xmm3",
2685
  "%xmm4", "%xmm5", "%xmm6", "%xmm7",
2686
  "%xmm8", "%xmm9", "%xmm10", "%xmm11",
2687
  "%xmm12", "%xmm13", "%xmm14", "%xmm15",
2688
  "%xmm16", "%xmm17", "%xmm18", "%xmm19",
2689
  "%xmm20", "%xmm21", "%xmm22", "%xmm23",
2690
  "%xmm24", "%xmm25", "%xmm26", "%xmm27",
2691
  "%xmm28", "%xmm29", "%xmm30", "%xmm31"
2692
};
2693
2694
static const char att_names_ymm[][8] = {
2695
  "%ymm0", "%ymm1", "%ymm2", "%ymm3",
2696
  "%ymm4", "%ymm5", "%ymm6", "%ymm7",
2697
  "%ymm8", "%ymm9", "%ymm10", "%ymm11",
2698
  "%ymm12", "%ymm13", "%ymm14", "%ymm15",
2699
  "%ymm16", "%ymm17", "%ymm18", "%ymm19",
2700
  "%ymm20", "%ymm21", "%ymm22", "%ymm23",
2701
  "%ymm24", "%ymm25", "%ymm26", "%ymm27",
2702
  "%ymm28", "%ymm29", "%ymm30", "%ymm31"
2703
};
2704
2705
static const char att_names_zmm[][8] = {
2706
  "%zmm0", "%zmm1", "%zmm2", "%zmm3",
2707
  "%zmm4", "%zmm5", "%zmm6", "%zmm7",
2708
  "%zmm8", "%zmm9", "%zmm10", "%zmm11",
2709
  "%zmm12", "%zmm13", "%zmm14", "%zmm15",
2710
  "%zmm16", "%zmm17", "%zmm18", "%zmm19",
2711
  "%zmm20", "%zmm21", "%zmm22", "%zmm23",
2712
  "%zmm24", "%zmm25", "%zmm26", "%zmm27",
2713
  "%zmm28", "%zmm29", "%zmm30", "%zmm31"
2714
};
2715
2716
static const char att_names_tmm[][8] = {
2717
  "%tmm0", "%tmm1", "%tmm2", "%tmm3",
2718
  "%tmm4", "%tmm5", "%tmm6", "%tmm7"
2719
};
2720
2721
static const char att_names_mask[][8] = {
2722
  "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
2723
};
2724
2725
static const char *const names_rounding[] =
2726
{
2727
  "{rn-",
2728
  "{rd-",
2729
  "{ru-",
2730
  "{rz-"
2731
};
2732
2733
static const struct dis386 reg_table[][8] = {
2734
  /* REG_80 */
2735
  {
2736
    { "addA", { Ebh1, Ib }, 0 },
2737
    { "orA",  { Ebh1, Ib }, 0 },
2738
    { "adcA", { Ebh1, Ib }, 0 },
2739
    { "sbbA", { Ebh1, Ib }, 0 },
2740
    { "andA", { Ebh1, Ib }, 0 },
2741
    { "subA", { Ebh1, Ib }, 0 },
2742
    { "xorA", { Ebh1, Ib }, 0 },
2743
    { "cmpA", { Eb, Ib }, 0 },
2744
  },
2745
  /* REG_81 */
2746
  {
2747
    { "addQ", { Evh1, Iv }, 0 },
2748
    { "orQ",  { Evh1, Iv }, 0 },
2749
    { "adcQ", { Evh1, Iv }, 0 },
2750
    { "sbbQ", { Evh1, Iv }, 0 },
2751
    { "andQ", { Evh1, Iv }, 0 },
2752
    { "subQ", { Evh1, Iv }, 0 },
2753
    { "xorQ", { Evh1, Iv }, 0 },
2754
    { "cmpQ", { Ev, Iv }, 0 },
2755
  },
2756
  /* REG_83 */
2757
  {
2758
    { "addQ", { Evh1, sIb }, 0 },
2759
    { "orQ",  { Evh1, sIb }, 0 },
2760
    { "adcQ", { Evh1, sIb }, 0 },
2761
    { "sbbQ", { Evh1, sIb }, 0 },
2762
    { "andQ", { Evh1, sIb }, 0 },
2763
    { "subQ", { Evh1, sIb }, 0 },
2764
    { "xorQ", { Evh1, sIb }, 0 },
2765
    { "cmpQ", { Ev, sIb }, 0 },
2766
  },
2767
  /* REG_8F */
2768
  {
2769
    { "pop{P|}", { stackEv }, 0 },
2770
    { XOP_8F_TABLE () },
2771
    { Bad_Opcode },
2772
    { Bad_Opcode },
2773
    { Bad_Opcode },
2774
    { XOP_8F_TABLE () },
2775
  },
2776
  /* REG_C0 */
2777
  {
2778
    { "%NFrolA",  { VexGb, Eb, Ib }, NO_PREFIX },
2779
    { "%NFrorA",  { VexGb, Eb, Ib }, NO_PREFIX },
2780
    { "rclA", { VexGb, Eb, Ib }, NO_PREFIX },
2781
    { "rcrA", { VexGb, Eb, Ib }, NO_PREFIX },
2782
    { "%NFshlA",  { VexGb, Eb, Ib }, NO_PREFIX },
2783
    { "%NFshrA",  { VexGb, Eb, Ib }, NO_PREFIX },
2784
    { "%NFshlA",  { VexGb, Eb, Ib }, NO_PREFIX },
2785
    { "%NFsarA",  { VexGb, Eb, Ib }, NO_PREFIX },
2786
  },
2787
  /* REG_C1 */
2788
  {
2789
    { "%NFrolQ",  { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
2790
    { "%NFrorQ",  { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
2791
    { "rclQ", { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
2792
    { "rcrQ", { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
2793
    { "%NFshlQ",  { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
2794
    { "%NFshrQ",  { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
2795
    { "%NFshlQ",  { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
2796
    { "%NFsarQ",  { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
2797
  },
2798
  /* REG_C6 */
2799
  {
2800
    { "movA", { Ebh3, Ib }, 0 },
2801
    { Bad_Opcode },
2802
    { Bad_Opcode },
2803
    { Bad_Opcode },
2804
    { Bad_Opcode },
2805
    { Bad_Opcode },
2806
    { Bad_Opcode },
2807
    { RM_TABLE (RM_C6_REG_7) },
2808
  },
2809
  /* REG_C7 */
2810
  {
2811
    { "movQ", { Evh3, Iv }, 0 },
2812
    { Bad_Opcode },
2813
    { Bad_Opcode },
2814
    { Bad_Opcode },
2815
    { Bad_Opcode },
2816
    { Bad_Opcode },
2817
    { Bad_Opcode },
2818
    { RM_TABLE (RM_C7_REG_7) },
2819
  },
2820
  /* REG_D0 */
2821
  {
2822
    { "%NFrolA",  { VexGb, Eb, I1 }, NO_PREFIX },
2823
    { "%NFrorA",  { VexGb, Eb, I1 }, NO_PREFIX },
2824
    { "rclA", { VexGb, Eb, I1 }, NO_PREFIX },
2825
    { "rcrA", { VexGb, Eb, I1 }, NO_PREFIX },
2826
    { "%NFshlA",  { VexGb, Eb, I1 }, NO_PREFIX },
2827
    { "%NFshrA",  { VexGb, Eb, I1 }, NO_PREFIX },
2828
    { "%NFshlA",  { VexGb, Eb, I1 }, NO_PREFIX },
2829
    { "%NFsarA",  { VexGb, Eb, I1 }, NO_PREFIX },
2830
  },
2831
  /* REG_D1 */
2832
  {
2833
    { "%NFrolQ",  { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
2834
    { "%NFrorQ",  { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
2835
    { "rclQ", { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
2836
    { "rcrQ", { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
2837
    { "%NFshlQ",  { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
2838
    { "%NFshrQ",  { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
2839
    { "%NFshlQ",  { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
2840
    { "%NFsarQ",  { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
2841
  },
2842
  /* REG_D2 */
2843
  {
2844
    { "%NFrolA",  { VexGb, Eb, CL }, NO_PREFIX },
2845
    { "%NFrorA",  { VexGb, Eb, CL }, NO_PREFIX },
2846
    { "rclA", { VexGb, Eb, CL }, NO_PREFIX },
2847
    { "rcrA", { VexGb, Eb, CL }, NO_PREFIX },
2848
    { "%NFshlA",  { VexGb, Eb, CL }, NO_PREFIX },
2849
    { "%NFshrA",  { VexGb, Eb, CL }, NO_PREFIX },
2850
    { "%NFshlA",  { VexGb, Eb, CL }, NO_PREFIX },
2851
    { "%NFsarA",  { VexGb, Eb, CL }, NO_PREFIX },
2852
  },
2853
  /* REG_D3 */
2854
  {
2855
    { "%NFrolQ",  { VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
2856
    { "%NFrorQ",  { VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
2857
    { "rclQ", { VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
2858
    { "rcrQ", { VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
2859
    { "%NFshlQ",  { VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
2860
    { "%NFshrQ",  { VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
2861
    { "%NFshlQ",  { VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
2862
    { "%NFsarQ",  { VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
2863
  },
2864
  /* REG_F6 */
2865
  {
2866
    { "testA",  { Eb, Ib }, 0 },
2867
    { "testA",  { Eb, Ib }, 0 },
2868
    { "notA", { Ebh1 }, 0 },
2869
    { "negA", { Ebh1 }, 0 },
2870
    { "mulA", { Eb }, 0 },  /* Don't print the implicit %al register,  */
2871
    { "imulA",  { Eb }, 0 },  /* to distinguish these opcodes from other */
2872
    { "divA", { Eb }, 0 },  /* mul/imul opcodes.  Do the same for div  */
2873
    { "idivA",  { Eb }, 0 },  /* and idiv for consistency.       */
2874
  },
2875
  /* REG_F7 */
2876
  {
2877
    { "testQ",  { Ev, Iv }, 0 },
2878
    { "testQ",  { Ev, Iv }, 0 },
2879
    { "notQ", { Evh1 }, 0 },
2880
    { "negQ", { Evh1 }, 0 },
2881
    { "mulQ", { Ev }, 0 },  /* Don't print the implicit register.  */
2882
    { "imulQ",  { Ev }, 0 },
2883
    { "divQ", { Ev }, 0 },
2884
    { "idivQ",  { Ev }, 0 },
2885
  },
2886
  /* REG_FE */
2887
  {
2888
    { "incA", { Ebh1 }, 0 },
2889
    { "decA", { Ebh1 }, 0 },
2890
  },
2891
  /* REG_FF */
2892
  {
2893
    { "incQ", { Evh1 }, 0 },
2894
    { "decQ", { Evh1 }, 0 },
2895
    { "call{@|}", { NOTRACK, indirEv, BND }, 0 },
2896
    { "{l|}call^", { indirEp }, 0 },
2897
    { "jmp{@|}", { NOTRACK, indirEv, BND }, 0 },
2898
    { "{l|}jmp^", { indirEp }, 0 },
2899
    { "push{P|}", { stackEv }, 0 },
2900
    { Bad_Opcode },
2901
  },
2902
  /* REG_0F00 */
2903
  {
2904
    { "sldtD",  { Sv }, 0 },
2905
    { "strD", { Sv }, 0 },
2906
    { "lldtD",  { Sv }, 0 },
2907
    { "ltrD", { Sv }, 0 },
2908
    { "verrD",  { Sv }, 0 },
2909
    { "verwD",  { Sv }, 0 },
2910
    { X86_64_TABLE (X86_64_0F00_REG_6) },
2911
    { Bad_Opcode },
2912
  },
2913
  /* REG_0F01 */
2914
  {
2915
    { MOD_TABLE (MOD_0F01_REG_0) },
2916
    { MOD_TABLE (MOD_0F01_REG_1) },
2917
    { MOD_TABLE (MOD_0F01_REG_2) },
2918
    { MOD_TABLE (MOD_0F01_REG_3) },
2919
    { "smswD",  { Sv }, 0 },
2920
    { MOD_TABLE (MOD_0F01_REG_5) },
2921
    { "lmsw", { Ew }, 0 },
2922
    { MOD_TABLE (MOD_0F01_REG_7) },
2923
  },
2924
  /* REG_0F0D */
2925
  {
2926
    { "prefetch", { Mb }, 0 },
2927
    { "prefetchw",  { Mb }, 0 },
2928
    { "prefetchwt1",  { Mb }, 0 },
2929
    { "prefetch", { Mb }, 0 },
2930
    { "prefetch", { Mb }, 0 },
2931
    { "prefetch", { Mb }, 0 },
2932
    { "prefetch", { Mb }, 0 },
2933
    { "prefetch", { Mb }, 0 },
2934
  },
2935
  /* REG_0F18 */
2936
  {
2937
    { MOD_TABLE (MOD_0F18_REG_0) },
2938
    { MOD_TABLE (MOD_0F18_REG_1) },
2939
    { MOD_TABLE (MOD_0F18_REG_2) },
2940
    { MOD_TABLE (MOD_0F18_REG_3) },
2941
    { MOD_TABLE (MOD_0F18_REG_4) },
2942
    { "nopQ",   { Ev }, 0 },
2943
    { MOD_TABLE (MOD_0F18_REG_6) },
2944
    { MOD_TABLE (MOD_0F18_REG_7) },
2945
  },
2946
  /* REG_0F1C_P_0_MOD_0 */
2947
  {
2948
    { "cldemote", { Mb }, 0 },
2949
    { "nopQ",   { Ev }, 0 },
2950
    { "nopQ",   { Ev }, 0 },
2951
    { "nopQ",   { Ev }, 0 },
2952
    { "nopQ",   { Ev }, 0 },
2953
    { "nopQ",   { Ev }, 0 },
2954
    { "nopQ",   { Ev }, 0 },
2955
    { "nopQ",   { Ev }, 0 },
2956
  },
2957
  /* REG_0F1E_P_1_MOD_3 */
2958
  {
2959
    { "nopQ",   { Ev }, PREFIX_IGNORED },
2960
    { "rdsspK",   { Edq }, 0 },
2961
    { "nopQ",   { Ev }, PREFIX_IGNORED },
2962
    { "nopQ",   { Ev }, PREFIX_IGNORED },
2963
    { "nopQ",   { Ev }, PREFIX_IGNORED },
2964
    { "nopQ",   { Ev }, PREFIX_IGNORED },
2965
    { "nopQ",   { Ev }, PREFIX_IGNORED },
2966
    { RM_TABLE (RM_0F1E_P_1_MOD_3_REG_7) },
2967
  },
2968
  /* REG_0F38D8_PREFIX_1 */
2969
  {
2970
    { "aesencwide128kl",  { M }, 0 },
2971
    { "aesdecwide128kl",  { M }, 0 },
2972
    { "aesencwide256kl",  { M }, 0 },
2973
    { "aesdecwide256kl",  { M }, 0 },
2974
  },
2975
  /* REG_0F3A0F_P_1 */
2976
  {
2977
    { RM_TABLE (RM_0F3A0F_P_1_R_0) },
2978
  },
2979
  /* REG_0F71 */
2980
  {
2981
    { Bad_Opcode },
2982
    { Bad_Opcode },
2983
    { "psrlw",    { Nq, Ib }, PREFIX_OPCODE },
2984
    { Bad_Opcode },
2985
    { "psraw",    { Nq, Ib }, PREFIX_OPCODE },
2986
    { Bad_Opcode },
2987
    { "psllw",    { Nq, Ib }, PREFIX_OPCODE },
2988
  },
2989
  /* REG_0F72 */
2990
  {
2991
    { Bad_Opcode },
2992
    { Bad_Opcode },
2993
    { "psrld",    { Nq, Ib }, PREFIX_OPCODE },
2994
    { Bad_Opcode },
2995
    { "psrad",    { Nq, Ib }, PREFIX_OPCODE },
2996
    { Bad_Opcode },
2997
    { "pslld",    { Nq, Ib }, PREFIX_OPCODE },
2998
  },
2999
  /* REG_0F73 */
3000
  {
3001
    { Bad_Opcode },
3002
    { Bad_Opcode },
3003
    { "psrlq",    { Nq, Ib }, PREFIX_OPCODE },
3004
    { "psrldq",   { Ux, Ib }, PREFIX_DATA },
3005
    { Bad_Opcode },
3006
    { Bad_Opcode },
3007
    { "psllq",    { Nq, Ib }, PREFIX_OPCODE },
3008
    { "pslldq",   { Ux, Ib }, PREFIX_DATA },
3009
  },
3010
  /* REG_0FA6 */
3011
  {
3012
    { PREFIX_TABLE (PREFIX_0FA6_REG_0) },
3013
    { "xsha1",    { { OP_0f07, 0 } }, 0 },
3014
    { "xsha256",  { { OP_0f07, 0 } }, 0 },
3015
    { "xsha384",  { { OP_0f07, 0 } }, 0 },
3016
    { "xsha512",  { { OP_0f07, 0 } }, 0 },
3017
    { PREFIX_TABLE (PREFIX_0FA6_REG_5) },
3018
    { "montmul2", { { OP_0f07, 0 } }, 0 },
3019
    { "xmodexp",  { { OP_0f07, 0 } }, 0 },
3020
  },
3021
  /* REG_0FA7 */
3022
  {
3023
    { "xstore-rng", { { OP_0f07, 0 } }, 0 },
3024
    { "xcrypt-ecb", { { OP_0f07, 0 } }, 0 },
3025
    { "xcrypt-cbc", { { OP_0f07, 0 } }, 0 },
3026
    { "xcrypt-ctr", { { OP_0f07, 0 } }, 0 },
3027
    { "xcrypt-cfb", { { OP_0f07, 0 } }, 0 },
3028
    { "xcrypt-ofb", { { OP_0f07, 0 } }, 0 },
3029
    { PREFIX_TABLE (PREFIX_0FA7_REG_6) },
3030
    { "xrng2",    { { OP_0f07, 0 } }, 0 },
3031
  },
3032
  /* REG_0FAE */
3033
  {
3034
    { MOD_TABLE (MOD_0FAE_REG_0) },
3035
    { MOD_TABLE (MOD_0FAE_REG_1) },
3036
    { MOD_TABLE (MOD_0FAE_REG_2) },
3037
    { MOD_TABLE (MOD_0FAE_REG_3) },
3038
    { MOD_TABLE (MOD_0FAE_REG_4) },
3039
    { MOD_TABLE (MOD_0FAE_REG_5) },
3040
    { MOD_TABLE (MOD_0FAE_REG_6) },
3041
    { MOD_TABLE (MOD_0FAE_REG_7) },
3042
  },
3043
  /* REG_0FBA */
3044
  {
3045
    { Bad_Opcode },
3046
    { Bad_Opcode },
3047
    { Bad_Opcode },
3048
    { Bad_Opcode },
3049
    { "btQ",  { Ev, Ib }, 0 },
3050
    { "btsQ", { Evh1, Ib }, 0 },
3051
    { "btrQ", { Evh1, Ib }, 0 },
3052
    { "btcQ", { Evh1, Ib }, 0 },
3053
  },
3054
  /* REG_0FC7 */
3055
  {
3056
    { Bad_Opcode },
3057
    { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } }, 0 },
3058
    { Bad_Opcode },
3059
    { "xrstors", { FXSAVE }, PREFIX_REX2_ILLEGAL },
3060
    { "xsavec", { FXSAVE }, PREFIX_REX2_ILLEGAL },
3061
    { "xsaves", { FXSAVE }, PREFIX_REX2_ILLEGAL },
3062
    { MOD_TABLE (MOD_0FC7_REG_6) },
3063
    { MOD_TABLE (MOD_0FC7_REG_7) },
3064
  },
3065
  /* REG_VEX_0F71 */
3066
  {
3067
    { Bad_Opcode },
3068
    { Bad_Opcode },
3069
    { "vpsrlw",   { Vex, Ux, Ib }, PREFIX_DATA },
3070
    { Bad_Opcode },
3071
    { "vpsraw",   { Vex, Ux, Ib }, PREFIX_DATA },
3072
    { Bad_Opcode },
3073
    { "vpsllw",   { Vex, Ux, Ib }, PREFIX_DATA },
3074
  },
3075
  /* REG_VEX_0F72 */
3076
  {
3077
    { Bad_Opcode },
3078
    { Bad_Opcode },
3079
    { "vpsrld",   { Vex, Ux, Ib }, PREFIX_DATA },
3080
    { Bad_Opcode },
3081
    { "vpsrad",   { Vex, Ux, Ib }, PREFIX_DATA },
3082
    { Bad_Opcode },
3083
    { "vpslld",   { Vex, Ux, Ib }, PREFIX_DATA },
3084
  },
3085
  /* REG_VEX_0F73 */
3086
  {
3087
    { Bad_Opcode },
3088
    { Bad_Opcode },
3089
    { "vpsrlq",   { Vex, Ux, Ib }, PREFIX_DATA },
3090
    { "vpsrldq",  { Vex, Ux, Ib }, PREFIX_DATA },
3091
    { Bad_Opcode },
3092
    { Bad_Opcode },
3093
    { "vpsllq",   { Vex, Ux, Ib }, PREFIX_DATA },
3094
    { "vpslldq",  { Vex, Ux, Ib }, PREFIX_DATA },
3095
  },
3096
  /* REG_VEX_0FAE */
3097
  {
3098
    { Bad_Opcode },
3099
    { Bad_Opcode },
3100
    { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2) },
3101
    { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3) },
3102
  },
3103
  /* REG_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0 */
3104
  {
3105
    { RM_TABLE (RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0_R_0) },
3106
  },
3107
  /* REG_VEX_0F38F3_L_0_P_0 */
3108
  {
3109
    { Bad_Opcode },
3110
    { "%NFblsrS",   { VexGdq, Edq }, 0 },
3111
    { "%NFblsmskS",   { VexGdq, Edq }, 0 },
3112
    { "%NFblsiS",   { VexGdq, Edq }, 0 },
3113
  },
3114
  /* REG_VEX_MAP7_F6_L_0_W_0 */
3115
  {
3116
    { X86_64_TABLE (X86_64_VEX_MAP7_F6_L_0_W_0_R_0) },
3117
  },
3118
  /* REG_VEX_MAP7_F8_L_0_W_0 */
3119
  {
3120
    { X86_64_TABLE (X86_64_VEX_MAP7_F8_L_0_W_0_R_0) },
3121
  },
3122
  /* REG_XOP_09_01_L_0 */
3123
  {
3124
    { Bad_Opcode },
3125
    { "blcfill",  { VexGdq, Edq }, 0 },
3126
    { "blsfill",  { VexGdq, Edq }, 0 },
3127
    { "blcs", { VexGdq, Edq }, 0 },
3128
    { "tzmsk",  { VexGdq, Edq }, 0 },
3129
    { "blcic",  { VexGdq, Edq }, 0 },
3130
    { "blsic",  { VexGdq, Edq }, 0 },
3131
    { "t1mskc", { VexGdq, Edq }, 0 },
3132
  },
3133
  /* REG_XOP_09_02_L_0 */
3134
  {
3135
    { Bad_Opcode },
3136
    { "blcmsk", { VexGdq, Edq }, 0 },
3137
    { Bad_Opcode },
3138
    { Bad_Opcode },
3139
    { Bad_Opcode },
3140
    { Bad_Opcode },
3141
    { "blci", { VexGdq, Edq }, 0 },
3142
  },
3143
  /* REG_XOP_09_12_L_0 */
3144
  {
3145
    { "llwpcb", { Rdq }, 0 },
3146
    { "slwpcb", { Rdq }, 0 },
3147
  },
3148
  /* REG_XOP_0A_12_L_0 */
3149
  {
3150
    { "lwpins", { VexGdq, Ed, Id }, 0 },
3151
    { "lwpval", { VexGdq, Ed, Id }, 0 },
3152
  },
3153
3154
#include "i386-dis-evex-reg.h"
3155
};
3156
3157
static const struct dis386 prefix_table[][4] = {
3158
  /* PREFIX_90 */
3159
  {
3160
    { "xchgS", { { NOP_Fixup, 0 }, { NOP_Fixup, 1 } }, 0 },
3161
    { "pause", { XX }, 0 },
3162
    { "xchgS", { { NOP_Fixup, 0 }, { NOP_Fixup, 1 } }, 0 },
3163
    { NULL, { { NULL, 0 } }, PREFIX_IGNORED }
3164
  },
3165
3166
  /* PREFIX_0F00_REG_6_X86_64 */
3167
  {
3168
    { Bad_Opcode },
3169
    { Bad_Opcode },
3170
    { Bad_Opcode },
3171
    { "lkgsD", { Sv }, 0 },
3172
  },
3173
3174
  /* PREFIX_0F01_REG_0_MOD_3_RM_6 */
3175
  {
3176
    { "wrmsrns",        { Skip_MODRM }, 0 },
3177
    { X86_64_TABLE (X86_64_0F01_REG_0_MOD_3_RM_6_P_1) },
3178
    { Bad_Opcode },
3179
    { X86_64_TABLE (X86_64_0F01_REG_0_MOD_3_RM_6_P_3) },
3180
  },
3181
3182
  /* PREFIX_0F01_REG_0_MOD_3_RM_7 */
3183
  {
3184
    { X86_64_TABLE (X86_64_0F01_REG_0_MOD_3_RM_7_P_0) },
3185
  },
3186
3187
  /* PREFIX_0F01_REG_1_RM_2 */
3188
  {
3189
    { "clac",   { Skip_MODRM }, 0 },
3190
    { X86_64_TABLE (X86_64_0F01_REG_1_RM_2_PREFIX_1) },
3191
    { Bad_Opcode },
3192
    { X86_64_TABLE (X86_64_0F01_REG_1_RM_2_PREFIX_3)},
3193
  },
3194
3195
  /* PREFIX_0F01_REG_1_RM_4 */
3196
  {
3197
    { Bad_Opcode },
3198
    { Bad_Opcode },
3199
    { "tdcall",   { Skip_MODRM }, 0 },
3200
    { Bad_Opcode },
3201
  },
3202
3203
  /* PREFIX_0F01_REG_1_RM_5 */
3204
  {
3205
    { Bad_Opcode },
3206
    { Bad_Opcode },
3207
    { X86_64_TABLE (X86_64_0F01_REG_1_RM_5_PREFIX_2) },
3208
    { Bad_Opcode },
3209
  },
3210
3211
  /* PREFIX_0F01_REG_1_RM_6 */
3212
  {
3213
    { Bad_Opcode },
3214
    { Bad_Opcode },
3215
    { X86_64_TABLE (X86_64_0F01_REG_1_RM_6_PREFIX_2) },
3216
    { Bad_Opcode },
3217
  },
3218
3219
  /* PREFIX_0F01_REG_1_RM_7 */
3220
  {
3221
    { "encls",    { Skip_MODRM }, 0 },
3222
    { Bad_Opcode },
3223
    { X86_64_TABLE (X86_64_0F01_REG_1_RM_7_PREFIX_2) },
3224
    { Bad_Opcode },
3225
  },
3226
3227
  /* PREFIX_0F01_REG_3_RM_1 */
3228
  {
3229
    { "vmmcall",  { Skip_MODRM }, 0 },
3230
    { "vmgexit",  { Skip_MODRM }, 0 },
3231
    { Bad_Opcode },
3232
    { "vmgexit",  { Skip_MODRM }, 0 },
3233
  },
3234
3235
  /* PREFIX_0F01_REG_5_MOD_0 */
3236
  {
3237
    { Bad_Opcode },
3238
    { "rstorssp", { Mq }, PREFIX_OPCODE },
3239
  },
3240
3241
  /* PREFIX_0F01_REG_5_MOD_3_RM_0 */
3242
  {
3243
    { "serialize",  { Skip_MODRM }, PREFIX_OPCODE },
3244
    { "setssbsy", { Skip_MODRM }, PREFIX_OPCODE },
3245
    { Bad_Opcode },
3246
    { "xsusldtrk",  { Skip_MODRM }, PREFIX_OPCODE },
3247
  },
3248
3249
  /* PREFIX_0F01_REG_5_MOD_3_RM_1 */
3250
  {
3251
    { Bad_Opcode },
3252
    { Bad_Opcode },
3253
    { Bad_Opcode },
3254
    { "xresldtrk",     { Skip_MODRM }, PREFIX_OPCODE },
3255
  },
3256
3257
  /* PREFIX_0F01_REG_5_MOD_3_RM_2 */
3258
  {
3259
    { Bad_Opcode },
3260
    { "saveprevssp",  { Skip_MODRM }, PREFIX_OPCODE },
3261
  },
3262
3263
  /* PREFIX_0F01_REG_5_MOD_3_RM_4 */
3264
  {
3265
    { Bad_Opcode },
3266
    { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1) },
3267
  },
3268
3269
  /* PREFIX_0F01_REG_5_MOD_3_RM_5 */
3270
  {
3271
    { Bad_Opcode },
3272
    { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1) },
3273
  },
3274
3275
  /* PREFIX_0F01_REG_5_MOD_3_RM_6 */
3276
  {
3277
    { "rdpkru", { Skip_MODRM }, 0 },
3278
    { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1) },
3279
  },
3280
3281
  /* PREFIX_0F01_REG_5_MOD_3_RM_7 */
3282
  {
3283
    { "wrpkru", { Skip_MODRM }, 0 },
3284
    { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1) },
3285
  },
3286
3287
  /* PREFIX_0F01_REG_7_MOD_3_RM_2 */
3288
  {
3289
    { "monitorx", { { OP_Monitor, 0 } }, 0  },
3290
    { "mcommit",  { Skip_MODRM }, 0 },
3291
  },
3292
3293
  /* PREFIX_0F01_REG_7_MOD_3_RM_4 */
3294
  {
3295
    { "clzero", { Skip_MODRM }, 0 },
3296
    { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_4_PREFIX_1) },
3297
    { Bad_Opcode },
3298
    { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_4_PREFIX_3) },
3299
  },
3300
3301
  /* PREFIX_0F01_REG_7_MOD_3_RM_5 */
3302
  {
3303
    { "rdpru", { Skip_MODRM }, 0 },
3304
    { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_1) },
3305
    { Bad_Opcode },
3306
    { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_3) },
3307
  },
3308
3309
  /* PREFIX_0F01_REG_7_MOD_3_RM_6 */
3310
  {
3311
    { "invlpgb",        { Skip_MODRM }, 0 },
3312
    { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1) },
3313
    { Bad_Opcode },
3314
    { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3) },
3315
  },
3316
3317
  /* PREFIX_0F01_REG_7_MOD_3_RM_7 */
3318
  {
3319
    { "tlbsync",        { Skip_MODRM }, 0 },
3320
    { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1) },
3321
    { Bad_Opcode },
3322
    { "pvalidate",      { Skip_MODRM }, 0 },
3323
  },
3324
3325
  /* PREFIX_0F09 */
3326
  {
3327
    { "wbinvd",   { XX }, 0 },
3328
    { "wbnoinvd", { XX }, 0 },
3329
  },
3330
3331
  /* PREFIX_0F10 */
3332
  {
3333
    { "%XEVmovupX", { XM, EXEvexXNoBcst }, 0 },
3334
    { "%XEVmovs%XS",  { XMScalar, VexScalarR, EXd }, 0 },
3335
    { "%XEVmovupX", { XM, EXEvexXNoBcst }, 0 },
3336
    { "%XEVmovs%XD",  { XMScalar, VexScalarR, EXq }, 0 },
3337
  },
3338
3339
  /* PREFIX_0F11 */
3340
  {
3341
    { "%XEVmovupX", { EXxS, XM }, 0 },
3342
    { "%XEVmovs%XS",  { EXdS, VexScalarR, XMScalar }, 0 },
3343
    { "%XEVmovupX", { EXxS, XM }, 0 },
3344
    { "%XEVmovs%XD",  { EXqS, VexScalarR, XMScalar }, 0 },
3345
  },
3346
3347
  /* PREFIX_0F12 */
3348
  {
3349
    { MOD_TABLE (MOD_0F12_PREFIX_0) },
3350
    { "movsldup", { XM, EXx }, 0 },
3351
    { "%XEVmovlpYX",  { XM, Vex, Mq }, 0 },
3352
    { "movddup",  { XM, EXq }, 0 },
3353
  },
3354
3355
  /* PREFIX_0F16 */
3356
  {
3357
    { MOD_TABLE (MOD_0F16_PREFIX_0) },
3358
    { "movshdup", { XM, EXx }, 0 },
3359
    { "%XEVmovhpYX",  { XM, Vex, Mq }, 0 },
3360
  },
3361
3362
  /* PREFIX_0F18_REG_6_MOD_0_X86_64 */
3363
  {
3364
    { "prefetchit1",  { { PREFETCHI_Fixup, b_mode } }, 0 },
3365
    { "nopQ",   { Ev }, 0 },
3366
    { "nopQ",   { Ev }, 0 },
3367
    { "nopQ",   { Ev }, 0 },
3368
  },
3369
3370
  /* PREFIX_0F18_REG_7_MOD_0_X86_64 */
3371
  {
3372
    { "prefetchit0",  { { PREFETCHI_Fixup, b_mode } }, 0 },
3373
    { "nopQ",   { Ev }, 0 },
3374
    { "nopQ",   { Ev }, 0 },
3375
    { "nopQ",   { Ev }, 0 },
3376
  },
3377
3378
  /* PREFIX_0F1A */
3379
  {
3380
    { MOD_TABLE (MOD_0F1A_PREFIX_0) },
3381
    { "bndcl",  { Gbnd, Ev_bnd }, 0 },
3382
    { "bndmov", { Gbnd, Ebnd }, 0 },
3383
    { "bndcu",  { Gbnd, Ev_bnd }, 0 },
3384
  },
3385
3386
  /* PREFIX_0F1B */
3387
  {
3388
    { MOD_TABLE (MOD_0F1B_PREFIX_0) },
3389
    { MOD_TABLE (MOD_0F1B_PREFIX_1) },
3390
    { "bndmov", { EbndS, Gbnd }, 0 },
3391
    { "bndcn",  { Gbnd, Ev_bnd }, 0 },
3392
  },
3393
3394
  /* PREFIX_0F1C */
3395
  {
3396
    { MOD_TABLE (MOD_0F1C_PREFIX_0) },
3397
    { "nopQ", { Ev }, PREFIX_IGNORED },
3398
    { "nopQ", { Ev }, 0 },
3399
    { "nopQ", { Ev }, PREFIX_IGNORED },
3400
  },
3401
3402
  /* PREFIX_0F1E */
3403
  {
3404
    { "nopQ", { Ev }, 0 },
3405
    { MOD_TABLE (MOD_0F1E_PREFIX_1) },
3406
    { "nopQ", { Ev }, 0 },
3407
    { NULL, { XX }, PREFIX_IGNORED },
3408
  },
3409
3410
  /* PREFIX_0F2A */
3411
  {
3412
    { "cvtpi2ps", { XM, EMCq }, PREFIX_OPCODE },
3413
    { "cvtsi2ss{%LQ|}", { XM, Edq }, PREFIX_OPCODE },
3414
    { "cvtpi2pd", { XM, EMCq }, PREFIX_OPCODE },
3415
    { "cvtsi2sd{%LQ|}", { XM, Edq }, 0 },
3416
  },
3417
3418
  /* PREFIX_0F2B */
3419
  {
3420
    { "movntps", { Mx, XM }, 0 },
3421
    { "movntss", { Md, XM }, 0 },
3422
    { "movntpd", { Mx, XM }, 0 },
3423
    { "movntsd", { Mq, XM }, 0 },
3424
  },
3425
3426
  /* PREFIX_0F2C */
3427
  {
3428
    { "cvttps2pi", { MXC, EXq }, PREFIX_OPCODE },
3429
    { "cvttss2si", { Gdq, EXd }, PREFIX_OPCODE },
3430
    { "cvttpd2pi", { MXC, EXx }, PREFIX_OPCODE },
3431
    { "cvttsd2si", { Gdq, EXq }, PREFIX_OPCODE },
3432
  },
3433
3434
  /* PREFIX_0F2D */
3435
  {
3436
    { "cvtps2pi", { MXC, EXq }, PREFIX_OPCODE },
3437
    { "cvtss2si", { Gdq, EXd }, PREFIX_OPCODE },
3438
    { "cvtpd2pi", { MXC, EXx }, PREFIX_OPCODE },
3439
    { "cvtsd2si", { Gdq, EXq }, PREFIX_OPCODE },
3440
  },
3441
3442
  /* PREFIX_0F2E */
3443
  {
3444
    { "VucomisYX",  { XMScalar, EXd, EXxEVexS }, 0 },
3445
    { Bad_Opcode },
3446
    { "VucomisYX",  { XMScalar, EXq, EXxEVexS }, 0 },
3447
  },
3448
3449
  /* PREFIX_0F2F */
3450
  {
3451
    { "VcomisYX", { XMScalar, EXd, EXxEVexS }, 0 },
3452
    { Bad_Opcode },
3453
    { "VcomisYX", { XMScalar, EXq, EXxEVexS }, 0 },
3454
  },
3455
3456
  /* PREFIX_0F51 */
3457
  {
3458
    { "%XEVsqrtpX", { XM, EXx, EXxEVexR }, 0 },
3459
    { "%XEVsqrts%XS", { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
3460
    { "%XEVsqrtpX", { XM, EXx, EXxEVexR }, 0 },
3461
    { "%XEVsqrts%XD", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3462
  },
3463
3464
  /* PREFIX_0F52 */
3465
  {
3466
    { "Vrsqrtps", { XM, EXx }, 0 },
3467
    { "Vrsqrtss", { XMScalar, VexScalar, EXd }, 0 },
3468
  },
3469
3470
  /* PREFIX_0F53 */
3471
  {
3472
    { "Vrcpps",   { XM, EXx }, 0 },
3473
    { "Vrcpss",   { XMScalar, VexScalar, EXd }, 0 },
3474
  },
3475
3476
  /* PREFIX_0F58 */
3477
  {
3478
    { "%XEVaddpX",  { XM, Vex, EXx, EXxEVexR }, 0 },
3479
    { "%XEVadds%XS",  { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
3480
    { "%XEVaddpX",  { XM, Vex, EXx, EXxEVexR }, 0 },
3481
    { "%XEVadds%XD",  { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3482
  },
3483
3484
  /* PREFIX_0F59 */
3485
  {
3486
    { "%XEVmulpX",  { XM, Vex, EXx, EXxEVexR }, 0 },
3487
    { "%XEVmuls%XS",  { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
3488
    { "%XEVmulpX",  { XM, Vex, EXx, EXxEVexR }, 0 },
3489
    { "%XEVmuls%XD",  { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3490
  },
3491
3492
  /* PREFIX_0F5A */
3493
  {
3494
    { "%XEVcvtp%XS2pd", { XM, EXEvexHalfBcstXmmq, EXxEVexS }, 0 },
3495
    { "%XEVcvts%XS2sd", { XMScalar, VexScalar, EXd, EXxEVexS }, 0 },
3496
    { "%XEVcvtp%XD2ps%XY", { XMxmmq, EXx, EXxEVexR }, 0 },
3497
    { "%XEVcvts%XD2ss", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3498
  },
3499
3500
  /* PREFIX_0F5B */
3501
  {
3502
    { "Vcvtdq2ps",  { XM, EXx }, 0 },
3503
    { "Vcvttps2dq", { XM, EXx }, 0 },
3504
    { "Vcvtps2dq",  { XM, EXx }, 0 },
3505
  },
3506
3507
  /* PREFIX_0F5C */
3508
  {
3509
    { "%XEVsubpX",  { XM, Vex, EXx, EXxEVexR }, 0 },
3510
    { "%XEVsubs%XS",  { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
3511
    { "%XEVsubpX",  { XM, Vex, EXx, EXxEVexR }, 0 },
3512
    { "%XEVsubs%XD",  { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3513
  },
3514
3515
  /* PREFIX_0F5D */
3516
  {
3517
    { "%XEVminpX",  { XM, Vex, EXx, EXxEVexS }, 0 },
3518
    { "%XEVmins%XS",  { XMScalar, VexScalar, EXd, EXxEVexS }, 0 },
3519
    { "%XEVminpX",  { XM, Vex, EXx, EXxEVexS }, 0 },
3520
    { "%XEVmins%XD",  { XMScalar, VexScalar, EXq, EXxEVexS }, 0 },
3521
  },
3522
3523
  /* PREFIX_0F5E */
3524
  {
3525
    { "%XEVdivpX",  { XM, Vex, EXx, EXxEVexR }, 0 },
3526
    { "%XEVdivs%XS",  { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
3527
    { "%XEVdivpX",  { XM, Vex, EXx, EXxEVexR }, 0 },
3528
    { "%XEVdivs%XD",  { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3529
  },
3530
3531
  /* PREFIX_0F5F */
3532
  {
3533
    { "%XEVmaxpX",  { XM, Vex, EXx, EXxEVexS }, 0 },
3534
    { "%XEVmaxs%XS",  { XMScalar, VexScalar, EXd, EXxEVexS }, 0 },
3535
    { "%XEVmaxpX",  { XM, Vex, EXx, EXxEVexS }, 0 },
3536
    { "%XEVmaxs%XD",  { XMScalar, VexScalar, EXq, EXxEVexS }, 0 },
3537
  },
3538
3539
  /* PREFIX_0F60 */
3540
  {
3541
    { "punpcklbw",{ MX, EMd }, PREFIX_OPCODE },
3542
    { Bad_Opcode },
3543
    { "punpcklbw",{ MX, EMx }, PREFIX_OPCODE },
3544
  },
3545
3546
  /* PREFIX_0F61 */
3547
  {
3548
    { "punpcklwd",{ MX, EMd }, PREFIX_OPCODE },
3549
    { Bad_Opcode },
3550
    { "punpcklwd",{ MX, EMx }, PREFIX_OPCODE },
3551
  },
3552
3553
  /* PREFIX_0F62 */
3554
  {
3555
    { "punpckldq",{ MX, EMd }, PREFIX_OPCODE },
3556
    { Bad_Opcode },
3557
    { "punpckldq",{ MX, EMx }, PREFIX_OPCODE },
3558
  },
3559
3560
  /* PREFIX_0F6F */
3561
  {
3562
    { "movq", { MX, EM }, PREFIX_OPCODE },
3563
    { "movdqu", { XM, EXx }, PREFIX_OPCODE },
3564
    { "movdqa", { XM, EXx }, PREFIX_OPCODE },
3565
  },
3566
3567
  /* PREFIX_0F70 */
3568
  {
3569
    { "pshufw", { MX, EM, Ib }, PREFIX_OPCODE },
3570
    { "pshufhw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3571
    { "pshufd", { XM, EXx, Ib }, PREFIX_OPCODE },
3572
    { "pshuflw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3573
  },
3574
3575
  /* PREFIX_0F78 */
3576
  {
3577
    {"vmread",  { Em, Gm }, 0 },
3578
    { Bad_Opcode },
3579
    {"extrq", { Uxmm, Ib, Ib }, 0 },
3580
    {"insertq", { XM, Uxmm, Ib, Ib }, 0 },
3581
  },
3582
3583
  /* PREFIX_0F79 */
3584
  {
3585
    {"vmwrite", { Gm, Em }, 0 },
3586
    { Bad_Opcode },
3587
    {"extrq", { XM, Uxmm }, 0 },
3588
    {"insertq", { XM, Uxmm }, 0 },
3589
  },
3590
3591
  /* PREFIX_0F7C */
3592
  {
3593
    { Bad_Opcode },
3594
    { Bad_Opcode },
3595
    { "Vhaddpd",  { XM, Vex, EXx }, 0 },
3596
    { "Vhaddps",  { XM, Vex, EXx }, 0 },
3597
  },
3598
3599
  /* PREFIX_0F7D */
3600
  {
3601
    { Bad_Opcode },
3602
    { Bad_Opcode },
3603
    { "Vhsubpd",  { XM, Vex, EXx }, 0 },
3604
    { "Vhsubps",  { XM, Vex, EXx }, 0 },
3605
  },
3606
3607
  /* PREFIX_0F7E */
3608
  {
3609
    { "movK", { Edq, MX }, PREFIX_OPCODE },
3610
    { "movq", { XM, EXq }, PREFIX_OPCODE },
3611
    { "movK", { Edq, XM }, PREFIX_OPCODE },
3612
  },
3613
3614
  /* PREFIX_0F7F */
3615
  {
3616
    { "movq", { EMS, MX }, PREFIX_OPCODE },
3617
    { "movdqu", { EXxS, XM }, PREFIX_OPCODE },
3618
    { "movdqa", { EXxS, XM }, PREFIX_OPCODE },
3619
  },
3620
3621
  /* PREFIX_0FA6_REG_0 */
3622
  {
3623
    { Bad_Opcode },
3624
    { "montmul",  { { MONTMUL_Fixup, 0 } }, 0},
3625
    { Bad_Opcode },
3626
    { "sm2",  { Skip_MODRM }, 0 },
3627
  },
3628
3629
  /* PREFIX_0FA6_REG_5 */
3630
  {
3631
    { Bad_Opcode },
3632
    { "sm3",  { Skip_MODRM }, 0 },
3633
  },
3634
3635
  /* PREFIX_0FA7_REG_6 */
3636
  {
3637
    { Bad_Opcode },
3638
    { "sm4",  { Skip_MODRM }, 0 },
3639
  },
3640
3641
  /* PREFIX_0FAE_REG_0_MOD_3 */
3642
  {
3643
    { Bad_Opcode },
3644
    { X86_64_TABLE (X86_64_0FAE_REG_0_MOD_3_PREFIX_1) },
3645
  },
3646
3647
  /* PREFIX_0FAE_REG_1_MOD_3 */
3648
  {
3649
    { Bad_Opcode },
3650
    { X86_64_TABLE (X86_64_0FAE_REG_1_MOD_3_PREFIX_1) },
3651
  },
3652
3653
  /* PREFIX_0FAE_REG_2_MOD_3 */
3654
  {
3655
    { Bad_Opcode },
3656
    { X86_64_TABLE (X86_64_0FAE_REG_2_MOD_3_PREFIX_1) },
3657
  },
3658
3659
  /* PREFIX_0FAE_REG_3_MOD_3 */
3660
  {
3661
    { Bad_Opcode },
3662
    { X86_64_TABLE (X86_64_0FAE_REG_3_MOD_3_PREFIX_1) },
3663
  },
3664
3665
  /* PREFIX_0FAE_REG_4_MOD_0 */
3666
  {
3667
    { "xsave",  { FXSAVE }, PREFIX_REX2_ILLEGAL },
3668
    { "ptwrite{%LQ|}", { Edq }, 0 },
3669
  },
3670
3671
  /* PREFIX_0FAE_REG_4_MOD_3 */
3672
  {
3673
    { Bad_Opcode },
3674
    { "ptwrite{%LQ|}", { Edq }, 0 },
3675
  },
3676
3677
  /* PREFIX_0FAE_REG_5_MOD_3 */
3678
  {
3679
    { "lfence",   { Skip_MODRM }, 0 },
3680
    { "incsspK",  { Edq }, PREFIX_OPCODE },
3681
  },
3682
3683
  /* PREFIX_0FAE_REG_6_MOD_0 */
3684
  {
3685
    { "xsaveopt", { FXSAVE }, PREFIX_OPCODE | PREFIX_REX2_ILLEGAL },
3686
    { "clrssbsy", { Mq }, PREFIX_OPCODE },
3687
    { "clwb", { Mb }, PREFIX_OPCODE },
3688
  },
3689
3690
  /* PREFIX_0FAE_REG_6_MOD_3 */
3691
  {
3692
    { RM_TABLE (RM_0FAE_REG_6_MOD_3_P_0) },
3693
    { "umonitor", { Eva }, PREFIX_OPCODE },
3694
    { "tpause", { Edq }, PREFIX_OPCODE },
3695
    { "umwait", { Edq }, PREFIX_OPCODE },
3696
  },
3697
3698
  /* PREFIX_0FAE_REG_7_MOD_0 */
3699
  {
3700
    { "clflush",  { Mb }, 0 },
3701
    { Bad_Opcode },
3702
    { "clflushopt", { Mb }, 0 },
3703
  },
3704
3705
  /* PREFIX_0FB8 */
3706
  {
3707
    { Bad_Opcode },
3708
    { "popcntS", { Gv, Ev }, 0 },
3709
  },
3710
3711
  /* PREFIX_0FBC */
3712
  {
3713
    { "bsfS", { Gv, Ev }, 0 },
3714
    { "tzcntS", { Gv, Ev }, 0 },
3715
    { "bsfS", { Gv, Ev }, 0 },
3716
  },
3717
3718
  /* PREFIX_0FBD */
3719
  {
3720
    { "bsrS", { Gv, Ev }, 0 },
3721
    { "lzcntS", { Gv, Ev }, 0 },
3722
    { "bsrS", { Gv, Ev }, 0 },
3723
  },
3724
3725
  /* PREFIX_0FC2 */
3726
  {
3727
    { "VcmppX", { XM, Vex, EXx, CMP }, 0 },
3728
    { "Vcmpss", { XMScalar, VexScalar, EXd, CMP }, 0 },
3729
    { "VcmppX", { XM, Vex, EXx, CMP }, 0 },
3730
    { "Vcmpsd", { XMScalar, VexScalar, EXq, CMP }, 0 },
3731
  },
3732
3733
  /* PREFIX_0FC7_REG_6_MOD_0 */
3734
  {
3735
    { "vmptrld",{ Mq }, 0 },
3736
    { "vmxon",  { Mq }, 0 },
3737
    { "vmclear",{ Mq }, 0 },
3738
  },
3739
3740
  /* PREFIX_0FC7_REG_6_MOD_3 */
3741
  {
3742
    { "rdrand", { Ev }, 0 },
3743
    { X86_64_TABLE (X86_64_0FC7_REG_6_MOD_3_PREFIX_1) },
3744
    { "rdrand", { Ev }, 0 }
3745
  },
3746
3747
  /* PREFIX_0FC7_REG_7_MOD_3 */
3748
  {
3749
    { "rdseed", { Ev }, 0 },
3750
    { "rdpid",  { Em }, 0 },
3751
    { "rdseed", { Ev }, 0 },
3752
  },
3753
3754
  /* PREFIX_0FD0 */
3755
  {
3756
    { Bad_Opcode },
3757
    { Bad_Opcode },
3758
    { "VaddsubpX",  { XM, Vex, EXx }, 0 },
3759
    { "VaddsubpX",  { XM, Vex, EXx }, 0 },
3760
  },
3761
3762
  /* PREFIX_0FD6 */
3763
  {
3764
    { Bad_Opcode },
3765
    { "movq2dq",{ XM, Nq }, 0 },
3766
    { "movq", { EXqS, XM }, 0 },
3767
    { "movdq2q",{ MX, Ux }, 0 },
3768
  },
3769
3770
  /* PREFIX_0FE6 */
3771
  {
3772
    { Bad_Opcode },
3773
    { "Vcvtdq2pd",  { XM, EXxmmq }, 0 },
3774
    { "Vcvttpd2dq%XY",  { XMM, EXx }, 0 },
3775
    { "Vcvtpd2dq%XY", { XMM, EXx }, 0 },
3776
  },
3777
3778
  /* PREFIX_0FE7 */
3779
  {
3780
    { "movntq",   { Mq, MX }, 0 },
3781
    { Bad_Opcode },
3782
    { "movntdq",  { Mx, XM }, 0 },
3783
  },
3784
3785
  /* PREFIX_0FF0 */
3786
  {
3787
    { Bad_Opcode },
3788
    { Bad_Opcode },
3789
    { Bad_Opcode },
3790
    { "Vlddqu",   { XM, M }, 0 },
3791
  },
3792
3793
  /* PREFIX_0FF7 */
3794
  {
3795
    { "maskmovq", { MX, Nq }, PREFIX_OPCODE },
3796
    { Bad_Opcode },
3797
    { "maskmovdqu", { XM, Ux }, PREFIX_OPCODE },
3798
  },
3799
3800
  /* PREFIX_0F38D8 */
3801
  {
3802
    { Bad_Opcode },
3803
    { REG_TABLE (REG_0F38D8_PREFIX_1) },
3804
  },
3805
3806
  /* PREFIX_0F38DC */
3807
  {
3808
    { Bad_Opcode },
3809
    { MOD_TABLE (MOD_0F38DC_PREFIX_1) },
3810
    { "aesenc", { XM, EXx }, 0 },
3811
  },
3812
3813
  /* PREFIX_0F38DD */
3814
  {
3815
    { Bad_Opcode },
3816
    { "aesdec128kl", { XM, M }, 0 },
3817
    { "aesenclast", { XM, EXx }, 0 },
3818
  },
3819
3820
  /* PREFIX_0F38DE */
3821
  {
3822
    { Bad_Opcode },
3823
    { "aesenc256kl", { XM, M }, 0 },
3824
    { "aesdec", { XM, EXx }, 0 },
3825
  },
3826
3827
  /* PREFIX_0F38DF */
3828
  {
3829
    { Bad_Opcode },
3830
    { "aesdec256kl", { XM, M }, 0 },
3831
    { "aesdeclast", { XM, EXx }, 0 },
3832
  },
3833
3834
  /* PREFIX_0F38F0 */
3835
  {
3836
    { "movbeS", { Gv, Mv }, PREFIX_OPCODE },
3837
    { Bad_Opcode },
3838
    { "movbeS", { Gv, Mv }, PREFIX_OPCODE },
3839
    { "crc32A", { Gdq, Eb }, PREFIX_OPCODE },
3840
  },
3841
3842
  /* PREFIX_0F38F1 */
3843
  {
3844
    { "movbeS", { Mv, Gv }, PREFIX_OPCODE },
3845
    { Bad_Opcode },
3846
    { "movbeS", { Mv, Gv }, PREFIX_OPCODE },
3847
    { "crc32Q", { Gdq, Ev }, PREFIX_OPCODE },
3848
  },
3849
3850
  /* PREFIX_0F38F6 */
3851
  {
3852
    { "wrssK",  { M, Gdq }, 0 },
3853
    { "adoxL",  { VexGdq, Gdq, Edq }, 0 },
3854
    { "adcxL",  { VexGdq, Gdq, Edq }, 0 },
3855
    { Bad_Opcode },
3856
  },
3857
3858
  /* PREFIX_0F38F8_M_0 */
3859
  {
3860
    { Bad_Opcode },
3861
    { "enqcmds", { Gva, M }, 0 },
3862
    { "movdir64b", { Gva, M }, 0 },
3863
    { "enqcmd", { Gva, M }, 0 },
3864
  },
3865
3866
  /* PREFIX_0F38F8_M_1_X86_64 */
3867
  {
3868
    { Bad_Opcode },
3869
    { "uwrmsr",   { Gq, Rq }, 0 },
3870
    { Bad_Opcode },
3871
    { "urdmsr",   { Rq, Gq }, 0 },
3872
  },
3873
3874
  /* PREFIX_0F38FA */
3875
  {
3876
    { Bad_Opcode },
3877
    { "encodekey128", { Gd, Rd }, 0 },
3878
  },
3879
3880
  /* PREFIX_0F38FB */
3881
  {
3882
    { Bad_Opcode },
3883
    { "encodekey256", { Gd, Rd }, 0 },
3884
  },
3885
3886
  /* PREFIX_0F38FC */
3887
  {
3888
    { "aadd", { Mdq, Gdq }, 0 },
3889
    { "axor", { Mdq, Gdq }, 0 },
3890
    { "aand", { Mdq, Gdq }, 0 },
3891
    { "aor",  { Mdq, Gdq }, 0 },
3892
  },
3893
3894
  /* PREFIX_0F3A0F */
3895
  {
3896
    { Bad_Opcode },
3897
    { REG_TABLE (REG_0F3A0F_P_1) },
3898
  },
3899
3900
  /* PREFIX_VEX_0F12 */
3901
  {
3902
    { VEX_LEN_TABLE (VEX_LEN_0F12_P_0) },
3903
    { "%XEvmov%XSldup", { XM, EXEvexXNoBcst }, 0 },
3904
    { VEX_LEN_TABLE (VEX_LEN_0F12_P_2) },
3905
    { "%XEvmov%XDdup",  { XM, EXymmq }, 0 },
3906
  },
3907
3908
  /* PREFIX_VEX_0F16 */
3909
  {
3910
    { VEX_LEN_TABLE (VEX_LEN_0F16_P_0) },
3911
    { "%XEvmov%XShdup", { XM, EXEvexXNoBcst }, 0 },
3912
    { VEX_LEN_TABLE (VEX_LEN_0F16_P_2) },
3913
  },
3914
3915
  /* PREFIX_VEX_0F2A */
3916
  {
3917
    { Bad_Opcode },
3918
    { "%XEvcvtsi2ssY{%LQ|}",  { XMScalar, VexScalar, EXxEVexR, Edq }, 0 },
3919
    { Bad_Opcode },
3920
    { "%XEvcvtsi2sdY{%LQ|}",  { XMScalar, VexScalar, EXxEVexR64, Edq }, 0 },
3921
  },
3922
3923
  /* PREFIX_VEX_0F2C */
3924
  {
3925
    { Bad_Opcode },
3926
    { "%XEvcvttss2si",  { Gdq, EXd, EXxEVexS }, 0 },
3927
    { Bad_Opcode },
3928
    { "%XEvcvttsd2si",  { Gdq, EXq, EXxEVexS }, 0 },
3929
  },
3930
3931
  /* PREFIX_VEX_0F2D */
3932
  {
3933
    { Bad_Opcode },
3934
    { "%XEvcvtss2si", { Gdq, EXd, EXxEVexR }, 0 },
3935
    { Bad_Opcode },
3936
    { "%XEvcvtsd2si", { Gdq, EXq, EXxEVexR }, 0 },
3937
  },
3938
3939
  /* PREFIX_VEX_0F41_L_1_W_0 */
3940
  {
3941
    { "kandw",          { MaskG, MaskVex, MaskR }, 0 },
3942
    { Bad_Opcode },
3943
    { "kandb",          { MaskG, MaskVex, MaskR }, 0 },
3944
  },
3945
3946
  /* PREFIX_VEX_0F41_L_1_W_1 */
3947
  {
3948
    { "kandq",          { MaskG, MaskVex, MaskR }, 0 },
3949
    { Bad_Opcode },
3950
    { "kandd",          { MaskG, MaskVex, MaskR }, 0 },
3951
  },
3952
3953
  /* PREFIX_VEX_0F42_L_1_W_0 */
3954
  {
3955
    { "kandnw",         { MaskG, MaskVex, MaskR }, 0 },
3956
    { Bad_Opcode },
3957
    { "kandnb",         { MaskG, MaskVex, MaskR }, 0 },
3958
  },
3959
3960
  /* PREFIX_VEX_0F42_L_1_W_1 */
3961
  {
3962
    { "kandnq",         { MaskG, MaskVex, MaskR }, 0 },
3963
    { Bad_Opcode },
3964
    { "kandnd",         { MaskG, MaskVex, MaskR }, 0 },
3965
  },
3966
3967
  /* PREFIX_VEX_0F44_L_0_W_0 */
3968
  {
3969
    { "knotw",          { MaskG, MaskR }, 0 },
3970
    { Bad_Opcode },
3971
    { "knotb",          { MaskG, MaskR }, 0 },
3972
  },
3973
3974
  /* PREFIX_VEX_0F44_L_0_W_1 */
3975
  {
3976
    { "knotq",          { MaskG, MaskR }, 0 },
3977
    { Bad_Opcode },
3978
    { "knotd",          { MaskG, MaskR }, 0 },
3979
  },
3980
3981
  /* PREFIX_VEX_0F45_L_1_W_0 */
3982
  {
3983
    { "korw",       { MaskG, MaskVex, MaskR }, 0 },
3984
    { Bad_Opcode },
3985
    { "korb",       { MaskG, MaskVex, MaskR }, 0 },
3986
  },
3987
3988
  /* PREFIX_VEX_0F45_L_1_W_1 */
3989
  {
3990
    { "korq",       { MaskG, MaskVex, MaskR }, 0 },
3991
    { Bad_Opcode },
3992
    { "kord",       { MaskG, MaskVex, MaskR }, 0 },
3993
  },
3994
3995
  /* PREFIX_VEX_0F46_L_1_W_0 */
3996
  {
3997
    { "kxnorw",     { MaskG, MaskVex, MaskR }, 0 },
3998
    { Bad_Opcode },
3999
    { "kxnorb",     { MaskG, MaskVex, MaskR }, 0 },
4000
  },
4001
4002
  /* PREFIX_VEX_0F46_L_1_W_1 */
4003
  {
4004
    { "kxnorq",     { MaskG, MaskVex, MaskR }, 0 },
4005
    { Bad_Opcode },
4006
    { "kxnord",     { MaskG, MaskVex, MaskR }, 0 },
4007
  },
4008
4009
  /* PREFIX_VEX_0F47_L_1_W_0 */
4010
  {
4011
    { "kxorw",      { MaskG, MaskVex, MaskR }, 0 },
4012
    { Bad_Opcode },
4013
    { "kxorb",      { MaskG, MaskVex, MaskR }, 0 },
4014
  },
4015
4016
  /* PREFIX_VEX_0F47_L_1_W_1 */
4017
  {
4018
    { "kxorq",      { MaskG, MaskVex, MaskR }, 0 },
4019
    { Bad_Opcode },
4020
    { "kxord",      { MaskG, MaskVex, MaskR }, 0 },
4021
  },
4022
4023
  /* PREFIX_VEX_0F4A_L_1_W_0 */
4024
  {
4025
    { "kaddw",          { MaskG, MaskVex, MaskR }, 0 },
4026
    { Bad_Opcode },
4027
    { "kaddb",          { MaskG, MaskVex, MaskR }, 0 },
4028
  },
4029
4030
  /* PREFIX_VEX_0F4A_L_1_W_1 */
4031
  {
4032
    { "kaddq",          { MaskG, MaskVex, MaskR }, 0 },
4033
    { Bad_Opcode },
4034
    { "kaddd",          { MaskG, MaskVex, MaskR }, 0 },
4035
  },
4036
4037
  /* PREFIX_VEX_0F4B_L_1_W_0 */
4038
  {
4039
    { "kunpckwd",   { MaskG, MaskVex, MaskR }, 0 },
4040
    { Bad_Opcode },
4041
    { "kunpckbw",   { MaskG, MaskVex, MaskR }, 0 },
4042
  },
4043
4044
  /* PREFIX_VEX_0F4B_L_1_W_1 */
4045
  {
4046
    { "kunpckdq",   { MaskG, MaskVex, MaskR }, 0 },
4047
  },
4048
4049
  /* PREFIX_VEX_0F6F */
4050
  {
4051
    { Bad_Opcode },
4052
    { "vmovdqu",  { XM, EXx }, 0 },
4053
    { "vmovdqa",  { XM, EXx }, 0 },
4054
  },
4055
4056
  /* PREFIX_VEX_0F70 */
4057
  {
4058
    { Bad_Opcode },
4059
    { "vpshufhw", { XM, EXx, Ib }, 0 },
4060
    { "vpshufd",  { XM, EXx, Ib }, 0 },
4061
    { "vpshuflw", { XM, EXx, Ib }, 0 },
4062
  },
4063
4064
  /* PREFIX_VEX_0F7E */
4065
  {
4066
    { Bad_Opcode },
4067
    { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1) },
4068
    { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2) },
4069
  },
4070
4071
  /* PREFIX_VEX_0F7F */
4072
  {
4073
    { Bad_Opcode },
4074
    { "vmovdqu",  { EXxS, XM }, 0 },
4075
    { "vmovdqa",  { EXxS, XM }, 0 },
4076
  },
4077
4078
  /* PREFIX_VEX_0F90_L_0_W_0 */
4079
  {
4080
    { "%XEkmovw",   { MaskG, MaskE }, 0 },
4081
    { Bad_Opcode },
4082
    { "%XEkmovb",   { MaskG, MaskBDE }, 0 },
4083
  },
4084
4085
  /* PREFIX_VEX_0F90_L_0_W_1 */
4086
  {
4087
    { "%XEkmovq",   { MaskG, MaskE }, 0 },
4088
    { Bad_Opcode },
4089
    { "%XEkmovd",   { MaskG, MaskBDE }, 0 },
4090
  },
4091
4092
  /* PREFIX_VEX_0F91_L_0_W_0 */
4093
  {
4094
    { "%XEkmovw",   { Mw, MaskG }, 0 },
4095
    { Bad_Opcode },
4096
    { "%XEkmovb",   { Mb, MaskG }, 0 },
4097
  },
4098
4099
  /* PREFIX_VEX_0F91_L_0_W_1 */
4100
  {
4101
    { "%XEkmovq",   { Mq, MaskG }, 0 },
4102
    { Bad_Opcode },
4103
    { "%XEkmovd",   { Md, MaskG }, 0 },
4104
  },
4105
4106
  /* PREFIX_VEX_0F92_L_0_W_0 */
4107
  {
4108
    { "%XEkmovw",   { MaskG, Rdq }, 0 },
4109
    { Bad_Opcode },
4110
    { "%XEkmovb",   { MaskG, Rdq }, 0 },
4111
    { "%XEkmovd",   { MaskG, Rdq }, 0 },
4112
  },
4113
4114
  /* PREFIX_VEX_0F92_L_0_W_1 */
4115
  {
4116
    { Bad_Opcode },
4117
    { Bad_Opcode },
4118
    { Bad_Opcode },
4119
    { "%XEkmovK",   { MaskG, Rdq }, 0 },
4120
  },
4121
4122
  /* PREFIX_VEX_0F93_L_0_W_0 */
4123
  {
4124
    { "%XEkmovw",   { Gdq, MaskR }, 0 },
4125
    { Bad_Opcode },
4126
    { "%XEkmovb",   { Gdq, MaskR }, 0 },
4127
    { "%XEkmovd",   { Gdq, MaskR }, 0 },
4128
  },
4129
4130
  /* PREFIX_VEX_0F93_L_0_W_1 */
4131
  {
4132
    { Bad_Opcode },
4133
    { Bad_Opcode },
4134
    { Bad_Opcode },
4135
    { "%XEkmovK",   { Gdq, MaskR }, 0 },
4136
  },
4137
4138
  /* PREFIX_VEX_0F98_L_0_W_0 */
4139
  {
4140
    { "kortestw", { MaskG, MaskR }, 0 },
4141
    { Bad_Opcode },
4142
    { "kortestb", { MaskG, MaskR }, 0 },
4143
  },
4144
4145
  /* PREFIX_VEX_0F98_L_0_W_1 */
4146
  {
4147
    { "kortestq", { MaskG, MaskR }, 0 },
4148
    { Bad_Opcode },
4149
    { "kortestd", { MaskG, MaskR }, 0 },
4150
  },
4151
4152
  /* PREFIX_VEX_0F99_L_0_W_0 */
4153
  {
4154
    { "ktestw", { MaskG, MaskR }, 0 },
4155
    { Bad_Opcode },
4156
    { "ktestb", { MaskG, MaskR }, 0 },
4157
  },
4158
4159
  /* PREFIX_VEX_0F99_L_0_W_1 */
4160
  {
4161
    { "ktestq", { MaskG, MaskR }, 0 },
4162
    { Bad_Opcode },
4163
    { "ktestd", { MaskG, MaskR }, 0 },
4164
  },
4165
4166
  /* PREFIX_VEX_0F3848_X86_64_L_0_W_0 */
4167
  {
4168
    { "ttmmultf32ps", { TMM, Rtmm, VexTmm }, 0 },
4169
    { Bad_Opcode },
4170
    { "tmmultf32ps",  { TMM, Rtmm, VexTmm }, 0 },
4171
  },
4172
4173
  /* PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_0 */
4174
  {
4175
    { "ldtilecfg", { M }, 0 },
4176
    { Bad_Opcode },
4177
    { "sttilecfg", { M }, 0 },
4178
  },
4179
4180
  /* PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_1 */
4181
  {
4182
    { REG_TABLE (REG_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0) },
4183
    { Bad_Opcode },
4184
    { Bad_Opcode },
4185
    { RM_TABLE (RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_3) },
4186
  },
4187
4188
  /* PREFIX_VEX_0F384A_X86_64_W_0_L_0 */
4189
  {
4190
    { Bad_Opcode },
4191
    { Bad_Opcode },
4192
    { "tileloaddrst1",  { TMM, MVexSIBMEM }, 0 },
4193
    { "tileloaddrs",  { TMM, MVexSIBMEM }, 0 },
4194
  },
4195
4196
  /* PREFIX_VEX_0F384B_X86_64_L_0_W_0 */
4197
  {
4198
    { Bad_Opcode },
4199
    { "tilestored", { MVexSIBMEM, TMM }, 0 },
4200
    { "tileloaddt1",  { TMM, MVexSIBMEM }, 0 },
4201
    { "tileloadd",  { TMM, MVexSIBMEM }, 0 },
4202
  },
4203
4204
  /* PREFIX_VEX_0F3850_W_0 */
4205
  {
4206
    { "%XEvpdpbuud",  { XM, Vex, EXx }, 0 },
4207
    { "%XEvpdpbsud",  { XM, Vex, EXx }, 0 },
4208
    { "%XVvpdpbusd",  { XM, Vex, EXx }, 0 },
4209
    { "%XEvpdpbssd",  { XM, Vex, EXx }, 0 },
4210
  },
4211
4212
  /* PREFIX_VEX_0F3851_W_0 */
4213
  {
4214
    { "%XEvpdpbuuds", { XM, Vex, EXx }, 0 },
4215
    { "%XEvpdpbsuds", { XM, Vex, EXx }, 0 },
4216
    { "%XVvpdpbusds", { XM, Vex, EXx }, 0 },
4217
    { "%XEvpdpbssds", { XM, Vex, EXx }, 0 },
4218
  },
4219
  /* PREFIX_VEX_0F385C_X86_64_L_0_W_0 */
4220
  {
4221
    { Bad_Opcode },
4222
    { "tdpbf16ps", { TMM, Rtmm, VexTmm }, 0 },
4223
    { Bad_Opcode },
4224
    { "tdpfp16ps", { TMM, Rtmm, VexTmm }, 0 },
4225
  },
4226
4227
  /* PREFIX_VEX_0F385E_X86_64_L_0_W_0 */
4228
  {
4229
    { "tdpbuud", {TMM, Rtmm, VexTmm }, 0 },
4230
    { "tdpbsud", {TMM, Rtmm, VexTmm }, 0 },
4231
    { "tdpbusd", {TMM, Rtmm, VexTmm }, 0 },
4232
    { "tdpbssd", {TMM, Rtmm, VexTmm }, 0 },
4233
  },
4234
4235
  /* PREFIX_VEX_0F385F_X86_64_L_0_W_0 */
4236
  {
4237
    { Bad_Opcode },
4238
    { "ttransposed",  { TMM, Rtmm }, 0 },
4239
  },
4240
4241
  /* PREFIX_VEX_0F386B_X86_64_L_0_W_0 */
4242
  {
4243
    { "tconjtcmmimfp16ps",  { TMM, Rtmm, VexTmm }, 0 },
4244
    { "ttcmmrlfp16ps",  { TMM, Rtmm, VexTmm }, 0 },
4245
    { "tconjtfp16", { TMM, Rtmm }, 0 },
4246
    { "ttcmmimfp16ps",  { TMM, Rtmm, VexTmm }, 0 },
4247
  },
4248
4249
  /* PREFIX_VEX_0F386C_X86_64_L_0_W_0 */
4250
  {
4251
    { "tcmmrlfp16ps", { TMM, Rtmm, VexTmm }, 0 },
4252
    { "ttdpbf16ps", { TMM, Rtmm, VexTmm }, 0 },
4253
    { "tcmmimfp16ps", { TMM, Rtmm, VexTmm }, 0 },
4254
    { "ttdpfp16ps", { TMM, Rtmm, VexTmm }, 0 },
4255
  },
4256
4257
  /* PREFIX_VEX_0F386E_X86_64_L_0_W_0 */
4258
  {
4259
    { "t2rpntlvwz0",  { TMM, MVexSIBMEM }, 0 },
4260
    { Bad_Opcode },
4261
    { "t2rpntlvwz1",  { TMM, MVexSIBMEM }, 0 },
4262
  },
4263
4264
  /* PREFIX_VEX_0F386F_X86_64_L_0_W_0 */
4265
  {
4266
    { "t2rpntlvwz0t1",  { TMM, MVexSIBMEM }, 0 },
4267
    { Bad_Opcode },
4268
    { "t2rpntlvwz1t1",  { TMM, MVexSIBMEM }, 0 },
4269
  },
4270
4271
  /* PREFIX_VEX_0F3872 */
4272
  {
4273
    { Bad_Opcode },
4274
    { VEX_W_TABLE (VEX_W_0F3872_P_1) },
4275
  },
4276
4277
  /* PREFIX_VEX_0F38B0_W_0 */
4278
  {
4279
    { "vcvtneoph2ps", { XM, Mx }, 0 },
4280
    { "vcvtneebf162ps", { XM, Mx }, 0 },
4281
    { "vcvtneeph2ps", { XM, Mx }, 0 },
4282
    { "vcvtneobf162ps", { XM, Mx }, 0 },
4283
  },
4284
4285
  /* PREFIX_VEX_0F38B1_W_0 */
4286
  {
4287
    { Bad_Opcode },
4288
    { "vbcstnebf162ps", { XM, Mw }, 0 },
4289
    { "vbcstnesh2ps", { XM, Mw }, 0 },
4290
  },
4291
4292
  /* PREFIX_VEX_0F38D2_W_0 */
4293
  {
4294
    { "%XEvpdpwuud",  { XM, Vex, EXx }, 0 },
4295
    { "%XEvpdpwsud",  { XM, Vex, EXx }, 0 },
4296
    { "%XEvpdpwusd",  { XM, Vex, EXx }, 0 },
4297
  },
4298
4299
  /* PREFIX_VEX_0F38D3_W_0 */
4300
  {
4301
    { "%XEvpdpwuuds", { XM, Vex, EXx }, 0 },
4302
    { "%XEvpdpwsuds", { XM, Vex, EXx }, 0 },
4303
    { "%XEvpdpwusds", { XM, Vex, EXx }, 0 },
4304
  },
4305
4306
  /* PREFIX_VEX_0F38CB */
4307
  {
4308
    { Bad_Opcode },
4309
    { Bad_Opcode },
4310
    { Bad_Opcode },
4311
    { VEX_W_TABLE (VEX_W_0F38CB_P_3) },
4312
  },
4313
4314
  /* PREFIX_VEX_0F38CC */
4315
  {
4316
    { Bad_Opcode },
4317
    { Bad_Opcode },
4318
    { Bad_Opcode },
4319
    { VEX_W_TABLE (VEX_W_0F38CC_P_3) },
4320
  },
4321
4322
  /* PREFIX_VEX_0F38CD */
4323
  {
4324
    { Bad_Opcode },
4325
    { Bad_Opcode },
4326
    { Bad_Opcode },
4327
    { VEX_W_TABLE (VEX_W_0F38CD_P_3) },
4328
  },
4329
4330
  /* PREFIX_VEX_0F38DA_W_0 */
4331
  {
4332
    { VEX_LEN_TABLE (VEX_LEN_0F38DA_W_0_P_0) },
4333
    { "%XEvsm4key4",  { XM, Vex, EXx }, 0 },
4334
    { VEX_LEN_TABLE (VEX_LEN_0F38DA_W_0_P_2) },
4335
    { "%XEvsm4rnds4", { XM, Vex, EXx }, 0 },
4336
  },
4337
4338
  /* PREFIX_VEX_0F38F2_L_0 */
4339
  {
4340
    { "%NFandnS",          { Gdq, VexGdq, Edq }, 0 },
4341
  },
4342
4343
  /* PREFIX_VEX_0F38F3_L_0 */
4344
  {
4345
    { REG_TABLE (REG_VEX_0F38F3_L_0_P_0) },
4346
  },
4347
4348
  /* PREFIX_VEX_0F38F5_L_0 */
4349
  {
4350
    { "%NFbzhiS", { Gdq, Edq, VexGdq }, 0 },
4351
    { "%XEpextS",   { Gdq, VexGdq, Edq }, 0 },
4352
    { Bad_Opcode },
4353
    { "%XEpdepS",   { Gdq, VexGdq, Edq }, 0 },
4354
  },
4355
4356
  /* PREFIX_VEX_0F38F6_L_0 */
4357
  {
4358
    { Bad_Opcode },
4359
    { Bad_Opcode },
4360
    { Bad_Opcode },
4361
    { "%XEmulxS",   { Gdq, VexGdq, Edq }, 0 },
4362
  },
4363
4364
  /* PREFIX_VEX_0F38F7_L_0 */
4365
  {
4366
    { "%NFbextrS",  { Gdq, Edq, VexGdq }, 0 },
4367
    { "%XEsarxS",   { Gdq, Edq, VexGdq }, 0 },
4368
    { "%XEshlxS",   { Gdq, Edq, VexGdq }, 0 },
4369
    { "%XEshrxS",   { Gdq, Edq, VexGdq }, 0 },
4370
  },
4371
4372
  /* PREFIX_VEX_0F3AF0_L_0 */
4373
  {
4374
    { Bad_Opcode },
4375
    { Bad_Opcode },
4376
    { Bad_Opcode },
4377
    { "%XErorxS",   { Gdq, Edq, Ib }, 0 },
4378
  },
4379
4380
  /* PREFIX_VEX_MAP5_F8_X86_64_L_0_W_0 */
4381
  {
4382
    { "t2rpntlvwz0rs",  { TMM, MVexSIBMEM }, 0 },
4383
    { Bad_Opcode },
4384
    { "t2rpntlvwz1rs",  { TMM, MVexSIBMEM }, 0 },
4385
  },
4386
4387
  /* PREFIX_VEX_MAP5_F9_X86_64_L_0_W_0 */
4388
  {
4389
    { "t2rpntlvwz0rst1",  { TMM, MVexSIBMEM }, 0 },
4390
    { Bad_Opcode },
4391
    { "t2rpntlvwz1rst1",  { TMM, MVexSIBMEM }, 0 },
4392
  },
4393
4394
  /* PREFIX_VEX_MAP5_FD_X86_64_L_0_W_0 */
4395
  {
4396
    { "tdpbf8ps", { TMM, Rtmm, VexTmm }, 0 },
4397
    { "tdphbf8ps",  { TMM, Rtmm, VexTmm }, 0 },
4398
    { "tdphf8ps", { TMM, Rtmm, VexTmm }, 0 },
4399
    { "tdpbhf8ps",  { TMM, Rtmm, VexTmm }, 0 },
4400
  },
4401
4402
  /* PREFIX_VEX_MAP7_F6_L_0_W_0_R_0_X86_64 */
4403
  {
4404
    { Bad_Opcode },
4405
    { "wrmsrns",  { Skip_MODRM, Id, Rq }, 0 },
4406
    { Bad_Opcode },
4407
    { "rdmsr",    { Rq, Id }, 0 },
4408
  },
4409
4410
  /* PREFIX_VEX_MAP7_F8_L_0_W_0_R_0_X86_64 */
4411
  {
4412
    { Bad_Opcode },
4413
    { "uwrmsr", { Skip_MODRM, Id, Rq }, 0 },
4414
    { Bad_Opcode },
4415
    { "urdmsr", { Rq, Id }, 0 },
4416
  },
4417
4418
#include "i386-dis-evex-prefix.h"
4419
};
4420
4421
static const struct dis386 x86_64_table[][2] = {
4422
  /* X86_64_06 */
4423
  {
4424
    { "pushP", { es }, 0 },
4425
  },
4426
4427
  /* X86_64_07 */
4428
  {
4429
    { "popP", { es }, 0 },
4430
  },
4431
4432
  /* X86_64_0E */
4433
  {
4434
    { "pushP", { cs }, 0 },
4435
  },
4436
4437
  /* X86_64_16 */
4438
  {
4439
    { "pushP", { ss }, 0 },
4440
  },
4441
4442
  /* X86_64_17 */
4443
  {
4444
    { "popP", { ss }, 0 },
4445
  },
4446
4447
  /* X86_64_1E */
4448
  {
4449
    { "pushP", { ds }, 0 },
4450
  },
4451
4452
  /* X86_64_1F */
4453
  {
4454
    { "popP", { ds }, 0 },
4455
  },
4456
4457
  /* X86_64_27 */
4458
  {
4459
    { "daa", { XX }, 0 },
4460
  },
4461
4462
  /* X86_64_2F */
4463
  {
4464
    { "das", { XX }, 0 },
4465
  },
4466
4467
  /* X86_64_37 */
4468
  {
4469
    { "aaa", { XX }, 0 },
4470
  },
4471
4472
  /* X86_64_3F */
4473
  {
4474
    { "aas", { XX }, 0 },
4475
  },
4476
4477
  /* X86_64_60 */
4478
  {
4479
    { "pushaP", { XX }, 0 },
4480
  },
4481
4482
  /* X86_64_61 */
4483
  {
4484
    { "popaP", { XX }, 0 },
4485
  },
4486
4487
  /* X86_64_62 */
4488
  {
4489
    { MOD_TABLE (MOD_62_32BIT) },
4490
    { EVEX_TABLE () },
4491
  },
4492
4493
  /* X86_64_63 */
4494
  {
4495
    { "arplS", { Sv, Gv }, 0 },
4496
    { "movs", { Gv, { MOVSXD_Fixup, movsxd_mode } }, 0 },
4497
  },
4498
4499
  /* X86_64_6D */
4500
  {
4501
    { "ins{R|}", { Yzr, indirDX }, 0 },
4502
    { "ins{G|}", { Yzr, indirDX }, 0 },
4503
  },
4504
4505
  /* X86_64_6F */
4506
  {
4507
    { "outs{R|}", { indirDXr, Xz }, 0 },
4508
    { "outs{G|}", { indirDXr, Xz }, 0 },
4509
  },
4510
4511
  /* X86_64_82 */
4512
  {
4513
    /* Opcode 0x82 is an alias of opcode 0x80 in 32-bit mode.  */
4514
    { REG_TABLE (REG_80) },
4515
  },
4516
4517
  /* X86_64_9A */
4518
  {
4519
    { "{l|}call{P|}", { Ap }, 0 },
4520
  },
4521
4522
  /* X86_64_C2 */
4523
  {
4524
    { "retP",   { Iw, BND }, 0 },
4525
    { "ret@",   { Iw, BND }, 0 },
4526
  },
4527
4528
  /* X86_64_C3 */
4529
  {
4530
    { "retP",   { BND }, 0 },
4531
    { "ret@",   { BND }, 0 },
4532
  },
4533
4534
  /* X86_64_C4 */
4535
  {
4536
    { MOD_TABLE (MOD_C4_32BIT) },
4537
    { VEX_C4_TABLE () },
4538
  },
4539
4540
  /* X86_64_C5 */
4541
  {
4542
    { MOD_TABLE (MOD_C5_32BIT) },
4543
    { VEX_C5_TABLE () },
4544
  },
4545
4546
  /* X86_64_CE */
4547
  {
4548
    { "into", { XX }, 0 },
4549
  },
4550
4551
  /* X86_64_D4 */
4552
  {
4553
    { "aam", { Ib }, 0 },
4554
  },
4555
4556
  /* X86_64_D5 */
4557
  {
4558
    { "aad", { Ib }, 0 },
4559
  },
4560
4561
  /* X86_64_D6 */
4562
  {
4563
    { "salc", { XX }, 0 },
4564
    { "udb", { XX }, 0 },
4565
  },
4566
4567
  /* X86_64_E8 */
4568
  {
4569
    { "callP",    { Jv, BND }, 0 },
4570
    { "call@",    { Jv, BND }, PREFIX_REX2_ILLEGAL }
4571
  },
4572
4573
  /* X86_64_E9 */
4574
  {
4575
    { "jmpP",   { Jv, BND }, 0 },
4576
    { "jmp@",   { Jv, BND }, PREFIX_REX2_ILLEGAL }
4577
  },
4578
4579
  /* X86_64_EA */
4580
  {
4581
    { "{l|}jmp{P|}", { Ap }, 0 },
4582
  },
4583
4584
  /* X86_64_0F00_REG_6 */
4585
  {
4586
    { Bad_Opcode },
4587
    { PREFIX_TABLE (PREFIX_0F00_REG_6_X86_64) },
4588
  },
4589
4590
  /* X86_64_0F01_REG_0 */
4591
  {
4592
    { "sgdt{Q|Q}", { M }, 0 },
4593
    { "sgdt", { M }, 0 },
4594
  },
4595
4596
  /* X86_64_0F01_REG_0_MOD_3_RM_6_P_1 */
4597
  {
4598
    { Bad_Opcode },
4599
    { "wrmsrlist",  { Skip_MODRM }, 0 },
4600
  },
4601
4602
  /* X86_64_0F01_REG_0_MOD_3_RM_6_P_3 */
4603
  {
4604
    { Bad_Opcode },
4605
    { "rdmsrlist",  { Skip_MODRM }, 0 },
4606
  },
4607
4608
  /* X86_64_0F01_REG_0_MOD_3_RM_7_P_0 */
4609
  {
4610
    { Bad_Opcode },
4611
    { "pbndkb",   { Skip_MODRM }, 0 },
4612
  },
4613
4614
  /* X86_64_0F01_REG_1 */
4615
  {
4616
    { "sidt{Q|Q}", { M }, 0 },
4617
    { "sidt", { M }, 0 },
4618
  },
4619
4620
  /* X86_64_0F01_REG_1_RM_2_PREFIX_1 */
4621
  {
4622
    { Bad_Opcode },
4623
    { "eretu",    { Skip_MODRM }, 0 },
4624
  },
4625
4626
  /* X86_64_0F01_REG_1_RM_2_PREFIX_3 */
4627
  {
4628
    { Bad_Opcode },
4629
    { "erets",    { Skip_MODRM }, 0 },
4630
  },
4631
4632
  /* X86_64_0F01_REG_1_RM_5_PREFIX_2 */
4633
  {
4634
    { Bad_Opcode },
4635
    { "seamret",  { Skip_MODRM }, 0 },
4636
  },
4637
4638
  /* X86_64_0F01_REG_1_RM_6_PREFIX_2 */
4639
  {
4640
    { Bad_Opcode },
4641
    { "seamops",  { Skip_MODRM }, 0 },
4642
  },
4643
4644
  /* X86_64_0F01_REG_1_RM_7_PREFIX_2 */
4645
  {
4646
    { Bad_Opcode },
4647
    { "seamcall", { Skip_MODRM }, 0 },
4648
  },
4649
4650
  /* X86_64_0F01_REG_2 */
4651
  {
4652
    { "lgdt{Q|Q}", { M }, 0 },
4653
    { "lgdt", { M }, 0 },
4654
  },
4655
4656
  /* X86_64_0F01_REG_3 */
4657
  {
4658
    { "lidt{Q|Q}", { M }, 0 },
4659
    { "lidt", { M }, 0 },
4660
  },
4661
4662
  /* X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1 */
4663
  {
4664
    { Bad_Opcode },
4665
    { "uiret",  { Skip_MODRM }, 0 },
4666
  },
4667
4668
  /* X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1 */
4669
  {
4670
    { Bad_Opcode },
4671
    { "testui", { Skip_MODRM }, 0 },
4672
  },
4673
4674
  /* X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1 */
4675
  {
4676
    { Bad_Opcode },
4677
    { "clui", { Skip_MODRM }, 0 },
4678
  },
4679
4680
  /* X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1 */
4681
  {
4682
    { Bad_Opcode },
4683
    { "stui", { Skip_MODRM }, 0 },
4684
  },
4685
4686
  /* X86_64_0F01_REG_7_MOD_3_RM_4_PREFIX_1 */
4687
  {
4688
    { Bad_Opcode },
4689
    { "rmpchkd",  { Skip_MODRM }, 0 },
4690
  },
4691
4692
  /* X86_64_0F01_REG_7_MOD_3_RM_4_PREFIX_3 */
4693
  {
4694
    { Bad_Opcode },
4695
    { "rmpopt", { Skip_MODRM }, 0 },
4696
  },
4697
4698
  /* X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_1 */
4699
  {
4700
    { Bad_Opcode },
4701
    { "rmpquery", { Skip_MODRM }, 0 },
4702
  },
4703
4704
  /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3 */
4705
  {
4706
    { Bad_Opcode },
4707
    { "rmpread",  { DSCX, RMrAX, Skip_MODRM }, 0 },
4708
  },
4709
4710
  /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1 */
4711
  {
4712
    { Bad_Opcode },
4713
    { "rmpadjust",  { Skip_MODRM }, 0 },
4714
  },
4715
4716
  /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3 */
4717
  {
4718
    { Bad_Opcode },
4719
    { "rmpupdate",  { RMrAX, DSCX, Skip_MODRM }, 0 },
4720
  },
4721
4722
  /* X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1 */
4723
  {
4724
    { Bad_Opcode },
4725
    { "psmash", { Skip_MODRM }, 0 },
4726
  },
4727
4728
  /* X86_64_0F18_REG_6_MOD_0 */
4729
  {
4730
    { "nopQ",   { Ev }, 0 },
4731
    { PREFIX_TABLE (PREFIX_0F18_REG_6_MOD_0_X86_64) },
4732
  },
4733
4734
  /* X86_64_0F18_REG_7_MOD_0 */
4735
  {
4736
    { "nopQ",   { Ev }, 0 },
4737
    { PREFIX_TABLE (PREFIX_0F18_REG_7_MOD_0_X86_64) },
4738
  },
4739
4740
  {
4741
    /* X86_64_0F24 */
4742
    { "movZ",   { Em, Td }, 0 },
4743
  },
4744
4745
  {
4746
    /* X86_64_0F26 */
4747
    { "movZ",   { Td, Em }, 0 },
4748
  },
4749
4750
  {
4751
    /* X86_64_0F388A */
4752
    { Bad_Opcode },
4753
    { "movrsB",   { Gb, Mb }, PREFIX_OPCODE },
4754
  },
4755
4756
  {
4757
    /* X86_64_0F388B */
4758
    { Bad_Opcode },
4759
    { "movrsS",   { Gv, Mv }, PREFIX_OPCODE },
4760
  },
4761
4762
  {
4763
    /* X86_64_0F38F8_M_1 */
4764
    { Bad_Opcode },
4765
    { PREFIX_TABLE (PREFIX_0F38F8_M_1_X86_64) },
4766
  },
4767
4768
  /* X86_64_0FAE_REG_0_MOD_3_PREFIX_1 */
4769
  {
4770
    { Bad_Opcode },
4771
    { "rdfsbase", { Edq }, 0 },
4772
  },
4773
4774
  /* X86_64_0FAE_REG_1_MOD_3_PREFIX_1 */
4775
  {
4776
    { Bad_Opcode },
4777
    { "rdgsbase", { Edq }, 0 },
4778
  },
4779
4780
  /* X86_64_0FAE_REG_2_MOD_3_PREFIX_1 */
4781
  {
4782
    { Bad_Opcode },
4783
    { "wrfsbase", { Edq }, 0 },
4784
  },
4785
4786
  /* X86_64_0FAE_REG_3_MOD_3_PREFIX_1 */
4787
  {
4788
    { Bad_Opcode },
4789
    { "wrgsbase", { Edq }, 0 },
4790
  },
4791
4792
  /* X86_64_0FC7_REG_6_MOD_3_PREFIX_1 */
4793
  {
4794
    { Bad_Opcode },
4795
    { "senduipi", { Eq }, 0 },
4796
  },
4797
4798
  /* X86_64_VEX_0F3848 */
4799
  {
4800
    { Bad_Opcode },
4801
    { VEX_LEN_TABLE (VEX_LEN_0F3848_X86_64) },
4802
  },
4803
4804
  /* X86_64_VEX_0F3849 */
4805
  {
4806
    { Bad_Opcode },
4807
    { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64) },
4808
  },
4809
4810
  /* X86_64_VEX_0F384A */
4811
  {
4812
    { Bad_Opcode },
4813
    { VEX_W_TABLE (VEX_W_0F384A_X86_64) },
4814
  },
4815
4816
  /* X86_64_VEX_0F384B */
4817
  {
4818
    { Bad_Opcode },
4819
    { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64) },
4820
  },
4821
4822
  /* X86_64_VEX_0F385C */
4823
  {
4824
    { Bad_Opcode },
4825
    { VEX_LEN_TABLE (VEX_LEN_0F385C_X86_64) },
4826
  },
4827
4828
  /* X86_64_VEX_0F385E */
4829
  {
4830
    { Bad_Opcode },
4831
    { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64) },
4832
  },
4833
4834
  /* X86_64_VEX_0F385F */
4835
  {
4836
    { Bad_Opcode },
4837
    { VEX_LEN_TABLE (VEX_LEN_0F385F_X86_64) },
4838
  },
4839
4840
  /* X86_64_VEX_0F386B */
4841
  {
4842
    { Bad_Opcode },
4843
    { VEX_LEN_TABLE (VEX_LEN_0F386B_X86_64) },
4844
  },
4845
4846
  /* X86_64_VEX_0F386C */
4847
  {
4848
    { Bad_Opcode },
4849
    { VEX_LEN_TABLE (VEX_LEN_0F386C_X86_64) },
4850
  },
4851
4852
  /* X86_64_VEX_0F386E */
4853
  {
4854
    { Bad_Opcode },
4855
    { VEX_LEN_TABLE (VEX_LEN_0F386E_X86_64) },
4856
  },
4857
4858
  /* X86_64_VEX_0F386F */
4859
  {
4860
    { Bad_Opcode },
4861
    { VEX_LEN_TABLE (VEX_LEN_0F386F_X86_64) },
4862
  },
4863
4864
  /* X86_64_VEX_0F38Ex */
4865
  {
4866
    { Bad_Opcode },
4867
    { "%XEcmp%CCxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4868
  },
4869
4870
  /* X86_64_VEX_MAP5_F8 */
4871
  {
4872
    { Bad_Opcode },
4873
    { VEX_LEN_TABLE (VEX_LEN_MAP5_F8_X86_64) },
4874
  },
4875
4876
  /* X86_64_VEX_MAP5_F9 */
4877
  {
4878
    { Bad_Opcode },
4879
    { VEX_LEN_TABLE (VEX_LEN_MAP5_F9_X86_64) },
4880
  },
4881
4882
  /* X86_64_VEX_MAP5_FD */
4883
  {
4884
    { Bad_Opcode },
4885
    { VEX_LEN_TABLE (VEX_LEN_MAP5_FD_X86_64) },
4886
  },
4887
4888
  /* X86_64_VEX_MAP7_F6_L_0_W_0_R_0 */
4889
  {
4890
    { Bad_Opcode },
4891
    { PREFIX_TABLE (PREFIX_VEX_MAP7_F6_L_0_W_0_R_0_X86_64) },
4892
  },
4893
4894
  /* X86_64_VEX_MAP7_F8_L_0_W_0_R_0 */
4895
  {
4896
    { Bad_Opcode },
4897
    { PREFIX_TABLE (PREFIX_VEX_MAP7_F8_L_0_W_0_R_0_X86_64) },
4898
  },
4899
4900
#include "i386-dis-evex-x86-64.h"
4901
};
4902
4903
static const struct dis386 three_byte_table[][256] = {
4904
4905
  /* THREE_BYTE_0F38 */
4906
  {
4907
    /* 00 */
4908
    { "pshufb",   { MX, EM }, PREFIX_OPCODE },
4909
    { "phaddw",   { MX, EM }, PREFIX_OPCODE },
4910
    { "phaddd",   { MX, EM }, PREFIX_OPCODE },
4911
    { "phaddsw",  { MX, EM }, PREFIX_OPCODE },
4912
    { "pmaddubsw",  { MX, EM }, PREFIX_OPCODE },
4913
    { "phsubw",   { MX, EM }, PREFIX_OPCODE },
4914
    { "phsubd",   { MX, EM }, PREFIX_OPCODE },
4915
    { "phsubsw",  { MX, EM }, PREFIX_OPCODE },
4916
    /* 08 */
4917
    { "psignb",   { MX, EM }, PREFIX_OPCODE },
4918
    { "psignw",   { MX, EM }, PREFIX_OPCODE },
4919
    { "psignd",   { MX, EM }, PREFIX_OPCODE },
4920
    { "pmulhrsw", { MX, EM }, PREFIX_OPCODE },
4921
    { Bad_Opcode },
4922
    { Bad_Opcode },
4923
    { Bad_Opcode },
4924
    { Bad_Opcode },
4925
    /* 10 */
4926
    { "pblendvb", { XM, EXx, XMM0 }, PREFIX_DATA },
4927
    { Bad_Opcode },
4928
    { Bad_Opcode },
4929
    { Bad_Opcode },
4930
    { "blendvps", { XM, EXx, XMM0 }, PREFIX_DATA },
4931
    { "blendvpd", { XM, EXx, XMM0 }, PREFIX_DATA },
4932
    { Bad_Opcode },
4933
    { "ptest",  { XM, EXx }, PREFIX_DATA },
4934
    /* 18 */
4935
    { Bad_Opcode },
4936
    { Bad_Opcode },
4937
    { Bad_Opcode },
4938
    { Bad_Opcode },
4939
    { "pabsb",    { MX, EM }, PREFIX_OPCODE },
4940
    { "pabsw",    { MX, EM }, PREFIX_OPCODE },
4941
    { "pabsd",    { MX, EM }, PREFIX_OPCODE },
4942
    { Bad_Opcode },
4943
    /* 20 */
4944
    { "pmovsxbw", { XM, EXq }, PREFIX_DATA },
4945
    { "pmovsxbd", { XM, EXd }, PREFIX_DATA },
4946
    { "pmovsxbq", { XM, EXw }, PREFIX_DATA },
4947
    { "pmovsxwd", { XM, EXq }, PREFIX_DATA },
4948
    { "pmovsxwq", { XM, EXd }, PREFIX_DATA },
4949
    { "pmovsxdq", { XM, EXq }, PREFIX_DATA },
4950
    { Bad_Opcode },
4951
    { Bad_Opcode },
4952
    /* 28 */
4953
    { "pmuldq", { XM, EXx }, PREFIX_DATA },
4954
    { "pcmpeqq", { XM, EXx }, PREFIX_DATA },
4955
    { "movntdqa", { XM, Mx }, PREFIX_DATA },
4956
    { "packusdw", { XM, EXx }, PREFIX_DATA },
4957
    { Bad_Opcode },
4958
    { Bad_Opcode },
4959
    { Bad_Opcode },
4960
    { Bad_Opcode },
4961
    /* 30 */
4962
    { "pmovzxbw", { XM, EXq }, PREFIX_DATA },
4963
    { "pmovzxbd", { XM, EXd }, PREFIX_DATA },
4964
    { "pmovzxbq", { XM, EXw }, PREFIX_DATA },
4965
    { "pmovzxwd", { XM, EXq }, PREFIX_DATA },
4966
    { "pmovzxwq", { XM, EXd }, PREFIX_DATA },
4967
    { "pmovzxdq", { XM, EXq }, PREFIX_DATA },
4968
    { Bad_Opcode },
4969
    { "pcmpgtq", { XM, EXx }, PREFIX_DATA },
4970
    /* 38 */
4971
    { "pminsb", { XM, EXx }, PREFIX_DATA },
4972
    { "pminsd", { XM, EXx }, PREFIX_DATA },
4973
    { "pminuw", { XM, EXx }, PREFIX_DATA },
4974
    { "pminud", { XM, EXx }, PREFIX_DATA },
4975
    { "pmaxsb", { XM, EXx }, PREFIX_DATA },
4976
    { "pmaxsd", { XM, EXx }, PREFIX_DATA },
4977
    { "pmaxuw", { XM, EXx }, PREFIX_DATA },
4978
    { "pmaxud", { XM, EXx }, PREFIX_DATA },
4979
    /* 40 */
4980
    { "pmulld", { XM, EXx }, PREFIX_DATA },
4981
    { "phminposuw", { XM, EXx }, PREFIX_DATA },
4982
    { Bad_Opcode },
4983
    { Bad_Opcode },
4984
    { Bad_Opcode },
4985
    { Bad_Opcode },
4986
    { Bad_Opcode },
4987
    { Bad_Opcode },
4988
    /* 48 */
4989
    { Bad_Opcode },
4990
    { Bad_Opcode },
4991
    { Bad_Opcode },
4992
    { Bad_Opcode },
4993
    { Bad_Opcode },
4994
    { Bad_Opcode },
4995
    { Bad_Opcode },
4996
    { Bad_Opcode },
4997
    /* 50 */
4998
    { Bad_Opcode },
4999
    { Bad_Opcode },
5000
    { Bad_Opcode },
5001
    { Bad_Opcode },
5002
    { Bad_Opcode },
5003
    { Bad_Opcode },
5004
    { Bad_Opcode },
5005
    { Bad_Opcode },
5006
    /* 58 */
5007
    { Bad_Opcode },
5008
    { Bad_Opcode },
5009
    { Bad_Opcode },
5010
    { Bad_Opcode },
5011
    { Bad_Opcode },
5012
    { Bad_Opcode },
5013
    { Bad_Opcode },
5014
    { Bad_Opcode },
5015
    /* 60 */
5016
    { Bad_Opcode },
5017
    { Bad_Opcode },
5018
    { Bad_Opcode },
5019
    { Bad_Opcode },
5020
    { Bad_Opcode },
5021
    { Bad_Opcode },
5022
    { Bad_Opcode },
5023
    { Bad_Opcode },
5024
    /* 68 */
5025
    { Bad_Opcode },
5026
    { Bad_Opcode },
5027
    { Bad_Opcode },
5028
    { Bad_Opcode },
5029
    { Bad_Opcode },
5030
    { Bad_Opcode },
5031
    { Bad_Opcode },
5032
    { Bad_Opcode },
5033
    /* 70 */
5034
    { Bad_Opcode },
5035
    { Bad_Opcode },
5036
    { Bad_Opcode },
5037
    { Bad_Opcode },
5038
    { Bad_Opcode },
5039
    { Bad_Opcode },
5040
    { Bad_Opcode },
5041
    { Bad_Opcode },
5042
    /* 78 */
5043
    { Bad_Opcode },
5044
    { Bad_Opcode },
5045
    { Bad_Opcode },
5046
    { Bad_Opcode },
5047
    { Bad_Opcode },
5048
    { Bad_Opcode },
5049
    { Bad_Opcode },
5050
    { Bad_Opcode },
5051
    /* 80 */
5052
    { "invept", { Gm, Mo }, PREFIX_DATA },
5053
    { "invvpid", { Gm, Mo }, PREFIX_DATA },
5054
    { "invpcid", { Gm, M }, PREFIX_DATA },
5055
    { Bad_Opcode },
5056
    { Bad_Opcode },
5057
    { Bad_Opcode },
5058
    { Bad_Opcode },
5059
    { Bad_Opcode },
5060
    /* 88 */
5061
    { Bad_Opcode },
5062
    { Bad_Opcode },
5063
    { X86_64_TABLE (X86_64_0F388A) },
5064
    { X86_64_TABLE (X86_64_0F388B) },
5065
    { Bad_Opcode },
5066
    { Bad_Opcode },
5067
    { Bad_Opcode },
5068
    { Bad_Opcode },
5069
    /* 90 */
5070
    { Bad_Opcode },
5071
    { Bad_Opcode },
5072
    { Bad_Opcode },
5073
    { Bad_Opcode },
5074
    { Bad_Opcode },
5075
    { Bad_Opcode },
5076
    { Bad_Opcode },
5077
    { Bad_Opcode },
5078
    /* 98 */
5079
    { Bad_Opcode },
5080
    { Bad_Opcode },
5081
    { Bad_Opcode },
5082
    { Bad_Opcode },
5083
    { Bad_Opcode },
5084
    { Bad_Opcode },
5085
    { Bad_Opcode },
5086
    { Bad_Opcode },
5087
    /* a0 */
5088
    { Bad_Opcode },
5089
    { Bad_Opcode },
5090
    { Bad_Opcode },
5091
    { Bad_Opcode },
5092
    { Bad_Opcode },
5093
    { Bad_Opcode },
5094
    { Bad_Opcode },
5095
    { Bad_Opcode },
5096
    /* a8 */
5097
    { Bad_Opcode },
5098
    { Bad_Opcode },
5099
    { Bad_Opcode },
5100
    { Bad_Opcode },
5101
    { Bad_Opcode },
5102
    { Bad_Opcode },
5103
    { Bad_Opcode },
5104
    { Bad_Opcode },
5105
    /* b0 */
5106
    { Bad_Opcode },
5107
    { Bad_Opcode },
5108
    { Bad_Opcode },
5109
    { Bad_Opcode },
5110
    { Bad_Opcode },
5111
    { Bad_Opcode },
5112
    { Bad_Opcode },
5113
    { Bad_Opcode },
5114
    /* b8 */
5115
    { Bad_Opcode },
5116
    { Bad_Opcode },
5117
    { Bad_Opcode },
5118
    { Bad_Opcode },
5119
    { Bad_Opcode },
5120
    { Bad_Opcode },
5121
    { Bad_Opcode },
5122
    { Bad_Opcode },
5123
    /* c0 */
5124
    { Bad_Opcode },
5125
    { Bad_Opcode },
5126
    { Bad_Opcode },
5127
    { Bad_Opcode },
5128
    { Bad_Opcode },
5129
    { Bad_Opcode },
5130
    { Bad_Opcode },
5131
    { Bad_Opcode },
5132
    /* c8 */
5133
    { "sha1nexte", { XM, EXxmm }, PREFIX_OPCODE },
5134
    { "sha1msg1", { XM, EXxmm }, PREFIX_OPCODE },
5135
    { "sha1msg2", { XM, EXxmm }, PREFIX_OPCODE },
5136
    { "sha256rnds2", { XM, EXxmm, XMM0 }, PREFIX_OPCODE },
5137
    { "sha256msg1", { XM, EXxmm }, PREFIX_OPCODE },
5138
    { "sha256msg2", { XM, EXxmm }, PREFIX_OPCODE },
5139
    { Bad_Opcode },
5140
    { "gf2p8mulb", { XM, EXxmm }, PREFIX_DATA },
5141
    /* d0 */
5142
    { Bad_Opcode },
5143
    { Bad_Opcode },
5144
    { Bad_Opcode },
5145
    { Bad_Opcode },
5146
    { Bad_Opcode },
5147
    { Bad_Opcode },
5148
    { Bad_Opcode },
5149
    { Bad_Opcode },
5150
    /* d8 */
5151
    { PREFIX_TABLE (PREFIX_0F38D8) },
5152
    { Bad_Opcode },
5153
    { Bad_Opcode },
5154
    { "aesimc", { XM, EXx }, PREFIX_DATA },
5155
    { PREFIX_TABLE (PREFIX_0F38DC) },
5156
    { PREFIX_TABLE (PREFIX_0F38DD) },
5157
    { PREFIX_TABLE (PREFIX_0F38DE) },
5158
    { PREFIX_TABLE (PREFIX_0F38DF) },
5159
    /* e0 */
5160
    { Bad_Opcode },
5161
    { Bad_Opcode },
5162
    { Bad_Opcode },
5163
    { Bad_Opcode },
5164
    { Bad_Opcode },
5165
    { Bad_Opcode },
5166
    { Bad_Opcode },
5167
    { Bad_Opcode },
5168
    /* e8 */
5169
    { Bad_Opcode },
5170
    { Bad_Opcode },
5171
    { Bad_Opcode },
5172
    { Bad_Opcode },
5173
    { Bad_Opcode },
5174
    { Bad_Opcode },
5175
    { Bad_Opcode },
5176
    { Bad_Opcode },
5177
    /* f0 */
5178
    { PREFIX_TABLE (PREFIX_0F38F0) },
5179
    { PREFIX_TABLE (PREFIX_0F38F1) },
5180
    { Bad_Opcode },
5181
    { Bad_Opcode },
5182
    { Bad_Opcode },
5183
    { "wrussK",   { M, Gdq }, PREFIX_DATA },
5184
    { PREFIX_TABLE (PREFIX_0F38F6) },
5185
    { Bad_Opcode },
5186
    /* f8 */
5187
    { MOD_TABLE (MOD_0F38F8) },
5188
    { "movdiri",  { Mdq, Gdq }, PREFIX_OPCODE },
5189
    { PREFIX_TABLE (PREFIX_0F38FA) },
5190
    { PREFIX_TABLE (PREFIX_0F38FB) },
5191
    { PREFIX_TABLE (PREFIX_0F38FC) },
5192
    { Bad_Opcode },
5193
    { Bad_Opcode },
5194
    { Bad_Opcode },
5195
  },
5196
  /* THREE_BYTE_0F3A */
5197
  {
5198
    /* 00 */
5199
    { Bad_Opcode },
5200
    { Bad_Opcode },
5201
    { Bad_Opcode },
5202
    { Bad_Opcode },
5203
    { Bad_Opcode },
5204
    { Bad_Opcode },
5205
    { Bad_Opcode },
5206
    { Bad_Opcode },
5207
    /* 08 */
5208
    { "roundps", { XM, EXx, Ib }, PREFIX_DATA },
5209
    { "roundpd", { XM, EXx, Ib }, PREFIX_DATA },
5210
    { "roundss", { XM, EXd, Ib }, PREFIX_DATA },
5211
    { "roundsd", { XM, EXq, Ib }, PREFIX_DATA },
5212
    { "blendps", { XM, EXx, Ib }, PREFIX_DATA },
5213
    { "blendpd", { XM, EXx, Ib }, PREFIX_DATA },
5214
    { "pblendw", { XM, EXx, Ib }, PREFIX_DATA },
5215
    { "palignr",  { MX, EM, Ib }, PREFIX_OPCODE },
5216
    /* 10 */
5217
    { Bad_Opcode },
5218
    { Bad_Opcode },
5219
    { Bad_Opcode },
5220
    { Bad_Opcode },
5221
    { "pextrb", { Edb, XM, Ib }, PREFIX_DATA },
5222
    { "pextrw", { Edw, XM, Ib }, PREFIX_DATA },
5223
    { "pextrK", { Edq, XM, Ib }, PREFIX_DATA },
5224
    { "extractps", { Ed, XM, Ib }, PREFIX_DATA },
5225
    /* 18 */
5226
    { Bad_Opcode },
5227
    { Bad_Opcode },
5228
    { Bad_Opcode },
5229
    { Bad_Opcode },
5230
    { Bad_Opcode },
5231
    { Bad_Opcode },
5232
    { Bad_Opcode },
5233
    { Bad_Opcode },
5234
    /* 20 */
5235
    { "pinsrb", { XM, Edb, Ib }, PREFIX_DATA },
5236
    { "insertps", { XM, EXd, Ib }, PREFIX_DATA },
5237
    { "pinsrK", { XM, Edq, Ib }, PREFIX_DATA },
5238
    { Bad_Opcode },
5239
    { Bad_Opcode },
5240
    { Bad_Opcode },
5241
    { Bad_Opcode },
5242
    { Bad_Opcode },
5243
    /* 28 */
5244
    { Bad_Opcode },
5245
    { Bad_Opcode },
5246
    { Bad_Opcode },
5247
    { Bad_Opcode },
5248
    { Bad_Opcode },
5249
    { Bad_Opcode },
5250
    { Bad_Opcode },
5251
    { Bad_Opcode },
5252
    /* 30 */
5253
    { Bad_Opcode },
5254
    { Bad_Opcode },
5255
    { Bad_Opcode },
5256
    { Bad_Opcode },
5257
    { Bad_Opcode },
5258
    { Bad_Opcode },
5259
    { Bad_Opcode },
5260
    { Bad_Opcode },
5261
    /* 38 */
5262
    { Bad_Opcode },
5263
    { Bad_Opcode },
5264
    { Bad_Opcode },
5265
    { Bad_Opcode },
5266
    { Bad_Opcode },
5267
    { Bad_Opcode },
5268
    { Bad_Opcode },
5269
    { Bad_Opcode },
5270
    /* 40 */
5271
    { "dpps", { XM, EXx, Ib }, PREFIX_DATA },
5272
    { "dppd", { XM, EXx, Ib }, PREFIX_DATA },
5273
    { "mpsadbw", { XM, EXx, Ib }, PREFIX_DATA },
5274
    { Bad_Opcode },
5275
    { "pclmulqdq", { XM, EXx, PCLMUL }, PREFIX_DATA },
5276
    { Bad_Opcode },
5277
    { Bad_Opcode },
5278
    { Bad_Opcode },
5279
    /* 48 */
5280
    { Bad_Opcode },
5281
    { Bad_Opcode },
5282
    { Bad_Opcode },
5283
    { Bad_Opcode },
5284
    { Bad_Opcode },
5285
    { Bad_Opcode },
5286
    { Bad_Opcode },
5287
    { Bad_Opcode },
5288
    /* 50 */
5289
    { Bad_Opcode },
5290
    { Bad_Opcode },
5291
    { Bad_Opcode },
5292
    { Bad_Opcode },
5293
    { Bad_Opcode },
5294
    { Bad_Opcode },
5295
    { Bad_Opcode },
5296
    { Bad_Opcode },
5297
    /* 58 */
5298
    { Bad_Opcode },
5299
    { Bad_Opcode },
5300
    { Bad_Opcode },
5301
    { Bad_Opcode },
5302
    { Bad_Opcode },
5303
    { Bad_Opcode },
5304
    { Bad_Opcode },
5305
    { Bad_Opcode },
5306
    /* 60 */
5307
    { "pcmpestrm!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
5308
    { "pcmpestri!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
5309
    { "pcmpistrm", { XM, EXx, Ib }, PREFIX_DATA },
5310
    { "pcmpistri", { XM, EXx, Ib }, PREFIX_DATA },
5311
    { Bad_Opcode },
5312
    { Bad_Opcode },
5313
    { Bad_Opcode },
5314
    { Bad_Opcode },
5315
    /* 68 */
5316
    { Bad_Opcode },
5317
    { Bad_Opcode },
5318
    { Bad_Opcode },
5319
    { Bad_Opcode },
5320
    { Bad_Opcode },
5321
    { Bad_Opcode },
5322
    { Bad_Opcode },
5323
    { Bad_Opcode },
5324
    /* 70 */
5325
    { Bad_Opcode },
5326
    { Bad_Opcode },
5327
    { Bad_Opcode },
5328
    { Bad_Opcode },
5329
    { Bad_Opcode },
5330
    { Bad_Opcode },
5331
    { Bad_Opcode },
5332
    { Bad_Opcode },
5333
    /* 78 */
5334
    { Bad_Opcode },
5335
    { Bad_Opcode },
5336
    { Bad_Opcode },
5337
    { Bad_Opcode },
5338
    { Bad_Opcode },
5339
    { Bad_Opcode },
5340
    { Bad_Opcode },
5341
    { Bad_Opcode },
5342
    /* 80 */
5343
    { Bad_Opcode },
5344
    { Bad_Opcode },
5345
    { Bad_Opcode },
5346
    { Bad_Opcode },
5347
    { Bad_Opcode },
5348
    { Bad_Opcode },
5349
    { Bad_Opcode },
5350
    { Bad_Opcode },
5351
    /* 88 */
5352
    { Bad_Opcode },
5353
    { Bad_Opcode },
5354
    { Bad_Opcode },
5355
    { Bad_Opcode },
5356
    { Bad_Opcode },
5357
    { Bad_Opcode },
5358
    { Bad_Opcode },
5359
    { Bad_Opcode },
5360
    /* 90 */
5361
    { Bad_Opcode },
5362
    { Bad_Opcode },
5363
    { Bad_Opcode },
5364
    { Bad_Opcode },
5365
    { Bad_Opcode },
5366
    { Bad_Opcode },
5367
    { Bad_Opcode },
5368
    { Bad_Opcode },
5369
    /* 98 */
5370
    { Bad_Opcode },
5371
    { Bad_Opcode },
5372
    { Bad_Opcode },
5373
    { Bad_Opcode },
5374
    { Bad_Opcode },
5375
    { Bad_Opcode },
5376
    { Bad_Opcode },
5377
    { Bad_Opcode },
5378
    /* a0 */
5379
    { Bad_Opcode },
5380
    { Bad_Opcode },
5381
    { Bad_Opcode },
5382
    { Bad_Opcode },
5383
    { Bad_Opcode },
5384
    { Bad_Opcode },
5385
    { Bad_Opcode },
5386
    { Bad_Opcode },
5387
    /* a8 */
5388
    { Bad_Opcode },
5389
    { Bad_Opcode },
5390
    { Bad_Opcode },
5391
    { Bad_Opcode },
5392
    { Bad_Opcode },
5393
    { Bad_Opcode },
5394
    { Bad_Opcode },
5395
    { Bad_Opcode },
5396
    /* b0 */
5397
    { Bad_Opcode },
5398
    { Bad_Opcode },
5399
    { Bad_Opcode },
5400
    { Bad_Opcode },
5401
    { Bad_Opcode },
5402
    { Bad_Opcode },
5403
    { Bad_Opcode },
5404
    { Bad_Opcode },
5405
    /* b8 */
5406
    { Bad_Opcode },
5407
    { Bad_Opcode },
5408
    { Bad_Opcode },
5409
    { Bad_Opcode },
5410
    { Bad_Opcode },
5411
    { Bad_Opcode },
5412
    { Bad_Opcode },
5413
    { Bad_Opcode },
5414
    /* c0 */
5415
    { Bad_Opcode },
5416
    { Bad_Opcode },
5417
    { Bad_Opcode },
5418
    { Bad_Opcode },
5419
    { Bad_Opcode },
5420
    { Bad_Opcode },
5421
    { Bad_Opcode },
5422
    { Bad_Opcode },
5423
    /* c8 */
5424
    { Bad_Opcode },
5425
    { Bad_Opcode },
5426
    { Bad_Opcode },
5427
    { Bad_Opcode },
5428
    { "sha1rnds4", { XM, EXxmm, Ib }, PREFIX_OPCODE },
5429
    { Bad_Opcode },
5430
    { "gf2p8affineqb", { XM, EXxmm, Ib }, PREFIX_DATA },
5431
    { "gf2p8affineinvqb", { XM, EXxmm, Ib }, PREFIX_DATA },
5432
    /* d0 */
5433
    { Bad_Opcode },
5434
    { Bad_Opcode },
5435
    { Bad_Opcode },
5436
    { Bad_Opcode },
5437
    { Bad_Opcode },
5438
    { Bad_Opcode },
5439
    { Bad_Opcode },
5440
    { Bad_Opcode },
5441
    /* d8 */
5442
    { Bad_Opcode },
5443
    { Bad_Opcode },
5444
    { Bad_Opcode },
5445
    { Bad_Opcode },
5446
    { Bad_Opcode },
5447
    { Bad_Opcode },
5448
    { Bad_Opcode },
5449
    { "aeskeygenassist", { XM, EXx, Ib }, PREFIX_DATA },
5450
    /* e0 */
5451
    { Bad_Opcode },
5452
    { Bad_Opcode },
5453
    { Bad_Opcode },
5454
    { Bad_Opcode },
5455
    { Bad_Opcode },
5456
    { Bad_Opcode },
5457
    { Bad_Opcode },
5458
    { Bad_Opcode },
5459
    /* e8 */
5460
    { Bad_Opcode },
5461
    { Bad_Opcode },
5462
    { Bad_Opcode },
5463
    { Bad_Opcode },
5464
    { Bad_Opcode },
5465
    { Bad_Opcode },
5466
    { Bad_Opcode },
5467
    { Bad_Opcode },
5468
    /* f0 */
5469
    { PREFIX_TABLE (PREFIX_0F3A0F) },
5470
    { Bad_Opcode },
5471
    { Bad_Opcode },
5472
    { Bad_Opcode },
5473
    { Bad_Opcode },
5474
    { Bad_Opcode },
5475
    { Bad_Opcode },
5476
    { Bad_Opcode },
5477
    /* f8 */
5478
    { Bad_Opcode },
5479
    { Bad_Opcode },
5480
    { Bad_Opcode },
5481
    { Bad_Opcode },
5482
    { Bad_Opcode },
5483
    { Bad_Opcode },
5484
    { Bad_Opcode },
5485
    { Bad_Opcode },
5486
  },
5487
};
5488
5489
static const struct dis386 xop_table[][256] = {
5490
  /* XOP_08 */
5491
  {
5492
    /* 00 */
5493
    { Bad_Opcode },
5494
    { Bad_Opcode },
5495
    { Bad_Opcode },
5496
    { Bad_Opcode },
5497
    { Bad_Opcode },
5498
    { Bad_Opcode },
5499
    { Bad_Opcode },
5500
    { Bad_Opcode },
5501
    /* 08 */
5502
    { Bad_Opcode },
5503
    { Bad_Opcode },
5504
    { Bad_Opcode },
5505
    { Bad_Opcode },
5506
    { Bad_Opcode },
5507
    { Bad_Opcode },
5508
    { Bad_Opcode },
5509
    { Bad_Opcode },
5510
    /* 10 */
5511
    { Bad_Opcode },
5512
    { Bad_Opcode },
5513
    { Bad_Opcode },
5514
    { Bad_Opcode },
5515
    { Bad_Opcode },
5516
    { Bad_Opcode },
5517
    { Bad_Opcode },
5518
    { Bad_Opcode },
5519
    /* 18 */
5520
    { Bad_Opcode },
5521
    { Bad_Opcode },
5522
    { Bad_Opcode },
5523
    { Bad_Opcode },
5524
    { Bad_Opcode },
5525
    { Bad_Opcode },
5526
    { Bad_Opcode },
5527
    { Bad_Opcode },
5528
    /* 20 */
5529
    { Bad_Opcode },
5530
    { Bad_Opcode },
5531
    { Bad_Opcode },
5532
    { Bad_Opcode },
5533
    { Bad_Opcode },
5534
    { Bad_Opcode },
5535
    { Bad_Opcode },
5536
    { Bad_Opcode },
5537
    /* 28 */
5538
    { Bad_Opcode },
5539
    { Bad_Opcode },
5540
    { Bad_Opcode },
5541
    { Bad_Opcode },
5542
    { Bad_Opcode },
5543
    { Bad_Opcode },
5544
    { Bad_Opcode },
5545
    { Bad_Opcode },
5546
    /* 30 */
5547
    { Bad_Opcode },
5548
    { Bad_Opcode },
5549
    { Bad_Opcode },
5550
    { Bad_Opcode },
5551
    { Bad_Opcode },
5552
    { Bad_Opcode },
5553
    { Bad_Opcode },
5554
    { Bad_Opcode },
5555
    /* 38 */
5556
    { Bad_Opcode },
5557
    { Bad_Opcode },
5558
    { Bad_Opcode },
5559
    { Bad_Opcode },
5560
    { Bad_Opcode },
5561
    { Bad_Opcode },
5562
    { Bad_Opcode },
5563
    { Bad_Opcode },
5564
    /* 40 */
5565
    { Bad_Opcode },
5566
    { Bad_Opcode },
5567
    { Bad_Opcode },
5568
    { Bad_Opcode },
5569
    { Bad_Opcode },
5570
    { Bad_Opcode },
5571
    { Bad_Opcode },
5572
    { Bad_Opcode },
5573
    /* 48 */
5574
    { Bad_Opcode },
5575
    { Bad_Opcode },
5576
    { Bad_Opcode },
5577
    { Bad_Opcode },
5578
    { Bad_Opcode },
5579
    { Bad_Opcode },
5580
    { Bad_Opcode },
5581
    { Bad_Opcode },
5582
    /* 50 */
5583
    { Bad_Opcode },
5584
    { Bad_Opcode },
5585
    { Bad_Opcode },
5586
    { Bad_Opcode },
5587
    { Bad_Opcode },
5588
    { Bad_Opcode },
5589
    { Bad_Opcode },
5590
    { Bad_Opcode },
5591
    /* 58 */
5592
    { Bad_Opcode },
5593
    { Bad_Opcode },
5594
    { Bad_Opcode },
5595
    { Bad_Opcode },
5596
    { Bad_Opcode },
5597
    { Bad_Opcode },
5598
    { Bad_Opcode },
5599
    { Bad_Opcode },
5600
    /* 60 */
5601
    { Bad_Opcode },
5602
    { Bad_Opcode },
5603
    { Bad_Opcode },
5604
    { Bad_Opcode },
5605
    { Bad_Opcode },
5606
    { Bad_Opcode },
5607
    { Bad_Opcode },
5608
    { Bad_Opcode },
5609
    /* 68 */
5610
    { Bad_Opcode },
5611
    { Bad_Opcode },
5612
    { Bad_Opcode },
5613
    { Bad_Opcode },
5614
    { Bad_Opcode },
5615
    { Bad_Opcode },
5616
    { Bad_Opcode },
5617
    { Bad_Opcode },
5618
    /* 70 */
5619
    { Bad_Opcode },
5620
    { Bad_Opcode },
5621
    { Bad_Opcode },
5622
    { Bad_Opcode },
5623
    { Bad_Opcode },
5624
    { Bad_Opcode },
5625
    { Bad_Opcode },
5626
    { Bad_Opcode },
5627
    /* 78 */
5628
    { Bad_Opcode },
5629
    { Bad_Opcode },
5630
    { Bad_Opcode },
5631
    { Bad_Opcode },
5632
    { Bad_Opcode },
5633
    { Bad_Opcode },
5634
    { Bad_Opcode },
5635
    { Bad_Opcode },
5636
    /* 80 */
5637
    { Bad_Opcode },
5638
    { Bad_Opcode },
5639
    { Bad_Opcode },
5640
    { Bad_Opcode },
5641
    { Bad_Opcode },
5642
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_85) },
5643
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_86) },
5644
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_87) },
5645
    /* 88 */
5646
    { Bad_Opcode },
5647
    { Bad_Opcode },
5648
    { Bad_Opcode },
5649
    { Bad_Opcode },
5650
    { Bad_Opcode },
5651
    { Bad_Opcode },
5652
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_8E) },
5653
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_8F) },
5654
    /* 90 */
5655
    { Bad_Opcode },
5656
    { Bad_Opcode },
5657
    { Bad_Opcode },
5658
    { Bad_Opcode },
5659
    { Bad_Opcode },
5660
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_95) },
5661
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_96) },
5662
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_97) },
5663
    /* 98 */
5664
    { Bad_Opcode },
5665
    { Bad_Opcode },
5666
    { Bad_Opcode },
5667
    { Bad_Opcode },
5668
    { Bad_Opcode },
5669
    { Bad_Opcode },
5670
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_9E) },
5671
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_9F) },
5672
    /* a0 */
5673
    { Bad_Opcode },
5674
    { Bad_Opcode },
5675
    { "vpcmov",   { XM, Vex, EXx, XMVexI4 }, 0 },
5676
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_A3) },
5677
    { Bad_Opcode },
5678
    { Bad_Opcode },
5679
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_A6) },
5680
    { Bad_Opcode },
5681
    /* a8 */
5682
    { Bad_Opcode },
5683
    { Bad_Opcode },
5684
    { Bad_Opcode },
5685
    { Bad_Opcode },
5686
    { Bad_Opcode },
5687
    { Bad_Opcode },
5688
    { Bad_Opcode },
5689
    { Bad_Opcode },
5690
    /* b0 */
5691
    { Bad_Opcode },
5692
    { Bad_Opcode },
5693
    { Bad_Opcode },
5694
    { Bad_Opcode },
5695
    { Bad_Opcode },
5696
    { Bad_Opcode },
5697
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_B6) },
5698
    { Bad_Opcode },
5699
    /* b8 */
5700
    { Bad_Opcode },
5701
    { Bad_Opcode },
5702
    { Bad_Opcode },
5703
    { Bad_Opcode },
5704
    { Bad_Opcode },
5705
    { Bad_Opcode },
5706
    { Bad_Opcode },
5707
    { Bad_Opcode },
5708
    /* c0 */
5709
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_C0) },
5710
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_C1) },
5711
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_C2) },
5712
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_C3) },
5713
    { Bad_Opcode },
5714
    { Bad_Opcode },
5715
    { Bad_Opcode },
5716
    { Bad_Opcode },
5717
    /* c8 */
5718
    { Bad_Opcode },
5719
    { Bad_Opcode },
5720
    { Bad_Opcode },
5721
    { Bad_Opcode },
5722
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_CC) },
5723
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_CD) },
5724
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_CE) },
5725
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_CF) },
5726
    /* d0 */
5727
    { Bad_Opcode },
5728
    { Bad_Opcode },
5729
    { Bad_Opcode },
5730
    { Bad_Opcode },
5731
    { Bad_Opcode },
5732
    { Bad_Opcode },
5733
    { Bad_Opcode },
5734
    { Bad_Opcode },
5735
    /* d8 */
5736
    { Bad_Opcode },
5737
    { Bad_Opcode },
5738
    { Bad_Opcode },
5739
    { Bad_Opcode },
5740
    { Bad_Opcode },
5741
    { Bad_Opcode },
5742
    { Bad_Opcode },
5743
    { Bad_Opcode },
5744
    /* e0 */
5745
    { Bad_Opcode },
5746
    { Bad_Opcode },
5747
    { Bad_Opcode },
5748
    { Bad_Opcode },
5749
    { Bad_Opcode },
5750
    { Bad_Opcode },
5751
    { Bad_Opcode },
5752
    { Bad_Opcode },
5753
    /* e8 */
5754
    { Bad_Opcode },
5755
    { Bad_Opcode },
5756
    { Bad_Opcode },
5757
    { Bad_Opcode },
5758
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_EC) },
5759
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_ED) },
5760
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_EE) },
5761
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_EF) },
5762
    /* f0 */
5763
    { Bad_Opcode },
5764
    { Bad_Opcode },
5765
    { Bad_Opcode },
5766
    { Bad_Opcode },
5767
    { Bad_Opcode },
5768
    { Bad_Opcode },
5769
    { Bad_Opcode },
5770
    { Bad_Opcode },
5771
    /* f8 */
5772
    { Bad_Opcode },
5773
    { Bad_Opcode },
5774
    { Bad_Opcode },
5775
    { Bad_Opcode },
5776
    { Bad_Opcode },
5777
    { Bad_Opcode },
5778
    { Bad_Opcode },
5779
    { Bad_Opcode },
5780
  },
5781
  /* XOP_09 */
5782
  {
5783
    /* 00 */
5784
    { Bad_Opcode },
5785
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_01) },
5786
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_02) },
5787
    { Bad_Opcode },
5788
    { Bad_Opcode },
5789
    { Bad_Opcode },
5790
    { Bad_Opcode },
5791
    { Bad_Opcode },
5792
    /* 08 */
5793
    { Bad_Opcode },
5794
    { Bad_Opcode },
5795
    { Bad_Opcode },
5796
    { Bad_Opcode },
5797
    { Bad_Opcode },
5798
    { Bad_Opcode },
5799
    { Bad_Opcode },
5800
    { Bad_Opcode },
5801
    /* 10 */
5802
    { Bad_Opcode },
5803
    { Bad_Opcode },
5804
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_12) },
5805
    { Bad_Opcode },
5806
    { Bad_Opcode },
5807
    { Bad_Opcode },
5808
    { Bad_Opcode },
5809
    { Bad_Opcode },
5810
    /* 18 */
5811
    { Bad_Opcode },
5812
    { Bad_Opcode },
5813
    { Bad_Opcode },
5814
    { Bad_Opcode },
5815
    { Bad_Opcode },
5816
    { Bad_Opcode },
5817
    { Bad_Opcode },
5818
    { Bad_Opcode },
5819
    /* 20 */
5820
    { Bad_Opcode },
5821
    { Bad_Opcode },
5822
    { Bad_Opcode },
5823
    { Bad_Opcode },
5824
    { Bad_Opcode },
5825
    { Bad_Opcode },
5826
    { Bad_Opcode },
5827
    { Bad_Opcode },
5828
    /* 28 */
5829
    { Bad_Opcode },
5830
    { Bad_Opcode },
5831
    { Bad_Opcode },
5832
    { Bad_Opcode },
5833
    { Bad_Opcode },
5834
    { Bad_Opcode },
5835
    { Bad_Opcode },
5836
    { Bad_Opcode },
5837
    /* 30 */
5838
    { Bad_Opcode },
5839
    { Bad_Opcode },
5840
    { Bad_Opcode },
5841
    { Bad_Opcode },
5842
    { Bad_Opcode },
5843
    { Bad_Opcode },
5844
    { Bad_Opcode },
5845
    { Bad_Opcode },
5846
    /* 38 */
5847
    { Bad_Opcode },
5848
    { Bad_Opcode },
5849
    { Bad_Opcode },
5850
    { Bad_Opcode },
5851
    { Bad_Opcode },
5852
    { Bad_Opcode },
5853
    { Bad_Opcode },
5854
    { Bad_Opcode },
5855
    /* 40 */
5856
    { Bad_Opcode },
5857
    { Bad_Opcode },
5858
    { Bad_Opcode },
5859
    { Bad_Opcode },
5860
    { Bad_Opcode },
5861
    { Bad_Opcode },
5862
    { Bad_Opcode },
5863
    { Bad_Opcode },
5864
    /* 48 */
5865
    { Bad_Opcode },
5866
    { Bad_Opcode },
5867
    { Bad_Opcode },
5868
    { Bad_Opcode },
5869
    { Bad_Opcode },
5870
    { Bad_Opcode },
5871
    { Bad_Opcode },
5872
    { Bad_Opcode },
5873
    /* 50 */
5874
    { Bad_Opcode },
5875
    { Bad_Opcode },
5876
    { Bad_Opcode },
5877
    { Bad_Opcode },
5878
    { Bad_Opcode },
5879
    { Bad_Opcode },
5880
    { Bad_Opcode },
5881
    { Bad_Opcode },
5882
    /* 58 */
5883
    { Bad_Opcode },
5884
    { Bad_Opcode },
5885
    { Bad_Opcode },
5886
    { Bad_Opcode },
5887
    { Bad_Opcode },
5888
    { Bad_Opcode },
5889
    { Bad_Opcode },
5890
    { Bad_Opcode },
5891
    /* 60 */
5892
    { Bad_Opcode },
5893
    { Bad_Opcode },
5894
    { Bad_Opcode },
5895
    { Bad_Opcode },
5896
    { Bad_Opcode },
5897
    { Bad_Opcode },
5898
    { Bad_Opcode },
5899
    { Bad_Opcode },
5900
    /* 68 */
5901
    { Bad_Opcode },
5902
    { Bad_Opcode },
5903
    { Bad_Opcode },
5904
    { Bad_Opcode },
5905
    { Bad_Opcode },
5906
    { Bad_Opcode },
5907
    { Bad_Opcode },
5908
    { Bad_Opcode },
5909
    /* 70 */
5910
    { Bad_Opcode },
5911
    { Bad_Opcode },
5912
    { Bad_Opcode },
5913
    { Bad_Opcode },
5914
    { Bad_Opcode },
5915
    { Bad_Opcode },
5916
    { Bad_Opcode },
5917
    { Bad_Opcode },
5918
    /* 78 */
5919
    { Bad_Opcode },
5920
    { Bad_Opcode },
5921
    { Bad_Opcode },
5922
    { Bad_Opcode },
5923
    { Bad_Opcode },
5924
    { Bad_Opcode },
5925
    { Bad_Opcode },
5926
    { Bad_Opcode },
5927
    /* 80 */
5928
    { VEX_W_TABLE (VEX_W_XOP_09_80) },
5929
    { VEX_W_TABLE (VEX_W_XOP_09_81) },
5930
    { VEX_W_TABLE (VEX_W_XOP_09_82) },
5931
    { VEX_W_TABLE (VEX_W_XOP_09_83) },
5932
    { Bad_Opcode },
5933
    { Bad_Opcode },
5934
    { Bad_Opcode },
5935
    { Bad_Opcode },
5936
    /* 88 */
5937
    { Bad_Opcode },
5938
    { Bad_Opcode },
5939
    { Bad_Opcode },
5940
    { Bad_Opcode },
5941
    { Bad_Opcode },
5942
    { Bad_Opcode },
5943
    { Bad_Opcode },
5944
    { Bad_Opcode },
5945
    /* 90 */
5946
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_90) },
5947
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_91) },
5948
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_92) },
5949
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_93) },
5950
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_94) },
5951
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_95) },
5952
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_96) },
5953
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_97) },
5954
    /* 98 */
5955
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_98) },
5956
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_99) },
5957
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_9A) },
5958
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_9B) },
5959
    { Bad_Opcode },
5960
    { Bad_Opcode },
5961
    { Bad_Opcode },
5962
    { Bad_Opcode },
5963
    /* a0 */
5964
    { Bad_Opcode },
5965
    { Bad_Opcode },
5966
    { Bad_Opcode },
5967
    { Bad_Opcode },
5968
    { Bad_Opcode },
5969
    { Bad_Opcode },
5970
    { Bad_Opcode },
5971
    { Bad_Opcode },
5972
    /* a8 */
5973
    { Bad_Opcode },
5974
    { Bad_Opcode },
5975
    { Bad_Opcode },
5976
    { Bad_Opcode },
5977
    { Bad_Opcode },
5978
    { Bad_Opcode },
5979
    { Bad_Opcode },
5980
    { Bad_Opcode },
5981
    /* b0 */
5982
    { Bad_Opcode },
5983
    { Bad_Opcode },
5984
    { Bad_Opcode },
5985
    { Bad_Opcode },
5986
    { Bad_Opcode },
5987
    { Bad_Opcode },
5988
    { Bad_Opcode },
5989
    { Bad_Opcode },
5990
    /* b8 */
5991
    { Bad_Opcode },
5992
    { Bad_Opcode },
5993
    { Bad_Opcode },
5994
    { Bad_Opcode },
5995
    { Bad_Opcode },
5996
    { Bad_Opcode },
5997
    { Bad_Opcode },
5998
    { Bad_Opcode },
5999
    /* c0 */
6000
    { Bad_Opcode },
6001
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_C1) },
6002
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_C2) },
6003
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_C3) },
6004
    { Bad_Opcode },
6005
    { Bad_Opcode },
6006
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_C6) },
6007
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_C7) },
6008
    /* c8 */
6009
    { Bad_Opcode },
6010
    { Bad_Opcode },
6011
    { Bad_Opcode },
6012
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_CB) },
6013
    { Bad_Opcode },
6014
    { Bad_Opcode },
6015
    { Bad_Opcode },
6016
    { Bad_Opcode },
6017
    /* d0 */
6018
    { Bad_Opcode },
6019
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_D1) },
6020
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_D2) },
6021
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_D3) },
6022
    { Bad_Opcode },
6023
    { Bad_Opcode },
6024
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_D6) },
6025
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_D7) },
6026
    /* d8 */
6027
    { Bad_Opcode },
6028
    { Bad_Opcode },
6029
    { Bad_Opcode },
6030
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_DB) },
6031
    { Bad_Opcode },
6032
    { Bad_Opcode },
6033
    { Bad_Opcode },
6034
    { Bad_Opcode },
6035
    /* e0 */
6036
    { Bad_Opcode },
6037
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_E1) },
6038
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_E2) },
6039
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_E3) },
6040
    { Bad_Opcode },
6041
    { Bad_Opcode },
6042
    { Bad_Opcode },
6043
    { Bad_Opcode },
6044
    /* e8 */
6045
    { Bad_Opcode },
6046
    { Bad_Opcode },
6047
    { Bad_Opcode },
6048
    { Bad_Opcode },
6049
    { Bad_Opcode },
6050
    { Bad_Opcode },
6051
    { Bad_Opcode },
6052
    { Bad_Opcode },
6053
    /* f0 */
6054
    { Bad_Opcode },
6055
    { Bad_Opcode },
6056
    { Bad_Opcode },
6057
    { Bad_Opcode },
6058
    { Bad_Opcode },
6059
    { Bad_Opcode },
6060
    { Bad_Opcode },
6061
    { Bad_Opcode },
6062
    /* f8 */
6063
    { Bad_Opcode },
6064
    { Bad_Opcode },
6065
    { Bad_Opcode },
6066
    { Bad_Opcode },
6067
    { Bad_Opcode },
6068
    { Bad_Opcode },
6069
    { Bad_Opcode },
6070
    { Bad_Opcode },
6071
  },
6072
  /* XOP_0A */
6073
  {
6074
    /* 00 */
6075
    { Bad_Opcode },
6076
    { Bad_Opcode },
6077
    { Bad_Opcode },
6078
    { Bad_Opcode },
6079
    { Bad_Opcode },
6080
    { Bad_Opcode },
6081
    { Bad_Opcode },
6082
    { Bad_Opcode },
6083
    /* 08 */
6084
    { Bad_Opcode },
6085
    { Bad_Opcode },
6086
    { Bad_Opcode },
6087
    { Bad_Opcode },
6088
    { Bad_Opcode },
6089
    { Bad_Opcode },
6090
    { Bad_Opcode },
6091
    { Bad_Opcode },
6092
    /* 10 */
6093
    { "bextrS", { Gdq, Edq, Id }, 0 },
6094
    { Bad_Opcode },
6095
    { VEX_LEN_TABLE (VEX_LEN_XOP_0A_12) },
6096
    { Bad_Opcode },
6097
    { Bad_Opcode },
6098
    { Bad_Opcode },
6099
    { Bad_Opcode },
6100
    { Bad_Opcode },
6101
    /* 18 */
6102
    { Bad_Opcode },
6103
    { Bad_Opcode },
6104
    { Bad_Opcode },
6105
    { Bad_Opcode },
6106
    { Bad_Opcode },
6107
    { Bad_Opcode },
6108
    { Bad_Opcode },
6109
    { Bad_Opcode },
6110
    /* 20 */
6111
    { Bad_Opcode },
6112
    { Bad_Opcode },
6113
    { Bad_Opcode },
6114
    { Bad_Opcode },
6115
    { Bad_Opcode },
6116
    { Bad_Opcode },
6117
    { Bad_Opcode },
6118
    { Bad_Opcode },
6119
    /* 28 */
6120
    { Bad_Opcode },
6121
    { Bad_Opcode },
6122
    { Bad_Opcode },
6123
    { Bad_Opcode },
6124
    { Bad_Opcode },
6125
    { Bad_Opcode },
6126
    { Bad_Opcode },
6127
    { Bad_Opcode },
6128
    /* 30 */
6129
    { Bad_Opcode },
6130
    { Bad_Opcode },
6131
    { Bad_Opcode },
6132
    { Bad_Opcode },
6133
    { Bad_Opcode },
6134
    { Bad_Opcode },
6135
    { Bad_Opcode },
6136
    { Bad_Opcode },
6137
    /* 38 */
6138
    { Bad_Opcode },
6139
    { Bad_Opcode },
6140
    { Bad_Opcode },
6141
    { Bad_Opcode },
6142
    { Bad_Opcode },
6143
    { Bad_Opcode },
6144
    { Bad_Opcode },
6145
    { Bad_Opcode },
6146
    /* 40 */
6147
    { Bad_Opcode },
6148
    { Bad_Opcode },
6149
    { Bad_Opcode },
6150
    { Bad_Opcode },
6151
    { Bad_Opcode },
6152
    { Bad_Opcode },
6153
    { Bad_Opcode },
6154
    { Bad_Opcode },
6155
    /* 48 */
6156
    { Bad_Opcode },
6157
    { Bad_Opcode },
6158
    { Bad_Opcode },
6159
    { Bad_Opcode },
6160
    { Bad_Opcode },
6161
    { Bad_Opcode },
6162
    { Bad_Opcode },
6163
    { Bad_Opcode },
6164
    /* 50 */
6165
    { Bad_Opcode },
6166
    { Bad_Opcode },
6167
    { Bad_Opcode },
6168
    { Bad_Opcode },
6169
    { Bad_Opcode },
6170
    { Bad_Opcode },
6171
    { Bad_Opcode },
6172
    { Bad_Opcode },
6173
    /* 58 */
6174
    { Bad_Opcode },
6175
    { Bad_Opcode },
6176
    { Bad_Opcode },
6177
    { Bad_Opcode },
6178
    { Bad_Opcode },
6179
    { Bad_Opcode },
6180
    { Bad_Opcode },
6181
    { Bad_Opcode },
6182
    /* 60 */
6183
    { Bad_Opcode },
6184
    { Bad_Opcode },
6185
    { Bad_Opcode },
6186
    { Bad_Opcode },
6187
    { Bad_Opcode },
6188
    { Bad_Opcode },
6189
    { Bad_Opcode },
6190
    { Bad_Opcode },
6191
    /* 68 */
6192
    { Bad_Opcode },
6193
    { Bad_Opcode },
6194
    { Bad_Opcode },
6195
    { Bad_Opcode },
6196
    { Bad_Opcode },
6197
    { Bad_Opcode },
6198
    { Bad_Opcode },
6199
    { Bad_Opcode },
6200
    /* 70 */
6201
    { Bad_Opcode },
6202
    { Bad_Opcode },
6203
    { Bad_Opcode },
6204
    { Bad_Opcode },
6205
    { Bad_Opcode },
6206
    { Bad_Opcode },
6207
    { Bad_Opcode },
6208
    { Bad_Opcode },
6209
    /* 78 */
6210
    { Bad_Opcode },
6211
    { Bad_Opcode },
6212
    { Bad_Opcode },
6213
    { Bad_Opcode },
6214
    { Bad_Opcode },
6215
    { Bad_Opcode },
6216
    { Bad_Opcode },
6217
    { Bad_Opcode },
6218
    /* 80 */
6219
    { Bad_Opcode },
6220
    { Bad_Opcode },
6221
    { Bad_Opcode },
6222
    { Bad_Opcode },
6223
    { Bad_Opcode },
6224
    { Bad_Opcode },
6225
    { Bad_Opcode },
6226
    { Bad_Opcode },
6227
    /* 88 */
6228
    { Bad_Opcode },
6229
    { Bad_Opcode },
6230
    { Bad_Opcode },
6231
    { Bad_Opcode },
6232
    { Bad_Opcode },
6233
    { Bad_Opcode },
6234
    { Bad_Opcode },
6235
    { Bad_Opcode },
6236
    /* 90 */
6237
    { Bad_Opcode },
6238
    { Bad_Opcode },
6239
    { Bad_Opcode },
6240
    { Bad_Opcode },
6241
    { Bad_Opcode },
6242
    { Bad_Opcode },
6243
    { Bad_Opcode },
6244
    { Bad_Opcode },
6245
    /* 98 */
6246
    { Bad_Opcode },
6247
    { Bad_Opcode },
6248
    { Bad_Opcode },
6249
    { Bad_Opcode },
6250
    { Bad_Opcode },
6251
    { Bad_Opcode },
6252
    { Bad_Opcode },
6253
    { Bad_Opcode },
6254
    /* a0 */
6255
    { Bad_Opcode },
6256
    { Bad_Opcode },
6257
    { Bad_Opcode },
6258
    { Bad_Opcode },
6259
    { Bad_Opcode },
6260
    { Bad_Opcode },
6261
    { Bad_Opcode },
6262
    { Bad_Opcode },
6263
    /* a8 */
6264
    { Bad_Opcode },
6265
    { Bad_Opcode },
6266
    { Bad_Opcode },
6267
    { Bad_Opcode },
6268
    { Bad_Opcode },
6269
    { Bad_Opcode },
6270
    { Bad_Opcode },
6271
    { Bad_Opcode },
6272
    /* b0 */
6273
    { Bad_Opcode },
6274
    { Bad_Opcode },
6275
    { Bad_Opcode },
6276
    { Bad_Opcode },
6277
    { Bad_Opcode },
6278
    { Bad_Opcode },
6279
    { Bad_Opcode },
6280
    { Bad_Opcode },
6281
    /* b8 */
6282
    { Bad_Opcode },
6283
    { Bad_Opcode },
6284
    { Bad_Opcode },
6285
    { Bad_Opcode },
6286
    { Bad_Opcode },
6287
    { Bad_Opcode },
6288
    { Bad_Opcode },
6289
    { Bad_Opcode },
6290
    /* c0 */
6291
    { Bad_Opcode },
6292
    { Bad_Opcode },
6293
    { Bad_Opcode },
6294
    { Bad_Opcode },
6295
    { Bad_Opcode },
6296
    { Bad_Opcode },
6297
    { Bad_Opcode },
6298
    { Bad_Opcode },
6299
    /* c8 */
6300
    { Bad_Opcode },
6301
    { Bad_Opcode },
6302
    { Bad_Opcode },
6303
    { Bad_Opcode },
6304
    { Bad_Opcode },
6305
    { Bad_Opcode },
6306
    { Bad_Opcode },
6307
    { Bad_Opcode },
6308
    /* d0 */
6309
    { Bad_Opcode },
6310
    { Bad_Opcode },
6311
    { Bad_Opcode },
6312
    { Bad_Opcode },
6313
    { Bad_Opcode },
6314
    { Bad_Opcode },
6315
    { Bad_Opcode },
6316
    { Bad_Opcode },
6317
    /* d8 */
6318
    { Bad_Opcode },
6319
    { Bad_Opcode },
6320
    { Bad_Opcode },
6321
    { Bad_Opcode },
6322
    { Bad_Opcode },
6323
    { Bad_Opcode },
6324
    { Bad_Opcode },
6325
    { Bad_Opcode },
6326
    /* e0 */
6327
    { Bad_Opcode },
6328
    { Bad_Opcode },
6329
    { Bad_Opcode },
6330
    { Bad_Opcode },
6331
    { Bad_Opcode },
6332
    { Bad_Opcode },
6333
    { Bad_Opcode },
6334
    { Bad_Opcode },
6335
    /* e8 */
6336
    { Bad_Opcode },
6337
    { Bad_Opcode },
6338
    { Bad_Opcode },
6339
    { Bad_Opcode },
6340
    { Bad_Opcode },
6341
    { Bad_Opcode },
6342
    { Bad_Opcode },
6343
    { Bad_Opcode },
6344
    /* f0 */
6345
    { Bad_Opcode },
6346
    { Bad_Opcode },
6347
    { Bad_Opcode },
6348
    { Bad_Opcode },
6349
    { Bad_Opcode },
6350
    { Bad_Opcode },
6351
    { Bad_Opcode },
6352
    { Bad_Opcode },
6353
    /* f8 */
6354
    { Bad_Opcode },
6355
    { Bad_Opcode },
6356
    { Bad_Opcode },
6357
    { Bad_Opcode },
6358
    { Bad_Opcode },
6359
    { Bad_Opcode },
6360
    { Bad_Opcode },
6361
    { Bad_Opcode },
6362
  },
6363
};
6364
6365
static const struct dis386 vex_table[][256] = {
6366
  /* VEX_0F */
6367
  {
6368
    /* 00 */
6369
    { Bad_Opcode },
6370
    { Bad_Opcode },
6371
    { Bad_Opcode },
6372
    { Bad_Opcode },
6373
    { Bad_Opcode },
6374
    { Bad_Opcode },
6375
    { Bad_Opcode },
6376
    { Bad_Opcode },
6377
    /* 08 */
6378
    { Bad_Opcode },
6379
    { Bad_Opcode },
6380
    { Bad_Opcode },
6381
    { Bad_Opcode },
6382
    { Bad_Opcode },
6383
    { Bad_Opcode },
6384
    { Bad_Opcode },
6385
    { Bad_Opcode },
6386
    /* 10 */
6387
    { PREFIX_TABLE (PREFIX_0F10) },
6388
    { PREFIX_TABLE (PREFIX_0F11) },
6389
    { PREFIX_TABLE (PREFIX_VEX_0F12) },
6390
    { VEX_LEN_TABLE (VEX_LEN_0F13) },
6391
    { "vunpcklpX",  { XM, Vex, EXx }, PREFIX_OPCODE },
6392
    { "vunpckhpX",  { XM, Vex, EXx }, PREFIX_OPCODE },
6393
    { PREFIX_TABLE (PREFIX_VEX_0F16) },
6394
    { VEX_LEN_TABLE (VEX_LEN_0F17) },
6395
    /* 18 */
6396
    { Bad_Opcode },
6397
    { Bad_Opcode },
6398
    { Bad_Opcode },
6399
    { Bad_Opcode },
6400
    { Bad_Opcode },
6401
    { Bad_Opcode },
6402
    { Bad_Opcode },
6403
    { Bad_Opcode },
6404
    /* 20 */
6405
    { Bad_Opcode },
6406
    { Bad_Opcode },
6407
    { Bad_Opcode },
6408
    { Bad_Opcode },
6409
    { Bad_Opcode },
6410
    { Bad_Opcode },
6411
    { Bad_Opcode },
6412
    { Bad_Opcode },
6413
    /* 28 */
6414
    { "vmovapX",  { XM, EXx }, PREFIX_OPCODE },
6415
    { "vmovapX",  { EXxS, XM }, PREFIX_OPCODE },
6416
    { PREFIX_TABLE (PREFIX_VEX_0F2A) },
6417
    { "vmovntpX", { Mx, XM }, PREFIX_OPCODE },
6418
    { PREFIX_TABLE (PREFIX_VEX_0F2C) },
6419
    { PREFIX_TABLE (PREFIX_VEX_0F2D) },
6420
    { PREFIX_TABLE (PREFIX_0F2E) },
6421
    { PREFIX_TABLE (PREFIX_0F2F) },
6422
    /* 30 */
6423
    { Bad_Opcode },
6424
    { Bad_Opcode },
6425
    { Bad_Opcode },
6426
    { Bad_Opcode },
6427
    { Bad_Opcode },
6428
    { Bad_Opcode },
6429
    { Bad_Opcode },
6430
    { Bad_Opcode },
6431
    /* 38 */
6432
    { Bad_Opcode },
6433
    { Bad_Opcode },
6434
    { Bad_Opcode },
6435
    { Bad_Opcode },
6436
    { Bad_Opcode },
6437
    { Bad_Opcode },
6438
    { Bad_Opcode },
6439
    { Bad_Opcode },
6440
    /* 40 */
6441
    { Bad_Opcode },
6442
    { VEX_LEN_TABLE (VEX_LEN_0F41) },
6443
    { VEX_LEN_TABLE (VEX_LEN_0F42) },
6444
    { Bad_Opcode },
6445
    { VEX_LEN_TABLE (VEX_LEN_0F44) },
6446
    { VEX_LEN_TABLE (VEX_LEN_0F45) },
6447
    { VEX_LEN_TABLE (VEX_LEN_0F46) },
6448
    { VEX_LEN_TABLE (VEX_LEN_0F47) },
6449
    /* 48 */
6450
    { Bad_Opcode },
6451
    { Bad_Opcode },
6452
    { VEX_LEN_TABLE (VEX_LEN_0F4A) },
6453
    { VEX_LEN_TABLE (VEX_LEN_0F4B) },
6454
    { Bad_Opcode },
6455
    { Bad_Opcode },
6456
    { Bad_Opcode },
6457
    { Bad_Opcode },
6458
    /* 50 */
6459
    { "vmovmskpX",  { Gdq, Ux }, PREFIX_OPCODE },
6460
    { PREFIX_TABLE (PREFIX_0F51) },
6461
    { PREFIX_TABLE (PREFIX_0F52) },
6462
    { PREFIX_TABLE (PREFIX_0F53) },
6463
    { "vandpX",   { XM, Vex, EXx }, PREFIX_OPCODE },
6464
    { "vandnpX",  { XM, Vex, EXx }, PREFIX_OPCODE },
6465
    { "vorpX",    { XM, Vex, EXx }, PREFIX_OPCODE },
6466
    { "vxorpX",   { XM, Vex, EXx }, PREFIX_OPCODE },
6467
    /* 58 */
6468
    { PREFIX_TABLE (PREFIX_0F58) },
6469
    { PREFIX_TABLE (PREFIX_0F59) },
6470
    { PREFIX_TABLE (PREFIX_0F5A) },
6471
    { PREFIX_TABLE (PREFIX_0F5B) },
6472
    { PREFIX_TABLE (PREFIX_0F5C) },
6473
    { PREFIX_TABLE (PREFIX_0F5D) },
6474
    { PREFIX_TABLE (PREFIX_0F5E) },
6475
    { PREFIX_TABLE (PREFIX_0F5F) },
6476
    /* 60 */
6477
    { "vpunpcklbw", { XM, Vex, EXx }, PREFIX_DATA },
6478
    { "vpunpcklwd", { XM, Vex, EXx }, PREFIX_DATA },
6479
    { "vpunpckldq", { XM, Vex, EXx }, PREFIX_DATA },
6480
    { "vpacksswb",  { XM, Vex, EXx }, PREFIX_DATA },
6481
    { "vpcmpgtb", { XM, Vex, EXx }, PREFIX_DATA },
6482
    { "vpcmpgtw", { XM, Vex, EXx }, PREFIX_DATA },
6483
    { "vpcmpgtd", { XM, Vex, EXx }, PREFIX_DATA },
6484
    { "vpackuswb",  { XM, Vex, EXx }, PREFIX_DATA },
6485
    /* 68 */
6486
    { "vpunpckhbw", { XM, Vex, EXx }, PREFIX_DATA },
6487
    { "vpunpckhwd", { XM, Vex, EXx }, PREFIX_DATA },
6488
    { "vpunpckhdq", { XM, Vex, EXx }, PREFIX_DATA },
6489
    { "vpackssdw",  { XM, Vex, EXx }, PREFIX_DATA },
6490
    { "vpunpcklqdq",  { XM, Vex, EXx }, PREFIX_DATA },
6491
    { "vpunpckhqdq",  { XM, Vex, EXx }, PREFIX_DATA },
6492
    { VEX_LEN_TABLE (VEX_LEN_0F6E) },
6493
    { PREFIX_TABLE (PREFIX_VEX_0F6F) },
6494
    /* 70 */
6495
    { PREFIX_TABLE (PREFIX_VEX_0F70) },
6496
    { REG_TABLE (REG_VEX_0F71) },
6497
    { REG_TABLE (REG_VEX_0F72) },
6498
    { REG_TABLE (REG_VEX_0F73) },
6499
    { "vpcmpeqb", { XM, Vex, EXx }, PREFIX_DATA },
6500
    { "vpcmpeqw", { XM, Vex, EXx }, PREFIX_DATA },
6501
    { "vpcmpeqd", { XM, Vex, EXx }, PREFIX_DATA },
6502
    { VEX_LEN_TABLE (VEX_LEN_0F77) },
6503
    /* 78 */
6504
    { Bad_Opcode },
6505
    { Bad_Opcode },
6506
    { Bad_Opcode },
6507
    { Bad_Opcode },
6508
    { PREFIX_TABLE (PREFIX_0F7C) },
6509
    { PREFIX_TABLE (PREFIX_0F7D) },
6510
    { PREFIX_TABLE (PREFIX_VEX_0F7E) },
6511
    { PREFIX_TABLE (PREFIX_VEX_0F7F) },
6512
    /* 80 */
6513
    { Bad_Opcode },
6514
    { Bad_Opcode },
6515
    { Bad_Opcode },
6516
    { Bad_Opcode },
6517
    { Bad_Opcode },
6518
    { Bad_Opcode },
6519
    { Bad_Opcode },
6520
    { Bad_Opcode },
6521
    /* 88 */
6522
    { Bad_Opcode },
6523
    { Bad_Opcode },
6524
    { Bad_Opcode },
6525
    { Bad_Opcode },
6526
    { Bad_Opcode },
6527
    { Bad_Opcode },
6528
    { Bad_Opcode },
6529
    { Bad_Opcode },
6530
    /* 90 */
6531
    { VEX_LEN_TABLE (VEX_LEN_0F90) },
6532
    { VEX_LEN_TABLE (VEX_LEN_0F91) },
6533
    { VEX_LEN_TABLE (VEX_LEN_0F92) },
6534
    { VEX_LEN_TABLE (VEX_LEN_0F93) },
6535
    { Bad_Opcode },
6536
    { Bad_Opcode },
6537
    { Bad_Opcode },
6538
    { Bad_Opcode },
6539
    /* 98 */
6540
    { VEX_LEN_TABLE (VEX_LEN_0F98) },
6541
    { VEX_LEN_TABLE (VEX_LEN_0F99) },
6542
    { Bad_Opcode },
6543
    { Bad_Opcode },
6544
    { Bad_Opcode },
6545
    { Bad_Opcode },
6546
    { Bad_Opcode },
6547
    { Bad_Opcode },
6548
    /* a0 */
6549
    { Bad_Opcode },
6550
    { Bad_Opcode },
6551
    { Bad_Opcode },
6552
    { Bad_Opcode },
6553
    { Bad_Opcode },
6554
    { Bad_Opcode },
6555
    { Bad_Opcode },
6556
    { Bad_Opcode },
6557
    /* a8 */
6558
    { Bad_Opcode },
6559
    { Bad_Opcode },
6560
    { Bad_Opcode },
6561
    { Bad_Opcode },
6562
    { Bad_Opcode },
6563
    { Bad_Opcode },
6564
    { REG_TABLE (REG_VEX_0FAE) },
6565
    { Bad_Opcode },
6566
    /* b0 */
6567
    { Bad_Opcode },
6568
    { Bad_Opcode },
6569
    { Bad_Opcode },
6570
    { Bad_Opcode },
6571
    { Bad_Opcode },
6572
    { Bad_Opcode },
6573
    { Bad_Opcode },
6574
    { Bad_Opcode },
6575
    /* b8 */
6576
    { Bad_Opcode },
6577
    { Bad_Opcode },
6578
    { Bad_Opcode },
6579
    { Bad_Opcode },
6580
    { Bad_Opcode },
6581
    { Bad_Opcode },
6582
    { Bad_Opcode },
6583
    { Bad_Opcode },
6584
    /* c0 */
6585
    { Bad_Opcode },
6586
    { Bad_Opcode },
6587
    { PREFIX_TABLE (PREFIX_0FC2) },
6588
    { Bad_Opcode },
6589
    { VEX_LEN_TABLE (VEX_LEN_0FC4) },
6590
    { "vpextrw",  { Gd, Uxmm, Ib }, PREFIX_DATA },
6591
    { "vshufpX",  { XM, Vex, EXx, Ib }, PREFIX_OPCODE },
6592
    { Bad_Opcode },
6593
    /* c8 */
6594
    { Bad_Opcode },
6595
    { Bad_Opcode },
6596
    { Bad_Opcode },
6597
    { Bad_Opcode },
6598
    { Bad_Opcode },
6599
    { Bad_Opcode },
6600
    { Bad_Opcode },
6601
    { Bad_Opcode },
6602
    /* d0 */
6603
    { PREFIX_TABLE (PREFIX_0FD0) },
6604
    { "vpsrlw",   { XM, Vex, EXxmm }, PREFIX_DATA },
6605
    { "vpsrld",   { XM, Vex, EXxmm }, PREFIX_DATA },
6606
    { "vpsrlq",   { XM, Vex, EXxmm }, PREFIX_DATA },
6607
    { "vpaddq",   { XM, Vex, EXx }, PREFIX_DATA },
6608
    { "vpmullw",  { XM, Vex, EXx }, PREFIX_DATA },
6609
    { VEX_LEN_TABLE (VEX_LEN_0FD6) },
6610
    { "vpmovmskb",  { Gdq, Ux }, PREFIX_DATA },
6611
    /* d8 */
6612
    { "vpsubusb", { XM, Vex, EXx }, PREFIX_DATA },
6613
    { "vpsubusw", { XM, Vex, EXx }, PREFIX_DATA },
6614
    { "vpminub",  { XM, Vex, EXx }, PREFIX_DATA },
6615
    { "vpand",    { XM, Vex, EXx }, PREFIX_DATA },
6616
    { "vpaddusb", { XM, Vex, EXx }, PREFIX_DATA },
6617
    { "vpaddusw", { XM, Vex, EXx }, PREFIX_DATA },
6618
    { "vpmaxub",  { XM, Vex, EXx }, PREFIX_DATA },
6619
    { "vpandn",   { XM, Vex, EXx }, PREFIX_DATA },
6620
    /* e0 */
6621
    { "vpavgb",   { XM, Vex, EXx }, PREFIX_DATA },
6622
    { "vpsraw",   { XM, Vex, EXxmm }, PREFIX_DATA },
6623
    { "vpsrad",   { XM, Vex, EXxmm }, PREFIX_DATA },
6624
    { "vpavgw",   { XM, Vex, EXx }, PREFIX_DATA },
6625
    { "vpmulhuw", { XM, Vex, EXx }, PREFIX_DATA },
6626
    { "vpmulhw",  { XM, Vex, EXx }, PREFIX_DATA },
6627
    { PREFIX_TABLE (PREFIX_0FE6) },
6628
    { "vmovntdq", { Mx, XM }, PREFIX_DATA },
6629
    /* e8 */
6630
    { "vpsubsb",  { XM, Vex, EXx }, PREFIX_DATA },
6631
    { "vpsubsw",  { XM, Vex, EXx }, PREFIX_DATA },
6632
    { "vpminsw",  { XM, Vex, EXx }, PREFIX_DATA },
6633
    { "vpor",   { XM, Vex, EXx }, PREFIX_DATA },
6634
    { "vpaddsb",  { XM, Vex, EXx }, PREFIX_DATA },
6635
    { "vpaddsw",  { XM, Vex, EXx }, PREFIX_DATA },
6636
    { "vpmaxsw",  { XM, Vex, EXx }, PREFIX_DATA },
6637
    { "vpxor",    { XM, Vex, EXx }, PREFIX_DATA },
6638
    /* f0 */
6639
    { PREFIX_TABLE (PREFIX_0FF0) },
6640
    { "vpsllw",   { XM, Vex, EXxmm }, PREFIX_DATA },
6641
    { "vpslld",   { XM, Vex, EXxmm }, PREFIX_DATA },
6642
    { "vpsllq",   { XM, Vex, EXxmm }, PREFIX_DATA },
6643
    { "vpmuludq", { XM, Vex, EXx }, PREFIX_DATA },
6644
    { "vpmaddwd", { XM, Vex, EXx }, PREFIX_DATA },
6645
    { "vpsadbw",  { XM, Vex, EXx }, PREFIX_DATA },
6646
    { "vmaskmovdqu",  { XM, Uxmm }, PREFIX_DATA },
6647
    /* f8 */
6648
    { "vpsubb",   { XM, Vex, EXx }, PREFIX_DATA },
6649
    { "vpsubw",   { XM, Vex, EXx }, PREFIX_DATA },
6650
    { "vpsubd",   { XM, Vex, EXx }, PREFIX_DATA },
6651
    { "vpsubq",   { XM, Vex, EXx }, PREFIX_DATA },
6652
    { "vpaddb",   { XM, Vex, EXx }, PREFIX_DATA },
6653
    { "vpaddw",   { XM, Vex, EXx }, PREFIX_DATA },
6654
    { "vpaddd",   { XM, Vex, EXx }, PREFIX_DATA },
6655
    { Bad_Opcode },
6656
  },
6657
  /* VEX_0F38 */
6658
  {
6659
    /* 00 */
6660
    { "vpshufb",  { XM, Vex, EXx }, PREFIX_DATA },
6661
    { "vphaddw",  { XM, Vex, EXx }, PREFIX_DATA },
6662
    { "vphaddd",  { XM, Vex, EXx }, PREFIX_DATA },
6663
    { "vphaddsw", { XM, Vex, EXx }, PREFIX_DATA },
6664
    { "vpmaddubsw", { XM, Vex, EXx }, PREFIX_DATA },
6665
    { "vphsubw",  { XM, Vex, EXx }, PREFIX_DATA },
6666
    { "vphsubd",  { XM, Vex, EXx }, PREFIX_DATA },
6667
    { "vphsubsw", { XM, Vex, EXx }, PREFIX_DATA },
6668
    /* 08 */
6669
    { "vpsignb",  { XM, Vex, EXx }, PREFIX_DATA },
6670
    { "vpsignw",  { XM, Vex, EXx }, PREFIX_DATA },
6671
    { "vpsignd",  { XM, Vex, EXx }, PREFIX_DATA },
6672
    { "vpmulhrsw",  { XM, Vex, EXx }, PREFIX_DATA },
6673
    { VEX_W_TABLE (VEX_W_0F380C) },
6674
    { VEX_W_TABLE (VEX_W_0F380D) },
6675
    { VEX_W_TABLE (VEX_W_0F380E) },
6676
    { VEX_W_TABLE (VEX_W_0F380F) },
6677
    /* 10 */
6678
    { Bad_Opcode },
6679
    { Bad_Opcode },
6680
    { Bad_Opcode },
6681
    { VEX_W_TABLE (VEX_W_0F3813) },
6682
    { Bad_Opcode },
6683
    { Bad_Opcode },
6684
    { VEX_LEN_TABLE (VEX_LEN_0F3816) },
6685
    { "vptest",   { XM, EXx }, PREFIX_DATA },
6686
    /* 18 */
6687
    { VEX_W_TABLE (VEX_W_0F3818) },
6688
    { VEX_LEN_TABLE (VEX_LEN_0F3819) },
6689
    { VEX_LEN_TABLE (VEX_LEN_0F381A) },
6690
    { Bad_Opcode },
6691
    { "vpabsb",   { XM, EXx }, PREFIX_DATA },
6692
    { "vpabsw",   { XM, EXx }, PREFIX_DATA },
6693
    { "vpabsd",   { XM, EXx }, PREFIX_DATA },
6694
    { Bad_Opcode },
6695
    /* 20 */
6696
    { "vpmovsxbw",  { XM, EXxmmq }, PREFIX_DATA },
6697
    { "vpmovsxbd",  { XM, EXxmmqd }, PREFIX_DATA },
6698
    { "vpmovsxbq",  { XM, EXxmmdw }, PREFIX_DATA },
6699
    { "vpmovsxwd",  { XM, EXxmmq }, PREFIX_DATA },
6700
    { "vpmovsxwq",  { XM, EXxmmqd }, PREFIX_DATA },
6701
    { "vpmovsxdq",  { XM, EXxmmq }, PREFIX_DATA },
6702
    { Bad_Opcode },
6703
    { Bad_Opcode },
6704
    /* 28 */
6705
    { "vpmuldq",  { XM, Vex, EXx }, PREFIX_DATA },
6706
    { "vpcmpeqq", { XM, Vex, EXx }, PREFIX_DATA },
6707
    { "vmovntdqa",  { XM, Mx }, PREFIX_DATA },
6708
    { "vpackusdw",  { XM, Vex, EXx }, PREFIX_DATA },
6709
    { VEX_W_TABLE (VEX_W_0F382C) },
6710
    { VEX_W_TABLE (VEX_W_0F382D) },
6711
    { VEX_W_TABLE (VEX_W_0F382E) },
6712
    { VEX_W_TABLE (VEX_W_0F382F) },
6713
    /* 30 */
6714
    { "vpmovzxbw",  { XM, EXxmmq }, PREFIX_DATA },
6715
    { "vpmovzxbd",  { XM, EXxmmqd }, PREFIX_DATA },
6716
    { "vpmovzxbq",  { XM, EXxmmdw }, PREFIX_DATA },
6717
    { "vpmovzxwd",  { XM, EXxmmq }, PREFIX_DATA },
6718
    { "vpmovzxwq",  { XM, EXxmmqd }, PREFIX_DATA },
6719
    { "vpmovzxdq",  { XM, EXxmmq }, PREFIX_DATA },
6720
    { VEX_LEN_TABLE (VEX_LEN_0F3836) },
6721
    { "vpcmpgtq", { XM, Vex, EXx }, PREFIX_DATA },
6722
    /* 38 */
6723
    { "vpminsb",  { XM, Vex, EXx }, PREFIX_DATA },
6724
    { "vpminsd",  { XM, Vex, EXx }, PREFIX_DATA },
6725
    { "vpminuw",  { XM, Vex, EXx }, PREFIX_DATA },
6726
    { "vpminud",  { XM, Vex, EXx }, PREFIX_DATA },
6727
    { "vpmaxsb",  { XM, Vex, EXx }, PREFIX_DATA },
6728
    { "vpmaxsd",  { XM, Vex, EXx }, PREFIX_DATA },
6729
    { "vpmaxuw",  { XM, Vex, EXx }, PREFIX_DATA },
6730
    { "vpmaxud",  { XM, Vex, EXx }, PREFIX_DATA },
6731
    /* 40 */
6732
    { "vpmulld",  { XM, Vex, EXx }, PREFIX_DATA },
6733
    { VEX_LEN_TABLE (VEX_LEN_0F3841) },
6734
    { Bad_Opcode },
6735
    { Bad_Opcode },
6736
    { Bad_Opcode },
6737
    { "vpsrlv%DQ", { XM, Vex, EXx }, PREFIX_DATA },
6738
    { VEX_W_TABLE (VEX_W_0F3846) },
6739
    { "vpsllv%DQ", { XM, Vex, EXx }, PREFIX_DATA },
6740
    /* 48 */
6741
    { X86_64_TABLE (X86_64_VEX_0F3848) },
6742
    { X86_64_TABLE (X86_64_VEX_0F3849) },
6743
    { X86_64_TABLE (X86_64_VEX_0F384A) },
6744
    { X86_64_TABLE (X86_64_VEX_0F384B) },
6745
    { Bad_Opcode },
6746
    { Bad_Opcode },
6747
    { Bad_Opcode },
6748
    { Bad_Opcode },
6749
    /* 50 */
6750
    { VEX_W_TABLE (VEX_W_0F3850) },
6751
    { VEX_W_TABLE (VEX_W_0F3851) },
6752
    { VEX_W_TABLE (VEX_W_0F3852) },
6753
    { VEX_W_TABLE (VEX_W_0F3853) },
6754
    { Bad_Opcode },
6755
    { Bad_Opcode },
6756
    { Bad_Opcode },
6757
    { Bad_Opcode },
6758
    /* 58 */
6759
    { VEX_W_TABLE (VEX_W_0F3858) },
6760
    { VEX_W_TABLE (VEX_W_0F3859) },
6761
    { VEX_LEN_TABLE (VEX_LEN_0F385A) },
6762
    { Bad_Opcode },
6763
    { X86_64_TABLE (X86_64_VEX_0F385C) },
6764
    { Bad_Opcode },
6765
    { X86_64_TABLE (X86_64_VEX_0F385E) },
6766
    { X86_64_TABLE (X86_64_VEX_0F385F) },
6767
    /* 60 */
6768
    { Bad_Opcode },
6769
    { Bad_Opcode },
6770
    { Bad_Opcode },
6771
    { Bad_Opcode },
6772
    { Bad_Opcode },
6773
    { Bad_Opcode },
6774
    { Bad_Opcode },
6775
    { Bad_Opcode },
6776
    /* 68 */
6777
    { Bad_Opcode },
6778
    { Bad_Opcode },
6779
    { Bad_Opcode },
6780
    { X86_64_TABLE (X86_64_VEX_0F386B) },
6781
    { X86_64_TABLE (X86_64_VEX_0F386C) },
6782
    { Bad_Opcode },
6783
    { X86_64_TABLE (X86_64_VEX_0F386E) },
6784
    { X86_64_TABLE (X86_64_VEX_0F386F) },
6785
    /* 70 */
6786
    { Bad_Opcode },
6787
    { Bad_Opcode },
6788
    { PREFIX_TABLE (PREFIX_VEX_0F3872) },
6789
    { Bad_Opcode },
6790
    { Bad_Opcode },
6791
    { Bad_Opcode },
6792
    { Bad_Opcode },
6793
    { Bad_Opcode },
6794
    /* 78 */
6795
    { VEX_W_TABLE (VEX_W_0F3878) },
6796
    { VEX_W_TABLE (VEX_W_0F3879) },
6797
    { Bad_Opcode },
6798
    { Bad_Opcode },
6799
    { Bad_Opcode },
6800
    { Bad_Opcode },
6801
    { Bad_Opcode },
6802
    { Bad_Opcode },
6803
    /* 80 */
6804
    { Bad_Opcode },
6805
    { Bad_Opcode },
6806
    { Bad_Opcode },
6807
    { Bad_Opcode },
6808
    { Bad_Opcode },
6809
    { Bad_Opcode },
6810
    { Bad_Opcode },
6811
    { Bad_Opcode },
6812
    /* 88 */
6813
    { Bad_Opcode },
6814
    { Bad_Opcode },
6815
    { Bad_Opcode },
6816
    { Bad_Opcode },
6817
    { "vpmaskmov%DQ", { XM, Vex, Mx }, PREFIX_DATA },
6818
    { Bad_Opcode },
6819
    { "vpmaskmov%DQ", { Mx, Vex, XM }, PREFIX_DATA },
6820
    { Bad_Opcode },
6821
    /* 90 */
6822
    { "vpgatherd%DQ", { XM, MVexVSIBDWpX, VexGatherD }, PREFIX_DATA },
6823
    { "vpgatherq%DQ", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, PREFIX_DATA },
6824
    { "vgatherdp%XW", { XM, MVexVSIBDWpX, VexGatherD }, PREFIX_DATA },
6825
    { "vgatherqp%XW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, PREFIX_DATA },
6826
    { Bad_Opcode },
6827
    { Bad_Opcode },
6828
    { "vfmaddsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6829
    { "vfmsubadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6830
    /* 98 */
6831
    { "vfmadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6832
    { "vfmadd132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6833
    { "vfmsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6834
    { "vfmsub132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6835
    { "vfnmadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6836
    { "vfnmadd132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6837
    { "vfnmsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6838
    { "vfnmsub132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6839
    /* a0 */
6840
    { Bad_Opcode },
6841
    { Bad_Opcode },
6842
    { Bad_Opcode },
6843
    { Bad_Opcode },
6844
    { Bad_Opcode },
6845
    { Bad_Opcode },
6846
    { "vfmaddsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6847
    { "vfmsubadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6848
    /* a8 */
6849
    { "vfmadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6850
    { "vfmadd213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6851
    { "vfmsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6852
    { "vfmsub213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6853
    { "vfnmadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6854
    { "vfnmadd213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6855
    { "vfnmsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6856
    { "vfnmsub213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6857
    /* b0 */
6858
    { VEX_W_TABLE (VEX_W_0F38B0) },
6859
    { VEX_W_TABLE (VEX_W_0F38B1) },
6860
    { Bad_Opcode },
6861
    { Bad_Opcode },
6862
    { VEX_W_TABLE (VEX_W_0F38B4) },
6863
    { VEX_W_TABLE (VEX_W_0F38B5) },
6864
    { "vfmaddsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6865
    { "vfmsubadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6866
    /* b8 */
6867
    { "vfmadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6868
    { "vfmadd231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6869
    { "vfmsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6870
    { "vfmsub231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6871
    { "vfnmadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6872
    { "vfnmadd231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6873
    { "vfnmsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6874
    { "vfnmsub231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6875
    /* c0 */
6876
    { Bad_Opcode },
6877
    { Bad_Opcode },
6878
    { Bad_Opcode },
6879
    { Bad_Opcode },
6880
    { Bad_Opcode },
6881
    { Bad_Opcode },
6882
    { Bad_Opcode },
6883
    { Bad_Opcode },
6884
    /* c8 */
6885
    { Bad_Opcode },
6886
    { Bad_Opcode },
6887
    { Bad_Opcode },
6888
    { PREFIX_TABLE (PREFIX_VEX_0F38CB) },
6889
    { PREFIX_TABLE (PREFIX_VEX_0F38CC) },
6890
    { PREFIX_TABLE (PREFIX_VEX_0F38CD) },
6891
    { Bad_Opcode },
6892
    { VEX_W_TABLE (VEX_W_0F38CF) },
6893
    /* d0 */
6894
    { Bad_Opcode },
6895
    { Bad_Opcode },
6896
    { VEX_W_TABLE (VEX_W_0F38D2) },
6897
    { VEX_W_TABLE (VEX_W_0F38D3) },
6898
    { Bad_Opcode },
6899
    { Bad_Opcode },
6900
    { Bad_Opcode },
6901
    { Bad_Opcode },
6902
    /* d8 */
6903
    { Bad_Opcode },
6904
    { Bad_Opcode },
6905
    { VEX_W_TABLE (VEX_W_0F38DA) },
6906
    { VEX_LEN_TABLE (VEX_LEN_0F38DB) },
6907
    { "vaesenc",  { XM, Vex, EXx }, PREFIX_DATA },
6908
    { "vaesenclast",  { XM, Vex, EXx }, PREFIX_DATA },
6909
    { "vaesdec",  { XM, Vex, EXx }, PREFIX_DATA },
6910
    { "vaesdeclast",  { XM, Vex, EXx }, PREFIX_DATA },
6911
    /* e0 */
6912
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6913
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6914
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6915
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6916
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6917
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6918
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6919
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6920
    /* e8 */
6921
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6922
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6923
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6924
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6925
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6926
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6927
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6928
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6929
    /* f0 */
6930
    { Bad_Opcode },
6931
    { Bad_Opcode },
6932
    { VEX_LEN_TABLE (VEX_LEN_0F38F2) },
6933
    { VEX_LEN_TABLE (VEX_LEN_0F38F3) },
6934
    { Bad_Opcode },
6935
    { VEX_LEN_TABLE (VEX_LEN_0F38F5) },
6936
    { VEX_LEN_TABLE (VEX_LEN_0F38F6) },
6937
    { VEX_LEN_TABLE (VEX_LEN_0F38F7) },
6938
    /* f8 */
6939
    { Bad_Opcode },
6940
    { Bad_Opcode },
6941
    { Bad_Opcode },
6942
    { Bad_Opcode },
6943
    { Bad_Opcode },
6944
    { Bad_Opcode },
6945
    { Bad_Opcode },
6946
    { Bad_Opcode },
6947
  },
6948
  /* VEX_0F3A */
6949
  {
6950
    /* 00 */
6951
    { VEX_LEN_TABLE (VEX_LEN_0F3A00) },
6952
    { VEX_LEN_TABLE (VEX_LEN_0F3A01) },
6953
    { VEX_W_TABLE (VEX_W_0F3A02) },
6954
    { Bad_Opcode },
6955
    { VEX_W_TABLE (VEX_W_0F3A04) },
6956
    { VEX_W_TABLE (VEX_W_0F3A05) },
6957
    { VEX_LEN_TABLE (VEX_LEN_0F3A06) },
6958
    { Bad_Opcode },
6959
    /* 08 */
6960
    { "vroundps", { XM, EXx, Ib }, PREFIX_DATA },
6961
    { "vroundpd", { XM, EXx, Ib }, PREFIX_DATA },
6962
    { "vroundss", { XMScalar, VexScalar, EXd, Ib }, PREFIX_DATA },
6963
    { "vroundsd", { XMScalar, VexScalar, EXq, Ib }, PREFIX_DATA },
6964
    { "vblendps", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6965
    { "vblendpd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6966
    { "vpblendw", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6967
    { "vpalignr", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6968
    /* 10 */
6969
    { Bad_Opcode },
6970
    { Bad_Opcode },
6971
    { Bad_Opcode },
6972
    { Bad_Opcode },
6973
    { VEX_LEN_TABLE (VEX_LEN_0F3A14) },
6974
    { VEX_LEN_TABLE (VEX_LEN_0F3A15) },
6975
    { VEX_LEN_TABLE (VEX_LEN_0F3A16) },
6976
    { VEX_LEN_TABLE (VEX_LEN_0F3A17) },
6977
    /* 18 */
6978
    { VEX_LEN_TABLE (VEX_LEN_0F3A18) },
6979
    { VEX_LEN_TABLE (VEX_LEN_0F3A19) },
6980
    { Bad_Opcode },
6981
    { Bad_Opcode },
6982
    { Bad_Opcode },
6983
    { VEX_W_TABLE (VEX_W_0F3A1D) },
6984
    { Bad_Opcode },
6985
    { Bad_Opcode },
6986
    /* 20 */
6987
    { VEX_LEN_TABLE (VEX_LEN_0F3A20) },
6988
    { VEX_LEN_TABLE (VEX_LEN_0F3A21) },
6989
    { VEX_LEN_TABLE (VEX_LEN_0F3A22) },
6990
    { Bad_Opcode },
6991
    { Bad_Opcode },
6992
    { Bad_Opcode },
6993
    { Bad_Opcode },
6994
    { Bad_Opcode },
6995
    /* 28 */
6996
    { Bad_Opcode },
6997
    { Bad_Opcode },
6998
    { Bad_Opcode },
6999
    { Bad_Opcode },
7000
    { Bad_Opcode },
7001
    { Bad_Opcode },
7002
    { Bad_Opcode },
7003
    { Bad_Opcode },
7004
    /* 30 */
7005
    { VEX_LEN_TABLE (VEX_LEN_0F3A30) },
7006
    { VEX_LEN_TABLE (VEX_LEN_0F3A31) },
7007
    { VEX_LEN_TABLE (VEX_LEN_0F3A32) },
7008
    { VEX_LEN_TABLE (VEX_LEN_0F3A33) },
7009
    { Bad_Opcode },
7010
    { Bad_Opcode },
7011
    { Bad_Opcode },
7012
    { Bad_Opcode },
7013
    /* 38 */
7014
    { VEX_LEN_TABLE (VEX_LEN_0F3A38) },
7015
    { VEX_LEN_TABLE (VEX_LEN_0F3A39) },
7016
    { Bad_Opcode },
7017
    { Bad_Opcode },
7018
    { Bad_Opcode },
7019
    { Bad_Opcode },
7020
    { Bad_Opcode },
7021
    { Bad_Opcode },
7022
    /* 40 */
7023
    { "vdpps",    { XM, Vex, EXx, Ib }, PREFIX_DATA },
7024
    { VEX_LEN_TABLE (VEX_LEN_0F3A41) },
7025
    { "vmpsadbw", { XM, Vex, EXx, Ib }, PREFIX_DATA },
7026
    { Bad_Opcode },
7027
    { "vpclmulqdq", { XM, Vex, EXx, PCLMUL }, PREFIX_DATA },
7028
    { Bad_Opcode },
7029
    { VEX_LEN_TABLE (VEX_LEN_0F3A46) },
7030
    { Bad_Opcode },
7031
    /* 48 */
7032
    { "vpermil2ps", { XM, Vex, EXx, XMVexI4, VexI4 }, PREFIX_DATA },
7033
    { "vpermil2pd", { XM, Vex, EXx, XMVexI4, VexI4 }, PREFIX_DATA },
7034
    { VEX_W_TABLE (VEX_W_0F3A4A) },
7035
    { VEX_W_TABLE (VEX_W_0F3A4B) },
7036
    { VEX_W_TABLE (VEX_W_0F3A4C) },
7037
    { Bad_Opcode },
7038
    { Bad_Opcode },
7039
    { Bad_Opcode },
7040
    /* 50 */
7041
    { Bad_Opcode },
7042
    { Bad_Opcode },
7043
    { Bad_Opcode },
7044
    { Bad_Opcode },
7045
    { Bad_Opcode },
7046
    { Bad_Opcode },
7047
    { Bad_Opcode },
7048
    { Bad_Opcode },
7049
    /* 58 */
7050
    { Bad_Opcode },
7051
    { Bad_Opcode },
7052
    { Bad_Opcode },
7053
    { Bad_Opcode },
7054
    { "vfmaddsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7055
    { "vfmaddsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7056
    { "vfmsubaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7057
    { "vfmsubaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7058
    /* 60 */
7059
    { VEX_LEN_TABLE (VEX_LEN_0F3A60) },
7060
    { VEX_LEN_TABLE (VEX_LEN_0F3A61) },
7061
    { VEX_LEN_TABLE (VEX_LEN_0F3A62) },
7062
    { VEX_LEN_TABLE (VEX_LEN_0F3A63) },
7063
    { Bad_Opcode },
7064
    { Bad_Opcode },
7065
    { Bad_Opcode },
7066
    { Bad_Opcode },
7067
    /* 68 */
7068
    { "vfmaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7069
    { "vfmaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7070
    { "vfmaddss", { XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA },
7071
    { "vfmaddsd", { XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA },
7072
    { "vfmsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7073
    { "vfmsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7074
    { "vfmsubss", { XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA },
7075
    { "vfmsubsd", { XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA },
7076
    /* 70 */
7077
    { Bad_Opcode },
7078
    { Bad_Opcode },
7079
    { Bad_Opcode },
7080
    { Bad_Opcode },
7081
    { Bad_Opcode },
7082
    { Bad_Opcode },
7083
    { Bad_Opcode },
7084
    { Bad_Opcode },
7085
    /* 78 */
7086
    { "vfnmaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7087
    { "vfnmaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7088
    { "vfnmaddss",  { XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA },
7089
    { "vfnmaddsd",  { XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA },
7090
    { "vfnmsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7091
    { "vfnmsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7092
    { "vfnmsubss",  { XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA },
7093
    { "vfnmsubsd",  { XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA },
7094
    /* 80 */
7095
    { Bad_Opcode },
7096
    { Bad_Opcode },
7097
    { Bad_Opcode },
7098
    { Bad_Opcode },
7099
    { Bad_Opcode },
7100
    { Bad_Opcode },
7101
    { Bad_Opcode },
7102
    { Bad_Opcode },
7103
    /* 88 */
7104
    { Bad_Opcode },
7105
    { Bad_Opcode },
7106
    { Bad_Opcode },
7107
    { Bad_Opcode },
7108
    { Bad_Opcode },
7109
    { Bad_Opcode },
7110
    { Bad_Opcode },
7111
    { Bad_Opcode },
7112
    /* 90 */
7113
    { Bad_Opcode },
7114
    { Bad_Opcode },
7115
    { Bad_Opcode },
7116
    { Bad_Opcode },
7117
    { Bad_Opcode },
7118
    { Bad_Opcode },
7119
    { Bad_Opcode },
7120
    { Bad_Opcode },
7121
    /* 98 */
7122
    { Bad_Opcode },
7123
    { Bad_Opcode },
7124
    { Bad_Opcode },
7125
    { Bad_Opcode },
7126
    { Bad_Opcode },
7127
    { Bad_Opcode },
7128
    { Bad_Opcode },
7129
    { Bad_Opcode },
7130
    /* a0 */
7131
    { Bad_Opcode },
7132
    { Bad_Opcode },
7133
    { Bad_Opcode },
7134
    { Bad_Opcode },
7135
    { Bad_Opcode },
7136
    { Bad_Opcode },
7137
    { Bad_Opcode },
7138
    { Bad_Opcode },
7139
    /* a8 */
7140
    { Bad_Opcode },
7141
    { Bad_Opcode },
7142
    { Bad_Opcode },
7143
    { Bad_Opcode },
7144
    { Bad_Opcode },
7145
    { Bad_Opcode },
7146
    { Bad_Opcode },
7147
    { Bad_Opcode },
7148
    /* b0 */
7149
    { Bad_Opcode },
7150
    { Bad_Opcode },
7151
    { Bad_Opcode },
7152
    { Bad_Opcode },
7153
    { Bad_Opcode },
7154
    { Bad_Opcode },
7155
    { Bad_Opcode },
7156
    { Bad_Opcode },
7157
    /* b8 */
7158
    { Bad_Opcode },
7159
    { Bad_Opcode },
7160
    { Bad_Opcode },
7161
    { Bad_Opcode },
7162
    { Bad_Opcode },
7163
    { Bad_Opcode },
7164
    { Bad_Opcode },
7165
    { Bad_Opcode },
7166
    /* c0 */
7167
    { Bad_Opcode },
7168
    { Bad_Opcode },
7169
    { Bad_Opcode },
7170
    { Bad_Opcode },
7171
    { Bad_Opcode },
7172
    { Bad_Opcode },
7173
    { Bad_Opcode },
7174
    { Bad_Opcode },
7175
    /* c8 */
7176
    { Bad_Opcode },
7177
    { Bad_Opcode },
7178
    { Bad_Opcode },
7179
    { Bad_Opcode },
7180
    { Bad_Opcode },
7181
    { Bad_Opcode },
7182
    { VEX_W_TABLE (VEX_W_0F3ACE) },
7183
    { VEX_W_TABLE (VEX_W_0F3ACF) },
7184
    /* d0 */
7185
    { Bad_Opcode },
7186
    { Bad_Opcode },
7187
    { Bad_Opcode },
7188
    { Bad_Opcode },
7189
    { Bad_Opcode },
7190
    { Bad_Opcode },
7191
    { Bad_Opcode },
7192
    { Bad_Opcode },
7193
    /* d8 */
7194
    { Bad_Opcode },
7195
    { Bad_Opcode },
7196
    { Bad_Opcode },
7197
    { Bad_Opcode },
7198
    { Bad_Opcode },
7199
    { Bad_Opcode },
7200
    { VEX_W_TABLE (VEX_W_0F3ADE) },
7201
    { VEX_LEN_TABLE (VEX_LEN_0F3ADF) },
7202
    /* e0 */
7203
    { Bad_Opcode },
7204
    { Bad_Opcode },
7205
    { Bad_Opcode },
7206
    { Bad_Opcode },
7207
    { Bad_Opcode },
7208
    { Bad_Opcode },
7209
    { Bad_Opcode },
7210
    { Bad_Opcode },
7211
    /* e8 */
7212
    { Bad_Opcode },
7213
    { Bad_Opcode },
7214
    { Bad_Opcode },
7215
    { Bad_Opcode },
7216
    { Bad_Opcode },
7217
    { Bad_Opcode },
7218
    { Bad_Opcode },
7219
    { Bad_Opcode },
7220
    /* f0 */
7221
    { VEX_LEN_TABLE (VEX_LEN_0F3AF0) },
7222
    { Bad_Opcode },
7223
    { Bad_Opcode },
7224
    { Bad_Opcode },
7225
    { Bad_Opcode },
7226
    { Bad_Opcode },
7227
    { Bad_Opcode },
7228
    { Bad_Opcode },
7229
    /* f8 */
7230
    { Bad_Opcode },
7231
    { Bad_Opcode },
7232
    { Bad_Opcode },
7233
    { Bad_Opcode },
7234
    { Bad_Opcode },
7235
    { Bad_Opcode },
7236
    { Bad_Opcode },
7237
    { Bad_Opcode },
7238
  },
7239
};
7240
7241
#include "i386-dis-evex.h"
7242
7243
static const struct dis386 vex_len_table[][2] = {
7244
  /* VEX_LEN_0F12_P_0 */
7245
  {
7246
    { MOD_TABLE (MOD_0F12_PREFIX_0) },
7247
  },
7248
7249
  /* VEX_LEN_0F12_P_2 */
7250
  {
7251
    { "%XEVmovlpYX",  { XM, Vex, Mq }, 0 },
7252
  },
7253
7254
  /* VEX_LEN_0F13 */
7255
  {
7256
    { "%XEVmovlpYX",  { Mq, XM }, PREFIX_OPCODE },
7257
  },
7258
7259
  /* VEX_LEN_0F16_P_0 */
7260
  {
7261
    { MOD_TABLE (MOD_0F16_PREFIX_0) },
7262
  },
7263
7264
  /* VEX_LEN_0F16_P_2 */
7265
  {
7266
    { "%XEVmovhpYX",  { XM, Vex, Mq }, 0 },
7267
  },
7268
7269
  /* VEX_LEN_0F17 */
7270
  {
7271
    { "%XEVmovhpYX",  { Mq, XM }, PREFIX_OPCODE },
7272
  },
7273
7274
  /* VEX_LEN_0F41 */
7275
  {
7276
    { Bad_Opcode },
7277
    { VEX_W_TABLE (VEX_W_0F41_L_1) },
7278
  },
7279
7280
  /* VEX_LEN_0F42 */
7281
  {
7282
    { Bad_Opcode },
7283
    { VEX_W_TABLE (VEX_W_0F42_L_1) },
7284
  },
7285
7286
  /* VEX_LEN_0F44 */
7287
  {
7288
    { VEX_W_TABLE (VEX_W_0F44_L_0) },
7289
  },
7290
7291
  /* VEX_LEN_0F45 */
7292
  {
7293
    { Bad_Opcode },
7294
    { VEX_W_TABLE (VEX_W_0F45_L_1) },
7295
  },
7296
7297
  /* VEX_LEN_0F46 */
7298
  {
7299
    { Bad_Opcode },
7300
    { VEX_W_TABLE (VEX_W_0F46_L_1) },
7301
  },
7302
7303
  /* VEX_LEN_0F47 */
7304
  {
7305
    { Bad_Opcode },
7306
    { VEX_W_TABLE (VEX_W_0F47_L_1) },
7307
  },
7308
7309
  /* VEX_LEN_0F4A */
7310
  {
7311
    { Bad_Opcode },
7312
    { VEX_W_TABLE (VEX_W_0F4A_L_1) },
7313
  },
7314
7315
  /* VEX_LEN_0F4B */
7316
  {
7317
    { Bad_Opcode },
7318
    { VEX_W_TABLE (VEX_W_0F4B_L_1) },
7319
  },
7320
7321
  /* VEX_LEN_0F6E */
7322
  {
7323
    { "%XEvmovYK",  { XMScalar, Edq }, PREFIX_DATA },
7324
  },
7325
7326
  /* VEX_LEN_0F77 */
7327
  {
7328
    { "vzeroupper", { XX }, 0 },
7329
    { "vzeroall", { XX }, 0 },
7330
  },
7331
7332
  /* VEX_LEN_0F7E_P_1 */
7333
  {
7334
    { "%XEvmovqY",  { XMScalar, EXq }, 0 },
7335
  },
7336
7337
  /* VEX_LEN_0F7E_P_2 */
7338
  {
7339
    { "%XEvmovK", { Edq, XMScalar }, 0 },
7340
  },
7341
7342
  /* VEX_LEN_0F90 */
7343
  {
7344
    { VEX_W_TABLE (VEX_W_0F90_L_0) },
7345
  },
7346
7347
  /* VEX_LEN_0F91 */
7348
  {
7349
    { VEX_W_TABLE (VEX_W_0F91_L_0) },
7350
  },
7351
7352
  /* VEX_LEN_0F92 */
7353
  {
7354
    { VEX_W_TABLE (VEX_W_0F92_L_0) },
7355
  },
7356
7357
  /* VEX_LEN_0F93 */
7358
  {
7359
    { VEX_W_TABLE (VEX_W_0F93_L_0) },
7360
  },
7361
7362
  /* VEX_LEN_0F98 */
7363
  {
7364
    { VEX_W_TABLE (VEX_W_0F98_L_0) },
7365
  },
7366
7367
  /* VEX_LEN_0F99 */
7368
  {
7369
    { VEX_W_TABLE (VEX_W_0F99_L_0) },
7370
  },
7371
7372
  /* VEX_LEN_0FAE_R_2 */
7373
  {
7374
    { "vldmxcsr", { Md }, 0 },
7375
  },
7376
7377
  /* VEX_LEN_0FAE_R_3 */
7378
  {
7379
    { "vstmxcsr", { Md }, 0 },
7380
  },
7381
7382
  /* VEX_LEN_0FC4 */
7383
  {
7384
    { "%XEvpinsrwY",  { XM, Vex, Edw, Ib }, PREFIX_DATA },
7385
  },
7386
7387
  /* VEX_LEN_0FD6 */
7388
  {
7389
    { "%XEvmovqY",  { EXqS, XMScalar }, PREFIX_DATA },
7390
  },
7391
7392
  /* VEX_LEN_0F3816 */
7393
  {
7394
    { Bad_Opcode },
7395
    { VEX_W_TABLE (VEX_W_0F3816_L_1) },
7396
  },
7397
7398
  /* VEX_LEN_0F3819 */
7399
  {
7400
    { Bad_Opcode },
7401
    { VEX_W_TABLE (VEX_W_0F3819_L_1) },
7402
  },
7403
7404
  /* VEX_LEN_0F381A */
7405
  {
7406
    { Bad_Opcode },
7407
    { VEX_W_TABLE (VEX_W_0F381A_L_1) },
7408
  },
7409
7410
  /* VEX_LEN_0F3836 */
7411
  {
7412
    { Bad_Opcode },
7413
    { VEX_W_TABLE (VEX_W_0F3836) },
7414
  },
7415
7416
  /* VEX_LEN_0F3841 */
7417
  {
7418
    { "vphminposuw",  { XM, EXx }, PREFIX_DATA },
7419
  },
7420
7421
  /* VEX_LEN_0F3848_X86_64 */
7422
  {
7423
    { VEX_W_TABLE (VEX_W_0F3848_X86_64_L_0) },
7424
  },
7425
7426
  /* VEX_LEN_0F3849_X86_64 */
7427
  {
7428
    { VEX_W_TABLE (VEX_W_0F3849_X86_64_L_0) },
7429
  },
7430
7431
  /* VEX_LEN_0F384A_X86_64_W_0 */
7432
  {
7433
    { PREFIX_TABLE (PREFIX_VEX_0F384A_X86_64_W_0_L_0) },
7434
  },
7435
7436
  /* VEX_LEN_0F384B_X86_64 */
7437
  {
7438
    { VEX_W_TABLE (VEX_W_0F384B_X86_64_L_0) },
7439
  },
7440
7441
  /* VEX_LEN_0F385A */
7442
  {
7443
    { Bad_Opcode },
7444
    { VEX_W_TABLE (VEX_W_0F385A_L_0) },
7445
  },
7446
7447
  /* VEX_LEN_0F385C_X86_64 */
7448
  {
7449
    { VEX_W_TABLE (VEX_W_0F385C_X86_64_L_0) },
7450
  },
7451
7452
  /* VEX_LEN_0F385E_X86_64 */
7453
  {
7454
    { VEX_W_TABLE (VEX_W_0F385E_X86_64_L_0) },
7455
  },
7456
7457
  /* VEX_LEN_0F385F_X86_64 */
7458
  {
7459
    { VEX_W_TABLE (VEX_W_0F385F_X86_64_L_0) },
7460
  },
7461
7462
  /* VEX_LEN_0F386B_X86_64 */
7463
  {
7464
    { VEX_W_TABLE (VEX_W_0F386B_X86_64_L_0) },
7465
  },
7466
7467
  /* VEX_LEN_0F386C_X86_64 */
7468
  {
7469
    { VEX_W_TABLE (VEX_W_0F386C_X86_64_L_0) },
7470
  },
7471
7472
  /* VEX_LEN_0F386E_X86_64 */
7473
  {
7474
    { VEX_W_TABLE (VEX_W_0F386E_X86_64_L_0) },
7475
  },
7476
7477
  /* VEX_LEN_0F386F_X86_64 */
7478
  {
7479
    { VEX_W_TABLE (VEX_W_0F386F_X86_64_L_0) },
7480
  },
7481
7482
  /* VEX_LEN_0F38CB_P_3_W_0 */
7483
  {
7484
    { Bad_Opcode },
7485
    { "vsha512rnds2", { XM, Vex, Rxmmq }, 0 },
7486
  },
7487
7488
  /* VEX_LEN_0F38CC_P_3_W_0 */
7489
  {
7490
    { Bad_Opcode },
7491
    { "vsha512msg1", { XM, Rxmmq }, 0 },
7492
  },
7493
7494
  /* VEX_LEN_0F38CD_P_3_W_0 */
7495
  {
7496
    { Bad_Opcode },
7497
    { "vsha512msg2", { XM, Rymm }, 0 },
7498
  },
7499
7500
  /* VEX_LEN_0F38DA_W_0_P_0 */
7501
  {
7502
    { "vsm3msg1", { XM, Vex, EXxmm }, 0 },
7503
  },
7504
7505
  /* VEX_LEN_0F38DA_W_0_P_2 */
7506
  {
7507
    { "vsm3msg2", { XM, Vex, EXxmm }, 0 },
7508
  },
7509
7510
  /* VEX_LEN_0F38DB */
7511
  {
7512
    { "vaesimc",  { XM, EXx }, PREFIX_DATA },
7513
  },
7514
7515
  /* VEX_LEN_0F38F2 */
7516
  {
7517
    { PREFIX_TABLE (PREFIX_VEX_0F38F2_L_0) },
7518
  },
7519
7520
  /* VEX_LEN_0F38F3 */
7521
  {
7522
    { PREFIX_TABLE (PREFIX_VEX_0F38F3_L_0) },
7523
  },
7524
7525
  /* VEX_LEN_0F38F5 */
7526
  {
7527
    { PREFIX_TABLE(PREFIX_VEX_0F38F5_L_0) },
7528
  },
7529
7530
  /* VEX_LEN_0F38F6 */
7531
  {
7532
    { PREFIX_TABLE(PREFIX_VEX_0F38F6_L_0) },
7533
  },
7534
7535
  /* VEX_LEN_0F38F7 */
7536
  {
7537
    { PREFIX_TABLE(PREFIX_VEX_0F38F7_L_0) },
7538
  },
7539
7540
  /* VEX_LEN_0F3A00 */
7541
  {
7542
    { Bad_Opcode },
7543
    { VEX_W_TABLE (VEX_W_0F3A00_L_1) },
7544
  },
7545
7546
  /* VEX_LEN_0F3A01 */
7547
  {
7548
    { Bad_Opcode },
7549
    { VEX_W_TABLE (VEX_W_0F3A01_L_1) },
7550
  },
7551
7552
  /* VEX_LEN_0F3A06 */
7553
  {
7554
    { Bad_Opcode },
7555
    { VEX_W_TABLE (VEX_W_0F3A06_L_1) },
7556
  },
7557
7558
  /* VEX_LEN_0F3A14 */
7559
  {
7560
    { "%XEvpextrb", { Edb, XM, Ib }, PREFIX_DATA },
7561
  },
7562
7563
  /* VEX_LEN_0F3A15 */
7564
  {
7565
    { "%XEvpextrw", { Edw, XM, Ib }, PREFIX_DATA },
7566
  },
7567
7568
  /* VEX_LEN_0F3A16  */
7569
  {
7570
    { "%XEvpextrK", { Edq, XM, Ib }, PREFIX_DATA },
7571
  },
7572
7573
  /* VEX_LEN_0F3A17 */
7574
  {
7575
    { "%XEvextractps",  { Ed, XM, Ib }, PREFIX_DATA },
7576
  },
7577
7578
  /* VEX_LEN_0F3A18 */
7579
  {
7580
    { Bad_Opcode },
7581
    { VEX_W_TABLE (VEX_W_0F3A18_L_1) },
7582
  },
7583
7584
  /* VEX_LEN_0F3A19 */
7585
  {
7586
    { Bad_Opcode },
7587
    { VEX_W_TABLE (VEX_W_0F3A19_L_1) },
7588
  },
7589
7590
  /* VEX_LEN_0F3A20 */
7591
  {
7592
    { "%XEvpinsrbY",  { XM, Vex, Edb, Ib }, PREFIX_DATA },
7593
  },
7594
7595
  /* VEX_LEN_0F3A21 */
7596
  {
7597
    { "%XEvinsertpsY",  { XM, Vex, EXd, Ib }, PREFIX_DATA },
7598
  },
7599
7600
  /* VEX_LEN_0F3A22 */
7601
  {
7602
    { "%XEvpinsrYK",  { XM, Vex, Edq, Ib }, PREFIX_DATA },
7603
  },
7604
7605
  /* VEX_LEN_0F3A30 */
7606
  {
7607
    { "kshiftr%BW", { MaskG, MaskR, Ib }, PREFIX_DATA },
7608
  },
7609
7610
  /* VEX_LEN_0F3A31 */
7611
  {
7612
    { "kshiftr%DQ", { MaskG, MaskR, Ib }, PREFIX_DATA },
7613
  },
7614
7615
  /* VEX_LEN_0F3A32 */
7616
  {
7617
    { "kshiftl%BW", { MaskG, MaskR, Ib }, PREFIX_DATA },
7618
  },
7619
7620
  /* VEX_LEN_0F3A33 */
7621
  {
7622
    { "kshiftl%DQ", { MaskG, MaskR, Ib }, PREFIX_DATA },
7623
  },
7624
7625
  /* VEX_LEN_0F3A38 */
7626
  {
7627
    { Bad_Opcode },
7628
    { VEX_W_TABLE (VEX_W_0F3A38_L_1) },
7629
  },
7630
7631
  /* VEX_LEN_0F3A39 */
7632
  {
7633
    { Bad_Opcode },
7634
    { VEX_W_TABLE (VEX_W_0F3A39_L_1) },
7635
  },
7636
7637
  /* VEX_LEN_0F3A41 */
7638
  {
7639
    { "vdppd",    { XM, Vex, EXx, Ib }, PREFIX_DATA },
7640
  },
7641
7642
  /* VEX_LEN_0F3A46 */
7643
  {
7644
    { Bad_Opcode },
7645
    { VEX_W_TABLE (VEX_W_0F3A46_L_1) },
7646
  },
7647
7648
  /* VEX_LEN_0F3A60 */
7649
  {
7650
    { "vpcmpestrm!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
7651
  },
7652
7653
  /* VEX_LEN_0F3A61 */
7654
  {
7655
    { "vpcmpestri!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
7656
  },
7657
7658
  /* VEX_LEN_0F3A62 */
7659
  {
7660
    { "vpcmpistrm", { XM, EXx, Ib }, PREFIX_DATA },
7661
  },
7662
7663
  /* VEX_LEN_0F3A63 */
7664
  {
7665
    { "vpcmpistri", { XM, EXx, Ib }, PREFIX_DATA },
7666
  },
7667
7668
  /* VEX_LEN_0F3ADE_W_0 */
7669
  {
7670
    { "vsm3rnds2", { XM, Vex, EXxmm, Ib }, PREFIX_DATA },
7671
  },
7672
7673
  /* VEX_LEN_0F3ADF */
7674
  {
7675
    { "vaeskeygenassist", { XM, EXx, Ib }, PREFIX_DATA },
7676
  },
7677
7678
  /* VEX_LEN_0F3AF0 */
7679
  {
7680
    { PREFIX_TABLE (PREFIX_VEX_0F3AF0_L_0) },
7681
  },
7682
7683
  /* VEX_LEN_MAP5_F8_X86_64 */
7684
  {
7685
    { VEX_W_TABLE (VEX_W_MAP5_F8_X86_64_L_0) },
7686
  },
7687
7688
  /* VEX_LEN_MAP5_F9_X86_64 */
7689
  {
7690
    { VEX_W_TABLE (VEX_W_MAP5_F9_X86_64_L_0) },
7691
  },
7692
7693
  /* VEX_LEN_MAP5_FD_X86_64 */
7694
  {
7695
    { VEX_W_TABLE (VEX_W_MAP5_FD_X86_64_L_0) },
7696
  },
7697
7698
  /* VEX_LEN_MAP7_F6 */
7699
  {
7700
    { VEX_W_TABLE (VEX_W_MAP7_F6_L_0) },
7701
  },
7702
7703
  /* VEX_LEN_MAP7_F8 */
7704
  {
7705
    { VEX_W_TABLE (VEX_W_MAP7_F8_L_0) },
7706
  },
7707
7708
  /* VEX_LEN_XOP_08_85 */
7709
  {
7710
    { VEX_W_TABLE (VEX_W_XOP_08_85_L_0) },
7711
  },
7712
7713
  /* VEX_LEN_XOP_08_86 */
7714
  {
7715
    { VEX_W_TABLE (VEX_W_XOP_08_86_L_0) },
7716
  },
7717
7718
  /* VEX_LEN_XOP_08_87 */
7719
  {
7720
    { VEX_W_TABLE (VEX_W_XOP_08_87_L_0) },
7721
  },
7722
7723
  /* VEX_LEN_XOP_08_8E */
7724
  {
7725
    { VEX_W_TABLE (VEX_W_XOP_08_8E_L_0) },
7726
  },
7727
7728
  /* VEX_LEN_XOP_08_8F */
7729
  {
7730
    { VEX_W_TABLE (VEX_W_XOP_08_8F_L_0) },
7731
  },
7732
7733
  /* VEX_LEN_XOP_08_95 */
7734
  {
7735
    { VEX_W_TABLE (VEX_W_XOP_08_95_L_0) },
7736
  },
7737
7738
  /* VEX_LEN_XOP_08_96 */
7739
  {
7740
    { VEX_W_TABLE (VEX_W_XOP_08_96_L_0) },
7741
  },
7742
7743
  /* VEX_LEN_XOP_08_97 */
7744
  {
7745
    { VEX_W_TABLE (VEX_W_XOP_08_97_L_0) },
7746
  },
7747
7748
  /* VEX_LEN_XOP_08_9E */
7749
  {
7750
    { VEX_W_TABLE (VEX_W_XOP_08_9E_L_0) },
7751
  },
7752
7753
  /* VEX_LEN_XOP_08_9F */
7754
  {
7755
    { VEX_W_TABLE (VEX_W_XOP_08_9F_L_0) },
7756
  },
7757
7758
  /* VEX_LEN_XOP_08_A3 */
7759
  {
7760
    { "vpperm",   { XM, Vex, EXx, XMVexI4 }, 0 },
7761
  },
7762
7763
  /* VEX_LEN_XOP_08_A6 */
7764
  {
7765
    { VEX_W_TABLE (VEX_W_XOP_08_A6_L_0) },
7766
  },
7767
7768
  /* VEX_LEN_XOP_08_B6 */
7769
  {
7770
    { VEX_W_TABLE (VEX_W_XOP_08_B6_L_0) },
7771
  },
7772
7773
  /* VEX_LEN_XOP_08_C0 */
7774
  {
7775
    { VEX_W_TABLE (VEX_W_XOP_08_C0_L_0) },
7776
  },
7777
7778
  /* VEX_LEN_XOP_08_C1 */
7779
  {
7780
    { VEX_W_TABLE (VEX_W_XOP_08_C1_L_0) },
7781
  },
7782
7783
  /* VEX_LEN_XOP_08_C2 */
7784
  {
7785
    { VEX_W_TABLE (VEX_W_XOP_08_C2_L_0) },
7786
  },
7787
7788
  /* VEX_LEN_XOP_08_C3 */
7789
  {
7790
    { VEX_W_TABLE (VEX_W_XOP_08_C3_L_0) },
7791
  },
7792
7793
  /* VEX_LEN_XOP_08_CC */
7794
  {
7795
    { VEX_W_TABLE (VEX_W_XOP_08_CC_L_0) },
7796
  },
7797
7798
  /* VEX_LEN_XOP_08_CD */
7799
  {
7800
    { VEX_W_TABLE (VEX_W_XOP_08_CD_L_0) },
7801
  },
7802
7803
  /* VEX_LEN_XOP_08_CE */
7804
  {
7805
    { VEX_W_TABLE (VEX_W_XOP_08_CE_L_0) },
7806
  },
7807
7808
  /* VEX_LEN_XOP_08_CF */
7809
  {
7810
    { VEX_W_TABLE (VEX_W_XOP_08_CF_L_0) },
7811
  },
7812
7813
  /* VEX_LEN_XOP_08_EC */
7814
  {
7815
    { VEX_W_TABLE (VEX_W_XOP_08_EC_L_0) },
7816
  },
7817
7818
  /* VEX_LEN_XOP_08_ED */
7819
  {
7820
    { VEX_W_TABLE (VEX_W_XOP_08_ED_L_0) },
7821
  },
7822
7823
  /* VEX_LEN_XOP_08_EE */
7824
  {
7825
    { VEX_W_TABLE (VEX_W_XOP_08_EE_L_0) },
7826
  },
7827
7828
  /* VEX_LEN_XOP_08_EF */
7829
  {
7830
    { VEX_W_TABLE (VEX_W_XOP_08_EF_L_0) },
7831
  },
7832
7833
  /* VEX_LEN_XOP_09_01 */
7834
  {
7835
    { REG_TABLE (REG_XOP_09_01_L_0) },
7836
  },
7837
7838
  /* VEX_LEN_XOP_09_02 */
7839
  {
7840
    { REG_TABLE (REG_XOP_09_02_L_0) },
7841
  },
7842
7843
  /* VEX_LEN_XOP_09_12 */
7844
  {
7845
    { REG_TABLE (REG_XOP_09_12_L_0) },
7846
  },
7847
7848
  /* VEX_LEN_XOP_09_82_W_0 */
7849
  {
7850
    { "vfrczss",  { XM, EXd }, 0 },
7851
  },
7852
7853
  /* VEX_LEN_XOP_09_83_W_0 */
7854
  {
7855
    { "vfrczsd",  { XM, EXq }, 0 },
7856
  },
7857
7858
  /* VEX_LEN_XOP_09_90 */
7859
  {
7860
    { "vprotb",   { XM, EXx, VexW }, 0 },
7861
  },
7862
7863
  /* VEX_LEN_XOP_09_91 */
7864
  {
7865
    { "vprotw",   { XM, EXx, VexW }, 0 },
7866
  },
7867
7868
  /* VEX_LEN_XOP_09_92 */
7869
  {
7870
    { "vprotd",   { XM, EXx, VexW }, 0 },
7871
  },
7872
7873
  /* VEX_LEN_XOP_09_93 */
7874
  {
7875
    { "vprotq",   { XM, EXx, VexW }, 0 },
7876
  },
7877
7878
  /* VEX_LEN_XOP_09_94 */
7879
  {
7880
    { "vpshlb",   { XM, EXx, VexW }, 0 },
7881
  },
7882
7883
  /* VEX_LEN_XOP_09_95 */
7884
  {
7885
    { "vpshlw",   { XM, EXx, VexW }, 0 },
7886
  },
7887
7888
  /* VEX_LEN_XOP_09_96 */
7889
  {
7890
    { "vpshld",   { XM, EXx, VexW }, 0 },
7891
  },
7892
7893
  /* VEX_LEN_XOP_09_97 */
7894
  {
7895
    { "vpshlq",   { XM, EXx, VexW }, 0 },
7896
  },
7897
7898
  /* VEX_LEN_XOP_09_98 */
7899
  {
7900
    { "vpshab",   { XM, EXx, VexW }, 0 },
7901
  },
7902
7903
  /* VEX_LEN_XOP_09_99 */
7904
  {
7905
    { "vpshaw",   { XM, EXx, VexW }, 0 },
7906
  },
7907
7908
  /* VEX_LEN_XOP_09_9A */
7909
  {
7910
    { "vpshad",   { XM, EXx, VexW }, 0 },
7911
  },
7912
7913
  /* VEX_LEN_XOP_09_9B */
7914
  {
7915
    { "vpshaq",   { XM, EXx, VexW }, 0 },
7916
  },
7917
7918
  /* VEX_LEN_XOP_09_C1 */
7919
  {
7920
    { VEX_W_TABLE (VEX_W_XOP_09_C1_L_0) },
7921
  },
7922
7923
  /* VEX_LEN_XOP_09_C2 */
7924
  {
7925
    { VEX_W_TABLE (VEX_W_XOP_09_C2_L_0) },
7926
  },
7927
7928
  /* VEX_LEN_XOP_09_C3 */
7929
  {
7930
    { VEX_W_TABLE (VEX_W_XOP_09_C3_L_0) },
7931
  },
7932
7933
  /* VEX_LEN_XOP_09_C6 */
7934
  {
7935
    { VEX_W_TABLE (VEX_W_XOP_09_C6_L_0) },
7936
  },
7937
7938
  /* VEX_LEN_XOP_09_C7 */
7939
  {
7940
    { VEX_W_TABLE (VEX_W_XOP_09_C7_L_0) },
7941
  },
7942
7943
  /* VEX_LEN_XOP_09_CB */
7944
  {
7945
    { VEX_W_TABLE (VEX_W_XOP_09_CB_L_0) },
7946
  },
7947
7948
  /* VEX_LEN_XOP_09_D1 */
7949
  {
7950
    { VEX_W_TABLE (VEX_W_XOP_09_D1_L_0) },
7951
  },
7952
7953
  /* VEX_LEN_XOP_09_D2 */
7954
  {
7955
    { VEX_W_TABLE (VEX_W_XOP_09_D2_L_0) },
7956
  },
7957
7958
  /* VEX_LEN_XOP_09_D3 */
7959
  {
7960
    { VEX_W_TABLE (VEX_W_XOP_09_D3_L_0) },
7961
  },
7962
7963
  /* VEX_LEN_XOP_09_D6 */
7964
  {
7965
    { VEX_W_TABLE (VEX_W_XOP_09_D6_L_0) },
7966
  },
7967
7968
  /* VEX_LEN_XOP_09_D7 */
7969
  {
7970
    { VEX_W_TABLE (VEX_W_XOP_09_D7_L_0) },
7971
  },
7972
7973
  /* VEX_LEN_XOP_09_DB */
7974
  {
7975
    { VEX_W_TABLE (VEX_W_XOP_09_DB_L_0) },
7976
  },
7977
7978
  /* VEX_LEN_XOP_09_E1 */
7979
  {
7980
    { VEX_W_TABLE (VEX_W_XOP_09_E1_L_0) },
7981
  },
7982
7983
  /* VEX_LEN_XOP_09_E2 */
7984
  {
7985
    { VEX_W_TABLE (VEX_W_XOP_09_E2_L_0) },
7986
  },
7987
7988
  /* VEX_LEN_XOP_09_E3 */
7989
  {
7990
    { VEX_W_TABLE (VEX_W_XOP_09_E3_L_0) },
7991
  },
7992
7993
  /* VEX_LEN_XOP_0A_12 */
7994
  {
7995
    { REG_TABLE (REG_XOP_0A_12_L_0) },
7996
  },
7997
};
7998
7999
#include "i386-dis-evex-len.h"
8000
8001
static const struct dis386 vex_w_table[][2] = {
8002
  {
8003
    /* VEX_W_0F41_L_1_M_1 */
8004
    { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_W_0) },
8005
    { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_W_1) },
8006
  },
8007
  {
8008
    /* VEX_W_0F42_L_1_M_1 */
8009
    { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_W_0) },
8010
    { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_W_1) },
8011
  },
8012
  {
8013
    /* VEX_W_0F44_L_0_M_1 */
8014
    { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_W_0) },
8015
    { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_W_1) },
8016
  },
8017
  {
8018
    /* VEX_W_0F45_L_1_M_1 */
8019
    { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_W_0) },
8020
    { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_W_1) },
8021
  },
8022
  {
8023
    /* VEX_W_0F46_L_1_M_1 */
8024
    { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_W_0) },
8025
    { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_W_1) },
8026
  },
8027
  {
8028
    /* VEX_W_0F47_L_1_M_1 */
8029
    { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_W_0) },
8030
    { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_W_1) },
8031
  },
8032
  {
8033
    /* VEX_W_0F4A_L_1_M_1 */
8034
    { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_W_0) },
8035
    { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_W_1) },
8036
  },
8037
  {
8038
    /* VEX_W_0F4B_L_1_M_1 */
8039
    { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_W_0) },
8040
    { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_W_1) },
8041
  },
8042
  {
8043
    /* VEX_W_0F90_L_0 */
8044
    { PREFIX_TABLE (PREFIX_VEX_0F90_L_0_W_0) },
8045
    { PREFIX_TABLE (PREFIX_VEX_0F90_L_0_W_1) },
8046
  },
8047
  {
8048
    /* VEX_W_0F91_L_0_M_0 */
8049
    { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_W_0) },
8050
    { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_W_1) },
8051
  },
8052
  {
8053
    /* VEX_W_0F92_L_0_M_1 */
8054
    { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_W_0) },
8055
    { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_W_1) },
8056
  },
8057
  {
8058
    /* VEX_W_0F93_L_0_M_1 */
8059
    { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_W_0) },
8060
    { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_W_1) },
8061
  },
8062
  {
8063
    /* VEX_W_0F98_L_0_M_1 */
8064
    { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_W_0) },
8065
    { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_W_1) },
8066
  },
8067
  {
8068
    /* VEX_W_0F99_L_0_M_1 */
8069
    { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_W_0) },
8070
    { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_W_1) },
8071
  },
8072
  {
8073
    /* VEX_W_0F380C  */
8074
    { "%XEvpermilps", { XM, Vex, EXx }, PREFIX_DATA },
8075
  },
8076
  {
8077
    /* VEX_W_0F380D  */
8078
    { "vpermilpd",  { XM, Vex, EXx }, PREFIX_DATA },
8079
  },
8080
  {
8081
    /* VEX_W_0F380E  */
8082
    { "vtestps",  { XM, EXx }, PREFIX_DATA },
8083
  },
8084
  {
8085
    /* VEX_W_0F380F  */
8086
    { "vtestpd",  { XM, EXx }, PREFIX_DATA },
8087
  },
8088
  {
8089
    /* VEX_W_0F3813 */
8090
    { "vcvtph2ps", { XM, EXxmmq }, PREFIX_DATA },
8091
  },
8092
  {
8093
    /* VEX_W_0F3816_L_1  */
8094
    { "vpermps",  { XM, Vex, EXx }, PREFIX_DATA },
8095
  },
8096
  {
8097
    /* VEX_W_0F3818 */
8098
    { "%XEvbroadcastss",  { XM, EXd }, PREFIX_DATA },
8099
  },
8100
  {
8101
    /* VEX_W_0F3819_L_1 */
8102
    { "vbroadcastsd", { XM, EXq }, PREFIX_DATA },
8103
  },
8104
  {
8105
    /* VEX_W_0F381A_L_1 */
8106
    { "vbroadcastf128", { XM, Mxmm }, PREFIX_DATA },
8107
  },
8108
  {
8109
    /* VEX_W_0F382C */
8110
    { "vmaskmovps", { XM, Vex, Mx }, PREFIX_DATA },
8111
  },
8112
  {
8113
    /* VEX_W_0F382D */
8114
    { "vmaskmovpd", { XM, Vex, Mx }, PREFIX_DATA },
8115
  },
8116
  {
8117
    /* VEX_W_0F382E */
8118
    { "vmaskmovps", { Mx, Vex, XM }, PREFIX_DATA },
8119
  },
8120
  {
8121
    /* VEX_W_0F382F */
8122
    { "vmaskmovpd", { Mx, Vex, XM }, PREFIX_DATA },
8123
  },
8124
  {
8125
    /* VEX_W_0F3836  */
8126
    { "vpermd",   { XM, Vex, EXx }, PREFIX_DATA },
8127
  },
8128
  {
8129
    /* VEX_W_0F3846 */
8130
    { "vpsravd",  { XM, Vex, EXx }, PREFIX_DATA },
8131
  },
8132
  {
8133
    /* VEX_W_0F3848_X86_64_L_0 */
8134
    { PREFIX_TABLE (PREFIX_VEX_0F3848_X86_64_L_0_W_0) },
8135
  },
8136
  {
8137
    /* VEX_W_0F3849_X86_64_L_0 */
8138
    { MOD_TABLE (MOD_VEX_0F3849_X86_64_L_0_W_0) },
8139
  },
8140
  {
8141
    /* VEX_W_0F384A_X86_64 */
8142
    { VEX_LEN_TABLE (VEX_LEN_0F384A_X86_64_W_0) },
8143
  },
8144
  {
8145
    /* VEX_W_0F384B_X86_64_L_0 */
8146
    { PREFIX_TABLE (PREFIX_VEX_0F384B_X86_64_L_0_W_0) },
8147
  },
8148
  {
8149
    /* VEX_W_0F3850 */
8150
    { PREFIX_TABLE (PREFIX_VEX_0F3850_W_0) },
8151
  },
8152
  {
8153
    /* VEX_W_0F3851 */
8154
    { PREFIX_TABLE (PREFIX_VEX_0F3851_W_0) },
8155
  },
8156
  {
8157
    /* VEX_W_0F3852 */
8158
    { "%XVvpdpwssd",  { XM, Vex, EXx }, PREFIX_DATA },
8159
  },
8160
  {
8161
    /* VEX_W_0F3853 */
8162
    { "%XVvpdpwssds", { XM, Vex, EXx }, PREFIX_DATA },
8163
  },
8164
  {
8165
    /* VEX_W_0F3858 */
8166
    { "%XEvpbroadcastd", { XM, EXd }, PREFIX_DATA },
8167
  },
8168
  {
8169
    /* VEX_W_0F3859 */
8170
    { "vpbroadcastq", { XM, EXq }, PREFIX_DATA },
8171
  },
8172
  {
8173
    /* VEX_W_0F385A_L_0 */
8174
    { "vbroadcasti128", { XM, Mxmm }, PREFIX_DATA },
8175
  },
8176
  {
8177
    /* VEX_W_0F385C_X86_64_L_0 */
8178
    { PREFIX_TABLE (PREFIX_VEX_0F385C_X86_64_L_0_W_0) },
8179
  },
8180
  {
8181
    /* VEX_W_0F385E_X86_64_L_0 */
8182
    { PREFIX_TABLE (PREFIX_VEX_0F385E_X86_64_L_0_W_0) },
8183
  },
8184
  {
8185
    /* VEX_W_0F385F_X86_64_L_0 */
8186
    { PREFIX_TABLE (PREFIX_VEX_0F385F_X86_64_L_0_W_0) },
8187
  },
8188
  {
8189
    /* VEX_W_0F386B_X86_64_L_0 */
8190
    { PREFIX_TABLE (PREFIX_VEX_0F386B_X86_64_L_0_W_0) },
8191
  },
8192
  {
8193
    /* VEX_W_0F386C_X86_64_L_0 */
8194
    { PREFIX_TABLE (PREFIX_VEX_0F386C_X86_64_L_0_W_0) },
8195
  },
8196
  {
8197
    /* VEX_W_0F386E_X86_64_L_0 */
8198
    { PREFIX_TABLE (PREFIX_VEX_0F386E_X86_64_L_0_W_0) },
8199
  },
8200
  {
8201
    /* VEX_W_0F386F_X86_64_L_0 */
8202
    { PREFIX_TABLE (PREFIX_VEX_0F386F_X86_64_L_0_W_0) },
8203
  },
8204
  {
8205
    /* VEX_W_0F3872_P_1 */
8206
    { "%XVvcvtneps2bf16%XY", { XMM, EXx }, 0 },
8207
  },
8208
  {
8209
    /* VEX_W_0F3878 */
8210
    { "%XEvpbroadcastb",  { XM, EXb }, PREFIX_DATA },
8211
  },
8212
  {
8213
    /* VEX_W_0F3879 */
8214
    { "%XEvpbroadcastw",  { XM, EXw }, PREFIX_DATA },
8215
  },
8216
  {
8217
    /* VEX_W_0F38B0 */
8218
    { PREFIX_TABLE (PREFIX_VEX_0F38B0_W_0) },
8219
  },
8220
  {
8221
    /* VEX_W_0F38B1 */
8222
    { PREFIX_TABLE (PREFIX_VEX_0F38B1_W_0) },
8223
  },
8224
  {
8225
    /* VEX_W_0F38B4 */
8226
    { Bad_Opcode },
8227
    { "%XVvpmadd52luq", { XM, Vex, EXx }, PREFIX_DATA },
8228
  },
8229
  {
8230
    /* VEX_W_0F38B5 */
8231
    { Bad_Opcode },
8232
    { "%XVvpmadd52huq", { XM, Vex, EXx }, PREFIX_DATA },
8233
  },
8234
  {
8235
    /* VEX_W_0F38CB_P_3 */
8236
    { VEX_LEN_TABLE (VEX_LEN_0F38CB_P_3_W_0) },
8237
  },
8238
  {
8239
    /* VEX_W_0F38CC_P_3 */
8240
    { VEX_LEN_TABLE (VEX_LEN_0F38CC_P_3_W_0) },
8241
  },
8242
  {
8243
    /* VEX_W_0F38CD_P_3 */
8244
    { VEX_LEN_TABLE (VEX_LEN_0F38CD_P_3_W_0) },
8245
  },
8246
  {
8247
    /* VEX_W_0F38CF */
8248
    { "%XEvgf2p8mulb", { XM, Vex, EXx }, PREFIX_DATA },
8249
  },
8250
  {
8251
    /* VEX_W_0F38D2 */
8252
    { PREFIX_TABLE (PREFIX_VEX_0F38D2_W_0) },
8253
  },
8254
  {
8255
    /* VEX_W_0F38D3 */
8256
    { PREFIX_TABLE (PREFIX_VEX_0F38D3_W_0) },
8257
  },
8258
  {
8259
    /* VEX_W_0F38DA */
8260
    { PREFIX_TABLE (PREFIX_VEX_0F38DA_W_0) },
8261
  },
8262
  {
8263
    /* VEX_W_0F3A00_L_1 */
8264
    { Bad_Opcode },
8265
    { "%XEvpermq",    { XM, EXx, Ib }, PREFIX_DATA },
8266
  },
8267
  {
8268
    /* VEX_W_0F3A01_L_1 */
8269
    { Bad_Opcode },
8270
    { "%XEvpermpd", { XM, EXx, Ib }, PREFIX_DATA },
8271
  },
8272
  {
8273
    /* VEX_W_0F3A02 */
8274
    { "vpblendd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
8275
  },
8276
  {
8277
    /* VEX_W_0F3A04 */
8278
    { "%XEvpermilps", { XM, EXx, Ib }, PREFIX_DATA },
8279
  },
8280
  {
8281
    /* VEX_W_0F3A05 */
8282
    { "vpermilpd",  { XM, EXx, Ib }, PREFIX_DATA },
8283
  },
8284
  {
8285
    /* VEX_W_0F3A06_L_1 */
8286
    { "vperm2f128", { XM, Vex, EXx, Ib }, PREFIX_DATA },
8287
  },
8288
  {
8289
    /* VEX_W_0F3A18_L_1 */
8290
    { "vinsertf128",  { XM, Vex, EXxmm, Ib }, PREFIX_DATA },
8291
  },
8292
  {
8293
    /* VEX_W_0F3A19_L_1 */
8294
    { "vextractf128", { EXxmm, XM, Ib }, PREFIX_DATA },
8295
  },
8296
  {
8297
    /* VEX_W_0F3A1D */
8298
    { "%XEvcvtps2ph", { EXxmmq, XM, EXxEVexS, Ib }, PREFIX_DATA },
8299
  },
8300
  {
8301
    /* VEX_W_0F3A38_L_1 */
8302
    { "vinserti128",  { XM, Vex, EXxmm, Ib }, PREFIX_DATA },
8303
  },
8304
  {
8305
    /* VEX_W_0F3A39_L_1 */
8306
    { "vextracti128", { EXxmm, XM, Ib }, PREFIX_DATA },
8307
  },
8308
  {
8309
    /* VEX_W_0F3A46_L_1 */
8310
    { "vperm2i128", { XM, Vex, EXx, Ib }, PREFIX_DATA },
8311
  },
8312
  {
8313
    /* VEX_W_0F3A4A */
8314
    { "vblendvps",  { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
8315
  },
8316
  {
8317
    /* VEX_W_0F3A4B */
8318
    { "vblendvpd",  { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
8319
  },
8320
  {
8321
    /* VEX_W_0F3A4C */
8322
    { "vpblendvb",  { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
8323
  },
8324
  {
8325
    /* VEX_W_0F3ACE */
8326
    { Bad_Opcode },
8327
    { "%XEvgf2p8affineqb", { XM, Vex, EXx, Ib }, PREFIX_DATA },
8328
  },
8329
  {
8330
    /* VEX_W_0F3ACF */
8331
    { Bad_Opcode },
8332
    { "%XEvgf2p8affineinvqb",  { XM, Vex, EXx, Ib }, PREFIX_DATA },
8333
  },
8334
  {
8335
    /* VEX_W_0F3ADE */
8336
    { VEX_LEN_TABLE (VEX_LEN_0F3ADE_W_0) },
8337
  },
8338
  {
8339
    /* VEX_W_MAP5_F8_X86_64 */
8340
    { PREFIX_TABLE (PREFIX_VEX_MAP5_F8_X86_64_L_0_W_0) },
8341
  },
8342
  {
8343
    /* VEX_W_MAP5_F9_X86_64 */
8344
    { PREFIX_TABLE (PREFIX_VEX_MAP5_F9_X86_64_L_0_W_0) },
8345
  },
8346
  {
8347
    /* VEX_W_MAP5_FD_X86_64 */
8348
    { PREFIX_TABLE (PREFIX_VEX_MAP5_FD_X86_64_L_0_W_0) },
8349
  },
8350
  {
8351
    /* VEX_W_MAP7_F6_L_0 */
8352
    { REG_TABLE (REG_VEX_MAP7_F6_L_0_W_0) },
8353
  },
8354
  {
8355
    /* VEX_W_MAP7_F8_L_0 */
8356
    { REG_TABLE (REG_VEX_MAP7_F8_L_0_W_0) },
8357
  },
8358
  /* VEX_W_XOP_08_85_L_0 */
8359
  {
8360
    { "vpmacssww",  { XM, Vex, EXx, XMVexI4 }, 0 },
8361
  },
8362
  /* VEX_W_XOP_08_86_L_0 */
8363
  {
8364
    { "vpmacsswd",  { XM, Vex, EXx, XMVexI4 }, 0 },
8365
  },
8366
  /* VEX_W_XOP_08_87_L_0 */
8367
  {
8368
    { "vpmacssdql",   { XM, Vex, EXx, XMVexI4 }, 0 },
8369
  },
8370
  /* VEX_W_XOP_08_8E_L_0 */
8371
  {
8372
    { "vpmacssdd",  { XM, Vex, EXx, XMVexI4 }, 0 },
8373
  },
8374
  /* VEX_W_XOP_08_8F_L_0 */
8375
  {
8376
    { "vpmacssdqh",   { XM, Vex, EXx, XMVexI4 }, 0 },
8377
  },
8378
  /* VEX_W_XOP_08_95_L_0 */
8379
  {
8380
    { "vpmacsww",   { XM, Vex, EXx, XMVexI4 }, 0 },
8381
  },
8382
  /* VEX_W_XOP_08_96_L_0 */
8383
  {
8384
    { "vpmacswd",   { XM, Vex, EXx, XMVexI4 }, 0 },
8385
  },
8386
  /* VEX_W_XOP_08_97_L_0 */
8387
  {
8388
    { "vpmacsdql",  { XM, Vex, EXx, XMVexI4 }, 0 },
8389
  },
8390
  /* VEX_W_XOP_08_9E_L_0 */
8391
  {
8392
    { "vpmacsdd",   { XM, Vex, EXx, XMVexI4 }, 0 },
8393
  },
8394
  /* VEX_W_XOP_08_9F_L_0 */
8395
  {
8396
    { "vpmacsdqh",  { XM, Vex, EXx, XMVexI4 }, 0 },
8397
  },
8398
  /* VEX_W_XOP_08_A6_L_0 */
8399
  {
8400
    { "vpmadcsswd",   { XM, Vex, EXx, XMVexI4 }, 0 },
8401
  },
8402
  /* VEX_W_XOP_08_B6_L_0 */
8403
  {
8404
    { "vpmadcswd",  { XM, Vex, EXx, XMVexI4 }, 0 },
8405
  },
8406
  /* VEX_W_XOP_08_C0_L_0 */
8407
  {
8408
    { "vprotb",   { XM, EXx, Ib }, 0 },
8409
  },
8410
  /* VEX_W_XOP_08_C1_L_0 */
8411
  {
8412
    { "vprotw",   { XM, EXx, Ib }, 0 },
8413
  },
8414
  /* VEX_W_XOP_08_C2_L_0 */
8415
  {
8416
    { "vprotd",   { XM, EXx, Ib }, 0 },
8417
  },
8418
  /* VEX_W_XOP_08_C3_L_0 */
8419
  {
8420
    { "vprotq",   { XM, EXx, Ib }, 0 },
8421
  },
8422
  /* VEX_W_XOP_08_CC_L_0 */
8423
  {
8424
     { "vpcomb",  { XM, Vex, EXx, VPCOM }, 0 },
8425
  },
8426
  /* VEX_W_XOP_08_CD_L_0 */
8427
  {
8428
     { "vpcomw",  { XM, Vex, EXx, VPCOM }, 0 },
8429
  },
8430
  /* VEX_W_XOP_08_CE_L_0 */
8431
  {
8432
     { "vpcomd",  { XM, Vex, EXx, VPCOM }, 0 },
8433
  },
8434
  /* VEX_W_XOP_08_CF_L_0 */
8435
  {
8436
     { "vpcomq",  { XM, Vex, EXx, VPCOM }, 0 },
8437
  },
8438
  /* VEX_W_XOP_08_EC_L_0 */
8439
  {
8440
     { "vpcomub", { XM, Vex, EXx, VPCOM }, 0 },
8441
  },
8442
  /* VEX_W_XOP_08_ED_L_0 */
8443
  {
8444
     { "vpcomuw", { XM, Vex, EXx, VPCOM }, 0 },
8445
  },
8446
  /* VEX_W_XOP_08_EE_L_0 */
8447
  {
8448
     { "vpcomud", { XM, Vex, EXx, VPCOM }, 0 },
8449
  },
8450
  /* VEX_W_XOP_08_EF_L_0 */
8451
  {
8452
     { "vpcomuq", { XM, Vex, EXx, VPCOM }, 0 },
8453
  },
8454
  /* VEX_W_XOP_09_80 */
8455
  {
8456
    { "vfrczps",  { XM, EXx }, 0 },
8457
  },
8458
  /* VEX_W_XOP_09_81 */
8459
  {
8460
    { "vfrczpd",  { XM, EXx }, 0 },
8461
  },
8462
  /* VEX_W_XOP_09_82 */
8463
  {
8464
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_82_W_0) },
8465
  },
8466
  /* VEX_W_XOP_09_83 */
8467
  {
8468
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_83_W_0) },
8469
  },
8470
  /* VEX_W_XOP_09_C1_L_0 */
8471
  {
8472
    { "vphaddbw", { XM, EXxmm }, 0 },
8473
  },
8474
  /* VEX_W_XOP_09_C2_L_0 */
8475
  {
8476
    { "vphaddbd", { XM, EXxmm }, 0 },
8477
  },
8478
  /* VEX_W_XOP_09_C3_L_0 */
8479
  {
8480
    { "vphaddbq", { XM, EXxmm }, 0 },
8481
  },
8482
  /* VEX_W_XOP_09_C6_L_0 */
8483
  {
8484
    { "vphaddwd", { XM, EXxmm }, 0 },
8485
  },
8486
  /* VEX_W_XOP_09_C7_L_0 */
8487
  {
8488
    { "vphaddwq", { XM, EXxmm }, 0 },
8489
  },
8490
  /* VEX_W_XOP_09_CB_L_0 */
8491
  {
8492
    { "vphadddq", { XM, EXxmm }, 0 },
8493
  },
8494
  /* VEX_W_XOP_09_D1_L_0 */
8495
  {
8496
    { "vphaddubw",  { XM, EXxmm }, 0 },
8497
  },
8498
  /* VEX_W_XOP_09_D2_L_0 */
8499
  {
8500
    { "vphaddubd",  { XM, EXxmm }, 0 },
8501
  },
8502
  /* VEX_W_XOP_09_D3_L_0 */
8503
  {
8504
    { "vphaddubq",  { XM, EXxmm }, 0 },
8505
  },
8506
  /* VEX_W_XOP_09_D6_L_0 */
8507
  {
8508
    { "vphadduwd",  { XM, EXxmm }, 0 },
8509
  },
8510
  /* VEX_W_XOP_09_D7_L_0 */
8511
  {
8512
    { "vphadduwq",  { XM, EXxmm }, 0 },
8513
  },
8514
  /* VEX_W_XOP_09_DB_L_0 */
8515
  {
8516
    { "vphaddudq",  { XM, EXxmm }, 0 },
8517
  },
8518
  /* VEX_W_XOP_09_E1_L_0 */
8519
  {
8520
    { "vphsubbw", { XM, EXxmm }, 0 },
8521
  },
8522
  /* VEX_W_XOP_09_E2_L_0 */
8523
  {
8524
    { "vphsubwd", { XM, EXxmm }, 0 },
8525
  },
8526
  /* VEX_W_XOP_09_E3_L_0 */
8527
  {
8528
    { "vphsubdq", { XM, EXxmm }, 0 },
8529
  },
8530
8531
#include "i386-dis-evex-w.h"
8532
};
8533
8534
static const struct dis386 mod_table[][2] = {
8535
  {
8536
    /* MOD_62_32BIT */
8537
    { "bound{S|}",  { Gv, Ma }, 0 },
8538
    { EVEX_TABLE () },
8539
  },
8540
  {
8541
    /* MOD_C4_32BIT */
8542
    { "lesS",   { Gv, Mp }, 0 },
8543
    { VEX_C4_TABLE () },
8544
  },
8545
  {
8546
    /* MOD_C5_32BIT */
8547
    { "ldsS",   { Gv, Mp }, 0 },
8548
    { VEX_C5_TABLE () },
8549
  },
8550
  {
8551
    /* MOD_0F01_REG_0 */
8552
    { X86_64_TABLE (X86_64_0F01_REG_0) },
8553
    { RM_TABLE (RM_0F01_REG_0) },
8554
  },
8555
  {
8556
    /* MOD_0F01_REG_1 */
8557
    { X86_64_TABLE (X86_64_0F01_REG_1) },
8558
    { RM_TABLE (RM_0F01_REG_1) },
8559
  },
8560
  {
8561
    /* MOD_0F01_REG_2 */
8562
    { X86_64_TABLE (X86_64_0F01_REG_2) },
8563
    { RM_TABLE (RM_0F01_REG_2) },
8564
  },
8565
  {
8566
    /* MOD_0F01_REG_3 */
8567
    { X86_64_TABLE (X86_64_0F01_REG_3) },
8568
    { RM_TABLE (RM_0F01_REG_3) },
8569
  },
8570
  {
8571
    /* MOD_0F01_REG_5 */
8572
    { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_0) },
8573
    { RM_TABLE (RM_0F01_REG_5_MOD_3) },
8574
  },
8575
  {
8576
    /* MOD_0F01_REG_7 */
8577
    { "invlpg",   { Mb }, 0 },
8578
    { RM_TABLE (RM_0F01_REG_7_MOD_3) },
8579
  },
8580
  {
8581
    /* MOD_0F12_PREFIX_0 */
8582
    { "%XEVmovlpYX",  { XM, Vex, EXq }, 0 },
8583
    { "%XEVmovhlpY%XS", { XM, Vex, EXq }, 0 },
8584
  },
8585
  {
8586
    /* MOD_0F16_PREFIX_0 */
8587
    { "%XEVmovhpYX",  { XM, Vex, EXq }, 0 },
8588
    { "%XEVmovlhpY%XS", { XM, Vex, EXq }, 0 },
8589
  },
8590
  {
8591
    /* MOD_0F18_REG_0 */
8592
    { "prefetchnta",  { Mb }, 0 },
8593
    { "nopQ",   { Ev }, 0 },
8594
  },
8595
  {
8596
    /* MOD_0F18_REG_1 */
8597
    { "prefetcht0", { Mb }, 0 },
8598
    { "nopQ",   { Ev }, 0 },
8599
  },
8600
  {
8601
    /* MOD_0F18_REG_2 */
8602
    { "prefetcht1", { Mb }, 0 },
8603
    { "nopQ",   { Ev }, 0 },
8604
  },
8605
  {
8606
    /* MOD_0F18_REG_3 */
8607
    { "prefetcht2", { Mb }, 0 },
8608
    { "nopQ",   { Ev }, 0 },
8609
  },
8610
  {
8611
    /* MOD_0F18_REG_4 */
8612
    { "prefetchrst2", { Mb }, 0 },
8613
    { "nopQ",   { Ev }, 0 },
8614
  },
8615
  {
8616
    /* MOD_0F18_REG_6 */
8617
    { X86_64_TABLE (X86_64_0F18_REG_6_MOD_0) },
8618
    { "nopQ",   { Ev }, 0 },
8619
  },
8620
  {
8621
    /* MOD_0F18_REG_7 */
8622
    { X86_64_TABLE (X86_64_0F18_REG_7_MOD_0) },
8623
    { "nopQ",   { Ev }, 0 },
8624
  },
8625
  {
8626
    /* MOD_0F1A_PREFIX_0 */
8627
    { "bndldx",   { Gbnd, Mv_bnd }, 0 },
8628
    { "nopQ",   { Ev }, 0 },
8629
  },
8630
  {
8631
    /* MOD_0F1B_PREFIX_0 */
8632
    { "bndstx",   { Mv_bnd, Gbnd }, 0 },
8633
    { "nopQ",   { Ev }, 0 },
8634
  },
8635
  {
8636
    /* MOD_0F1B_PREFIX_1 */
8637
    { "bndmk",    { Gbnd, Mv_bnd }, 0 },
8638
    { "nopQ",   { Ev }, PREFIX_IGNORED },
8639
  },
8640
  {
8641
    /* MOD_0F1C_PREFIX_0 */
8642
    { REG_TABLE (REG_0F1C_P_0_MOD_0) },
8643
    { "nopQ",   { Ev }, 0 },
8644
  },
8645
  {
8646
    /* MOD_0F1E_PREFIX_1 */
8647
    { "nopQ",   { Ev }, PREFIX_IGNORED },
8648
    { REG_TABLE (REG_0F1E_P_1_MOD_3) },
8649
  },
8650
  {
8651
    /* MOD_0FAE_REG_0 */
8652
    { "fxsave",   { FXSAVE }, 0 },
8653
    { PREFIX_TABLE (PREFIX_0FAE_REG_0_MOD_3) },
8654
  },
8655
  {
8656
    /* MOD_0FAE_REG_1 */
8657
    { "fxrstor",  { FXSAVE }, 0 },
8658
    { PREFIX_TABLE (PREFIX_0FAE_REG_1_MOD_3) },
8659
  },
8660
  {
8661
    /* MOD_0FAE_REG_2 */
8662
    { "ldmxcsr",  { Md }, 0 },
8663
    { PREFIX_TABLE (PREFIX_0FAE_REG_2_MOD_3) },
8664
  },
8665
  {
8666
    /* MOD_0FAE_REG_3 */
8667
    { "stmxcsr",  { Md }, 0 },
8668
    { PREFIX_TABLE (PREFIX_0FAE_REG_3_MOD_3) },
8669
  },
8670
  {
8671
    /* MOD_0FAE_REG_4 */
8672
    { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_0) },
8673
    { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_3) },
8674
  },
8675
  {
8676
    /* MOD_0FAE_REG_5 */
8677
    { "xrstor",   { FXSAVE }, PREFIX_OPCODE | PREFIX_REX2_ILLEGAL },
8678
    { PREFIX_TABLE (PREFIX_0FAE_REG_5_MOD_3) },
8679
  },
8680
  {
8681
    /* MOD_0FAE_REG_6 */
8682
    { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_0) },
8683
    { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_3) },
8684
  },
8685
  {
8686
    /* MOD_0FAE_REG_7 */
8687
    { PREFIX_TABLE (PREFIX_0FAE_REG_7_MOD_0) },
8688
    { RM_TABLE (RM_0FAE_REG_7_MOD_3) },
8689
  },
8690
  {
8691
    /* MOD_0FC7_REG_6 */
8692
    { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_0) },
8693
    { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_3) }
8694
  },
8695
  {
8696
    /* MOD_0FC7_REG_7 */
8697
    { "vmptrst",  { Mq }, 0 },
8698
    { PREFIX_TABLE (PREFIX_0FC7_REG_7_MOD_3) }
8699
  },
8700
  {
8701
    /* MOD_0F38DC_PREFIX_1 */
8702
    { "aesenc128kl",    { XM, M }, 0 },
8703
    { "loadiwkey",      { XM, EXx }, 0 },
8704
  },
8705
  /* MOD_0F38F8 */
8706
  {
8707
    { PREFIX_TABLE (PREFIX_0F38F8_M_0) },
8708
    { X86_64_TABLE (X86_64_0F38F8_M_1) },
8709
  },
8710
  {
8711
    /* MOD_VEX_0F3849_X86_64_L_0_W_0 */
8712
    { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_0) },
8713
    { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_1) },
8714
  },
8715
8716
#include "i386-dis-evex-mod.h"
8717
};
8718
8719
static const struct dis386 rm_table[][8] = {
8720
  {
8721
    /* RM_C6_REG_7 */
8722
    { "xabort",   { Skip_MODRM, Ib }, 0 },
8723
  },
8724
  {
8725
    /* RM_C7_REG_7 */
8726
    { "xbeginT",  { Skip_MODRM, Jdqw }, 0 },
8727
  },
8728
  {
8729
    /* RM_0F01_REG_0 */
8730
    { "enclv",    { Skip_MODRM }, 0 },
8731
    { "vmcall",   { Skip_MODRM }, 0 },
8732
    { "vmlaunch", { Skip_MODRM }, 0 },
8733
    { "vmresume", { Skip_MODRM }, 0 },
8734
    { "vmxoff",   { Skip_MODRM }, 0 },
8735
    { "pconfig",  { Skip_MODRM }, 0 },
8736
    { PREFIX_TABLE (PREFIX_0F01_REG_0_MOD_3_RM_6) },
8737
    { PREFIX_TABLE (PREFIX_0F01_REG_0_MOD_3_RM_7) },
8738
  },
8739
  {
8740
    /* RM_0F01_REG_1 */
8741
    { "monitor",  { { OP_Monitor, 0 } }, 0 },
8742
    { "mwait",    { { OP_Mwait, 0 } }, 0 },
8743
    { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_2) },
8744
    { "stac",   { Skip_MODRM }, 0 },
8745
    { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_4) },
8746
    { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_5) },
8747
    { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_6) },
8748
    { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_7) },
8749
  },
8750
  {
8751
    /* RM_0F01_REG_2 */
8752
    { "xgetbv",   { Skip_MODRM }, 0 },
8753
    { "xsetbv",   { Skip_MODRM }, 0 },
8754
    { Bad_Opcode },
8755
    { Bad_Opcode },
8756
    { "vmfunc",   { Skip_MODRM }, 0 },
8757
    { "xend",   { Skip_MODRM }, 0 },
8758
    { "xtest",    { Skip_MODRM }, 0 },
8759
    { "enclu",    { Skip_MODRM }, 0 },
8760
  },
8761
  {
8762
    /* RM_0F01_REG_3 */
8763
    { "vmrun",    { Skip_MODRM }, 0 },
8764
    { PREFIX_TABLE (PREFIX_0F01_REG_3_RM_1) },
8765
    { "vmload",   { Skip_MODRM }, 0 },
8766
    { "vmsave",   { Skip_MODRM }, 0 },
8767
    { "stgi",   { Skip_MODRM }, 0 },
8768
    { "clgi",   { Skip_MODRM }, 0 },
8769
    { "skinit",   { Skip_MODRM }, 0 },
8770
    { "invlpga",  { Skip_MODRM }, 0 },
8771
  },
8772
  {
8773
    /* RM_0F01_REG_5_MOD_3 */
8774
    { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_0) },
8775
    { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_1) },
8776
    { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_2) },
8777
    { Bad_Opcode },
8778
    { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_4) },
8779
    { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_5) },
8780
    { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_6) },
8781
    { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_7) },
8782
  },
8783
  {
8784
    /* RM_0F01_REG_7_MOD_3 */
8785
    { "swapgs",   { Skip_MODRM }, 0  },
8786
    { "rdtscp",   { Skip_MODRM }, 0  },
8787
    { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_2) },
8788
    { "mwaitx",   { { OP_Mwait, eBX_reg } }, PREFIX_OPCODE },
8789
    { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_4) },
8790
    { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_5) },
8791
    { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_6) },
8792
    { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_7) },
8793
  },
8794
  {
8795
    /* RM_0F1E_P_1_MOD_3_REG_7 */
8796
    { "nopQ",   { Ev }, PREFIX_IGNORED },
8797
    { "nopQ",   { Ev }, PREFIX_IGNORED },
8798
    { "endbr64",  { Skip_MODRM }, 0 },
8799
    { "endbr32",  { Skip_MODRM }, 0 },
8800
    { "nopQ",   { Ev }, PREFIX_IGNORED },
8801
    { "nopQ",   { Ev }, PREFIX_IGNORED },
8802
    { "nopQ",   { Ev }, PREFIX_IGNORED },
8803
    { "nopQ",   { Ev }, PREFIX_IGNORED },
8804
  },
8805
  {
8806
    /* RM_0FAE_REG_6_MOD_3 */
8807
    { "mfence",   { Skip_MODRM }, 0 },
8808
  },
8809
  {
8810
    /* RM_0FAE_REG_7_MOD_3 */
8811
    { "sfence",   { Skip_MODRM }, 0 },
8812
  },
8813
  {
8814
    /* RM_0F3A0F_P_1_R_0 */
8815
    { "hreset",   { Skip_MODRM, Ib }, 0 },
8816
  },
8817
  {
8818
    /* RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0_R_0 */
8819
    { "tilerelease",  { Skip_MODRM }, 0 },
8820
  },
8821
  {
8822
    /* RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_3 */
8823
    { "tilezero", { TMM, Skip_MODRM }, 0 },
8824
  },
8825
};
8826
8827
0
#define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
8828
8829
/* The values used here must be non-zero, fit in 'unsigned char', and not be
8830
   in conflict with actual prefix opcodes.  */
8831
1.18k
#define REP_PREFIX  0x01
8832
4.90k
#define XACQUIRE_PREFIX 0x02
8833
7.00k
#define XRELEASE_PREFIX 0x03
8834
4.85k
#define BND_PREFIX  0x04
8835
3.83k
#define NOTRACK_PREFIX  0x05
8836
8837
static enum {
8838
  ckp_okay,
8839
  ckp_bogus,
8840
  ckp_fetch_error,
8841
}
8842
ckprefix (instr_info *ins)
8843
6.55M
{
8844
6.55M
  int i, length;
8845
6.55M
  uint8_t newrex;
8846
8847
6.55M
  i = 0;
8848
6.55M
  length = 0;
8849
  /* The maximum instruction length is 15bytes.  */
8850
7.67M
  while (length < MAX_CODE_LENGTH - 1)
8851
7.66M
    {
8852
7.66M
      if (!fetch_code (ins->info, ins->codep + 1))
8853
3.94k
  return ckp_fetch_error;
8854
7.66M
      newrex = 0;
8855
7.66M
      switch (*ins->codep)
8856
7.66M
  {
8857
  /* REX prefixes family.  */
8858
32.3k
  case 0x40:
8859
72.6k
  case 0x41:
8860
107k
  case 0x42:
8861
127k
  case 0x43:
8862
152k
  case 0x44:
8863
177k
  case 0x45:
8864
211k
  case 0x46:
8865
233k
  case 0x47:
8866
303k
  case 0x48:
8867
346k
  case 0x49:
8868
369k
  case 0x4a:
8869
383k
  case 0x4b:
8870
416k
  case 0x4c:
8871
443k
  case 0x4d:
8872
476k
  case 0x4e:
8873
540k
  case 0x4f:
8874
540k
    if (ins->address_mode == mode_64bit)
8875
483k
      newrex = *ins->codep;
8876
57.2k
    else
8877
57.2k
      return ckp_okay;
8878
483k
    ins->last_rex_prefix = i;
8879
483k
    break;
8880
  /* REX2 must be the last prefix. */
8881
58.2k
  case REX2_OPCODE:
8882
58.2k
    if (ins->address_mode == mode_64bit)
8883
54.8k
      {
8884
54.8k
        if (ins->last_rex_prefix >= 0)
8885
814
    return ckp_bogus;
8886
8887
54.0k
        ins->codep++;
8888
54.0k
        if (!fetch_code (ins->info, ins->codep + 1))
8889
169
    return ckp_fetch_error;
8890
53.8k
        ins->rex2_payload = *ins->codep;
8891
53.8k
        ins->rex2 = ins->rex2_payload >> 4;
8892
53.8k
        ins->rex = (ins->rex2_payload & 0xf) | REX_OPCODE;
8893
53.8k
        ins->codep++;
8894
53.8k
        ins->last_rex2_prefix = i;
8895
53.8k
        ins->all_prefixes[i] = REX2_OPCODE;
8896
53.8k
      }
8897
57.3k
    return ckp_okay;
8898
44.6k
  case 0xf3:
8899
44.6k
    ins->prefixes |= PREFIX_REPZ;
8900
44.6k
    ins->last_repz_prefix = i;
8901
44.6k
    break;
8902
53.2k
  case 0xf2:
8903
53.2k
    ins->prefixes |= PREFIX_REPNZ;
8904
53.2k
    ins->last_repnz_prefix = i;
8905
53.2k
    break;
8906
55.8k
  case 0xf0:
8907
55.8k
    ins->prefixes |= PREFIX_LOCK;
8908
55.8k
    ins->last_lock_prefix = i;
8909
55.8k
    break;
8910
65.1k
  case 0x2e:
8911
65.1k
    ins->prefixes |= PREFIX_CS;
8912
65.1k
    ins->last_seg_prefix = i;
8913
65.1k
    if (ins->address_mode != mode_64bit)
8914
15.9k
      ins->active_seg_prefix = PREFIX_CS;
8915
65.1k
    break;
8916
26.7k
  case 0x36:
8917
26.7k
    ins->prefixes |= PREFIX_SS;
8918
26.7k
    ins->last_seg_prefix = i;
8919
26.7k
    if (ins->address_mode != mode_64bit)
8920
5.66k
      ins->active_seg_prefix = PREFIX_SS;
8921
26.7k
    break;
8922
114k
  case 0x3e:
8923
114k
    ins->prefixes |= PREFIX_DS;
8924
114k
    ins->last_seg_prefix = i;
8925
114k
    if (ins->address_mode != mode_64bit)
8926
18.0k
      ins->active_seg_prefix = PREFIX_DS;
8927
114k
    break;
8928
39.0k
  case 0x26:
8929
39.0k
    ins->prefixes |= PREFIX_ES;
8930
39.0k
    ins->last_seg_prefix = i;
8931
39.0k
    if (ins->address_mode != mode_64bit)
8932
10.3k
      ins->active_seg_prefix = PREFIX_ES;
8933
39.0k
    break;
8934
86.2k
  case 0x64:
8935
86.2k
    ins->prefixes |= PREFIX_FS;
8936
86.2k
    ins->last_seg_prefix = i;
8937
86.2k
    ins->active_seg_prefix = PREFIX_FS;
8938
86.2k
    break;
8939
77.7k
  case 0x65:
8940
77.7k
    ins->prefixes |= PREFIX_GS;
8941
77.7k
    ins->last_seg_prefix = i;
8942
77.7k
    ins->active_seg_prefix = PREFIX_GS;
8943
77.7k
    break;
8944
89.6k
  case 0x66:
8945
89.6k
    ins->prefixes |= PREFIX_DATA;
8946
89.6k
    ins->last_data_prefix = i;
8947
89.6k
    break;
8948
103k
  case 0x67:
8949
103k
    ins->prefixes |= PREFIX_ADDR;
8950
103k
    ins->last_addr_prefix = i;
8951
103k
    break;
8952
25.8k
  case FWAIT_OPCODE:
8953
    /* fwait is really an instruction.  If there are prefixes
8954
       before the fwait, they belong to the fwait, *not* to the
8955
       following instruction.  */
8956
25.8k
    ins->fwait_prefix = i;
8957
25.8k
    if (ins->prefixes || ins->rex)
8958
9.31k
      {
8959
9.31k
        ins->prefixes |= PREFIX_FWAIT;
8960
9.31k
        ins->codep++;
8961
        /* This ensures that the previous REX prefixes are noticed
8962
     as unused prefixes, as in the return case below.  */
8963
9.31k
        return ins->rex ? ckp_bogus : ckp_okay;
8964
9.31k
      }
8965
16.5k
    ins->prefixes = PREFIX_FWAIT;
8966
16.5k
    break;
8967
6.28M
  default:
8968
6.28M
    return ckp_okay;
8969
7.66M
  }
8970
      /* Rex is ignored when followed by another prefix.  */
8971
1.25M
      if (ins->rex)
8972
141k
  return ckp_bogus;
8973
1.11M
      if (*ins->codep != FWAIT_OPCODE)
8974
1.09M
  ins->all_prefixes[i++] = *ins->codep;
8975
1.11M
      ins->rex = newrex;
8976
1.11M
      ins->codep++;
8977
1.11M
      length++;
8978
1.11M
    }
8979
3.88k
  return ckp_bogus;
8980
6.55M
}
8981
8982
/* Return the name of the prefix byte PREF, or NULL if PREF is not a
8983
   prefix byte.  */
8984
8985
static const char *
8986
prefix_name (enum address_mode mode, uint8_t pref, int sizeflag)
8987
718k
{
8988
718k
  static const char *rexes [16] =
8989
718k
    {
8990
718k
      "rex",    /* 0x40 */
8991
718k
      "rex.B",    /* 0x41 */
8992
718k
      "rex.X",    /* 0x42 */
8993
718k
      "rex.XB",   /* 0x43 */
8994
718k
      "rex.R",    /* 0x44 */
8995
718k
      "rex.RB",   /* 0x45 */
8996
718k
      "rex.RX",   /* 0x46 */
8997
718k
      "rex.RXB",  /* 0x47 */
8998
718k
      "rex.W",    /* 0x48 */
8999
718k
      "rex.WB",   /* 0x49 */
9000
718k
      "rex.WX",   /* 0x4a */
9001
718k
      "rex.WXB",  /* 0x4b */
9002
718k
      "rex.WR",   /* 0x4c */
9003
718k
      "rex.WRB",  /* 0x4d */
9004
718k
      "rex.WRX",  /* 0x4e */
9005
718k
      "rex.WRXB", /* 0x4f */
9006
718k
    };
9007
9008
718k
  switch (pref)
9009
718k
    {
9010
    /* REX prefixes family.  */
9011
20.9k
    case 0x40:
9012
31.7k
    case 0x41:
9013
53.2k
    case 0x42:
9014
63.4k
    case 0x43:
9015
75.7k
    case 0x44:
9016
87.7k
    case 0x45:
9017
107k
    case 0x46:
9018
120k
    case 0x47:
9019
143k
    case 0x48:
9020
162k
    case 0x49:
9021
177k
    case 0x4a:
9022
185k
    case 0x4b:
9023
202k
    case 0x4c:
9024
218k
    case 0x4d:
9025
237k
    case 0x4e:
9026
270k
    case 0x4f:
9027
270k
      return rexes [pref - 0x40];
9028
26.9k
    case 0xf3:
9029
26.9k
      return "repz";
9030
28.6k
    case 0xf2:
9031
28.6k
      return "repnz";
9032
45.3k
    case 0xf0:
9033
45.3k
      return "lock";
9034
42.5k
    case 0x2e:
9035
42.5k
      return "cs";
9036
20.2k
    case 0x36:
9037
20.2k
      return "ss";
9038
36.5k
    case 0x3e:
9039
36.5k
      return "ds";
9040
25.8k
    case 0x26:
9041
25.8k
      return "es";
9042
53.2k
    case 0x64:
9043
53.2k
      return "fs";
9044
37.0k
    case 0x65:
9045
37.0k
      return "gs";
9046
37.3k
    case 0x66:
9047
37.3k
      return (sizeflag & DFLAG) ? "data16" : "data32";
9048
53.2k
    case 0x67:
9049
53.2k
      if (mode == mode_64bit)
9050
40.5k
  return (sizeflag & AFLAG) ? "addr32" : "addr64";
9051
12.7k
      else
9052
12.7k
  return (sizeflag & AFLAG) ? "addr16" : "addr32";
9053
188
    case FWAIT_OPCODE:
9054
188
      return "fwait";
9055
593
    case REP_PREFIX:
9056
593
      return "rep";
9057
2.39k
    case XACQUIRE_PREFIX:
9058
2.39k
      return "xacquire";
9059
3.31k
    case XRELEASE_PREFIX:
9060
3.31k
      return "xrelease";
9061
2.42k
    case BND_PREFIX:
9062
2.42k
      return "bnd";
9063
1.84k
    case NOTRACK_PREFIX:
9064
1.84k
      return "notrack";
9065
29.4k
    case REX2_OPCODE:
9066
29.4k
      return "rex2";
9067
324
    default:
9068
324
      return NULL;
9069
718k
    }
9070
718k
}
9071
9072
void
9073
print_i386_disassembler_options (FILE *stream)
9074
0
{
9075
0
  fprintf (stream, _("\n\
9076
0
The following i386/x86-64 specific disassembler options are supported for use\n\
9077
0
with the -M switch (multiple options should be separated by commas):\n"));
9078
9079
0
  fprintf (stream, _("  x86-64      Disassemble in 64bit mode\n"));
9080
0
  fprintf (stream, _("  i386        Disassemble in 32bit mode\n"));
9081
0
  fprintf (stream, _("  i8086       Disassemble in 16bit mode\n"));
9082
0
  fprintf (stream, _("  att         Display instruction in AT&T syntax\n"));
9083
0
  fprintf (stream, _("  intel       Display instruction in Intel syntax\n"));
9084
0
  fprintf (stream, _("  att-mnemonic  (AT&T syntax only)\n"
9085
0
         "              Display instruction with AT&T mnemonic\n"));
9086
0
  fprintf (stream, _("  intel-mnemonic  (AT&T syntax only)\n"
9087
0
         "              Display instruction with Intel mnemonic\n"));
9088
0
  fprintf (stream, _("  addr64      Assume 64bit address size\n"));
9089
0
  fprintf (stream, _("  addr32      Assume 32bit address size\n"));
9090
0
  fprintf (stream, _("  addr16      Assume 16bit address size\n"));
9091
0
  fprintf (stream, _("  data32      Assume 32bit data size\n"));
9092
0
  fprintf (stream, _("  data16      Assume 16bit data size\n"));
9093
0
  fprintf (stream, _("  suffix      Always display instruction suffix in AT&T syntax\n"));
9094
0
  fprintf (stream, _("  amd64       Display instruction in AMD64 ISA\n"));
9095
0
  fprintf (stream, _("  intel64     Display instruction in Intel64 ISA\n"));
9096
0
  fprintf (stream, _("  annotate-immediates  Annotate immediate operands that match symbols\n"));
9097
0
}
9098
9099
/* Bad opcode.  */
9100
static const struct dis386 bad_opcode = { "(bad)", { XX }, 0 };
9101
9102
/* Fetch error indicator.  */
9103
static const struct dis386 err_opcode = { NULL, { XX }, 0 };
9104
9105
static const struct dis386 map5_f8_opcode = { X86_64_TABLE (X86_64_VEX_MAP5_F8) };
9106
static const struct dis386 map5_f9_opcode = { X86_64_TABLE (X86_64_VEX_MAP5_F9) };
9107
static const struct dis386 map5_fd_opcode = { X86_64_TABLE (X86_64_VEX_MAP5_FD) };
9108
static const struct dis386 map7_f6_opcode = { VEX_LEN_TABLE (VEX_LEN_MAP7_F6) };
9109
static const struct dis386 map7_f8_opcode = { VEX_LEN_TABLE (VEX_LEN_MAP7_F8) };
9110
9111
/* Get a pointer to struct dis386 with a valid name.  */
9112
9113
static const struct dis386 *
9114
get_valid_dis386 (const struct dis386 *dp, instr_info *ins)
9115
7.76M
{
9116
7.76M
  int vindex, vex_table_index;
9117
9118
7.76M
  if (dp->name != NULL)
9119
4.50M
    return dp;
9120
9121
3.25M
  switch (dp->op[0].bytemode)
9122
3.25M
    {
9123
933k
    case USE_REG_TABLE:
9124
933k
      dp = &reg_table[dp->op[1].bytemode][ins->modrm.reg];
9125
933k
      break;
9126
9127
63.1k
    case USE_MOD_TABLE:
9128
63.1k
      vindex = ins->modrm.mod == 0x3 ? 1 : 0;
9129
63.1k
      dp = &mod_table[dp->op[1].bytemode][vindex];
9130
63.1k
      break;
9131
9132
7.45k
    case USE_RM_TABLE:
9133
7.45k
      dp = &rm_table[dp->op[1].bytemode][ins->modrm.rm];
9134
7.45k
      break;
9135
9136
133k
    case USE_PREFIX_TABLE:
9137
135k
    use_prefix_table:
9138
135k
      if (ins->need_vex)
9139
65.4k
  {
9140
    /* The prefix in VEX is implicit.  */
9141
65.4k
    switch (ins->vex.prefix)
9142
65.4k
      {
9143
14.2k
      case 0:
9144
14.2k
        vindex = 0;
9145
14.2k
        break;
9146
16.7k
      case REPE_PREFIX_OPCODE:
9147
16.7k
        vindex = 1;
9148
16.7k
        break;
9149
19.5k
      case DATA_PREFIX_OPCODE:
9150
19.5k
        vindex = 2;
9151
19.5k
        break;
9152
14.8k
      case REPNE_PREFIX_OPCODE:
9153
14.8k
        vindex = 3;
9154
14.8k
        break;
9155
0
      default:
9156
0
        abort ();
9157
0
        break;
9158
65.4k
      }
9159
65.4k
  }
9160
69.7k
      else
9161
69.7k
  {
9162
69.7k
    int last_prefix = -1;
9163
69.7k
    int prefix = 0;
9164
69.7k
    vindex = 0;
9165
    /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
9166
       When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
9167
       last one wins.  */
9168
69.7k
    if ((ins->prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
9169
11.4k
      {
9170
11.4k
        if (ins->last_repz_prefix > ins->last_repnz_prefix)
9171
5.15k
    {
9172
5.15k
      vindex = 1;
9173
5.15k
      prefix = PREFIX_REPZ;
9174
5.15k
      last_prefix = ins->last_repz_prefix;
9175
5.15k
    }
9176
6.32k
        else
9177
6.32k
    {
9178
6.32k
      vindex = 3;
9179
6.32k
      prefix = PREFIX_REPNZ;
9180
6.32k
      last_prefix = ins->last_repnz_prefix;
9181
6.32k
    }
9182
9183
        /* Check if prefix should be ignored.  */
9184
11.4k
        if ((((prefix_table[dp->op[1].bytemode][vindex].prefix_requirement
9185
11.4k
         & PREFIX_IGNORED) >> PREFIX_IGNORED_SHIFT)
9186
11.4k
       & prefix) != 0
9187
2.71k
      && !prefix_table[dp->op[1].bytemode][vindex].name)
9188
785
    vindex = 0;
9189
11.4k
      }
9190
9191
69.7k
    if (vindex == 0 && (ins->prefixes & PREFIX_DATA) != 0)
9192
9.67k
      {
9193
9.67k
        vindex = 2;
9194
9.67k
        prefix = PREFIX_DATA;
9195
9.67k
        last_prefix = ins->last_data_prefix;
9196
9.67k
      }
9197
9198
69.7k
    if (vindex != 0)
9199
20.3k
      {
9200
20.3k
        ins->used_prefixes |= prefix;
9201
20.3k
        ins->all_prefixes[last_prefix] = 0;
9202
20.3k
      }
9203
69.7k
  }
9204
135k
      dp = &prefix_table[dp->op[1].bytemode][vindex];
9205
135k
      break;
9206
9207
2.93k
    case USE_X86_64_EVEX_FROM_VEX_TABLE:
9208
4.87k
    case USE_X86_64_EVEX_PFX_TABLE:
9209
6.24k
    case USE_X86_64_EVEX_W_TABLE:
9210
7.69k
    case USE_X86_64_EVEX_MEM_W_TABLE:
9211
7.69k
      ins->evex_type = evex_from_vex;
9212
      /* EVEX from VEX instructions are 64-bit only and require that EVEX.z,
9213
   EVEX.L'L, EVEX.b, and the lower 2 bits of EVEX.aaa must be 0.  */
9214
7.69k
      if (ins->address_mode != mode_64bit
9215
6.80k
    || (ins->vex.mask_register_specifier & 0x3) != 0
9216
5.94k
    || ins->vex.ll != 0
9217
5.55k
    || ins->vex.zeroing != 0
9218
5.18k
    || ins->vex.b)
9219
3.13k
  return &bad_opcode;
9220
9221
4.55k
      if (dp->op[0].bytemode == USE_X86_64_EVEX_PFX_TABLE)
9222
1.11k
  goto use_prefix_table;
9223
3.44k
      if (dp->op[0].bytemode == USE_X86_64_EVEX_W_TABLE)
9224
981
  goto use_vex_w_table;
9225
2.46k
      if (dp->op[0].bytemode == USE_X86_64_EVEX_MEM_W_TABLE)
9226
782
  {
9227
782
    if (ins->modrm.mod == 3)
9228
491
      return &bad_opcode;
9229
291
    goto use_vex_w_table;
9230
782
  }
9231
9232
      /* Fall through.  */
9233
830k
    case USE_X86_64_TABLE:
9234
830k
      vindex = ins->address_mode == mode_64bit ? 1 : 0;
9235
830k
      dp = &x86_64_table[dp->op[1].bytemode][vindex];
9236
830k
      break;
9237
9238
6.87k
    case USE_3BYTE_TABLE:
9239
6.87k
      if (ins->last_rex2_prefix >= 0)
9240
1.18k
  return &err_opcode;
9241
5.69k
      if (!fetch_code (ins->info, ins->codep + 2))
9242
39
  return &err_opcode;
9243
5.65k
      vindex = *ins->codep++;
9244
5.65k
      dp = &three_byte_table[dp->op[1].bytemode][vindex];
9245
5.65k
      ins->end_codep = ins->codep;
9246
5.65k
      if (!fetch_modrm (ins))
9247
0
  return &err_opcode;
9248
5.65k
      break;
9249
9250
22.2k
    case USE_VEX_LEN_TABLE:
9251
22.2k
      if (!ins->need_vex)
9252
0
  abort ();
9253
9254
22.2k
      switch (ins->vex.length)
9255
22.2k
  {
9256
16.1k
  case 128:
9257
16.1k
    vindex = 0;
9258
16.1k
    break;
9259
837
  case 512:
9260
    /* This allows re-using in particular table entries where only
9261
       128-bit operand size (VEX.L=0 / EVEX.L'L=0) are valid.  */
9262
837
    if (ins->vex.evex)
9263
837
      {
9264
6.05k
  case 256:
9265
6.05k
        vindex = 1;
9266
6.05k
        break;
9267
837
      }
9268
  /* Fall through.  */
9269
0
  default:
9270
0
    abort ();
9271
0
    break;
9272
22.2k
  }
9273
9274
22.2k
      dp = &vex_len_table[dp->op[1].bytemode][vindex];
9275
22.2k
      break;
9276
9277
5.00k
    case USE_EVEX_LEN_TABLE:
9278
5.00k
      if (!ins->vex.evex)
9279
0
  abort ();
9280
9281
5.00k
      switch (ins->vex.length)
9282
5.00k
  {
9283
1.39k
  case 128:
9284
1.39k
    vindex = 0;
9285
1.39k
    break;
9286
1.12k
  case 256:
9287
1.12k
    vindex = 1;
9288
1.12k
    break;
9289
2.49k
  case 512:
9290
2.49k
    vindex = 2;
9291
2.49k
    break;
9292
0
  default:
9293
0
    abort ();
9294
0
    break;
9295
5.00k
  }
9296
9297
5.00k
      dp = &evex_len_table[dp->op[1].bytemode][vindex];
9298
5.00k
      break;
9299
9300
31.5k
    case USE_XOP_8F_TABLE:
9301
31.5k
      if (!fetch_code (ins->info, ins->codep + 3))
9302
150
  return &err_opcode;
9303
31.4k
      ins->rex = ~(*ins->codep >> 5) & 0x7;
9304
9305
      /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm".  */
9306
31.4k
      switch ((*ins->codep & 0x1f))
9307
31.4k
  {
9308
24.4k
  default:
9309
24.4k
    dp = &bad_opcode;
9310
24.4k
    return dp;
9311
1.97k
  case 0x8:
9312
1.97k
    vex_table_index = XOP_08;
9313
1.97k
    break;
9314
2.98k
  case 0x9:
9315
2.98k
    vex_table_index = XOP_09;
9316
2.98k
    break;
9317
1.96k
  case 0xa:
9318
1.96k
    vex_table_index = XOP_0A;
9319
1.96k
    break;
9320
31.4k
  }
9321
6.91k
      ins->codep++;
9322
6.91k
      ins->vex.w = *ins->codep & 0x80;
9323
6.91k
      if (ins->vex.w && ins->address_mode == mode_64bit)
9324
2.37k
  ins->rex |= REX_W;
9325
9326
6.91k
      ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf;
9327
6.91k
      if (ins->address_mode != mode_64bit)
9328
2.06k
  {
9329
    /* In 16/32-bit mode REX_B is silently ignored.  */
9330
2.06k
    ins->rex &= ~REX_B;
9331
2.06k
  }
9332
9333
6.91k
      ins->vex.length = (*ins->codep & 0x4) ? 256 : 128;
9334
6.91k
      switch ((*ins->codep & 0x3))
9335
6.91k
  {
9336
4.76k
  case 0:
9337
4.76k
    break;
9338
694
  case 1:
9339
694
    ins->vex.prefix = DATA_PREFIX_OPCODE;
9340
694
    break;
9341
715
  case 2:
9342
715
    ins->vex.prefix = REPE_PREFIX_OPCODE;
9343
715
    break;
9344
741
  case 3:
9345
741
    ins->vex.prefix = REPNE_PREFIX_OPCODE;
9346
741
    break;
9347
6.91k
  }
9348
6.91k
      ins->need_vex = 3;
9349
6.91k
      ins->codep++;
9350
6.91k
      vindex = *ins->codep++;
9351
6.91k
      dp = &xop_table[vex_table_index][vindex];
9352
9353
6.91k
      ins->end_codep = ins->codep;
9354
6.91k
      if (!fetch_modrm (ins))
9355
373
  return &err_opcode;
9356
9357
      /* No XOP encoding so far allows for a non-zero embedded prefix. Avoid
9358
   having to decode the bits for every otherwise valid encoding.  */
9359
6.54k
      if (ins->vex.prefix)
9360
1.92k
  return &bad_opcode;
9361
4.62k
      break;
9362
9363
56.1k
    case USE_VEX_C4_TABLE:
9364
      /* VEX prefix.  */
9365
56.1k
      if (!fetch_code (ins->info, ins->codep + 3))
9366
343
  return &err_opcode;
9367
55.8k
      ins->rex = ~(*ins->codep >> 5) & 0x7;
9368
55.8k
      switch ((*ins->codep & 0x1f))
9369
55.8k
  {
9370
22.9k
  default:
9371
22.9k
    dp = &bad_opcode;
9372
22.9k
    return dp;
9373
4.00k
  case 0x1:
9374
4.00k
    vex_table_index = VEX_0F;
9375
4.00k
    break;
9376
16.6k
  case 0x2:
9377
16.6k
    vex_table_index = VEX_0F38;
9378
16.6k
    break;
9379
6.55k
  case 0x3:
9380
6.55k
    vex_table_index = VEX_0F3A;
9381
6.55k
    break;
9382
3.81k
  case 0x5:
9383
3.81k
    vex_table_index = VEX_MAP5;
9384
3.81k
    break;
9385
1.80k
  case 0x7:
9386
1.80k
    vex_table_index = VEX_MAP7;
9387
1.80k
    break;
9388
55.8k
  }
9389
32.8k
      ins->codep++;
9390
32.8k
      ins->vex.w = *ins->codep & 0x80;
9391
32.8k
      if (ins->address_mode == mode_64bit)
9392
25.8k
  {
9393
25.8k
    if (ins->vex.w)
9394
8.08k
      ins->rex |= REX_W;
9395
25.8k
  }
9396
7.03k
      else
9397
7.03k
  {
9398
    /* For the 3-byte VEX prefix in 32-bit mode, the REX_B bit
9399
       is ignored, other REX bits are 0 and the highest bit in
9400
       VEX.vvvv is also ignored (but we mustn't clear it here).  */
9401
7.03k
    ins->rex = 0;
9402
7.03k
  }
9403
32.8k
      ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf;
9404
32.8k
      ins->vex.length = (*ins->codep & 0x4) ? 256 : 128;
9405
32.8k
      switch ((*ins->codep & 0x3))
9406
32.8k
  {
9407
10.6k
  case 0:
9408
10.6k
    break;
9409
9.47k
  case 1:
9410
9.47k
    ins->vex.prefix = DATA_PREFIX_OPCODE;
9411
9.47k
    break;
9412
6.68k
  case 2:
9413
6.68k
    ins->vex.prefix = REPE_PREFIX_OPCODE;
9414
6.68k
    break;
9415
6.06k
  case 3:
9416
6.06k
    ins->vex.prefix = REPNE_PREFIX_OPCODE;
9417
6.06k
    break;
9418
32.8k
  }
9419
32.8k
      ins->need_vex = 3;
9420
32.8k
      ins->codep++;
9421
32.8k
      vindex = *ins->codep++;
9422
32.8k
      ins->condition_code = vindex & 0xf;
9423
32.8k
      if (vex_table_index != VEX_MAP7 && vex_table_index != VEX_MAP5)
9424
27.2k
  dp = &vex_table[vex_table_index][vindex];
9425
5.62k
      else if (vindex == 0xf6)
9426
485
  dp = &map7_f6_opcode;
9427
5.13k
      else if (vindex == 0xf8)
9428
2.00k
  {
9429
2.00k
    if (vex_table_index == VEX_MAP5)
9430
1.25k
      dp = &map5_f8_opcode;
9431
753
    else
9432
753
      dp = &map7_f8_opcode;
9433
2.00k
  }
9434
3.13k
      else if (vindex == 0xf9)
9435
389
  dp = &map5_f9_opcode;
9436
2.74k
      else if (vindex == 0xfd)
9437
497
  dp = &map5_fd_opcode;
9438
2.24k
      else
9439
2.24k
  dp = &bad_opcode;
9440
32.8k
      ins->end_codep = ins->codep;
9441
      /* There is no MODRM byte for VEX0F 77.  */
9442
32.8k
      if ((vex_table_index != VEX_0F || vindex != 0x77)
9443
32.5k
    && !fetch_modrm (ins))
9444
809
  return &err_opcode;
9445
32.0k
      break;
9446
9447
32.0k
    case USE_VEX_C5_TABLE:
9448
      /* VEX prefix.  */
9449
31.3k
      if (!fetch_code (ins->info, ins->codep + 2))
9450
227
  return &err_opcode;
9451
31.1k
      ins->rex = (*ins->codep & 0x80) ? 0 : REX_R;
9452
9453
      /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in
9454
   VEX.vvvv is 1.  */
9455
31.1k
      ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf;
9456
31.1k
      ins->vex.length = (*ins->codep & 0x4) ? 256 : 128;
9457
31.1k
      switch ((*ins->codep & 0x3))
9458
31.1k
  {
9459
5.76k
  case 0:
9460
5.76k
    break;
9461
16.6k
  case 1:
9462
16.6k
    ins->vex.prefix = DATA_PREFIX_OPCODE;
9463
16.6k
    break;
9464
2.88k
  case 2:
9465
2.88k
    ins->vex.prefix = REPE_PREFIX_OPCODE;
9466
2.88k
    break;
9467
5.86k
  case 3:
9468
5.86k
    ins->vex.prefix = REPNE_PREFIX_OPCODE;
9469
5.86k
    break;
9470
31.1k
  }
9471
31.1k
      ins->need_vex = 2;
9472
31.1k
      ins->codep++;
9473
31.1k
      vindex = *ins->codep++;
9474
31.1k
      dp = &vex_table[VEX_0F][vindex];
9475
31.1k
      ins->end_codep = ins->codep;
9476
      /* There is no MODRM byte for VEX 77.  */
9477
31.1k
      if (vindex != 0x77 && !fetch_modrm (ins))
9478
316
  return &err_opcode;
9479
30.8k
      break;
9480
9481
30.8k
    case USE_VEX_W_TABLE:
9482
29.4k
    use_vex_w_table:
9483
29.4k
      if (!ins->need_vex)
9484
0
  abort ();
9485
9486
29.4k
      dp = &vex_w_table[dp->op[1].bytemode][ins->vex.w];
9487
29.4k
      break;
9488
9489
151k
    case USE_EVEX_TABLE:
9490
151k
      ins->two_source_ops = false;
9491
      /* EVEX prefix.  */
9492
151k
      ins->vex.evex = true;
9493
151k
      if (!fetch_code (ins->info, ins->codep + 4))
9494
491
  return &err_opcode;
9495
      /* The first byte after 0x62.  */
9496
150k
      if (*ins->codep & 0x8)
9497
26.3k
  ins->rex2 |= REX_B;
9498
150k
      if (!(*ins->codep & 0x10))
9499
82.3k
  ins->rex2 |= REX_R;
9500
9501
150k
      ins->rex = ~(*ins->codep >> 5) & 0x7;
9502
150k
      switch (*ins->codep & 0x7)
9503
150k
  {
9504
8.38k
  default:
9505
8.38k
    return &bad_opcode;
9506
24.0k
  case 0x1:
9507
24.0k
    vex_table_index = EVEX_0F;
9508
24.0k
    break;
9509
40.2k
  case 0x2:
9510
40.2k
    vex_table_index = EVEX_0F38;
9511
40.2k
    break;
9512
17.7k
  case 0x3:
9513
17.7k
    vex_table_index = EVEX_0F3A;
9514
17.7k
    break;
9515
24.9k
  case 0x4:
9516
24.9k
    vex_table_index = EVEX_MAP4;
9517
24.9k
    ins->evex_type = evex_from_legacy;
9518
24.9k
    if (ins->address_mode != mode_64bit)
9519
1.02k
      return &bad_opcode;
9520
23.8k
    ins->rex |= REX_OPCODE;
9521
23.8k
    break;
9522
13.5k
  case 0x5:
9523
13.5k
    vex_table_index = EVEX_MAP5;
9524
13.5k
    break;
9525
16.1k
  case 0x6:
9526
16.1k
    vex_table_index = EVEX_MAP6;
9527
16.1k
    break;
9528
5.49k
  case 0x7:
9529
5.49k
    vex_table_index = EVEX_MAP7;
9530
5.49k
    break;
9531
150k
  }
9532
9533
      /* The second byte after 0x62.  */
9534
141k
      ins->codep++;
9535
141k
      ins->vex.w = *ins->codep & 0x80;
9536
141k
      if (ins->vex.w && ins->address_mode == mode_64bit)
9537
49.0k
  ins->rex |= REX_W;
9538
9539
141k
      ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf;
9540
9541
141k
      if (!(*ins->codep & 0x4))
9542
36.4k
  ins->rex2 |= REX_X;
9543
9544
141k
      switch ((*ins->codep & 0x3))
9545
141k
  {
9546
37.9k
  case 0:
9547
37.9k
    break;
9548
36.8k
  case 1:
9549
36.8k
    ins->vex.prefix = DATA_PREFIX_OPCODE;
9550
36.8k
    break;
9551
37.7k
  case 2:
9552
37.7k
    ins->vex.prefix = REPE_PREFIX_OPCODE;
9553
37.7k
    break;
9554
28.6k
  case 3:
9555
28.6k
    ins->vex.prefix = REPNE_PREFIX_OPCODE;
9556
28.6k
    break;
9557
141k
  }
9558
9559
      /* The third byte after 0x62.  */
9560
141k
      ins->codep++;
9561
9562
      /* Remember the static rounding bits.  */
9563
141k
      ins->vex.ll = (*ins->codep >> 5) & 3;
9564
141k
      ins->vex.b = *ins->codep & 0x10;
9565
9566
141k
      ins->vex.v = *ins->codep & 0x8;
9567
141k
      ins->vex.mask_register_specifier = *ins->codep & 0x7;
9568
141k
      ins->vex.scc = *ins->codep & 0xf;
9569
141k
      ins->vex.zeroing = *ins->codep & 0x80;
9570
      /* Set the NF bit for EVEX-Promoted instructions, this bit will be cleared
9571
   when it's an evex_default one.  */
9572
141k
      ins->vex.nf = *ins->codep & 0x4;
9573
9574
141k
      if (ins->address_mode != mode_64bit)
9575
13.2k
  {
9576
    /* Report bad for !evex_default and when two fixed values of evex
9577
       change.  */
9578
13.2k
    if (ins->evex_type != evex_default
9579
13.2k
        || (ins->rex2 & (REX_B | REX_X)))
9580
1.58k
      return &bad_opcode;
9581
    /* In 16/32-bit mode silently ignore following bits.  */
9582
11.7k
    ins->rex &= ~REX_B;
9583
11.7k
    ins->rex2 &= ~REX_R;
9584
11.7k
  }
9585
9586
139k
      ins->need_vex = 4;
9587
9588
139k
      ins->codep++;
9589
139k
      vindex = *ins->codep++;
9590
139k
      ins->condition_code = vindex & 0xf;
9591
139k
      if (vex_table_index != EVEX_MAP7)
9592
134k
  dp = &evex_table[vex_table_index][vindex];
9593
4.94k
      else if (vindex == 0xf8)
9594
502
  dp = &map7_f8_opcode;
9595
4.44k
      else if (vindex == 0xf6)
9596
669
  dp = &map7_f6_opcode;
9597
3.77k
      else
9598
3.77k
  dp = &bad_opcode;
9599
139k
      ins->end_codep = ins->codep;
9600
139k
      if (!fetch_modrm (ins))
9601
873
  return &err_opcode;
9602
9603
138k
      if (ins->modrm.mod == 3 && (ins->rex2 & REX_X))
9604
4.96k
  return &bad_opcode;
9605
9606
      /* Set vector length. For EVEX-promoted instructions, evex.ll == 0b00,
9607
   which has the same encoding as vex.length == 128 and they can share
9608
   the same processing with vex.length in OP_VEX.  */
9609
133k
      if (ins->modrm.mod == 3 && ins->vex.b && ins->evex_type != evex_from_legacy)
9610
13.8k
  ins->vex.length = 512;
9611
119k
      else
9612
119k
  {
9613
119k
    switch (ins->vex.ll)
9614
119k
      {
9615
44.1k
      case 0x0:
9616
44.1k
        ins->vex.length = 128;
9617
44.1k
        break;
9618
28.0k
      case 0x1:
9619
28.0k
        ins->vex.length = 256;
9620
28.0k
        break;
9621
34.9k
      case 0x2:
9622
34.9k
        ins->vex.length = 512;
9623
34.9k
        break;
9624
12.6k
      default:
9625
12.6k
        return &bad_opcode;
9626
119k
      }
9627
119k
  }
9628
121k
      break;
9629
9630
948k
    case 0:
9631
948k
      dp = &bad_opcode;
9632
948k
      break;
9633
9634
0
    default:
9635
0
      abort ();
9636
3.25M
    }
9637
9638
3.16M
  if (dp->name != NULL)
9639
1.72M
    return dp;
9640
1.44M
  else
9641
1.44M
    return get_valid_dis386 (dp, ins);
9642
3.16M
}
9643
9644
static bool
9645
get_sib (instr_info *ins, int sizeflag)
9646
6.37M
{
9647
  /* If modrm.mod == 3, operand must be register.  */
9648
6.37M
  if (ins->need_modrm
9649
3.83M
      && ((sizeflag & AFLAG) || ins->address_mode == mode_64bit)
9650
3.60M
      && ins->modrm.mod != 3
9651
2.63M
      && ins->modrm.rm == 4)
9652
162k
    {
9653
162k
      if (!fetch_code (ins->info, ins->codep + 2))
9654
1.76k
  return false;
9655
160k
      ins->sib.index = (ins->codep[1] >> 3) & 7;
9656
160k
      ins->sib.scale = (ins->codep[1] >> 6) & 3;
9657
160k
      ins->sib.base = ins->codep[1] & 7;
9658
160k
      ins->has_sib = true;
9659
160k
    }
9660
6.21M
  else
9661
6.21M
    ins->has_sib = false;
9662
9663
6.37M
  return true;
9664
6.37M
}
9665
9666
/* Like oappend_with_style (below) but always with text style.  */
9667
9668
static void
9669
oappend (instr_info *ins, const char *s)
9670
2.31M
{
9671
2.31M
  oappend_with_style (ins, s, dis_style_text);
9672
2.31M
}
9673
9674
/* Like oappend (above), but S is a string starting with '%'.  In
9675
   Intel syntax, the '%' is elided.  */
9676
9677
static void
9678
oappend_register (instr_info *ins, const char *s)
9679
7.66M
{
9680
7.66M
  oappend_with_style (ins, s + ins->intel_syntax, dis_style_register);
9681
7.66M
}
9682
9683
/* Wrap around a call to INS->info->fprintf_styled_func, printing FMT.
9684
   STYLE is the default style to use in the fprintf_styled_func calls,
9685
   however, FMT might include embedded style markers (see oappend_style),
9686
   these embedded markers are not printed, but instead change the style
9687
   used in the next fprintf_styled_func call.  */
9688
9689
static void ATTRIBUTE_PRINTF_3
9690
i386_dis_printf (const disassemble_info *info, enum disassembler_style style,
9691
     const char *fmt, ...)
9692
19.1M
{
9693
19.1M
  va_list ap;
9694
19.1M
  enum disassembler_style curr_style = style;
9695
19.1M
  const char *start, *curr;
9696
19.1M
  char staging_area[50];
9697
9698
19.1M
  va_start (ap, fmt);
9699
  /* In particular print_insn()'s processing of op_txt[] can hand rather long
9700
     strings here.  Bypass vsnprintf() in such cases to avoid capacity issues
9701
     with the staging area.  */
9702
19.1M
  if (strcmp (fmt, "%s"))
9703
10.8M
    {
9704
10.8M
      int res = vsnprintf (staging_area, sizeof (staging_area), fmt, ap);
9705
9706
10.8M
      va_end (ap);
9707
9708
10.8M
      if (res < 0)
9709
0
  return;
9710
9711
10.8M
      if ((size_t) res >= sizeof (staging_area))
9712
0
  abort ();
9713
9714
10.8M
      start = curr = staging_area;
9715
10.8M
    }
9716
8.29M
  else
9717
8.29M
    {
9718
8.29M
      start = curr = va_arg (ap, const char *);
9719
8.29M
      va_end (ap);
9720
8.29M
    }
9721
9722
19.1M
  do
9723
132M
    {
9724
132M
      if (*curr == '\0'
9725
113M
    || (*curr == STYLE_MARKER_CHAR
9726
113M
        && ISXDIGIT (*(curr + 1))
9727
17.3M
        && *(curr + 2) == STYLE_MARKER_CHAR))
9728
36.5M
  {
9729
    /* Output content between our START position and CURR.  */
9730
36.5M
    int len = curr - start;
9731
36.5M
    int n = (*info->fprintf_styled_func) (info->stream, curr_style,
9732
36.5M
            "%.*s", len, start);
9733
36.5M
    if (n < 0)
9734
0
      break;
9735
9736
36.5M
    if (*curr == '\0')
9737
19.1M
      break;
9738
9739
    /* Skip over the initial STYLE_MARKER_CHAR.  */
9740
17.3M
    ++curr;
9741
9742
    /* Update the CURR_STYLE.  As there are less than 16 styles, it
9743
       is possible, that if the input is corrupted in some way, that
9744
       we might set CURR_STYLE to an invalid value.  Don't worry
9745
       though, we check for this situation.  */
9746
17.3M
    if (*curr >= '0' && *curr <= '9')
9747
17.3M
      curr_style = (enum disassembler_style) (*curr - '0');
9748
0
    else if (*curr >= 'a' && *curr <= 'f')
9749
0
      curr_style = (enum disassembler_style) (*curr - 'a' + 10);
9750
0
    else
9751
0
      curr_style = dis_style_text;
9752
9753
    /* Check for an invalid style having been selected.  This should
9754
       never happen, but it doesn't hurt to be a little paranoid.  */
9755
17.3M
    if (curr_style > dis_style_comment_start)
9756
0
      curr_style = dis_style_text;
9757
9758
    /* Skip the hex character, and the closing STYLE_MARKER_CHAR.  */
9759
17.3M
    curr += 2;
9760
9761
    /* Reset the START to after the style marker.  */
9762
17.3M
    start = curr;
9763
17.3M
  }
9764
95.6M
      else
9765
95.6M
  ++curr;
9766
132M
    }
9767
19.1M
  while (true);
9768
19.1M
}
9769
9770
static int
9771
print_insn (bfd_vma pc, disassemble_info *info, int intel_syntax)
9772
6.55M
{
9773
6.55M
  const struct dis386 *dp;
9774
6.55M
  int i;
9775
6.55M
  int ret;
9776
6.55M
  char *op_txt[MAX_OPERANDS];
9777
6.55M
  int needcomma;
9778
6.55M
  bool intel_swap_2_3;
9779
6.55M
  int sizeflag, orig_sizeflag;
9780
6.55M
  const char *p;
9781
6.55M
  struct dis_private priv;
9782
6.55M
  int prefix_length;
9783
6.55M
  int op_count;
9784
6.55M
  instr_info ins = {
9785
6.55M
    .info = info,
9786
6.55M
    .intel_syntax = intel_syntax >= 0
9787
6.55M
        ? intel_syntax
9788
6.55M
        : (info->mach & bfd_mach_i386_intel_syntax) != 0,
9789
6.55M
    .intel_mnemonic = !SYSV386_COMPAT,
9790
6.55M
    .op_index[0 ... MAX_OPERANDS - 1] = -1,
9791
6.55M
    .start_pc = pc,
9792
6.55M
    .start_codep = priv.the_buffer,
9793
6.55M
    .codep = priv.the_buffer,
9794
6.55M
    .obufp = ins.obuf,
9795
6.55M
    .last_lock_prefix = -1,
9796
6.55M
    .last_repz_prefix = -1,
9797
6.55M
    .last_repnz_prefix = -1,
9798
6.55M
    .last_data_prefix = -1,
9799
6.55M
    .last_addr_prefix = -1,
9800
6.55M
    .last_rex_prefix = -1,
9801
6.55M
    .last_rex2_prefix = -1,
9802
6.55M
    .last_seg_prefix = -1,
9803
6.55M
    .fwait_prefix = -1,
9804
6.55M
  };
9805
6.55M
  char op_out[MAX_OPERANDS][MAX_OPERAND_BUFFER_SIZE];
9806
6.55M
  char cm_out[MAX_OPERANDS][COMMENT_BUFFER_SIZE];
9807
9808
6.55M
  priv.orig_sizeflag = AFLAG | DFLAG;
9809
6.55M
  if ((info->mach & bfd_mach_i386_i386) != 0)
9810
673k
    ins.address_mode = mode_32bit;
9811
5.88M
  else if (info->mach == bfd_mach_i386_i8086)
9812
365k
    {
9813
365k
      ins.address_mode = mode_16bit;
9814
365k
      priv.orig_sizeflag = 0;
9815
365k
    }
9816
5.51M
  else
9817
5.51M
    ins.address_mode = mode_64bit;
9818
9819
7.26M
  for (p = info->disassembler_options; p != NULL;)
9820
709k
    {
9821
709k
      if (startswith (p, "amd64"))
9822
1.28k
  ins.isa64 = amd64;
9823
708k
      else if (startswith (p, "intel64"))
9824
2.88k
  ins.isa64 = intel64;
9825
705k
      else if (startswith (p, "x86-64"))
9826
1.59k
  {
9827
1.59k
    ins.address_mode = mode_64bit;
9828
1.59k
    priv.orig_sizeflag |= AFLAG | DFLAG;
9829
1.59k
  }
9830
703k
      else if (startswith (p, "i386"))
9831
2.97k
  {
9832
2.97k
    ins.address_mode = mode_32bit;
9833
2.97k
    priv.orig_sizeflag |= AFLAG | DFLAG;
9834
2.97k
  }
9835
700k
      else if (startswith (p, "i8086"))
9836
30.4k
  {
9837
30.4k
    ins.address_mode = mode_16bit;
9838
30.4k
    priv.orig_sizeflag &= ~(AFLAG | DFLAG);
9839
30.4k
  }
9840
670k
      else if (startswith (p, "intel"))
9841
159k
  {
9842
159k
    if (startswith (p + 5, "-mnemonic"))
9843
260
      ins.intel_mnemonic = true;
9844
159k
    else
9845
159k
      ins.intel_syntax = 1;
9846
159k
  }
9847
510k
      else if (startswith (p, "att"))
9848
5.56k
  {
9849
5.56k
    ins.intel_syntax = 0;
9850
5.56k
    if (startswith (p + 3, "-mnemonic"))
9851
404
      ins.intel_mnemonic = false;
9852
5.56k
  }
9853
505k
      else if (startswith (p, "addr"))
9854
30.3k
  {
9855
30.3k
    if (ins.address_mode == mode_64bit)
9856
21.7k
      {
9857
21.7k
        if (p[4] == '3' && p[5] == '2')
9858
2.51k
    priv.orig_sizeflag &= ~AFLAG;
9859
19.2k
        else if (p[4] == '6' && p[5] == '4')
9860
414
    priv.orig_sizeflag |= AFLAG;
9861
21.7k
      }
9862
8.56k
    else
9863
8.56k
      {
9864
8.56k
        if (p[4] == '1' && p[5] == '6')
9865
596
    priv.orig_sizeflag &= ~AFLAG;
9866
7.96k
        else if (p[4] == '3' && p[5] == '2')
9867
1.58k
    priv.orig_sizeflag |= AFLAG;
9868
8.56k
      }
9869
30.3k
  }
9870
475k
      else if (startswith (p, "data"))
9871
18.5k
  {
9872
18.5k
    if (p[4] == '1' && p[5] == '6')
9873
11.0k
      priv.orig_sizeflag &= ~DFLAG;
9874
7.56k
    else if (p[4] == '3' && p[5] == '2')
9875
446
      priv.orig_sizeflag |= DFLAG;
9876
18.5k
  }
9877
456k
      else if (startswith (p, "suffix"))
9878
49.0k
  priv.orig_sizeflag |= SUFFIX_ALWAYS;
9879
407k
      else if (startswith (p, "annotate"))
9880
1.34k
  ins.annotate_immediates = true;
9881
9882
709k
      p = strchr (p, ',');
9883
709k
      if (p != NULL)
9884
209k
  p++;
9885
709k
    }
9886
9887
6.55M
  if (ins.address_mode == mode_64bit && sizeof (bfd_vma) < 8)
9888
0
    {
9889
0
      i386_dis_printf (info, dis_style_text, _("64-bit address is disabled"));
9890
0
      return -1;
9891
0
    }
9892
9893
6.55M
  if (ins.intel_syntax)
9894
1.30M
    {
9895
1.30M
      ins.open_char = '[';
9896
1.30M
      ins.close_char = ']';
9897
1.30M
      ins.separator_char = '+';
9898
1.30M
      ins.scale_char = '*';
9899
1.30M
    }
9900
5.24M
  else
9901
5.24M
    {
9902
5.24M
      ins.open_char = '(';
9903
5.24M
      ins.close_char =  ')';
9904
5.24M
      ins.separator_char = ',';
9905
5.24M
      ins.scale_char = ',';
9906
5.24M
    }
9907
9908
  /* The output looks better if we put 7 bytes on a line, since that
9909
     puts most long word instructions on a single line.  */
9910
6.55M
  info->bytes_per_line = 7;
9911
9912
6.55M
  info->private_data = &priv;
9913
6.55M
  priv.fetched = 0;
9914
6.55M
  priv.insn_start = pc;
9915
9916
39.3M
  for (i = 0; i < MAX_OPERANDS; ++i)
9917
32.7M
    {
9918
32.7M
      op_out[i][0] = 0;
9919
32.7M
      ins.op_out[i] = op_out[i];
9920
32.7M
      cm_out[i][0] = 0;
9921
32.7M
      ins.cm_out[i] = cm_out[i];
9922
32.7M
    }
9923
9924
6.55M
  sizeflag = priv.orig_sizeflag;
9925
9926
6.55M
  switch (ckprefix (&ins))
9927
6.55M
    {
9928
6.40M
    case ckp_okay:
9929
6.40M
      break;
9930
9931
147k
    case ckp_bogus:
9932
      /* Too many prefixes or unused REX prefixes.  */
9933
147k
      for (i = 0;
9934
350k
     i < (int) ARRAY_SIZE (ins.all_prefixes) && ins.all_prefixes[i];
9935
203k
     i++)
9936
203k
  i386_dis_printf (info, dis_style_mnemonic, "%s%s",
9937
203k
       (i == 0 ? "" : " "),
9938
203k
       prefix_name (ins.address_mode, ins.all_prefixes[i],
9939
203k
              sizeflag));
9940
147k
      ret = i;
9941
147k
      goto out;
9942
9943
4.11k
    case ckp_fetch_error:
9944
4.11k
      goto fetch_error_out;
9945
6.55M
    }
9946
9947
6.40M
  ins.nr_prefixes = ins.codep - ins.start_codep;
9948
9949
6.40M
  if (!fetch_code (info, ins.codep + 1))
9950
340
    {
9951
53.8k
    fetch_error_out:
9952
53.8k
      ret = fetch_error (&ins);
9953
53.8k
      goto out;
9954
340
    }
9955
9956
6.40M
  ins.two_source_ops = (*ins.codep == 0x62 || *ins.codep == 0xc8);
9957
9958
6.40M
  if ((ins.prefixes & PREFIX_FWAIT)
9959
16.9k
      && (*ins.codep < 0xd8 || *ins.codep > 0xdf))
9960
15.7k
    {
9961
      /* Handle ins.prefixes before fwait.  */
9962
17.0k
      for (i = 0; i < ins.fwait_prefix && ins.all_prefixes[i];
9963
15.7k
     i++)
9964
1.30k
  i386_dis_printf (info, dis_style_mnemonic, "%s ",
9965
1.30k
       prefix_name (ins.address_mode, ins.all_prefixes[i],
9966
1.30k
              sizeflag));
9967
15.7k
      i386_dis_printf (info, dis_style_mnemonic, "fwait");
9968
15.7k
      ret = i + 1;
9969
15.7k
      goto out;
9970
15.7k
    }
9971
9972
  /* REX2.M in rex2 prefix represents map0 or map1.  */
9973
6.38M
  if (ins.last_rex2_prefix < 0 ? *ins.codep == 0x0f : (ins.rex2 & REX2_M))
9974
149k
    {
9975
149k
      if (!ins.rex2)
9976
123k
  {
9977
123k
    ins.codep++;
9978
123k
    if (!fetch_code (info, ins.codep + 1))
9979
181
      goto fetch_error_out;
9980
123k
  }
9981
9982
148k
      dp = &dis386_twobyte[*ins.codep];
9983
148k
      ins.need_modrm = twobyte_has_modrm[*ins.codep];
9984
148k
    }
9985
6.24M
  else
9986
6.24M
    {
9987
6.24M
      dp = &dis386[*ins.codep];
9988
6.24M
      ins.need_modrm = onebyte_has_modrm[*ins.codep];
9989
6.24M
    }
9990
6.38M
  ins.condition_code = *ins.codep & 0xf;
9991
6.38M
  ins.codep++;
9992
9993
  /* Save sizeflag for printing the extra ins.prefixes later before updating
9994
     it for mnemonic and operand processing.  The prefix names depend
9995
     only on the address mode.  */
9996
6.38M
  orig_sizeflag = sizeflag;
9997
6.38M
  if (ins.prefixes & PREFIX_ADDR)
9998
57.2k
    sizeflag ^= AFLAG;
9999
6.38M
  if ((ins.prefixes & PREFIX_DATA))
10000
58.9k
    sizeflag ^= DFLAG;
10001
10002
6.38M
  ins.end_codep = ins.codep;
10003
6.38M
  if (ins.need_modrm && !fetch_modrm (&ins))
10004
5.06k
    goto fetch_error_out;
10005
10006
6.38M
  if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
10007
70.4k
    {
10008
70.4k
      if (!get_sib (&ins, sizeflag)
10009
70.2k
    || !dofloat (&ins, sizeflag))
10010
974
  goto fetch_error_out;
10011
70.4k
    }
10012
6.31M
  else
10013
6.31M
    {
10014
6.31M
      dp = get_valid_dis386 (dp, &ins);
10015
6.31M
      if (dp == &err_opcode)
10016
4.80k
  goto fetch_error_out;
10017
10018
      /* For APX instructions promoted from legacy maps 0/1, embedded prefix
10019
   is interpreted as the operand size override.  */
10020
6.30M
      if (ins.evex_type == evex_from_legacy
10021
24.7k
    && ins.vex.prefix == DATA_PREFIX_OPCODE)
10022
5.70k
  sizeflag ^= DFLAG;
10023
10024
6.30M
      if(ins.evex_type == evex_default)
10025
6.27M
  ins.vex.nf = false;
10026
32.4k
      else
10027
  /* For EVEX-promoted formats, we need to clear EVEX.NF (ccmp and ctest
10028
     are cleared separately.) in mask_register_specifier and keep the low
10029
     2 bits of mask_register_specifier to report errors for invalid cases
10030
     .  */
10031
32.4k
  ins.vex.mask_register_specifier &= 0x3;
10032
10033
6.30M
      if (dp != NULL && putop (&ins, dp->name, sizeflag) == 0)
10034
6.30M
  {
10035
6.30M
    if (!get_sib (&ins, sizeflag))
10036
1.56k
      goto fetch_error_out;
10037
37.7M
    for (i = 0; i < MAX_OPERANDS; ++i)
10038
31.4M
      {
10039
31.4M
        ins.obufp = ins.op_out[i];
10040
31.4M
        ins.cbufp = ins.cm_out[i];
10041
31.4M
        ins.op_ad = MAX_OPERANDS - 1 - i;
10042
31.4M
        if (dp->op[i].rtn
10043
9.47M
      && !dp->op[i].rtn (&ins, dp->op[i].bytemode, sizeflag))
10044
36.8k
    goto fetch_error_out;
10045
        /* For EVEX instruction after the last operand masking
10046
     should be printed.  */
10047
31.3M
        if (i == 0 && ins.vex.evex)
10048
148k
    {
10049
      /* Don't print {%k0}.  */
10050
148k
      if (ins.vex.mask_register_specifier)
10051
96.9k
        {
10052
96.9k
          const char *reg_name
10053
96.9k
      = att_names_mask[ins.vex.mask_register_specifier];
10054
10055
96.9k
          oappend (&ins, "{");
10056
96.9k
          oappend_register (&ins, reg_name);
10057
96.9k
          oappend (&ins, "}");
10058
10059
96.9k
          if (ins.vex.zeroing)
10060
38.7k
      oappend (&ins, "{z}");
10061
96.9k
        }
10062
51.3k
      else if (ins.vex.zeroing)
10063
9.01k
        {
10064
9.01k
          oappend (&ins, "{bad}");
10065
9.01k
          continue;
10066
9.01k
        }
10067
10068
      /* Instructions with a mask register destination allow for
10069
         zeroing-masking only (if any masking at all), which is
10070
         _not_ expressed by EVEX.z.  */
10071
139k
      if (ins.vex.zeroing && dp->op[0].bytemode == mask_mode)
10072
4.04k
        ins.illegal_masking = true;
10073
10074
      /* S/G insns require a mask and don't allow
10075
         zeroing-masking.  */
10076
139k
      if ((dp->op[0].bytemode == vex_vsib_d_w_dq_mode
10077
136k
           || dp->op[0].bytemode == vex_vsib_q_w_dq_mode)
10078
6.58k
          && (ins.vex.mask_register_specifier == 0
10079
5.98k
        || ins.vex.zeroing))
10080
3.64k
        ins.illegal_masking = true;
10081
10082
139k
      if (ins.illegal_masking)
10083
18.1k
        oappend (&ins, "/(bad)");
10084
139k
    }
10085
31.3M
      }
10086
    /* vex.nf is cleared after being consumed.  */
10087
6.27M
    if (ins.vex.nf)
10088
8.01k
      oappend (&ins, "{bad-nf}");
10089
10090
    /* Check whether rounding control was enabled for an insn not
10091
       supporting it, when evex.b is not treated as evex.nd.  */
10092
6.27M
    if (ins.modrm.mod == 3 && ins.vex.b && ins.evex_type == evex_default
10093
15.7k
        && !(ins.evex_used & EVEX_b_used))
10094
10.6k
      {
10095
28.0k
        for (i = 0; i < MAX_OPERANDS; ++i)
10096
28.0k
    {
10097
28.0k
      ins.obufp = ins.op_out[i];
10098
28.0k
      if (*ins.obufp)
10099
17.3k
        continue;
10100
10.6k
      oappend (&ins, names_rounding[ins.vex.ll]);
10101
10.6k
      oappend (&ins, "bad}");
10102
10.6k
      break;
10103
28.0k
    }
10104
10.6k
      }
10105
6.27M
  }
10106
6.30M
    }
10107
10108
  /* Clear instruction information.  */
10109
6.34M
  info->insn_info_valid = 0;
10110
6.34M
  info->branch_delay_insns = 0;
10111
6.34M
  info->data_size = 0;
10112
6.34M
  info->insn_type = dis_noninsn;
10113
6.34M
  info->target = 0;
10114
6.34M
  info->target2 = 0;
10115
10116
  /* Reset jump operation indicator.  */
10117
6.34M
  ins.op_is_jump = false;
10118
6.34M
  {
10119
6.34M
    int jump_detection = 0;
10120
10121
    /* Extract flags.  */
10122
38.0M
    for (i = 0; i < MAX_OPERANDS; ++i)
10123
31.7M
      {
10124
31.7M
  if ((dp->op[i].rtn == OP_J)
10125
31.3M
      || (dp->op[i].rtn == OP_indirE))
10126
427k
    jump_detection |= 1;
10127
31.2M
  else if ((dp->op[i].rtn == BND_Fixup)
10128
30.8M
     || (!dp->op[i].rtn && !dp->op[i].bytemode))
10129
22.3M
    jump_detection |= 2;
10130
8.96M
  else if ((dp->op[i].bytemode == cond_jump_mode)
10131
8.69M
     || (dp->op[i].bytemode == loop_jcxz_mode))
10132
317k
    jump_detection |= 4;
10133
31.7M
      }
10134
10135
    /* Determine if this is a jump or branch.  */
10136
6.34M
    if ((jump_detection & 0x3) == 0x3)
10137
427k
      {
10138
427k
  ins.op_is_jump = true;
10139
427k
  if (jump_detection & 0x4)
10140
317k
    info->insn_type = dis_condbranch;
10141
109k
  else
10142
109k
    info->insn_type = (dp->name && !strncmp (dp->name, "call", 4))
10143
109k
      ? dis_jsr : dis_branch;
10144
427k
      }
10145
6.34M
  }
10146
  /* The purpose of placing the check here is to wait for the EVEX prefix for
10147
     conditional CMP and TEST to be consumed and cleared, and then make a
10148
     unified judgment. Because they are both in map4, we can not distinguish
10149
     EVEX prefix for conditional CMP and TEST from others during the
10150
     EVEX prefix stage of parsing.  */
10151
6.34M
  if (ins.evex_type == evex_from_legacy)
10152
21.2k
    {
10153
      /* EVEX from legacy instructions, when the EVEX.ND bit is 0,
10154
   all bits of EVEX.vvvv and EVEX.V' must be 1.  */
10155
21.2k
      if (!ins.vex.nd && (ins.vex.register_specifier || !ins.vex.v))
10156
8.90k
  {
10157
8.90k
    i386_dis_printf (info, dis_style_text, "(bad)");
10158
8.90k
    ret = ins.end_codep - priv.the_buffer;
10159
8.90k
    goto out;
10160
8.90k
  }
10161
10162
      /* EVEX from legacy instructions require that EVEX.z, EVEX.L’L and the
10163
   lower 2 bits of EVEX.aaa must be 0.  */
10164
12.3k
      if ((ins.vex.mask_register_specifier & 0x3) != 0
10165
7.85k
    || ins.vex.ll != 0 || ins.vex.zeroing != 0)
10166
8.27k
  {
10167
8.27k
    i386_dis_printf (info, dis_style_text, "(bad)");
10168
8.27k
    ret = ins.end_codep - priv.the_buffer;
10169
8.27k
    goto out;
10170
8.27k
  }
10171
12.3k
    }
10172
  /* If VEX.vvvv and EVEX.vvvv are unused, they must be all 1s, which
10173
     are all 0s in inverted form.  */
10174
6.32M
  if (ins.need_vex && ins.vex.register_specifier != 0)
10175
104k
    {
10176
104k
      i386_dis_printf (info, dis_style_text, "(bad)");
10177
104k
      ret = ins.end_codep - priv.the_buffer;
10178
104k
      goto out;
10179
104k
    }
10180
10181
6.21M
  if ((dp->prefix_requirement & PREFIX_REX2_ILLEGAL)
10182
722k
      && ins.last_rex2_prefix >= 0 && (ins.rex2 & REX2_SPECIAL) == 0)
10183
4.46k
    {
10184
4.46k
      i386_dis_printf (info, dis_style_text, "(bad)");
10185
4.46k
      ret = ins.end_codep - priv.the_buffer;
10186
4.46k
      goto out;
10187
4.46k
    }
10188
10189
6.21M
  switch (dp->prefix_requirement & ~PREFIX_REX2_ILLEGAL)
10190
6.21M
    {
10191
37.1k
    case PREFIX_DATA:
10192
      /* If only the data prefix is marked as mandatory, its absence renders
10193
   the encoding invalid.  Most other PREFIX_OPCODE rules still apply.  */
10194
37.1k
      if (ins.need_vex ? !ins.vex.prefix : !(ins.prefixes & PREFIX_DATA))
10195
13.2k
  {
10196
13.2k
    i386_dis_printf (info, dis_style_text, "(bad)");
10197
13.2k
    ret = ins.end_codep - priv.the_buffer;
10198
13.2k
    goto out;
10199
13.2k
  }
10200
23.9k
      ins.used_prefixes |= PREFIX_DATA;
10201
      /* Fall through.  */
10202
56.3k
    case PREFIX_OPCODE:
10203
      /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
10204
   unused, opcode is invalid.  Since the PREFIX_DATA prefix may be
10205
   used by putop and MMX/SSE operand and may be overridden by the
10206
   PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
10207
   separately.  */
10208
56.3k
      if (((ins.need_vex
10209
56.3k
      ? ins.vex.prefix == REPE_PREFIX_OPCODE
10210
19.3k
        || ins.vex.prefix == REPNE_PREFIX_OPCODE
10211
56.3k
      : (ins.prefixes
10212
31.1k
         & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
10213
15.8k
     && (ins.used_prefixes
10214
15.8k
         & (PREFIX_REPZ | PREFIX_REPNZ)) == 0)
10215
41.6k
    || (((ins.need_vex
10216
41.6k
    ? ins.vex.prefix == DATA_PREFIX_OPCODE
10217
41.6k
    : ((ins.prefixes
10218
29.0k
        & (PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA))
10219
29.0k
       == PREFIX_DATA))
10220
14.3k
         && (ins.used_prefixes & PREFIX_DATA) == 0))
10221
41.2k
    || (ins.vex.evex && dp->prefix_requirement != PREFIX_DATA
10222
1.01k
        && !ins.vex.w != !(ins.used_prefixes & PREFIX_DATA)))
10223
15.5k
  {
10224
15.5k
    i386_dis_printf (info, dis_style_text, "(bad)");
10225
15.5k
    ret = ins.end_codep - priv.the_buffer;
10226
15.5k
    goto out;
10227
15.5k
  }
10228
40.7k
      break;
10229
10230
40.7k
    case PREFIX_IGNORED:
10231
      /* Zap data size and rep prefixes from used_prefixes and reinstate their
10232
   origins in all_prefixes.  */
10233
2.33k
      ins.used_prefixes &= ~PREFIX_OPCODE;
10234
2.33k
      if (ins.last_data_prefix >= 0)
10235
771
  ins.all_prefixes[ins.last_data_prefix] = 0x66;
10236
2.33k
      if (ins.last_repz_prefix >= 0)
10237
937
  ins.all_prefixes[ins.last_repz_prefix] = 0xf3;
10238
2.33k
      if (ins.last_repnz_prefix >= 0)
10239
1.40k
  ins.all_prefixes[ins.last_repnz_prefix] = 0xf2;
10240
2.33k
      break;
10241
10242
39.8k
    case PREFIX_NP_OR_DATA:
10243
39.8k
      if (ins.vex.prefix == REPE_PREFIX_OPCODE
10244
39.3k
    || ins.vex.prefix == REPNE_PREFIX_OPCODE)
10245
943
  {
10246
943
    i386_dis_printf (info, dis_style_text, "(bad)");
10247
943
    ret = ins.end_codep - priv.the_buffer;
10248
943
    goto out;
10249
943
  }
10250
38.8k
      break;
10251
10252
38.8k
    case NO_PREFIX:
10253
32.1k
      if (ins.vex.prefix)
10254
679
  {
10255
679
    i386_dis_printf (info, dis_style_text, "(bad)");
10256
679
    ret = ins.end_codep - priv.the_buffer;
10257
679
    goto out;
10258
679
  }
10259
31.4k
      break;
10260
6.21M
    }
10261
10262
  /* Check if the REX prefix is used.  */
10263
6.18M
  if ((ins.rex ^ ins.rex_used) == 0
10264
5.51M
      && !ins.need_vex && ins.last_rex_prefix >= 0)
10265
73.6k
    ins.all_prefixes[ins.last_rex_prefix] = 0;
10266
10267
  /* Check if the REX2 prefix is used.  */
10268
6.18M
  if (ins.last_rex2_prefix >= 0
10269
31.5k
      && ((ins.rex2 & REX2_SPECIAL)
10270
30.2k
    || (((ins.rex2 ^ ins.rex2_used) & 7) == 0
10271
6.43k
        && (ins.rex ^ ins.rex_used) == 0
10272
3.55k
        && (ins.rex2 & 7))))
10273
3.73k
    ins.all_prefixes[ins.last_rex2_prefix] = 0;
10274
10275
  /* Check if the SEG prefix is used.  */
10276
6.18M
  if ((ins.prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
10277
6.18M
           | PREFIX_FS | PREFIX_GS)) != 0
10278
152k
      && (ins.used_prefixes & ins.active_seg_prefix) != 0)
10279
50.9k
    ins.all_prefixes[ins.last_seg_prefix] = 0;
10280
10281
  /* Check if the ADDR prefix is used.  */
10282
6.18M
  if ((ins.prefixes & PREFIX_ADDR) != 0
10283
49.8k
      && (ins.used_prefixes & PREFIX_ADDR) != 0)
10284
28.2k
    ins.all_prefixes[ins.last_addr_prefix] = 0;
10285
10286
  /* Check if the DATA prefix is used.  */
10287
6.18M
  if ((ins.prefixes & PREFIX_DATA) != 0
10288
50.2k
      && (ins.used_prefixes & PREFIX_DATA) != 0
10289
33.4k
      && !ins.need_vex)
10290
32.9k
    ins.all_prefixes[ins.last_data_prefix] = 0;
10291
10292
  /* Print the extra ins.prefixes.  */
10293
6.18M
  prefix_length = 0;
10294
92.7M
  for (i = 0; i < (int) ARRAY_SIZE (ins.all_prefixes); i++)
10295
86.5M
    if (ins.all_prefixes[i])
10296
478k
      {
10297
478k
  const char *name = prefix_name (ins.address_mode, ins.all_prefixes[i],
10298
478k
          orig_sizeflag);
10299
10300
478k
  if (name == NULL)
10301
0
    abort ();
10302
478k
  prefix_length += strlen (name) + 1;
10303
478k
  if (ins.all_prefixes[i] != REX2_OPCODE)
10304
450k
    i386_dis_printf (info, dis_style_mnemonic, "%s ", name);
10305
27.7k
  else if (((ins.rex2 ^ ins.rex2_used) & 7) == 0
10306
3.98k
     && ((ins.rex ^ ins.rex_used) & 0xf) == 0)
10307
1.98k
    i386_dis_printf (info, dis_style_mnemonic, "{%s} ", name);
10308
25.7k
  else
10309
25.7k
    i386_dis_printf (info, dis_style_mnemonic, "{%s 0x%x} ", name,
10310
25.7k
         (unsigned int) ins.rex2_payload);
10311
478k
      }
10312
10313
  /* Check maximum code length.  */
10314
6.18M
  if ((ins.codep - ins.start_codep) > MAX_CODE_LENGTH)
10315
1.38k
    {
10316
1.38k
      i386_dis_printf (info, dis_style_text, "(bad)");
10317
1.38k
      ret = MAX_CODE_LENGTH;
10318
1.38k
      goto out;
10319
1.38k
    }
10320
10321
  /* Calculate the number of operands this instruction has.  */
10322
6.18M
  op_count = 0;
10323
37.0M
  for (i = 0; i < MAX_OPERANDS; ++i)
10324
30.9M
    if (*ins.op_out[i] != '\0')
10325
8.57M
      ++op_count;
10326
10327
  /* Calculate the number of spaces to print after the mnemonic.  */
10328
6.18M
  ins.obufp = ins.mnemonicendp;
10329
6.18M
  if (op_count > 0)
10330
4.75M
    {
10331
4.75M
      i = strlen (ins.obuf) + prefix_length;
10332
4.75M
      if (i < 7)
10333
4.45M
  i = 7 - i;
10334
299k
      else
10335
299k
  i = 1;
10336
4.75M
    }
10337
1.42M
  else
10338
1.42M
    i = 0;
10339
10340
  /* Print the instruction mnemonic along with any trailing whitespace.  */
10341
6.18M
  i386_dis_printf (info, dis_style_mnemonic, "%s%*s", ins.obuf, i, "");
10342
10343
  /* The enter and bound instructions are printed with operands in the same
10344
     order as the intel book; everything else is printed in reverse order.  */
10345
6.18M
  intel_swap_2_3 = false;
10346
6.18M
  if (ins.intel_syntax || ins.two_source_ops)
10347
1.20M
    {
10348
7.24M
      for (i = 0; i < MAX_OPERANDS; ++i)
10349
6.03M
  op_txt[i] = ins.op_out[i];
10350
10351
1.20M
      if (ins.intel_syntax && dp && dp->op[2].rtn == OP_Rounding
10352
5.03k
          && dp->op[3].rtn == OP_E && dp->op[4].rtn == NULL)
10353
1.84k
  {
10354
1.84k
    op_txt[2] = ins.op_out[3];
10355
1.84k
    op_txt[3] = ins.op_out[2];
10356
1.84k
    intel_swap_2_3 = true;
10357
1.84k
  }
10358
10359
3.62M
      for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
10360
2.41M
  {
10361
2.41M
    bool riprel;
10362
10363
2.41M
    ins.op_ad = ins.op_index[i];
10364
2.41M
    ins.op_index[i] = ins.op_index[MAX_OPERANDS - 1 - i];
10365
2.41M
    ins.op_index[MAX_OPERANDS - 1 - i] = ins.op_ad;
10366
2.41M
    riprel = ins.op_riprel[i];
10367
2.41M
    ins.op_riprel[i] = ins.op_riprel[MAX_OPERANDS - 1 - i];
10368
2.41M
    ins.op_riprel[MAX_OPERANDS - 1 - i] = riprel;
10369
10370
2.41M
    char *tmp = ins.cm_out[i];
10371
2.41M
    ins.cm_out[i] = ins.cm_out[MAX_OPERANDS - 1 - i];
10372
2.41M
    ins.cm_out[MAX_OPERANDS - 1 - i] = tmp;
10373
2.41M
  }
10374
1.20M
    }
10375
4.97M
  else
10376
4.97M
    {
10377
29.8M
      for (i = 0; i < MAX_OPERANDS; ++i)
10378
24.8M
  op_txt[MAX_OPERANDS - 1 - i] = ins.op_out[i];
10379
4.97M
    }
10380
10381
6.18M
  needcomma = 0;
10382
37.0M
  for (i = 0; i < MAX_OPERANDS; ++i)
10383
30.9M
    if (*op_txt[i])
10384
8.57M
      {
10385
  /* In Intel syntax embedded rounding / SAE are not separate operands.
10386
     Instead they're attached to the prior register operand.  Simply
10387
     suppress emission of the comma to achieve that effect.  */
10388
8.57M
  switch (i & -(ins.intel_syntax && dp))
10389
8.57M
    {
10390
44.7k
    case 2:
10391
44.7k
      if (dp->op[2].rtn == OP_Rounding && !intel_swap_2_3)
10392
478
        needcomma = 0;
10393
44.7k
      break;
10394
3.96k
    case 3:
10395
3.96k
      if (dp->op[3].rtn == OP_Rounding || intel_swap_2_3)
10396
1.17k
        needcomma = 0;
10397
3.96k
      break;
10398
8.57M
    }
10399
8.57M
  if (needcomma)
10400
3.81M
    i386_dis_printf (info, dis_style_text, ",");
10401
8.57M
  if (ins.op_index[i] != -1 && !ins.op_riprel[i])
10402
366k
    {
10403
366k
      bfd_vma target = (bfd_vma) ins.op_address[ins.op_index[i]];
10404
10405
366k
      if (ins.op_is_jump)
10406
366k
        {
10407
366k
    info->insn_info_valid = 1;
10408
366k
    info->branch_delay_insns = 0;
10409
366k
    info->data_size = 0;
10410
366k
    info->target = target;
10411
366k
    info->target2 = 0;
10412
366k
        }
10413
366k
      (*info->print_address_func) (target, info);
10414
366k
    }
10415
8.21M
  else
10416
8.21M
    i386_dis_printf (info, dis_style_text, "%s", op_txt[i]);
10417
8.57M
  needcomma = 1;
10418
8.57M
      }
10419
10420
6.18M
  const char *sep = "        # ";
10421
37.0M
  for (i = 0; i < MAX_OPERANDS; i++)
10422
30.9M
    if (ins.op_index[i] != -1 && ins.op_riprel[i])
10423
46.4k
      {
10424
46.4k
  i386_dis_printf (info, dis_style_comment_start, "%s", sep);
10425
46.4k
  sep = ", ";
10426
46.4k
  (*info->print_address_func)
10427
46.4k
    ((bfd_vma)(ins.start_pc + (ins.codep - ins.start_codep)
10428
46.4k
         + ins.op_address[ins.op_index[i]]),
10429
46.4k
     info);
10430
46.4k
      }
10431
30.8M
    else if (*ins.cm_out[i])
10432
0
      {
10433
0
  i386_dis_printf (info, dis_style_comment_start, "%s", sep);
10434
0
  sep = ", ";
10435
0
  i386_dis_printf (info, dis_style_symbol, "%s", ins.cm_out[i]);
10436
0
      }
10437
10438
6.18M
  ret = ins.codep - priv.the_buffer;
10439
6.55M
 out:
10440
6.55M
  info->private_data = NULL;
10441
6.55M
  return ret;
10442
6.18M
}
10443
10444
/* Here for backwards compatibility.  When gdb stops using
10445
   print_insn_i386_att and print_insn_i386_intel these functions can
10446
   disappear, and print_insn_i386 be merged into print_insn.  */
10447
int
10448
print_insn_i386_att (bfd_vma pc, disassemble_info *info)
10449
0
{
10450
0
  return print_insn (pc, info, 0);
10451
0
}
10452
10453
int
10454
print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
10455
0
{
10456
0
  return print_insn (pc, info, 1);
10457
0
}
10458
10459
int
10460
print_insn_i386 (bfd_vma pc, disassemble_info *info)
10461
6.55M
{
10462
6.55M
  return print_insn (pc, info, -1);
10463
6.55M
}
10464
10465
static const char *float_mem[] = {
10466
  /* d8 */
10467
  "fadd{s|}",
10468
  "fmul{s|}",
10469
  "fcom{s|}",
10470
  "fcomp{s|}",
10471
  "fsub{s|}",
10472
  "fsubr{s|}",
10473
  "fdiv{s|}",
10474
  "fdivr{s|}",
10475
  /* d9 */
10476
  "fld{s|}",
10477
  "(bad)",
10478
  "fst{s|}",
10479
  "fstp{s|}",
10480
  "fldenv{C|C}",
10481
  "fldcw",
10482
  "fNstenv{C|C}",
10483
  "fNstcw",
10484
  /* da */
10485
  "fiadd{l|}",
10486
  "fimul{l|}",
10487
  "ficom{l|}",
10488
  "ficomp{l|}",
10489
  "fisub{l|}",
10490
  "fisubr{l|}",
10491
  "fidiv{l|}",
10492
  "fidivr{l|}",
10493
  /* db */
10494
  "fild{l|}",
10495
  "fisttp{l|}",
10496
  "fist{l|}",
10497
  "fistp{l|}",
10498
  "(bad)",
10499
  "fld{t|}",
10500
  "(bad)",
10501
  "fstp{t|}",
10502
  /* dc */
10503
  "fadd{l|}",
10504
  "fmul{l|}",
10505
  "fcom{l|}",
10506
  "fcomp{l|}",
10507
  "fsub{l|}",
10508
  "fsubr{l|}",
10509
  "fdiv{l|}",
10510
  "fdivr{l|}",
10511
  /* dd */
10512
  "fld{l|}",
10513
  "fisttp{ll|}",
10514
  "fst{l||}",
10515
  "fstp{l|}",
10516
  "frstor{C|C}",
10517
  "(bad)",
10518
  "fNsave{C|C}",
10519
  "fNstsw",
10520
  /* de */
10521
  "fiadd{s|}",
10522
  "fimul{s|}",
10523
  "ficom{s|}",
10524
  "ficomp{s|}",
10525
  "fisub{s|}",
10526
  "fisubr{s|}",
10527
  "fidiv{s|}",
10528
  "fidivr{s|}",
10529
  /* df */
10530
  "fild{s|}",
10531
  "fisttp{s|}",
10532
  "fist{s|}",
10533
  "fistp{s|}",
10534
  "fbld",
10535
  "fild{ll|}",
10536
  "fbstp",
10537
  "fistp{ll|}",
10538
};
10539
10540
static const unsigned char float_mem_mode[] = {
10541
  /* d8 */
10542
  d_mode,
10543
  d_mode,
10544
  d_mode,
10545
  d_mode,
10546
  d_mode,
10547
  d_mode,
10548
  d_mode,
10549
  d_mode,
10550
  /* d9 */
10551
  d_mode,
10552
  0,
10553
  d_mode,
10554
  d_mode,
10555
  0,
10556
  w_mode,
10557
  0,
10558
  w_mode,
10559
  /* da */
10560
  d_mode,
10561
  d_mode,
10562
  d_mode,
10563
  d_mode,
10564
  d_mode,
10565
  d_mode,
10566
  d_mode,
10567
  d_mode,
10568
  /* db */
10569
  d_mode,
10570
  d_mode,
10571
  d_mode,
10572
  d_mode,
10573
  0,
10574
  t_mode,
10575
  0,
10576
  t_mode,
10577
  /* dc */
10578
  q_mode,
10579
  q_mode,
10580
  q_mode,
10581
  q_mode,
10582
  q_mode,
10583
  q_mode,
10584
  q_mode,
10585
  q_mode,
10586
  /* dd */
10587
  q_mode,
10588
  q_mode,
10589
  q_mode,
10590
  q_mode,
10591
  0,
10592
  0,
10593
  0,
10594
  w_mode,
10595
  /* de */
10596
  w_mode,
10597
  w_mode,
10598
  w_mode,
10599
  w_mode,
10600
  w_mode,
10601
  w_mode,
10602
  w_mode,
10603
  w_mode,
10604
  /* df */
10605
  w_mode,
10606
  w_mode,
10607
  w_mode,
10608
  w_mode,
10609
  t_mode,
10610
  q_mode,
10611
  t_mode,
10612
  q_mode
10613
};
10614
10615
#define ST { OP_ST, 0 }
10616
#define STi { OP_STi, 0 }
10617
10618
#define FGRPd9_2 NULL, { { NULL, 1 } }, 0
10619
#define FGRPd9_4 NULL, { { NULL, 2 } }, 0
10620
#define FGRPd9_5 NULL, { { NULL, 3 } }, 0
10621
#define FGRPd9_6 NULL, { { NULL, 4 } }, 0
10622
#define FGRPd9_7 NULL, { { NULL, 5 } }, 0
10623
#define FGRPda_5 NULL, { { NULL, 6 } }, 0
10624
#define FGRPdb_4 NULL, { { NULL, 7 } }, 0
10625
#define FGRPde_3 NULL, { { NULL, 8 } }, 0
10626
#define FGRPdf_4 NULL, { { NULL, 9 } }, 0
10627
10628
static const struct dis386 float_reg[][8] = {
10629
  /* d8 */
10630
  {
10631
    { "fadd", { ST, STi }, 0 },
10632
    { "fmul", { ST, STi }, 0 },
10633
    { "fcom", { STi }, 0 },
10634
    { "fcomp",  { STi }, 0 },
10635
    { "fsub", { ST, STi }, 0 },
10636
    { "fsubr",  { ST, STi }, 0 },
10637
    { "fdiv", { ST, STi }, 0 },
10638
    { "fdivr",  { ST, STi }, 0 },
10639
  },
10640
  /* d9 */
10641
  {
10642
    { "fld",  { STi }, 0 },
10643
    { "fxch", { STi }, 0 },
10644
    { FGRPd9_2 },
10645
    { Bad_Opcode },
10646
    { FGRPd9_4 },
10647
    { FGRPd9_5 },
10648
    { FGRPd9_6 },
10649
    { FGRPd9_7 },
10650
  },
10651
  /* da */
10652
  {
10653
    { "fcmovb", { ST, STi }, 0 },
10654
    { "fcmove", { ST, STi }, 0 },
10655
    { "fcmovbe",{ ST, STi }, 0 },
10656
    { "fcmovu", { ST, STi }, 0 },
10657
    { Bad_Opcode },
10658
    { FGRPda_5 },
10659
    { Bad_Opcode },
10660
    { Bad_Opcode },
10661
  },
10662
  /* db */
10663
  {
10664
    { "fcmovnb",{ ST, STi }, 0 },
10665
    { "fcmovne",{ ST, STi }, 0 },
10666
    { "fcmovnbe",{ ST, STi }, 0 },
10667
    { "fcmovnu",{ ST, STi }, 0 },
10668
    { FGRPdb_4 },
10669
    { "fucomi", { ST, STi }, 0 },
10670
    { "fcomi",  { ST, STi }, 0 },
10671
    { Bad_Opcode },
10672
  },
10673
  /* dc */
10674
  {
10675
    { "fadd", { STi, ST }, 0 },
10676
    { "fmul", { STi, ST }, 0 },
10677
    { Bad_Opcode },
10678
    { Bad_Opcode },
10679
    { "fsub{!M|r}", { STi, ST }, 0 },
10680
    { "fsub{M|}", { STi, ST }, 0 },
10681
    { "fdiv{!M|r}", { STi, ST }, 0 },
10682
    { "fdiv{M|}", { STi, ST }, 0 },
10683
  },
10684
  /* dd */
10685
  {
10686
    { "ffree",  { STi }, 0 },
10687
    { Bad_Opcode },
10688
    { "fst",  { STi }, 0 },
10689
    { "fstp", { STi }, 0 },
10690
    { "fucom",  { STi }, 0 },
10691
    { "fucomp", { STi }, 0 },
10692
    { Bad_Opcode },
10693
    { Bad_Opcode },
10694
  },
10695
  /* de */
10696
  {
10697
    { "faddp",  { STi, ST }, 0 },
10698
    { "fmulp",  { STi, ST }, 0 },
10699
    { Bad_Opcode },
10700
    { FGRPde_3 },
10701
    { "fsub{!M|r}p",  { STi, ST }, 0 },
10702
    { "fsub{M|}p",  { STi, ST }, 0 },
10703
    { "fdiv{!M|r}p",  { STi, ST }, 0 },
10704
    { "fdiv{M|}p",  { STi, ST }, 0 },
10705
  },
10706
  /* df */
10707
  {
10708
    { "ffreep", { STi }, 0 },
10709
    { Bad_Opcode },
10710
    { Bad_Opcode },
10711
    { Bad_Opcode },
10712
    { FGRPdf_4 },
10713
    { "fucomip", { ST, STi }, 0 },
10714
    { "fcomip", { ST, STi }, 0 },
10715
    { Bad_Opcode },
10716
  },
10717
};
10718
10719
static const char *const fgrps[][8] = {
10720
  /* Bad opcode 0 */
10721
  {
10722
    "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10723
  },
10724
10725
  /* d9_2  1 */
10726
  {
10727
    "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10728
  },
10729
10730
  /* d9_4  2 */
10731
  {
10732
    "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
10733
  },
10734
10735
  /* d9_5  3 */
10736
  {
10737
    "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
10738
  },
10739
10740
  /* d9_6  4 */
10741
  {
10742
    "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
10743
  },
10744
10745
  /* d9_7  5 */
10746
  {
10747
    "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
10748
  },
10749
10750
  /* da_5  6 */
10751
  {
10752
    "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10753
  },
10754
10755
  /* db_4  7 */
10756
  {
10757
    "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
10758
    "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
10759
  },
10760
10761
  /* de_3  8 */
10762
  {
10763
    "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10764
  },
10765
10766
  /* df_4  9 */
10767
  {
10768
    "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10769
  },
10770
};
10771
10772
static const char *const oszc_flags[16] = {
10773
  " {dfv=}", " {dfv=cf}", " {dfv=zf}", " {dfv=zf, cf}", " {dfv=sf}",
10774
  " {dfv=sf, cf}", " {dfv=sf, zf}", " {dfv=sf, zf, cf}", " {dfv=of}",
10775
  " {dfv=of, cf}", " {dfv=of, zf}", " {dfv=of, zf, cf}", " {dfv=of, sf}",
10776
  " {dfv=of, sf, cf}", " {dfv=of, sf, zf}", " {dfv=of, sf, zf, cf}"
10777
};
10778
10779
static const char *const scc_suffix[16] = {
10780
  "o", "no", "b", "ae", "e", "ne", "be", "a", "s", "ns", "t", "f",
10781
  "l", "ge", "le", "g"
10782
};
10783
10784
static void
10785
swap_operand (instr_info *ins)
10786
2.31k
{
10787
2.31k
  char *p = ins->mnemonicendp;
10788
10789
2.31k
  if (p[-1] == '}')
10790
434
    {
10791
5.18k
      while (*--p != '{')
10792
4.74k
  {
10793
4.74k
    if (p <= ins->obuf + 2)
10794
0
      abort ();
10795
4.74k
  }
10796
434
      if (p[-1] == ' ')
10797
210
  --p;
10798
434
    }
10799
2.31k
  memmove (p + 2, p, ins->mnemonicendp - p + 1);
10800
2.31k
  p[0] = '.';
10801
2.31k
  p[1] = 's';
10802
2.31k
  ins->mnemonicendp += 2;
10803
2.31k
}
10804
10805
static bool
10806
dofloat (instr_info *ins, int sizeflag)
10807
70.2k
{
10808
70.2k
  const struct dis386 *dp;
10809
70.2k
  unsigned char floatop = ins->codep[-1];
10810
10811
70.2k
  if (ins->modrm.mod != 3)
10812
31.8k
    {
10813
31.8k
      int fp_indx = (floatop - 0xd8) * 8 + ins->modrm.reg;
10814
10815
31.8k
      putop (ins, float_mem[fp_indx], sizeflag);
10816
31.8k
      ins->obufp = ins->op_out[0];
10817
31.8k
      ins->cbufp = ins->cm_out[0];
10818
31.8k
      ins->op_ad = 2;
10819
31.8k
      return OP_E (ins, float_mem_mode[fp_indx], sizeflag);
10820
31.8k
    }
10821
  /* Skip mod/rm byte.  */
10822
38.4k
  MODRM_CHECK;
10823
38.4k
  ins->codep++;
10824
10825
38.4k
  dp = &float_reg[floatop - 0xd8][ins->modrm.reg];
10826
38.4k
  if (dp->name == NULL)
10827
19.3k
    {
10828
19.3k
      putop (ins, fgrps[dp->op[0].bytemode][ins->modrm.rm], sizeflag);
10829
10830
      /* Instruction fnstsw is only one with strange arg.  */
10831
19.3k
      if (floatop == 0xdf && ins->codep[-1] == 0xe0)
10832
292
  strcpy (ins->op_out[0], att_names16[0] + ins->intel_syntax);
10833
19.3k
    }
10834
19.1k
  else
10835
19.1k
    {
10836
19.1k
      putop (ins, dp->name, sizeflag);
10837
10838
19.1k
      ins->obufp = ins->op_out[0];
10839
19.1k
      ins->cbufp = ins->cm_out[0];
10840
19.1k
      ins->op_ad = 2;
10841
19.1k
      if (dp->op[0].rtn
10842
19.1k
    && !dp->op[0].rtn (ins, dp->op[0].bytemode, sizeflag))
10843
0
  return false;
10844
10845
19.1k
      ins->obufp = ins->op_out[1];
10846
19.1k
      ins->cbufp = ins->cm_out[1];
10847
19.1k
      ins->op_ad = 1;
10848
19.1k
      if (dp->op[1].rtn
10849
11.7k
    && !dp->op[1].rtn (ins, dp->op[1].bytemode, sizeflag))
10850
0
  return false;
10851
19.1k
    }
10852
38.4k
  return true;
10853
38.4k
}
10854
10855
static bool
10856
OP_ST (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
10857
       int sizeflag ATTRIBUTE_UNUSED)
10858
11.7k
{
10859
11.7k
  oappend_register (ins, "%st");
10860
11.7k
  return true;
10861
11.7k
}
10862
10863
static bool
10864
OP_STi (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
10865
  int sizeflag ATTRIBUTE_UNUSED)
10866
19.1k
{
10867
19.1k
  char scratch[8];
10868
19.1k
  int res = snprintf (scratch, ARRAY_SIZE (scratch), "%%st(%d)", ins->modrm.rm);
10869
10870
19.1k
  if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
10871
0
    abort ();
10872
19.1k
  oappend_register (ins, scratch);
10873
19.1k
  return true;
10874
19.1k
}
10875
10876
/* Capital letters in template are macros.  */
10877
static int
10878
putop (instr_info *ins, const char *in_template, int sizeflag)
10879
6.37M
{
10880
6.37M
  const char *p;
10881
6.37M
  int alt = 0;
10882
6.37M
  int cond = 1;
10883
6.37M
  unsigned int l = 0, len = 0;
10884
6.37M
  char last[4];
10885
6.37M
  bool evex_printed = false;
10886
10887
  /* We don't want to add any prefix or suffix to (bad), so return early.  */
10888
6.37M
  if (!strncmp (in_template, "(bad)", 5))
10889
1.05M
    {
10890
1.05M
      oappend (ins, "(bad)");
10891
1.05M
      *ins->obufp = 0;
10892
1.05M
      ins->mnemonicendp = ins->obufp;
10893
1.05M
      return 0;
10894
1.05M
    }
10895
10896
30.1M
  for (p = in_template; *p; p++)
10897
24.7M
    {
10898
24.7M
      if (len > l)
10899
384k
  {
10900
384k
    if (l >= sizeof (last) || !ISUPPER (*p))
10901
0
      abort ();
10902
384k
    last[l++] = *p;
10903
384k
    continue;
10904
384k
  }
10905
24.3M
      switch (*p)
10906
24.3M
  {
10907
17.6M
  default:
10908
17.6M
    if (ins->evex_type == evex_from_legacy && !ins->vex.nd
10909
27.9k
        && !(ins->rex2 & 7) && !evex_printed)
10910
1.01k
      {
10911
1.01k
        oappend (ins, "{evex} ");
10912
1.01k
        evex_printed = true;
10913
1.01k
      }
10914
17.6M
    *ins->obufp++ = *p;
10915
17.6M
    break;
10916
384k
  case '%':
10917
384k
    len++;
10918
384k
    break;
10919
248k
  case '!':
10920
248k
    cond = 0;
10921
248k
    break;
10922
558k
  case '{':
10923
558k
    if (ins->intel_syntax)
10924
152k
      {
10925
301k
        while (*++p != '|')
10926
148k
    if (*p == '}' || *p == '\0')
10927
0
      abort ();
10928
152k
        alt = 1;
10929
152k
      }
10930
558k
    break;
10931
558k
  case '|':
10932
440k
    while (*++p != '}')
10933
34.6k
      {
10934
34.6k
        if (*p == '\0')
10935
0
    abort ();
10936
34.6k
      }
10937
405k
    break;
10938
405k
  case '}':
10939
152k
    alt = 0;
10940
152k
    break;
10941
74.7k
  case 'A':
10942
74.7k
    if (ins->intel_syntax)
10943
12.5k
      break;
10944
62.1k
    if ((ins->need_modrm && ins->modrm.mod != 3 && !ins->vex.nd)
10945
17.5k
        || (sizeflag & SUFFIX_ALWAYS))
10946
45.1k
      *ins->obufp++ = 'b';
10947
62.1k
    break;
10948
2.37M
  case 'B':
10949
2.37M
    if (l == 0)
10950
2.32M
      {
10951
2.37M
      case_B:
10952
2.37M
        if (ins->intel_syntax)
10953
313k
    break;
10954
2.05M
        if (sizeflag & SUFFIX_ALWAYS)
10955
6.67k
    *ins->obufp++ = 'b';
10956
2.05M
      }
10957
51.3k
    else if (l == 1 && last[0] == 'L')
10958
49.9k
      {
10959
49.9k
        if (ins->address_mode == mode_64bit
10960
45.8k
      && !(ins->prefixes & PREFIX_ADDR))
10961
45.0k
    {
10962
45.0k
      *ins->obufp++ = 'a';
10963
45.0k
      *ins->obufp++ = 'b';
10964
45.0k
      *ins->obufp++ = 's';
10965
45.0k
    }
10966
10967
49.9k
        goto case_B;
10968
49.9k
      }
10969
1.43k
    else if (l == 1 && last[0] == 'H')
10970
216
      {
10971
216
    *ins->obufp++ = ins->vex.w ? 'b' : 'h';
10972
216
    *ins->obufp++ = 'f';
10973
216
      }
10974
1.21k
    else if (l && last[0] == 'X')
10975
1.21k
      {
10976
1.21k
        if (!ins->vex.w)
10977
753
    oappend (ins, "bf16");
10978
466
        else
10979
466
    oappend (ins, "{bad}");
10980
1.21k
      }
10981
0
    else
10982
0
      abort ();
10983
2.05M
    break;
10984
2.05M
  case 'C':
10985
11.0k
    if (l == 1 && last[0] == 'C')
10986
5.31k
      {
10987
        /* Condition code (taken from the map-0 Jcc entries).  */
10988
5.31k
        for (const char *q = dis386[0x70 | ins->condition_code].name + 1;
10989
8.57k
       ISLOWER(*q); ++q)
10990
8.57k
    *ins->obufp++ = *q;
10991
5.31k
        break;
10992
5.31k
      }
10993
5.77k
    else if (l == 1 && last[0] == 'S')
10994
1.46k
      {
10995
        /* Add scc suffix.  */
10996
1.46k
        oappend (ins, scc_suffix[ins->vex.scc]);
10997
10998
        /* For SCC insns, the ND bit is required to be set to 0.  */
10999
1.46k
        if (ins->vex.nd)
11000
697
    oappend (ins, "(bad)");
11001
11002
        /* These bits have been consumed and should be cleared or restored
11003
     to default values.  */
11004
1.46k
        ins->vex.v = 1;
11005
1.46k
        ins->vex.nf = false;
11006
1.46k
        ins->vex.mask_register_specifier = 0;
11007
1.46k
        break;
11008
1.46k
      }
11009
11010
4.30k
    if (l)
11011
0
      abort ();
11012
4.30k
    if (ins->intel_syntax && !alt)
11013
0
      break;
11014
4.30k
    if ((ins->prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
11015
1.70k
      {
11016
1.70k
        if (sizeflag & DFLAG)
11017
596
    *ins->obufp++ = ins->intel_syntax ? 'd' : 'l';
11018
1.11k
        else
11019
1.11k
    *ins->obufp++ = ins->intel_syntax ? 'w' : 's';
11020
1.70k
        ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11021
1.70k
      }
11022
4.30k
    break;
11023
27.4k
  case 'D':
11024
27.4k
    if (l == 1)
11025
7.84k
      {
11026
7.84k
        switch (last[0])
11027
7.84k
        {
11028
7.84k
        case 'X':
11029
7.84k
    if (!ins->vex.evex || ins->vex.w)
11030
7.12k
      *ins->obufp++ = 'd';
11031
715
    else
11032
715
      oappend (ins, "{bad}");
11033
7.84k
    break;
11034
0
        default:
11035
0
    abort ();
11036
7.84k
        }
11037
7.84k
        break;
11038
7.84k
      }
11039
19.6k
    if (l)
11040
0
      abort ();
11041
19.6k
    if (ins->intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
11042
18.5k
      break;
11043
1.06k
    USED_REX (REX_W);
11044
1.06k
    if (ins->modrm.mod == 3)
11045
608
      {
11046
608
        if (ins->rex & REX_W)
11047
228
    *ins->obufp++ = 'q';
11048
380
        else
11049
380
    {
11050
380
      if (sizeflag & DFLAG)
11051
190
        *ins->obufp++ = ins->intel_syntax ? 'd' : 'l';
11052
190
      else
11053
190
        *ins->obufp++ = 'w';
11054
380
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11055
380
    }
11056
608
      }
11057
460
    else
11058
460
      *ins->obufp++ = 'w';
11059
1.06k
    break;
11060
60.1k
  case 'E':
11061
60.1k
    if (l == 1)
11062
45.3k
      {
11063
45.3k
        switch (last[0])
11064
45.3k
    {
11065
969
    case 'M':
11066
969
      if (ins->modrm.mod != 3)
11067
347
        break;
11068
    /* Fall through.  */
11069
43.4k
    case 'X':
11070
43.4k
      if (!ins->vex.evex || ins->vex.b || ins->vex.ll >= 2
11071
14.3k
          || (ins->rex2 & 7)
11072
7.51k
          || (ins->modrm.mod == 3 && (ins->rex & REX_X))
11073
6.36k
          || !ins->vex.v || ins->vex.mask_register_specifier)
11074
39.6k
        break;
11075
      /* AVX512 extends a number of V*D insns to also have V*Q variants,
11076
         merely distinguished by EVEX.W.  Look for a use of the
11077
         respective macro.  */
11078
3.78k
      if (ins->vex.w)
11079
2.02k
        {
11080
2.02k
          const char *pct = strchr (p + 1, '%');
11081
11082
2.02k
          if (pct != NULL && pct[1] == 'D' && pct[2] == 'Q')
11083
659
      break;
11084
2.02k
        }
11085
3.12k
      *ins->obufp++ = '{';
11086
3.12k
      *ins->obufp++ = 'e';
11087
3.12k
      *ins->obufp++ = 'v';
11088
3.12k
      *ins->obufp++ = 'e';
11089
3.12k
      *ins->obufp++ = 'x';
11090
3.12k
      *ins->obufp++ = '}';
11091
3.12k
      *ins->obufp++ = ' ';
11092
3.12k
      break;
11093
1.50k
    case 'N':
11094
      /* Skip printing {evex} for some special instructions in MAP4.  */
11095
1.50k
      evex_printed = true;
11096
1.50k
      break;
11097
0
    default:
11098
0
      abort ();
11099
45.3k
    }
11100
45.3k
    break;
11101
45.3k
      }
11102
    /* For jcxz/jecxz */
11103
14.8k
    if (ins->address_mode == mode_64bit)
11104
11.7k
      {
11105
11.7k
        if (sizeflag & AFLAG)
11106
11.2k
    *ins->obufp++ = 'r';
11107
435
        else
11108
435
    *ins->obufp++ = 'e';
11109
11.7k
      }
11110
3.11k
    else
11111
3.11k
      if (sizeflag & AFLAG)
11112
1.54k
        *ins->obufp++ = 'e';
11113
14.8k
    ins->used_prefixes |= (ins->prefixes & PREFIX_ADDR);
11114
14.8k
    break;
11115
96.5k
  case 'F':
11116
96.5k
    if (l == 0)
11117
30.4k
      {
11118
30.4k
        if (ins->intel_syntax)
11119
5.36k
    break;
11120
25.0k
        if ((ins->prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
11121
2.00k
    {
11122
2.00k
      if (sizeflag & AFLAG)
11123
905
        *ins->obufp++ = ins->address_mode == mode_64bit ? 'q' : 'l';
11124
1.09k
      else
11125
1.09k
        *ins->obufp++ = ins->address_mode == mode_64bit ? 'l' : 'w';
11126
2.00k
      ins->used_prefixes |= (ins->prefixes & PREFIX_ADDR);
11127
2.00k
    }
11128
25.0k
      }
11129
66.0k
    else if (l == 1 && last[0] == 'C')
11130
3.14k
      {
11131
3.14k
        if (ins->vex.nd && !ins->vex.nf)
11132
1.24k
    break;
11133
1.90k
        *ins->obufp++ = 'c';
11134
1.90k
        *ins->obufp++ = 'f';
11135
        /* Skip printing {evex} */
11136
1.90k
        evex_printed = true;
11137
1.90k
      }
11138
62.9k
    else if (l == 1 && last[0] == 'N')
11139
61.4k
      {
11140
61.4k
        if (ins->vex.nf)
11141
3.69k
    {
11142
3.69k
      oappend (ins, "{nf} ");
11143
      /* This bit needs to be cleared after it is consumed.  */
11144
3.69k
      ins->vex.nf = false;
11145
3.69k
      evex_printed = true;
11146
3.69k
    }
11147
57.7k
        else if (ins->evex_type == evex_from_vex && !(ins->rex2 & 7)
11148
763
           && ins->vex.v)
11149
480
    {
11150
480
      oappend (ins, "{evex} ");
11151
480
      evex_printed = true;
11152
480
    }
11153
61.4k
      }
11154
1.46k
    else if (l == 1 && last[0] == 'D')
11155
1.46k
      {
11156
        /* Get oszc flags value from register_specifier.  */
11157
1.46k
        int oszc_value = ~ins->vex.register_specifier & 0xf;
11158
11159
        /* Add {dfv=of, sf, zf, cf} flags.  */
11160
1.46k
        oappend (ins, oszc_flags[oszc_value]);
11161
11162
        /* These bits have been consumed and should be cleared.  */
11163
1.46k
        ins->vex.register_specifier = 0;
11164
1.46k
      }
11165
0
    else
11166
0
      abort ();
11167
89.9k
    break;
11168
89.9k
  case 'G':
11169
76.7k
    if (ins->intel_syntax || (ins->obufp[-1] != 's'
11170
35.0k
            && !(sizeflag & SUFFIX_ALWAYS)))
11171
47.8k
      break;
11172
28.9k
    if ((ins->rex & REX_W) || (sizeflag & DFLAG))
11173
27.6k
      *ins->obufp++ = 'l';
11174
1.22k
    else
11175
1.22k
      *ins->obufp++ = 'w';
11176
28.9k
    if (!(ins->rex & REX_W))
11177
28.4k
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11178
28.9k
    break;
11179
336k
  case 'H':
11180
336k
    if (l == 0)
11181
319k
      {
11182
319k
        if (ins->intel_syntax)
11183
56.8k
          break;
11184
262k
        if ((ins->prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
11185
252k
      || (ins->prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
11186
12.5k
    {
11187
12.5k
      ins->used_prefixes |= ins->prefixes & (PREFIX_CS | PREFIX_DS);
11188
12.5k
      *ins->obufp++ = ',';
11189
12.5k
      *ins->obufp++ = 'p';
11190
11191
      /* Set active_seg_prefix even if not set in 64-bit mode
11192
         because here it is a valid branch hint. */
11193
12.5k
      if (ins->prefixes & PREFIX_DS)
11194
2.18k
        {
11195
2.18k
          ins->active_seg_prefix = PREFIX_DS;
11196
2.18k
          *ins->obufp++ = 't';
11197
2.18k
        }
11198
10.3k
      else
11199
10.3k
        {
11200
10.3k
          ins->active_seg_prefix = PREFIX_CS;
11201
10.3k
          *ins->obufp++ = 'n';
11202
10.3k
        }
11203
12.5k
    }
11204
262k
      }
11205
16.8k
    else if (l == 1 && last[0] == 'X')
11206
16.8k
      {
11207
16.8k
        if (!ins->vex.w)
11208
7.77k
    *ins->obufp++ = 'h';
11209
9.07k
        else
11210
9.07k
    oappend (ins, "{bad}");
11211
16.8k
      }
11212
0
    else
11213
0
      abort ();
11214
279k
    break;
11215
279k
  case 'K':
11216
1.78k
    USED_REX (REX_W);
11217
1.78k
    if (ins->rex & REX_W)
11218
462
      *ins->obufp++ = 'q';
11219
1.32k
    else
11220
1.32k
      *ins->obufp++ = 'd';
11221
1.78k
    break;
11222
2.03k
  case 'L':
11223
2.03k
    if (ins->intel_syntax)
11224
578
      break;
11225
1.45k
    if (sizeflag & SUFFIX_ALWAYS)
11226
1.20k
      {
11227
1.20k
        if (ins->rex & REX_W)
11228
590
    *ins->obufp++ = 'q';
11229
618
        else
11230
618
    *ins->obufp++ = 'l';
11231
1.20k
      }
11232
1.45k
    break;
11233
2.34k
  case 'M':
11234
2.34k
    if (ins->intel_mnemonic != cond)
11235
1.03k
      *ins->obufp++ = 'r';
11236
2.34k
    break;
11237
2.91k
  case 'N':
11238
2.91k
    if ((ins->prefixes & PREFIX_FWAIT) == 0)
11239
2.26k
      *ins->obufp++ = 'n';
11240
650
    else
11241
650
      ins->used_prefixes |= PREFIX_FWAIT;
11242
2.91k
    break;
11243
45.0k
  case 'O':
11244
45.0k
    USED_REX (REX_W);
11245
45.0k
    if (ins->rex & REX_W)
11246
1.70k
      *ins->obufp++ = 'o';
11247
43.3k
    else if (ins->intel_syntax && (sizeflag & DFLAG))
11248
3.12k
      *ins->obufp++ = 'q';
11249
40.2k
    else
11250
40.2k
      *ins->obufp++ = 'd';
11251
45.0k
    if (!(ins->rex & REX_W))
11252
43.3k
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11253
45.0k
    break;
11254
84.3k
  case '@':
11255
84.3k
    if (ins->address_mode == mode_64bit
11256
78.4k
        && (ins->isa64 == intel64 || (ins->rex & REX_W)
11257
75.4k
      || !(ins->prefixes & PREFIX_DATA)))
11258
77.5k
      {
11259
77.5k
        if (sizeflag & SUFFIX_ALWAYS)
11260
686
    *ins->obufp++ = 'q';
11261
77.5k
        break;
11262
77.5k
      }
11263
    /* Fall through.  */
11264
434k
  case 'P':
11265
434k
    if (l == 0)
11266
387k
      {
11267
387k
        if (!cond && ins->last_rex2_prefix >= 0 && (ins->rex & REX_W))
11268
857
    {
11269
      /* For pushp and popp, p is printed and do not print {rex2}
11270
         for them.  */
11271
857
      *ins->obufp++ = 'p';
11272
857
      ins->rex2 |= REX2_SPECIAL;
11273
857
      break;
11274
857
    }
11275
11276
        /* For "!P" print nothing else in Intel syntax.  */
11277
386k
        if (!cond && ins->intel_syntax)
11278
40.2k
    break;
11279
11280
346k
        if ((ins->modrm.mod == 3 || !cond)
11281
212k
      && !(sizeflag & SUFFIX_ALWAYS))
11282
210k
    break;
11283
    /* Fall through.  */
11284
136k
  case 'T':
11285
136k
        if ((!(ins->rex & REX_W) && (ins->prefixes & PREFIX_DATA))
11286
132k
      || ((sizeflag & SUFFIX_ALWAYS)
11287
2.18k
          && ins->address_mode != mode_64bit))
11288
4.76k
    {
11289
4.76k
      *ins->obufp++ = (sizeflag & DFLAG)
11290
4.76k
          ? ins->intel_syntax ? 'd' : 'l' : 'w';
11291
4.76k
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11292
4.76k
    }
11293
131k
        else if (sizeflag & SUFFIX_ALWAYS)
11294
990
    *ins->obufp++ = 'q';
11295
136k
      }
11296
46.8k
    else if (l == 1 && last[0] == 'L')
11297
46.8k
      {
11298
46.8k
        if ((ins->prefixes & PREFIX_DATA)
11299
46.1k
      || (ins->rex & REX_W)
11300
44.3k
      || (sizeflag & SUFFIX_ALWAYS))
11301
3.25k
    {
11302
3.25k
      USED_REX (REX_W);
11303
3.25k
      if (ins->rex & REX_W)
11304
1.85k
        *ins->obufp++ = 'q';
11305
1.39k
      else
11306
1.39k
        {
11307
1.39k
          if (sizeflag & DFLAG)
11308
610
      *ins->obufp++ = ins->intel_syntax ? 'd' : 'l';
11309
787
          else
11310
787
      *ins->obufp++ = 'w';
11311
1.39k
          ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11312
1.39k
        }
11313
3.25k
    }
11314
46.8k
      }
11315
0
    else
11316
0
      abort ();
11317
182k
    break;
11318
182k
  case 'Q':
11319
171k
    if (l == 0)
11320
155k
      {
11321
155k
        if (ins->intel_syntax && !alt)
11322
39.5k
    break;
11323
115k
        USED_REX (REX_W);
11324
115k
        if ((ins->need_modrm && ins->modrm.mod != 3 && !ins->vex.nd)
11325
37.2k
      || (sizeflag & SUFFIX_ALWAYS))
11326
79.0k
    {
11327
79.0k
      if (ins->rex & REX_W)
11328
2.23k
        *ins->obufp++ = 'q';
11329
76.7k
      else
11330
76.7k
        {
11331
76.7k
          if (sizeflag & DFLAG)
11332
68.1k
      *ins->obufp++ = ins->intel_syntax ? 'd' : 'l';
11333
8.64k
          else
11334
8.64k
      *ins->obufp++ = 'w';
11335
76.7k
          ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11336
76.7k
        }
11337
79.0k
    }
11338
115k
      }
11339
16.0k
    else if (l == 1 && last[0] == 'D')
11340
9.67k
      *ins->obufp++ = ins->vex.w ? 'q' : 'd';
11341
6.38k
    else if (l == 1 && last[0] == 'L')
11342
6.38k
      {
11343
6.38k
        if (cond ? ins->modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)
11344
6.38k
           : ins->address_mode != mode_64bit)
11345
1.66k
    break;
11346
4.71k
        if ((ins->rex & REX_W))
11347
1.42k
    {
11348
1.42k
      USED_REX (REX_W);
11349
1.42k
      *ins->obufp++ = 'q';
11350
1.42k
    }
11351
3.29k
        else if ((ins->address_mode == mode_64bit && cond)
11352
2.20k
          || (sizeflag & SUFFIX_ALWAYS))
11353
1.31k
    *ins->obufp++ = ins->intel_syntax? 'd' : 'l';
11354
4.71k
      }
11355
0
    else
11356
0
      abort ();
11357
130k
    break;
11358
130k
  case 'R':
11359
122k
    USED_REX (REX_W);
11360
122k
    if (ins->rex & REX_W)
11361
3.83k
      *ins->obufp++ = 'q';
11362
118k
    else if (sizeflag & DFLAG)
11363
111k
      {
11364
111k
        if (ins->intel_syntax)
11365
9.04k
      *ins->obufp++ = 'd';
11366
102k
        else
11367
102k
      *ins->obufp++ = 'l';
11368
111k
      }
11369
7.05k
    else
11370
7.05k
      *ins->obufp++ = 'w';
11371
122k
    if (ins->intel_syntax && !p[1]
11372
8.04k
        && ((ins->rex & REX_W) || (sizeflag & DFLAG)))
11373
7.05k
      *ins->obufp++ = 'e';
11374
122k
    if (!(ins->rex & REX_W))
11375
118k
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11376
122k
    break;
11377
848k
  case 'S':
11378
848k
    if (l == 0)
11379
819k
      {
11380
910k
      case_S:
11381
910k
        if (ins->intel_syntax)
11382
167k
    break;
11383
742k
        if (sizeflag & SUFFIX_ALWAYS)
11384
4.65k
    {
11385
4.65k
      if (ins->rex & REX_W)
11386
644
        *ins->obufp++ = 'q';
11387
4.00k
      else
11388
4.00k
        {
11389
4.00k
          if (sizeflag & DFLAG)
11390
2.31k
      *ins->obufp++ = 'l';
11391
1.69k
          else
11392
1.69k
      *ins->obufp++ = 'w';
11393
4.00k
          ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11394
4.00k
        }
11395
4.65k
    }
11396
742k
        break;
11397
910k
      }
11398
28.4k
    if (l != 1)
11399
0
      abort ();
11400
28.4k
    switch (last[0])
11401
28.4k
      {
11402
23.1k
      case 'L':
11403
23.1k
        if (ins->address_mode == mode_64bit
11404
16.2k
      && !(ins->prefixes & PREFIX_ADDR))
11405
15.5k
    {
11406
15.5k
      *ins->obufp++ = 'a';
11407
15.5k
      *ins->obufp++ = 'b';
11408
15.5k
      *ins->obufp++ = 's';
11409
15.5k
    }
11410
11411
23.1k
        goto case_S;
11412
5.31k
      case 'X':
11413
5.31k
        if (!ins->vex.evex || !ins->vex.w)
11414
4.41k
    *ins->obufp++ = 's';
11415
906
        else
11416
906
    oappend (ins, "{bad}");
11417
5.31k
        break;
11418
0
      default:
11419
0
        abort ();
11420
28.4k
      }
11421
5.31k
    break;
11422
5.31k
  case 'U':
11423
4.27k
    if (l == 1 && (last[0] == 'Z'))
11424
4.27k
      {
11425
        /* Although IMUL/SETcc does not support NDD, the EVEX.ND bit is
11426
     used to control whether its destination register has its upper
11427
     bits zeroed.  */
11428
4.27k
        if (ins->vex.nd)
11429
2.34k
    oappend (ins, "zu");
11430
4.27k
      }
11431
0
    else
11432
0
      abort ();
11433
4.27k
    break;
11434
87.1k
  case 'V':
11435
87.1k
    if (l == 0)
11436
18.0k
      {
11437
18.0k
        if (ins->need_vex)
11438
7.94k
    *ins->obufp++ = 'v';
11439
18.0k
      }
11440
69.1k
    else if (l == 1)
11441
69.1k
      {
11442
69.1k
        switch (last[0])
11443
69.1k
    {
11444
1.30k
    case 'X':
11445
1.30k
      if (ins->vex.evex)
11446
765
        break;
11447
539
      *ins->obufp++ = '{';
11448
539
      *ins->obufp++ = 'v';
11449
539
      *ins->obufp++ = 'e';
11450
539
      *ins->obufp++ = 'x';
11451
539
      *ins->obufp++ = '}';
11452
539
      *ins->obufp++ = ' ';
11453
539
      break;
11454
67.8k
    case 'L':
11455
67.8k
      if (ins->rex & REX_W)
11456
2.42k
        {
11457
2.42k
          *ins->obufp++ = 'a';
11458
2.42k
          *ins->obufp++ = 'b';
11459
2.42k
          *ins->obufp++ = 's';
11460
2.42k
        }
11461
67.8k
      goto case_S;
11462
0
    default:
11463
0
      abort ();
11464
69.1k
    }
11465
69.1k
      }
11466
0
    else
11467
0
      abort ();
11468
19.3k
    break;
11469
54.2k
  case 'W':
11470
54.2k
    if (l == 0)
11471
38.7k
      {
11472
        /* operand size flag for cwtl, cbtw */
11473
38.7k
        USED_REX (REX_W);
11474
38.7k
        if (ins->rex & REX_W)
11475
1.97k
    {
11476
1.97k
      if (ins->intel_syntax)
11477
1.13k
        *ins->obufp++ = 'd';
11478
842
      else
11479
842
        *ins->obufp++ = 'l';
11480
1.97k
    }
11481
36.7k
        else if (sizeflag & DFLAG)
11482
34.5k
    *ins->obufp++ = 'w';
11483
2.25k
        else
11484
2.25k
    *ins->obufp++ = 'b';
11485
38.7k
        if (!(ins->rex & REX_W))
11486
36.7k
    ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11487
38.7k
      }
11488
15.4k
    else if (l == 1)
11489
15.4k
      {
11490
15.4k
        if (!ins->need_vex)
11491
0
    abort ();
11492
15.4k
        if (last[0] == 'X')
11493
11.7k
    *ins->obufp++ = ins->vex.w ? 'd': 's';
11494
3.70k
        else if (last[0] == 'B')
11495
3.70k
    *ins->obufp++ = ins->vex.w ? 'w': 'b';
11496
0
        else
11497
0
    abort ();
11498
15.4k
      }
11499
0
    else
11500
0
      abort ();
11501
54.2k
    break;
11502
54.2k
  case 'X':
11503
13.3k
    if (l != 0)
11504
0
      abort ();
11505
13.3k
    if (ins->need_vex
11506
13.3k
        ? ins->vex.prefix == DATA_PREFIX_OPCODE
11507
13.3k
        : ins->prefixes & PREFIX_DATA)
11508
3.06k
      {
11509
3.06k
        *ins->obufp++ = 'd';
11510
3.06k
        ins->used_prefixes |= PREFIX_DATA;
11511
3.06k
      }
11512
10.3k
    else
11513
10.3k
      *ins->obufp++ = 's';
11514
13.3k
    break;
11515
17.5k
  case 'Y':
11516
17.5k
    if (l == 0)
11517
11.5k
      {
11518
11.5k
        if (ins->vex.mask_register_specifier)
11519
4.70k
    ins->illegal_masking = true;
11520
11.5k
      }
11521
6.05k
    else if (l == 1 && last[0] == 'X')
11522
6.05k
      {
11523
6.05k
        if (!ins->need_vex)
11524
536
    break;
11525
5.52k
        if (ins->intel_syntax
11526
4.17k
      || ((ins->modrm.mod == 3 || ins->vex.b)
11527
2.25k
          && !(sizeflag & SUFFIX_ALWAYS)))
11528
3.13k
    break;
11529
2.39k
        switch (ins->vex.length)
11530
2.39k
    {
11531
732
    case 128:
11532
732
      *ins->obufp++ = 'x';
11533
732
      break;
11534
1.15k
    case 256:
11535
1.15k
      *ins->obufp++ = 'y';
11536
1.15k
      break;
11537
507
    case 512:
11538
507
      if (!ins->vex.evex)
11539
0
    default:
11540
0
        abort ();
11541
2.39k
    }
11542
2.39k
      }
11543
0
    else
11544
0
      abort ();
11545
13.8k
    break;
11546
13.8k
  case 'Z':
11547
10.9k
    if (l == 0)
11548
6.75k
      {
11549
        /* These insns ignore ModR/M.mod: Force it to 3 for OP_E().  */
11550
6.75k
        ins->modrm.mod = 3;
11551
6.75k
        if (!ins->intel_syntax && (sizeflag & SUFFIX_ALWAYS))
11552
202
    *ins->obufp++ = ins->address_mode == mode_64bit ? 'q' : 'l';
11553
6.75k
      }
11554
4.18k
    else if (l == 1 && last[0] == 'X')
11555
4.18k
      {
11556
4.18k
        if (!ins->vex.evex)
11557
0
    abort ();
11558
4.18k
        if (ins->intel_syntax
11559
3.12k
      || ((ins->modrm.mod == 3 || ins->vex.b)
11560
1.44k
          && !(sizeflag & SUFFIX_ALWAYS)))
11561
2.22k
    break;
11562
1.96k
        switch (ins->vex.length)
11563
1.96k
    {
11564
564
    case 128:
11565
564
      *ins->obufp++ = 'x';
11566
564
      break;
11567
468
    case 256:
11568
468
      *ins->obufp++ = 'y';
11569
468
      break;
11570
929
    case 512:
11571
929
      *ins->obufp++ = 'z';
11572
929
      break;
11573
0
    default:
11574
0
      abort ();
11575
1.96k
    }
11576
1.96k
      }
11577
0
    else
11578
0
      abort ();
11579
8.72k
    break;
11580
22.8k
  case '^':
11581
22.8k
    if (ins->intel_syntax)
11582
6.31k
      break;
11583
16.5k
    if (ins->isa64 == intel64 && (ins->rex & REX_W))
11584
190
      {
11585
190
        USED_REX (REX_W);
11586
190
        *ins->obufp++ = 'q';
11587
190
        break;
11588
190
      }
11589
16.3k
    if ((ins->prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
11590
1.68k
      {
11591
1.68k
        if (sizeflag & DFLAG)
11592
571
    *ins->obufp++ = 'l';
11593
1.11k
        else
11594
1.11k
    *ins->obufp++ = 'w';
11595
1.68k
        ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11596
1.68k
      }
11597
16.3k
    break;
11598
24.3M
  }
11599
11600
24.3M
      if (len == l)
11601
24.0M
  len = l = 0;
11602
24.3M
    }
11603
5.32M
  *ins->obufp = 0;
11604
5.32M
  ins->mnemonicendp = ins->obufp;
11605
5.32M
  return 0;
11606
5.32M
}
11607
11608
/* Add a style marker to *INS->obufp that encodes STYLE.  This assumes that
11609
   the buffer pointed to by INS->obufp has space.  A style marker is made
11610
   from the STYLE_MARKER_CHAR followed by STYLE converted to a single hex
11611
   digit, followed by another STYLE_MARKER_CHAR.  This function assumes
11612
   that the number of styles is not greater than 16.  */
11613
11614
static void
11615
oappend_insert_style (instr_info *ins, enum disassembler_style style)
11616
18.8M
{
11617
18.8M
  unsigned num = (unsigned) style;
11618
11619
  /* We currently assume that STYLE can be encoded as a single hex
11620
     character.  If more styles are added then this might start to fail,
11621
     and we'll need to expand this code.  */
11622
18.8M
  if (num > 0xf)
11623
0
    abort ();
11624
11625
18.8M
  *ins->obufp++ = STYLE_MARKER_CHAR;
11626
18.8M
  *ins->obufp++ = (num < 10 ? ('0' + num)
11627
18.8M
       : ((num < 16) ? ('a' + (num - 10)) : '0'));
11628
18.8M
  *ins->obufp++ = STYLE_MARKER_CHAR;
11629
11630
  /* This final null character is not strictly necessary, after inserting a
11631
     style marker we should always be inserting some additional content.
11632
     However, having the buffer null terminated doesn't cost much, and make
11633
     it easier to debug what's going on.  Also, if we do ever forget to add
11634
     any additional content after this style marker, then the buffer will
11635
     still be well formed.  */
11636
18.8M
  *ins->obufp = '\0';
11637
18.8M
}
11638
11639
static void
11640
oappend_with_style (instr_info *ins, const char *s,
11641
        enum disassembler_style style)
11642
11.8M
{
11643
11.8M
  oappend_insert_style (ins, style);
11644
11.8M
  ins->obufp = stpcpy (ins->obufp, s);
11645
11.8M
}
11646
11647
/* Add a comment to the comment buffer.  */
11648
11649
static void
11650
cappend_with_style (instr_info *ins, const char *s,
11651
        enum disassembler_style style)
11652
0
{
11653
0
  size_t len = strlen (ins->cbufp);
11654
11655
0
  if (len + !!len + strlen (s) + 4 >= COMMENT_BUFFER_SIZE)
11656
0
    return;
11657
11658
0
  unsigned num = (unsigned) style;
11659
11660
0
  if (len)
11661
0
    *ins->cbufp++ = ' ';
11662
0
  *ins->cbufp++ = STYLE_MARKER_CHAR;
11663
0
  *ins->cbufp++ = (num < 10 ? ('0' + num)
11664
0
       : ((num < 16) ? ('a' + (num - 10)) : '0'));
11665
0
  *ins->cbufp++ = STYLE_MARKER_CHAR;
11666
11667
0
  ins->cbufp = stpcpy (ins->cbufp, s);
11668
0
}
11669
11670
/* Add a single character C to the buffer pointer to by INS->obufp, marking
11671
   the style for the character as STYLE.  */
11672
11673
static void
11674
oappend_char_with_style (instr_info *ins, const char c,
11675
       enum disassembler_style style)
11676
6.98M
{
11677
6.98M
  oappend_insert_style (ins, style);
11678
6.98M
  *ins->obufp++ = c;
11679
6.98M
  *ins->obufp = '\0';
11680
6.98M
}
11681
11682
/* Like oappend_char_with_style, but always uses dis_style_text.  */
11683
11684
static void
11685
oappend_char (instr_info *ins, const char c)
11686
6.10M
{
11687
6.10M
  oappend_char_with_style (ins, c, dis_style_text);
11688
6.10M
}
11689
11690
static void
11691
append_seg (instr_info *ins)
11692
2.91M
{
11693
  /* Only print the active segment register.  */
11694
2.91M
  if (!ins->active_seg_prefix)
11695
2.84M
    return;
11696
11697
74.7k
  ins->used_prefixes |= ins->active_seg_prefix;
11698
74.7k
  switch (ins->active_seg_prefix)
11699
74.7k
    {
11700
3.26k
    case PREFIX_CS:
11701
3.26k
      oappend_register (ins, att_names_seg[1]);
11702
3.26k
      break;
11703
30.5k
    case PREFIX_DS:
11704
30.5k
      oappend_register (ins, att_names_seg[3]);
11705
30.5k
      break;
11706
1.53k
    case PREFIX_SS:
11707
1.53k
      oappend_register (ins, att_names_seg[2]);
11708
1.53k
      break;
11709
1.99k
    case PREFIX_ES:
11710
1.99k
      oappend_register (ins, att_names_seg[0]);
11711
1.99k
      break;
11712
15.4k
    case PREFIX_FS:
11713
15.4k
      oappend_register (ins, att_names_seg[4]);
11714
15.4k
      break;
11715
21.9k
    case PREFIX_GS:
11716
21.9k
      oappend_register (ins, att_names_seg[5]);
11717
21.9k
      break;
11718
0
    default:
11719
0
      break;
11720
74.7k
    }
11721
74.7k
  oappend_char (ins, ':');
11722
74.7k
}
11723
11724
static void
11725
print_operand_value (instr_info *ins, bfd_vma disp,
11726
         enum disassembler_style style)
11727
1.16M
{
11728
1.16M
  char tmp[30];
11729
11730
1.16M
  if (ins->address_mode != mode_64bit)
11731
208k
    disp &= 0xffffffff;
11732
1.16M
  sprintf (tmp, "0x%" PRIx64, (uint64_t) disp);
11733
1.16M
  oappend_with_style (ins, tmp, style);
11734
1.16M
}
11735
11736
/* Like oappend, but called for immediate operands.  */
11737
11738
static void
11739
oappend_immediate (instr_info *ins, bfd_vma imm)
11740
708k
{
11741
708k
  if (!ins->intel_syntax)
11742
569k
    oappend_char_with_style (ins, '$', dis_style_immediate);
11743
11744
708k
  print_operand_value (ins, imm, dis_style_immediate);
11745
11746
  /* Determine if we can display some more information about this immediate.  */
11747
708k
  if (! ins->annotate_immediates
11748
      /* Don't bother with zero, even if there is symbol associated with it.  */
11749
764
      || imm == 0
11750
      /* For the next tests we need a BFD.  If we do not have one then do not proceed.  */
11751
574
      || ins->info->section == NULL
11752
0
      || ins->info->section->owner == NULL
11753
      /* Save time by avoiding immediates that cannot reference part of the address space.  */
11754
0
      || imm < ins->info->section->owner->start_address
11755
      /* Also skip static object files as their symbols have not been resolved.  */
11756
0
      || (ins->info->section->owner->flags & (EXEC_P | DYNAMIC)) == 0)
11757
708k
    return;
11758
11759
0
  asymbol * sym = ins->info->symbol_at_address_func (imm, ins->info);
11760
0
  if (sym == NULL)
11761
0
    return;
11762
11763
0
  char * annotation = NULL;
11764
11765
0
  if (asprintf (& annotation, "[%s]", sym->name) > 0)
11766
0
    {
11767
      /* Display the symbol associated with address 'imm'.  */
11768
0
      cappend_with_style (ins, annotation, dis_style_symbol);
11769
0
    }
11770
11771
0
  free (annotation);
11772
0
}
11773
11774
/* Put DISP in BUF as signed hex number.  */
11775
11776
static void
11777
print_displacement (instr_info *ins, bfd_signed_vma val)
11778
609k
{
11779
609k
  char tmp[30];
11780
11781
609k
  if (val < 0)
11782
170k
    {
11783
170k
      oappend_char_with_style (ins, '-', dis_style_address_offset);
11784
170k
      val = (bfd_vma) 0 - val;
11785
11786
      /* Check for possible overflow.  */
11787
170k
      if (val < 0)
11788
0
  {
11789
0
    switch (ins->address_mode)
11790
0
      {
11791
0
      case mode_64bit:
11792
0
        oappend_with_style (ins, "0x8000000000000000",
11793
0
          dis_style_address_offset);
11794
0
        break;
11795
0
      case mode_32bit:
11796
0
        oappend_with_style (ins, "0x80000000",
11797
0
          dis_style_address_offset);
11798
0
        break;
11799
0
      case mode_16bit:
11800
0
        oappend_with_style (ins, "0x8000",
11801
0
          dis_style_address_offset);
11802
0
        break;
11803
0
      }
11804
0
    return;
11805
0
  }
11806
170k
    }
11807
11808
609k
  sprintf (tmp, "0x%" PRIx64, (int64_t) val);
11809
609k
  oappend_with_style (ins, tmp, dis_style_address_offset);
11810
609k
}
11811
11812
static void
11813
intel_operand_size (instr_info *ins, int bytemode, int sizeflag)
11814
563k
{
11815
  /* Check if there is a broadcast, when evex.b is not treated as evex.nd.  */
11816
563k
  if (ins->vex.b && ins->evex_type == evex_default)
11817
7.56k
    {
11818
7.56k
      if (!ins->vex.no_broadcast)
11819
5.99k
  switch (bytemode)
11820
5.99k
    {
11821
2.30k
    case x_mode:
11822
3.05k
    case evex_half_bcst_xmmq_mode:
11823
3.05k
      if (ins->vex.w)
11824
1.74k
        oappend (ins, "QWORD BCST ");
11825
1.31k
      else
11826
1.31k
        oappend (ins, "DWORD BCST ");
11827
3.05k
      break;
11828
1.03k
    case xh_mode:
11829
1.41k
    case evex_half_bcst_xmmqh_mode:
11830
1.68k
    case evex_half_bcst_xmmqdh_mode:
11831
1.68k
      oappend (ins, "WORD BCST ");
11832
1.68k
      break;
11833
1.25k
    default:
11834
1.25k
      ins->vex.no_broadcast = true;
11835
1.25k
      break;
11836
5.99k
    }
11837
7.56k
      return;
11838
7.56k
    }
11839
555k
  switch (bytemode)
11840
555k
    {
11841
297k
    case b_mode:
11842
318k
    case b_swap_mode:
11843
319k
    case db_mode:
11844
319k
      oappend (ins, "BYTE PTR ");
11845
319k
      break;
11846
7.48k
    case w_mode:
11847
7.74k
    case w_swap_mode:
11848
8.21k
    case dw_mode:
11849
8.21k
      oappend (ins, "WORD PTR ");
11850
8.21k
      break;
11851
8.91k
    case indir_v_mode:
11852
8.91k
      if (ins->address_mode == mode_64bit && ins->isa64 == intel64)
11853
206
  {
11854
206
    oappend (ins, "QWORD PTR ");
11855
206
    break;
11856
206
  }
11857
      /* Fall through.  */
11858
12.1k
    case stack_v_mode:
11859
12.1k
      if (ins->address_mode == mode_64bit && ((sizeflag & DFLAG)
11860
1.71k
                || (ins->rex & REX_W)))
11861
7.50k
  {
11862
7.50k
    oappend (ins, "QWORD PTR ");
11863
7.50k
    break;
11864
7.50k
  }
11865
      /* Fall through.  */
11866
92.8k
    case v_mode:
11867
122k
    case v_swap_mode:
11868
125k
    case dq_mode:
11869
125k
      USED_REX (REX_W);
11870
125k
      if (ins->rex & REX_W)
11871
3.89k
  oappend (ins, "QWORD PTR ");
11872
121k
      else if (bytemode == dq_mode)
11873
2.83k
  oappend (ins, "DWORD PTR ");
11874
119k
      else
11875
119k
  {
11876
119k
    if (sizeflag & DFLAG)
11877
109k
      oappend (ins, "DWORD PTR ");
11878
9.34k
    else
11879
9.34k
      oappend (ins, "WORD PTR ");
11880
119k
    ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11881
119k
  }
11882
125k
      break;
11883
16.7k
    case z_mode:
11884
16.7k
      if ((ins->rex & REX_W) || (sizeflag & DFLAG))
11885
13.9k
  *ins->obufp++ = 'D';
11886
16.7k
      oappend (ins, "WORD PTR ");
11887
16.7k
      if (!(ins->rex & REX_W))
11888
15.8k
  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11889
16.7k
      break;
11890
5.50k
    case a_mode:
11891
5.50k
      if (sizeflag & DFLAG)
11892
3.98k
  oappend (ins, "QWORD PTR ");
11893
1.51k
      else
11894
1.51k
  oappend (ins, "DWORD PTR ");
11895
5.50k
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11896
5.50k
      break;
11897
2.52k
    case movsxd_mode:
11898
2.52k
      if (!(sizeflag & DFLAG) && ins->isa64 == intel64)
11899
190
  oappend (ins, "WORD PTR ");
11900
2.33k
      else
11901
2.33k
  oappend (ins, "DWORD PTR ");
11902
2.52k
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11903
2.52k
      break;
11904
3.64k
    case d_mode:
11905
4.12k
    case d_swap_mode:
11906
4.12k
      oappend (ins, "DWORD PTR ");
11907
4.12k
      break;
11908
14.6k
    case q_mode:
11909
15.2k
    case q_swap_mode:
11910
15.2k
      oappend (ins, "QWORD PTR ");
11911
15.2k
      break;
11912
1.11k
    case m_mode:
11913
1.11k
      if (ins->address_mode == mode_64bit)
11914
609
  oappend (ins, "QWORD PTR ");
11915
507
      else
11916
507
  oappend (ins, "DWORD PTR ");
11917
1.11k
      break;
11918
8.37k
    case f_mode:
11919
8.37k
      if (sizeflag & DFLAG)
11920
5.24k
  oappend (ins, "FWORD PTR ");
11921
3.13k
      else
11922
3.13k
  oappend (ins, "DWORD PTR ");
11923
8.37k
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11924
8.37k
      break;
11925
767
    case t_mode:
11926
767
      oappend (ins, "TBYTE PTR ");
11927
767
      break;
11928
11.0k
    case x_mode:
11929
12.1k
    case xh_mode:
11930
13.8k
    case x_swap_mode:
11931
14.2k
    case evex_x_gscat_mode:
11932
15.3k
    case evex_x_nobcst_mode:
11933
16.0k
    case bw_unit_mode:
11934
16.0k
      if (ins->need_vex)
11935
10.1k
  {
11936
10.1k
    switch (ins->vex.length)
11937
10.1k
      {
11938
4.54k
      case 128:
11939
4.54k
        oappend (ins, "XMMWORD PTR ");
11940
4.54k
        break;
11941
3.33k
      case 256:
11942
3.33k
        oappend (ins, "YMMWORD PTR ");
11943
3.33k
        break;
11944
2.25k
      case 512:
11945
2.25k
        oappend (ins, "ZMMWORD PTR ");
11946
2.25k
        break;
11947
0
      default:
11948
0
        abort ();
11949
10.1k
      }
11950
10.1k
  }
11951
5.96k
      else
11952
5.96k
  oappend (ins, "XMMWORD PTR ");
11953
16.0k
      break;
11954
16.0k
    case xmm_mode:
11955
770
      oappend (ins, "XMMWORD PTR ");
11956
770
      break;
11957
545
    case ymm_mode:
11958
545
      oappend (ins, "YMMWORD PTR ");
11959
545
      break;
11960
840
    case xmmq_mode:
11961
1.54k
    case evex_half_bcst_xmmqh_mode:
11962
2.44k
    case evex_half_bcst_xmmq_mode:
11963
2.44k
      switch (ins->vex.length)
11964
2.44k
  {
11965
625
  case 0:
11966
1.30k
  case 128:
11967
1.30k
    oappend (ins, "QWORD PTR ");
11968
1.30k
    break;
11969
483
  case 256:
11970
483
    oappend (ins, "XMMWORD PTR ");
11971
483
    break;
11972
654
  case 512:
11973
654
    oappend (ins, "YMMWORD PTR ");
11974
654
    break;
11975
0
  default:
11976
0
    abort ();
11977
2.44k
  }
11978
2.44k
      break;
11979
2.44k
    case xmmdw_mode:
11980
1.19k
      if (!ins->need_vex)
11981
0
  abort ();
11982
11983
1.19k
      switch (ins->vex.length)
11984
1.19k
  {
11985
503
  case 128:
11986
503
    oappend (ins, "WORD PTR ");
11987
503
    break;
11988
348
  case 256:
11989
348
    oappend (ins, "DWORD PTR ");
11990
348
    break;
11991
347
  case 512:
11992
347
    oappend (ins, "QWORD PTR ");
11993
347
    break;
11994
0
  default:
11995
0
    abort ();
11996
1.19k
  }
11997
1.19k
      break;
11998
1.45k
    case xmmqd_mode:
11999
1.78k
    case evex_half_bcst_xmmqdh_mode:
12000
1.78k
      if (!ins->need_vex)
12001
0
  abort ();
12002
12003
1.78k
      switch (ins->vex.length)
12004
1.78k
  {
12005
623
  case 128:
12006
623
    oappend (ins, "DWORD PTR ");
12007
623
    break;
12008
450
  case 256:
12009
450
    oappend (ins, "QWORD PTR ");
12010
450
    break;
12011
710
  case 512:
12012
710
    oappend (ins, "XMMWORD PTR ");
12013
710
    break;
12014
0
  default:
12015
0
    abort ();
12016
1.78k
  }
12017
1.78k
      break;
12018
1.78k
    case ymmq_mode:
12019
1.54k
      if (!ins->need_vex)
12020
0
  abort ();
12021
12022
1.54k
      switch (ins->vex.length)
12023
1.54k
  {
12024
604
  case 128:
12025
604
    oappend (ins, "QWORD PTR ");
12026
604
    break;
12027
671
  case 256:
12028
671
    oappend (ins, "YMMWORD PTR ");
12029
671
    break;
12030
267
  case 512:
12031
267
    oappend (ins, "ZMMWORD PTR ");
12032
267
    break;
12033
0
  default:
12034
0
    abort ();
12035
1.54k
  }
12036
1.54k
      break;
12037
1.54k
    case o_mode:
12038
357
      oappend (ins, "OWORD PTR ");
12039
357
      break;
12040
1.51k
    case vex_vsib_d_w_dq_mode:
12041
4.58k
    case vex_vsib_q_w_dq_mode:
12042
4.58k
      if (!ins->need_vex)
12043
0
  abort ();
12044
4.58k
      if (ins->vex.w)
12045
1.69k
  oappend (ins, "QWORD PTR ");
12046
2.88k
      else
12047
2.88k
  oappend (ins, "DWORD PTR ");
12048
4.58k
      break;
12049
1.17k
    case mask_bd_mode:
12050
1.17k
      if (!ins->need_vex || ins->vex.length != 128)
12051
0
  abort ();
12052
1.17k
      if (ins->vex.w)
12053
425
  oappend (ins, "DWORD PTR ");
12054
753
      else
12055
753
  oappend (ins, "BYTE PTR ");
12056
1.17k
      break;
12057
1.06k
    case mask_mode:
12058
1.06k
      if (!ins->need_vex)
12059
0
  abort ();
12060
1.06k
      if (ins->vex.w)
12061
370
  oappend (ins, "QWORD PTR ");
12062
699
      else
12063
699
  oappend (ins, "WORD PTR ");
12064
1.06k
      break;
12065
1.01k
    case v_bnd_mode:
12066
2.50k
    case v_bndmk_mode:
12067
8.54k
    default:
12068
8.54k
      break;
12069
555k
    }
12070
555k
}
12071
12072
static void
12073
print_register (instr_info *ins, unsigned int reg, unsigned int rexmask,
12074
    int bytemode, int sizeflag)
12075
2.89M
{
12076
2.89M
  const char (*names)[8];
12077
12078
  /* Masking is invalid for insns with GPR destination. Set the flag uniformly,
12079
     as the consumer will inspect it only for the destination operand.  */
12080
2.89M
  if (bytemode != mask_mode && ins->vex.mask_register_specifier)
12081
9.09k
    ins->illegal_masking = true;
12082
12083
2.89M
  USED_REX (rexmask);
12084
2.89M
  if (ins->rex & rexmask)
12085
69.6k
    reg += 8;
12086
2.89M
  if (ins->rex2 & rexmask)
12087
20.5k
    reg += 16;
12088
12089
2.89M
  switch (bytemode)
12090
2.89M
    {
12091
2.14M
    case b_mode:
12092
2.16M
    case b_swap_mode:
12093
2.16M
      if (reg & 4)
12094
463k
  USED_REX (0);
12095
2.16M
      if (ins->rex || ins->rex2)
12096
43.8k
  names = att_names8rex;
12097
2.12M
      else
12098
2.12M
  names = att_names8;
12099
2.16M
      break;
12100
365
    case w_mode:
12101
365
      names = att_names16;
12102
365
      break;
12103
14.5k
    case d_mode:
12104
15.6k
    case dw_mode:
12105
16.6k
    case db_mode:
12106
16.6k
      names = att_names32;
12107
16.6k
      break;
12108
2.62k
    case q_mode:
12109
2.62k
      names = att_names64;
12110
2.62k
      break;
12111
8.16k
    case m_mode:
12112
8.42k
    case v_bnd_mode:
12113
8.42k
      names = ins->address_mode == mode_64bit ? att_names64 : att_names32;
12114
8.42k
      break;
12115
10.0k
    case bnd_mode:
12116
10.4k
    case bnd_swap_mode:
12117
10.4k
      if (reg > 0x3)
12118
4.57k
  {
12119
4.57k
    oappend (ins, "(bad)");
12120
4.57k
    return;
12121
4.57k
  }
12122
5.90k
      names = att_names_bnd;
12123
5.90k
      break;
12124
12.1k
    case indir_v_mode:
12125
12.1k
      if (ins->address_mode == mode_64bit && ins->isa64 == intel64)
12126
190
  {
12127
190
    names = att_names64;
12128
190
    break;
12129
190
  }
12130
      /* Fall through.  */
12131
19.3k
    case stack_v_mode:
12132
19.3k
      if (ins->address_mode == mode_64bit && ((sizeflag & DFLAG)
12133
871
                || (ins->rex & REX_W)))
12134
14.0k
  {
12135
14.0k
    names = att_names64;
12136
14.0k
    break;
12137
14.0k
  }
12138
5.26k
      bytemode = v_mode;
12139
      /* Fall through.  */
12140
622k
    case v_mode:
12141
642k
    case v_swap_mode:
12142
654k
    case dq_mode:
12143
654k
      USED_REX (REX_W);
12144
654k
      if (ins->rex & REX_W)
12145
68.2k
  names = att_names64;
12146
586k
      else if (bytemode != v_mode && bytemode != v_swap_mode)
12147
9.54k
  names = att_names32;
12148
576k
      else
12149
576k
  {
12150
576k
    if (sizeflag & DFLAG)
12151
521k
      names = att_names32;
12152
55.2k
    else
12153
55.2k
      names = att_names16;
12154
576k
    ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12155
576k
  }
12156
654k
      break;
12157
3.00k
    case movsxd_mode:
12158
3.00k
      if (!(sizeflag & DFLAG) && ins->isa64 == intel64)
12159
190
  names = att_names16;
12160
2.81k
      else
12161
2.81k
  names = att_names32;
12162
3.00k
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12163
3.00k
      break;
12164
1.60k
    case va_mode:
12165
1.60k
      names = (ins->address_mode == mode_64bit
12166
1.60k
         ? att_names64 : att_names32);
12167
1.60k
      if (!(ins->prefixes & PREFIX_ADDR))
12168
1.26k
  names = (ins->address_mode == mode_16bit
12169
1.26k
         ? att_names16 : names);
12170
332
      else
12171
332
  {
12172
    /* Remove "addr16/addr32".  */
12173
332
    ins->all_prefixes[ins->last_addr_prefix] = 0;
12174
332
    names = (ins->address_mode != mode_32bit
12175
332
           ? att_names32 : att_names16);
12176
332
    ins->used_prefixes |= PREFIX_ADDR;
12177
332
  }
12178
1.60k
      break;
12179
448
    case mask_bd_mode:
12180
16.3k
    case mask_mode:
12181
16.3k
      if (reg > 0x7)
12182
10.4k
  {
12183
10.4k
    oappend (ins, "(bad)");
12184
10.4k
    return;
12185
10.4k
  }
12186
5.86k
      names = att_names_mask;
12187
5.86k
      break;
12188
463
    case 0:
12189
463
      return;
12190
0
    default:
12191
0
      oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
12192
0
      return;
12193
2.89M
    }
12194
2.87M
  oappend_register (ins, names[reg]);
12195
2.87M
}
12196
12197
static bool
12198
get8s (instr_info *ins, bfd_vma *res)
12199
736k
{
12200
736k
  if (!fetch_code (ins->info, ins->codep + 1))
12201
9.57k
    return false;
12202
726k
  *res = ((bfd_vma) *ins->codep++ ^ 0x80) - 0x80;
12203
726k
  return true;
12204
736k
}
12205
12206
static bool
12207
get16 (instr_info *ins, bfd_vma *res)
12208
82.3k
{
12209
82.3k
  if (!fetch_code (ins->info, ins->codep + 2))
12210
3.07k
    return false;
12211
79.2k
  *res = *ins->codep++;
12212
79.2k
  *res |= (bfd_vma) *ins->codep++ << 8;
12213
79.2k
  return true;
12214
82.3k
}
12215
12216
static bool
12217
get16s (instr_info *ins, bfd_vma *res)
12218
25.2k
{
12219
25.2k
  if (!get16 (ins, res))
12220
1.00k
    return false;
12221
24.2k
  *res = (*res ^ 0x8000) - 0x8000;
12222
24.2k
  return true;
12223
25.2k
}
12224
12225
static bool
12226
get32 (instr_info *ins, bfd_vma *res)
12227
522k
{
12228
522k
  if (!fetch_code (ins->info, ins->codep + 4))
12229
15.9k
    return false;
12230
506k
  *res = *ins->codep++;
12231
506k
  *res |= (bfd_vma) *ins->codep++ << 8;
12232
506k
  *res |= (bfd_vma) *ins->codep++ << 16;
12233
506k
  *res |= (bfd_vma) *ins->codep++ << 24;
12234
506k
  return true;
12235
522k
}
12236
12237
static bool
12238
get32s (instr_info *ins, bfd_vma *res)
12239
324k
{
12240
324k
  if (!get32 (ins, res))
12241
10.7k
    return false;
12242
12243
313k
  *res = (*res ^ ((bfd_vma) 1 << 31)) - ((bfd_vma) 1 << 31);
12244
12245
313k
  return true;
12246
324k
}
12247
12248
static bool
12249
get64 (instr_info *ins, uint64_t *res)
12250
61.8k
{
12251
61.8k
  unsigned int a;
12252
61.8k
  unsigned int b;
12253
12254
61.8k
  if (!fetch_code (ins->info, ins->codep + 8))
12255
1.47k
    return false;
12256
60.4k
  a = *ins->codep++;
12257
60.4k
  a |= (unsigned int) *ins->codep++ << 8;
12258
60.4k
  a |= (unsigned int) *ins->codep++ << 16;
12259
60.4k
  a |= (unsigned int) *ins->codep++ << 24;
12260
60.4k
  b = *ins->codep++;
12261
60.4k
  b |= (unsigned int) *ins->codep++ << 8;
12262
60.4k
  b |= (unsigned int) *ins->codep++ << 16;
12263
60.4k
  b |= (unsigned int) *ins->codep++ << 24;
12264
60.4k
  *res = a + ((uint64_t) b << 32);
12265
60.4k
  return true;
12266
61.8k
}
12267
12268
static void
12269
set_op (instr_info *ins, bfd_vma op, bool riprel)
12270
416k
{
12271
416k
  ins->op_index[ins->op_ad] = ins->op_ad;
12272
416k
  if (ins->address_mode == mode_64bit)
12273
354k
    ins->op_address[ins->op_ad] = op;
12274
62.1k
  else /* Mask to get a 32-bit address.  */
12275
62.1k
    ins->op_address[ins->op_ad] = op & 0xffffffff;
12276
416k
  ins->op_riprel[ins->op_ad] = riprel;
12277
416k
}
12278
12279
static bool
12280
BadOp (instr_info *ins)
12281
48.6k
{
12282
  /* Throw away prefixes and 1st. opcode byte.  */
12283
48.6k
  struct dis_private *priv = ins->info->private_data;
12284
12285
48.6k
  ins->codep = priv->the_buffer + ins->nr_prefixes + ins->need_vex + 1;
12286
48.6k
  ins->obufp = stpcpy (ins->obufp, "(bad)");
12287
48.6k
  return true;
12288
48.6k
}
12289
12290
static bool
12291
OP_Skip_MODRM (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
12292
         int sizeflag ATTRIBUTE_UNUSED)
12293
2.04k
{
12294
2.04k
  if (ins->modrm.mod != 3)
12295
782
    return BadOp (ins);
12296
12297
  /* Skip mod/rm byte.  */
12298
1.26k
  MODRM_CHECK;
12299
1.26k
  ins->codep++;
12300
1.26k
  ins->has_skipped_modrm = true;
12301
1.26k
  return true;
12302
1.26k
}
12303
12304
static bool
12305
OP_E_memory (instr_info *ins, int bytemode, int sizeflag)
12306
2.66M
{
12307
2.66M
  int add = (ins->rex & REX_B) ? 8 : 0;
12308
2.66M
  int riprel = 0;
12309
2.66M
  int shift;
12310
12311
2.66M
  add += (ins->rex2 & REX_B) ? 16 : 0;
12312
12313
  /* Handles EVEX other than APX EVEX-promoted instructions.  */
12314
2.66M
  if (ins->vex.evex && ins->evex_type == evex_default)
12315
56.2k
    {
12316
      /* Broadcast can only ever be valid for memory sources.  */
12317
56.2k
      if (ins->vex.b && ins->obufp == ins->op_out[0])
12318
1.26k
  ins->vex.no_broadcast = true;
12319
12320
      /* Zeroing-masking is invalid for memory destinations. Set the flag
12321
   uniformly, as the consumer will inspect it only for the destination
12322
   operand.  */
12323
56.2k
      if (ins->vex.zeroing)
12324
21.0k
  ins->illegal_masking = true;
12325
12326
56.2k
      switch (bytemode)
12327
56.2k
  {
12328
279
  case dw_mode:
12329
806
  case w_mode:
12330
1.17k
  case w_swap_mode:
12331
1.17k
    shift = 1;
12332
1.17k
    break;
12333
475
  case db_mode:
12334
819
  case b_mode:
12335
819
    shift = 0;
12336
819
    break;
12337
1.77k
  case dq_mode:
12338
1.77k
    if (ins->address_mode != mode_64bit)
12339
721
      {
12340
2.14k
  case d_mode:
12341
2.61k
  case d_swap_mode:
12342
2.61k
        shift = 2;
12343
2.61k
        break;
12344
2.14k
      }
12345
      /* fall through */
12346
3.57k
  case vex_vsib_d_w_dq_mode:
12347
7.08k
  case vex_vsib_q_w_dq_mode:
12348
7.63k
  case evex_x_gscat_mode:
12349
7.63k
    shift = ins->vex.w ? 3 : 2;
12350
7.63k
    break;
12351
4.67k
  case xh_mode:
12352
6.26k
  case evex_half_bcst_xmmqh_mode:
12353
7.99k
  case evex_half_bcst_xmmqdh_mode:
12354
7.99k
    if (ins->vex.b)
12355
4.09k
      {
12356
4.09k
        shift = ins->vex.w ? 2 : 1;
12357
4.09k
        break;
12358
4.09k
      }
12359
    /* Fall through.  */
12360
25.6k
  case x_mode:
12361
27.2k
  case evex_half_bcst_xmmq_mode:
12362
27.2k
    if (ins->vex.b)
12363
11.7k
      {
12364
11.7k
        shift = ins->vex.w ? 3 : 2;
12365
11.7k
        break;
12366
11.7k
      }
12367
    /* Fall through.  */
12368
16.9k
  case xmmqd_mode:
12369
17.9k
  case xmmdw_mode:
12370
18.6k
  case xmmq_mode:
12371
20.6k
  case ymmq_mode:
12372
21.1k
  case evex_x_nobcst_mode:
12373
21.7k
  case x_swap_mode:
12374
21.7k
    switch (ins->vex.length)
12375
21.7k
      {
12376
7.68k
      case 128:
12377
7.68k
        shift = 4;
12378
7.68k
        break;
12379
6.43k
      case 256:
12380
6.43k
        shift = 5;
12381
6.43k
        break;
12382
7.67k
      case 512:
12383
7.67k
        shift = 6;
12384
7.67k
        break;
12385
0
      default:
12386
0
        abort ();
12387
21.7k
      }
12388
    /* Make necessary corrections to shift for modes that need it.  */
12389
21.7k
    if (bytemode == xmmq_mode
12390
21.1k
        || bytemode == evex_half_bcst_xmmqh_mode
12391
20.3k
        || bytemode == evex_half_bcst_xmmq_mode
12392
19.9k
        || (bytemode == ymmq_mode && ins->vex.length == 128))
12393
3.13k
      shift -= 1;
12394
18.6k
    else if (bytemode == xmmqd_mode
12395
17.1k
             || bytemode == evex_half_bcst_xmmqdh_mode)
12396
2.32k
      shift -= 2;
12397
16.3k
    else if (bytemode == xmmdw_mode)
12398
967
      shift -= 3;
12399
21.7k
    break;
12400
793
  case ymm_mode:
12401
793
    shift = 5;
12402
793
    break;
12403
1.02k
  case xmm_mode:
12404
1.02k
    shift = 4;
12405
1.02k
    break;
12406
1.62k
  case q_mode:
12407
2.25k
  case q_swap_mode:
12408
2.25k
    shift = 3;
12409
2.25k
    break;
12410
2.31k
  case bw_unit_mode:
12411
2.31k
    shift = ins->vex.w ? 1 : 0;
12412
2.31k
    break;
12413
0
  default:
12414
0
    abort ();
12415
56.2k
  }
12416
56.2k
    }
12417
2.61M
  else
12418
2.61M
    shift = 0;
12419
12420
2.66M
  USED_REX (REX_B);
12421
2.66M
  if (ins->intel_syntax)
12422
434k
    intel_operand_size (ins, bytemode, sizeflag);
12423
2.66M
  append_seg (ins);
12424
12425
2.66M
  if ((sizeflag & AFLAG) || ins->address_mode == mode_64bit)
12426
2.51M
    {
12427
      /* 32/64 bit address mode */
12428
2.51M
      bfd_vma disp = 0;
12429
2.51M
      int havedisp;
12430
2.51M
      int havebase;
12431
2.51M
      int needindex;
12432
2.51M
      int needaddr32;
12433
2.51M
      int base, rbase;
12434
2.51M
      int vindex = 0;
12435
2.51M
      int scale = 0;
12436
2.51M
      int addr32flag = !((sizeflag & AFLAG)
12437
19.5k
       || bytemode == v_bnd_mode
12438
18.7k
       || bytemode == v_bndmk_mode
12439
17.9k
       || bytemode == bnd_mode
12440
17.1k
       || bytemode == bnd_swap_mode);
12441
2.51M
      bool check_gather = false;
12442
2.51M
      const char (*indexes)[8] = NULL;
12443
12444
2.51M
      havebase = 1;
12445
2.51M
      base = ins->modrm.rm;
12446
12447
2.51M
      if (base == 4)
12448
150k
  {
12449
150k
    vindex = ins->sib.index;
12450
150k
    USED_REX (REX_X);
12451
150k
    if (ins->rex & REX_X)
12452
6.32k
      vindex += 8;
12453
150k
    switch (bytemode)
12454
150k
      {
12455
3.04k
      case vex_vsib_d_w_dq_mode:
12456
6.64k
      case vex_vsib_q_w_dq_mode:
12457
6.64k
        if (!ins->need_vex)
12458
0
    abort ();
12459
6.64k
        if (ins->vex.evex)
12460
4.82k
    {
12461
      /* S/G EVEX insns require EVEX.X4 not to be set.  */
12462
4.82k
      if (ins->rex2 & REX_X)
12463
527
        {
12464
527
          oappend (ins, "(bad)");
12465
527
          return true;
12466
527
        }
12467
12468
4.29k
      if (!ins->vex.v)
12469
3.52k
        vindex += 16;
12470
4.29k
      check_gather = ins->obufp == ins->op_out[1];
12471
4.29k
    }
12472
12473
6.11k
        switch (ins->vex.length)
12474
6.11k
    {
12475
988
    case 128:
12476
988
      indexes = att_names_xmm;
12477
988
      break;
12478
2.52k
    case 256:
12479
2.52k
      if (!ins->vex.w
12480
1.56k
          || bytemode == vex_vsib_q_w_dq_mode)
12481
1.47k
        indexes = att_names_ymm;
12482
1.05k
      else
12483
1.05k
        indexes = att_names_xmm;
12484
2.52k
      break;
12485
2.59k
    case 512:
12486
2.59k
      if (!ins->vex.w
12487
1.46k
          || bytemode == vex_vsib_q_w_dq_mode)
12488
2.15k
        indexes = att_names_zmm;
12489
439
      else
12490
439
        indexes = att_names_ymm;
12491
2.59k
      break;
12492
0
    default:
12493
0
      abort ();
12494
6.11k
    }
12495
6.11k
        break;
12496
144k
      default:
12497
144k
        if (ins->rex2 & REX_X)
12498
3.70k
    vindex += 16;
12499
12500
144k
        if (vindex != 4)
12501
121k
    indexes = ins->address_mode == mode_64bit && !addr32flag
12502
121k
        ? att_names64 : att_names32;
12503
144k
        break;
12504
150k
      }
12505
150k
    scale = ins->sib.scale;
12506
150k
    base = ins->sib.base;
12507
150k
    ins->codep++;
12508
150k
  }
12509
2.36M
      else
12510
2.36M
  {
12511
    /* Check for mandatory SIB.  */
12512
2.36M
    if (bytemode == vex_vsib_d_w_dq_mode
12513
2.36M
        || bytemode == vex_vsib_q_w_dq_mode
12514
2.35M
        || bytemode == vex_sibmem_mode)
12515
1.90k
      {
12516
1.90k
        oappend (ins, "(bad)");
12517
1.90k
        return true;
12518
1.90k
      }
12519
2.36M
  }
12520
2.50M
      rbase = base + add;
12521
12522
2.50M
      switch (ins->modrm.mod)
12523
2.50M
  {
12524
1.98M
  case 0:
12525
1.98M
    if (base == 5)
12526
69.0k
      {
12527
69.0k
        havebase = 0;
12528
69.0k
        if (ins->address_mode == mode_64bit && !ins->has_sib)
12529
52.0k
    riprel = 1;
12530
69.0k
        if (!get32s (ins, &disp))
12531
4.04k
    return false;
12532
65.0k
        if (riprel && bytemode == v_bndmk_mode)
12533
535
    {
12534
535
      oappend (ins, "(bad)");
12535
535
      return true;
12536
535
    }
12537
65.0k
      }
12538
1.98M
    break;
12539
1.98M
  case 1:
12540
335k
    if (!get8s (ins, &disp))
12541
6.04k
      return false;
12542
329k
    if (ins->vex.evex && shift > 0)
12543
20.5k
      disp <<= shift;
12544
329k
    break;
12545
185k
  case 2:
12546
185k
    if (!get32s (ins, &disp))
12547
4.55k
      return false;
12548
180k
    break;
12549
2.50M
  }
12550
12551
2.49M
      needindex = 0;
12552
2.49M
      needaddr32 = 0;
12553
2.49M
      if (ins->has_sib
12554
148k
    && !havebase
12555
9.91k
    && !indexes
12556
3.91k
    && ins->address_mode != mode_16bit)
12557
3.22k
  {
12558
3.22k
    if (ins->address_mode == mode_64bit)
12559
2.61k
      {
12560
2.61k
        if (addr32flag)
12561
876
    {
12562
      /* Without base nor index registers, zero-extend the
12563
         lower 32-bit displacement to 64 bits.  */
12564
876
      disp &= 0xffffffff;
12565
876
      needindex = 1;
12566
876
    }
12567
2.61k
        needaddr32 = 1;
12568
2.61k
      }
12569
618
    else
12570
618
      {
12571
        /* In 32-bit mode, we need index register to tell [offset]
12572
     from [eiz*1 + offset].  */
12573
618
        needindex = 1;
12574
618
      }
12575
3.22k
  }
12576
12577
2.49M
      havedisp = (havebase
12578
64.4k
      || needindex
12579
62.9k
      || (ins->has_sib && (indexes || scale != 0)));
12580
12581
2.49M
      if (!ins->intel_syntax)
12582
2.10M
  if (ins->modrm.mod != 0 || base == 5)
12583
448k
    {
12584
448k
      if (havedisp || riprel)
12585
444k
        print_displacement (ins, disp);
12586
4.54k
      else
12587
4.54k
        print_operand_value (ins, disp, dis_style_address_offset);
12588
448k
      if (riprel)
12589
41.4k
        {
12590
41.4k
    set_op (ins, disp, true);
12591
41.4k
    oappend_char (ins, '(');
12592
41.4k
    oappend_with_style (ins, !addr32flag ? "%rip" : "%eip",
12593
41.4k
            dis_style_register);
12594
41.4k
    oappend_char (ins, ')');
12595
41.4k
        }
12596
448k
    }
12597
12598
2.49M
      if ((havebase || indexes || needindex || needaddr32 || riprel)
12599
2.48M
    && (ins->address_mode != mode_64bit
12600
2.23M
        || ((bytemode != v_bnd_mode)
12601
2.23M
      && (bytemode != v_bndmk_mode)
12602
2.22M
      && (bytemode != bnd_mode)
12603
2.22M
      && (bytemode != bnd_swap_mode))))
12604
2.48M
  ins->used_prefixes |= PREFIX_ADDR;
12605
12606
2.49M
      if (havedisp || (ins->intel_syntax && riprel))
12607
2.44M
  {
12608
2.44M
    oappend_char (ins, ins->open_char);
12609
2.44M
    if (ins->intel_syntax && riprel)
12610
7.02k
      {
12611
7.02k
        set_op (ins, disp, true);
12612
7.02k
        oappend_with_style (ins, !addr32flag ? "rip" : "eip",
12613
7.02k
          dis_style_register);
12614
7.02k
      }
12615
2.44M
    if (havebase)
12616
2.43M
      oappend_register
12617
2.43M
        (ins,
12618
2.43M
         (ins->address_mode == mode_64bit && !addr32flag
12619
2.43M
    ? att_names64 : att_names32)[rbase]);
12620
2.44M
    if (ins->has_sib)
12621
146k
      {
12622
        /* ESP/RSP won't allow index.  If base isn't ESP/RSP,
12623
     print index to tell base + index from base.  */
12624
146k
        if (scale != 0
12625
79.3k
      || needindex
12626
78.6k
      || indexes
12627
7.98k
      || (havebase && base != ESP_REG_NUM))
12628
142k
    {
12629
142k
      if (!ins->intel_syntax || havebase)
12630
139k
        oappend_char (ins, ins->separator_char);
12631
142k
      if (indexes)
12632
125k
        {
12633
125k
          if (ins->address_mode == mode_64bit || vindex < 16)
12634
125k
      oappend_register (ins, indexes[vindex]);
12635
377
          else
12636
377
      oappend (ins, "(bad)");
12637
125k
        }
12638
16.5k
      else
12639
16.5k
        oappend_register (ins,
12640
16.5k
              ins->address_mode == mode_64bit
12641
12.2k
              && !addr32flag
12642
16.5k
              ? att_index64
12643
16.5k
              : att_index32);
12644
12645
142k
      oappend_char (ins, ins->scale_char);
12646
142k
      oappend_char_with_style (ins, '0' + (1 << scale),
12647
142k
             dis_style_immediate);
12648
142k
    }
12649
146k
      }
12650
2.44M
    if (ins->intel_syntax
12651
386k
        && (disp || ins->modrm.mod != 0 || base == 5))
12652
122k
      {
12653
122k
        if (!havedisp || (bfd_signed_vma) disp >= 0)
12654
87.2k
      oappend_char (ins, '+');
12655
122k
        if (havedisp)
12656
115k
    print_displacement (ins, disp);
12657
7.02k
        else
12658
7.02k
    print_operand_value (ins, disp, dis_style_address_offset);
12659
122k
      }
12660
12661
2.44M
    oappend_char (ins, ins->close_char);
12662
12663
2.44M
    if (check_gather)
12664
2.90k
      {
12665
        /* Both XMM/YMM/ZMM registers must be distinct.  */
12666
2.90k
        int modrm_reg = ins->modrm.reg;
12667
12668
2.90k
        if (ins->rex & REX_R)
12669
1.42k
          modrm_reg += 8;
12670
2.90k
        if (ins->rex2 & REX_R)
12671
1.85k
          modrm_reg += 16;
12672
2.90k
        if (vindex == modrm_reg)
12673
842
    oappend (ins, "/(bad)");
12674
2.90k
      }
12675
2.44M
  }
12676
49.2k
      else if (ins->intel_syntax)
12677
3.31k
  {
12678
3.31k
    if (ins->modrm.mod != 0 || base == 5)
12679
3.31k
      {
12680
3.31k
        if (!ins->active_seg_prefix)
12681
2.57k
    {
12682
2.57k
      oappend_register (ins, att_names_seg[ds_reg - es_reg]);
12683
2.57k
      oappend (ins, ":");
12684
2.57k
    }
12685
3.31k
        print_operand_value (ins, disp, dis_style_text);
12686
3.31k
      }
12687
3.31k
  }
12688
2.49M
    }
12689
155k
  else if (bytemode == v_bnd_mode
12690
154k
     || bytemode == v_bndmk_mode
12691
153k
     || bytemode == bnd_mode
12692
152k
     || bytemode == bnd_swap_mode
12693
151k
     || bytemode == vex_vsib_d_w_dq_mode
12694
151k
     || bytemode == vex_vsib_q_w_dq_mode)
12695
5.97k
    {
12696
5.97k
      oappend (ins, "(bad)");
12697
5.97k
      return true;
12698
5.97k
    }
12699
149k
  else
12700
149k
    {
12701
      /* 16 bit address mode */
12702
149k
      bfd_vma disp = 0;
12703
12704
149k
      ins->used_prefixes |= ins->prefixes & PREFIX_ADDR;
12705
149k
      switch (ins->modrm.mod)
12706
149k
  {
12707
102k
  case 0:
12708
102k
    if (ins->modrm.rm == 6)
12709
6.81k
      {
12710
22.7k
  case 2:
12711
22.7k
        if (!get16s (ins, &disp))
12712
631
    return false;
12713
22.7k
      }
12714
117k
    break;
12715
117k
  case 1:
12716
30.8k
    if (!get8s (ins, &disp))
12717
740
      return false;
12718
30.0k
    if (ins->vex.evex && shift > 0)
12719
980
      disp <<= shift;
12720
30.0k
    break;
12721
149k
  }
12722
12723
147k
      if (!ins->intel_syntax)
12724
118k
  if (ins->modrm.mod != 0 || ins->modrm.rm == 6)
12725
38.0k
    print_displacement (ins, disp);
12726
12727
147k
      if (ins->modrm.mod != 0 || ins->modrm.rm != 6)
12728
140k
  {
12729
140k
    oappend_char (ins, ins->open_char);
12730
140k
    oappend (ins, ins->intel_syntax ? intel_index16[ins->modrm.rm]
12731
140k
            : att_index16[ins->modrm.rm]);
12732
140k
    if (ins->intel_syntax
12733
27.7k
        && (disp || ins->modrm.mod != 0 || ins->modrm.rm == 6))
12734
12.3k
      {
12735
12.3k
        if ((bfd_signed_vma) disp >= 0)
12736
6.81k
    oappend_char (ins, '+');
12737
12.3k
        print_displacement (ins, disp);
12738
12.3k
      }
12739
12740
140k
    oappend_char (ins, ins->close_char);
12741
140k
  }
12742
6.71k
      else if (ins->intel_syntax)
12743
1.76k
  {
12744
1.76k
    if (!ins->active_seg_prefix)
12745
849
      {
12746
849
        oappend_register (ins, att_names_seg[ds_reg - es_reg]);
12747
849
        oappend (ins, ":");
12748
849
      }
12749
1.76k
    print_operand_value (ins, disp & 0xffff, dis_style_text);
12750
1.76k
  }
12751
147k
    }
12752
2.64M
  if (ins->vex.b && ins->evex_type == evex_default)
12753
23.2k
    {
12754
23.2k
      ins->evex_used |= EVEX_b_used;
12755
12756
23.2k
      if (!ins->vex.no_broadcast
12757
19.3k
    && (!ins->intel_syntax || !(ins->evex_used & EVEX_len_used)))
12758
15.8k
  {
12759
15.8k
    if (bytemode == xh_mode)
12760
1.58k
      {
12761
1.58k
        switch (ins->vex.length)
12762
1.58k
    {
12763
506
    case 128:
12764
506
      oappend (ins, "{1to8}");
12765
506
      break;
12766
705
    case 256:
12767
705
      oappend (ins, "{1to16}");
12768
705
      break;
12769
377
    case 512:
12770
377
      oappend (ins, "{1to32}");
12771
377
      break;
12772
0
    default:
12773
0
      abort ();
12774
1.58k
    }
12775
1.58k
      }
12776
14.3k
    else if (bytemode == q_mode
12777
13.6k
       || bytemode == ymmq_mode)
12778
1.25k
      ins->vex.no_broadcast = true;
12779
13.0k
    else if ((bytemode == x_mode && ins->vex.w)
12780
6.70k
       || bytemode == evex_half_bcst_xmmqdh_mode
12781
6.12k
       || bytemode == evex_half_bcst_xmmq_mode)
12782
7.49k
      {
12783
7.49k
        switch (ins->vex.length)
12784
7.49k
    {
12785
2.41k
    case 128:
12786
2.41k
      oappend (ins, "{1to2}");
12787
2.41k
      break;
12788
1.93k
    case 256:
12789
1.93k
      oappend (ins, "{1to4}");
12790
1.93k
      break;
12791
3.13k
    case 512:
12792
3.13k
      oappend (ins, "{1to8}");
12793
3.13k
      break;
12794
0
    default:
12795
0
      abort ();
12796
7.49k
    }
12797
7.49k
      }
12798
5.55k
    else if (bytemode == x_mode
12799
3.40k
       || bytemode == evex_half_bcst_xmmqh_mode)
12800
2.56k
      {
12801
2.56k
        switch (ins->vex.length)
12802
2.56k
    {
12803
783
    case 128:
12804
783
      oappend (ins, "{1to4}");
12805
783
      break;
12806
815
    case 256:
12807
815
      oappend (ins, "{1to8}");
12808
815
      break;
12809
965
    case 512:
12810
965
      oappend (ins, "{1to16}");
12811
965
      break;
12812
0
    default:
12813
0
      abort ();
12814
2.56k
    }
12815
2.56k
      }
12816
2.99k
    else
12817
2.99k
      ins->vex.no_broadcast = true;
12818
15.8k
  }
12819
23.2k
      if (ins->vex.no_broadcast)
12820
8.10k
  oappend (ins, "{bad}");
12821
23.2k
    }
12822
12823
2.64M
  return true;
12824
2.64M
}
12825
12826
static bool
12827
OP_E (instr_info *ins, int bytemode, int sizeflag)
12828
2.89M
{
12829
  /* Skip mod/rm byte.  */
12830
2.89M
  MODRM_CHECK;
12831
2.89M
  if (!ins->has_skipped_modrm)
12832
2.89M
    {
12833
2.89M
      ins->codep++;
12834
2.89M
      ins->has_skipped_modrm = true;
12835
2.89M
    }
12836
12837
2.89M
  if (ins->modrm.mod == 3)
12838
350k
    {
12839
350k
      if ((sizeflag & SUFFIX_ALWAYS)
12840
5.78k
    && (bytemode == b_swap_mode
12841
5.55k
        || bytemode == bnd_swap_mode
12842
5.36k
        || bytemode == v_swap_mode))
12843
1.00k
  swap_operand (ins);
12844
12845
350k
      print_register (ins, ins->modrm.rm, REX_B, bytemode, sizeflag);
12846
350k
      return true;
12847
350k
    }
12848
12849
  /* Masking is invalid for insns with GPR-like memory destination. Set the
12850
     flag uniformly, as the consumer will inspect it only for the destination
12851
     operand.  */
12852
2.54M
  if (ins->vex.mask_register_specifier)
12853
8.09k
    ins->illegal_masking = true;
12854
12855
2.54M
  return OP_E_memory (ins, bytemode, sizeflag);
12856
2.89M
}
12857
12858
static bool
12859
OP_indirE (instr_info *ins, int bytemode, int sizeflag)
12860
60.9k
{
12861
60.9k
  if (ins->modrm.mod == 3 && bytemode == f_mode)
12862
    /* bad lcall/ljmp */
12863
5.84k
    return BadOp (ins);
12864
55.1k
  if (!ins->intel_syntax)
12865
38.1k
    oappend (ins, "*");
12866
55.1k
  return OP_E (ins, bytemode, sizeflag);
12867
60.9k
}
12868
12869
static bool
12870
OP_G (instr_info *ins, int bytemode, int sizeflag)
12871
2.54M
{
12872
2.54M
  print_register (ins, ins->modrm.reg, REX_R, bytemode, sizeflag);
12873
2.54M
  return true;
12874
2.54M
}
12875
12876
static bool
12877
OP_REG (instr_info *ins, int code, int sizeflag)
12878
599k
{
12879
599k
  const char *s;
12880
599k
  int add = 0;
12881
12882
599k
  switch (code)
12883
599k
    {
12884
15.4k
    case es_reg: case ss_reg: case cs_reg:
12885
21.1k
    case ds_reg: case fs_reg: case gs_reg:
12886
21.1k
      oappend_register (ins, att_names_seg[code - es_reg]);
12887
21.1k
      return true;
12888
599k
    }
12889
12890
578k
  USED_REX (REX_B);
12891
578k
  if (ins->rex & REX_B)
12892
17.3k
    add = 8;
12893
578k
  if (ins->rex2 & REX_B)
12894
1.36k
    add += 16;
12895
12896
578k
  switch (code)
12897
578k
    {
12898
0
    case ax_reg: case cx_reg: case dx_reg: case bx_reg:
12899
0
    case sp_reg: case bp_reg: case si_reg: case di_reg:
12900
0
      s = att_names16[code - ax_reg + add];
12901
0
      break;
12902
35.0k
    case ah_reg: case ch_reg: case dh_reg: case bh_reg:
12903
35.0k
      USED_REX (0);
12904
      /* Fall through.  */
12905
66.7k
    case al_reg: case cl_reg: case dl_reg: case bl_reg:
12906
66.7k
      if (ins->rex)
12907
2.15k
  s = att_names8rex[code - al_reg + add];
12908
64.5k
      else
12909
64.5k
  s = att_names8[code - al_reg];
12910
66.7k
      break;
12911
130k
    case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
12912
246k
    case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
12913
246k
      if (ins->address_mode == mode_64bit
12914
205k
    && ((sizeflag & DFLAG) || (ins->rex & REX_W)))
12915
203k
  {
12916
203k
    s = att_names64[code - rAX_reg + add];
12917
203k
    break;
12918
203k
  }
12919
42.5k
      code += eAX_reg - rAX_reg;
12920
      /* Fall through.  */
12921
209k
    case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
12922
308k
    case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
12923
308k
      USED_REX (REX_W);
12924
308k
      if (ins->rex & REX_W)
12925
4.54k
  s = att_names64[code - eAX_reg + add];
12926
303k
      else
12927
303k
  {
12928
303k
    if (sizeflag & DFLAG)
12929
257k
      s = att_names32[code - eAX_reg + add];
12930
46.4k
    else
12931
46.4k
      s = att_names16[code - eAX_reg + add];
12932
303k
    ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12933
303k
  }
12934
308k
      break;
12935
0
    default:
12936
0
      oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
12937
0
      return true;
12938
578k
    }
12939
578k
  oappend_register (ins, s);
12940
578k
  return true;
12941
578k
}
12942
12943
static bool
12944
OP_IMREG (instr_info *ins, int code, int sizeflag)
12945
846k
{
12946
846k
  const char *s;
12947
12948
846k
  switch (code)
12949
846k
    {
12950
177k
    case indir_dx_reg:
12951
177k
      if (!ins->intel_syntax)
12952
131k
  {
12953
131k
    oappend (ins, "(%dx)");
12954
131k
    return true;
12955
131k
  }
12956
45.8k
      s = att_names16[dx_reg - ax_reg];
12957
45.8k
      break;
12958
320k
    case al_reg: case cl_reg:
12959
320k
      s = att_names8[code - al_reg];
12960
320k
      break;
12961
300k
    case eAX_reg:
12962
300k
      USED_REX (REX_W);
12963
300k
      if (ins->rex & REX_W)
12964
6.02k
  {
12965
6.02k
    s = *att_names64;
12966
6.02k
    break;
12967
6.02k
  }
12968
      /* Fall through.  */
12969
342k
    case z_mode_ax_reg:
12970
342k
      if ((ins->rex & REX_W) || (sizeflag & DFLAG))
12971
319k
  s = *att_names32;
12972
22.8k
      else
12973
22.8k
  s = *att_names16;
12974
342k
      if (!(ins->rex & REX_W))
12975
341k
  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12976
342k
      break;
12977
0
    default:
12978
0
      oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
12979
0
      return true;
12980
846k
    }
12981
715k
  oappend_register (ins, s);
12982
715k
  return true;
12983
846k
}
12984
12985
static bool
12986
OP_I (instr_info *ins, int bytemode, int sizeflag)
12987
656k
{
12988
656k
  bfd_vma op;
12989
12990
656k
  switch (bytemode)
12991
656k
    {
12992
406k
    case b_mode:
12993
406k
      if (!fetch_code (ins->info, ins->codep + 1))
12994
5.29k
  return false;
12995
401k
      op = *ins->codep++;
12996
401k
      break;
12997
205k
    case v_mode:
12998
205k
      USED_REX (REX_W);
12999
205k
      if (ins->rex & REX_W)
13000
4.73k
  {
13001
4.73k
    if (!get32s (ins, &op))
13002
1.02k
      return false;
13003
4.73k
  }
13004
201k
      else
13005
201k
  {
13006
201k
    ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13007
201k
    if (sizeflag & DFLAG)
13008
186k
      {
13009
187k
    case d_mode:
13010
187k
        if (!get32 (ins, &op))
13011
4.26k
    return false;
13012
187k
      }
13013
15.1k
    else
13014
15.1k
      {
13015
        /* Fall through.  */
13016
43.7k
    case w_mode:
13017
43.7k
        if (!get16 (ins, &op))
13018
1.08k
    return false;
13019
43.7k
      }
13020
201k
  }
13021
229k
      break;
13022
229k
    case const_1_mode:
13023
13.9k
      if (ins->intel_syntax)
13024
2.31k
  oappend_with_style (ins, "1", dis_style_immediate);
13025
11.6k
      else
13026
11.6k
  oappend_with_style (ins, "$1", dis_style_immediate);
13027
13.9k
      return true;
13028
0
    default:
13029
0
      oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
13030
0
      return true;
13031
656k
    }
13032
13033
631k
  oappend_immediate (ins, op);
13034
631k
  return true;
13035
656k
}
13036
13037
static bool
13038
OP_I64 (instr_info *ins, int bytemode, int sizeflag)
13039
67.8k
{
13040
67.8k
  uint64_t op;
13041
13042
67.8k
  if (bytemode != v_mode || ins->address_mode != mode_64bit
13043
57.6k
      || !(ins->rex & REX_W))
13044
65.3k
    return OP_I (ins, bytemode, sizeflag);
13045
13046
2.42k
  USED_REX (REX_W);
13047
13048
2.42k
  if (!get64 (ins, &op))
13049
174
    return false;
13050
13051
2.25k
  oappend_immediate (ins, op);
13052
2.25k
  return true;
13053
2.42k
}
13054
13055
static bool
13056
OP_sI (instr_info *ins, int bytemode, int sizeflag)
13057
70.4k
{
13058
70.4k
  bfd_vma op;
13059
13060
70.4k
  switch (bytemode)
13061
70.4k
    {
13062
24.0k
    case b_mode:
13063
36.2k
    case b_T_mode:
13064
36.2k
      if (!get8s (ins, &op))
13065
1.25k
  return false;
13066
35.0k
      if (bytemode == b_T_mode)
13067
12.0k
  {
13068
12.0k
    if (ins->address_mode != mode_64bit
13069
8.80k
        || !((sizeflag & DFLAG) || (ins->rex & REX_W)))
13070
4.08k
      {
13071
        /* The operand-size prefix is overridden by a REX prefix.  */
13072
4.08k
        if ((sizeflag & DFLAG) || (ins->rex & REX_W))
13073
1.82k
    op &= 0xffffffff;
13074
2.25k
        else
13075
2.25k
    op &= 0xffff;
13076
4.08k
    }
13077
12.0k
  }
13078
22.9k
      else
13079
22.9k
  {
13080
22.9k
    if (!(ins->rex & REX_W))
13081
16.4k
      {
13082
16.4k
        if (sizeflag & DFLAG)
13083
14.5k
    op &= 0xffffffff;
13084
1.89k
        else
13085
1.89k
    op &= 0xffff;
13086
16.4k
      }
13087
22.9k
  }
13088
35.0k
      break;
13089
34.1k
    case v_mode:
13090
      /* The operand-size prefix is overridden by a REX prefix.  */
13091
34.1k
      if (!(sizeflag & DFLAG) && !(ins->rex & REX_W))
13092
2.04k
  {
13093
2.04k
    if (!get16 (ins, &op))
13094
122
      return false;
13095
2.04k
  }
13096
32.0k
      else if (!get32s (ins, &op))
13097
450
  return false;
13098
33.5k
      break;
13099
33.5k
    default:
13100
0
      oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
13101
0
      return true;
13102
70.4k
    }
13103
13104
68.5k
  oappend_immediate (ins, op);
13105
68.5k
  return true;
13106
70.4k
}
13107
13108
static bool
13109
OP_J (instr_info *ins, int bytemode, int sizeflag)
13110
370k
{
13111
370k
  bfd_vma disp;
13112
370k
  bfd_vma mask = -1;
13113
370k
  bfd_vma segment = 0;
13114
13115
370k
  switch (bytemode)
13116
370k
    {
13117
334k
    case b_mode:
13118
334k
      if (!get8s (ins, &disp))
13119
1.53k
  return false;
13120
332k
      break;
13121
332k
    case v_mode:
13122
36.1k
    case dqw_mode:
13123
36.1k
      if ((sizeflag & DFLAG)
13124
3.40k
    || (ins->address_mode == mode_64bit
13125
1.97k
        && ((ins->isa64 == intel64 && bytemode != dqw_mode)
13126
1.78k
      || (ins->rex & REX_W))))
13127
33.6k
  {
13128
33.6k
    if (!get32s (ins, &disp))
13129
656
      return false;
13130
33.6k
  }
13131
2.55k
      else
13132
2.55k
  {
13133
2.55k
    if (!get16s (ins, &disp))
13134
375
      return false;
13135
    /* In 16bit mode, address is wrapped around at 64k within
13136
       the same segment.  Otherwise, a data16 prefix on a jump
13137
       instruction means that the pc is masked to 16 bits after
13138
       the displacement is added!  */
13139
2.18k
    mask = 0xffff;
13140
2.18k
    if ((ins->prefixes & PREFIX_DATA) == 0)
13141
1.81k
      segment = ((ins->start_pc + (ins->codep - ins->start_codep))
13142
1.81k
           & ~((bfd_vma) 0xffff));
13143
2.18k
  }
13144
35.1k
      if (ins->address_mode != mode_64bit
13145
28.4k
    || (ins->isa64 != intel64 && !(ins->rex & REX_W)))
13146
33.6k
  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13147
35.1k
      break;
13148
0
    default:
13149
0
      oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
13150
0
      return true;
13151
370k
    }
13152
367k
  disp = ((ins->start_pc + (ins->codep - ins->start_codep) + disp) & mask)
13153
367k
   | segment;
13154
367k
  set_op (ins, disp, false);
13155
367k
  print_operand_value (ins, disp, dis_style_text);
13156
367k
  return true;
13157
370k
}
13158
13159
static bool
13160
OP_SEG (instr_info *ins, int bytemode, int sizeflag)
13161
38.9k
{
13162
38.9k
  if (bytemode == w_mode)
13163
14.0k
    {
13164
14.0k
      oappend_register (ins, att_names_seg[ins->modrm.reg]);
13165
14.0k
      return true;
13166
14.0k
    }
13167
24.9k
  return OP_E (ins, ins->modrm.mod == 3 ? bytemode : w_mode, sizeflag);
13168
38.9k
}
13169
13170
static bool
13171
OP_DIR (instr_info *ins, int dummy ATTRIBUTE_UNUSED, int sizeflag)
13172
4.85k
{
13173
4.85k
  bfd_vma seg, offset;
13174
4.85k
  int res;
13175
4.85k
  char scratch[24];
13176
13177
4.85k
  if (sizeflag & DFLAG)
13178
2.68k
    {
13179
2.68k
      if (!get32 (ins, &offset))
13180
2.43k
  return false;;
13181
2.43k
    }
13182
2.17k
  else if (!get16 (ins, &offset))
13183
151
    return false;
13184
4.45k
  if (!get16 (ins, &seg))
13185
4.10k
    return false;;
13186
4.10k
  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13187
13188
4.10k
  res = snprintf (scratch, ARRAY_SIZE (scratch),
13189
4.10k
      ins->intel_syntax ? "0x%x:0x%x" : "$0x%x,$0x%x",
13190
4.10k
      (unsigned) seg, (unsigned) offset);
13191
4.10k
  if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
13192
0
    abort ();
13193
4.10k
  oappend (ins, scratch);
13194
4.10k
  return true;
13195
4.10k
}
13196
13197
static bool
13198
OP_OFF (instr_info *ins, int bytemode, int sizeflag)
13199
12.4k
{
13200
12.4k
  bfd_vma off;
13201
13202
12.4k
  if (ins->intel_syntax && (sizeflag & SUFFIX_ALWAYS))
13203
642
    intel_operand_size (ins, bytemode, sizeflag);
13204
12.4k
  append_seg (ins);
13205
13206
12.4k
  if ((sizeflag & AFLAG) || ins->address_mode == mode_64bit)
13207
7.81k
    {
13208
7.81k
      if (!get32 (ins, &off))
13209
714
  return false;
13210
7.81k
    }
13211
4.65k
  else
13212
4.65k
    {
13213
4.65k
      if (!get16 (ins, &off))
13214
362
  return false;
13215
4.65k
    }
13216
13217
11.3k
  if (ins->intel_syntax)
13218
5.72k
    {
13219
5.72k
      if (!ins->active_seg_prefix)
13220
5.13k
  {
13221
5.13k
    oappend_register (ins, att_names_seg[ds_reg - es_reg]);
13222
5.13k
    oappend (ins, ":");
13223
5.13k
  }
13224
5.72k
    }
13225
11.3k
  print_operand_value (ins, off, dis_style_address_offset);
13226
11.3k
  return true;
13227
12.4k
}
13228
13229
static bool
13230
OP_OFF64 (instr_info *ins, int bytemode, int sizeflag)
13231
71.4k
{
13232
71.4k
  uint64_t off;
13233
13234
71.4k
  if (ins->address_mode != mode_64bit
13235
60.4k
      || (ins->prefixes & PREFIX_ADDR))
13236
12.4k
    return OP_OFF (ins, bytemode, sizeflag);
13237
13238
58.9k
  if (ins->intel_syntax && (sizeflag & SUFFIX_ALWAYS))
13239
432
    intel_operand_size (ins, bytemode, sizeflag);
13240
58.9k
  append_seg (ins);
13241
13242
58.9k
  if (!get64 (ins, &off))
13243
1.23k
    return false;
13244
13245
57.7k
  if (ins->intel_syntax)
13246
7.06k
    {
13247
7.06k
      if (!ins->active_seg_prefix)
13248
6.64k
  {
13249
6.64k
    oappend_register (ins, att_names_seg[ds_reg - es_reg]);
13250
6.64k
    oappend (ins, ":");
13251
6.64k
  }
13252
7.06k
    }
13253
57.7k
  print_operand_value (ins, off, dis_style_address_offset);
13254
57.7k
  return true;
13255
58.9k
}
13256
13257
static void
13258
ptr_reg (instr_info *ins, int code, int sizeflag)
13259
375k
{
13260
375k
  const char *s;
13261
13262
375k
  *ins->obufp++ = ins->open_char;
13263
375k
  ins->used_prefixes |= (ins->prefixes & PREFIX_ADDR);
13264
375k
  if (ins->address_mode == mode_64bit)
13265
323k
    {
13266
323k
      if (!(sizeflag & AFLAG))
13267
4.94k
  s = att_names32[code - eAX_reg];
13268
318k
      else
13269
318k
  s = att_names64[code - eAX_reg];
13270
323k
    }
13271
51.8k
  else if (sizeflag & AFLAG)
13272
30.9k
    s = att_names32[code - eAX_reg];
13273
20.8k
  else
13274
20.8k
    s = att_names16[code - eAX_reg];
13275
375k
  oappend_register (ins, s);
13276
375k
  oappend_char (ins, ins->close_char);
13277
375k
}
13278
13279
static bool
13280
OP_ESreg (instr_info *ins, int code, int sizeflag)
13281
197k
{
13282
197k
  if (ins->intel_syntax)
13283
72.4k
    {
13284
72.4k
      switch (ins->codep[-1])
13285
72.4k
  {
13286
9.05k
  case 0x6d:  /* insw/insl */
13287
9.05k
    intel_operand_size (ins, z_mode, sizeflag);
13288
9.05k
    break;
13289
2.98k
  case 0xa5:  /* movsw/movsl/movsq */
13290
6.13k
  case 0xa7:  /* cmpsw/cmpsl/cmpsq */
13291
7.70k
  case 0xab:  /* stosw/stosl */
13292
14.8k
  case 0xaf:  /* scasw/scasl */
13293
14.8k
    intel_operand_size (ins, v_mode, sizeflag);
13294
14.8k
    break;
13295
48.4k
  default:
13296
48.4k
    intel_operand_size (ins, b_mode, sizeflag);
13297
72.4k
  }
13298
72.4k
    }
13299
197k
  if (ins->address_mode != mode_64bit)
13300
24.8k
    {
13301
24.8k
      oappend_register (ins, att_names_seg[0]);
13302
24.8k
      oappend_char (ins, ':');
13303
24.8k
    }
13304
197k
  ptr_reg (ins, code, sizeflag);
13305
197k
  return true;
13306
197k
}
13307
13308
static bool
13309
OP_DSreg (instr_info *ins, int code, int sizeflag)
13310
177k
{
13311
177k
  if (ins->intel_syntax)
13312
55.7k
    {
13313
55.7k
      switch (ins->codep[-1])
13314
55.7k
  {
13315
282
  case 0x01:  /* rmpupdate/rmpread */
13316
282
    break;
13317
7.66k
  case 0x6f:  /* outsw/outsl */
13318
7.66k
    intel_operand_size (ins, z_mode, sizeflag);
13319
7.66k
    break;
13320
2.98k
  case 0xa5:  /* movsw/movsl/movsq */
13321
6.13k
  case 0xa7:  /* cmpsw/cmpsl/cmpsq */
13322
9.51k
  case 0xad:  /* lodsw/lodsl/lodsq */
13323
9.51k
    intel_operand_size (ins, v_mode, sizeflag);
13324
9.51k
    break;
13325
38.2k
  default:
13326
38.2k
    intel_operand_size (ins, b_mode, sizeflag);
13327
55.7k
  }
13328
55.7k
    }
13329
  /* Outside of 64-bit mode set ins->active_seg_prefix to PREFIX_DS if it
13330
     is unset, so that the default segment register DS is printed.  */
13331
177k
  if (ins->address_mode != mode_64bit && !ins->active_seg_prefix)
13332
25.2k
    ins->active_seg_prefix = PREFIX_DS;
13333
177k
  append_seg (ins);
13334
177k
  ptr_reg (ins, code, sizeflag);
13335
177k
  return true;
13336
177k
}
13337
13338
static bool
13339
OP_C (instr_info *ins, int dummy ATTRIBUTE_UNUSED,
13340
      int sizeflag ATTRIBUTE_UNUSED)
13341
3.99k
{
13342
3.99k
  int add, res;
13343
3.99k
  char scratch[8];
13344
13345
3.99k
  if (ins->rex & REX_R)
13346
1.00k
    {
13347
1.00k
      USED_REX (REX_R);
13348
1.00k
      add = 8;
13349
1.00k
    }
13350
2.99k
  else if (/* Only %cr0 -> %cr8 is dealt with this way (and also really only on
13351
        most AMD hardware).  */
13352
2.99k
     ins->modrm.reg == 0
13353
1.19k
     && (ins->prefixes & PREFIX_LOCK)
13354
526
     && ins->isa64 != intel64)
13355
336
    {
13356
336
      ins->all_prefixes[ins->last_lock_prefix] = 0;
13357
336
      ins->used_prefixes |= PREFIX_LOCK;
13358
336
      add = 8;
13359
336
    }
13360
2.65k
  else
13361
2.65k
    add = 0;
13362
3.99k
  res = snprintf (scratch, ARRAY_SIZE (scratch), "%%cr%d",
13363
3.99k
      ins->modrm.reg + add);
13364
3.99k
  if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
13365
0
    abort ();
13366
3.99k
  oappend_register (ins, scratch);
13367
3.99k
  return true;
13368
3.99k
}
13369
13370
static bool
13371
OP_D (instr_info *ins, int dummy ATTRIBUTE_UNUSED,
13372
      int sizeflag ATTRIBUTE_UNUSED)
13373
1.66k
{
13374
1.66k
  int add, res;
13375
1.66k
  char scratch[8];
13376
13377
1.66k
  USED_REX (REX_R);
13378
1.66k
  if (ins->rex & REX_R)
13379
528
    add = 8;
13380
1.13k
  else
13381
1.13k
    add = 0;
13382
1.66k
  res = snprintf (scratch, ARRAY_SIZE (scratch),
13383
1.66k
      ins->intel_syntax ? "dr%d" : "%%db%d",
13384
1.66k
      ins->modrm.reg + add);
13385
1.66k
  if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
13386
0
    abort ();
13387
1.66k
  oappend (ins, scratch);
13388
1.66k
  return true;
13389
1.66k
}
13390
13391
static bool
13392
OP_T (instr_info *ins, int dummy ATTRIBUTE_UNUSED,
13393
      int sizeflag ATTRIBUTE_UNUSED)
13394
1.09k
{
13395
1.09k
  int res;
13396
1.09k
  char scratch[8];
13397
13398
1.09k
  res = snprintf (scratch, ARRAY_SIZE (scratch), "%%tr%d", ins->modrm.reg);
13399
1.09k
  if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
13400
0
    abort ();
13401
1.09k
  oappend_register (ins, scratch);
13402
1.09k
  return true;
13403
1.09k
}
13404
13405
static bool
13406
OP_MMX (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13407
  int sizeflag ATTRIBUTE_UNUSED)
13408
43.3k
{
13409
43.3k
  int reg = ins->modrm.reg;
13410
43.3k
  const char (*names)[8];
13411
13412
43.3k
  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13413
43.3k
  if (ins->prefixes & PREFIX_DATA)
13414
2.01k
    {
13415
2.01k
      names = att_names_xmm;
13416
2.01k
      USED_REX (REX_R);
13417
2.01k
      if (ins->rex & REX_R)
13418
948
  reg += 8;
13419
2.01k
    }
13420
41.3k
  else
13421
41.3k
    names = att_names_mm;
13422
43.3k
  oappend_register (ins, names[reg]);
13423
43.3k
  return true;
13424
43.3k
}
13425
13426
static void
13427
print_vector_reg (instr_info *ins, unsigned int reg, int bytemode)
13428
135k
{
13429
135k
  const char (*names)[8];
13430
13431
135k
  if (bytemode == xmmq_mode
13432
129k
      || bytemode == evex_half_bcst_xmmqh_mode
13433
128k
      || bytemode == evex_half_bcst_xmmq_mode)
13434
7.82k
    {
13435
7.82k
      switch (ins->vex.length)
13436
7.82k
  {
13437
1.59k
  case 0:
13438
2.96k
  case 128:
13439
5.02k
  case 256:
13440
5.02k
    names = att_names_xmm;
13441
5.02k
    break;
13442
2.79k
  case 512:
13443
2.79k
    names = att_names_ymm;
13444
2.79k
    ins->evex_used |= EVEX_len_used;
13445
2.79k
    break;
13446
0
  default:
13447
0
    abort ();
13448
7.82k
  }
13449
7.82k
    }
13450
127k
  else if (bytemode == ymm_mode)
13451
330
    names = att_names_ymm;
13452
127k
  else if (bytemode == tmm_mode)
13453
5.31k
    {
13454
5.31k
      if (reg >= 8)
13455
2.79k
  {
13456
2.79k
    oappend (ins, "(bad)");
13457
2.79k
    return;
13458
2.79k
  }
13459
2.52k
      names = att_names_tmm;
13460
2.52k
    }
13461
121k
  else if (ins->need_vex
13462
100k
     && bytemode != xmm_mode
13463
98.2k
     && bytemode != scalar_mode
13464
85.7k
     && bytemode != xmmdw_mode
13465
85.4k
     && bytemode != xmmqd_mode
13466
84.9k
     && bytemode != evex_half_bcst_xmmqdh_mode
13467
84.6k
     && bytemode != w_swap_mode
13468
84.0k
     && bytemode != b_mode
13469
83.5k
     && bytemode != w_mode
13470
83.1k
     && bytemode != d_mode
13471
82.1k
     && bytemode != q_mode)
13472
81.3k
    {
13473
81.3k
      ins->evex_used |= EVEX_len_used;
13474
81.3k
      switch (ins->vex.length)
13475
81.3k
  {
13476
35.7k
  case 128:
13477
35.7k
    names = att_names_xmm;
13478
35.7k
    break;
13479
21.9k
  case 256:
13480
21.9k
    if (ins->vex.w
13481
12.4k
        || bytemode != vex_vsib_q_w_dq_mode)
13482
20.0k
      names = att_names_ymm;
13483
1.85k
    else
13484
1.85k
      names = att_names_xmm;
13485
21.9k
    break;
13486
23.6k
  case 512:
13487
23.6k
    if (ins->vex.w
13488
14.3k
        || bytemode != vex_vsib_q_w_dq_mode)
13489
22.4k
      names = att_names_zmm;
13490
1.20k
    else
13491
1.20k
      names = att_names_ymm;
13492
23.6k
    break;
13493
0
  default:
13494
0
    abort ();
13495
81.3k
  }
13496
81.3k
    }
13497
40.3k
  else
13498
40.3k
    names = att_names_xmm;
13499
132k
  oappend_register (ins, names[reg]);
13500
132k
}
13501
13502
static bool
13503
OP_XMM (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13504
108k
{
13505
108k
  unsigned int reg = ins->modrm.reg;
13506
13507
108k
  USED_REX (REX_R);
13508
108k
  if (ins->rex & REX_R)
13509
47.8k
    reg += 8;
13510
108k
  if (ins->vex.evex)
13511
57.4k
    {
13512
57.4k
      if (ins->rex2 & REX_R)
13513
30.2k
  reg += 16;
13514
57.4k
    }
13515
13516
108k
  if (bytemode == tmm_mode)
13517
3.53k
    ins->modrm.reg = reg;
13518
105k
  else if (bytemode == scalar_mode)
13519
14.9k
    ins->vex.no_broadcast = true;
13520
13521
108k
  print_vector_reg (ins, reg, bytemode);
13522
108k
  return true;
13523
108k
}
13524
13525
static bool
13526
OP_EM (instr_info *ins, int bytemode, int sizeflag)
13527
42.8k
{
13528
42.8k
  int reg;
13529
42.8k
  const char (*names)[8];
13530
13531
42.8k
  if (ins->modrm.mod != 3)
13532
25.9k
    {
13533
25.9k
      if (ins->intel_syntax
13534
11.1k
    && (bytemode == v_mode || bytemode == v_swap_mode))
13535
10.5k
  {
13536
10.5k
    bytemode = (ins->prefixes & PREFIX_DATA) ? x_mode : q_mode;
13537
10.5k
    ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13538
10.5k
  }
13539
25.9k
      return OP_E (ins, bytemode, sizeflag);
13540
25.9k
    }
13541
13542
16.9k
  if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
13543
190
    swap_operand (ins);
13544
13545
  /* Skip mod/rm byte.  */
13546
16.9k
  MODRM_CHECK;
13547
16.9k
  ins->codep++;
13548
16.9k
  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13549
16.9k
  reg = ins->modrm.rm;
13550
16.9k
  if (ins->prefixes & PREFIX_DATA)
13551
1.21k
    {
13552
1.21k
      names = att_names_xmm;
13553
1.21k
      USED_REX (REX_B);
13554
1.21k
      if (ins->rex & REX_B)
13555
716
  reg += 8;
13556
1.21k
    }
13557
15.7k
  else
13558
15.7k
    names = att_names_mm;
13559
16.9k
  oappend_register (ins, names[reg]);
13560
16.9k
  return true;
13561
16.9k
}
13562
13563
/* cvt* are the only instructions in sse2 which have
13564
   both SSE and MMX operands and also have 0x66 prefix
13565
   in their opcode. 0x66 was originally used to differentiate
13566
   between SSE and MMX instruction(operands). So we have to handle the
13567
   cvt* separately using OP_EMC and OP_MXC */
13568
static bool
13569
OP_EMC (instr_info *ins, int bytemode, int sizeflag)
13570
1.20k
{
13571
1.20k
  if (ins->modrm.mod != 3)
13572
630
    {
13573
630
      if (ins->intel_syntax && bytemode == v_mode)
13574
0
  {
13575
0
    bytemode = (ins->prefixes & PREFIX_DATA) ? x_mode : q_mode;
13576
0
    ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13577
0
  }
13578
630
      return OP_E (ins, bytemode, sizeflag);
13579
630
    }
13580
13581
  /* Skip mod/rm byte.  */
13582
577
  MODRM_CHECK;
13583
577
  ins->codep++;
13584
577
  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13585
577
  oappend_register (ins, att_names_mm[ins->modrm.rm]);
13586
577
  return true;
13587
577
}
13588
13589
static bool
13590
OP_MXC (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13591
  int sizeflag ATTRIBUTE_UNUSED)
13592
561
{
13593
561
  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13594
561
  oappend_register (ins, att_names_mm[ins->modrm.reg]);
13595
561
  return true;
13596
561
}
13597
13598
static bool
13599
OP_EX (instr_info *ins, int bytemode, int sizeflag)
13600
99.5k
{
13601
99.5k
  int reg;
13602
13603
  /* Skip mod/rm byte.  */
13604
99.5k
  MODRM_CHECK;
13605
99.5k
  ins->codep++;
13606
13607
99.5k
  if (bytemode == dq_mode)
13608
730
    bytemode = ins->vex.w ? q_mode : d_mode;
13609
13610
99.5k
  if (ins->modrm.mod != 3)
13611
73.2k
    return OP_E_memory (ins, bytemode, sizeflag);
13612
13613
26.3k
  reg = ins->modrm.rm;
13614
26.3k
  USED_REX (REX_B);
13615
26.3k
  if (ins->rex & REX_B)
13616
5.75k
    reg += 8;
13617
26.3k
  if (ins->vex.evex)
13618
11.8k
    {
13619
11.8k
      USED_REX (REX_X);
13620
11.8k
      if ((ins->rex & REX_X))
13621
3.77k
  reg += 16;
13622
11.8k
      ins->rex2_used &= ~REX_B;
13623
11.8k
    }
13624
14.4k
  else if (ins->rex2 & REX_B)
13625
463
    reg += 16;
13626
13627
26.3k
  if ((sizeflag & SUFFIX_ALWAYS)
13628
2.22k
      && (bytemode == x_swap_mode
13629
1.90k
    || bytemode == w_swap_mode
13630
1.70k
    || bytemode == d_swap_mode
13631
1.30k
    || bytemode == q_swap_mode))
13632
1.11k
    swap_operand (ins);
13633
13634
26.3k
  if (bytemode == tmm_mode)
13635
1.77k
    ins->modrm.rm = reg;
13636
13637
26.3k
  print_vector_reg (ins, reg, bytemode);
13638
26.3k
  return true;
13639
99.5k
}
13640
13641
static bool
13642
OP_R (instr_info *ins, int bytemode, int sizeflag)
13643
22.4k
{
13644
22.4k
  if (ins->modrm.mod != 3)
13645
5.26k
    return BadOp (ins);
13646
13647
17.2k
  switch (bytemode)
13648
17.2k
    {
13649
560
    case d_mode:
13650
1.11k
    case dq_mode:
13651
1.99k
    case q_mode:
13652
3.66k
    case mask_mode:
13653
3.66k
      return OP_E (ins, bytemode, sizeflag);
13654
929
    case q_mm_mode:
13655
929
      return OP_EM (ins, x_mode, sizeflag);
13656
10.4k
    case xmm_mode:
13657
10.4k
      if (ins->vex.length <= 128)
13658
952
  break;
13659
9.53k
      return BadOp (ins);
13660
17.2k
    }
13661
13662
3.07k
  return OP_EX (ins, bytemode, sizeflag);
13663
17.2k
}
13664
13665
static bool
13666
OP_M (instr_info *ins, int bytemode, int sizeflag)
13667
54.8k
{
13668
  /* Skip mod/rm byte.  */
13669
54.8k
  MODRM_CHECK;
13670
54.8k
  ins->codep++;
13671
13672
54.8k
  if (ins->modrm.mod == 3)
13673
    /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
13674
4.53k
    return BadOp (ins);
13675
13676
50.3k
  if (bytemode == x_mode)
13677
809
    ins->vex.no_broadcast = true;
13678
13679
50.3k
  return OP_E_memory (ins, bytemode, sizeflag);
13680
54.8k
}
13681
13682
static bool
13683
OP_0f07 (instr_info *ins, int bytemode, int sizeflag)
13684
2.70k
{
13685
2.70k
  if (ins->modrm.mod != 3 || ins->modrm.rm != 0)
13686
2.24k
    return BadOp (ins);
13687
463
  return OP_E (ins, bytemode, sizeflag);
13688
2.70k
}
13689
13690
/* montmul instruction need display repz and skip modrm */
13691
13692
static bool
13693
MONTMUL_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13694
1.34k
{
13695
1.34k
  if (ins->modrm.mod != 3 || ins->modrm.rm != 0)
13696
935
    return BadOp (ins);
13697
13698
  /* The 0xf3 prefix should be displayed as "repz" for montmul. */
13699
412
  if (ins->prefixes & PREFIX_REPZ)
13700
412
    ins->all_prefixes[ins->last_repz_prefix] = 0xf3;
13701
13702
  /* Skip mod/rm byte.  */
13703
412
  MODRM_CHECK;
13704
412
  ins->codep++;
13705
412
  return true;
13706
412
}
13707
13708
/* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
13709
   32bit mode and "xchg %rax,%rax" in 64bit mode.  */
13710
13711
static bool
13712
NOP_Fixup (instr_info *ins, int opnd, int sizeflag)
13713
50.3k
{
13714
50.3k
  if ((ins->prefixes & PREFIX_DATA) == 0 && (ins->rex & REX_B) == 0)
13715
43.9k
    {
13716
43.9k
      ins->mnemonicendp = stpcpy (ins->obuf, "nop");
13717
43.9k
      return true;
13718
43.9k
    }
13719
6.42k
  if (opnd == 0)
13720
3.21k
    return OP_REG (ins, eAX_reg, sizeflag);
13721
3.21k
  return OP_IMREG (ins, eAX_reg, sizeflag);
13722
6.42k
}
13723
13724
static const char *const Suffix3DNow[] = {
13725
/* 00 */  NULL,   NULL,   NULL,   NULL,
13726
/* 04 */  NULL,   NULL,   NULL,   NULL,
13727
/* 08 */  NULL,   NULL,   NULL,   NULL,
13728
/* 0C */  "pi2fw",  "pi2fd",  NULL,   NULL,
13729
/* 10 */  NULL,   NULL,   NULL,   NULL,
13730
/* 14 */  NULL,   NULL,   NULL,   NULL,
13731
/* 18 */  NULL,   NULL,   NULL,   NULL,
13732
/* 1C */  "pf2iw",  "pf2id",  NULL,   NULL,
13733
/* 20 */  NULL,   NULL,   NULL,   NULL,
13734
/* 24 */  NULL,   NULL,   NULL,   NULL,
13735
/* 28 */  NULL,   NULL,   NULL,   NULL,
13736
/* 2C */  NULL,   NULL,   NULL,   NULL,
13737
/* 30 */  NULL,   NULL,   NULL,   NULL,
13738
/* 34 */  NULL,   NULL,   NULL,   NULL,
13739
/* 38 */  NULL,   NULL,   NULL,   NULL,
13740
/* 3C */  NULL,   NULL,   NULL,   NULL,
13741
/* 40 */  NULL,   NULL,   NULL,   NULL,
13742
/* 44 */  NULL,   NULL,   NULL,   NULL,
13743
/* 48 */  NULL,   NULL,   NULL,   NULL,
13744
/* 4C */  NULL,   NULL,   NULL,   NULL,
13745
/* 50 */  NULL,   NULL,   NULL,   NULL,
13746
/* 54 */  NULL,   NULL,   NULL,   NULL,
13747
/* 58 */  NULL,   NULL,   NULL,   NULL,
13748
/* 5C */  NULL,   NULL,   NULL,   NULL,
13749
/* 60 */  NULL,   NULL,   NULL,   NULL,
13750
/* 64 */  NULL,   NULL,   NULL,   NULL,
13751
/* 68 */  NULL,   NULL,   NULL,   NULL,
13752
/* 6C */  NULL,   NULL,   NULL,   NULL,
13753
/* 70 */  NULL,   NULL,   NULL,   NULL,
13754
/* 74 */  NULL,   NULL,   NULL,   NULL,
13755
/* 78 */  NULL,   NULL,   NULL,   NULL,
13756
/* 7C */  NULL,   NULL,   NULL,   NULL,
13757
/* 80 */  NULL,   NULL,   NULL,   NULL,
13758
/* 84 */  NULL,   NULL,   NULL,   NULL,
13759
/* 88 */  NULL,   NULL,   "pfnacc", NULL,
13760
/* 8C */  NULL,   NULL,   "pfpnacc",  NULL,
13761
/* 90 */  "pfcmpge",  NULL,   NULL,   NULL,
13762
/* 94 */  "pfmin",  NULL,   "pfrcp",  "pfrsqrt",
13763
/* 98 */  NULL,   NULL,   "pfsub",  NULL,
13764
/* 9C */  NULL,   NULL,   "pfadd",  NULL,
13765
/* A0 */  "pfcmpgt",  NULL,   NULL,   NULL,
13766
/* A4 */  "pfmax",  NULL,   "pfrcpit1", "pfrsqit1",
13767
/* A8 */  NULL,   NULL,   "pfsubr", NULL,
13768
/* AC */  NULL,   NULL,   "pfacc",  NULL,
13769
/* B0 */  "pfcmpeq",  NULL,   NULL,   NULL,
13770
/* B4 */  "pfmul",  NULL,   "pfrcpit2", "pmulhrw",
13771
/* B8 */  NULL,   NULL,   NULL,   "pswapd",
13772
/* BC */  NULL,   NULL,   NULL,   "pavgusb",
13773
/* C0 */  NULL,   NULL,   NULL,   NULL,
13774
/* C4 */  NULL,   NULL,   NULL,   NULL,
13775
/* C8 */  NULL,   NULL,   NULL,   NULL,
13776
/* CC */  NULL,   NULL,   NULL,   NULL,
13777
/* D0 */  NULL,   NULL,   NULL,   NULL,
13778
/* D4 */  NULL,   NULL,   NULL,   NULL,
13779
/* D8 */  NULL,   NULL,   NULL,   NULL,
13780
/* DC */  NULL,   NULL,   NULL,   NULL,
13781
/* E0 */  NULL,   NULL,   NULL,   NULL,
13782
/* E4 */  NULL,   NULL,   NULL,   NULL,
13783
/* E8 */  NULL,   NULL,   NULL,   NULL,
13784
/* EC */  NULL,   NULL,   NULL,   NULL,
13785
/* F0 */  NULL,   NULL,   NULL,   NULL,
13786
/* F4 */  NULL,   NULL,   NULL,   NULL,
13787
/* F8 */  NULL,   NULL,   NULL,   NULL,
13788
/* FC */  NULL,   NULL,   NULL,   NULL,
13789
};
13790
13791
static bool
13792
OP_3DNowSuffix (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13793
    int sizeflag ATTRIBUTE_UNUSED)
13794
20.6k
{
13795
20.6k
  const char *mnemonic;
13796
13797
20.6k
  if (!fetch_code (ins->info, ins->codep + 1))
13798
685
    return false;
13799
  /* AMD 3DNow! instructions are specified by an opcode suffix in the
13800
     place where an 8-bit immediate would normally go.  ie. the last
13801
     byte of the instruction.  */
13802
19.9k
  ins->obufp = ins->mnemonicendp;
13803
19.9k
  mnemonic = Suffix3DNow[*ins->codep++];
13804
19.9k
  if (mnemonic)
13805
603
    ins->obufp = stpcpy (ins->obufp, mnemonic);
13806
19.3k
  else
13807
19.3k
    {
13808
      /* Since a variable sized ins->modrm/ins->sib chunk is between the start
13809
   of the opcode (0x0f0f) and the opcode suffix, we need to do
13810
   all the ins->modrm processing first, and don't know until now that
13811
   we have a bad opcode.  This necessitates some cleaning up.  */
13812
19.3k
      ins->op_out[0][0] = '\0';
13813
19.3k
      ins->op_out[1][0] = '\0';
13814
19.3k
      BadOp (ins);
13815
19.3k
    }
13816
19.9k
  ins->mnemonicendp = ins->obufp;
13817
19.9k
  return true;
13818
20.6k
}
13819
13820
static const struct op simd_cmp_op[] =
13821
{
13822
  { STRING_COMMA_LEN ("eq") },
13823
  { STRING_COMMA_LEN ("lt") },
13824
  { STRING_COMMA_LEN ("le") },
13825
  { STRING_COMMA_LEN ("unord") },
13826
  { STRING_COMMA_LEN ("neq") },
13827
  { STRING_COMMA_LEN ("nlt") },
13828
  { STRING_COMMA_LEN ("nle") },
13829
  { STRING_COMMA_LEN ("ord") }
13830
};
13831
13832
static const struct op vex_cmp_op[] =
13833
{
13834
  { STRING_COMMA_LEN ("eq_uq") },
13835
  { STRING_COMMA_LEN ("nge") },
13836
  { STRING_COMMA_LEN ("ngt") },
13837
  { STRING_COMMA_LEN ("false") },
13838
  { STRING_COMMA_LEN ("neq_oq") },
13839
  { STRING_COMMA_LEN ("ge") },
13840
  { STRING_COMMA_LEN ("gt") },
13841
  { STRING_COMMA_LEN ("true") },
13842
  { STRING_COMMA_LEN ("eq_os") },
13843
  { STRING_COMMA_LEN ("lt_oq") },
13844
  { STRING_COMMA_LEN ("le_oq") },
13845
  { STRING_COMMA_LEN ("unord_s") },
13846
  { STRING_COMMA_LEN ("neq_us") },
13847
  { STRING_COMMA_LEN ("nlt_uq") },
13848
  { STRING_COMMA_LEN ("nle_uq") },
13849
  { STRING_COMMA_LEN ("ord_s") },
13850
  { STRING_COMMA_LEN ("eq_us") },
13851
  { STRING_COMMA_LEN ("nge_uq") },
13852
  { STRING_COMMA_LEN ("ngt_uq") },
13853
  { STRING_COMMA_LEN ("false_os") },
13854
  { STRING_COMMA_LEN ("neq_os") },
13855
  { STRING_COMMA_LEN ("ge_oq") },
13856
  { STRING_COMMA_LEN ("gt_oq") },
13857
  { STRING_COMMA_LEN ("true_us") },
13858
};
13859
13860
static bool
13861
CMP_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13862
     int sizeflag ATTRIBUTE_UNUSED)
13863
3.14k
{
13864
3.14k
  unsigned int cmp_type;
13865
13866
3.14k
  if (!fetch_code (ins->info, ins->codep + 1))
13867
671
    return false;
13868
2.47k
  cmp_type = *ins->codep++;
13869
2.47k
  if (cmp_type < ARRAY_SIZE (simd_cmp_op))
13870
723
    {
13871
723
      char suffix[3];
13872
723
      char *p = ins->mnemonicendp - 2;
13873
723
      suffix[0] = p[0];
13874
723
      suffix[1] = p[1];
13875
723
      suffix[2] = '\0';
13876
723
      sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
13877
723
      ins->mnemonicendp += simd_cmp_op[cmp_type].len;
13878
723
    }
13879
1.75k
  else if (ins->need_vex
13880
1.12k
     && cmp_type < ARRAY_SIZE (simd_cmp_op) + ARRAY_SIZE (vex_cmp_op))
13881
275
    {
13882
275
      char suffix[3];
13883
275
      char *p = ins->mnemonicendp - 2;
13884
275
      suffix[0] = p[0];
13885
275
      suffix[1] = p[1];
13886
275
      suffix[2] = '\0';
13887
275
      cmp_type -= ARRAY_SIZE (simd_cmp_op);
13888
275
      sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
13889
275
      ins->mnemonicendp += vex_cmp_op[cmp_type].len;
13890
275
    }
13891
1.47k
  else
13892
1.47k
    {
13893
      /* We have a reserved extension byte.  Output it directly.  */
13894
1.47k
      oappend_immediate (ins, cmp_type);
13895
1.47k
    }
13896
2.47k
  return true;
13897
3.14k
}
13898
13899
static bool
13900
OP_Mwait (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13901
1.39k
{
13902
  /* mwait %eax,%ecx / mwaitx %eax,%ecx,%ebx  */
13903
1.39k
  if (!ins->intel_syntax)
13904
736
    {
13905
736
      strcpy (ins->op_out[0], att_names32[0] + ins->intel_syntax);
13906
736
      strcpy (ins->op_out[1], att_names32[1] + ins->intel_syntax);
13907
736
      if (bytemode == eBX_reg)
13908
301
  strcpy (ins->op_out[2], att_names32[3] + ins->intel_syntax);
13909
736
      ins->two_source_ops = true;
13910
736
    }
13911
  /* Skip mod/rm byte.  */
13912
1.39k
  MODRM_CHECK;
13913
1.39k
  ins->codep++;
13914
1.39k
  return true;
13915
1.39k
}
13916
13917
static bool
13918
OP_Monitor (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13919
      int sizeflag ATTRIBUTE_UNUSED)
13920
3.10k
{
13921
  /* monitor %{e,r,}ax,%ecx,%edx"  */
13922
3.10k
  if (!ins->intel_syntax)
13923
1.43k
    {
13924
1.43k
      const char (*names)[8] = (ins->address_mode == mode_64bit
13925
1.43k
        ? att_names64 : att_names32);
13926
13927
1.43k
      if (ins->prefixes & PREFIX_ADDR)
13928
408
  {
13929
    /* Remove "addr16/addr32".  */
13930
408
    ins->all_prefixes[ins->last_addr_prefix] = 0;
13931
408
    names = (ins->address_mode != mode_32bit
13932
408
       ? att_names32 : att_names16);
13933
408
    ins->used_prefixes |= PREFIX_ADDR;
13934
408
  }
13935
1.02k
      else if (ins->address_mode == mode_16bit)
13936
669
  names = att_names16;
13937
1.43k
      strcpy (ins->op_out[0], names[0] + ins->intel_syntax);
13938
1.43k
      strcpy (ins->op_out[1], att_names32[1] + ins->intel_syntax);
13939
1.43k
      strcpy (ins->op_out[2], att_names32[2] + ins->intel_syntax);
13940
1.43k
      ins->two_source_ops = true;
13941
1.43k
    }
13942
  /* Skip mod/rm byte.  */
13943
3.10k
  MODRM_CHECK;
13944
3.10k
  ins->codep++;
13945
3.10k
  return true;
13946
3.10k
}
13947
13948
static bool
13949
REP_Fixup (instr_info *ins, int bytemode, int sizeflag)
13950
190k
{
13951
  /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
13952
     lods and stos.  */
13953
190k
  if (ins->prefixes & PREFIX_REPZ)
13954
593
    ins->all_prefixes[ins->last_repz_prefix] = REP_PREFIX;
13955
13956
190k
  switch (bytemode)
13957
190k
    {
13958
8.58k
    case al_reg:
13959
20.8k
    case eAX_reg:
13960
78.8k
    case indir_dx_reg:
13961
78.8k
      return OP_IMREG (ins, bytemode, sizeflag);
13962
111k
    case eDI_reg:
13963
111k
      return OP_ESreg (ins, bytemode, sizeflag);
13964
0
    case eSI_reg:
13965
0
      return OP_DSreg (ins, bytemode, sizeflag);
13966
0
    default:
13967
0
      abort ();
13968
0
      break;
13969
190k
    }
13970
0
  return true;
13971
190k
}
13972
13973
static bool
13974
SEP_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13975
     int sizeflag ATTRIBUTE_UNUSED)
13976
896
{
13977
896
  if (ins->isa64 != amd64)
13978
704
    return true;
13979
13980
192
  ins->obufp = ins->obuf;
13981
192
  BadOp (ins);
13982
192
  ins->mnemonicendp = ins->obufp;
13983
192
  ++ins->codep;
13984
192
  return true;
13985
896
}
13986
13987
/* For BND-prefixed instructions 0xF2 prefix should be displayed as
13988
   "bnd".  */
13989
13990
static bool
13991
BND_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13992
     int sizeflag ATTRIBUTE_UNUSED)
13993
393k
{
13994
393k
  if (ins->prefixes & PREFIX_REPNZ)
13995
2.42k
    ins->all_prefixes[ins->last_repnz_prefix] = BND_PREFIX;
13996
393k
  return true;
13997
393k
}
13998
13999
/* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as
14000
   "notrack".  */
14001
14002
static bool
14003
NOTRACK_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
14004
         int sizeflag ATTRIBUTE_UNUSED)
14005
38.1k
{
14006
  /* Since active_seg_prefix is not set in 64-bit mode, check whether
14007
     we've seen a PREFIX_DS.  */
14008
38.1k
  if ((ins->prefixes & PREFIX_DS) != 0
14009
2.49k
      && (ins->address_mode != mode_64bit || ins->last_data_prefix < 0))
14010
1.99k
    {
14011
      /* NOTRACK prefix is only valid on indirect branch instructions.
14012
   NB: DATA prefix is unsupported for Intel64.  */
14013
1.99k
      ins->active_seg_prefix = 0;
14014
1.99k
      ins->all_prefixes[ins->last_seg_prefix] = NOTRACK_PREFIX;
14015
1.99k
    }
14016
38.1k
  return true;
14017
38.1k
}
14018
14019
/* Similar to OP_E.  But the 0xf2/0xf3 ins->prefixes should be displayed as
14020
   "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
14021
 */
14022
14023
static bool
14024
HLE_Fixup1 (instr_info *ins, int bytemode, int sizeflag)
14025
2.08M
{
14026
2.08M
  if (ins->modrm.mod != 3
14027
1.91M
      && (ins->prefixes & PREFIX_LOCK) != 0)
14028
5.74k
    {
14029
5.74k
      if (ins->prefixes & PREFIX_REPZ)
14030
1.25k
  ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX;
14031
5.74k
      if (ins->prefixes & PREFIX_REPNZ)
14032
369
  ins->all_prefixes[ins->last_repnz_prefix] = XACQUIRE_PREFIX;
14033
5.74k
    }
14034
14035
2.08M
  return OP_E (ins, bytemode, sizeflag);
14036
2.08M
}
14037
14038
/* Similar to OP_E.  But the 0xf2/0xf3 ins->prefixes should be displayed as
14039
   "xacquire"/"xrelease" for memory operand.  No check for LOCK prefix.
14040
 */
14041
14042
static bool
14043
HLE_Fixup2 (instr_info *ins, int bytemode, int sizeflag)
14044
22.2k
{
14045
22.2k
  if (ins->modrm.mod != 3)
14046
19.4k
    {
14047
19.4k
      if (ins->prefixes & PREFIX_REPZ)
14048
905
  ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX;
14049
19.4k
      if (ins->prefixes & PREFIX_REPNZ)
14050
1.81k
  ins->all_prefixes[ins->last_repnz_prefix] = XACQUIRE_PREFIX;
14051
19.4k
    }
14052
14053
22.2k
  return OP_E (ins, bytemode, sizeflag);
14054
22.2k
}
14055
14056
/* Similar to OP_E.  But the 0xf3 prefixes should be displayed as
14057
   "xrelease" for memory operand.  No check for LOCK prefix.   */
14058
14059
static bool
14060
HLE_Fixup3 (instr_info *ins, int bytemode, int sizeflag)
14061
45.7k
{
14062
45.7k
  if (ins->modrm.mod != 3
14063
24.6k
      && ins->last_repz_prefix > ins->last_repnz_prefix
14064
544
      && (ins->prefixes & PREFIX_REPZ) != 0)
14065
544
    ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX;
14066
14067
45.7k
  return OP_E (ins, bytemode, sizeflag);
14068
45.7k
}
14069
14070
static bool
14071
CMPXCHG8B_Fixup (instr_info *ins, int bytemode, int sizeflag)
14072
3.12k
{
14073
3.12k
  USED_REX (REX_W);
14074
3.12k
  if (ins->rex & REX_W)
14075
388
    {
14076
      /* Change cmpxchg8b to cmpxchg16b.  */
14077
388
      char *p = ins->mnemonicendp - 2;
14078
388
      ins->mnemonicendp = stpcpy (p, "16b");
14079
388
      bytemode = o_mode;
14080
388
    }
14081
2.73k
  else if ((ins->prefixes & PREFIX_LOCK) != 0)
14082
1.56k
    {
14083
1.56k
      if (ins->prefixes & PREFIX_REPZ)
14084
982
  ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX;
14085
1.56k
      if (ins->prefixes & PREFIX_REPNZ)
14086
330
  ins->all_prefixes[ins->last_repnz_prefix] = XACQUIRE_PREFIX;
14087
1.56k
    }
14088
14089
3.12k
  return OP_M (ins, bytemode, sizeflag);
14090
3.12k
}
14091
14092
static bool
14093
XMM_Fixup (instr_info *ins, int reg, int sizeflag ATTRIBUTE_UNUSED)
14094
346
{
14095
346
  const char (*names)[8] = att_names_xmm;
14096
14097
346
  if (ins->need_vex)
14098
0
    {
14099
0
      switch (ins->vex.length)
14100
0
  {
14101
0
  case 128:
14102
0
    break;
14103
0
  case 256:
14104
0
    names = att_names_ymm;
14105
0
    break;
14106
0
  default:
14107
0
    abort ();
14108
0
  }
14109
0
    }
14110
346
  oappend_register (ins, names[reg]);
14111
346
  return true;
14112
346
}
14113
14114
static bool
14115
FXSAVE_Fixup (instr_info *ins, int bytemode, int sizeflag)
14116
2.09k
{
14117
  /* Add proper suffix to "fxsave" and "fxrstor".  */
14118
2.09k
  USED_REX (REX_W);
14119
2.09k
  if (ins->rex & REX_W)
14120
561
    {
14121
561
      char *p = ins->mnemonicendp;
14122
561
      *p++ = '6';
14123
561
      *p++ = '4';
14124
561
      *p = '\0';
14125
561
      ins->mnemonicendp = p;
14126
561
    }
14127
2.09k
  return OP_M (ins, bytemode, sizeflag);
14128
2.09k
}
14129
14130
/* Display the destination register operand for instructions with
14131
   VEX. */
14132
14133
static bool
14134
OP_VEX (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
14135
146k
{
14136
146k
  int reg, modrm_reg, sib_index = -1;
14137
146k
  const char (*names)[8];
14138
14139
146k
  if (!ins->need_vex)
14140
74.5k
    return true;
14141
14142
71.6k
  if (ins->evex_type == evex_from_legacy)
14143
8.51k
    {
14144
8.51k
      ins->evex_used |= EVEX_b_used;
14145
8.51k
      if (!ins->vex.nd)
14146
3.74k
  return true;
14147
8.51k
    }
14148
14149
67.9k
  reg = ins->vex.register_specifier;
14150
67.9k
  ins->vex.register_specifier = 0;
14151
67.9k
  if (ins->address_mode != mode_64bit)
14152
12.8k
    {
14153
12.8k
      if (ins->vex.evex && !ins->vex.v)
14154
2.25k
  {
14155
2.25k
    oappend (ins, "(bad)");
14156
2.25k
    return true;
14157
2.25k
  }
14158
14159
10.6k
      reg &= 7;
14160
10.6k
    }
14161
55.0k
  else if (ins->vex.evex && !ins->vex.v)
14162
18.9k
    reg += 16;
14163
14164
65.6k
  switch (bytemode)
14165
65.6k
    {
14166
9.97k
    case scalar_mode:
14167
9.97k
      oappend_register (ins, att_names_xmm[reg]);
14168
9.97k
      return true;
14169
14170
2.25k
    case vex_vsib_d_w_dq_mode:
14171
5.59k
    case vex_vsib_q_w_dq_mode:
14172
      /* This must be the 3rd operand.  */
14173
5.59k
      if (ins->obufp != ins->op_out[2])
14174
0
  abort ();
14175
5.59k
      if (ins->vex.length == 128
14176
2.55k
    || (bytemode != vex_vsib_d_w_dq_mode
14177
1.61k
        && !ins->vex.w))
14178
3.99k
  oappend_register (ins, att_names_xmm[reg]);
14179
1.59k
      else
14180
1.59k
  oappend_register (ins, att_names_ymm[reg]);
14181
14182
      /* All 3 XMM/YMM registers must be distinct.  */
14183
5.59k
      modrm_reg = ins->modrm.reg;
14184
5.59k
      if (ins->rex & REX_R)
14185
1.27k
  modrm_reg += 8;
14186
14187
5.59k
      if (ins->has_sib && ins->modrm.rm == 4)
14188
1.57k
  {
14189
1.57k
    sib_index = ins->sib.index;
14190
1.57k
    if (ins->rex & REX_X)
14191
336
      sib_index += 8;
14192
1.57k
  }
14193
14194
5.59k
      if (reg == modrm_reg || reg == sib_index)
14195
728
  strcpy (ins->obufp, "/(bad)");
14196
5.59k
      if (modrm_reg == sib_index || modrm_reg == reg)
14197
1.07k
  strcat (ins->op_out[0], "/(bad)");
14198
5.59k
      if (sib_index == modrm_reg || sib_index == reg)
14199
784
  strcat (ins->op_out[1], "/(bad)");
14200
14201
5.59k
      return true;
14202
14203
3.23k
    case tmm_mode:
14204
      /* All 3 TMM registers must be distinct.  */
14205
3.23k
      if (reg >= 8)
14206
765
  oappend (ins, "(bad)");
14207
2.47k
      else
14208
2.47k
  {
14209
    /* This must be the 3rd operand.  */
14210
2.47k
    if (ins->obufp != ins->op_out[2])
14211
0
      abort ();
14212
2.47k
    oappend_register (ins, att_names_tmm[reg]);
14213
2.47k
    if (reg == ins->modrm.reg || reg == ins->modrm.rm)
14214
1.63k
      strcpy (ins->obufp, "/(bad)");
14215
2.47k
  }
14216
14217
3.23k
      if (ins->modrm.reg == ins->modrm.rm || ins->modrm.reg == reg
14218
1.89k
    || ins->modrm.rm == reg)
14219
2.39k
  {
14220
2.39k
    if (ins->modrm.reg <= 8
14221
2.04k
        && (ins->modrm.reg == ins->modrm.rm || ins->modrm.reg == reg))
14222
1.00k
      strcat (ins->op_out[0], "/(bad)");
14223
2.39k
    if (ins->modrm.rm <= 8
14224
2.05k
        && (ins->modrm.rm == ins->modrm.reg || ins->modrm.rm == reg))
14225
1.48k
      strcat (ins->op_out[1], "/(bad)");
14226
2.39k
  }
14227
14228
3.23k
      return true;
14229
14230
3.53k
    case v_mode:
14231
6.65k
    case dq_mode:
14232
6.65k
      if (ins->rex & REX_W)
14233
999
  oappend_register (ins, att_names64[reg]);
14234
5.66k
      else if (bytemode == v_mode
14235
2.95k
         && !(sizeflag & DFLAG))
14236
409
  oappend_register (ins, att_names16[reg]);
14237
5.25k
      else
14238
5.25k
  oappend_register (ins, att_names32[reg]);
14239
6.65k
      return true;
14240
14241
639
    case b_mode:
14242
639
      oappend_register (ins, att_names8rex[reg]);
14243
639
      return true;
14244
14245
552
    case q_mode:
14246
552
      oappend_register (ins, att_names64[reg]);
14247
552
      return true;
14248
65.6k
    }
14249
14250
39.0k
  switch (ins->vex.length)
14251
39.0k
    {
14252
18.3k
    case 128:
14253
18.3k
      switch (bytemode)
14254
18.3k
  {
14255
18.3k
  case x_mode:
14256
18.3k
    names = att_names_xmm;
14257
18.3k
    ins->evex_used |= EVEX_len_used;
14258
18.3k
    break;
14259
0
  case mask_bd_mode:
14260
0
  case mask_mode:
14261
0
    if (reg > 0x7)
14262
0
      {
14263
0
        oappend (ins, "(bad)");
14264
0
        return true;
14265
0
      }
14266
0
    names = att_names_mask;
14267
0
    break;
14268
0
  default:
14269
0
    abort ();
14270
0
    return true;
14271
18.3k
  }
14272
18.3k
      break;
14273
18.3k
    case 256:
14274
9.80k
      switch (bytemode)
14275
9.80k
  {
14276
8.20k
  case x_mode:
14277
8.20k
    names = att_names_ymm;
14278
8.20k
    ins->evex_used |= EVEX_len_used;
14279
8.20k
    break;
14280
0
  case mask_bd_mode:
14281
1.60k
  case mask_mode:
14282
1.60k
    if (reg <= 0x7)
14283
720
      {
14284
720
        names = att_names_mask;
14285
720
        break;
14286
720
      }
14287
    /* Fall through.  */
14288
885
  default:
14289
    /* See PR binutils/20893 for a reproducer.  */
14290
885
    oappend (ins, "(bad)");
14291
885
    return true;
14292
9.80k
  }
14293
8.92k
      break;
14294
10.9k
    case 512:
14295
10.9k
      names = att_names_zmm;
14296
10.9k
      ins->evex_used |= EVEX_len_used;
14297
10.9k
      break;
14298
0
    default:
14299
0
      abort ();
14300
0
      break;
14301
39.0k
    }
14302
38.1k
  oappend_register (ins, names[reg]);
14303
38.1k
  return true;
14304
39.0k
}
14305
14306
static bool
14307
OP_VexR (instr_info *ins, int bytemode, int sizeflag)
14308
3.97k
{
14309
3.97k
  if (ins->modrm.mod == 3)
14310
2.19k
    return OP_VEX (ins, bytemode, sizeflag);
14311
1.78k
  return true;
14312
3.97k
}
14313
14314
static bool
14315
OP_VexW (instr_info *ins, int bytemode, int sizeflag)
14316
1.68k
{
14317
1.68k
  OP_VEX (ins, bytemode, sizeflag);
14318
14319
1.68k
  if (ins->vex.w)
14320
1.15k
    {
14321
      /* Swap 2nd and 3rd operands.  */
14322
1.15k
      char *tmp = ins->op_out[2];
14323
14324
1.15k
      ins->op_out[2] = ins->op_out[1];
14325
1.15k
      ins->op_out[1] = tmp;
14326
14327
1.15k
      tmp = ins->cm_out[2];
14328
1.15k
      ins->cm_out[2] = ins->cm_out[1];
14329
1.15k
      ins->cm_out[1] = tmp;
14330
1.15k
    }
14331
1.68k
  return true;
14332
1.68k
}
14333
14334
static bool
14335
OP_REG_VexI4 (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
14336
3.05k
{
14337
3.05k
  int reg;
14338
3.05k
  const char (*names)[8] = att_names_xmm;
14339
14340
3.05k
  if (!fetch_code (ins->info, ins->codep + 1))
14341
246
    return false;
14342
2.80k
  reg = *ins->codep++;
14343
14344
2.80k
  if (bytemode != x_mode && bytemode != scalar_mode)
14345
0
    abort ();
14346
14347
2.80k
  reg >>= 4;
14348
2.80k
  if (ins->address_mode != mode_64bit)
14349
1.23k
    reg &= 7;
14350
14351
2.80k
  if (bytemode == x_mode && ins->vex.length == 256)
14352
1.31k
    names = att_names_ymm;
14353
14354
2.80k
  oappend_register (ins, names[reg]);
14355
14356
2.80k
  if (ins->vex.w)
14357
1.47k
    {
14358
      /* Swap 3rd and 4th operands.  */
14359
1.47k
      char *tmp = ins->op_out[3];
14360
14361
1.47k
      ins->op_out[3] = ins->op_out[2];
14362
1.47k
      ins->op_out[2] = tmp;
14363
14364
1.47k
      tmp = ins->cm_out[2];
14365
1.47k
      ins->cm_out[3] = ins->cm_out[2];
14366
1.47k
      ins->cm_out[2] = tmp;
14367
1.47k
    }
14368
2.80k
  return true;
14369
2.80k
}
14370
14371
static bool
14372
OP_VexI4 (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
14373
    int sizeflag ATTRIBUTE_UNUSED)
14374
1.70k
{
14375
1.70k
  oappend_immediate (ins, ins->codep[-1] & 0xf);
14376
1.70k
  return true;
14377
1.70k
}
14378
14379
static bool
14380
VPCMP_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
14381
       int sizeflag ATTRIBUTE_UNUSED)
14382
2.55k
{
14383
2.55k
  unsigned int cmp_type;
14384
14385
2.55k
  if (!ins->vex.evex)
14386
0
    abort ();
14387
14388
2.55k
  if (!fetch_code (ins->info, ins->codep + 1))
14389
258
    return false;
14390
2.30k
  cmp_type = *ins->codep++;
14391
  /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
14392
     If it's the case, print suffix, otherwise - print the immediate.  */
14393
2.30k
  if (cmp_type < ARRAY_SIZE (simd_cmp_op)
14394
1.88k
      && cmp_type != 3
14395
1.46k
      && cmp_type != 7)
14396
1.16k
    {
14397
1.16k
      char suffix[3];
14398
1.16k
      char *p = ins->mnemonicendp - 2;
14399
14400
      /* vpcmp* can have both one- and two-lettered suffix.  */
14401
1.16k
      if (p[0] == 'p')
14402
735
  {
14403
735
    p++;
14404
735
    suffix[0] = p[0];
14405
735
    suffix[1] = '\0';
14406
735
  }
14407
427
      else
14408
427
  {
14409
427
    suffix[0] = p[0];
14410
427
    suffix[1] = p[1];
14411
427
    suffix[2] = '\0';
14412
427
  }
14413
14414
1.16k
      sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
14415
1.16k
      ins->mnemonicendp += simd_cmp_op[cmp_type].len;
14416
1.16k
    }
14417
1.13k
  else
14418
1.13k
    {
14419
      /* We have a reserved extension byte.  Output it directly.  */
14420
1.13k
      oappend_immediate (ins, cmp_type);
14421
1.13k
    }
14422
2.30k
  return true;
14423
2.55k
}
14424
14425
static const struct op xop_cmp_op[] =
14426
{
14427
  { STRING_COMMA_LEN ("lt") },
14428
  { STRING_COMMA_LEN ("le") },
14429
  { STRING_COMMA_LEN ("gt") },
14430
  { STRING_COMMA_LEN ("ge") },
14431
  { STRING_COMMA_LEN ("eq") },
14432
  { STRING_COMMA_LEN ("neq") },
14433
  { STRING_COMMA_LEN ("false") },
14434
  { STRING_COMMA_LEN ("true") }
14435
};
14436
14437
static bool
14438
VPCOM_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
14439
       int sizeflag ATTRIBUTE_UNUSED)
14440
1.34k
{
14441
1.34k
  unsigned int cmp_type;
14442
14443
1.34k
  if (!fetch_code (ins->info, ins->codep + 1))
14444
138
    return false;
14445
1.21k
  cmp_type = *ins->codep++;
14446
1.21k
  if (cmp_type < ARRAY_SIZE (xop_cmp_op))
14447
732
    {
14448
732
      char suffix[3];
14449
732
      char *p = ins->mnemonicendp - 2;
14450
14451
      /* vpcom* can have both one- and two-lettered suffix.  */
14452
732
      if (p[0] == 'm')
14453
331
  {
14454
331
    p++;
14455
331
    suffix[0] = p[0];
14456
331
    suffix[1] = '\0';
14457
331
  }
14458
401
      else
14459
401
  {
14460
401
    suffix[0] = p[0];
14461
401
    suffix[1] = p[1];
14462
401
    suffix[2] = '\0';
14463
401
  }
14464
14465
732
      sprintf (p, "%s%s", xop_cmp_op[cmp_type].name, suffix);
14466
732
      ins->mnemonicendp += xop_cmp_op[cmp_type].len;
14467
732
    }
14468
479
  else
14469
479
    {
14470
      /* We have a reserved extension byte.  Output it directly.  */
14471
479
      oappend_immediate (ins, cmp_type);
14472
479
    }
14473
1.21k
  return true;
14474
1.34k
}
14475
14476
static const struct op pclmul_op[] =
14477
{
14478
  { STRING_COMMA_LEN ("lql") },
14479
  { STRING_COMMA_LEN ("hql") },
14480
  { STRING_COMMA_LEN ("lqh") },
14481
  { STRING_COMMA_LEN ("hqh") }
14482
};
14483
14484
static bool
14485
PCLMUL_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
14486
        int sizeflag ATTRIBUTE_UNUSED)
14487
3.67k
{
14488
3.67k
  unsigned int pclmul_type;
14489
14490
3.67k
  if (!fetch_code (ins->info, ins->codep + 1))
14491
214
    return false;
14492
3.45k
  pclmul_type = *ins->codep++;
14493
3.45k
  switch (pclmul_type)
14494
3.45k
    {
14495
676
    case 0x10:
14496
676
      pclmul_type = 2;
14497
676
      break;
14498
573
    case 0x11:
14499
573
      pclmul_type = 3;
14500
573
      break;
14501
2.20k
    default:
14502
2.20k
      break;
14503
3.45k
    }
14504
3.45k
  if (pclmul_type < ARRAY_SIZE (pclmul_op))
14505
1.84k
    {
14506
1.84k
      char suffix[4];
14507
1.84k
      char *p = ins->mnemonicendp - 3;
14508
1.84k
      suffix[0] = p[0];
14509
1.84k
      suffix[1] = p[1];
14510
1.84k
      suffix[2] = p[2];
14511
1.84k
      suffix[3] = '\0';
14512
1.84k
      sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
14513
1.84k
      ins->mnemonicendp += pclmul_op[pclmul_type].len;
14514
1.84k
    }
14515
1.61k
  else
14516
1.61k
    {
14517
      /* We have a reserved extension byte.  Output it directly.  */
14518
1.61k
      oappend_immediate (ins, pclmul_type);
14519
1.61k
    }
14520
3.45k
  return true;
14521
3.45k
}
14522
14523
static bool
14524
MOVSXD_Fixup (instr_info *ins, int bytemode, int sizeflag)
14525
19.4k
{
14526
  /* Add proper suffix to "movsxd".  */
14527
19.4k
  char *p = ins->mnemonicendp;
14528
14529
19.4k
  switch (bytemode)
14530
19.4k
    {
14531
19.4k
    case movsxd_mode:
14532
19.4k
      if (!ins->intel_syntax)
14533
15.8k
  {
14534
15.8k
    USED_REX (REX_W);
14535
15.8k
    if (ins->rex & REX_W)
14536
1.06k
      {
14537
1.06k
        *p++ = 'l';
14538
1.06k
        *p++ = 'q';
14539
1.06k
        break;
14540
1.06k
      }
14541
15.8k
  }
14542
14543
18.3k
      *p++ = 'x';
14544
18.3k
      *p++ = 'd';
14545
18.3k
      break;
14546
0
    default:
14547
0
      oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
14548
0
      break;
14549
19.4k
    }
14550
14551
19.4k
  ins->mnemonicendp = p;
14552
19.4k
  *p = '\0';
14553
19.4k
  return OP_E (ins, bytemode, sizeflag);
14554
19.4k
}
14555
14556
static bool
14557
DistinctDest_Fixup (instr_info *ins, int bytemode, int sizeflag)
14558
7.31k
{
14559
7.31k
  unsigned int reg = ins->vex.register_specifier;
14560
7.31k
  unsigned int modrm_reg = ins->modrm.reg;
14561
7.31k
  unsigned int modrm_rm = ins->modrm.rm;
14562
14563
  /* Calc destination register number.  */
14564
7.31k
  if (ins->rex & REX_R)
14565
746
    modrm_reg += 8;
14566
7.31k
  if (ins->rex2 & REX_R)
14567
1.64k
    modrm_reg += 16;
14568
14569
  /* Calc src1 register number.  */
14570
7.31k
  if (ins->address_mode != mode_64bit)
14571
2.52k
    reg &= 7;
14572
4.78k
  else if (ins->vex.evex && !ins->vex.v)
14573
2.65k
    reg += 16;
14574
14575
  /* Calc src2 register number.  */
14576
7.31k
  if (ins->modrm.mod == 3)
14577
2.09k
    {
14578
2.09k
      if (ins->rex & REX_B)
14579
1.20k
        modrm_rm += 8;
14580
2.09k
      if (ins->rex & REX_X)
14581
371
        modrm_rm += 16;
14582
2.09k
    }
14583
14584
  /* Destination and source registers must be distinct, output bad if
14585
     dest == src1 or dest == src2.  */
14586
7.31k
  if (modrm_reg == reg
14587
4.16k
      || (ins->modrm.mod == 3
14588
2.09k
    && modrm_reg == modrm_rm))
14589
3.45k
    {
14590
3.45k
      oappend (ins, "(bad)");
14591
3.45k
      return true;
14592
3.45k
    }
14593
3.85k
  return OP_XMM (ins, bytemode, sizeflag);
14594
7.31k
}
14595
14596
static bool
14597
OP_Rounding (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
14598
30.1k
{
14599
30.1k
  if (ins->modrm.mod != 3 || !ins->vex.b)
14600
25.0k
    return true;
14601
14602
5.11k
  ins->evex_used |= EVEX_b_used;
14603
5.11k
  switch (bytemode)
14604
5.11k
    {
14605
2.08k
    case evex_rounding_64_mode:
14606
2.08k
      if (ins->address_mode != mode_64bit || !ins->vex.w)
14607
1.42k
        return true;
14608
      /* Fall through.  */
14609
2.72k
    case evex_rounding_mode:
14610
2.72k
      oappend (ins, names_rounding[ins->vex.ll]);
14611
2.72k
      break;
14612
968
    case evex_sae_mode:
14613
968
      oappend (ins, "{");
14614
968
      break;
14615
0
    default:
14616
0
      abort ();
14617
5.11k
    }
14618
3.69k
  oappend (ins, "sae}");
14619
3.69k
  return true;
14620
5.11k
}
14621
14622
static bool
14623
PREFETCHI_Fixup (instr_info *ins, int bytemode, int sizeflag)
14624
3.35k
{
14625
3.35k
  if (ins->modrm.mod != 0 || ins->modrm.rm != 5)
14626
2.28k
    {
14627
2.28k
      if (ins->intel_syntax)
14628
722
  {
14629
722
    ins->mnemonicendp = stpcpy (ins->obuf, "nop   ");
14630
722
  }
14631
1.56k
      else
14632
1.56k
  {
14633
1.56k
    USED_REX (REX_W);
14634
1.56k
    if (ins->rex & REX_W)
14635
445
      ins->mnemonicendp = stpcpy (ins->obuf, "nopq  ");
14636
1.12k
    else
14637
1.12k
      {
14638
1.12k
        if (sizeflag & DFLAG)
14639
886
    ins->mnemonicendp = stpcpy (ins->obuf, "nopl  ");
14640
236
        else
14641
236
    ins->mnemonicendp = stpcpy (ins->obuf, "nopw  ");
14642
1.12k
        ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
14643
1.12k
      }
14644
1.56k
  }
14645
2.28k
      bytemode = v_mode;
14646
2.28k
    }
14647
14648
3.35k
  return OP_M (ins, bytemode, sizeflag);
14649
3.35k
}
14650
14651
static bool
14652
PUSH2_POP2_Fixup (instr_info *ins, int bytemode, int sizeflag)
14653
2.06k
{
14654
2.06k
  if (ins->modrm.mod != 3)
14655
458
    return true;
14656
14657
1.60k
  unsigned int vvvv_reg = ins->vex.register_specifier
14658
1.60k
    | (!ins->vex.v << 4);
14659
1.60k
  unsigned int rm_reg = ins->modrm.rm + (ins->rex & REX_B ? 8 : 0)
14660
1.60k
    + (ins->rex2 & REX_B ? 16 : 0);
14661
14662
  /* Push2/Pop2 cannot use RSP and Pop2 cannot pop two same registers.  */
14663
1.60k
  if (!ins->vex.nd || vvvv_reg == 0x4 || rm_reg == 0x4
14664
742
      || (!ins->modrm.reg
14665
459
    && vvvv_reg == rm_reg))
14666
1.05k
    {
14667
1.05k
      oappend (ins, "(bad)");
14668
1.05k
      return true;
14669
1.05k
    }
14670
14671
552
  return OP_VEX (ins, bytemode, sizeflag);
14672
1.60k
}
14673
14674
static bool
14675
JMPABS_Fixup (instr_info *ins, int bytemode, int sizeflag)
14676
32.5k
{
14677
32.5k
  if (ins->last_rex2_prefix >= 0)
14678
3.29k
    {
14679
3.29k
      uint64_t op;
14680
14681
3.29k
      if ((ins->prefixes & (PREFIX_OPCODE | PREFIX_ADDR | PREFIX_LOCK)) != 0x0
14682
2.80k
    || (ins->rex & REX_W) != 0x0)
14683
2.29k
  {
14684
2.29k
    oappend (ins, "(bad)");
14685
2.29k
    return true;
14686
2.29k
  }
14687
14688
1.00k
      if (bytemode == eAX_reg)
14689
500
  return true;
14690
14691
500
      if (!get64 (ins, &op))
14692
66
  return false;
14693
14694
434
      ins->mnemonicendp = stpcpy (ins->obuf, "jmpabs");
14695
434
      ins->rex2 |= REX2_SPECIAL;
14696
434
      oappend_immediate (ins, op);
14697
14698
434
      return true;
14699
500
    }
14700
14701
29.2k
  if (bytemode == eAX_reg)
14702
14.6k
    return OP_IMREG (ins, bytemode, sizeflag);
14703
14.6k
  return OP_OFF64 (ins, bytemode, sizeflag);
14704
29.2k
}
14705
14706
static bool
14707
CFCMOV_Fixup (instr_info *ins, int opnd, int sizeflag)
14708
6.13k
{
14709
  /* EVEX.NF is used as a direction bit in the 2-operand case to reverse the
14710
     source and destination operands.  */
14711
6.13k
  bool dstmem = !ins->vex.nd && ins->vex.nf;
14712
14713
6.13k
  if (opnd == 0)
14714
3.09k
    {
14715
3.09k
      if (dstmem)
14716
994
  return OP_E (ins, v_swap_mode, sizeflag);
14717
2.10k
      return OP_G (ins, v_mode, sizeflag);
14718
3.09k
    }
14719
14720
  /* These bits have been consumed and should be cleared.  */
14721
3.03k
  ins->vex.nf = false;
14722
3.03k
  ins->vex.mask_register_specifier = 0;
14723
14724
3.03k
  if (dstmem)
14725
928
    return OP_G (ins, v_mode, sizeflag);
14726
2.10k
  return OP_E (ins, v_mode, sizeflag);
14727
3.03k
}