Coverage Report

Created: 2026-05-11 07:54

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 annotate_immediates = false;
45
46
static bool dofloat (instr_info *, int);
47
static int putop (instr_info *, const char *, int);
48
static void oappend_with_style (instr_info *, const char *,
49
        enum disassembler_style);
50
51
static bool OP_E (instr_info *, int, int);
52
static bool OP_E_memory (instr_info *, int, int);
53
static bool OP_indirE (instr_info *, int, int);
54
static bool OP_G (instr_info *, int, int);
55
static bool OP_ST (instr_info *, int, int);
56
static bool OP_STi (instr_info *, int, int);
57
static bool OP_Skip_MODRM (instr_info *, int, int);
58
static bool OP_REG (instr_info *, int, int);
59
static bool OP_IMREG (instr_info *, int, int);
60
static bool OP_I (instr_info *, int, int);
61
static bool OP_I64 (instr_info *, int, int);
62
static bool OP_sI (instr_info *, int, int);
63
static bool OP_J (instr_info *, int, int);
64
static bool OP_SEG (instr_info *, int, int);
65
static bool OP_DIR (instr_info *, int, int);
66
static bool OP_OFF (instr_info *, int, int);
67
static bool OP_OFF64 (instr_info *, int, int);
68
static bool OP_ESreg (instr_info *, int, int);
69
static bool OP_DSreg (instr_info *, int, int);
70
static bool OP_C (instr_info *, int, int);
71
static bool OP_D (instr_info *, int, int);
72
static bool OP_T (instr_info *, int, int);
73
static bool OP_MMX (instr_info *, int, int);
74
static bool OP_XMM (instr_info *, int, int);
75
static bool OP_EM (instr_info *, int, int);
76
static bool OP_EX (instr_info *, int, int);
77
static bool OP_EMC (instr_info *, int,int);
78
static bool OP_MXC (instr_info *, int,int);
79
static bool OP_R (instr_info *, int, int);
80
static bool OP_M (instr_info *, int, int);
81
static bool OP_VEX (instr_info *, int, int);
82
static bool OP_VexR (instr_info *, int, int);
83
static bool OP_VexW (instr_info *, int, int);
84
static bool OP_Rounding (instr_info *, int, int);
85
static bool OP_REG_VexI4 (instr_info *, int, int);
86
static bool OP_VexI4 (instr_info *, int, int);
87
static bool OP_0f07 (instr_info *, int, int);
88
static bool OP_Monitor (instr_info *, int, int);
89
static bool OP_Mwait (instr_info *, int, int);
90
91
static bool PCLMUL_Fixup (instr_info *, int, int);
92
static bool VPCMP_Fixup (instr_info *, int, int);
93
static bool VPCOM_Fixup (instr_info *, int, int);
94
static bool NOP_Fixup (instr_info *, int, int);
95
static bool MONTMUL_Fixup (instr_info *, int, int);
96
static bool OP_3DNowSuffix (instr_info *, int, int);
97
static bool CMP_Fixup (instr_info *, int, int);
98
static bool REP_Fixup (instr_info *, int, int);
99
static bool SEP_Fixup (instr_info *, int, int);
100
static bool BND_Fixup (instr_info *, int, int);
101
static bool NOTRACK_Fixup (instr_info *, int, int);
102
static bool HLE_Fixup1 (instr_info *, int, int);
103
static bool HLE_Fixup2 (instr_info *, int, int);
104
static bool HLE_Fixup3 (instr_info *, int, int);
105
static bool CMPXCHG8B_Fixup (instr_info *, int, int);
106
static bool XMM_Fixup (instr_info *, int, int);
107
static bool FXSAVE_Fixup (instr_info *, int, int);
108
static bool MOVSXD_Fixup (instr_info *, int, int);
109
static bool DistinctDest_Fixup (instr_info *, int, int);
110
static bool PREFETCHI_Fixup (instr_info *, int, int);
111
static bool PUSH2_POP2_Fixup (instr_info *, int, int);
112
static bool JMPABS_Fixup (instr_info *, int, int);
113
static bool CFCMOV_Fixup (instr_info *, int, int);
114
115
static void ATTRIBUTE_PRINTF_3 i386_dis_printf (const disassemble_info *,
116
            enum disassembler_style,
117
            const char *, ...);
118
119
/* This character is used to encode style information within the output
120
   buffers.  See oappend_insert_style for more details.  */
121
157M
#define STYLE_MARKER_CHAR '\002'
122
123
/* The maximum operand buffer size.  */
124
#define MAX_OPERAND_BUFFER_SIZE 128
125
126
/* The comment buffer size.  */
127
0
#define COMMENT_BUFFER_SIZE 128
128
129
enum address_mode
130
{
131
  mode_16bit,
132
  mode_32bit,
133
  mode_64bit
134
};
135
136
static const char *prefix_name (enum address_mode, uint8_t, int);
137
138
enum x86_64_isa
139
{
140
  amd64 = 1,
141
  intel64
142
};
143
144
enum evex_type
145
{
146
  evex_default = 0,
147
  evex_from_legacy,
148
  evex_from_vex,
149
};
150
151
struct instr_info
152
{
153
  enum address_mode address_mode;
154
155
  /* Flags for the prefixes for the current instruction.  See below.  */
156
  int prefixes;
157
158
  /* REX prefix the current instruction.  See below.  */
159
  uint8_t rex;
160
  /* Bits of REX we've already used.  */
161
  uint8_t rex_used;
162
163
  /* Record W R4 X4 B4 bits for rex2.  */
164
  unsigned char rex2;
165
  /* Bits of rex2 we've already used.  */
166
  unsigned char rex2_used;
167
  unsigned char rex2_payload;
168
169
  bool need_modrm;
170
  unsigned char condition_code;
171
  unsigned char need_vex;
172
  bool has_sib;
173
174
  /* Flags for ins->prefixes which we somehow handled when printing the
175
     current instruction.  */
176
  int used_prefixes;
177
178
  /* Flags for EVEX bits which we somehow handled when printing the
179
     current instruction.  */
180
  int evex_used;
181
182
  char obuf[MAX_OPERAND_BUFFER_SIZE];
183
  char *obufp;
184
  char cbuf[COMMENT_BUFFER_SIZE];
185
  char * cbufp;
186
  char *mnemonicendp;
187
  const uint8_t *start_codep;
188
  uint8_t *codep;
189
  const uint8_t *end_codep;
190
  unsigned char nr_prefixes;
191
  signed char last_lock_prefix;
192
  signed char last_repz_prefix;
193
  signed char last_repnz_prefix;
194
  signed char last_data_prefix;
195
  signed char last_addr_prefix;
196
  signed char last_rex_prefix;
197
  signed char last_rex2_prefix;
198
  signed char last_seg_prefix;
199
  signed char fwait_prefix;
200
  /* The active segment register prefix.  */
201
  unsigned char active_seg_prefix;
202
203
7.84M
#define MAX_CODE_LENGTH 15
204
  /* We can up to 14 ins->prefixes since the maximum instruction length is
205
     15bytes.  */
206
  uint8_t all_prefixes[MAX_CODE_LENGTH - 1];
207
  disassemble_info *info;
208
209
  struct
210
  {
211
    int mod;
212
    int reg;
213
    int rm;
214
  }
215
  modrm;
216
217
  struct
218
  {
219
    int scale;
220
    int index;
221
    int base;
222
  }
223
  sib;
224
225
  struct
226
  {
227
    int register_specifier;
228
    int length;
229
    int prefix;
230
    int mask_register_specifier;
231
    int scc;
232
    int ll;
233
    bool w;
234
    bool evex;
235
    bool v;
236
    bool zeroing;
237
    bool b;
238
    bool no_broadcast;
239
    bool nf;
240
  }
241
  vex;
242
243
/* For APX EVEX-promoted prefix, EVEX.ND shares the same bit as vex.b.  */
244
10.4M
#define nd b
245
246
  enum evex_type evex_type;
247
248
  /* Remember if the current op is a jump instruction.  */
249
  bool op_is_jump;
250
251
  bool two_source_ops;
252
253
  /* Record whether EVEX masking is used incorrectly.  */
254
  bool illegal_masking;
255
256
  /* Record whether the modrm byte has been skipped.  */
257
  bool has_skipped_modrm;
258
259
  unsigned char op_ad;
260
  signed char op_index[MAX_OPERANDS];
261
  bool op_riprel[MAX_OPERANDS];
262
  char *op_out[MAX_OPERANDS];
263
  bfd_vma op_address[MAX_OPERANDS];
264
  bfd_vma start_pc;
265
266
  /* On the 386's of 1988, the maximum length of an instruction is 15 bytes.
267
   *   (see topic "Redundant ins->prefixes" in the "Differences from 8086"
268
   *   section of the "Virtual 8086 Mode" chapter.)
269
   * 'pc' should be the address of this instruction, it will
270
   *   be used to print the target address if this is a relative jump or call
271
   * The function returns the length of this instruction in bytes.
272
   */
273
  char intel_syntax;
274
  bool intel_mnemonic;
275
  char open_char;
276
  char close_char;
277
  char separator_char;
278
  char scale_char;
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
4.96M
  {             \
298
4.96M
    if (value)           \
299
4.96M
      {             \
300
4.70M
  if (ins->rex & value)       \
301
4.70M
    ins->rex_used |= (value) | REX_OPCODE; \
302
4.70M
  if (ins->rex2 & value)       \
303
4.70M
    {           \
304
65.5k
      ins->rex2_used |= (value);      \
305
65.5k
      ins->rex_used |= REX_OPCODE;   \
306
65.5k
    }            \
307
4.70M
      }              \
308
4.96M
    else            \
309
4.96M
      ins->rex_used |= REX_OPCODE;     \
310
4.96M
  }
311
312
313
39.9k
#define EVEX_b_used 1
314
100k
#define EVEX_len_used 2
315
316
317
/* {rex2} is not printed when the REX2_SPECIAL is set.  */
318
24.1k
#define REX2_SPECIAL 16
319
320
/* Flags stored in PREFIXES.  */
321
339k
#define PREFIX_REPZ 1
322
474k
#define PREFIX_REPNZ 2
323
4.04M
#define PREFIX_CS 4
324
3.42M
#define PREFIX_SS 8
325
4.00M
#define PREFIX_DS 0x10
326
3.43M
#define PREFIX_ES 0x20
327
3.53M
#define PREFIX_FS 0x40
328
3.50M
#define PREFIX_GS 0x80
329
993k
#define PREFIX_LOCK 0x100
330
8.76M
#define PREFIX_DATA 0x200
331
8.75M
#define PREFIX_ADDR 0x400
332
3.59M
#define PREFIX_FWAIT 0x800
333
6.83M
#define PREFIX_REX2 0x1000
334
26.0k
#define PREFIX_NP_OR_DATA 0x2000
335
18.5k
#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
11.8M
{
343
11.8M
  int status = -1;
344
11.8M
  struct dis_private *priv = info->private_data;
345
11.8M
  bfd_vma start = priv->insn_start + priv->fetched;
346
11.8M
  uint8_t *fetch_end = priv->the_buffer + priv->fetched;
347
11.8M
  ptrdiff_t needed = until - fetch_end;
348
349
11.8M
  if (needed <= 0)
350
3.53M
    return true;
351
352
8.32M
  if (priv->fetched + (size_t) needed <= ARRAY_SIZE (priv->the_buffer))
353
8.32M
    status = (*info->read_memory_func) (start, fetch_end, needed, info);
354
8.32M
  if (status != 0)
355
48.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
48.6k
      if (!priv->fetched)
361
881
  (*info->memory_error_func) (status, start, info);
362
48.6k
      return false;
363
48.6k
    }
364
365
8.27M
  priv->fetched += needed;
366
8.27M
  return true;
367
8.32M
}
368
369
static bool
370
fetch_modrm (instr_info *ins)
371
2.29M
{
372
2.29M
  if (!fetch_code (ins->info, ins->codep + 1))
373
6.23k
    return false;
374
375
2.29M
  ins->modrm.mod = (*ins->codep >> 6) & 3;
376
2.29M
  ins->modrm.reg = (*ins->codep >> 3) & 7;
377
2.29M
  ins->modrm.rm = *ins->codep & 7;
378
379
2.29M
  return true;
380
2.29M
}
381
382
static int
383
fetch_error (const instr_info *ins)
384
49.7k
{
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
49.7k
  const struct dis_private *priv = ins->info->private_data;
389
49.7k
  const char *name = NULL;
390
391
49.7k
  if (ins->codep <= priv->the_buffer)
392
881
    return -1;
393
394
48.8k
  if (ins->prefixes || ins->fwait_prefix >= 0 || (ins->rex & REX_OPCODE))
395
32.9k
    name = prefix_name (ins->address_mode, priv->the_buffer[0],
396
32.9k
      priv->orig_sizeflag);
397
48.8k
  if (name != NULL)
398
32.6k
    i386_dis_printf (ins->info, dis_style_mnemonic, "%s", name);
399
16.2k
  else
400
16.2k
    {
401
      /* Just print the first byte as a .byte instruction.  */
402
16.2k
      i386_dis_printf (ins->info, dis_style_assembler_directive, ".byte ");
403
16.2k
      i386_dis_printf (ins->info, dis_style_immediate, "%#x",
404
16.2k
           (unsigned int) priv->the_buffer[0]);
405
16.2k
    }
406
407
48.8k
  return 1;
408
49.7k
}
409
410
/* Possible values for prefix requirement.  */
411
6.88M
#define PREFIX_IGNORED_SHIFT  16
412
13.0k
#define PREFIX_IGNORED_REPZ (PREFIX_REPZ << PREFIX_IGNORED_SHIFT)
413
13.0k
#define PREFIX_IGNORED_REPNZ  (PREFIX_REPNZ << PREFIX_IGNORED_SHIFT)
414
13.0k
#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
6.83M
#define PREFIX_REX2_ILLEGAL (PREFIX_REX2 << PREFIX_IGNORED_SHIFT)
418
419
/* Opcode prefixes.  */
420
46.1k
#define PREFIX_OPCODE   (PREFIX_REPZ \
421
46.1k
         | PREFIX_REPNZ \
422
46.1k
         | PREFIX_DATA)
423
424
/* Prefixes ignored.  */
425
13.0k
#define PREFIX_IGNORED    (PREFIX_IGNORED_REPZ \
426
13.0k
         | PREFIX_IGNORED_REPNZ \
427
13.0k
         | 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
2.10M
#define SUFFIX_ALWAYS 4
653
8.88M
#define AFLAG 2
654
5.09M
#define DFLAG 1
655
656
enum
657
{
658
  /* byte operand */
659
  b_mode = 1,
660
  /* byte operand with operand swapped */
661
  b_swap_mode,
662
  /* byte operand, sign extend like 'T' suffix */
663
  b_T_mode,
664
  /* operand size depends on prefixes */
665
  v_mode,
666
  /* operand size depends on prefixes with operand swapped */
667
  v_swap_mode,
668
  /* operand size depends on address prefix */
669
  va_mode,
670
  /* word operand */
671
  w_mode,
672
  /* double word operand  */
673
  d_mode,
674
  /* word operand with operand swapped  */
675
  w_swap_mode,
676
  /* double word operand with operand swapped */
677
  d_swap_mode,
678
  /* quad word operand */
679
  q_mode,
680
  /* 8-byte MM operand */
681
  q_mm_mode,
682
  /* quad word operand with operand swapped */
683
  q_swap_mode,
684
  /* ten-byte operand */
685
  t_mode,
686
  /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand.  In EVEX with
687
     broadcast enabled.  */
688
  x_mode,
689
  /* Similar to x_mode, but with different EVEX mem shifts.  */
690
  evex_x_gscat_mode,
691
  /* Similar to x_mode, but with yet different EVEX mem shifts.  */
692
  bw_unit_mode,
693
  /* Similar to x_mode, but with disabled broadcast.  */
694
  evex_x_nobcst_mode,
695
  /* Similar to x_mode, but with operands swapped and disabled broadcast
696
     in EVEX.  */
697
  x_swap_mode,
698
  /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand.  In EVEX with
699
     broadcast of 16bit enabled.  */
700
  xh_mode,
701
  /* 16-byte XMM operand */
702
  xmm_mode,
703
  /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
704
     memory operand (depending on vector length).  Broadcast isn't
705
     allowed.  */
706
  xmmq_mode,
707
  /* Same as xmmq_mode, but broadcast is allowed.  */
708
  evex_half_bcst_xmmq_mode,
709
  /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
710
     memory operand (depending on vector length).  16bit broadcast.  */
711
  evex_half_bcst_xmmqh_mode,
712
  /* 16-byte XMM, word, double word or quad word operand.  */
713
  xmmdw_mode,
714
  /* 16-byte XMM, double word, quad word operand or xmm word operand.  */
715
  xmmqd_mode,
716
  /* 16-byte XMM, double word, quad word operand or xmm word operand.
717
     16bit broadcast.  */
718
  evex_half_bcst_xmmqdh_mode,
719
  /* 32-byte YMM operand */
720
  ymm_mode,
721
  /* quad word, ymmword or zmmword memory operand.  */
722
  ymmq_mode,
723
  /* TMM operand */
724
  tmm_mode,
725
  /* d_mode in 32bit, q_mode in 64bit mode.  */
726
  m_mode,
727
  /* pair of v_mode operands */
728
  a_mode,
729
  cond_jump_mode,
730
  loop_jcxz_mode,
731
  movsxd_mode,
732
  v_bnd_mode,
733
  /* like v_bnd_mode in 32bit, no RIP-rel in 64bit mode.  */
734
  v_bndmk_mode,
735
  /* operand size depends on REX.W / VEX.W.  */
736
  dq_mode,
737
  /* Displacements like v_mode without considering Intel64 ISA.  */
738
  dqw_mode,
739
  /* bounds operand */
740
  bnd_mode,
741
  /* bounds operand with operand swapped */
742
  bnd_swap_mode,
743
  /* 4- or 6-byte pointer operand */
744
  f_mode,
745
  const_1_mode,
746
  /* v_mode for indirect branch opcodes.  */
747
  indir_v_mode,
748
  /* v_mode for stack-related opcodes.  */
749
  stack_v_mode,
750
  /* non-quad operand size depends on prefixes */
751
  z_mode,
752
  /* 16-byte operand */
753
  o_mode,
754
  /* registers like d_mode, memory like b_mode.  */
755
  db_mode,
756
  /* registers like d_mode, memory like w_mode.  */
757
  dw_mode,
758
759
  /* Operand size depends on the VEX.W bit, with VSIB dword indices.  */
760
  vex_vsib_d_w_dq_mode,
761
  /* Operand size depends on the VEX.W bit, with VSIB qword indices.  */
762
  vex_vsib_q_w_dq_mode,
763
  /* mandatory non-vector SIB.  */
764
  vex_sibmem_mode,
765
766
  /* scalar, ignore vector length.  */
767
  scalar_mode,
768
769
  /* Static rounding.  */
770
  evex_rounding_mode,
771
  /* Static rounding, 64-bit mode only.  */
772
  evex_rounding_64_mode,
773
  /* Supress all exceptions.  */
774
  evex_sae_mode,
775
776
  /* Mask register operand.  */
777
  mask_mode,
778
  /* Mask register operand.  */
779
  mask_bd_mode,
780
781
  es_reg,
782
  cs_reg,
783
  ss_reg,
784
  ds_reg,
785
  fs_reg,
786
  gs_reg,
787
788
  eAX_reg,
789
  eCX_reg,
790
  eDX_reg,
791
  eBX_reg,
792
  eSP_reg,
793
  eBP_reg,
794
  eSI_reg,
795
  eDI_reg,
796
797
  al_reg,
798
  cl_reg,
799
  dl_reg,
800
  bl_reg,
801
  ah_reg,
802
  ch_reg,
803
  dh_reg,
804
  bh_reg,
805
806
  ax_reg,
807
  cx_reg,
808
  dx_reg,
809
  bx_reg,
810
  sp_reg,
811
  bp_reg,
812
  si_reg,
813
  di_reg,
814
815
  rAX_reg,
816
  rCX_reg,
817
  rDX_reg,
818
  rBX_reg,
819
  rSP_reg,
820
  rBP_reg,
821
  rSI_reg,
822
  rDI_reg,
823
824
  z_mode_ax_reg,
825
  indir_dx_reg
826
};
827
828
enum
829
{
830
  FLOATCODE = 1,
831
  USE_REG_TABLE,
832
  USE_MOD_TABLE,
833
  USE_RM_TABLE,
834
  USE_PREFIX_TABLE,
835
  USE_X86_64_TABLE,
836
  USE_X86_64_EVEX_FROM_VEX_TABLE,
837
  USE_X86_64_EVEX_PFX_TABLE,
838
  USE_X86_64_EVEX_W_TABLE,
839
  USE_X86_64_EVEX_MEM_W_TABLE,
840
  USE_3BYTE_TABLE,
841
  USE_XOP_8F_TABLE,
842
  USE_VEX_C4_TABLE,
843
  USE_VEX_C5_TABLE,
844
  USE_VEX_LEN_TABLE,
845
  USE_VEX_W_TABLE,
846
  USE_EVEX_TABLE,
847
  USE_EVEX_LEN_TABLE
848
};
849
850
#define FLOAT     NULL, { { NULL, FLOATCODE } }, 0
851
852
#define DIS386(T, I)    NULL, { { NULL, (T)}, { NULL,  (I) } }, 0
853
#define REG_TABLE(I)    DIS386 (USE_REG_TABLE, (I))
854
#define MOD_TABLE(I)    DIS386 (USE_MOD_TABLE, (I))
855
#define RM_TABLE(I)   DIS386 (USE_RM_TABLE, (I))
856
#define PREFIX_TABLE(I)   DIS386 (USE_PREFIX_TABLE, (I))
857
#define X86_64_TABLE(I)   DIS386 (USE_X86_64_TABLE, (I))
858
#define X86_64_EVEX_FROM_VEX_TABLE(I) \
859
  DIS386 (USE_X86_64_EVEX_FROM_VEX_TABLE, (I))
860
#define X86_64_EVEX_PFX_TABLE(I) DIS386 (USE_X86_64_EVEX_PFX_TABLE, (I))
861
#define X86_64_EVEX_W_TABLE(I) DIS386 (USE_X86_64_EVEX_W_TABLE, (I))
862
#define X86_64_EVEX_MEM_W_TABLE(I) DIS386 (USE_X86_64_EVEX_MEM_W_TABLE, (I))
863
#define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
864
#define XOP_8F_TABLE()    DIS386 (USE_XOP_8F_TABLE, 0)
865
#define VEX_C4_TABLE()    DIS386 (USE_VEX_C4_TABLE, 0)
866
#define VEX_C5_TABLE()    DIS386 (USE_VEX_C5_TABLE, 0)
867
#define VEX_LEN_TABLE(I)  DIS386 (USE_VEX_LEN_TABLE, (I))
868
#define VEX_W_TABLE(I)    DIS386 (USE_VEX_W_TABLE, (I))
869
#define EVEX_TABLE()    DIS386 (USE_EVEX_TABLE, 0)
870
#define EVEX_LEN_TABLE(I) DIS386 (USE_EVEX_LEN_TABLE, (I))
871
872
enum
873
{
874
  REG_80 = 0,
875
  REG_81,
876
  REG_83,
877
  REG_8F,
878
  REG_C0,
879
  REG_C1,
880
  REG_C6,
881
  REG_C7,
882
  REG_D0,
883
  REG_D1,
884
  REG_D2,
885
  REG_D3,
886
  REG_F6,
887
  REG_F7,
888
  REG_FE,
889
  REG_FF,
890
  REG_0F00,
891
  REG_0F01,
892
  REG_0F0D,
893
  REG_0F18,
894
  REG_0F1C_P_0_MOD_0,
895
  REG_0F1E_P_1_MOD_3,
896
  REG_0F38D8_PREFIX_1,
897
  REG_0F3A0F_P_1,
898
  REG_0F71,
899
  REG_0F72,
900
  REG_0F73,
901
  REG_0FA6,
902
  REG_0FA7,
903
  REG_0FAE,
904
  REG_0FBA,
905
  REG_0FC7,
906
  REG_VEX_0F71,
907
  REG_VEX_0F72,
908
  REG_VEX_0F73,
909
  REG_VEX_0FAE,
910
  REG_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0,
911
  REG_VEX_0F38F3_L_0_P_0,
912
  REG_VEX_MAP7_F6_L_0_W_0,
913
  REG_VEX_MAP7_F8_L_0_W_0,
914
915
  REG_XOP_09_01_L_0,
916
  REG_XOP_09_02_L_0,
917
  REG_XOP_09_12_L_0,
918
  REG_XOP_0A_12_L_0,
919
920
  REG_EVEX_0F71,
921
  REG_EVEX_0F72,
922
  REG_EVEX_0F73,
923
  REG_EVEX_0F38C6_L_2,
924
  REG_EVEX_0F38C7_L_2,
925
  REG_EVEX_MAP4_80,
926
  REG_EVEX_MAP4_81,
927
  REG_EVEX_MAP4_83,
928
  REG_EVEX_MAP4_8F,
929
  REG_EVEX_MAP4_F6,
930
  REG_EVEX_MAP4_F7,
931
  REG_EVEX_MAP4_FE,
932
  REG_EVEX_MAP4_FF,
933
};
934
935
enum
936
{
937
  MOD_62_32BIT = 0,
938
  MOD_C4_32BIT,
939
  MOD_C5_32BIT,
940
  MOD_0F01_REG_0,
941
  MOD_0F01_REG_1,
942
  MOD_0F01_REG_2,
943
  MOD_0F01_REG_3,
944
  MOD_0F01_REG_5,
945
  MOD_0F01_REG_7,
946
  MOD_0F12_PREFIX_0,
947
  MOD_0F16_PREFIX_0,
948
  MOD_0F18_REG_0,
949
  MOD_0F18_REG_1,
950
  MOD_0F18_REG_2,
951
  MOD_0F18_REG_3,
952
  MOD_0F18_REG_4,
953
  MOD_0F18_REG_6,
954
  MOD_0F18_REG_7,
955
  MOD_0F1A_PREFIX_0,
956
  MOD_0F1B_PREFIX_0,
957
  MOD_0F1B_PREFIX_1,
958
  MOD_0F1C_PREFIX_0,
959
  MOD_0F1E_PREFIX_1,
960
  MOD_0FAE_REG_0,
961
  MOD_0FAE_REG_1,
962
  MOD_0FAE_REG_2,
963
  MOD_0FAE_REG_3,
964
  MOD_0FAE_REG_4,
965
  MOD_0FAE_REG_5,
966
  MOD_0FAE_REG_6,
967
  MOD_0FAE_REG_7,
968
  MOD_0FC7_REG_6,
969
  MOD_0FC7_REG_7,
970
  MOD_0F38DC_PREFIX_1,
971
  MOD_0F38F8,
972
973
  MOD_VEX_0F3849_X86_64_L_0_W_0,
974
975
  MOD_EVEX_MAP4_60,
976
  MOD_EVEX_MAP4_61,
977
  MOD_EVEX_MAP4_F8_P_1,
978
  MOD_EVEX_MAP4_F8_P_3,
979
};
980
981
enum
982
{
983
  RM_C6_REG_7 = 0,
984
  RM_C7_REG_7,
985
  RM_0F01_REG_0,
986
  RM_0F01_REG_1,
987
  RM_0F01_REG_2,
988
  RM_0F01_REG_3,
989
  RM_0F01_REG_5_MOD_3,
990
  RM_0F01_REG_7_MOD_3,
991
  RM_0F1E_P_1_MOD_3_REG_7,
992
  RM_0FAE_REG_6_MOD_3_P_0,
993
  RM_0FAE_REG_7_MOD_3,
994
  RM_0F3A0F_P_1_R_0,
995
996
  RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0_R_0,
997
  RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_3,
998
};
999
1000
enum
1001
{
1002
  PREFIX_90 = 0,
1003
  PREFIX_0F00_REG_6_X86_64,
1004
  PREFIX_0F01_REG_0_MOD_3_RM_6,
1005
  PREFIX_0F01_REG_0_MOD_3_RM_7,
1006
  PREFIX_0F01_REG_1_RM_2,
1007
  PREFIX_0F01_REG_1_RM_4,
1008
  PREFIX_0F01_REG_1_RM_5,
1009
  PREFIX_0F01_REG_1_RM_6,
1010
  PREFIX_0F01_REG_1_RM_7,
1011
  PREFIX_0F01_REG_3_RM_1,
1012
  PREFIX_0F01_REG_5_MOD_0,
1013
  PREFIX_0F01_REG_5_MOD_3_RM_0,
1014
  PREFIX_0F01_REG_5_MOD_3_RM_1,
1015
  PREFIX_0F01_REG_5_MOD_3_RM_2,
1016
  PREFIX_0F01_REG_5_MOD_3_RM_4,
1017
  PREFIX_0F01_REG_5_MOD_3_RM_5,
1018
  PREFIX_0F01_REG_5_MOD_3_RM_6,
1019
  PREFIX_0F01_REG_5_MOD_3_RM_7,
1020
  PREFIX_0F01_REG_7_MOD_3_RM_2,
1021
  PREFIX_0F01_REG_7_MOD_3_RM_5,
1022
  PREFIX_0F01_REG_7_MOD_3_RM_6,
1023
  PREFIX_0F01_REG_7_MOD_3_RM_7,
1024
  PREFIX_0F09,
1025
  PREFIX_0F10,
1026
  PREFIX_0F11,
1027
  PREFIX_0F12,
1028
  PREFIX_0F16,
1029
  PREFIX_0F18_REG_6_MOD_0_X86_64,
1030
  PREFIX_0F18_REG_7_MOD_0_X86_64,
1031
  PREFIX_0F1A,
1032
  PREFIX_0F1B,
1033
  PREFIX_0F1C,
1034
  PREFIX_0F1E,
1035
  PREFIX_0F2A,
1036
  PREFIX_0F2B,
1037
  PREFIX_0F2C,
1038
  PREFIX_0F2D,
1039
  PREFIX_0F2E,
1040
  PREFIX_0F2F,
1041
  PREFIX_0F51,
1042
  PREFIX_0F52,
1043
  PREFIX_0F53,
1044
  PREFIX_0F58,
1045
  PREFIX_0F59,
1046
  PREFIX_0F5A,
1047
  PREFIX_0F5B,
1048
  PREFIX_0F5C,
1049
  PREFIX_0F5D,
1050
  PREFIX_0F5E,
1051
  PREFIX_0F5F,
1052
  PREFIX_0F60,
1053
  PREFIX_0F61,
1054
  PREFIX_0F62,
1055
  PREFIX_0F6F,
1056
  PREFIX_0F70,
1057
  PREFIX_0F78,
1058
  PREFIX_0F79,
1059
  PREFIX_0F7C,
1060
  PREFIX_0F7D,
1061
  PREFIX_0F7E,
1062
  PREFIX_0F7F,
1063
  PREFIX_0FA6_REG_0,
1064
  PREFIX_0FA6_REG_5,
1065
  PREFIX_0FA7_REG_6,
1066
  PREFIX_0FAE_REG_0_MOD_3,
1067
  PREFIX_0FAE_REG_1_MOD_3,
1068
  PREFIX_0FAE_REG_2_MOD_3,
1069
  PREFIX_0FAE_REG_3_MOD_3,
1070
  PREFIX_0FAE_REG_4_MOD_0,
1071
  PREFIX_0FAE_REG_4_MOD_3,
1072
  PREFIX_0FAE_REG_5_MOD_3,
1073
  PREFIX_0FAE_REG_6_MOD_0,
1074
  PREFIX_0FAE_REG_6_MOD_3,
1075
  PREFIX_0FAE_REG_7_MOD_0,
1076
  PREFIX_0FB8,
1077
  PREFIX_0FBC,
1078
  PREFIX_0FBD,
1079
  PREFIX_0FC2,
1080
  PREFIX_0FC7_REG_6_MOD_0,
1081
  PREFIX_0FC7_REG_6_MOD_3,
1082
  PREFIX_0FC7_REG_7_MOD_3,
1083
  PREFIX_0FD0,
1084
  PREFIX_0FD6,
1085
  PREFIX_0FE6,
1086
  PREFIX_0FE7,
1087
  PREFIX_0FF0,
1088
  PREFIX_0FF7,
1089
  PREFIX_0F38D8,
1090
  PREFIX_0F38DC,
1091
  PREFIX_0F38DD,
1092
  PREFIX_0F38DE,
1093
  PREFIX_0F38DF,
1094
  PREFIX_0F38F0,
1095
  PREFIX_0F38F1,
1096
  PREFIX_0F38F6,
1097
  PREFIX_0F38F8_M_0,
1098
  PREFIX_0F38F8_M_1_X86_64,
1099
  PREFIX_0F38FA,
1100
  PREFIX_0F38FB,
1101
  PREFIX_0F38FC,
1102
  PREFIX_0F3A0F,
1103
  PREFIX_VEX_0F12,
1104
  PREFIX_VEX_0F16,
1105
  PREFIX_VEX_0F2A,
1106
  PREFIX_VEX_0F2C,
1107
  PREFIX_VEX_0F2D,
1108
  PREFIX_VEX_0F41_L_1_W_0,
1109
  PREFIX_VEX_0F41_L_1_W_1,
1110
  PREFIX_VEX_0F42_L_1_W_0,
1111
  PREFIX_VEX_0F42_L_1_W_1,
1112
  PREFIX_VEX_0F44_L_0_W_0,
1113
  PREFIX_VEX_0F44_L_0_W_1,
1114
  PREFIX_VEX_0F45_L_1_W_0,
1115
  PREFIX_VEX_0F45_L_1_W_1,
1116
  PREFIX_VEX_0F46_L_1_W_0,
1117
  PREFIX_VEX_0F46_L_1_W_1,
1118
  PREFIX_VEX_0F47_L_1_W_0,
1119
  PREFIX_VEX_0F47_L_1_W_1,
1120
  PREFIX_VEX_0F4A_L_1_W_0,
1121
  PREFIX_VEX_0F4A_L_1_W_1,
1122
  PREFIX_VEX_0F4B_L_1_W_0,
1123
  PREFIX_VEX_0F4B_L_1_W_1,
1124
  PREFIX_VEX_0F6F,
1125
  PREFIX_VEX_0F70,
1126
  PREFIX_VEX_0F7E,
1127
  PREFIX_VEX_0F7F,
1128
  PREFIX_VEX_0F90_L_0_W_0,
1129
  PREFIX_VEX_0F90_L_0_W_1,
1130
  PREFIX_VEX_0F91_L_0_W_0,
1131
  PREFIX_VEX_0F91_L_0_W_1,
1132
  PREFIX_VEX_0F92_L_0_W_0,
1133
  PREFIX_VEX_0F92_L_0_W_1,
1134
  PREFIX_VEX_0F93_L_0_W_0,
1135
  PREFIX_VEX_0F93_L_0_W_1,
1136
  PREFIX_VEX_0F98_L_0_W_0,
1137
  PREFIX_VEX_0F98_L_0_W_1,
1138
  PREFIX_VEX_0F99_L_0_W_0,
1139
  PREFIX_VEX_0F99_L_0_W_1,
1140
  PREFIX_VEX_0F3848_X86_64_L_0_W_0,
1141
  PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_0,
1142
  PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_1,
1143
  PREFIX_VEX_0F384A_X86_64_W_0_L_0,
1144
  PREFIX_VEX_0F384B_X86_64_L_0_W_0,
1145
  PREFIX_VEX_0F3850_W_0,
1146
  PREFIX_VEX_0F3851_W_0,
1147
  PREFIX_VEX_0F385C_X86_64_L_0_W_0,
1148
  PREFIX_VEX_0F385E_X86_64_L_0_W_0,
1149
  PREFIX_VEX_0F385F_X86_64_L_0_W_0,
1150
  PREFIX_VEX_0F386B_X86_64_L_0_W_0,
1151
  PREFIX_VEX_0F386C_X86_64_L_0_W_0,
1152
  PREFIX_VEX_0F386E_X86_64_L_0_W_0,
1153
  PREFIX_VEX_0F386F_X86_64_L_0_W_0,
1154
  PREFIX_VEX_0F3872,
1155
  PREFIX_VEX_0F38B0_W_0,
1156
  PREFIX_VEX_0F38B1_W_0,
1157
  PREFIX_VEX_0F38D2_W_0,
1158
  PREFIX_VEX_0F38D3_W_0,
1159
  PREFIX_VEX_0F38CB,
1160
  PREFIX_VEX_0F38CC,
1161
  PREFIX_VEX_0F38CD,
1162
  PREFIX_VEX_0F38DA_W_0,
1163
  PREFIX_VEX_0F38F2_L_0,
1164
  PREFIX_VEX_0F38F3_L_0,
1165
  PREFIX_VEX_0F38F5_L_0,
1166
  PREFIX_VEX_0F38F6_L_0,
1167
  PREFIX_VEX_0F38F7_L_0,
1168
  PREFIX_VEX_0F3AF0_L_0,
1169
  PREFIX_VEX_MAP5_F8_X86_64_L_0_W_0,
1170
  PREFIX_VEX_MAP5_F9_X86_64_L_0_W_0,
1171
  PREFIX_VEX_MAP5_FD_X86_64_L_0_W_0,
1172
  PREFIX_VEX_MAP7_F6_L_0_W_0_R_0_X86_64,
1173
  PREFIX_VEX_MAP7_F8_L_0_W_0_R_0_X86_64,
1174
1175
  PREFIX_EVEX_0F2E,
1176
  PREFIX_EVEX_0F2F,
1177
  PREFIX_EVEX_0F5B,
1178
  PREFIX_EVEX_0F6F,
1179
  PREFIX_EVEX_0F70,
1180
  PREFIX_EVEX_0F78,
1181
  PREFIX_EVEX_0F79,
1182
  PREFIX_EVEX_0F7A,
1183
  PREFIX_EVEX_0F7B,
1184
  PREFIX_EVEX_0F7E,
1185
  PREFIX_EVEX_0F7F,
1186
  PREFIX_EVEX_0FC2,
1187
  PREFIX_EVEX_0FE6,
1188
  PREFIX_EVEX_0F3810,
1189
  PREFIX_EVEX_0F3811,
1190
  PREFIX_EVEX_0F3812,
1191
  PREFIX_EVEX_0F3813,
1192
  PREFIX_EVEX_0F3814,
1193
  PREFIX_EVEX_0F3815,
1194
  PREFIX_EVEX_0F3820,
1195
  PREFIX_EVEX_0F3821,
1196
  PREFIX_EVEX_0F3822,
1197
  PREFIX_EVEX_0F3823,
1198
  PREFIX_EVEX_0F3824,
1199
  PREFIX_EVEX_0F3825,
1200
  PREFIX_EVEX_0F3826,
1201
  PREFIX_EVEX_0F3827,
1202
  PREFIX_EVEX_0F3828,
1203
  PREFIX_EVEX_0F3829,
1204
  PREFIX_EVEX_0F382A,
1205
  PREFIX_EVEX_0F3830,
1206
  PREFIX_EVEX_0F3831,
1207
  PREFIX_EVEX_0F3832,
1208
  PREFIX_EVEX_0F3833,
1209
  PREFIX_EVEX_0F3834,
1210
  PREFIX_EVEX_0F3835,
1211
  PREFIX_EVEX_0F3838,
1212
  PREFIX_EVEX_0F3839,
1213
  PREFIX_EVEX_0F383A,
1214
  PREFIX_EVEX_0F384A_X86_64_W_0_L_2,
1215
  PREFIX_EVEX_0F3852,
1216
  PREFIX_EVEX_0F3853,
1217
  PREFIX_EVEX_0F3868,
1218
  PREFIX_EVEX_0F386D_X86_64_W_0_L_2,
1219
  PREFIX_EVEX_0F3872,
1220
  PREFIX_EVEX_0F3874,
1221
  PREFIX_EVEX_0F389A,
1222
  PREFIX_EVEX_0F389B,
1223
  PREFIX_EVEX_0F38AA,
1224
  PREFIX_EVEX_0F38AB,
1225
1226
  PREFIX_EVEX_0F3A07_X86_64_W_0_L_2,
1227
  PREFIX_EVEX_0F3A08,
1228
  PREFIX_EVEX_0F3A0A,
1229
  PREFIX_EVEX_0F3A26,
1230
  PREFIX_EVEX_0F3A27,
1231
  PREFIX_EVEX_0F3A42_W_0,
1232
  PREFIX_EVEX_0F3A52,
1233
  PREFIX_EVEX_0F3A53,
1234
  PREFIX_EVEX_0F3A56,
1235
  PREFIX_EVEX_0F3A57,
1236
  PREFIX_EVEX_0F3A66,
1237
  PREFIX_EVEX_0F3A67,
1238
  PREFIX_EVEX_0F3A77_X86_64_W_0_L_2,
1239
  PREFIX_EVEX_0F3AC2,
1240
1241
  PREFIX_EVEX_MAP4_4x,
1242
  PREFIX_EVEX_MAP4_F0,
1243
  PREFIX_EVEX_MAP4_F1,
1244
  PREFIX_EVEX_MAP4_F2,
1245
  PREFIX_EVEX_MAP4_F8,
1246
1247
  PREFIX_EVEX_MAP5_10,
1248
  PREFIX_EVEX_MAP5_11,
1249
  PREFIX_EVEX_MAP5_18,
1250
  PREFIX_EVEX_MAP5_1B,
1251
  PREFIX_EVEX_MAP5_1D,
1252
  PREFIX_EVEX_MAP5_1E,
1253
  PREFIX_EVEX_MAP5_2A,
1254
  PREFIX_EVEX_MAP5_2C,
1255
  PREFIX_EVEX_MAP5_2D,
1256
  PREFIX_EVEX_MAP5_2E,
1257
  PREFIX_EVEX_MAP5_2F,
1258
  PREFIX_EVEX_MAP5_51,
1259
  PREFIX_EVEX_MAP5_58,
1260
  PREFIX_EVEX_MAP5_59,
1261
  PREFIX_EVEX_MAP5_5A,
1262
  PREFIX_EVEX_MAP5_5B,
1263
  PREFIX_EVEX_MAP5_5C,
1264
  PREFIX_EVEX_MAP5_5D,
1265
  PREFIX_EVEX_MAP5_5E,
1266
  PREFIX_EVEX_MAP5_5F,
1267
  PREFIX_EVEX_MAP5_68,
1268
  PREFIX_EVEX_MAP5_69,
1269
  PREFIX_EVEX_MAP5_6A,
1270
  PREFIX_EVEX_MAP5_6B,
1271
  PREFIX_EVEX_MAP5_6C,
1272
  PREFIX_EVEX_MAP5_6D,
1273
  PREFIX_EVEX_MAP5_6E_L_0,
1274
  PREFIX_EVEX_MAP5_6F_X86_64,
1275
  PREFIX_EVEX_MAP5_74,
1276
  PREFIX_EVEX_MAP5_78,
1277
  PREFIX_EVEX_MAP5_79,
1278
  PREFIX_EVEX_MAP5_7A,
1279
  PREFIX_EVEX_MAP5_7B,
1280
  PREFIX_EVEX_MAP5_7C,
1281
  PREFIX_EVEX_MAP5_7D,
1282
  PREFIX_EVEX_MAP5_7E_L_0,
1283
1284
  PREFIX_EVEX_MAP6_13,
1285
  PREFIX_EVEX_MAP6_2C,
1286
  PREFIX_EVEX_MAP6_42,
1287
  PREFIX_EVEX_MAP6_4C,
1288
  PREFIX_EVEX_MAP6_4E,
1289
  PREFIX_EVEX_MAP6_56,
1290
  PREFIX_EVEX_MAP6_57,
1291
  PREFIX_EVEX_MAP6_98,
1292
  PREFIX_EVEX_MAP6_9A,
1293
  PREFIX_EVEX_MAP6_9C,
1294
  PREFIX_EVEX_MAP6_9E,
1295
  PREFIX_EVEX_MAP6_A8,
1296
  PREFIX_EVEX_MAP6_AA,
1297
  PREFIX_EVEX_MAP6_AC,
1298
  PREFIX_EVEX_MAP6_AE,
1299
  PREFIX_EVEX_MAP6_B8,
1300
  PREFIX_EVEX_MAP6_BA,
1301
  PREFIX_EVEX_MAP6_BC,
1302
  PREFIX_EVEX_MAP6_BE,
1303
  PREFIX_EVEX_MAP6_D6,
1304
  PREFIX_EVEX_MAP6_D7,
1305
};
1306
1307
enum
1308
{
1309
  X86_64_06 = 0,
1310
  X86_64_07,
1311
  X86_64_0E,
1312
  X86_64_16,
1313
  X86_64_17,
1314
  X86_64_1E,
1315
  X86_64_1F,
1316
  X86_64_27,
1317
  X86_64_2F,
1318
  X86_64_37,
1319
  X86_64_3F,
1320
  X86_64_60,
1321
  X86_64_61,
1322
  X86_64_62,
1323
  X86_64_63,
1324
  X86_64_6D,
1325
  X86_64_6F,
1326
  X86_64_82,
1327
  X86_64_9A,
1328
  X86_64_C2,
1329
  X86_64_C3,
1330
  X86_64_C4,
1331
  X86_64_C5,
1332
  X86_64_CE,
1333
  X86_64_D4,
1334
  X86_64_D5,
1335
  X86_64_D6,
1336
  X86_64_E8,
1337
  X86_64_E9,
1338
  X86_64_EA,
1339
  X86_64_0F00_REG_6,
1340
  X86_64_0F01_REG_0,
1341
  X86_64_0F01_REG_0_MOD_3_RM_6_P_1,
1342
  X86_64_0F01_REG_0_MOD_3_RM_6_P_3,
1343
  X86_64_0F01_REG_0_MOD_3_RM_7_P_0,
1344
  X86_64_0F01_REG_1,
1345
  X86_64_0F01_REG_1_RM_2_PREFIX_1,
1346
  X86_64_0F01_REG_1_RM_2_PREFIX_3,
1347
  X86_64_0F01_REG_1_RM_5_PREFIX_2,
1348
  X86_64_0F01_REG_1_RM_6_PREFIX_2,
1349
  X86_64_0F01_REG_1_RM_7_PREFIX_2,
1350
  X86_64_0F01_REG_2,
1351
  X86_64_0F01_REG_3,
1352
  X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1,
1353
  X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1,
1354
  X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1,
1355
  X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1,
1356
  X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_1,
1357
  X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_3,
1358
  X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1,
1359
  X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3,
1360
  X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1,
1361
  X86_64_0F18_REG_6_MOD_0,
1362
  X86_64_0F18_REG_7_MOD_0,
1363
  X86_64_0F24,
1364
  X86_64_0F26,
1365
  X86_64_0F388A,
1366
  X86_64_0F388B,
1367
  X86_64_0F38F8_M_1,
1368
  X86_64_0FAE_REG_0_MOD_3_PREFIX_1,
1369
  X86_64_0FAE_REG_1_MOD_3_PREFIX_1,
1370
  X86_64_0FAE_REG_2_MOD_3_PREFIX_1,
1371
  X86_64_0FAE_REG_3_MOD_3_PREFIX_1,
1372
  X86_64_0FC7_REG_6_MOD_3_PREFIX_1,
1373
1374
  X86_64_VEX_0F3848,
1375
  X86_64_VEX_0F3849,
1376
  X86_64_VEX_0F384A,
1377
  X86_64_VEX_0F384B,
1378
  X86_64_VEX_0F385C,
1379
  X86_64_VEX_0F385E,
1380
  X86_64_VEX_0F385F,
1381
  X86_64_VEX_0F386B,
1382
  X86_64_VEX_0F386C,
1383
  X86_64_VEX_0F386E,
1384
  X86_64_VEX_0F386F,
1385
  X86_64_VEX_0F38Ex,
1386
1387
  X86_64_VEX_MAP5_F8,
1388
  X86_64_VEX_MAP5_F9,
1389
  X86_64_VEX_MAP5_FD,
1390
  X86_64_VEX_MAP7_F6_L_0_W_0_R_0,
1391
  X86_64_VEX_MAP7_F8_L_0_W_0_R_0,
1392
1393
  X86_64_EVEX_0F384A,
1394
  X86_64_EVEX_0F386D,
1395
  X86_64_EVEX_0F3A07,
1396
  X86_64_EVEX_0F3A77,
1397
1398
  X86_64_EVEX_MAP5_6F,
1399
};
1400
1401
enum
1402
{
1403
  THREE_BYTE_0F38 = 0,
1404
  THREE_BYTE_0F3A
1405
};
1406
1407
enum
1408
{
1409
  XOP_08 = 0,
1410
  XOP_09,
1411
  XOP_0A
1412
};
1413
1414
enum
1415
{
1416
  VEX_0F = 0,
1417
  VEX_0F38,
1418
  VEX_0F3A,
1419
  VEX_MAP5,
1420
  VEX_MAP7,
1421
};
1422
1423
enum
1424
{
1425
  EVEX_0F = 0,
1426
  EVEX_0F38,
1427
  EVEX_0F3A,
1428
  EVEX_MAP4,
1429
  EVEX_MAP5,
1430
  EVEX_MAP6,
1431
  EVEX_MAP7,
1432
};
1433
1434
enum
1435
{
1436
  VEX_LEN_0F12_P_0 = 0,
1437
  VEX_LEN_0F12_P_2,
1438
  VEX_LEN_0F13,
1439
  VEX_LEN_0F16_P_0,
1440
  VEX_LEN_0F16_P_2,
1441
  VEX_LEN_0F17,
1442
  VEX_LEN_0F41,
1443
  VEX_LEN_0F42,
1444
  VEX_LEN_0F44,
1445
  VEX_LEN_0F45,
1446
  VEX_LEN_0F46,
1447
  VEX_LEN_0F47,
1448
  VEX_LEN_0F4A,
1449
  VEX_LEN_0F4B,
1450
  VEX_LEN_0F6E,
1451
  VEX_LEN_0F77,
1452
  VEX_LEN_0F7E_P_1,
1453
  VEX_LEN_0F7E_P_2,
1454
  VEX_LEN_0F90,
1455
  VEX_LEN_0F91,
1456
  VEX_LEN_0F92,
1457
  VEX_LEN_0F93,
1458
  VEX_LEN_0F98,
1459
  VEX_LEN_0F99,
1460
  VEX_LEN_0FAE_R_2,
1461
  VEX_LEN_0FAE_R_3,
1462
  VEX_LEN_0FC4,
1463
  VEX_LEN_0FD6,
1464
  VEX_LEN_0F3816,
1465
  VEX_LEN_0F3819,
1466
  VEX_LEN_0F381A,
1467
  VEX_LEN_0F3836,
1468
  VEX_LEN_0F3841,
1469
  VEX_LEN_0F3848_X86_64,
1470
  VEX_LEN_0F3849_X86_64,
1471
  VEX_LEN_0F384A_X86_64_W_0,
1472
  VEX_LEN_0F384B_X86_64,
1473
  VEX_LEN_0F385A,
1474
  VEX_LEN_0F385C_X86_64,
1475
  VEX_LEN_0F385E_X86_64,
1476
  VEX_LEN_0F385F_X86_64,
1477
  VEX_LEN_0F386B_X86_64,
1478
  VEX_LEN_0F386C_X86_64,
1479
  VEX_LEN_0F386E_X86_64,
1480
  VEX_LEN_0F386F_X86_64,
1481
  VEX_LEN_0F38CB_P_3_W_0,
1482
  VEX_LEN_0F38CC_P_3_W_0,
1483
  VEX_LEN_0F38CD_P_3_W_0,
1484
  VEX_LEN_0F38DA_W_0_P_0,
1485
  VEX_LEN_0F38DA_W_0_P_2,
1486
  VEX_LEN_0F38DB,
1487
  VEX_LEN_0F38F2,
1488
  VEX_LEN_0F38F3,
1489
  VEX_LEN_0F38F5,
1490
  VEX_LEN_0F38F6,
1491
  VEX_LEN_0F38F7,
1492
  VEX_LEN_0F3A00,
1493
  VEX_LEN_0F3A01,
1494
  VEX_LEN_0F3A06,
1495
  VEX_LEN_0F3A14,
1496
  VEX_LEN_0F3A15,
1497
  VEX_LEN_0F3A16,
1498
  VEX_LEN_0F3A17,
1499
  VEX_LEN_0F3A18,
1500
  VEX_LEN_0F3A19,
1501
  VEX_LEN_0F3A20,
1502
  VEX_LEN_0F3A21,
1503
  VEX_LEN_0F3A22,
1504
  VEX_LEN_0F3A30,
1505
  VEX_LEN_0F3A31,
1506
  VEX_LEN_0F3A32,
1507
  VEX_LEN_0F3A33,
1508
  VEX_LEN_0F3A38,
1509
  VEX_LEN_0F3A39,
1510
  VEX_LEN_0F3A41,
1511
  VEX_LEN_0F3A46,
1512
  VEX_LEN_0F3A60,
1513
  VEX_LEN_0F3A61,
1514
  VEX_LEN_0F3A62,
1515
  VEX_LEN_0F3A63,
1516
  VEX_LEN_0F3ADE_W_0,
1517
  VEX_LEN_0F3ADF,
1518
  VEX_LEN_0F3AF0,
1519
  VEX_LEN_MAP5_F8_X86_64,
1520
  VEX_LEN_MAP5_F9_X86_64,
1521
  VEX_LEN_MAP5_FD_X86_64,
1522
  VEX_LEN_MAP7_F6,
1523
  VEX_LEN_MAP7_F8,
1524
  VEX_LEN_XOP_08_85,
1525
  VEX_LEN_XOP_08_86,
1526
  VEX_LEN_XOP_08_87,
1527
  VEX_LEN_XOP_08_8E,
1528
  VEX_LEN_XOP_08_8F,
1529
  VEX_LEN_XOP_08_95,
1530
  VEX_LEN_XOP_08_96,
1531
  VEX_LEN_XOP_08_97,
1532
  VEX_LEN_XOP_08_9E,
1533
  VEX_LEN_XOP_08_9F,
1534
  VEX_LEN_XOP_08_A3,
1535
  VEX_LEN_XOP_08_A6,
1536
  VEX_LEN_XOP_08_B6,
1537
  VEX_LEN_XOP_08_C0,
1538
  VEX_LEN_XOP_08_C1,
1539
  VEX_LEN_XOP_08_C2,
1540
  VEX_LEN_XOP_08_C3,
1541
  VEX_LEN_XOP_08_CC,
1542
  VEX_LEN_XOP_08_CD,
1543
  VEX_LEN_XOP_08_CE,
1544
  VEX_LEN_XOP_08_CF,
1545
  VEX_LEN_XOP_08_EC,
1546
  VEX_LEN_XOP_08_ED,
1547
  VEX_LEN_XOP_08_EE,
1548
  VEX_LEN_XOP_08_EF,
1549
  VEX_LEN_XOP_09_01,
1550
  VEX_LEN_XOP_09_02,
1551
  VEX_LEN_XOP_09_12,
1552
  VEX_LEN_XOP_09_82_W_0,
1553
  VEX_LEN_XOP_09_83_W_0,
1554
  VEX_LEN_XOP_09_90,
1555
  VEX_LEN_XOP_09_91,
1556
  VEX_LEN_XOP_09_92,
1557
  VEX_LEN_XOP_09_93,
1558
  VEX_LEN_XOP_09_94,
1559
  VEX_LEN_XOP_09_95,
1560
  VEX_LEN_XOP_09_96,
1561
  VEX_LEN_XOP_09_97,
1562
  VEX_LEN_XOP_09_98,
1563
  VEX_LEN_XOP_09_99,
1564
  VEX_LEN_XOP_09_9A,
1565
  VEX_LEN_XOP_09_9B,
1566
  VEX_LEN_XOP_09_C1,
1567
  VEX_LEN_XOP_09_C2,
1568
  VEX_LEN_XOP_09_C3,
1569
  VEX_LEN_XOP_09_C6,
1570
  VEX_LEN_XOP_09_C7,
1571
  VEX_LEN_XOP_09_CB,
1572
  VEX_LEN_XOP_09_D1,
1573
  VEX_LEN_XOP_09_D2,
1574
  VEX_LEN_XOP_09_D3,
1575
  VEX_LEN_XOP_09_D6,
1576
  VEX_LEN_XOP_09_D7,
1577
  VEX_LEN_XOP_09_DB,
1578
  VEX_LEN_XOP_09_E1,
1579
  VEX_LEN_XOP_09_E2,
1580
  VEX_LEN_XOP_09_E3,
1581
  VEX_LEN_XOP_0A_12,
1582
};
1583
1584
enum
1585
{
1586
  EVEX_LEN_0F7E_P_1_W_0 = 0,
1587
  EVEX_LEN_0FD6_P_2_W_0,
1588
  EVEX_LEN_0F3816,
1589
  EVEX_LEN_0F3819,
1590
  EVEX_LEN_0F381A,
1591
  EVEX_LEN_0F381B,
1592
  EVEX_LEN_0F3836,
1593
  EVEX_LEN_0F384A_X86_64_W_0,
1594
  EVEX_LEN_0F385A,
1595
  EVEX_LEN_0F385B,
1596
  EVEX_LEN_0F386D_X86_64_W_0,
1597
  EVEX_LEN_0F38C6,
1598
  EVEX_LEN_0F38C7,
1599
  EVEX_LEN_0F3A00,
1600
  EVEX_LEN_0F3A01,
1601
  EVEX_LEN_0F3A07_X86_64_W_0,
1602
  EVEX_LEN_0F3A18,
1603
  EVEX_LEN_0F3A19,
1604
  EVEX_LEN_0F3A1A,
1605
  EVEX_LEN_0F3A1B,
1606
  EVEX_LEN_0F3A23,
1607
  EVEX_LEN_0F3A38,
1608
  EVEX_LEN_0F3A39,
1609
  EVEX_LEN_0F3A3A,
1610
  EVEX_LEN_0F3A3B,
1611
  EVEX_LEN_0F3A43,
1612
  EVEX_LEN_0F3A77_X86_64_W_0,
1613
1614
  EVEX_LEN_MAP5_6E,
1615
  EVEX_LEN_MAP5_7E,
1616
  EVEX_LEN_MAP6_80_W_0,
1617
  EVEX_LEN_MAP6_80_W_1,
1618
};
1619
1620
enum
1621
{
1622
  VEX_W_0F41_L_1 = 0,
1623
  VEX_W_0F42_L_1,
1624
  VEX_W_0F44_L_0,
1625
  VEX_W_0F45_L_1,
1626
  VEX_W_0F46_L_1,
1627
  VEX_W_0F47_L_1,
1628
  VEX_W_0F4A_L_1,
1629
  VEX_W_0F4B_L_1,
1630
  VEX_W_0F90_L_0,
1631
  VEX_W_0F91_L_0,
1632
  VEX_W_0F92_L_0,
1633
  VEX_W_0F93_L_0,
1634
  VEX_W_0F98_L_0,
1635
  VEX_W_0F99_L_0,
1636
  VEX_W_0F380C,
1637
  VEX_W_0F380D,
1638
  VEX_W_0F380E,
1639
  VEX_W_0F380F,
1640
  VEX_W_0F3813,
1641
  VEX_W_0F3816_L_1,
1642
  VEX_W_0F3818,
1643
  VEX_W_0F3819_L_1,
1644
  VEX_W_0F381A_L_1,
1645
  VEX_W_0F382C,
1646
  VEX_W_0F382D,
1647
  VEX_W_0F382E,
1648
  VEX_W_0F382F,
1649
  VEX_W_0F3836,
1650
  VEX_W_0F3846,
1651
  VEX_W_0F3848_X86_64_L_0,
1652
  VEX_W_0F3849_X86_64_L_0,
1653
  VEX_W_0F384A_X86_64,
1654
  VEX_W_0F384B_X86_64_L_0,
1655
  VEX_W_0F3850,
1656
  VEX_W_0F3851,
1657
  VEX_W_0F3852,
1658
  VEX_W_0F3853,
1659
  VEX_W_0F3858,
1660
  VEX_W_0F3859,
1661
  VEX_W_0F385A_L_0,
1662
  VEX_W_0F385C_X86_64_L_0,
1663
  VEX_W_0F385E_X86_64_L_0,
1664
  VEX_W_0F385F_X86_64_L_0,
1665
  VEX_W_0F386B_X86_64_L_0,
1666
  VEX_W_0F386C_X86_64_L_0,
1667
  VEX_W_0F386E_X86_64_L_0,
1668
  VEX_W_0F386F_X86_64_L_0,
1669
  VEX_W_0F3872_P_1,
1670
  VEX_W_0F3878,
1671
  VEX_W_0F3879,
1672
  VEX_W_0F38B0,
1673
  VEX_W_0F38B1,
1674
  VEX_W_0F38B4,
1675
  VEX_W_0F38B5,
1676
  VEX_W_0F38CB_P_3,
1677
  VEX_W_0F38CC_P_3,
1678
  VEX_W_0F38CD_P_3,
1679
  VEX_W_0F38CF,
1680
  VEX_W_0F38D2,
1681
  VEX_W_0F38D3,
1682
  VEX_W_0F38DA,
1683
  VEX_W_0F3A00_L_1,
1684
  VEX_W_0F3A01_L_1,
1685
  VEX_W_0F3A02,
1686
  VEX_W_0F3A04,
1687
  VEX_W_0F3A05,
1688
  VEX_W_0F3A06_L_1,
1689
  VEX_W_0F3A18_L_1,
1690
  VEX_W_0F3A19_L_1,
1691
  VEX_W_0F3A1D,
1692
  VEX_W_0F3A38_L_1,
1693
  VEX_W_0F3A39_L_1,
1694
  VEX_W_0F3A46_L_1,
1695
  VEX_W_0F3A4A,
1696
  VEX_W_0F3A4B,
1697
  VEX_W_0F3A4C,
1698
  VEX_W_0F3ACE,
1699
  VEX_W_0F3ACF,
1700
  VEX_W_0F3ADE,
1701
  VEX_W_MAP5_F8_X86_64_L_0,
1702
  VEX_W_MAP5_F9_X86_64_L_0,
1703
  VEX_W_MAP5_FD_X86_64_L_0,
1704
  VEX_W_MAP7_F6_L_0,
1705
  VEX_W_MAP7_F8_L_0,
1706
1707
  VEX_W_XOP_08_85_L_0,
1708
  VEX_W_XOP_08_86_L_0,
1709
  VEX_W_XOP_08_87_L_0,
1710
  VEX_W_XOP_08_8E_L_0,
1711
  VEX_W_XOP_08_8F_L_0,
1712
  VEX_W_XOP_08_95_L_0,
1713
  VEX_W_XOP_08_96_L_0,
1714
  VEX_W_XOP_08_97_L_0,
1715
  VEX_W_XOP_08_9E_L_0,
1716
  VEX_W_XOP_08_9F_L_0,
1717
  VEX_W_XOP_08_A6_L_0,
1718
  VEX_W_XOP_08_B6_L_0,
1719
  VEX_W_XOP_08_C0_L_0,
1720
  VEX_W_XOP_08_C1_L_0,
1721
  VEX_W_XOP_08_C2_L_0,
1722
  VEX_W_XOP_08_C3_L_0,
1723
  VEX_W_XOP_08_CC_L_0,
1724
  VEX_W_XOP_08_CD_L_0,
1725
  VEX_W_XOP_08_CE_L_0,
1726
  VEX_W_XOP_08_CF_L_0,
1727
  VEX_W_XOP_08_EC_L_0,
1728
  VEX_W_XOP_08_ED_L_0,
1729
  VEX_W_XOP_08_EE_L_0,
1730
  VEX_W_XOP_08_EF_L_0,
1731
1732
  VEX_W_XOP_09_80,
1733
  VEX_W_XOP_09_81,
1734
  VEX_W_XOP_09_82,
1735
  VEX_W_XOP_09_83,
1736
  VEX_W_XOP_09_C1_L_0,
1737
  VEX_W_XOP_09_C2_L_0,
1738
  VEX_W_XOP_09_C3_L_0,
1739
  VEX_W_XOP_09_C6_L_0,
1740
  VEX_W_XOP_09_C7_L_0,
1741
  VEX_W_XOP_09_CB_L_0,
1742
  VEX_W_XOP_09_D1_L_0,
1743
  VEX_W_XOP_09_D2_L_0,
1744
  VEX_W_XOP_09_D3_L_0,
1745
  VEX_W_XOP_09_D6_L_0,
1746
  VEX_W_XOP_09_D7_L_0,
1747
  VEX_W_XOP_09_DB_L_0,
1748
  VEX_W_XOP_09_E1_L_0,
1749
  VEX_W_XOP_09_E2_L_0,
1750
  VEX_W_XOP_09_E3_L_0,
1751
1752
  EVEX_W_0F5B_P_0,
1753
  EVEX_W_0F62,
1754
  EVEX_W_0F66,
1755
  EVEX_W_0F6A,
1756
  EVEX_W_0F6B,
1757
  EVEX_W_0F6C,
1758
  EVEX_W_0F6D,
1759
  EVEX_W_0F6F_P_1,
1760
  EVEX_W_0F6F_P_2,
1761
  EVEX_W_0F6F_P_3,
1762
  EVEX_W_0F70_P_2,
1763
  EVEX_W_0F72_R_2,
1764
  EVEX_W_0F72_R_4,
1765
  EVEX_W_0F72_R_6,
1766
  EVEX_W_0F73_R_2,
1767
  EVEX_W_0F73_R_6,
1768
  EVEX_W_0F76,
1769
  EVEX_W_0F78_P_0,
1770
  EVEX_W_0F78_P_2,
1771
  EVEX_W_0F79_P_0,
1772
  EVEX_W_0F79_P_2,
1773
  EVEX_W_0F7A_P_1,
1774
  EVEX_W_0F7A_P_2,
1775
  EVEX_W_0F7A_P_3,
1776
  EVEX_W_0F7B_P_2,
1777
  EVEX_W_0F7E_P_1,
1778
  EVEX_W_0F7F_P_1,
1779
  EVEX_W_0F7F_P_2,
1780
  EVEX_W_0F7F_P_3,
1781
  EVEX_W_0FD2,
1782
  EVEX_W_0FD3,
1783
  EVEX_W_0FD4,
1784
  EVEX_W_0FD6,
1785
  EVEX_W_0FE2,
1786
  EVEX_W_0FE6_P_1,
1787
  EVEX_W_0FE7,
1788
  EVEX_W_0FF2,
1789
  EVEX_W_0FF3,
1790
  EVEX_W_0FF4,
1791
  EVEX_W_0FFA,
1792
  EVEX_W_0FFB,
1793
  EVEX_W_0FFE,
1794
1795
  EVEX_W_0F3810_P_1,
1796
  EVEX_W_0F3810_P_2,
1797
  EVEX_W_0F3811_P_1,
1798
  EVEX_W_0F3811_P_2,
1799
  EVEX_W_0F3812_P_1,
1800
  EVEX_W_0F3812_P_2,
1801
  EVEX_W_0F3813_P_1,
1802
  EVEX_W_0F3814_P_1,
1803
  EVEX_W_0F3815_P_1,
1804
  EVEX_W_0F3819_L_n,
1805
  EVEX_W_0F381A_L_n,
1806
  EVEX_W_0F381B_L_2,
1807
  EVEX_W_0F381E,
1808
  EVEX_W_0F381F,
1809
  EVEX_W_0F3820_P_1,
1810
  EVEX_W_0F3821_P_1,
1811
  EVEX_W_0F3822_P_1,
1812
  EVEX_W_0F3823_P_1,
1813
  EVEX_W_0F3824_P_1,
1814
  EVEX_W_0F3825_P_1,
1815
  EVEX_W_0F3825_P_2,
1816
  EVEX_W_0F3828_P_2,
1817
  EVEX_W_0F3829_P_2,
1818
  EVEX_W_0F382A_P_1,
1819
  EVEX_W_0F382A_P_2,
1820
  EVEX_W_0F382B,
1821
  EVEX_W_0F3830_P_1,
1822
  EVEX_W_0F3831_P_1,
1823
  EVEX_W_0F3832_P_1,
1824
  EVEX_W_0F3833_P_1,
1825
  EVEX_W_0F3834_P_1,
1826
  EVEX_W_0F3835_P_1,
1827
  EVEX_W_0F3835_P_2,
1828
  EVEX_W_0F3837,
1829
  EVEX_W_0F383A_P_1,
1830
  EVEX_W_0F384A_X86_64,
1831
  EVEX_W_0F3859,
1832
  EVEX_W_0F385A_L_n,
1833
  EVEX_W_0F385B_L_2,
1834
  EVEX_W_0F386D_X86_64,
1835
  EVEX_W_0F3870,
1836
  EVEX_W_0F3872_P_2,
1837
  EVEX_W_0F387A,
1838
  EVEX_W_0F387B,
1839
  EVEX_W_0F3883,
1840
1841
  EVEX_W_0F3A07_X86_64,
1842
  EVEX_W_0F3A18_L_n,
1843
  EVEX_W_0F3A19_L_n,
1844
  EVEX_W_0F3A1A_L_2,
1845
  EVEX_W_0F3A1B_L_2,
1846
  EVEX_W_0F3A21,
1847
  EVEX_W_0F3A23_L_n,
1848
  EVEX_W_0F3A38_L_n,
1849
  EVEX_W_0F3A39_L_n,
1850
  EVEX_W_0F3A3A_L_2,
1851
  EVEX_W_0F3A3B_L_2,
1852
  EVEX_W_0F3A42,
1853
  EVEX_W_0F3A43_L_n,
1854
  EVEX_W_0F3A70,
1855
  EVEX_W_0F3A72,
1856
  EVEX_W_0F3A77_X86_64,
1857
1858
  EVEX_W_MAP4_8F_R_0,
1859
  EVEX_W_MAP4_F8_P1_M_1,
1860
  EVEX_W_MAP4_F8_P3_M_1,
1861
  EVEX_W_MAP4_FF_R_6,
1862
1863
  EVEX_W_MAP5_5B_P_0,
1864
  EVEX_W_MAP5_6C_P_0,
1865
  EVEX_W_MAP5_6C_P_2,
1866
  EVEX_W_MAP5_6D_P_0,
1867
  EVEX_W_MAP5_6D_P_2,
1868
  EVEX_W_MAP5_6E_P_1,
1869
  EVEX_W_MAP5_7A_P_3,
1870
  EVEX_W_MAP5_7E_P_1,
1871
  EVEX_W_MAP6_80,
1872
  EVEX_W_MAP6_81,
1873
};
1874
1875
typedef bool (*op_rtn) (instr_info *ins, int bytemode, int sizeflag);
1876
1877
struct dis386 {
1878
  const char *name;
1879
  struct
1880
    {
1881
      op_rtn rtn;
1882
      int bytemode;
1883
    } op[MAX_OPERANDS];
1884
  unsigned int prefix_requirement;
1885
};
1886
1887
/* Upper case letters in the instruction names here are macros.
1888
   'A' => print 'b' if no (suitable) register operand or suffix_always is true
1889
   'B' => print 'b' if suffix_always is true
1890
   'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
1891
    size prefix
1892
   'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
1893
    suffix_always is true
1894
   'E' => print 'e' if 32-bit form of jcxz
1895
   'F' => print 'w' or 'l' depending on address size prefix (loop insns)
1896
   'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
1897
   'H' => print ",pt" or ",pn" branch hint
1898
   'I' unused.
1899
   'J' unused.
1900
   'K' => print 'd' or 'q' if rex prefix is present.
1901
   'L' => print 'l' or 'q' if suffix_always is true
1902
   'M' => print 'r' if intel_mnemonic is false.
1903
   'N' => print 'n' if instruction has no wait "prefix"
1904
   'O' => print 'd' or 'o' (or 'q' in Intel mode)
1905
   'P' => behave as 'T' except with register operand outside of suffix_always
1906
    mode
1907
   'Q' => print 'w', 'l' or 'q' if no (suitable) register operand or
1908
    suffix_always is true
1909
   'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
1910
   'S' => print 'w', 'l' or 'q' if suffix_always is true
1911
   'T' => print 'w', 'l'/'d', or 'q' if instruction has an operand size
1912
    prefix or if suffix_always is true.
1913
   'U' unused.
1914
   'V' => print 'v' for VEX/EVEX and nothing for legacy encodings.
1915
   'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
1916
   'X' => print 's', 'd' depending on data16 prefix (for XMM)
1917
   'Y' => no output, mark EVEX.aaa != 0 as bad.
1918
   'Z' => print 'q' in 64bit mode and 'l' otherwise, if suffix_always is true.
1919
   '!' => change condition from true to false or from false to true.
1920
   '%' => add 1 upper case letter to the macro.
1921
   '^' => print 'w', 'l', or 'q' (Intel64 ISA only) depending on operand size
1922
    prefix or suffix_always is true (lcall/ljmp).
1923
   '@' => in 64bit mode for Intel64 ISA or if instruction
1924
    has no operand sizing prefix, print 'q' if suffix_always is true or
1925
    nothing otherwise; behave as 'P' in all other cases
1926
1927
   2 upper case letter macros:
1928
   "CC" => print condition code
1929
   "XY" => print 'x' or 'y' if suffix_always is true or no register
1930
     operands and no broadcast.
1931
   "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
1932
     register operands and no broadcast.
1933
   "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
1934
   "XD" => print 'd' if !EVEX or EVEX.W=1, EVEX.W=0 is not a valid encoding
1935
   "XH" => print 'h' if EVEX.W=0, EVEX.W=1 is not a valid encoding (for FP16)
1936
   "XB" => print 'bf16' if EVEX.W=0, EVEX.W=1 is not a valid encoding
1937
     (for BF16)
1938
   "XS" => print 's' if !EVEX or EVEX.W=0, EVEX.W=1 is not a valid encoding
1939
   "XV" => print "{vex} " pseudo prefix
1940
   "XE" => print "{evex} " pseudo prefix if no EVEX-specific functionality is
1941
     is used by an EVEX-encoded (AVX512VL) instruction.
1942
   "ME" => Similar to "XE", but only print "{evex} " when there is no
1943
     memory operand.
1944
   "NF" => print "{nf} " pseudo prefix when EVEX.NF = 1 and print "{evex} "
1945
     pseudo prefix when instructions without NF, EGPR and VVVV,
1946
   "NE" => don't print "{evex} " pseudo prefix for some special instructions
1947
     in MAP4.
1948
   "ZU" => print 'zu' if EVEX.ZU=1.
1949
   "SC" => print suffix SCC for SCC insns
1950
   "YK" keep unused, to avoid ambiguity with the combined use of Y and K.
1951
   "YX" keep unused, to avoid ambiguity with the combined use of Y and X.
1952
   "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand, cond
1953
     being false, or no operand at all in 64bit mode, or if suffix_always
1954
     is true.
1955
   "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
1956
   "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
1957
   "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
1958
   "DQ" => print 'd' or 'q' depending on the VEX.W bit
1959
   "DF" => print default flag value for SCC insns
1960
   "BW" => print 'b' or 'w' depending on the VEX.W bit
1961
   "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
1962
     an operand size prefix, or suffix_always is true.  print
1963
     'q' if rex prefix is present.
1964
1965
   Many of the above letters print nothing in Intel mode.  See "putop"
1966
   for the details.
1967
1968
   Braces '{' and '}', and vertical bars '|', indicate alternative
1969
   mnemonic strings for AT&T and Intel.  */
1970
1971
static const struct dis386 dis386[] = {
1972
  /* 00 */
1973
  { "addB",   { Ebh1, Gb }, 0 },
1974
  { "addS",   { Evh1, Gv }, 0 },
1975
  { "addB",   { Gb, EbS }, 0 },
1976
  { "addS",   { Gv, EvS }, 0 },
1977
  { "addB",   { AL, Ib }, 0 },
1978
  { "addS",   { eAX, Iv }, 0 },
1979
  { X86_64_TABLE (X86_64_06) },
1980
  { X86_64_TABLE (X86_64_07) },
1981
  /* 08 */
1982
  { "orB",    { Ebh1, Gb }, 0 },
1983
  { "orS",    { Evh1, Gv }, 0 },
1984
  { "orB",    { Gb, EbS }, 0 },
1985
  { "orS",    { Gv, EvS }, 0 },
1986
  { "orB",    { AL, Ib }, 0 },
1987
  { "orS",    { eAX, Iv }, 0 },
1988
  { X86_64_TABLE (X86_64_0E) },
1989
  { Bad_Opcode }, /* 0x0f extended opcode escape */
1990
  /* 10 */
1991
  { "adcB",   { Ebh1, Gb }, 0 },
1992
  { "adcS",   { Evh1, Gv }, 0 },
1993
  { "adcB",   { Gb, EbS }, 0 },
1994
  { "adcS",   { Gv, EvS }, 0 },
1995
  { "adcB",   { AL, Ib }, 0 },
1996
  { "adcS",   { eAX, Iv }, 0 },
1997
  { X86_64_TABLE (X86_64_16) },
1998
  { X86_64_TABLE (X86_64_17) },
1999
  /* 18 */
2000
  { "sbbB",   { Ebh1, Gb }, 0 },
2001
  { "sbbS",   { Evh1, Gv }, 0 },
2002
  { "sbbB",   { Gb, EbS }, 0 },
2003
  { "sbbS",   { Gv, EvS }, 0 },
2004
  { "sbbB",   { AL, Ib }, 0 },
2005
  { "sbbS",   { eAX, Iv }, 0 },
2006
  { X86_64_TABLE (X86_64_1E) },
2007
  { X86_64_TABLE (X86_64_1F) },
2008
  /* 20 */
2009
  { "andB",   { Ebh1, Gb }, 0 },
2010
  { "andS",   { Evh1, Gv }, 0 },
2011
  { "andB",   { Gb, EbS }, 0 },
2012
  { "andS",   { Gv, EvS }, 0 },
2013
  { "andB",   { AL, Ib }, 0 },
2014
  { "andS",   { eAX, Iv }, 0 },
2015
  { Bad_Opcode }, /* SEG ES prefix */
2016
  { X86_64_TABLE (X86_64_27) },
2017
  /* 28 */
2018
  { "subB",   { Ebh1, Gb }, 0 },
2019
  { "subS",   { Evh1, Gv }, 0 },
2020
  { "subB",   { Gb, EbS }, 0 },
2021
  { "subS",   { Gv, EvS }, 0 },
2022
  { "subB",   { AL, Ib }, 0 },
2023
  { "subS",   { eAX, Iv }, 0 },
2024
  { Bad_Opcode }, /* SEG CS prefix */
2025
  { X86_64_TABLE (X86_64_2F) },
2026
  /* 30 */
2027
  { "xorB",   { Ebh1, Gb }, 0 },
2028
  { "xorS",   { Evh1, Gv }, 0 },
2029
  { "xorB",   { Gb, EbS }, 0 },
2030
  { "xorS",   { Gv, EvS }, 0 },
2031
  { "xorB",   { AL, Ib }, 0 },
2032
  { "xorS",   { eAX, Iv }, 0 },
2033
  { Bad_Opcode }, /* SEG SS prefix */
2034
  { X86_64_TABLE (X86_64_37) },
2035
  /* 38 */
2036
  { "cmpB",   { Eb, Gb }, 0 },
2037
  { "cmpS",   { Ev, Gv }, 0 },
2038
  { "cmpB",   { Gb, EbS }, 0 },
2039
  { "cmpS",   { Gv, EvS }, 0 },
2040
  { "cmpB",   { AL, Ib }, 0 },
2041
  { "cmpS",   { eAX, Iv }, 0 },
2042
  { Bad_Opcode }, /* SEG DS prefix */
2043
  { X86_64_TABLE (X86_64_3F) },
2044
  /* 40 */
2045
  { "inc{S|}",    { RMeAX }, 0 },
2046
  { "inc{S|}",    { RMeCX }, 0 },
2047
  { "inc{S|}",    { RMeDX }, 0 },
2048
  { "inc{S|}",    { RMeBX }, 0 },
2049
  { "inc{S|}",    { RMeSP }, 0 },
2050
  { "inc{S|}",    { RMeBP }, 0 },
2051
  { "inc{S|}",    { RMeSI }, 0 },
2052
  { "inc{S|}",    { RMeDI }, 0 },
2053
  /* 48 */
2054
  { "dec{S|}",    { RMeAX }, 0 },
2055
  { "dec{S|}",    { RMeCX }, 0 },
2056
  { "dec{S|}",    { RMeDX }, 0 },
2057
  { "dec{S|}",    { RMeBX }, 0 },
2058
  { "dec{S|}",    { RMeSP }, 0 },
2059
  { "dec{S|}",    { RMeBP }, 0 },
2060
  { "dec{S|}",    { RMeSI }, 0 },
2061
  { "dec{S|}",    { RMeDI }, 0 },
2062
  /* 50 */
2063
  { "push!P",   { RMrAX }, 0 },
2064
  { "push!P",   { RMrCX }, 0 },
2065
  { "push!P",   { RMrDX }, 0 },
2066
  { "push!P",   { RMrBX }, 0 },
2067
  { "push!P",   { RMrSP }, 0 },
2068
  { "push!P",   { RMrBP }, 0 },
2069
  { "push!P",   { RMrSI }, 0 },
2070
  { "push!P",   { RMrDI }, 0 },
2071
  /* 58 */
2072
  { "pop!P",    { RMrAX }, 0 },
2073
  { "pop!P",    { RMrCX }, 0 },
2074
  { "pop!P",    { RMrDX }, 0 },
2075
  { "pop!P",    { RMrBX }, 0 },
2076
  { "pop!P",    { RMrSP }, 0 },
2077
  { "pop!P",    { RMrBP }, 0 },
2078
  { "pop!P",    { RMrSI }, 0 },
2079
  { "pop!P",    { RMrDI }, 0 },
2080
  /* 60 */
2081
  { X86_64_TABLE (X86_64_60) },
2082
  { X86_64_TABLE (X86_64_61) },
2083
  { X86_64_TABLE (X86_64_62) },
2084
  { X86_64_TABLE (X86_64_63) },
2085
  { Bad_Opcode }, /* seg fs */
2086
  { Bad_Opcode }, /* seg gs */
2087
  { Bad_Opcode }, /* op size prefix */
2088
  { Bad_Opcode }, /* adr size prefix */
2089
  /* 68 */
2090
  { "pushP",    { sIv }, 0 },
2091
  { "imulS",    { Gv, Ev, Iv }, 0 },
2092
  { "pushP",    { sIbT }, 0 },
2093
  { "imulS",    { Gv, Ev, sIb }, 0 },
2094
  { "ins{b|}",    { Ybr, indirDX }, 0 },
2095
  { X86_64_TABLE (X86_64_6D) },
2096
  { "outs{b|}",   { indirDXr, Xb }, 0 },
2097
  { X86_64_TABLE (X86_64_6F) },
2098
  /* 70 */
2099
  { "joH",    { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2100
  { "jnoH",   { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2101
  { "jbH",    { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2102
  { "jaeH",   { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2103
  { "jeH",    { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2104
  { "jneH",   { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2105
  { "jbeH",   { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2106
  { "jaH",    { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2107
  /* 78 */
2108
  { "jsH",    { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2109
  { "jnsH",   { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2110
  { "jpH",    { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2111
  { "jnpH",   { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2112
  { "jlH",    { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2113
  { "jgeH",   { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2114
  { "jleH",   { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2115
  { "jgH",    { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2116
  /* 80 */
2117
  { REG_TABLE (REG_80) },
2118
  { REG_TABLE (REG_81) },
2119
  { X86_64_TABLE (X86_64_82) },
2120
  { REG_TABLE (REG_83) },
2121
  { "testB",    { Eb, Gb }, 0 },
2122
  { "testS",    { Ev, Gv }, 0 },
2123
  { "xchgB",    { Ebh2, Gb }, 0 },
2124
  { "xchgS",    { Evh2, Gv }, 0 },
2125
  /* 88 */
2126
  { "movB",   { Ebh3, Gb }, 0 },
2127
  { "movS",   { Evh3, Gv }, 0 },
2128
  { "movB",   { Gb, EbS }, 0 },
2129
  { "movS",   { Gv, EvS }, 0 },
2130
  { "movD",   { Sv, Sw }, 0 },
2131
  { "leaS",   { Gv, M }, 0 },
2132
  { "movD",   { Sw, Sv }, 0 },
2133
  { REG_TABLE (REG_8F) },
2134
  /* 90 */
2135
  { PREFIX_TABLE (PREFIX_90) },
2136
  { "xchgS",    { RMeCX, eAX }, 0 },
2137
  { "xchgS",    { RMeDX, eAX }, 0 },
2138
  { "xchgS",    { RMeBX, eAX }, 0 },
2139
  { "xchgS",    { RMeSP, eAX }, 0 },
2140
  { "xchgS",    { RMeBP, eAX }, 0 },
2141
  { "xchgS",    { RMeSI, eAX }, 0 },
2142
  { "xchgS",    { RMeDI, eAX }, 0 },
2143
  /* 98 */
2144
  { "cW{t|}R",    { XX }, 0 },
2145
  { "cR{t|}O",    { XX }, 0 },
2146
  { X86_64_TABLE (X86_64_9A) },
2147
  { Bad_Opcode }, /* fwait */
2148
  { "pushfP",   { XX }, 0 },
2149
  { "popfP",    { XX }, 0 },
2150
  { "sahf",   { XX }, 0 },
2151
  { "lahf",   { XX }, 0 },
2152
  /* a0 */
2153
  { "mov%LB",   { AL, Ob }, PREFIX_REX2_ILLEGAL },
2154
  { "mov%LS",   { { JMPABS_Fixup, eAX_reg }, { JMPABS_Fixup, v_mode } }, PREFIX_REX2_ILLEGAL },
2155
  { "mov%LB",   { Ob, AL }, PREFIX_REX2_ILLEGAL },
2156
  { "mov%LS",   { Ov, eAX }, PREFIX_REX2_ILLEGAL },
2157
  { "movs{b|}",   { Ybr, Xb }, PREFIX_REX2_ILLEGAL },
2158
  { "movs{R|}",   { Yvr, Xv }, PREFIX_REX2_ILLEGAL },
2159
  { "cmps{b|}",   { Xb, Yb }, PREFIX_REX2_ILLEGAL },
2160
  { "cmps{R|}",   { Xv, Yv }, PREFIX_REX2_ILLEGAL },
2161
  /* a8 */
2162
  { "testB",    { AL, Ib }, PREFIX_REX2_ILLEGAL },
2163
  { "testS",    { eAX, Iv }, PREFIX_REX2_ILLEGAL },
2164
  { "stosB",    { Ybr, AL }, PREFIX_REX2_ILLEGAL },
2165
  { "stosS",    { Yvr, eAX }, PREFIX_REX2_ILLEGAL },
2166
  { "lodsB",    { ALr, Xb }, PREFIX_REX2_ILLEGAL },
2167
  { "lodsS",    { eAXr, Xv }, PREFIX_REX2_ILLEGAL },
2168
  { "scasB",    { AL, Yb }, PREFIX_REX2_ILLEGAL },
2169
  { "scasS",    { eAX, Yv }, PREFIX_REX2_ILLEGAL },
2170
  /* b0 */
2171
  { "movB",   { RMAL, Ib }, 0 },
2172
  { "movB",   { RMCL, Ib }, 0 },
2173
  { "movB",   { RMDL, Ib }, 0 },
2174
  { "movB",   { RMBL, Ib }, 0 },
2175
  { "movB",   { RMAH, Ib }, 0 },
2176
  { "movB",   { RMCH, Ib }, 0 },
2177
  { "movB",   { RMDH, Ib }, 0 },
2178
  { "movB",   { RMBH, Ib }, 0 },
2179
  /* b8 */
2180
  { "mov%LV",   { RMeAX, Iv64 }, 0 },
2181
  { "mov%LV",   { RMeCX, Iv64 }, 0 },
2182
  { "mov%LV",   { RMeDX, Iv64 }, 0 },
2183
  { "mov%LV",   { RMeBX, Iv64 }, 0 },
2184
  { "mov%LV",   { RMeSP, Iv64 }, 0 },
2185
  { "mov%LV",   { RMeBP, Iv64 }, 0 },
2186
  { "mov%LV",   { RMeSI, Iv64 }, 0 },
2187
  { "mov%LV",   { RMeDI, Iv64 }, 0 },
2188
  /* c0 */
2189
  { REG_TABLE (REG_C0) },
2190
  { REG_TABLE (REG_C1) },
2191
  { X86_64_TABLE (X86_64_C2) },
2192
  { X86_64_TABLE (X86_64_C3) },
2193
  { X86_64_TABLE (X86_64_C4) },
2194
  { X86_64_TABLE (X86_64_C5) },
2195
  { REG_TABLE (REG_C6) },
2196
  { REG_TABLE (REG_C7) },
2197
  /* c8 */
2198
  { "enterP",   { Iw, Ib }, 0 },
2199
  { "leaveP",   { XX }, 0 },
2200
  { "{l|}ret{|f}%LP", { Iw }, 0 },
2201
  { "{l|}ret{|f}%LP", { XX }, 0 },
2202
  { "int3",   { XX }, 0 },
2203
  { "int",    { Ib }, 0 },
2204
  { X86_64_TABLE (X86_64_CE) },
2205
  { "iret%LP",    { XX }, 0 },
2206
  /* d0 */
2207
  { REG_TABLE (REG_D0) },
2208
  { REG_TABLE (REG_D1) },
2209
  { REG_TABLE (REG_D2) },
2210
  { REG_TABLE (REG_D3) },
2211
  { X86_64_TABLE (X86_64_D4) },
2212
  { X86_64_TABLE (X86_64_D5) },
2213
  { X86_64_TABLE (X86_64_D6) },
2214
  { "xlat",   { DSBX }, 0 },
2215
  /* d8 */
2216
  { FLOAT },
2217
  { FLOAT },
2218
  { FLOAT },
2219
  { FLOAT },
2220
  { FLOAT },
2221
  { FLOAT },
2222
  { FLOAT },
2223
  { FLOAT },
2224
  /* e0 */
2225
  { "loopneFH",   { Jb, XX, loop_jcxz_flag }, PREFIX_REX2_ILLEGAL },
2226
  { "loopeFH",    { Jb, XX, loop_jcxz_flag }, PREFIX_REX2_ILLEGAL },
2227
  { "loopFH",   { Jb, XX, loop_jcxz_flag }, PREFIX_REX2_ILLEGAL },
2228
  { "jEcxzH",   { Jb, XX, loop_jcxz_flag }, PREFIX_REX2_ILLEGAL },
2229
  { "inB",    { AL, Ib }, PREFIX_REX2_ILLEGAL },
2230
  { "inG",    { zAX, Ib }, PREFIX_REX2_ILLEGAL },
2231
  { "outB",   { Ib, AL }, PREFIX_REX2_ILLEGAL },
2232
  { "outG",   { Ib, zAX }, PREFIX_REX2_ILLEGAL },
2233
  /* e8 */
2234
  { X86_64_TABLE (X86_64_E8) },
2235
  { X86_64_TABLE (X86_64_E9) },
2236
  { X86_64_TABLE (X86_64_EA) },
2237
  { "jmp",    { Jb, BND }, PREFIX_REX2_ILLEGAL },
2238
  { "inB",    { AL, indirDX }, PREFIX_REX2_ILLEGAL },
2239
  { "inG",    { zAX, indirDX }, PREFIX_REX2_ILLEGAL },
2240
  { "outB",   { indirDX, AL }, PREFIX_REX2_ILLEGAL },
2241
  { "outG",   { indirDX, zAX }, PREFIX_REX2_ILLEGAL },
2242
  /* f0 */
2243
  { Bad_Opcode }, /* lock prefix */
2244
  { "int1",   { XX }, 0 },
2245
  { Bad_Opcode }, /* repne */
2246
  { Bad_Opcode }, /* repz */
2247
  { "hlt",    { XX }, 0 },
2248
  { "cmc",    { XX }, 0 },
2249
  { REG_TABLE (REG_F6) },
2250
  { REG_TABLE (REG_F7) },
2251
  /* f8 */
2252
  { "clc",    { XX }, 0 },
2253
  { "stc",    { XX }, 0 },
2254
  { "cli",    { XX }, 0 },
2255
  { "sti",    { XX }, 0 },
2256
  { "cld",    { XX }, 0 },
2257
  { "std",    { XX }, 0 },
2258
  { REG_TABLE (REG_FE) },
2259
  { REG_TABLE (REG_FF) },
2260
};
2261
2262
static const struct dis386 dis386_twobyte[] = {
2263
  /* 00 */
2264
  { REG_TABLE (REG_0F00 ) },
2265
  { REG_TABLE (REG_0F01 ) },
2266
  { "larS",   { Gv, Sv }, 0 },
2267
  { "lslS",   { Gv, Sv }, 0 },
2268
  { Bad_Opcode },
2269
  { "syscall",    { XX }, 0 },
2270
  { "clts",   { XX }, 0 },
2271
  { "sysret%LQ",    { XX }, 0 },
2272
  /* 08 */
2273
  { "invd",   { XX }, 0 },
2274
  { PREFIX_TABLE (PREFIX_0F09) },
2275
  { Bad_Opcode },
2276
  { "ud2",    { XX }, 0 },
2277
  { Bad_Opcode },
2278
  { REG_TABLE (REG_0F0D) },
2279
  { "femms",    { XX }, 0 },
2280
  { "",     { MX, EM, OPSUF }, 0 }, /* See OP_3DNowSuffix.  */
2281
  /* 10 */
2282
  { PREFIX_TABLE (PREFIX_0F10) },
2283
  { PREFIX_TABLE (PREFIX_0F11) },
2284
  { PREFIX_TABLE (PREFIX_0F12) },
2285
  { "movlpX",   { Mq, XM }, PREFIX_OPCODE },
2286
  { "unpcklpX",   { XM, EXx }, PREFIX_OPCODE },
2287
  { "unpckhpX",   { XM, EXx }, PREFIX_OPCODE },
2288
  { PREFIX_TABLE (PREFIX_0F16) },
2289
  { "movhpX",   { Mq, XM }, PREFIX_OPCODE },
2290
  /* 18 */
2291
  { REG_TABLE (REG_0F18) },
2292
  { "nopQ",   { Ev }, 0 },
2293
  { PREFIX_TABLE (PREFIX_0F1A) },
2294
  { PREFIX_TABLE (PREFIX_0F1B) },
2295
  { PREFIX_TABLE (PREFIX_0F1C) },
2296
  { "nopQ",   { Ev }, 0 },
2297
  { PREFIX_TABLE (PREFIX_0F1E) },
2298
  { "nopQ",   { Ev }, 0 },
2299
  /* 20 */
2300
  { "movZ",   { Em, Cm }, 0 },
2301
  { "movZ",   { Em, Dm }, 0 },
2302
  { "movZ",   { Cm, Em }, 0 },
2303
  { "movZ",   { Dm, Em }, 0 },
2304
  { X86_64_TABLE (X86_64_0F24) },
2305
  { Bad_Opcode },
2306
  { X86_64_TABLE (X86_64_0F26) },
2307
  { Bad_Opcode },
2308
  /* 28 */
2309
  { "movapX",   { XM, EXx }, PREFIX_OPCODE },
2310
  { "movapX",   { EXxS, XM }, PREFIX_OPCODE },
2311
  { PREFIX_TABLE (PREFIX_0F2A) },
2312
  { PREFIX_TABLE (PREFIX_0F2B) },
2313
  { PREFIX_TABLE (PREFIX_0F2C) },
2314
  { PREFIX_TABLE (PREFIX_0F2D) },
2315
  { PREFIX_TABLE (PREFIX_0F2E) },
2316
  { PREFIX_TABLE (PREFIX_0F2F) },
2317
  /* 30 */
2318
  { "wrmsr",    { XX }, PREFIX_REX2_ILLEGAL },
2319
  { "rdtsc",    { XX }, PREFIX_REX2_ILLEGAL },
2320
  { "rdmsr",    { XX }, PREFIX_REX2_ILLEGAL },
2321
  { "rdpmc",    { XX }, PREFIX_REX2_ILLEGAL },
2322
  { "sysenter",   { SEP }, PREFIX_REX2_ILLEGAL },
2323
  { "sysexit%LQ", { SEP }, PREFIX_REX2_ILLEGAL },
2324
  { Bad_Opcode },
2325
  { "getsec",   { XX }, PREFIX_REX2_ILLEGAL },
2326
  /* 38 */
2327
  { THREE_BYTE_TABLE (THREE_BYTE_0F38) },
2328
  { Bad_Opcode },
2329
  { THREE_BYTE_TABLE (THREE_BYTE_0F3A) },
2330
  { Bad_Opcode },
2331
  { Bad_Opcode },
2332
  { Bad_Opcode },
2333
  { Bad_Opcode },
2334
  { Bad_Opcode },
2335
  /* 40 */
2336
  { "cmovoS",   { Gv, Ev }, 0 },
2337
  { "cmovnoS",    { Gv, Ev }, 0 },
2338
  { "cmovbS",   { Gv, Ev }, 0 },
2339
  { "cmovaeS",    { Gv, Ev }, 0 },
2340
  { "cmoveS",   { Gv, Ev }, 0 },
2341
  { "cmovneS",    { Gv, Ev }, 0 },
2342
  { "cmovbeS",    { Gv, Ev }, 0 },
2343
  { "cmovaS",   { Gv, Ev }, 0 },
2344
  /* 48 */
2345
  { "cmovsS",   { Gv, Ev }, 0 },
2346
  { "cmovnsS",    { Gv, Ev }, 0 },
2347
  { "cmovpS",   { Gv, Ev }, 0 },
2348
  { "cmovnpS",    { Gv, Ev }, 0 },
2349
  { "cmovlS",   { Gv, Ev }, 0 },
2350
  { "cmovgeS",    { Gv, Ev }, 0 },
2351
  { "cmovleS",    { Gv, Ev }, 0 },
2352
  { "cmovgS",   { Gv, Ev }, 0 },
2353
  /* 50 */
2354
  { "movmskpX",   { Gdq, Ux }, PREFIX_OPCODE },
2355
  { PREFIX_TABLE (PREFIX_0F51) },
2356
  { PREFIX_TABLE (PREFIX_0F52) },
2357
  { PREFIX_TABLE (PREFIX_0F53) },
2358
  { "andpX",    { XM, EXx }, PREFIX_OPCODE },
2359
  { "andnpX",   { XM, EXx }, PREFIX_OPCODE },
2360
  { "orpX",   { XM, EXx }, PREFIX_OPCODE },
2361
  { "xorpX",    { XM, EXx }, PREFIX_OPCODE },
2362
  /* 58 */
2363
  { PREFIX_TABLE (PREFIX_0F58) },
2364
  { PREFIX_TABLE (PREFIX_0F59) },
2365
  { PREFIX_TABLE (PREFIX_0F5A) },
2366
  { PREFIX_TABLE (PREFIX_0F5B) },
2367
  { PREFIX_TABLE (PREFIX_0F5C) },
2368
  { PREFIX_TABLE (PREFIX_0F5D) },
2369
  { PREFIX_TABLE (PREFIX_0F5E) },
2370
  { PREFIX_TABLE (PREFIX_0F5F) },
2371
  /* 60 */
2372
  { PREFIX_TABLE (PREFIX_0F60) },
2373
  { PREFIX_TABLE (PREFIX_0F61) },
2374
  { PREFIX_TABLE (PREFIX_0F62) },
2375
  { "packsswb",   { MX, EM }, PREFIX_OPCODE },
2376
  { "pcmpgtb",    { MX, EM }, PREFIX_OPCODE },
2377
  { "pcmpgtw",    { MX, EM }, PREFIX_OPCODE },
2378
  { "pcmpgtd",    { MX, EM }, PREFIX_OPCODE },
2379
  { "packuswb",   { MX, EM }, PREFIX_OPCODE },
2380
  /* 68 */
2381
  { "punpckhbw",  { MX, EM }, PREFIX_OPCODE },
2382
  { "punpckhwd",  { MX, EM }, PREFIX_OPCODE },
2383
  { "punpckhdq",  { MX, EM }, PREFIX_OPCODE },
2384
  { "packssdw",   { MX, EM }, PREFIX_OPCODE },
2385
  { "punpcklqdq", { XM, EXx }, PREFIX_DATA },
2386
  { "punpckhqdq", { XM, EXx }, PREFIX_DATA },
2387
  { "movK",   { MX, Edq }, PREFIX_OPCODE },
2388
  { PREFIX_TABLE (PREFIX_0F6F) },
2389
  /* 70 */
2390
  { PREFIX_TABLE (PREFIX_0F70) },
2391
  { REG_TABLE (REG_0F71) },
2392
  { REG_TABLE (REG_0F72) },
2393
  { REG_TABLE (REG_0F73) },
2394
  { "pcmpeqb",    { MX, EM }, PREFIX_OPCODE },
2395
  { "pcmpeqw",    { MX, EM }, PREFIX_OPCODE },
2396
  { "pcmpeqd",    { MX, EM }, PREFIX_OPCODE },
2397
  { "emms",   { XX }, PREFIX_OPCODE },
2398
  /* 78 */
2399
  { PREFIX_TABLE (PREFIX_0F78) },
2400
  { PREFIX_TABLE (PREFIX_0F79) },
2401
  { Bad_Opcode },
2402
  { Bad_Opcode },
2403
  { PREFIX_TABLE (PREFIX_0F7C) },
2404
  { PREFIX_TABLE (PREFIX_0F7D) },
2405
  { PREFIX_TABLE (PREFIX_0F7E) },
2406
  { PREFIX_TABLE (PREFIX_0F7F) },
2407
  /* 80 */
2408
  { "joH",    { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2409
  { "jnoH",   { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2410
  { "jbH",    { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2411
  { "jaeH",   { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2412
  { "jeH",    { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2413
  { "jneH",   { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2414
  { "jbeH",   { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2415
  { "jaH",    { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2416
  /* 88 */
2417
  { "jsH",    { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2418
  { "jnsH",   { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2419
  { "jpH",    { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2420
  { "jnpH",   { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2421
  { "jlH",    { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2422
  { "jgeH",   { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2423
  { "jleH",   { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2424
  { "jgH",    { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2425
  /* 90 */
2426
  { "seto",   { Eb }, 0 },
2427
  { "setno",    { Eb }, 0 },
2428
  { "setb",   { Eb }, 0 },
2429
  { "setae",    { Eb }, 0 },
2430
  { "sete",   { Eb }, 0 },
2431
  { "setne",    { Eb }, 0 },
2432
  { "setbe",    { Eb }, 0 },
2433
  { "seta",   { Eb }, 0 },
2434
  /* 98 */
2435
  { "sets",   { Eb }, 0 },
2436
  { "setns",    { Eb }, 0 },
2437
  { "setp",   { Eb }, 0 },
2438
  { "setnp",    { Eb }, 0 },
2439
  { "setl",   { Eb }, 0 },
2440
  { "setge",    { Eb }, 0 },
2441
  { "setle",    { Eb }, 0 },
2442
  { "setg",   { Eb }, 0 },
2443
  /* a0 */
2444
  { "pushP",    { fs }, 0 },
2445
  { "popP",   { fs }, 0 },
2446
  { "cpuid",    { XX }, 0 },
2447
  { "btS",    { Ev, Gv }, 0 },
2448
  { "shldS",    { Ev, Gv, Ib }, 0 },
2449
  { "shldS",    { Ev, Gv, CL }, 0 },
2450
  { REG_TABLE (REG_0FA6) },
2451
  { REG_TABLE (REG_0FA7) },
2452
  /* a8 */
2453
  { "pushP",    { gs }, 0 },
2454
  { "popP",   { gs }, 0 },
2455
  { "rsm",    { XX }, 0 },
2456
  { "btsS",   { Evh1, Gv }, 0 },
2457
  { "shrdS",    { Ev, Gv, Ib }, 0 },
2458
  { "shrdS",    { Ev, Gv, CL }, 0 },
2459
  { REG_TABLE (REG_0FAE) },
2460
  { "imulS",    { Gv, Ev }, 0 },
2461
  /* b0 */
2462
  { "cmpxchgB",   { Ebh1, Gb }, 0 },
2463
  { "cmpxchgS",   { Evh1, Gv }, 0 },
2464
  { "lssS",   { Gv, Mp }, 0 },
2465
  { "btrS",   { Evh1, Gv }, 0 },
2466
  { "lfsS",   { Gv, Mp }, 0 },
2467
  { "lgsS",   { Gv, Mp }, 0 },
2468
  { "movz{bR|x}", { Gv, Eb }, 0 },
2469
  { "movz{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movzww ! */
2470
  /* b8 */
2471
  { PREFIX_TABLE (PREFIX_0FB8) },
2472
  { "ud1S",   { Gv, Ev }, 0 },
2473
  { REG_TABLE (REG_0FBA) },
2474
  { "btcS",   { Evh1, Gv }, 0 },
2475
  { PREFIX_TABLE (PREFIX_0FBC) },
2476
  { PREFIX_TABLE (PREFIX_0FBD) },
2477
  { "movs{bR|x}", { Gv, Eb }, 0 },
2478
  { "movs{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movsww ! */
2479
  /* c0 */
2480
  { "xaddB",    { Ebh1, Gb }, 0 },
2481
  { "xaddS",    { Evh1, Gv }, 0 },
2482
  { PREFIX_TABLE (PREFIX_0FC2) },
2483
  { "movntiS",    { Mdq, Gdq }, PREFIX_OPCODE },
2484
  { "pinsrw",   { MX, Edw, Ib }, PREFIX_OPCODE },
2485
  { "pextrw",   { Gd, Nq, Ib }, PREFIX_OPCODE },
2486
  { "shufpX",   { XM, EXx, Ib }, PREFIX_OPCODE },
2487
  { REG_TABLE (REG_0FC7) },
2488
  /* c8 */
2489
  { "bswap",    { RMeAX }, 0 },
2490
  { "bswap",    { RMeCX }, 0 },
2491
  { "bswap",    { RMeDX }, 0 },
2492
  { "bswap",    { RMeBX }, 0 },
2493
  { "bswap",    { RMeSP }, 0 },
2494
  { "bswap",    { RMeBP }, 0 },
2495
  { "bswap",    { RMeSI }, 0 },
2496
  { "bswap",    { RMeDI }, 0 },
2497
  /* d0 */
2498
  { PREFIX_TABLE (PREFIX_0FD0) },
2499
  { "psrlw",    { MX, EM }, PREFIX_OPCODE },
2500
  { "psrld",    { MX, EM }, PREFIX_OPCODE },
2501
  { "psrlq",    { MX, EM }, PREFIX_OPCODE },
2502
  { "paddq",    { MX, EM }, PREFIX_OPCODE },
2503
  { "pmullw",   { MX, EM }, PREFIX_OPCODE },
2504
  { PREFIX_TABLE (PREFIX_0FD6) },
2505
  { "pmovmskb",   { Gdq, Nq }, PREFIX_OPCODE },
2506
  /* d8 */
2507
  { "psubusb",    { MX, EM }, PREFIX_OPCODE },
2508
  { "psubusw",    { MX, EM }, PREFIX_OPCODE },
2509
  { "pminub",   { MX, EM }, PREFIX_OPCODE },
2510
  { "pand",   { MX, EM }, PREFIX_OPCODE },
2511
  { "paddusb",    { MX, EM }, PREFIX_OPCODE },
2512
  { "paddusw",    { MX, EM }, PREFIX_OPCODE },
2513
  { "pmaxub",   { MX, EM }, PREFIX_OPCODE },
2514
  { "pandn",    { MX, EM }, PREFIX_OPCODE },
2515
  /* e0 */
2516
  { "pavgb",    { MX, EM }, PREFIX_OPCODE },
2517
  { "psraw",    { MX, EM }, PREFIX_OPCODE },
2518
  { "psrad",    { MX, EM }, PREFIX_OPCODE },
2519
  { "pavgw",    { MX, EM }, PREFIX_OPCODE },
2520
  { "pmulhuw",    { MX, EM }, PREFIX_OPCODE },
2521
  { "pmulhw",   { MX, EM }, PREFIX_OPCODE },
2522
  { PREFIX_TABLE (PREFIX_0FE6) },
2523
  { PREFIX_TABLE (PREFIX_0FE7) },
2524
  /* e8 */
2525
  { "psubsb",   { MX, EM }, PREFIX_OPCODE },
2526
  { "psubsw",   { MX, EM }, PREFIX_OPCODE },
2527
  { "pminsw",   { MX, EM }, PREFIX_OPCODE },
2528
  { "por",    { MX, EM }, PREFIX_OPCODE },
2529
  { "paddsb",   { MX, EM }, PREFIX_OPCODE },
2530
  { "paddsw",   { MX, EM }, PREFIX_OPCODE },
2531
  { "pmaxsw",   { MX, EM }, PREFIX_OPCODE },
2532
  { "pxor",   { MX, EM }, PREFIX_OPCODE },
2533
  /* f0 */
2534
  { PREFIX_TABLE (PREFIX_0FF0) },
2535
  { "psllw",    { MX, EM }, PREFIX_OPCODE },
2536
  { "pslld",    { MX, EM }, PREFIX_OPCODE },
2537
  { "psllq",    { MX, EM }, PREFIX_OPCODE },
2538
  { "pmuludq",    { MX, EM }, PREFIX_OPCODE },
2539
  { "pmaddwd",    { MX, EM }, PREFIX_OPCODE },
2540
  { "psadbw",   { MX, EM }, PREFIX_OPCODE },
2541
  { PREFIX_TABLE (PREFIX_0FF7) },
2542
  /* f8 */
2543
  { "psubb",    { MX, EM }, PREFIX_OPCODE },
2544
  { "psubw",    { MX, EM }, PREFIX_OPCODE },
2545
  { "psubd",    { MX, EM }, PREFIX_OPCODE },
2546
  { "psubq",    { MX, EM }, PREFIX_OPCODE },
2547
  { "paddb",    { MX, EM }, PREFIX_OPCODE },
2548
  { "paddw",    { MX, EM }, PREFIX_OPCODE },
2549
  { "paddd",    { MX, EM }, PREFIX_OPCODE },
2550
  { "ud0S",   { Gv, Ev }, 0 },
2551
};
2552
2553
static const bool onebyte_has_modrm[256] = {
2554
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2555
  /*       -------------------------------        */
2556
  /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2557
  /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2558
  /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2559
  /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2560
  /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2561
  /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2562
  /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2563
  /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2564
  /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2565
  /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2566
  /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2567
  /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2568
  /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2569
  /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2570
  /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2571
  /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1  /* f0 */
2572
  /*       -------------------------------        */
2573
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2574
};
2575
2576
static const bool twobyte_has_modrm[256] = {
2577
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2578
  /*       -------------------------------        */
2579
  /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
2580
  /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
2581
  /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
2582
  /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
2583
  /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
2584
  /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2585
  /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
2586
  /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
2587
  /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2588
  /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
2589
  /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
2590
  /* b0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bf */
2591
  /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
2592
  /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
2593
  /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
2594
  /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1  /* ff */
2595
  /*       -------------------------------        */
2596
  /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2597
};
2598
2599
2600
struct op
2601
  {
2602
    const char *name;
2603
    unsigned int len;
2604
  };
2605
2606
/* If we are accessing mod/rm/reg without need_modrm set, then the
2607
   values are stale.  Hitting this abort likely indicates that you
2608
   need to update onebyte_has_modrm or twobyte_has_modrm.  */
2609
1.70M
#define MODRM_CHECK  if (!ins->need_modrm) abort ()
2610
2611
static const char intel_index16[][6] = {
2612
  "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2613
};
2614
2615
static const char att_names64[][8] = {
2616
  "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
2617
  "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15",
2618
  "%r16", "%r17", "%r18", "%r19", "%r20", "%r21", "%r22", "%r23",
2619
  "%r24", "%r25", "%r26", "%r27", "%r28", "%r29", "%r30", "%r31",
2620
};
2621
static const char att_names32[][8] = {
2622
  "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
2623
  "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d",
2624
  "%r16d", "%r17d", "%r18d", "%r19d", "%r20d", "%r21d", "%r22d", "%r23d",
2625
  "%r24d", "%r25d", "%r26d", "%r27d", "%r28d", "%r29d", "%r30d", "%r31d",
2626
};
2627
static const char att_names16[][8] = {
2628
  "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
2629
  "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w",
2630
  "%r16w", "%r17w", "%r18w", "%r19w", "%r20w", "%r21w", "%r22w", "%r23w",
2631
  "%r24w", "%r25w", "%r26w", "%r27w", "%r28w", "%r29w", "%r30w", "%r31w",
2632
};
2633
static const char att_names8[][8] = {
2634
  "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
2635
};
2636
static const char att_names8rex[][8] = {
2637
  "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
2638
  "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b",
2639
  "%r16b", "%r17b", "%r18b", "%r19b", "%r20b", "%r21b", "%r22b", "%r23b",
2640
  "%r24b", "%r25b", "%r26b", "%r27b", "%r28b", "%r29b", "%r30b", "%r31b",
2641
};
2642
static const char att_names_seg[][4] = {
2643
  "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
2644
};
2645
static const char att_index64[] = "%riz";
2646
static const char att_index32[] = "%eiz";
2647
static const char att_index16[][8] = {
2648
  "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
2649
};
2650
2651
static const char att_names_mm[][8] = {
2652
  "%mm0", "%mm1", "%mm2", "%mm3",
2653
  "%mm4", "%mm5", "%mm6", "%mm7"
2654
};
2655
2656
static const char att_names_bnd[][8] = {
2657
  "%bnd0", "%bnd1", "%bnd2", "%bnd3"
2658
};
2659
2660
static const char att_names_xmm[][8] = {
2661
  "%xmm0", "%xmm1", "%xmm2", "%xmm3",
2662
  "%xmm4", "%xmm5", "%xmm6", "%xmm7",
2663
  "%xmm8", "%xmm9", "%xmm10", "%xmm11",
2664
  "%xmm12", "%xmm13", "%xmm14", "%xmm15",
2665
  "%xmm16", "%xmm17", "%xmm18", "%xmm19",
2666
  "%xmm20", "%xmm21", "%xmm22", "%xmm23",
2667
  "%xmm24", "%xmm25", "%xmm26", "%xmm27",
2668
  "%xmm28", "%xmm29", "%xmm30", "%xmm31"
2669
};
2670
2671
static const char att_names_ymm[][8] = {
2672
  "%ymm0", "%ymm1", "%ymm2", "%ymm3",
2673
  "%ymm4", "%ymm5", "%ymm6", "%ymm7",
2674
  "%ymm8", "%ymm9", "%ymm10", "%ymm11",
2675
  "%ymm12", "%ymm13", "%ymm14", "%ymm15",
2676
  "%ymm16", "%ymm17", "%ymm18", "%ymm19",
2677
  "%ymm20", "%ymm21", "%ymm22", "%ymm23",
2678
  "%ymm24", "%ymm25", "%ymm26", "%ymm27",
2679
  "%ymm28", "%ymm29", "%ymm30", "%ymm31"
2680
};
2681
2682
static const char att_names_zmm[][8] = {
2683
  "%zmm0", "%zmm1", "%zmm2", "%zmm3",
2684
  "%zmm4", "%zmm5", "%zmm6", "%zmm7",
2685
  "%zmm8", "%zmm9", "%zmm10", "%zmm11",
2686
  "%zmm12", "%zmm13", "%zmm14", "%zmm15",
2687
  "%zmm16", "%zmm17", "%zmm18", "%zmm19",
2688
  "%zmm20", "%zmm21", "%zmm22", "%zmm23",
2689
  "%zmm24", "%zmm25", "%zmm26", "%zmm27",
2690
  "%zmm28", "%zmm29", "%zmm30", "%zmm31"
2691
};
2692
2693
static const char att_names_tmm[][8] = {
2694
  "%tmm0", "%tmm1", "%tmm2", "%tmm3",
2695
  "%tmm4", "%tmm5", "%tmm6", "%tmm7"
2696
};
2697
2698
static const char att_names_mask[][8] = {
2699
  "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
2700
};
2701
2702
static const char *const names_rounding[] =
2703
{
2704
  "{rn-",
2705
  "{rd-",
2706
  "{ru-",
2707
  "{rz-"
2708
};
2709
2710
static const struct dis386 reg_table[][8] = {
2711
  /* REG_80 */
2712
  {
2713
    { "addA", { Ebh1, Ib }, 0 },
2714
    { "orA",  { Ebh1, Ib }, 0 },
2715
    { "adcA", { Ebh1, Ib }, 0 },
2716
    { "sbbA", { Ebh1, Ib }, 0 },
2717
    { "andA", { Ebh1, Ib }, 0 },
2718
    { "subA", { Ebh1, Ib }, 0 },
2719
    { "xorA", { Ebh1, Ib }, 0 },
2720
    { "cmpA", { Eb, Ib }, 0 },
2721
  },
2722
  /* REG_81 */
2723
  {
2724
    { "addQ", { Evh1, Iv }, 0 },
2725
    { "orQ",  { Evh1, Iv }, 0 },
2726
    { "adcQ", { Evh1, Iv }, 0 },
2727
    { "sbbQ", { Evh1, Iv }, 0 },
2728
    { "andQ", { Evh1, Iv }, 0 },
2729
    { "subQ", { Evh1, Iv }, 0 },
2730
    { "xorQ", { Evh1, Iv }, 0 },
2731
    { "cmpQ", { Ev, Iv }, 0 },
2732
  },
2733
  /* REG_83 */
2734
  {
2735
    { "addQ", { Evh1, sIb }, 0 },
2736
    { "orQ",  { Evh1, sIb }, 0 },
2737
    { "adcQ", { Evh1, sIb }, 0 },
2738
    { "sbbQ", { Evh1, sIb }, 0 },
2739
    { "andQ", { Evh1, sIb }, 0 },
2740
    { "subQ", { Evh1, sIb }, 0 },
2741
    { "xorQ", { Evh1, sIb }, 0 },
2742
    { "cmpQ", { Ev, sIb }, 0 },
2743
  },
2744
  /* REG_8F */
2745
  {
2746
    { "pop{P|}", { stackEv }, 0 },
2747
    { XOP_8F_TABLE () },
2748
    { Bad_Opcode },
2749
    { Bad_Opcode },
2750
    { Bad_Opcode },
2751
    { XOP_8F_TABLE () },
2752
  },
2753
  /* REG_C0 */
2754
  {
2755
    { "%NFrolA",  { VexGb, Eb, Ib }, NO_PREFIX },
2756
    { "%NFrorA",  { VexGb, Eb, Ib }, NO_PREFIX },
2757
    { "rclA", { VexGb, Eb, Ib }, NO_PREFIX },
2758
    { "rcrA", { VexGb, Eb, Ib }, NO_PREFIX },
2759
    { "%NFshlA",  { VexGb, Eb, Ib }, NO_PREFIX },
2760
    { "%NFshrA",  { VexGb, Eb, Ib }, NO_PREFIX },
2761
    { "%NFshlA",  { VexGb, Eb, Ib }, NO_PREFIX },
2762
    { "%NFsarA",  { VexGb, Eb, Ib }, NO_PREFIX },
2763
  },
2764
  /* REG_C1 */
2765
  {
2766
    { "%NFrolQ",  { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
2767
    { "%NFrorQ",  { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
2768
    { "rclQ", { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
2769
    { "rcrQ", { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
2770
    { "%NFshlQ",  { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
2771
    { "%NFshrQ",  { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
2772
    { "%NFshlQ",  { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
2773
    { "%NFsarQ",  { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
2774
  },
2775
  /* REG_C6 */
2776
  {
2777
    { "movA", { Ebh3, Ib }, 0 },
2778
    { Bad_Opcode },
2779
    { Bad_Opcode },
2780
    { Bad_Opcode },
2781
    { Bad_Opcode },
2782
    { Bad_Opcode },
2783
    { Bad_Opcode },
2784
    { RM_TABLE (RM_C6_REG_7) },
2785
  },
2786
  /* REG_C7 */
2787
  {
2788
    { "movQ", { Evh3, Iv }, 0 },
2789
    { Bad_Opcode },
2790
    { Bad_Opcode },
2791
    { Bad_Opcode },
2792
    { Bad_Opcode },
2793
    { Bad_Opcode },
2794
    { Bad_Opcode },
2795
    { RM_TABLE (RM_C7_REG_7) },
2796
  },
2797
  /* REG_D0 */
2798
  {
2799
    { "%NFrolA",  { VexGb, Eb, I1 }, NO_PREFIX },
2800
    { "%NFrorA",  { VexGb, Eb, I1 }, NO_PREFIX },
2801
    { "rclA", { VexGb, Eb, I1 }, NO_PREFIX },
2802
    { "rcrA", { VexGb, Eb, I1 }, NO_PREFIX },
2803
    { "%NFshlA",  { VexGb, Eb, I1 }, NO_PREFIX },
2804
    { "%NFshrA",  { VexGb, Eb, I1 }, NO_PREFIX },
2805
    { "%NFshlA",  { VexGb, Eb, I1 }, NO_PREFIX },
2806
    { "%NFsarA",  { VexGb, Eb, I1 }, NO_PREFIX },
2807
  },
2808
  /* REG_D1 */
2809
  {
2810
    { "%NFrolQ",  { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
2811
    { "%NFrorQ",  { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
2812
    { "rclQ", { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
2813
    { "rcrQ", { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
2814
    { "%NFshlQ",  { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
2815
    { "%NFshrQ",  { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
2816
    { "%NFshlQ",  { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
2817
    { "%NFsarQ",  { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
2818
  },
2819
  /* REG_D2 */
2820
  {
2821
    { "%NFrolA",  { VexGb, Eb, CL }, NO_PREFIX },
2822
    { "%NFrorA",  { VexGb, Eb, CL }, NO_PREFIX },
2823
    { "rclA", { VexGb, Eb, CL }, NO_PREFIX },
2824
    { "rcrA", { VexGb, Eb, CL }, NO_PREFIX },
2825
    { "%NFshlA",  { VexGb, Eb, CL }, NO_PREFIX },
2826
    { "%NFshrA",  { VexGb, Eb, CL }, NO_PREFIX },
2827
    { "%NFshlA",  { VexGb, Eb, CL }, NO_PREFIX },
2828
    { "%NFsarA",  { VexGb, Eb, CL }, NO_PREFIX },
2829
  },
2830
  /* REG_D3 */
2831
  {
2832
    { "%NFrolQ",  { VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
2833
    { "%NFrorQ",  { VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
2834
    { "rclQ", { VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
2835
    { "rcrQ", { VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
2836
    { "%NFshlQ",  { VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
2837
    { "%NFshrQ",  { VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
2838
    { "%NFshlQ",  { VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
2839
    { "%NFsarQ",  { VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
2840
  },
2841
  /* REG_F6 */
2842
  {
2843
    { "testA",  { Eb, Ib }, 0 },
2844
    { "testA",  { Eb, Ib }, 0 },
2845
    { "notA", { Ebh1 }, 0 },
2846
    { "negA", { Ebh1 }, 0 },
2847
    { "mulA", { Eb }, 0 },  /* Don't print the implicit %al register,  */
2848
    { "imulA",  { Eb }, 0 },  /* to distinguish these opcodes from other */
2849
    { "divA", { Eb }, 0 },  /* mul/imul opcodes.  Do the same for div  */
2850
    { "idivA",  { Eb }, 0 },  /* and idiv for consistency.       */
2851
  },
2852
  /* REG_F7 */
2853
  {
2854
    { "testQ",  { Ev, Iv }, 0 },
2855
    { "testQ",  { Ev, Iv }, 0 },
2856
    { "notQ", { Evh1 }, 0 },
2857
    { "negQ", { Evh1 }, 0 },
2858
    { "mulQ", { Ev }, 0 },  /* Don't print the implicit register.  */
2859
    { "imulQ",  { Ev }, 0 },
2860
    { "divQ", { Ev }, 0 },
2861
    { "idivQ",  { Ev }, 0 },
2862
  },
2863
  /* REG_FE */
2864
  {
2865
    { "incA", { Ebh1 }, 0 },
2866
    { "decA", { Ebh1 }, 0 },
2867
  },
2868
  /* REG_FF */
2869
  {
2870
    { "incQ", { Evh1 }, 0 },
2871
    { "decQ", { Evh1 }, 0 },
2872
    { "call{@|}", { NOTRACK, indirEv, BND }, 0 },
2873
    { "{l|}call^", { indirEp }, 0 },
2874
    { "jmp{@|}", { NOTRACK, indirEv, BND }, 0 },
2875
    { "{l|}jmp^", { indirEp }, 0 },
2876
    { "push{P|}", { stackEv }, 0 },
2877
    { Bad_Opcode },
2878
  },
2879
  /* REG_0F00 */
2880
  {
2881
    { "sldtD",  { Sv }, 0 },
2882
    { "strD", { Sv }, 0 },
2883
    { "lldtD",  { Sv }, 0 },
2884
    { "ltrD", { Sv }, 0 },
2885
    { "verrD",  { Sv }, 0 },
2886
    { "verwD",  { Sv }, 0 },
2887
    { X86_64_TABLE (X86_64_0F00_REG_6) },
2888
    { Bad_Opcode },
2889
  },
2890
  /* REG_0F01 */
2891
  {
2892
    { MOD_TABLE (MOD_0F01_REG_0) },
2893
    { MOD_TABLE (MOD_0F01_REG_1) },
2894
    { MOD_TABLE (MOD_0F01_REG_2) },
2895
    { MOD_TABLE (MOD_0F01_REG_3) },
2896
    { "smswD",  { Sv }, 0 },
2897
    { MOD_TABLE (MOD_0F01_REG_5) },
2898
    { "lmsw", { Ew }, 0 },
2899
    { MOD_TABLE (MOD_0F01_REG_7) },
2900
  },
2901
  /* REG_0F0D */
2902
  {
2903
    { "prefetch", { Mb }, 0 },
2904
    { "prefetchw",  { Mb }, 0 },
2905
    { "prefetchwt1",  { Mb }, 0 },
2906
    { "prefetch", { Mb }, 0 },
2907
    { "prefetch", { Mb }, 0 },
2908
    { "prefetch", { Mb }, 0 },
2909
    { "prefetch", { Mb }, 0 },
2910
    { "prefetch", { Mb }, 0 },
2911
  },
2912
  /* REG_0F18 */
2913
  {
2914
    { MOD_TABLE (MOD_0F18_REG_0) },
2915
    { MOD_TABLE (MOD_0F18_REG_1) },
2916
    { MOD_TABLE (MOD_0F18_REG_2) },
2917
    { MOD_TABLE (MOD_0F18_REG_3) },
2918
    { MOD_TABLE (MOD_0F18_REG_4) },
2919
    { "nopQ",   { Ev }, 0 },
2920
    { MOD_TABLE (MOD_0F18_REG_6) },
2921
    { MOD_TABLE (MOD_0F18_REG_7) },
2922
  },
2923
  /* REG_0F1C_P_0_MOD_0 */
2924
  {
2925
    { "cldemote", { Mb }, 0 },
2926
    { "nopQ",   { Ev }, 0 },
2927
    { "nopQ",   { Ev }, 0 },
2928
    { "nopQ",   { Ev }, 0 },
2929
    { "nopQ",   { Ev }, 0 },
2930
    { "nopQ",   { Ev }, 0 },
2931
    { "nopQ",   { Ev }, 0 },
2932
    { "nopQ",   { Ev }, 0 },
2933
  },
2934
  /* REG_0F1E_P_1_MOD_3 */
2935
  {
2936
    { "nopQ",   { Ev }, PREFIX_IGNORED },
2937
    { "rdsspK",   { Edq }, 0 },
2938
    { "nopQ",   { Ev }, PREFIX_IGNORED },
2939
    { "nopQ",   { Ev }, PREFIX_IGNORED },
2940
    { "nopQ",   { Ev }, PREFIX_IGNORED },
2941
    { "nopQ",   { Ev }, PREFIX_IGNORED },
2942
    { "nopQ",   { Ev }, PREFIX_IGNORED },
2943
    { RM_TABLE (RM_0F1E_P_1_MOD_3_REG_7) },
2944
  },
2945
  /* REG_0F38D8_PREFIX_1 */
2946
  {
2947
    { "aesencwide128kl",  { M }, 0 },
2948
    { "aesdecwide128kl",  { M }, 0 },
2949
    { "aesencwide256kl",  { M }, 0 },
2950
    { "aesdecwide256kl",  { M }, 0 },
2951
  },
2952
  /* REG_0F3A0F_P_1 */
2953
  {
2954
    { RM_TABLE (RM_0F3A0F_P_1_R_0) },
2955
  },
2956
  /* REG_0F71 */
2957
  {
2958
    { Bad_Opcode },
2959
    { Bad_Opcode },
2960
    { "psrlw",    { Nq, Ib }, PREFIX_OPCODE },
2961
    { Bad_Opcode },
2962
    { "psraw",    { Nq, Ib }, PREFIX_OPCODE },
2963
    { Bad_Opcode },
2964
    { "psllw",    { Nq, Ib }, PREFIX_OPCODE },
2965
  },
2966
  /* REG_0F72 */
2967
  {
2968
    { Bad_Opcode },
2969
    { Bad_Opcode },
2970
    { "psrld",    { Nq, Ib }, PREFIX_OPCODE },
2971
    { Bad_Opcode },
2972
    { "psrad",    { Nq, Ib }, PREFIX_OPCODE },
2973
    { Bad_Opcode },
2974
    { "pslld",    { Nq, Ib }, PREFIX_OPCODE },
2975
  },
2976
  /* REG_0F73 */
2977
  {
2978
    { Bad_Opcode },
2979
    { Bad_Opcode },
2980
    { "psrlq",    { Nq, Ib }, PREFIX_OPCODE },
2981
    { "psrldq",   { Ux, Ib }, PREFIX_DATA },
2982
    { Bad_Opcode },
2983
    { Bad_Opcode },
2984
    { "psllq",    { Nq, Ib }, PREFIX_OPCODE },
2985
    { "pslldq",   { Ux, Ib }, PREFIX_DATA },
2986
  },
2987
  /* REG_0FA6 */
2988
  {
2989
    { PREFIX_TABLE (PREFIX_0FA6_REG_0) },
2990
    { "xsha1",    { { OP_0f07, 0 } }, 0 },
2991
    { "xsha256",  { { OP_0f07, 0 } }, 0 },
2992
    { "xsha384",  { { OP_0f07, 0 } }, 0 },
2993
    { "xsha512",  { { OP_0f07, 0 } }, 0 },
2994
    { PREFIX_TABLE (PREFIX_0FA6_REG_5) },
2995
    { "montmul2", { { OP_0f07, 0 } }, 0 },
2996
    { "xmodexp",  { { OP_0f07, 0 } }, 0 },
2997
  },
2998
  /* REG_0FA7 */
2999
  {
3000
    { "xstore-rng", { { OP_0f07, 0 } }, 0 },
3001
    { "xcrypt-ecb", { { OP_0f07, 0 } }, 0 },
3002
    { "xcrypt-cbc", { { OP_0f07, 0 } }, 0 },
3003
    { "xcrypt-ctr", { { OP_0f07, 0 } }, 0 },
3004
    { "xcrypt-cfb", { { OP_0f07, 0 } }, 0 },
3005
    { "xcrypt-ofb", { { OP_0f07, 0 } }, 0 },
3006
    { PREFIX_TABLE (PREFIX_0FA7_REG_6) },
3007
    { "xrng2",    { { OP_0f07, 0 } }, 0 },
3008
  },
3009
  /* REG_0FAE */
3010
  {
3011
    { MOD_TABLE (MOD_0FAE_REG_0) },
3012
    { MOD_TABLE (MOD_0FAE_REG_1) },
3013
    { MOD_TABLE (MOD_0FAE_REG_2) },
3014
    { MOD_TABLE (MOD_0FAE_REG_3) },
3015
    { MOD_TABLE (MOD_0FAE_REG_4) },
3016
    { MOD_TABLE (MOD_0FAE_REG_5) },
3017
    { MOD_TABLE (MOD_0FAE_REG_6) },
3018
    { MOD_TABLE (MOD_0FAE_REG_7) },
3019
  },
3020
  /* REG_0FBA */
3021
  {
3022
    { Bad_Opcode },
3023
    { Bad_Opcode },
3024
    { Bad_Opcode },
3025
    { Bad_Opcode },
3026
    { "btQ",  { Ev, Ib }, 0 },
3027
    { "btsQ", { Evh1, Ib }, 0 },
3028
    { "btrQ", { Evh1, Ib }, 0 },
3029
    { "btcQ", { Evh1, Ib }, 0 },
3030
  },
3031
  /* REG_0FC7 */
3032
  {
3033
    { Bad_Opcode },
3034
    { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } }, 0 },
3035
    { Bad_Opcode },
3036
    { "xrstors", { FXSAVE }, PREFIX_REX2_ILLEGAL },
3037
    { "xsavec", { FXSAVE }, PREFIX_REX2_ILLEGAL },
3038
    { "xsaves", { FXSAVE }, PREFIX_REX2_ILLEGAL },
3039
    { MOD_TABLE (MOD_0FC7_REG_6) },
3040
    { MOD_TABLE (MOD_0FC7_REG_7) },
3041
  },
3042
  /* REG_VEX_0F71 */
3043
  {
3044
    { Bad_Opcode },
3045
    { Bad_Opcode },
3046
    { "vpsrlw",   { Vex, Ux, Ib }, PREFIX_DATA },
3047
    { Bad_Opcode },
3048
    { "vpsraw",   { Vex, Ux, Ib }, PREFIX_DATA },
3049
    { Bad_Opcode },
3050
    { "vpsllw",   { Vex, Ux, Ib }, PREFIX_DATA },
3051
  },
3052
  /* REG_VEX_0F72 */
3053
  {
3054
    { Bad_Opcode },
3055
    { Bad_Opcode },
3056
    { "vpsrld",   { Vex, Ux, Ib }, PREFIX_DATA },
3057
    { Bad_Opcode },
3058
    { "vpsrad",   { Vex, Ux, Ib }, PREFIX_DATA },
3059
    { Bad_Opcode },
3060
    { "vpslld",   { Vex, Ux, Ib }, PREFIX_DATA },
3061
  },
3062
  /* REG_VEX_0F73 */
3063
  {
3064
    { Bad_Opcode },
3065
    { Bad_Opcode },
3066
    { "vpsrlq",   { Vex, Ux, Ib }, PREFIX_DATA },
3067
    { "vpsrldq",  { Vex, Ux, Ib }, PREFIX_DATA },
3068
    { Bad_Opcode },
3069
    { Bad_Opcode },
3070
    { "vpsllq",   { Vex, Ux, Ib }, PREFIX_DATA },
3071
    { "vpslldq",  { Vex, Ux, Ib }, PREFIX_DATA },
3072
  },
3073
  /* REG_VEX_0FAE */
3074
  {
3075
    { Bad_Opcode },
3076
    { Bad_Opcode },
3077
    { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2) },
3078
    { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3) },
3079
  },
3080
  /* REG_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0 */
3081
  {
3082
    { RM_TABLE (RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0_R_0) },
3083
  },
3084
  /* REG_VEX_0F38F3_L_0_P_0 */
3085
  {
3086
    { Bad_Opcode },
3087
    { "%NFblsrS",   { VexGdq, Edq }, 0 },
3088
    { "%NFblsmskS",   { VexGdq, Edq }, 0 },
3089
    { "%NFblsiS",   { VexGdq, Edq }, 0 },
3090
  },
3091
  /* REG_VEX_MAP7_F6_L_0_W_0 */
3092
  {
3093
    { X86_64_TABLE (X86_64_VEX_MAP7_F6_L_0_W_0_R_0) },
3094
  },
3095
  /* REG_VEX_MAP7_F8_L_0_W_0 */
3096
  {
3097
    { X86_64_TABLE (X86_64_VEX_MAP7_F8_L_0_W_0_R_0) },
3098
  },
3099
  /* REG_XOP_09_01_L_0 */
3100
  {
3101
    { Bad_Opcode },
3102
    { "blcfill",  { VexGdq, Edq }, 0 },
3103
    { "blsfill",  { VexGdq, Edq }, 0 },
3104
    { "blcs", { VexGdq, Edq }, 0 },
3105
    { "tzmsk",  { VexGdq, Edq }, 0 },
3106
    { "blcic",  { VexGdq, Edq }, 0 },
3107
    { "blsic",  { VexGdq, Edq }, 0 },
3108
    { "t1mskc", { VexGdq, Edq }, 0 },
3109
  },
3110
  /* REG_XOP_09_02_L_0 */
3111
  {
3112
    { Bad_Opcode },
3113
    { "blcmsk", { VexGdq, Edq }, 0 },
3114
    { Bad_Opcode },
3115
    { Bad_Opcode },
3116
    { Bad_Opcode },
3117
    { Bad_Opcode },
3118
    { "blci", { VexGdq, Edq }, 0 },
3119
  },
3120
  /* REG_XOP_09_12_L_0 */
3121
  {
3122
    { "llwpcb", { Rdq }, 0 },
3123
    { "slwpcb", { Rdq }, 0 },
3124
  },
3125
  /* REG_XOP_0A_12_L_0 */
3126
  {
3127
    { "lwpins", { VexGdq, Ed, Id }, 0 },
3128
    { "lwpval", { VexGdq, Ed, Id }, 0 },
3129
  },
3130
3131
#include "i386-dis-evex-reg.h"
3132
};
3133
3134
static const struct dis386 prefix_table[][4] = {
3135
  /* PREFIX_90 */
3136
  {
3137
    { "xchgS", { { NOP_Fixup, 0 }, { NOP_Fixup, 1 } }, 0 },
3138
    { "pause", { XX }, 0 },
3139
    { "xchgS", { { NOP_Fixup, 0 }, { NOP_Fixup, 1 } }, 0 },
3140
    { NULL, { { NULL, 0 } }, PREFIX_IGNORED }
3141
  },
3142
3143
  /* PREFIX_0F00_REG_6_X86_64 */
3144
  {
3145
    { Bad_Opcode },
3146
    { Bad_Opcode },
3147
    { Bad_Opcode },
3148
    { "lkgsD", { Sv }, 0 },
3149
  },
3150
3151
  /* PREFIX_0F01_REG_0_MOD_3_RM_6 */
3152
  {
3153
    { "wrmsrns",        { Skip_MODRM }, 0 },
3154
    { X86_64_TABLE (X86_64_0F01_REG_0_MOD_3_RM_6_P_1) },
3155
    { Bad_Opcode },
3156
    { X86_64_TABLE (X86_64_0F01_REG_0_MOD_3_RM_6_P_3) },
3157
  },
3158
3159
  /* PREFIX_0F01_REG_0_MOD_3_RM_7 */
3160
  {
3161
    { X86_64_TABLE (X86_64_0F01_REG_0_MOD_3_RM_7_P_0) },
3162
  },
3163
3164
  /* PREFIX_0F01_REG_1_RM_2 */
3165
  {
3166
    { "clac",   { Skip_MODRM }, 0 },
3167
    { X86_64_TABLE (X86_64_0F01_REG_1_RM_2_PREFIX_1) },
3168
    { Bad_Opcode },
3169
    { X86_64_TABLE (X86_64_0F01_REG_1_RM_2_PREFIX_3)},
3170
  },
3171
3172
  /* PREFIX_0F01_REG_1_RM_4 */
3173
  {
3174
    { Bad_Opcode },
3175
    { Bad_Opcode },
3176
    { "tdcall",   { Skip_MODRM }, 0 },
3177
    { Bad_Opcode },
3178
  },
3179
3180
  /* PREFIX_0F01_REG_1_RM_5 */
3181
  {
3182
    { Bad_Opcode },
3183
    { Bad_Opcode },
3184
    { X86_64_TABLE (X86_64_0F01_REG_1_RM_5_PREFIX_2) },
3185
    { Bad_Opcode },
3186
  },
3187
3188
  /* PREFIX_0F01_REG_1_RM_6 */
3189
  {
3190
    { Bad_Opcode },
3191
    { Bad_Opcode },
3192
    { X86_64_TABLE (X86_64_0F01_REG_1_RM_6_PREFIX_2) },
3193
    { Bad_Opcode },
3194
  },
3195
3196
  /* PREFIX_0F01_REG_1_RM_7 */
3197
  {
3198
    { "encls",    { Skip_MODRM }, 0 },
3199
    { Bad_Opcode },
3200
    { X86_64_TABLE (X86_64_0F01_REG_1_RM_7_PREFIX_2) },
3201
    { Bad_Opcode },
3202
  },
3203
3204
  /* PREFIX_0F01_REG_3_RM_1 */
3205
  {
3206
    { "vmmcall",  { Skip_MODRM }, 0 },
3207
    { "vmgexit",  { Skip_MODRM }, 0 },
3208
    { Bad_Opcode },
3209
    { "vmgexit",  { Skip_MODRM }, 0 },
3210
  },
3211
3212
  /* PREFIX_0F01_REG_5_MOD_0 */
3213
  {
3214
    { Bad_Opcode },
3215
    { "rstorssp", { Mq }, PREFIX_OPCODE },
3216
  },
3217
3218
  /* PREFIX_0F01_REG_5_MOD_3_RM_0 */
3219
  {
3220
    { "serialize",  { Skip_MODRM }, PREFIX_OPCODE },
3221
    { "setssbsy", { Skip_MODRM }, PREFIX_OPCODE },
3222
    { Bad_Opcode },
3223
    { "xsusldtrk",  { Skip_MODRM }, PREFIX_OPCODE },
3224
  },
3225
3226
  /* PREFIX_0F01_REG_5_MOD_3_RM_1 */
3227
  {
3228
    { Bad_Opcode },
3229
    { Bad_Opcode },
3230
    { Bad_Opcode },
3231
    { "xresldtrk",     { Skip_MODRM }, PREFIX_OPCODE },
3232
  },
3233
3234
  /* PREFIX_0F01_REG_5_MOD_3_RM_2 */
3235
  {
3236
    { Bad_Opcode },
3237
    { "saveprevssp",  { Skip_MODRM }, PREFIX_OPCODE },
3238
  },
3239
3240
  /* PREFIX_0F01_REG_5_MOD_3_RM_4 */
3241
  {
3242
    { Bad_Opcode },
3243
    { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1) },
3244
  },
3245
3246
  /* PREFIX_0F01_REG_5_MOD_3_RM_5 */
3247
  {
3248
    { Bad_Opcode },
3249
    { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1) },
3250
  },
3251
3252
  /* PREFIX_0F01_REG_5_MOD_3_RM_6 */
3253
  {
3254
    { "rdpkru", { Skip_MODRM }, 0 },
3255
    { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1) },
3256
  },
3257
3258
  /* PREFIX_0F01_REG_5_MOD_3_RM_7 */
3259
  {
3260
    { "wrpkru", { Skip_MODRM }, 0 },
3261
    { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1) },
3262
  },
3263
3264
  /* PREFIX_0F01_REG_7_MOD_3_RM_2 */
3265
  {
3266
    { "monitorx", { { OP_Monitor, 0 } }, 0  },
3267
    { "mcommit",  { Skip_MODRM }, 0 },
3268
  },
3269
3270
  /* PREFIX_0F01_REG_7_MOD_3_RM_5 */
3271
  {
3272
    { "rdpru", { Skip_MODRM }, 0 },
3273
    { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_1) },
3274
    { Bad_Opcode },
3275
    { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_3) },
3276
  },
3277
3278
  /* PREFIX_0F01_REG_7_MOD_3_RM_6 */
3279
  {
3280
    { "invlpgb",        { Skip_MODRM }, 0 },
3281
    { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1) },
3282
    { Bad_Opcode },
3283
    { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3) },
3284
  },
3285
3286
  /* PREFIX_0F01_REG_7_MOD_3_RM_7 */
3287
  {
3288
    { "tlbsync",        { Skip_MODRM }, 0 },
3289
    { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1) },
3290
    { Bad_Opcode },
3291
    { "pvalidate",      { Skip_MODRM }, 0 },
3292
  },
3293
3294
  /* PREFIX_0F09 */
3295
  {
3296
    { "wbinvd",   { XX }, 0 },
3297
    { "wbnoinvd", { XX }, 0 },
3298
  },
3299
3300
  /* PREFIX_0F10 */
3301
  {
3302
    { "%XEVmovupX", { XM, EXEvexXNoBcst }, 0 },
3303
    { "%XEVmovs%XS",  { XMScalar, VexScalarR, EXd }, 0 },
3304
    { "%XEVmovupX", { XM, EXEvexXNoBcst }, 0 },
3305
    { "%XEVmovs%XD",  { XMScalar, VexScalarR, EXq }, 0 },
3306
  },
3307
3308
  /* PREFIX_0F11 */
3309
  {
3310
    { "%XEVmovupX", { EXxS, XM }, 0 },
3311
    { "%XEVmovs%XS",  { EXdS, VexScalarR, XMScalar }, 0 },
3312
    { "%XEVmovupX", { EXxS, XM }, 0 },
3313
    { "%XEVmovs%XD",  { EXqS, VexScalarR, XMScalar }, 0 },
3314
  },
3315
3316
  /* PREFIX_0F12 */
3317
  {
3318
    { MOD_TABLE (MOD_0F12_PREFIX_0) },
3319
    { "movsldup", { XM, EXx }, 0 },
3320
    { "%XEVmovlpYX",  { XM, Vex, Mq }, 0 },
3321
    { "movddup",  { XM, EXq }, 0 },
3322
  },
3323
3324
  /* PREFIX_0F16 */
3325
  {
3326
    { MOD_TABLE (MOD_0F16_PREFIX_0) },
3327
    { "movshdup", { XM, EXx }, 0 },
3328
    { "%XEVmovhpYX",  { XM, Vex, Mq }, 0 },
3329
  },
3330
3331
  /* PREFIX_0F18_REG_6_MOD_0_X86_64 */
3332
  {
3333
    { "prefetchit1",  { { PREFETCHI_Fixup, b_mode } }, 0 },
3334
    { "nopQ",   { Ev }, 0 },
3335
    { "nopQ",   { Ev }, 0 },
3336
    { "nopQ",   { Ev }, 0 },
3337
  },
3338
3339
  /* PREFIX_0F18_REG_7_MOD_0_X86_64 */
3340
  {
3341
    { "prefetchit0",  { { PREFETCHI_Fixup, b_mode } }, 0 },
3342
    { "nopQ",   { Ev }, 0 },
3343
    { "nopQ",   { Ev }, 0 },
3344
    { "nopQ",   { Ev }, 0 },
3345
  },
3346
3347
  /* PREFIX_0F1A */
3348
  {
3349
    { MOD_TABLE (MOD_0F1A_PREFIX_0) },
3350
    { "bndcl",  { Gbnd, Ev_bnd }, 0 },
3351
    { "bndmov", { Gbnd, Ebnd }, 0 },
3352
    { "bndcu",  { Gbnd, Ev_bnd }, 0 },
3353
  },
3354
3355
  /* PREFIX_0F1B */
3356
  {
3357
    { MOD_TABLE (MOD_0F1B_PREFIX_0) },
3358
    { MOD_TABLE (MOD_0F1B_PREFIX_1) },
3359
    { "bndmov", { EbndS, Gbnd }, 0 },
3360
    { "bndcn",  { Gbnd, Ev_bnd }, 0 },
3361
  },
3362
3363
  /* PREFIX_0F1C */
3364
  {
3365
    { MOD_TABLE (MOD_0F1C_PREFIX_0) },
3366
    { "nopQ", { Ev }, PREFIX_IGNORED },
3367
    { "nopQ", { Ev }, 0 },
3368
    { "nopQ", { Ev }, PREFIX_IGNORED },
3369
  },
3370
3371
  /* PREFIX_0F1E */
3372
  {
3373
    { "nopQ", { Ev }, 0 },
3374
    { MOD_TABLE (MOD_0F1E_PREFIX_1) },
3375
    { "nopQ", { Ev }, 0 },
3376
    { NULL, { XX }, PREFIX_IGNORED },
3377
  },
3378
3379
  /* PREFIX_0F2A */
3380
  {
3381
    { "cvtpi2ps", { XM, EMCq }, PREFIX_OPCODE },
3382
    { "cvtsi2ss{%LQ|}", { XM, Edq }, PREFIX_OPCODE },
3383
    { "cvtpi2pd", { XM, EMCq }, PREFIX_OPCODE },
3384
    { "cvtsi2sd{%LQ|}", { XM, Edq }, 0 },
3385
  },
3386
3387
  /* PREFIX_0F2B */
3388
  {
3389
    { "movntps", { Mx, XM }, 0 },
3390
    { "movntss", { Md, XM }, 0 },
3391
    { "movntpd", { Mx, XM }, 0 },
3392
    { "movntsd", { Mq, XM }, 0 },
3393
  },
3394
3395
  /* PREFIX_0F2C */
3396
  {
3397
    { "cvttps2pi", { MXC, EXq }, PREFIX_OPCODE },
3398
    { "cvttss2si", { Gdq, EXd }, PREFIX_OPCODE },
3399
    { "cvttpd2pi", { MXC, EXx }, PREFIX_OPCODE },
3400
    { "cvttsd2si", { Gdq, EXq }, PREFIX_OPCODE },
3401
  },
3402
3403
  /* PREFIX_0F2D */
3404
  {
3405
    { "cvtps2pi", { MXC, EXq }, PREFIX_OPCODE },
3406
    { "cvtss2si", { Gdq, EXd }, PREFIX_OPCODE },
3407
    { "cvtpd2pi", { MXC, EXx }, PREFIX_OPCODE },
3408
    { "cvtsd2si", { Gdq, EXq }, PREFIX_OPCODE },
3409
  },
3410
3411
  /* PREFIX_0F2E */
3412
  {
3413
    { "VucomisYX",  { XMScalar, EXd, EXxEVexS }, 0 },
3414
    { Bad_Opcode },
3415
    { "VucomisYX",  { XMScalar, EXq, EXxEVexS }, 0 },
3416
  },
3417
3418
  /* PREFIX_0F2F */
3419
  {
3420
    { "VcomisYX", { XMScalar, EXd, EXxEVexS }, 0 },
3421
    { Bad_Opcode },
3422
    { "VcomisYX", { XMScalar, EXq, EXxEVexS }, 0 },
3423
  },
3424
3425
  /* PREFIX_0F51 */
3426
  {
3427
    { "%XEVsqrtpX", { XM, EXx, EXxEVexR }, 0 },
3428
    { "%XEVsqrts%XS", { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
3429
    { "%XEVsqrtpX", { XM, EXx, EXxEVexR }, 0 },
3430
    { "%XEVsqrts%XD", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3431
  },
3432
3433
  /* PREFIX_0F52 */
3434
  {
3435
    { "Vrsqrtps", { XM, EXx }, 0 },
3436
    { "Vrsqrtss", { XMScalar, VexScalar, EXd }, 0 },
3437
  },
3438
3439
  /* PREFIX_0F53 */
3440
  {
3441
    { "Vrcpps",   { XM, EXx }, 0 },
3442
    { "Vrcpss",   { XMScalar, VexScalar, EXd }, 0 },
3443
  },
3444
3445
  /* PREFIX_0F58 */
3446
  {
3447
    { "%XEVaddpX",  { XM, Vex, EXx, EXxEVexR }, 0 },
3448
    { "%XEVadds%XS",  { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
3449
    { "%XEVaddpX",  { XM, Vex, EXx, EXxEVexR }, 0 },
3450
    { "%XEVadds%XD",  { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3451
  },
3452
3453
  /* PREFIX_0F59 */
3454
  {
3455
    { "%XEVmulpX",  { XM, Vex, EXx, EXxEVexR }, 0 },
3456
    { "%XEVmuls%XS",  { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
3457
    { "%XEVmulpX",  { XM, Vex, EXx, EXxEVexR }, 0 },
3458
    { "%XEVmuls%XD",  { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3459
  },
3460
3461
  /* PREFIX_0F5A */
3462
  {
3463
    { "%XEVcvtp%XS2pd", { XM, EXEvexHalfBcstXmmq, EXxEVexS }, 0 },
3464
    { "%XEVcvts%XS2sd", { XMScalar, VexScalar, EXd, EXxEVexS }, 0 },
3465
    { "%XEVcvtp%XD2ps%XY", { XMxmmq, EXx, EXxEVexR }, 0 },
3466
    { "%XEVcvts%XD2ss", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3467
  },
3468
3469
  /* PREFIX_0F5B */
3470
  {
3471
    { "Vcvtdq2ps",  { XM, EXx }, 0 },
3472
    { "Vcvttps2dq", { XM, EXx }, 0 },
3473
    { "Vcvtps2dq",  { XM, EXx }, 0 },
3474
  },
3475
3476
  /* PREFIX_0F5C */
3477
  {
3478
    { "%XEVsubpX",  { XM, Vex, EXx, EXxEVexR }, 0 },
3479
    { "%XEVsubs%XS",  { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
3480
    { "%XEVsubpX",  { XM, Vex, EXx, EXxEVexR }, 0 },
3481
    { "%XEVsubs%XD",  { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3482
  },
3483
3484
  /* PREFIX_0F5D */
3485
  {
3486
    { "%XEVminpX",  { XM, Vex, EXx, EXxEVexS }, 0 },
3487
    { "%XEVmins%XS",  { XMScalar, VexScalar, EXd, EXxEVexS }, 0 },
3488
    { "%XEVminpX",  { XM, Vex, EXx, EXxEVexS }, 0 },
3489
    { "%XEVmins%XD",  { XMScalar, VexScalar, EXq, EXxEVexS }, 0 },
3490
  },
3491
3492
  /* PREFIX_0F5E */
3493
  {
3494
    { "%XEVdivpX",  { XM, Vex, EXx, EXxEVexR }, 0 },
3495
    { "%XEVdivs%XS",  { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
3496
    { "%XEVdivpX",  { XM, Vex, EXx, EXxEVexR }, 0 },
3497
    { "%XEVdivs%XD",  { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3498
  },
3499
3500
  /* PREFIX_0F5F */
3501
  {
3502
    { "%XEVmaxpX",  { XM, Vex, EXx, EXxEVexS }, 0 },
3503
    { "%XEVmaxs%XS",  { XMScalar, VexScalar, EXd, EXxEVexS }, 0 },
3504
    { "%XEVmaxpX",  { XM, Vex, EXx, EXxEVexS }, 0 },
3505
    { "%XEVmaxs%XD",  { XMScalar, VexScalar, EXq, EXxEVexS }, 0 },
3506
  },
3507
3508
  /* PREFIX_0F60 */
3509
  {
3510
    { "punpcklbw",{ MX, EMd }, PREFIX_OPCODE },
3511
    { Bad_Opcode },
3512
    { "punpcklbw",{ MX, EMx }, PREFIX_OPCODE },
3513
  },
3514
3515
  /* PREFIX_0F61 */
3516
  {
3517
    { "punpcklwd",{ MX, EMd }, PREFIX_OPCODE },
3518
    { Bad_Opcode },
3519
    { "punpcklwd",{ MX, EMx }, PREFIX_OPCODE },
3520
  },
3521
3522
  /* PREFIX_0F62 */
3523
  {
3524
    { "punpckldq",{ MX, EMd }, PREFIX_OPCODE },
3525
    { Bad_Opcode },
3526
    { "punpckldq",{ MX, EMx }, PREFIX_OPCODE },
3527
  },
3528
3529
  /* PREFIX_0F6F */
3530
  {
3531
    { "movq", { MX, EM }, PREFIX_OPCODE },
3532
    { "movdqu", { XM, EXx }, PREFIX_OPCODE },
3533
    { "movdqa", { XM, EXx }, PREFIX_OPCODE },
3534
  },
3535
3536
  /* PREFIX_0F70 */
3537
  {
3538
    { "pshufw", { MX, EM, Ib }, PREFIX_OPCODE },
3539
    { "pshufhw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3540
    { "pshufd", { XM, EXx, Ib }, PREFIX_OPCODE },
3541
    { "pshuflw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3542
  },
3543
3544
  /* PREFIX_0F78 */
3545
  {
3546
    {"vmread",  { Em, Gm }, 0 },
3547
    { Bad_Opcode },
3548
    {"extrq", { Uxmm, Ib, Ib }, 0 },
3549
    {"insertq", { XM, Uxmm, Ib, Ib }, 0 },
3550
  },
3551
3552
  /* PREFIX_0F79 */
3553
  {
3554
    {"vmwrite", { Gm, Em }, 0 },
3555
    { Bad_Opcode },
3556
    {"extrq", { XM, Uxmm }, 0 },
3557
    {"insertq", { XM, Uxmm }, 0 },
3558
  },
3559
3560
  /* PREFIX_0F7C */
3561
  {
3562
    { Bad_Opcode },
3563
    { Bad_Opcode },
3564
    { "Vhaddpd",  { XM, Vex, EXx }, 0 },
3565
    { "Vhaddps",  { XM, Vex, EXx }, 0 },
3566
  },
3567
3568
  /* PREFIX_0F7D */
3569
  {
3570
    { Bad_Opcode },
3571
    { Bad_Opcode },
3572
    { "Vhsubpd",  { XM, Vex, EXx }, 0 },
3573
    { "Vhsubps",  { XM, Vex, EXx }, 0 },
3574
  },
3575
3576
  /* PREFIX_0F7E */
3577
  {
3578
    { "movK", { Edq, MX }, PREFIX_OPCODE },
3579
    { "movq", { XM, EXq }, PREFIX_OPCODE },
3580
    { "movK", { Edq, XM }, PREFIX_OPCODE },
3581
  },
3582
3583
  /* PREFIX_0F7F */
3584
  {
3585
    { "movq", { EMS, MX }, PREFIX_OPCODE },
3586
    { "movdqu", { EXxS, XM }, PREFIX_OPCODE },
3587
    { "movdqa", { EXxS, XM }, PREFIX_OPCODE },
3588
  },
3589
3590
  /* PREFIX_0FA6_REG_0 */
3591
  {
3592
    { Bad_Opcode },
3593
    { "montmul",  { { MONTMUL_Fixup, 0 } }, 0},
3594
    { Bad_Opcode },
3595
    { "sm2",  { Skip_MODRM }, 0 },
3596
  },
3597
3598
  /* PREFIX_0FA6_REG_5 */
3599
  {
3600
    { Bad_Opcode },
3601
    { "sm3",  { Skip_MODRM }, 0 },
3602
  },
3603
3604
  /* PREFIX_0FA7_REG_6 */
3605
  {
3606
    { Bad_Opcode },
3607
    { "sm4",  { Skip_MODRM }, 0 },
3608
  },
3609
3610
  /* PREFIX_0FAE_REG_0_MOD_3 */
3611
  {
3612
    { Bad_Opcode },
3613
    { X86_64_TABLE (X86_64_0FAE_REG_0_MOD_3_PREFIX_1) },
3614
  },
3615
3616
  /* PREFIX_0FAE_REG_1_MOD_3 */
3617
  {
3618
    { Bad_Opcode },
3619
    { X86_64_TABLE (X86_64_0FAE_REG_1_MOD_3_PREFIX_1) },
3620
  },
3621
3622
  /* PREFIX_0FAE_REG_2_MOD_3 */
3623
  {
3624
    { Bad_Opcode },
3625
    { X86_64_TABLE (X86_64_0FAE_REG_2_MOD_3_PREFIX_1) },
3626
  },
3627
3628
  /* PREFIX_0FAE_REG_3_MOD_3 */
3629
  {
3630
    { Bad_Opcode },
3631
    { X86_64_TABLE (X86_64_0FAE_REG_3_MOD_3_PREFIX_1) },
3632
  },
3633
3634
  /* PREFIX_0FAE_REG_4_MOD_0 */
3635
  {
3636
    { "xsave",  { FXSAVE }, PREFIX_REX2_ILLEGAL },
3637
    { "ptwrite{%LQ|}", { Edq }, 0 },
3638
  },
3639
3640
  /* PREFIX_0FAE_REG_4_MOD_3 */
3641
  {
3642
    { Bad_Opcode },
3643
    { "ptwrite{%LQ|}", { Edq }, 0 },
3644
  },
3645
3646
  /* PREFIX_0FAE_REG_5_MOD_3 */
3647
  {
3648
    { "lfence",   { Skip_MODRM }, 0 },
3649
    { "incsspK",  { Edq }, PREFIX_OPCODE },
3650
  },
3651
3652
  /* PREFIX_0FAE_REG_6_MOD_0 */
3653
  {
3654
    { "xsaveopt", { FXSAVE }, PREFIX_OPCODE | PREFIX_REX2_ILLEGAL },
3655
    { "clrssbsy", { Mq }, PREFIX_OPCODE },
3656
    { "clwb", { Mb }, PREFIX_OPCODE },
3657
  },
3658
3659
  /* PREFIX_0FAE_REG_6_MOD_3 */
3660
  {
3661
    { RM_TABLE (RM_0FAE_REG_6_MOD_3_P_0) },
3662
    { "umonitor", { Eva }, PREFIX_OPCODE },
3663
    { "tpause", { Edq }, PREFIX_OPCODE },
3664
    { "umwait", { Edq }, PREFIX_OPCODE },
3665
  },
3666
3667
  /* PREFIX_0FAE_REG_7_MOD_0 */
3668
  {
3669
    { "clflush",  { Mb }, 0 },
3670
    { Bad_Opcode },
3671
    { "clflushopt", { Mb }, 0 },
3672
  },
3673
3674
  /* PREFIX_0FB8 */
3675
  {
3676
    { Bad_Opcode },
3677
    { "popcntS", { Gv, Ev }, 0 },
3678
  },
3679
3680
  /* PREFIX_0FBC */
3681
  {
3682
    { "bsfS", { Gv, Ev }, 0 },
3683
    { "tzcntS", { Gv, Ev }, 0 },
3684
    { "bsfS", { Gv, Ev }, 0 },
3685
  },
3686
3687
  /* PREFIX_0FBD */
3688
  {
3689
    { "bsrS", { Gv, Ev }, 0 },
3690
    { "lzcntS", { Gv, Ev }, 0 },
3691
    { "bsrS", { Gv, Ev }, 0 },
3692
  },
3693
3694
  /* PREFIX_0FC2 */
3695
  {
3696
    { "VcmppX", { XM, Vex, EXx, CMP }, 0 },
3697
    { "Vcmpss", { XMScalar, VexScalar, EXd, CMP }, 0 },
3698
    { "VcmppX", { XM, Vex, EXx, CMP }, 0 },
3699
    { "Vcmpsd", { XMScalar, VexScalar, EXq, CMP }, 0 },
3700
  },
3701
3702
  /* PREFIX_0FC7_REG_6_MOD_0 */
3703
  {
3704
    { "vmptrld",{ Mq }, 0 },
3705
    { "vmxon",  { Mq }, 0 },
3706
    { "vmclear",{ Mq }, 0 },
3707
  },
3708
3709
  /* PREFIX_0FC7_REG_6_MOD_3 */
3710
  {
3711
    { "rdrand", { Ev }, 0 },
3712
    { X86_64_TABLE (X86_64_0FC7_REG_6_MOD_3_PREFIX_1) },
3713
    { "rdrand", { Ev }, 0 }
3714
  },
3715
3716
  /* PREFIX_0FC7_REG_7_MOD_3 */
3717
  {
3718
    { "rdseed", { Ev }, 0 },
3719
    { "rdpid",  { Em }, 0 },
3720
    { "rdseed", { Ev }, 0 },
3721
  },
3722
3723
  /* PREFIX_0FD0 */
3724
  {
3725
    { Bad_Opcode },
3726
    { Bad_Opcode },
3727
    { "VaddsubpX",  { XM, Vex, EXx }, 0 },
3728
    { "VaddsubpX",  { XM, Vex, EXx }, 0 },
3729
  },
3730
3731
  /* PREFIX_0FD6 */
3732
  {
3733
    { Bad_Opcode },
3734
    { "movq2dq",{ XM, Nq }, 0 },
3735
    { "movq", { EXqS, XM }, 0 },
3736
    { "movdq2q",{ MX, Ux }, 0 },
3737
  },
3738
3739
  /* PREFIX_0FE6 */
3740
  {
3741
    { Bad_Opcode },
3742
    { "Vcvtdq2pd",  { XM, EXxmmq }, 0 },
3743
    { "Vcvttpd2dq%XY",  { XMM, EXx }, 0 },
3744
    { "Vcvtpd2dq%XY", { XMM, EXx }, 0 },
3745
  },
3746
3747
  /* PREFIX_0FE7 */
3748
  {
3749
    { "movntq",   { Mq, MX }, 0 },
3750
    { Bad_Opcode },
3751
    { "movntdq",  { Mx, XM }, 0 },
3752
  },
3753
3754
  /* PREFIX_0FF0 */
3755
  {
3756
    { Bad_Opcode },
3757
    { Bad_Opcode },
3758
    { Bad_Opcode },
3759
    { "Vlddqu",   { XM, M }, 0 },
3760
  },
3761
3762
  /* PREFIX_0FF7 */
3763
  {
3764
    { "maskmovq", { MX, Nq }, PREFIX_OPCODE },
3765
    { Bad_Opcode },
3766
    { "maskmovdqu", { XM, Ux }, PREFIX_OPCODE },
3767
  },
3768
3769
  /* PREFIX_0F38D8 */
3770
  {
3771
    { Bad_Opcode },
3772
    { REG_TABLE (REG_0F38D8_PREFIX_1) },
3773
  },
3774
3775
  /* PREFIX_0F38DC */
3776
  {
3777
    { Bad_Opcode },
3778
    { MOD_TABLE (MOD_0F38DC_PREFIX_1) },
3779
    { "aesenc", { XM, EXx }, 0 },
3780
  },
3781
3782
  /* PREFIX_0F38DD */
3783
  {
3784
    { Bad_Opcode },
3785
    { "aesdec128kl", { XM, M }, 0 },
3786
    { "aesenclast", { XM, EXx }, 0 },
3787
  },
3788
3789
  /* PREFIX_0F38DE */
3790
  {
3791
    { Bad_Opcode },
3792
    { "aesenc256kl", { XM, M }, 0 },
3793
    { "aesdec", { XM, EXx }, 0 },
3794
  },
3795
3796
  /* PREFIX_0F38DF */
3797
  {
3798
    { Bad_Opcode },
3799
    { "aesdec256kl", { XM, M }, 0 },
3800
    { "aesdeclast", { XM, EXx }, 0 },
3801
  },
3802
3803
  /* PREFIX_0F38F0 */
3804
  {
3805
    { "movbeS", { Gv, Mv }, PREFIX_OPCODE },
3806
    { Bad_Opcode },
3807
    { "movbeS", { Gv, Mv }, PREFIX_OPCODE },
3808
    { "crc32A", { Gdq, Eb }, PREFIX_OPCODE },
3809
  },
3810
3811
  /* PREFIX_0F38F1 */
3812
  {
3813
    { "movbeS", { Mv, Gv }, PREFIX_OPCODE },
3814
    { Bad_Opcode },
3815
    { "movbeS", { Mv, Gv }, PREFIX_OPCODE },
3816
    { "crc32Q", { Gdq, Ev }, PREFIX_OPCODE },
3817
  },
3818
3819
  /* PREFIX_0F38F6 */
3820
  {
3821
    { "wrssK",  { M, Gdq }, 0 },
3822
    { "adoxL",  { VexGdq, Gdq, Edq }, 0 },
3823
    { "adcxL",  { VexGdq, Gdq, Edq }, 0 },
3824
    { Bad_Opcode },
3825
  },
3826
3827
  /* PREFIX_0F38F8_M_0 */
3828
  {
3829
    { Bad_Opcode },
3830
    { "enqcmds", { Gva, M }, 0 },
3831
    { "movdir64b", { Gva, M }, 0 },
3832
    { "enqcmd", { Gva, M }, 0 },
3833
  },
3834
3835
  /* PREFIX_0F38F8_M_1_X86_64 */
3836
  {
3837
    { Bad_Opcode },
3838
    { "uwrmsr",   { Gq, Rq }, 0 },
3839
    { Bad_Opcode },
3840
    { "urdmsr",   { Rq, Gq }, 0 },
3841
  },
3842
3843
  /* PREFIX_0F38FA */
3844
  {
3845
    { Bad_Opcode },
3846
    { "encodekey128", { Gd, Rd }, 0 },
3847
  },
3848
3849
  /* PREFIX_0F38FB */
3850
  {
3851
    { Bad_Opcode },
3852
    { "encodekey256", { Gd, Rd }, 0 },
3853
  },
3854
3855
  /* PREFIX_0F38FC */
3856
  {
3857
    { "aadd", { Mdq, Gdq }, 0 },
3858
    { "axor", { Mdq, Gdq }, 0 },
3859
    { "aand", { Mdq, Gdq }, 0 },
3860
    { "aor",  { Mdq, Gdq }, 0 },
3861
  },
3862
3863
  /* PREFIX_0F3A0F */
3864
  {
3865
    { Bad_Opcode },
3866
    { REG_TABLE (REG_0F3A0F_P_1) },
3867
  },
3868
3869
  /* PREFIX_VEX_0F12 */
3870
  {
3871
    { VEX_LEN_TABLE (VEX_LEN_0F12_P_0) },
3872
    { "%XEvmov%XSldup", { XM, EXEvexXNoBcst }, 0 },
3873
    { VEX_LEN_TABLE (VEX_LEN_0F12_P_2) },
3874
    { "%XEvmov%XDdup",  { XM, EXymmq }, 0 },
3875
  },
3876
3877
  /* PREFIX_VEX_0F16 */
3878
  {
3879
    { VEX_LEN_TABLE (VEX_LEN_0F16_P_0) },
3880
    { "%XEvmov%XShdup", { XM, EXEvexXNoBcst }, 0 },
3881
    { VEX_LEN_TABLE (VEX_LEN_0F16_P_2) },
3882
  },
3883
3884
  /* PREFIX_VEX_0F2A */
3885
  {
3886
    { Bad_Opcode },
3887
    { "%XEvcvtsi2ssY{%LQ|}",  { XMScalar, VexScalar, EXxEVexR, Edq }, 0 },
3888
    { Bad_Opcode },
3889
    { "%XEvcvtsi2sdY{%LQ|}",  { XMScalar, VexScalar, EXxEVexR64, Edq }, 0 },
3890
  },
3891
3892
  /* PREFIX_VEX_0F2C */
3893
  {
3894
    { Bad_Opcode },
3895
    { "%XEvcvttss2si",  { Gdq, EXd, EXxEVexS }, 0 },
3896
    { Bad_Opcode },
3897
    { "%XEvcvttsd2si",  { Gdq, EXq, EXxEVexS }, 0 },
3898
  },
3899
3900
  /* PREFIX_VEX_0F2D */
3901
  {
3902
    { Bad_Opcode },
3903
    { "%XEvcvtss2si", { Gdq, EXd, EXxEVexR }, 0 },
3904
    { Bad_Opcode },
3905
    { "%XEvcvtsd2si", { Gdq, EXq, EXxEVexR }, 0 },
3906
  },
3907
3908
  /* PREFIX_VEX_0F41_L_1_W_0 */
3909
  {
3910
    { "kandw",          { MaskG, MaskVex, MaskR }, 0 },
3911
    { Bad_Opcode },
3912
    { "kandb",          { MaskG, MaskVex, MaskR }, 0 },
3913
  },
3914
3915
  /* PREFIX_VEX_0F41_L_1_W_1 */
3916
  {
3917
    { "kandq",          { MaskG, MaskVex, MaskR }, 0 },
3918
    { Bad_Opcode },
3919
    { "kandd",          { MaskG, MaskVex, MaskR }, 0 },
3920
  },
3921
3922
  /* PREFIX_VEX_0F42_L_1_W_0 */
3923
  {
3924
    { "kandnw",         { MaskG, MaskVex, MaskR }, 0 },
3925
    { Bad_Opcode },
3926
    { "kandnb",         { MaskG, MaskVex, MaskR }, 0 },
3927
  },
3928
3929
  /* PREFIX_VEX_0F42_L_1_W_1 */
3930
  {
3931
    { "kandnq",         { MaskG, MaskVex, MaskR }, 0 },
3932
    { Bad_Opcode },
3933
    { "kandnd",         { MaskG, MaskVex, MaskR }, 0 },
3934
  },
3935
3936
  /* PREFIX_VEX_0F44_L_0_W_0 */
3937
  {
3938
    { "knotw",          { MaskG, MaskR }, 0 },
3939
    { Bad_Opcode },
3940
    { "knotb",          { MaskG, MaskR }, 0 },
3941
  },
3942
3943
  /* PREFIX_VEX_0F44_L_0_W_1 */
3944
  {
3945
    { "knotq",          { MaskG, MaskR }, 0 },
3946
    { Bad_Opcode },
3947
    { "knotd",          { MaskG, MaskR }, 0 },
3948
  },
3949
3950
  /* PREFIX_VEX_0F45_L_1_W_0 */
3951
  {
3952
    { "korw",       { MaskG, MaskVex, MaskR }, 0 },
3953
    { Bad_Opcode },
3954
    { "korb",       { MaskG, MaskVex, MaskR }, 0 },
3955
  },
3956
3957
  /* PREFIX_VEX_0F45_L_1_W_1 */
3958
  {
3959
    { "korq",       { MaskG, MaskVex, MaskR }, 0 },
3960
    { Bad_Opcode },
3961
    { "kord",       { MaskG, MaskVex, MaskR }, 0 },
3962
  },
3963
3964
  /* PREFIX_VEX_0F46_L_1_W_0 */
3965
  {
3966
    { "kxnorw",     { MaskG, MaskVex, MaskR }, 0 },
3967
    { Bad_Opcode },
3968
    { "kxnorb",     { MaskG, MaskVex, MaskR }, 0 },
3969
  },
3970
3971
  /* PREFIX_VEX_0F46_L_1_W_1 */
3972
  {
3973
    { "kxnorq",     { MaskG, MaskVex, MaskR }, 0 },
3974
    { Bad_Opcode },
3975
    { "kxnord",     { MaskG, MaskVex, MaskR }, 0 },
3976
  },
3977
3978
  /* PREFIX_VEX_0F47_L_1_W_0 */
3979
  {
3980
    { "kxorw",      { MaskG, MaskVex, MaskR }, 0 },
3981
    { Bad_Opcode },
3982
    { "kxorb",      { MaskG, MaskVex, MaskR }, 0 },
3983
  },
3984
3985
  /* PREFIX_VEX_0F47_L_1_W_1 */
3986
  {
3987
    { "kxorq",      { MaskG, MaskVex, MaskR }, 0 },
3988
    { Bad_Opcode },
3989
    { "kxord",      { MaskG, MaskVex, MaskR }, 0 },
3990
  },
3991
3992
  /* PREFIX_VEX_0F4A_L_1_W_0 */
3993
  {
3994
    { "kaddw",          { MaskG, MaskVex, MaskR }, 0 },
3995
    { Bad_Opcode },
3996
    { "kaddb",          { MaskG, MaskVex, MaskR }, 0 },
3997
  },
3998
3999
  /* PREFIX_VEX_0F4A_L_1_W_1 */
4000
  {
4001
    { "kaddq",          { MaskG, MaskVex, MaskR }, 0 },
4002
    { Bad_Opcode },
4003
    { "kaddd",          { MaskG, MaskVex, MaskR }, 0 },
4004
  },
4005
4006
  /* PREFIX_VEX_0F4B_L_1_W_0 */
4007
  {
4008
    { "kunpckwd",   { MaskG, MaskVex, MaskR }, 0 },
4009
    { Bad_Opcode },
4010
    { "kunpckbw",   { MaskG, MaskVex, MaskR }, 0 },
4011
  },
4012
4013
  /* PREFIX_VEX_0F4B_L_1_W_1 */
4014
  {
4015
    { "kunpckdq",   { MaskG, MaskVex, MaskR }, 0 },
4016
  },
4017
4018
  /* PREFIX_VEX_0F6F */
4019
  {
4020
    { Bad_Opcode },
4021
    { "vmovdqu",  { XM, EXx }, 0 },
4022
    { "vmovdqa",  { XM, EXx }, 0 },
4023
  },
4024
4025
  /* PREFIX_VEX_0F70 */
4026
  {
4027
    { Bad_Opcode },
4028
    { "vpshufhw", { XM, EXx, Ib }, 0 },
4029
    { "vpshufd",  { XM, EXx, Ib }, 0 },
4030
    { "vpshuflw", { XM, EXx, Ib }, 0 },
4031
  },
4032
4033
  /* PREFIX_VEX_0F7E */
4034
  {
4035
    { Bad_Opcode },
4036
    { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1) },
4037
    { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2) },
4038
  },
4039
4040
  /* PREFIX_VEX_0F7F */
4041
  {
4042
    { Bad_Opcode },
4043
    { "vmovdqu",  { EXxS, XM }, 0 },
4044
    { "vmovdqa",  { EXxS, XM }, 0 },
4045
  },
4046
4047
  /* PREFIX_VEX_0F90_L_0_W_0 */
4048
  {
4049
    { "%XEkmovw",   { MaskG, MaskE }, 0 },
4050
    { Bad_Opcode },
4051
    { "%XEkmovb",   { MaskG, MaskBDE }, 0 },
4052
  },
4053
4054
  /* PREFIX_VEX_0F90_L_0_W_1 */
4055
  {
4056
    { "%XEkmovq",   { MaskG, MaskE }, 0 },
4057
    { Bad_Opcode },
4058
    { "%XEkmovd",   { MaskG, MaskBDE }, 0 },
4059
  },
4060
4061
  /* PREFIX_VEX_0F91_L_0_W_0 */
4062
  {
4063
    { "%XEkmovw",   { Mw, MaskG }, 0 },
4064
    { Bad_Opcode },
4065
    { "%XEkmovb",   { Mb, MaskG }, 0 },
4066
  },
4067
4068
  /* PREFIX_VEX_0F91_L_0_W_1 */
4069
  {
4070
    { "%XEkmovq",   { Mq, MaskG }, 0 },
4071
    { Bad_Opcode },
4072
    { "%XEkmovd",   { Md, MaskG }, 0 },
4073
  },
4074
4075
  /* PREFIX_VEX_0F92_L_0_W_0 */
4076
  {
4077
    { "%XEkmovw",   { MaskG, Rdq }, 0 },
4078
    { Bad_Opcode },
4079
    { "%XEkmovb",   { MaskG, Rdq }, 0 },
4080
    { "%XEkmovd",   { MaskG, Rdq }, 0 },
4081
  },
4082
4083
  /* PREFIX_VEX_0F92_L_0_W_1 */
4084
  {
4085
    { Bad_Opcode },
4086
    { Bad_Opcode },
4087
    { Bad_Opcode },
4088
    { "%XEkmovK",   { MaskG, Rdq }, 0 },
4089
  },
4090
4091
  /* PREFIX_VEX_0F93_L_0_W_0 */
4092
  {
4093
    { "%XEkmovw",   { Gdq, MaskR }, 0 },
4094
    { Bad_Opcode },
4095
    { "%XEkmovb",   { Gdq, MaskR }, 0 },
4096
    { "%XEkmovd",   { Gdq, MaskR }, 0 },
4097
  },
4098
4099
  /* PREFIX_VEX_0F93_L_0_W_1 */
4100
  {
4101
    { Bad_Opcode },
4102
    { Bad_Opcode },
4103
    { Bad_Opcode },
4104
    { "%XEkmovK",   { Gdq, MaskR }, 0 },
4105
  },
4106
4107
  /* PREFIX_VEX_0F98_L_0_W_0 */
4108
  {
4109
    { "kortestw", { MaskG, MaskR }, 0 },
4110
    { Bad_Opcode },
4111
    { "kortestb", { MaskG, MaskR }, 0 },
4112
  },
4113
4114
  /* PREFIX_VEX_0F98_L_0_W_1 */
4115
  {
4116
    { "kortestq", { MaskG, MaskR }, 0 },
4117
    { Bad_Opcode },
4118
    { "kortestd", { MaskG, MaskR }, 0 },
4119
  },
4120
4121
  /* PREFIX_VEX_0F99_L_0_W_0 */
4122
  {
4123
    { "ktestw", { MaskG, MaskR }, 0 },
4124
    { Bad_Opcode },
4125
    { "ktestb", { MaskG, MaskR }, 0 },
4126
  },
4127
4128
  /* PREFIX_VEX_0F99_L_0_W_1 */
4129
  {
4130
    { "ktestq", { MaskG, MaskR }, 0 },
4131
    { Bad_Opcode },
4132
    { "ktestd", { MaskG, MaskR }, 0 },
4133
  },
4134
4135
  /* PREFIX_VEX_0F3848_X86_64_L_0_W_0 */
4136
  {
4137
    { "ttmmultf32ps", { TMM, Rtmm, VexTmm }, 0 },
4138
    { Bad_Opcode },
4139
    { "tmmultf32ps",  { TMM, Rtmm, VexTmm }, 0 },
4140
  },
4141
4142
  /* PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_0 */
4143
  {
4144
    { "ldtilecfg", { M }, 0 },
4145
    { Bad_Opcode },
4146
    { "sttilecfg", { M }, 0 },
4147
  },
4148
4149
  /* PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_1 */
4150
  {
4151
    { REG_TABLE (REG_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0) },
4152
    { Bad_Opcode },
4153
    { Bad_Opcode },
4154
    { RM_TABLE (RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_3) },
4155
  },
4156
4157
  /* PREFIX_VEX_0F384A_X86_64_W_0_L_0 */
4158
  {
4159
    { Bad_Opcode },
4160
    { Bad_Opcode },
4161
    { "tileloaddrst1",  { TMM, MVexSIBMEM }, 0 },
4162
    { "tileloaddrs",  { TMM, MVexSIBMEM }, 0 },
4163
  },
4164
4165
  /* PREFIX_VEX_0F384B_X86_64_L_0_W_0 */
4166
  {
4167
    { Bad_Opcode },
4168
    { "tilestored", { MVexSIBMEM, TMM }, 0 },
4169
    { "tileloaddt1",  { TMM, MVexSIBMEM }, 0 },
4170
    { "tileloadd",  { TMM, MVexSIBMEM }, 0 },
4171
  },
4172
4173
  /* PREFIX_VEX_0F3850_W_0 */
4174
  {
4175
    { "%XEvpdpbuud",  { XM, Vex, EXx }, 0 },
4176
    { "%XEvpdpbsud",  { XM, Vex, EXx }, 0 },
4177
    { "%XVvpdpbusd",  { XM, Vex, EXx }, 0 },
4178
    { "%XEvpdpbssd",  { XM, Vex, EXx }, 0 },
4179
  },
4180
4181
  /* PREFIX_VEX_0F3851_W_0 */
4182
  {
4183
    { "%XEvpdpbuuds", { XM, Vex, EXx }, 0 },
4184
    { "%XEvpdpbsuds", { XM, Vex, EXx }, 0 },
4185
    { "%XVvpdpbusds", { XM, Vex, EXx }, 0 },
4186
    { "%XEvpdpbssds", { XM, Vex, EXx }, 0 },
4187
  },
4188
  /* PREFIX_VEX_0F385C_X86_64_L_0_W_0 */
4189
  {
4190
    { Bad_Opcode },
4191
    { "tdpbf16ps", { TMM, Rtmm, VexTmm }, 0 },
4192
    { Bad_Opcode },
4193
    { "tdpfp16ps", { TMM, Rtmm, VexTmm }, 0 },
4194
  },
4195
4196
  /* PREFIX_VEX_0F385E_X86_64_L_0_W_0 */
4197
  {
4198
    { "tdpbuud", {TMM, Rtmm, VexTmm }, 0 },
4199
    { "tdpbsud", {TMM, Rtmm, VexTmm }, 0 },
4200
    { "tdpbusd", {TMM, Rtmm, VexTmm }, 0 },
4201
    { "tdpbssd", {TMM, Rtmm, VexTmm }, 0 },
4202
  },
4203
4204
  /* PREFIX_VEX_0F385F_X86_64_L_0_W_0 */
4205
  {
4206
    { Bad_Opcode },
4207
    { "ttransposed",  { TMM, Rtmm }, 0 },
4208
  },
4209
4210
  /* PREFIX_VEX_0F386B_X86_64_L_0_W_0 */
4211
  {
4212
    { "tconjtcmmimfp16ps",  { TMM, Rtmm, VexTmm }, 0 },
4213
    { "ttcmmrlfp16ps",  { TMM, Rtmm, VexTmm }, 0 },
4214
    { "tconjtfp16", { TMM, Rtmm }, 0 },
4215
    { "ttcmmimfp16ps",  { TMM, Rtmm, VexTmm }, 0 },
4216
  },
4217
4218
  /* PREFIX_VEX_0F386C_X86_64_L_0_W_0 */
4219
  {
4220
    { "tcmmrlfp16ps", { TMM, Rtmm, VexTmm }, 0 },
4221
    { "ttdpbf16ps", { TMM, Rtmm, VexTmm }, 0 },
4222
    { "tcmmimfp16ps", { TMM, Rtmm, VexTmm }, 0 },
4223
    { "ttdpfp16ps", { TMM, Rtmm, VexTmm }, 0 },
4224
  },
4225
4226
  /* PREFIX_VEX_0F386E_X86_64_L_0_W_0 */
4227
  {
4228
    { "t2rpntlvwz0",  { TMM, MVexSIBMEM }, 0 },
4229
    { Bad_Opcode },
4230
    { "t2rpntlvwz1",  { TMM, MVexSIBMEM }, 0 },
4231
  },
4232
4233
  /* PREFIX_VEX_0F386F_X86_64_L_0_W_0 */
4234
  {
4235
    { "t2rpntlvwz0t1",  { TMM, MVexSIBMEM }, 0 },
4236
    { Bad_Opcode },
4237
    { "t2rpntlvwz1t1",  { TMM, MVexSIBMEM }, 0 },
4238
  },
4239
4240
  /* PREFIX_VEX_0F3872 */
4241
  {
4242
    { Bad_Opcode },
4243
    { VEX_W_TABLE (VEX_W_0F3872_P_1) },
4244
  },
4245
4246
  /* PREFIX_VEX_0F38B0_W_0 */
4247
  {
4248
    { "vcvtneoph2ps", { XM, Mx }, 0 },
4249
    { "vcvtneebf162ps", { XM, Mx }, 0 },
4250
    { "vcvtneeph2ps", { XM, Mx }, 0 },
4251
    { "vcvtneobf162ps", { XM, Mx }, 0 },
4252
  },
4253
4254
  /* PREFIX_VEX_0F38B1_W_0 */
4255
  {
4256
    { Bad_Opcode },
4257
    { "vbcstnebf162ps", { XM, Mw }, 0 },
4258
    { "vbcstnesh2ps", { XM, Mw }, 0 },
4259
  },
4260
4261
  /* PREFIX_VEX_0F38D2_W_0 */
4262
  {
4263
    { "%XEvpdpwuud",  { XM, Vex, EXx }, 0 },
4264
    { "%XEvpdpwsud",  { XM, Vex, EXx }, 0 },
4265
    { "%XEvpdpwusd",  { XM, Vex, EXx }, 0 },
4266
  },
4267
4268
  /* PREFIX_VEX_0F38D3_W_0 */
4269
  {
4270
    { "%XEvpdpwuuds", { XM, Vex, EXx }, 0 },
4271
    { "%XEvpdpwsuds", { XM, Vex, EXx }, 0 },
4272
    { "%XEvpdpwusds", { XM, Vex, EXx }, 0 },
4273
  },
4274
4275
  /* PREFIX_VEX_0F38CB */
4276
  {
4277
    { Bad_Opcode },
4278
    { Bad_Opcode },
4279
    { Bad_Opcode },
4280
    { VEX_W_TABLE (VEX_W_0F38CB_P_3) },
4281
  },
4282
4283
  /* PREFIX_VEX_0F38CC */
4284
  {
4285
    { Bad_Opcode },
4286
    { Bad_Opcode },
4287
    { Bad_Opcode },
4288
    { VEX_W_TABLE (VEX_W_0F38CC_P_3) },
4289
  },
4290
4291
  /* PREFIX_VEX_0F38CD */
4292
  {
4293
    { Bad_Opcode },
4294
    { Bad_Opcode },
4295
    { Bad_Opcode },
4296
    { VEX_W_TABLE (VEX_W_0F38CD_P_3) },
4297
  },
4298
4299
  /* PREFIX_VEX_0F38DA_W_0 */
4300
  {
4301
    { VEX_LEN_TABLE (VEX_LEN_0F38DA_W_0_P_0) },
4302
    { "%XEvsm4key4",  { XM, Vex, EXx }, 0 },
4303
    { VEX_LEN_TABLE (VEX_LEN_0F38DA_W_0_P_2) },
4304
    { "%XEvsm4rnds4", { XM, Vex, EXx }, 0 },
4305
  },
4306
4307
  /* PREFIX_VEX_0F38F2_L_0 */
4308
  {
4309
    { "%NFandnS",          { Gdq, VexGdq, Edq }, 0 },
4310
  },
4311
4312
  /* PREFIX_VEX_0F38F3_L_0 */
4313
  {
4314
    { REG_TABLE (REG_VEX_0F38F3_L_0_P_0) },
4315
  },
4316
4317
  /* PREFIX_VEX_0F38F5_L_0 */
4318
  {
4319
    { "%NFbzhiS", { Gdq, Edq, VexGdq }, 0 },
4320
    { "%XEpextS",   { Gdq, VexGdq, Edq }, 0 },
4321
    { Bad_Opcode },
4322
    { "%XEpdepS",   { Gdq, VexGdq, Edq }, 0 },
4323
  },
4324
4325
  /* PREFIX_VEX_0F38F6_L_0 */
4326
  {
4327
    { Bad_Opcode },
4328
    { Bad_Opcode },
4329
    { Bad_Opcode },
4330
    { "%XEmulxS",   { Gdq, VexGdq, Edq }, 0 },
4331
  },
4332
4333
  /* PREFIX_VEX_0F38F7_L_0 */
4334
  {
4335
    { "%NFbextrS",  { Gdq, Edq, VexGdq }, 0 },
4336
    { "%XEsarxS",   { Gdq, Edq, VexGdq }, 0 },
4337
    { "%XEshlxS",   { Gdq, Edq, VexGdq }, 0 },
4338
    { "%XEshrxS",   { Gdq, Edq, VexGdq }, 0 },
4339
  },
4340
4341
  /* PREFIX_VEX_0F3AF0_L_0 */
4342
  {
4343
    { Bad_Opcode },
4344
    { Bad_Opcode },
4345
    { Bad_Opcode },
4346
    { "%XErorxS",   { Gdq, Edq, Ib }, 0 },
4347
  },
4348
4349
  /* PREFIX_VEX_MAP5_F8_X86_64_L_0_W_0 */
4350
  {
4351
    { "t2rpntlvwz0rs",  { TMM, MVexSIBMEM }, 0 },
4352
    { Bad_Opcode },
4353
    { "t2rpntlvwz1rs",  { TMM, MVexSIBMEM }, 0 },
4354
  },
4355
4356
  /* PREFIX_VEX_MAP5_F9_X86_64_L_0_W_0 */
4357
  {
4358
    { "t2rpntlvwz0rst1",  { TMM, MVexSIBMEM }, 0 },
4359
    { Bad_Opcode },
4360
    { "t2rpntlvwz1rst1",  { TMM, MVexSIBMEM }, 0 },
4361
  },
4362
4363
  /* PREFIX_VEX_MAP5_FD_X86_64_L_0_W_0 */
4364
  {
4365
    { "tdpbf8ps", { TMM, Rtmm, VexTmm }, 0 },
4366
    { "tdphbf8ps",  { TMM, Rtmm, VexTmm }, 0 },
4367
    { "tdphf8ps", { TMM, Rtmm, VexTmm }, 0 },
4368
    { "tdpbhf8ps",  { TMM, Rtmm, VexTmm }, 0 },
4369
  },
4370
4371
  /* PREFIX_VEX_MAP7_F6_L_0_W_0_R_0_X86_64 */
4372
  {
4373
    { Bad_Opcode },
4374
    { "wrmsrns",  { Skip_MODRM, Id, Rq }, 0 },
4375
    { Bad_Opcode },
4376
    { "rdmsr",    { Rq, Id }, 0 },
4377
  },
4378
4379
  /* PREFIX_VEX_MAP7_F8_L_0_W_0_R_0_X86_64 */
4380
  {
4381
    { Bad_Opcode },
4382
    { "uwrmsr", { Skip_MODRM, Id, Rq }, 0 },
4383
    { Bad_Opcode },
4384
    { "urdmsr", { Rq, Id }, 0 },
4385
  },
4386
4387
#include "i386-dis-evex-prefix.h"
4388
};
4389
4390
static const struct dis386 x86_64_table[][2] = {
4391
  /* X86_64_06 */
4392
  {
4393
    { "pushP", { es }, 0 },
4394
  },
4395
4396
  /* X86_64_07 */
4397
  {
4398
    { "popP", { es }, 0 },
4399
  },
4400
4401
  /* X86_64_0E */
4402
  {
4403
    { "pushP", { cs }, 0 },
4404
  },
4405
4406
  /* X86_64_16 */
4407
  {
4408
    { "pushP", { ss }, 0 },
4409
  },
4410
4411
  /* X86_64_17 */
4412
  {
4413
    { "popP", { ss }, 0 },
4414
  },
4415
4416
  /* X86_64_1E */
4417
  {
4418
    { "pushP", { ds }, 0 },
4419
  },
4420
4421
  /* X86_64_1F */
4422
  {
4423
    { "popP", { ds }, 0 },
4424
  },
4425
4426
  /* X86_64_27 */
4427
  {
4428
    { "daa", { XX }, 0 },
4429
  },
4430
4431
  /* X86_64_2F */
4432
  {
4433
    { "das", { XX }, 0 },
4434
  },
4435
4436
  /* X86_64_37 */
4437
  {
4438
    { "aaa", { XX }, 0 },
4439
  },
4440
4441
  /* X86_64_3F */
4442
  {
4443
    { "aas", { XX }, 0 },
4444
  },
4445
4446
  /* X86_64_60 */
4447
  {
4448
    { "pushaP", { XX }, 0 },
4449
  },
4450
4451
  /* X86_64_61 */
4452
  {
4453
    { "popaP", { XX }, 0 },
4454
  },
4455
4456
  /* X86_64_62 */
4457
  {
4458
    { MOD_TABLE (MOD_62_32BIT) },
4459
    { EVEX_TABLE () },
4460
  },
4461
4462
  /* X86_64_63 */
4463
  {
4464
    { "arplS", { Sv, Gv }, 0 },
4465
    { "movs", { Gv, { MOVSXD_Fixup, movsxd_mode } }, 0 },
4466
  },
4467
4468
  /* X86_64_6D */
4469
  {
4470
    { "ins{R|}", { Yzr, indirDX }, 0 },
4471
    { "ins{G|}", { Yzr, indirDX }, 0 },
4472
  },
4473
4474
  /* X86_64_6F */
4475
  {
4476
    { "outs{R|}", { indirDXr, Xz }, 0 },
4477
    { "outs{G|}", { indirDXr, Xz }, 0 },
4478
  },
4479
4480
  /* X86_64_82 */
4481
  {
4482
    /* Opcode 0x82 is an alias of opcode 0x80 in 32-bit mode.  */
4483
    { REG_TABLE (REG_80) },
4484
  },
4485
4486
  /* X86_64_9A */
4487
  {
4488
    { "{l|}call{P|}", { Ap }, 0 },
4489
  },
4490
4491
  /* X86_64_C2 */
4492
  {
4493
    { "retP",   { Iw, BND }, 0 },
4494
    { "ret@",   { Iw, BND }, 0 },
4495
  },
4496
4497
  /* X86_64_C3 */
4498
  {
4499
    { "retP",   { BND }, 0 },
4500
    { "ret@",   { BND }, 0 },
4501
  },
4502
4503
  /* X86_64_C4 */
4504
  {
4505
    { MOD_TABLE (MOD_C4_32BIT) },
4506
    { VEX_C4_TABLE () },
4507
  },
4508
4509
  /* X86_64_C5 */
4510
  {
4511
    { MOD_TABLE (MOD_C5_32BIT) },
4512
    { VEX_C5_TABLE () },
4513
  },
4514
4515
  /* X86_64_CE */
4516
  {
4517
    { "into", { XX }, 0 },
4518
  },
4519
4520
  /* X86_64_D4 */
4521
  {
4522
    { "aam", { Ib }, 0 },
4523
  },
4524
4525
  /* X86_64_D5 */
4526
  {
4527
    { "aad", { Ib }, 0 },
4528
  },
4529
4530
  /* X86_64_D6 */
4531
  {
4532
    { "salc", { XX }, 0 },
4533
    { "udb", { XX }, 0 },
4534
  },
4535
4536
  /* X86_64_E8 */
4537
  {
4538
    { "callP",    { Jv, BND }, 0 },
4539
    { "call@",    { Jv, BND }, PREFIX_REX2_ILLEGAL }
4540
  },
4541
4542
  /* X86_64_E9 */
4543
  {
4544
    { "jmpP",   { Jv, BND }, 0 },
4545
    { "jmp@",   { Jv, BND }, PREFIX_REX2_ILLEGAL }
4546
  },
4547
4548
  /* X86_64_EA */
4549
  {
4550
    { "{l|}jmp{P|}", { Ap }, 0 },
4551
  },
4552
4553
  /* X86_64_0F00_REG_6 */
4554
  {
4555
    { Bad_Opcode },
4556
    { PREFIX_TABLE (PREFIX_0F00_REG_6_X86_64) },
4557
  },
4558
4559
  /* X86_64_0F01_REG_0 */
4560
  {
4561
    { "sgdt{Q|Q}", { M }, 0 },
4562
    { "sgdt", { M }, 0 },
4563
  },
4564
4565
  /* X86_64_0F01_REG_0_MOD_3_RM_6_P_1 */
4566
  {
4567
    { Bad_Opcode },
4568
    { "wrmsrlist",  { Skip_MODRM }, 0 },
4569
  },
4570
4571
  /* X86_64_0F01_REG_0_MOD_3_RM_6_P_3 */
4572
  {
4573
    { Bad_Opcode },
4574
    { "rdmsrlist",  { Skip_MODRM }, 0 },
4575
  },
4576
4577
  /* X86_64_0F01_REG_0_MOD_3_RM_7_P_0 */
4578
  {
4579
    { Bad_Opcode },
4580
    { "pbndkb",   { Skip_MODRM }, 0 },
4581
  },
4582
4583
  /* X86_64_0F01_REG_1 */
4584
  {
4585
    { "sidt{Q|Q}", { M }, 0 },
4586
    { "sidt", { M }, 0 },
4587
  },
4588
4589
  /* X86_64_0F01_REG_1_RM_2_PREFIX_1 */
4590
  {
4591
    { Bad_Opcode },
4592
    { "eretu",    { Skip_MODRM }, 0 },
4593
  },
4594
4595
  /* X86_64_0F01_REG_1_RM_2_PREFIX_3 */
4596
  {
4597
    { Bad_Opcode },
4598
    { "erets",    { Skip_MODRM }, 0 },
4599
  },
4600
4601
  /* X86_64_0F01_REG_1_RM_5_PREFIX_2 */
4602
  {
4603
    { Bad_Opcode },
4604
    { "seamret",  { Skip_MODRM }, 0 },
4605
  },
4606
4607
  /* X86_64_0F01_REG_1_RM_6_PREFIX_2 */
4608
  {
4609
    { Bad_Opcode },
4610
    { "seamops",  { Skip_MODRM }, 0 },
4611
  },
4612
4613
  /* X86_64_0F01_REG_1_RM_7_PREFIX_2 */
4614
  {
4615
    { Bad_Opcode },
4616
    { "seamcall", { Skip_MODRM }, 0 },
4617
  },
4618
4619
  /* X86_64_0F01_REG_2 */
4620
  {
4621
    { "lgdt{Q|Q}", { M }, 0 },
4622
    { "lgdt", { M }, 0 },
4623
  },
4624
4625
  /* X86_64_0F01_REG_3 */
4626
  {
4627
    { "lidt{Q|Q}", { M }, 0 },
4628
    { "lidt", { M }, 0 },
4629
  },
4630
4631
  /* X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1 */
4632
  {
4633
    { Bad_Opcode },
4634
    { "uiret",  { Skip_MODRM }, 0 },
4635
  },
4636
4637
  /* X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1 */
4638
  {
4639
    { Bad_Opcode },
4640
    { "testui", { Skip_MODRM }, 0 },
4641
  },
4642
4643
  /* X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1 */
4644
  {
4645
    { Bad_Opcode },
4646
    { "clui", { Skip_MODRM }, 0 },
4647
  },
4648
4649
  /* X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1 */
4650
  {
4651
    { Bad_Opcode },
4652
    { "stui", { Skip_MODRM }, 0 },
4653
  },
4654
4655
  /* X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_1 */
4656
  {
4657
    { Bad_Opcode },
4658
    { "rmpquery", { Skip_MODRM }, 0 },
4659
  },
4660
4661
  /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3 */
4662
  {
4663
    { Bad_Opcode },
4664
    { "rmpread",  { DSCX, RMrAX, Skip_MODRM }, 0 },
4665
  },
4666
4667
  /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1 */
4668
  {
4669
    { Bad_Opcode },
4670
    { "rmpadjust",  { Skip_MODRM }, 0 },
4671
  },
4672
4673
  /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3 */
4674
  {
4675
    { Bad_Opcode },
4676
    { "rmpupdate",  { RMrAX, DSCX, Skip_MODRM }, 0 },
4677
  },
4678
4679
  /* X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1 */
4680
  {
4681
    { Bad_Opcode },
4682
    { "psmash", { Skip_MODRM }, 0 },
4683
  },
4684
4685
  /* X86_64_0F18_REG_6_MOD_0 */
4686
  {
4687
    { "nopQ",   { Ev }, 0 },
4688
    { PREFIX_TABLE (PREFIX_0F18_REG_6_MOD_0_X86_64) },
4689
  },
4690
4691
  /* X86_64_0F18_REG_7_MOD_0 */
4692
  {
4693
    { "nopQ",   { Ev }, 0 },
4694
    { PREFIX_TABLE (PREFIX_0F18_REG_7_MOD_0_X86_64) },
4695
  },
4696
4697
  {
4698
    /* X86_64_0F24 */
4699
    { "movZ",   { Em, Td }, 0 },
4700
  },
4701
4702
  {
4703
    /* X86_64_0F26 */
4704
    { "movZ",   { Td, Em }, 0 },
4705
  },
4706
4707
  {
4708
    /* X86_64_0F388A */
4709
    { Bad_Opcode },
4710
    { "movrsB",   { Gb, Mb }, PREFIX_OPCODE },
4711
  },
4712
4713
  {
4714
    /* X86_64_0F388B */
4715
    { Bad_Opcode },
4716
    { "movrsS",   { Gv, Mv }, PREFIX_OPCODE },
4717
  },
4718
4719
  {
4720
    /* X86_64_0F38F8_M_1 */
4721
    { Bad_Opcode },
4722
    { PREFIX_TABLE (PREFIX_0F38F8_M_1_X86_64) },
4723
  },
4724
4725
  /* X86_64_0FAE_REG_0_MOD_3_PREFIX_1 */
4726
  {
4727
    { Bad_Opcode },
4728
    { "rdfsbase", { Edq }, 0 },
4729
  },
4730
4731
  /* X86_64_0FAE_REG_1_MOD_3_PREFIX_1 */
4732
  {
4733
    { Bad_Opcode },
4734
    { "rdgsbase", { Edq }, 0 },
4735
  },
4736
4737
  /* X86_64_0FAE_REG_2_MOD_3_PREFIX_1 */
4738
  {
4739
    { Bad_Opcode },
4740
    { "wrfsbase", { Edq }, 0 },
4741
  },
4742
4743
  /* X86_64_0FAE_REG_3_MOD_3_PREFIX_1 */
4744
  {
4745
    { Bad_Opcode },
4746
    { "wrgsbase", { Edq }, 0 },
4747
  },
4748
4749
  /* X86_64_0FC7_REG_6_MOD_3_PREFIX_1 */
4750
  {
4751
    { Bad_Opcode },
4752
    { "senduipi", { Eq }, 0 },
4753
  },
4754
4755
  /* X86_64_VEX_0F3848 */
4756
  {
4757
    { Bad_Opcode },
4758
    { VEX_LEN_TABLE (VEX_LEN_0F3848_X86_64) },
4759
  },
4760
4761
  /* X86_64_VEX_0F3849 */
4762
  {
4763
    { Bad_Opcode },
4764
    { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64) },
4765
  },
4766
4767
  /* X86_64_VEX_0F384A */
4768
  {
4769
    { Bad_Opcode },
4770
    { VEX_W_TABLE (VEX_W_0F384A_X86_64) },
4771
  },
4772
4773
  /* X86_64_VEX_0F384B */
4774
  {
4775
    { Bad_Opcode },
4776
    { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64) },
4777
  },
4778
4779
  /* X86_64_VEX_0F385C */
4780
  {
4781
    { Bad_Opcode },
4782
    { VEX_LEN_TABLE (VEX_LEN_0F385C_X86_64) },
4783
  },
4784
4785
  /* X86_64_VEX_0F385E */
4786
  {
4787
    { Bad_Opcode },
4788
    { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64) },
4789
  },
4790
4791
  /* X86_64_VEX_0F385F */
4792
  {
4793
    { Bad_Opcode },
4794
    { VEX_LEN_TABLE (VEX_LEN_0F385F_X86_64) },
4795
  },
4796
4797
  /* X86_64_VEX_0F386B */
4798
  {
4799
    { Bad_Opcode },
4800
    { VEX_LEN_TABLE (VEX_LEN_0F386B_X86_64) },
4801
  },
4802
4803
  /* X86_64_VEX_0F386C */
4804
  {
4805
    { Bad_Opcode },
4806
    { VEX_LEN_TABLE (VEX_LEN_0F386C_X86_64) },
4807
  },
4808
4809
  /* X86_64_VEX_0F386E */
4810
  {
4811
    { Bad_Opcode },
4812
    { VEX_LEN_TABLE (VEX_LEN_0F386E_X86_64) },
4813
  },
4814
4815
  /* X86_64_VEX_0F386F */
4816
  {
4817
    { Bad_Opcode },
4818
    { VEX_LEN_TABLE (VEX_LEN_0F386F_X86_64) },
4819
  },
4820
4821
  /* X86_64_VEX_0F38Ex */
4822
  {
4823
    { Bad_Opcode },
4824
    { "%XEcmp%CCxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4825
  },
4826
4827
  /* X86_64_VEX_MAP5_F8 */
4828
  {
4829
    { Bad_Opcode },
4830
    { VEX_LEN_TABLE (VEX_LEN_MAP5_F8_X86_64) },
4831
  },
4832
4833
  /* X86_64_VEX_MAP5_F9 */
4834
  {
4835
    { Bad_Opcode },
4836
    { VEX_LEN_TABLE (VEX_LEN_MAP5_F9_X86_64) },
4837
  },
4838
4839
  /* X86_64_VEX_MAP5_FD */
4840
  {
4841
    { Bad_Opcode },
4842
    { VEX_LEN_TABLE (VEX_LEN_MAP5_FD_X86_64) },
4843
  },
4844
4845
  /* X86_64_VEX_MAP7_F6_L_0_W_0_R_0 */
4846
  {
4847
    { Bad_Opcode },
4848
    { PREFIX_TABLE (PREFIX_VEX_MAP7_F6_L_0_W_0_R_0_X86_64) },
4849
  },
4850
4851
  /* X86_64_VEX_MAP7_F8_L_0_W_0_R_0 */
4852
  {
4853
    { Bad_Opcode },
4854
    { PREFIX_TABLE (PREFIX_VEX_MAP7_F8_L_0_W_0_R_0_X86_64) },
4855
  },
4856
4857
#include "i386-dis-evex-x86-64.h"
4858
};
4859
4860
static const struct dis386 three_byte_table[][256] = {
4861
4862
  /* THREE_BYTE_0F38 */
4863
  {
4864
    /* 00 */
4865
    { "pshufb",   { MX, EM }, PREFIX_OPCODE },
4866
    { "phaddw",   { MX, EM }, PREFIX_OPCODE },
4867
    { "phaddd",   { MX, EM }, PREFIX_OPCODE },
4868
    { "phaddsw",  { MX, EM }, PREFIX_OPCODE },
4869
    { "pmaddubsw",  { MX, EM }, PREFIX_OPCODE },
4870
    { "phsubw",   { MX, EM }, PREFIX_OPCODE },
4871
    { "phsubd",   { MX, EM }, PREFIX_OPCODE },
4872
    { "phsubsw",  { MX, EM }, PREFIX_OPCODE },
4873
    /* 08 */
4874
    { "psignb",   { MX, EM }, PREFIX_OPCODE },
4875
    { "psignw",   { MX, EM }, PREFIX_OPCODE },
4876
    { "psignd",   { MX, EM }, PREFIX_OPCODE },
4877
    { "pmulhrsw", { MX, EM }, PREFIX_OPCODE },
4878
    { Bad_Opcode },
4879
    { Bad_Opcode },
4880
    { Bad_Opcode },
4881
    { Bad_Opcode },
4882
    /* 10 */
4883
    { "pblendvb", { XM, EXx, XMM0 }, PREFIX_DATA },
4884
    { Bad_Opcode },
4885
    { Bad_Opcode },
4886
    { Bad_Opcode },
4887
    { "blendvps", { XM, EXx, XMM0 }, PREFIX_DATA },
4888
    { "blendvpd", { XM, EXx, XMM0 }, PREFIX_DATA },
4889
    { Bad_Opcode },
4890
    { "ptest",  { XM, EXx }, PREFIX_DATA },
4891
    /* 18 */
4892
    { Bad_Opcode },
4893
    { Bad_Opcode },
4894
    { Bad_Opcode },
4895
    { Bad_Opcode },
4896
    { "pabsb",    { MX, EM }, PREFIX_OPCODE },
4897
    { "pabsw",    { MX, EM }, PREFIX_OPCODE },
4898
    { "pabsd",    { MX, EM }, PREFIX_OPCODE },
4899
    { Bad_Opcode },
4900
    /* 20 */
4901
    { "pmovsxbw", { XM, EXq }, PREFIX_DATA },
4902
    { "pmovsxbd", { XM, EXd }, PREFIX_DATA },
4903
    { "pmovsxbq", { XM, EXw }, PREFIX_DATA },
4904
    { "pmovsxwd", { XM, EXq }, PREFIX_DATA },
4905
    { "pmovsxwq", { XM, EXd }, PREFIX_DATA },
4906
    { "pmovsxdq", { XM, EXq }, PREFIX_DATA },
4907
    { Bad_Opcode },
4908
    { Bad_Opcode },
4909
    /* 28 */
4910
    { "pmuldq", { XM, EXx }, PREFIX_DATA },
4911
    { "pcmpeqq", { XM, EXx }, PREFIX_DATA },
4912
    { "movntdqa", { XM, Mx }, PREFIX_DATA },
4913
    { "packusdw", { XM, EXx }, PREFIX_DATA },
4914
    { Bad_Opcode },
4915
    { Bad_Opcode },
4916
    { Bad_Opcode },
4917
    { Bad_Opcode },
4918
    /* 30 */
4919
    { "pmovzxbw", { XM, EXq }, PREFIX_DATA },
4920
    { "pmovzxbd", { XM, EXd }, PREFIX_DATA },
4921
    { "pmovzxbq", { XM, EXw }, PREFIX_DATA },
4922
    { "pmovzxwd", { XM, EXq }, PREFIX_DATA },
4923
    { "pmovzxwq", { XM, EXd }, PREFIX_DATA },
4924
    { "pmovzxdq", { XM, EXq }, PREFIX_DATA },
4925
    { Bad_Opcode },
4926
    { "pcmpgtq", { XM, EXx }, PREFIX_DATA },
4927
    /* 38 */
4928
    { "pminsb", { XM, EXx }, PREFIX_DATA },
4929
    { "pminsd", { XM, EXx }, PREFIX_DATA },
4930
    { "pminuw", { XM, EXx }, PREFIX_DATA },
4931
    { "pminud", { XM, EXx }, PREFIX_DATA },
4932
    { "pmaxsb", { XM, EXx }, PREFIX_DATA },
4933
    { "pmaxsd", { XM, EXx }, PREFIX_DATA },
4934
    { "pmaxuw", { XM, EXx }, PREFIX_DATA },
4935
    { "pmaxud", { XM, EXx }, PREFIX_DATA },
4936
    /* 40 */
4937
    { "pmulld", { XM, EXx }, PREFIX_DATA },
4938
    { "phminposuw", { XM, EXx }, PREFIX_DATA },
4939
    { Bad_Opcode },
4940
    { Bad_Opcode },
4941
    { Bad_Opcode },
4942
    { Bad_Opcode },
4943
    { Bad_Opcode },
4944
    { Bad_Opcode },
4945
    /* 48 */
4946
    { Bad_Opcode },
4947
    { Bad_Opcode },
4948
    { Bad_Opcode },
4949
    { Bad_Opcode },
4950
    { Bad_Opcode },
4951
    { Bad_Opcode },
4952
    { Bad_Opcode },
4953
    { Bad_Opcode },
4954
    /* 50 */
4955
    { Bad_Opcode },
4956
    { Bad_Opcode },
4957
    { Bad_Opcode },
4958
    { Bad_Opcode },
4959
    { Bad_Opcode },
4960
    { Bad_Opcode },
4961
    { Bad_Opcode },
4962
    { Bad_Opcode },
4963
    /* 58 */
4964
    { Bad_Opcode },
4965
    { Bad_Opcode },
4966
    { Bad_Opcode },
4967
    { Bad_Opcode },
4968
    { Bad_Opcode },
4969
    { Bad_Opcode },
4970
    { Bad_Opcode },
4971
    { Bad_Opcode },
4972
    /* 60 */
4973
    { Bad_Opcode },
4974
    { Bad_Opcode },
4975
    { Bad_Opcode },
4976
    { Bad_Opcode },
4977
    { Bad_Opcode },
4978
    { Bad_Opcode },
4979
    { Bad_Opcode },
4980
    { Bad_Opcode },
4981
    /* 68 */
4982
    { Bad_Opcode },
4983
    { Bad_Opcode },
4984
    { Bad_Opcode },
4985
    { Bad_Opcode },
4986
    { Bad_Opcode },
4987
    { Bad_Opcode },
4988
    { Bad_Opcode },
4989
    { Bad_Opcode },
4990
    /* 70 */
4991
    { Bad_Opcode },
4992
    { Bad_Opcode },
4993
    { Bad_Opcode },
4994
    { Bad_Opcode },
4995
    { Bad_Opcode },
4996
    { Bad_Opcode },
4997
    { Bad_Opcode },
4998
    { Bad_Opcode },
4999
    /* 78 */
5000
    { Bad_Opcode },
5001
    { Bad_Opcode },
5002
    { Bad_Opcode },
5003
    { Bad_Opcode },
5004
    { Bad_Opcode },
5005
    { Bad_Opcode },
5006
    { Bad_Opcode },
5007
    { Bad_Opcode },
5008
    /* 80 */
5009
    { "invept", { Gm, Mo }, PREFIX_DATA },
5010
    { "invvpid", { Gm, Mo }, PREFIX_DATA },
5011
    { "invpcid", { Gm, M }, PREFIX_DATA },
5012
    { Bad_Opcode },
5013
    { Bad_Opcode },
5014
    { Bad_Opcode },
5015
    { Bad_Opcode },
5016
    { Bad_Opcode },
5017
    /* 88 */
5018
    { Bad_Opcode },
5019
    { Bad_Opcode },
5020
    { X86_64_TABLE (X86_64_0F388A) },
5021
    { X86_64_TABLE (X86_64_0F388B) },
5022
    { Bad_Opcode },
5023
    { Bad_Opcode },
5024
    { Bad_Opcode },
5025
    { Bad_Opcode },
5026
    /* 90 */
5027
    { Bad_Opcode },
5028
    { Bad_Opcode },
5029
    { Bad_Opcode },
5030
    { Bad_Opcode },
5031
    { Bad_Opcode },
5032
    { Bad_Opcode },
5033
    { Bad_Opcode },
5034
    { Bad_Opcode },
5035
    /* 98 */
5036
    { Bad_Opcode },
5037
    { Bad_Opcode },
5038
    { Bad_Opcode },
5039
    { Bad_Opcode },
5040
    { Bad_Opcode },
5041
    { Bad_Opcode },
5042
    { Bad_Opcode },
5043
    { Bad_Opcode },
5044
    /* a0 */
5045
    { Bad_Opcode },
5046
    { Bad_Opcode },
5047
    { Bad_Opcode },
5048
    { Bad_Opcode },
5049
    { Bad_Opcode },
5050
    { Bad_Opcode },
5051
    { Bad_Opcode },
5052
    { Bad_Opcode },
5053
    /* a8 */
5054
    { Bad_Opcode },
5055
    { Bad_Opcode },
5056
    { Bad_Opcode },
5057
    { Bad_Opcode },
5058
    { Bad_Opcode },
5059
    { Bad_Opcode },
5060
    { Bad_Opcode },
5061
    { Bad_Opcode },
5062
    /* b0 */
5063
    { Bad_Opcode },
5064
    { Bad_Opcode },
5065
    { Bad_Opcode },
5066
    { Bad_Opcode },
5067
    { Bad_Opcode },
5068
    { Bad_Opcode },
5069
    { Bad_Opcode },
5070
    { Bad_Opcode },
5071
    /* b8 */
5072
    { Bad_Opcode },
5073
    { Bad_Opcode },
5074
    { Bad_Opcode },
5075
    { Bad_Opcode },
5076
    { Bad_Opcode },
5077
    { Bad_Opcode },
5078
    { Bad_Opcode },
5079
    { Bad_Opcode },
5080
    /* c0 */
5081
    { Bad_Opcode },
5082
    { Bad_Opcode },
5083
    { Bad_Opcode },
5084
    { Bad_Opcode },
5085
    { Bad_Opcode },
5086
    { Bad_Opcode },
5087
    { Bad_Opcode },
5088
    { Bad_Opcode },
5089
    /* c8 */
5090
    { "sha1nexte", { XM, EXxmm }, PREFIX_OPCODE },
5091
    { "sha1msg1", { XM, EXxmm }, PREFIX_OPCODE },
5092
    { "sha1msg2", { XM, EXxmm }, PREFIX_OPCODE },
5093
    { "sha256rnds2", { XM, EXxmm, XMM0 }, PREFIX_OPCODE },
5094
    { "sha256msg1", { XM, EXxmm }, PREFIX_OPCODE },
5095
    { "sha256msg2", { XM, EXxmm }, PREFIX_OPCODE },
5096
    { Bad_Opcode },
5097
    { "gf2p8mulb", { XM, EXxmm }, PREFIX_DATA },
5098
    /* d0 */
5099
    { Bad_Opcode },
5100
    { Bad_Opcode },
5101
    { Bad_Opcode },
5102
    { Bad_Opcode },
5103
    { Bad_Opcode },
5104
    { Bad_Opcode },
5105
    { Bad_Opcode },
5106
    { Bad_Opcode },
5107
    /* d8 */
5108
    { PREFIX_TABLE (PREFIX_0F38D8) },
5109
    { Bad_Opcode },
5110
    { Bad_Opcode },
5111
    { "aesimc", { XM, EXx }, PREFIX_DATA },
5112
    { PREFIX_TABLE (PREFIX_0F38DC) },
5113
    { PREFIX_TABLE (PREFIX_0F38DD) },
5114
    { PREFIX_TABLE (PREFIX_0F38DE) },
5115
    { PREFIX_TABLE (PREFIX_0F38DF) },
5116
    /* e0 */
5117
    { Bad_Opcode },
5118
    { Bad_Opcode },
5119
    { Bad_Opcode },
5120
    { Bad_Opcode },
5121
    { Bad_Opcode },
5122
    { Bad_Opcode },
5123
    { Bad_Opcode },
5124
    { Bad_Opcode },
5125
    /* e8 */
5126
    { Bad_Opcode },
5127
    { Bad_Opcode },
5128
    { Bad_Opcode },
5129
    { Bad_Opcode },
5130
    { Bad_Opcode },
5131
    { Bad_Opcode },
5132
    { Bad_Opcode },
5133
    { Bad_Opcode },
5134
    /* f0 */
5135
    { PREFIX_TABLE (PREFIX_0F38F0) },
5136
    { PREFIX_TABLE (PREFIX_0F38F1) },
5137
    { Bad_Opcode },
5138
    { Bad_Opcode },
5139
    { Bad_Opcode },
5140
    { "wrussK",   { M, Gdq }, PREFIX_DATA },
5141
    { PREFIX_TABLE (PREFIX_0F38F6) },
5142
    { Bad_Opcode },
5143
    /* f8 */
5144
    { MOD_TABLE (MOD_0F38F8) },
5145
    { "movdiri",  { Mdq, Gdq }, PREFIX_OPCODE },
5146
    { PREFIX_TABLE (PREFIX_0F38FA) },
5147
    { PREFIX_TABLE (PREFIX_0F38FB) },
5148
    { PREFIX_TABLE (PREFIX_0F38FC) },
5149
    { Bad_Opcode },
5150
    { Bad_Opcode },
5151
    { Bad_Opcode },
5152
  },
5153
  /* THREE_BYTE_0F3A */
5154
  {
5155
    /* 00 */
5156
    { Bad_Opcode },
5157
    { Bad_Opcode },
5158
    { Bad_Opcode },
5159
    { Bad_Opcode },
5160
    { Bad_Opcode },
5161
    { Bad_Opcode },
5162
    { Bad_Opcode },
5163
    { Bad_Opcode },
5164
    /* 08 */
5165
    { "roundps", { XM, EXx, Ib }, PREFIX_DATA },
5166
    { "roundpd", { XM, EXx, Ib }, PREFIX_DATA },
5167
    { "roundss", { XM, EXd, Ib }, PREFIX_DATA },
5168
    { "roundsd", { XM, EXq, Ib }, PREFIX_DATA },
5169
    { "blendps", { XM, EXx, Ib }, PREFIX_DATA },
5170
    { "blendpd", { XM, EXx, Ib }, PREFIX_DATA },
5171
    { "pblendw", { XM, EXx, Ib }, PREFIX_DATA },
5172
    { "palignr",  { MX, EM, Ib }, PREFIX_OPCODE },
5173
    /* 10 */
5174
    { Bad_Opcode },
5175
    { Bad_Opcode },
5176
    { Bad_Opcode },
5177
    { Bad_Opcode },
5178
    { "pextrb", { Edb, XM, Ib }, PREFIX_DATA },
5179
    { "pextrw", { Edw, XM, Ib }, PREFIX_DATA },
5180
    { "pextrK", { Edq, XM, Ib }, PREFIX_DATA },
5181
    { "extractps", { Ed, XM, Ib }, PREFIX_DATA },
5182
    /* 18 */
5183
    { Bad_Opcode },
5184
    { Bad_Opcode },
5185
    { Bad_Opcode },
5186
    { Bad_Opcode },
5187
    { Bad_Opcode },
5188
    { Bad_Opcode },
5189
    { Bad_Opcode },
5190
    { Bad_Opcode },
5191
    /* 20 */
5192
    { "pinsrb", { XM, Edb, Ib }, PREFIX_DATA },
5193
    { "insertps", { XM, EXd, Ib }, PREFIX_DATA },
5194
    { "pinsrK", { XM, Edq, Ib }, PREFIX_DATA },
5195
    { Bad_Opcode },
5196
    { Bad_Opcode },
5197
    { Bad_Opcode },
5198
    { Bad_Opcode },
5199
    { Bad_Opcode },
5200
    /* 28 */
5201
    { Bad_Opcode },
5202
    { Bad_Opcode },
5203
    { Bad_Opcode },
5204
    { Bad_Opcode },
5205
    { Bad_Opcode },
5206
    { Bad_Opcode },
5207
    { Bad_Opcode },
5208
    { Bad_Opcode },
5209
    /* 30 */
5210
    { Bad_Opcode },
5211
    { Bad_Opcode },
5212
    { Bad_Opcode },
5213
    { Bad_Opcode },
5214
    { Bad_Opcode },
5215
    { Bad_Opcode },
5216
    { Bad_Opcode },
5217
    { Bad_Opcode },
5218
    /* 38 */
5219
    { Bad_Opcode },
5220
    { Bad_Opcode },
5221
    { Bad_Opcode },
5222
    { Bad_Opcode },
5223
    { Bad_Opcode },
5224
    { Bad_Opcode },
5225
    { Bad_Opcode },
5226
    { Bad_Opcode },
5227
    /* 40 */
5228
    { "dpps", { XM, EXx, Ib }, PREFIX_DATA },
5229
    { "dppd", { XM, EXx, Ib }, PREFIX_DATA },
5230
    { "mpsadbw", { XM, EXx, Ib }, PREFIX_DATA },
5231
    { Bad_Opcode },
5232
    { "pclmulqdq", { XM, EXx, PCLMUL }, PREFIX_DATA },
5233
    { Bad_Opcode },
5234
    { Bad_Opcode },
5235
    { Bad_Opcode },
5236
    /* 48 */
5237
    { Bad_Opcode },
5238
    { Bad_Opcode },
5239
    { Bad_Opcode },
5240
    { Bad_Opcode },
5241
    { Bad_Opcode },
5242
    { Bad_Opcode },
5243
    { Bad_Opcode },
5244
    { Bad_Opcode },
5245
    /* 50 */
5246
    { Bad_Opcode },
5247
    { Bad_Opcode },
5248
    { Bad_Opcode },
5249
    { Bad_Opcode },
5250
    { Bad_Opcode },
5251
    { Bad_Opcode },
5252
    { Bad_Opcode },
5253
    { Bad_Opcode },
5254
    /* 58 */
5255
    { Bad_Opcode },
5256
    { Bad_Opcode },
5257
    { Bad_Opcode },
5258
    { Bad_Opcode },
5259
    { Bad_Opcode },
5260
    { Bad_Opcode },
5261
    { Bad_Opcode },
5262
    { Bad_Opcode },
5263
    /* 60 */
5264
    { "pcmpestrm!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
5265
    { "pcmpestri!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
5266
    { "pcmpistrm", { XM, EXx, Ib }, PREFIX_DATA },
5267
    { "pcmpistri", { XM, EXx, Ib }, PREFIX_DATA },
5268
    { Bad_Opcode },
5269
    { Bad_Opcode },
5270
    { Bad_Opcode },
5271
    { Bad_Opcode },
5272
    /* 68 */
5273
    { Bad_Opcode },
5274
    { Bad_Opcode },
5275
    { Bad_Opcode },
5276
    { Bad_Opcode },
5277
    { Bad_Opcode },
5278
    { Bad_Opcode },
5279
    { Bad_Opcode },
5280
    { Bad_Opcode },
5281
    /* 70 */
5282
    { Bad_Opcode },
5283
    { Bad_Opcode },
5284
    { Bad_Opcode },
5285
    { Bad_Opcode },
5286
    { Bad_Opcode },
5287
    { Bad_Opcode },
5288
    { Bad_Opcode },
5289
    { Bad_Opcode },
5290
    /* 78 */
5291
    { Bad_Opcode },
5292
    { Bad_Opcode },
5293
    { Bad_Opcode },
5294
    { Bad_Opcode },
5295
    { Bad_Opcode },
5296
    { Bad_Opcode },
5297
    { Bad_Opcode },
5298
    { Bad_Opcode },
5299
    /* 80 */
5300
    { Bad_Opcode },
5301
    { Bad_Opcode },
5302
    { Bad_Opcode },
5303
    { Bad_Opcode },
5304
    { Bad_Opcode },
5305
    { Bad_Opcode },
5306
    { Bad_Opcode },
5307
    { Bad_Opcode },
5308
    /* 88 */
5309
    { Bad_Opcode },
5310
    { Bad_Opcode },
5311
    { Bad_Opcode },
5312
    { Bad_Opcode },
5313
    { Bad_Opcode },
5314
    { Bad_Opcode },
5315
    { Bad_Opcode },
5316
    { Bad_Opcode },
5317
    /* 90 */
5318
    { Bad_Opcode },
5319
    { Bad_Opcode },
5320
    { Bad_Opcode },
5321
    { Bad_Opcode },
5322
    { Bad_Opcode },
5323
    { Bad_Opcode },
5324
    { Bad_Opcode },
5325
    { Bad_Opcode },
5326
    /* 98 */
5327
    { Bad_Opcode },
5328
    { Bad_Opcode },
5329
    { Bad_Opcode },
5330
    { Bad_Opcode },
5331
    { Bad_Opcode },
5332
    { Bad_Opcode },
5333
    { Bad_Opcode },
5334
    { Bad_Opcode },
5335
    /* a0 */
5336
    { Bad_Opcode },
5337
    { Bad_Opcode },
5338
    { Bad_Opcode },
5339
    { Bad_Opcode },
5340
    { Bad_Opcode },
5341
    { Bad_Opcode },
5342
    { Bad_Opcode },
5343
    { Bad_Opcode },
5344
    /* a8 */
5345
    { Bad_Opcode },
5346
    { Bad_Opcode },
5347
    { Bad_Opcode },
5348
    { Bad_Opcode },
5349
    { Bad_Opcode },
5350
    { Bad_Opcode },
5351
    { Bad_Opcode },
5352
    { Bad_Opcode },
5353
    /* b0 */
5354
    { Bad_Opcode },
5355
    { Bad_Opcode },
5356
    { Bad_Opcode },
5357
    { Bad_Opcode },
5358
    { Bad_Opcode },
5359
    { Bad_Opcode },
5360
    { Bad_Opcode },
5361
    { Bad_Opcode },
5362
    /* b8 */
5363
    { Bad_Opcode },
5364
    { Bad_Opcode },
5365
    { Bad_Opcode },
5366
    { Bad_Opcode },
5367
    { Bad_Opcode },
5368
    { Bad_Opcode },
5369
    { Bad_Opcode },
5370
    { Bad_Opcode },
5371
    /* c0 */
5372
    { Bad_Opcode },
5373
    { Bad_Opcode },
5374
    { Bad_Opcode },
5375
    { Bad_Opcode },
5376
    { Bad_Opcode },
5377
    { Bad_Opcode },
5378
    { Bad_Opcode },
5379
    { Bad_Opcode },
5380
    /* c8 */
5381
    { Bad_Opcode },
5382
    { Bad_Opcode },
5383
    { Bad_Opcode },
5384
    { Bad_Opcode },
5385
    { "sha1rnds4", { XM, EXxmm, Ib }, PREFIX_OPCODE },
5386
    { Bad_Opcode },
5387
    { "gf2p8affineqb", { XM, EXxmm, Ib }, PREFIX_DATA },
5388
    { "gf2p8affineinvqb", { XM, EXxmm, Ib }, PREFIX_DATA },
5389
    /* d0 */
5390
    { Bad_Opcode },
5391
    { Bad_Opcode },
5392
    { Bad_Opcode },
5393
    { Bad_Opcode },
5394
    { Bad_Opcode },
5395
    { Bad_Opcode },
5396
    { Bad_Opcode },
5397
    { Bad_Opcode },
5398
    /* d8 */
5399
    { Bad_Opcode },
5400
    { Bad_Opcode },
5401
    { Bad_Opcode },
5402
    { Bad_Opcode },
5403
    { Bad_Opcode },
5404
    { Bad_Opcode },
5405
    { Bad_Opcode },
5406
    { "aeskeygenassist", { XM, EXx, Ib }, PREFIX_DATA },
5407
    /* e0 */
5408
    { Bad_Opcode },
5409
    { Bad_Opcode },
5410
    { Bad_Opcode },
5411
    { Bad_Opcode },
5412
    { Bad_Opcode },
5413
    { Bad_Opcode },
5414
    { Bad_Opcode },
5415
    { Bad_Opcode },
5416
    /* e8 */
5417
    { Bad_Opcode },
5418
    { Bad_Opcode },
5419
    { Bad_Opcode },
5420
    { Bad_Opcode },
5421
    { Bad_Opcode },
5422
    { Bad_Opcode },
5423
    { Bad_Opcode },
5424
    { Bad_Opcode },
5425
    /* f0 */
5426
    { PREFIX_TABLE (PREFIX_0F3A0F) },
5427
    { Bad_Opcode },
5428
    { Bad_Opcode },
5429
    { Bad_Opcode },
5430
    { Bad_Opcode },
5431
    { Bad_Opcode },
5432
    { Bad_Opcode },
5433
    { Bad_Opcode },
5434
    /* f8 */
5435
    { Bad_Opcode },
5436
    { Bad_Opcode },
5437
    { Bad_Opcode },
5438
    { Bad_Opcode },
5439
    { Bad_Opcode },
5440
    { Bad_Opcode },
5441
    { Bad_Opcode },
5442
    { Bad_Opcode },
5443
  },
5444
};
5445
5446
static const struct dis386 xop_table[][256] = {
5447
  /* XOP_08 */
5448
  {
5449
    /* 00 */
5450
    { Bad_Opcode },
5451
    { Bad_Opcode },
5452
    { Bad_Opcode },
5453
    { Bad_Opcode },
5454
    { Bad_Opcode },
5455
    { Bad_Opcode },
5456
    { Bad_Opcode },
5457
    { Bad_Opcode },
5458
    /* 08 */
5459
    { Bad_Opcode },
5460
    { Bad_Opcode },
5461
    { Bad_Opcode },
5462
    { Bad_Opcode },
5463
    { Bad_Opcode },
5464
    { Bad_Opcode },
5465
    { Bad_Opcode },
5466
    { Bad_Opcode },
5467
    /* 10 */
5468
    { Bad_Opcode },
5469
    { Bad_Opcode },
5470
    { Bad_Opcode },
5471
    { Bad_Opcode },
5472
    { Bad_Opcode },
5473
    { Bad_Opcode },
5474
    { Bad_Opcode },
5475
    { Bad_Opcode },
5476
    /* 18 */
5477
    { Bad_Opcode },
5478
    { Bad_Opcode },
5479
    { Bad_Opcode },
5480
    { Bad_Opcode },
5481
    { Bad_Opcode },
5482
    { Bad_Opcode },
5483
    { Bad_Opcode },
5484
    { Bad_Opcode },
5485
    /* 20 */
5486
    { Bad_Opcode },
5487
    { Bad_Opcode },
5488
    { Bad_Opcode },
5489
    { Bad_Opcode },
5490
    { Bad_Opcode },
5491
    { Bad_Opcode },
5492
    { Bad_Opcode },
5493
    { Bad_Opcode },
5494
    /* 28 */
5495
    { Bad_Opcode },
5496
    { Bad_Opcode },
5497
    { Bad_Opcode },
5498
    { Bad_Opcode },
5499
    { Bad_Opcode },
5500
    { Bad_Opcode },
5501
    { Bad_Opcode },
5502
    { Bad_Opcode },
5503
    /* 30 */
5504
    { Bad_Opcode },
5505
    { Bad_Opcode },
5506
    { Bad_Opcode },
5507
    { Bad_Opcode },
5508
    { Bad_Opcode },
5509
    { Bad_Opcode },
5510
    { Bad_Opcode },
5511
    { Bad_Opcode },
5512
    /* 38 */
5513
    { Bad_Opcode },
5514
    { Bad_Opcode },
5515
    { Bad_Opcode },
5516
    { Bad_Opcode },
5517
    { Bad_Opcode },
5518
    { Bad_Opcode },
5519
    { Bad_Opcode },
5520
    { Bad_Opcode },
5521
    /* 40 */
5522
    { Bad_Opcode },
5523
    { Bad_Opcode },
5524
    { Bad_Opcode },
5525
    { Bad_Opcode },
5526
    { Bad_Opcode },
5527
    { Bad_Opcode },
5528
    { Bad_Opcode },
5529
    { Bad_Opcode },
5530
    /* 48 */
5531
    { Bad_Opcode },
5532
    { Bad_Opcode },
5533
    { Bad_Opcode },
5534
    { Bad_Opcode },
5535
    { Bad_Opcode },
5536
    { Bad_Opcode },
5537
    { Bad_Opcode },
5538
    { Bad_Opcode },
5539
    /* 50 */
5540
    { Bad_Opcode },
5541
    { Bad_Opcode },
5542
    { Bad_Opcode },
5543
    { Bad_Opcode },
5544
    { Bad_Opcode },
5545
    { Bad_Opcode },
5546
    { Bad_Opcode },
5547
    { Bad_Opcode },
5548
    /* 58 */
5549
    { Bad_Opcode },
5550
    { Bad_Opcode },
5551
    { Bad_Opcode },
5552
    { Bad_Opcode },
5553
    { Bad_Opcode },
5554
    { Bad_Opcode },
5555
    { Bad_Opcode },
5556
    { Bad_Opcode },
5557
    /* 60 */
5558
    { Bad_Opcode },
5559
    { Bad_Opcode },
5560
    { Bad_Opcode },
5561
    { Bad_Opcode },
5562
    { Bad_Opcode },
5563
    { Bad_Opcode },
5564
    { Bad_Opcode },
5565
    { Bad_Opcode },
5566
    /* 68 */
5567
    { Bad_Opcode },
5568
    { Bad_Opcode },
5569
    { Bad_Opcode },
5570
    { Bad_Opcode },
5571
    { Bad_Opcode },
5572
    { Bad_Opcode },
5573
    { Bad_Opcode },
5574
    { Bad_Opcode },
5575
    /* 70 */
5576
    { Bad_Opcode },
5577
    { Bad_Opcode },
5578
    { Bad_Opcode },
5579
    { Bad_Opcode },
5580
    { Bad_Opcode },
5581
    { Bad_Opcode },
5582
    { Bad_Opcode },
5583
    { Bad_Opcode },
5584
    /* 78 */
5585
    { Bad_Opcode },
5586
    { Bad_Opcode },
5587
    { Bad_Opcode },
5588
    { Bad_Opcode },
5589
    { Bad_Opcode },
5590
    { Bad_Opcode },
5591
    { Bad_Opcode },
5592
    { Bad_Opcode },
5593
    /* 80 */
5594
    { Bad_Opcode },
5595
    { Bad_Opcode },
5596
    { Bad_Opcode },
5597
    { Bad_Opcode },
5598
    { Bad_Opcode },
5599
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_85) },
5600
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_86) },
5601
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_87) },
5602
    /* 88 */
5603
    { Bad_Opcode },
5604
    { Bad_Opcode },
5605
    { Bad_Opcode },
5606
    { Bad_Opcode },
5607
    { Bad_Opcode },
5608
    { Bad_Opcode },
5609
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_8E) },
5610
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_8F) },
5611
    /* 90 */
5612
    { Bad_Opcode },
5613
    { Bad_Opcode },
5614
    { Bad_Opcode },
5615
    { Bad_Opcode },
5616
    { Bad_Opcode },
5617
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_95) },
5618
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_96) },
5619
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_97) },
5620
    /* 98 */
5621
    { Bad_Opcode },
5622
    { Bad_Opcode },
5623
    { Bad_Opcode },
5624
    { Bad_Opcode },
5625
    { Bad_Opcode },
5626
    { Bad_Opcode },
5627
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_9E) },
5628
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_9F) },
5629
    /* a0 */
5630
    { Bad_Opcode },
5631
    { Bad_Opcode },
5632
    { "vpcmov",   { XM, Vex, EXx, XMVexI4 }, 0 },
5633
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_A3) },
5634
    { Bad_Opcode },
5635
    { Bad_Opcode },
5636
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_A6) },
5637
    { Bad_Opcode },
5638
    /* a8 */
5639
    { Bad_Opcode },
5640
    { Bad_Opcode },
5641
    { Bad_Opcode },
5642
    { Bad_Opcode },
5643
    { Bad_Opcode },
5644
    { Bad_Opcode },
5645
    { Bad_Opcode },
5646
    { Bad_Opcode },
5647
    /* b0 */
5648
    { Bad_Opcode },
5649
    { Bad_Opcode },
5650
    { Bad_Opcode },
5651
    { Bad_Opcode },
5652
    { Bad_Opcode },
5653
    { Bad_Opcode },
5654
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_B6) },
5655
    { Bad_Opcode },
5656
    /* b8 */
5657
    { Bad_Opcode },
5658
    { Bad_Opcode },
5659
    { Bad_Opcode },
5660
    { Bad_Opcode },
5661
    { Bad_Opcode },
5662
    { Bad_Opcode },
5663
    { Bad_Opcode },
5664
    { Bad_Opcode },
5665
    /* c0 */
5666
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_C0) },
5667
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_C1) },
5668
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_C2) },
5669
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_C3) },
5670
    { Bad_Opcode },
5671
    { Bad_Opcode },
5672
    { Bad_Opcode },
5673
    { Bad_Opcode },
5674
    /* c8 */
5675
    { Bad_Opcode },
5676
    { Bad_Opcode },
5677
    { Bad_Opcode },
5678
    { Bad_Opcode },
5679
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_CC) },
5680
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_CD) },
5681
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_CE) },
5682
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_CF) },
5683
    /* d0 */
5684
    { Bad_Opcode },
5685
    { Bad_Opcode },
5686
    { Bad_Opcode },
5687
    { Bad_Opcode },
5688
    { Bad_Opcode },
5689
    { Bad_Opcode },
5690
    { Bad_Opcode },
5691
    { Bad_Opcode },
5692
    /* d8 */
5693
    { Bad_Opcode },
5694
    { Bad_Opcode },
5695
    { Bad_Opcode },
5696
    { Bad_Opcode },
5697
    { Bad_Opcode },
5698
    { Bad_Opcode },
5699
    { Bad_Opcode },
5700
    { Bad_Opcode },
5701
    /* e0 */
5702
    { Bad_Opcode },
5703
    { Bad_Opcode },
5704
    { Bad_Opcode },
5705
    { Bad_Opcode },
5706
    { Bad_Opcode },
5707
    { Bad_Opcode },
5708
    { Bad_Opcode },
5709
    { Bad_Opcode },
5710
    /* e8 */
5711
    { Bad_Opcode },
5712
    { Bad_Opcode },
5713
    { Bad_Opcode },
5714
    { Bad_Opcode },
5715
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_EC) },
5716
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_ED) },
5717
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_EE) },
5718
    { VEX_LEN_TABLE (VEX_LEN_XOP_08_EF) },
5719
    /* f0 */
5720
    { Bad_Opcode },
5721
    { Bad_Opcode },
5722
    { Bad_Opcode },
5723
    { Bad_Opcode },
5724
    { Bad_Opcode },
5725
    { Bad_Opcode },
5726
    { Bad_Opcode },
5727
    { Bad_Opcode },
5728
    /* f8 */
5729
    { Bad_Opcode },
5730
    { Bad_Opcode },
5731
    { Bad_Opcode },
5732
    { Bad_Opcode },
5733
    { Bad_Opcode },
5734
    { Bad_Opcode },
5735
    { Bad_Opcode },
5736
    { Bad_Opcode },
5737
  },
5738
  /* XOP_09 */
5739
  {
5740
    /* 00 */
5741
    { Bad_Opcode },
5742
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_01) },
5743
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_02) },
5744
    { Bad_Opcode },
5745
    { Bad_Opcode },
5746
    { Bad_Opcode },
5747
    { Bad_Opcode },
5748
    { Bad_Opcode },
5749
    /* 08 */
5750
    { Bad_Opcode },
5751
    { Bad_Opcode },
5752
    { Bad_Opcode },
5753
    { Bad_Opcode },
5754
    { Bad_Opcode },
5755
    { Bad_Opcode },
5756
    { Bad_Opcode },
5757
    { Bad_Opcode },
5758
    /* 10 */
5759
    { Bad_Opcode },
5760
    { Bad_Opcode },
5761
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_12) },
5762
    { Bad_Opcode },
5763
    { Bad_Opcode },
5764
    { Bad_Opcode },
5765
    { Bad_Opcode },
5766
    { Bad_Opcode },
5767
    /* 18 */
5768
    { Bad_Opcode },
5769
    { Bad_Opcode },
5770
    { Bad_Opcode },
5771
    { Bad_Opcode },
5772
    { Bad_Opcode },
5773
    { Bad_Opcode },
5774
    { Bad_Opcode },
5775
    { Bad_Opcode },
5776
    /* 20 */
5777
    { Bad_Opcode },
5778
    { Bad_Opcode },
5779
    { Bad_Opcode },
5780
    { Bad_Opcode },
5781
    { Bad_Opcode },
5782
    { Bad_Opcode },
5783
    { Bad_Opcode },
5784
    { Bad_Opcode },
5785
    /* 28 */
5786
    { Bad_Opcode },
5787
    { Bad_Opcode },
5788
    { Bad_Opcode },
5789
    { Bad_Opcode },
5790
    { Bad_Opcode },
5791
    { Bad_Opcode },
5792
    { Bad_Opcode },
5793
    { Bad_Opcode },
5794
    /* 30 */
5795
    { Bad_Opcode },
5796
    { Bad_Opcode },
5797
    { Bad_Opcode },
5798
    { Bad_Opcode },
5799
    { Bad_Opcode },
5800
    { Bad_Opcode },
5801
    { Bad_Opcode },
5802
    { Bad_Opcode },
5803
    /* 38 */
5804
    { Bad_Opcode },
5805
    { Bad_Opcode },
5806
    { Bad_Opcode },
5807
    { Bad_Opcode },
5808
    { Bad_Opcode },
5809
    { Bad_Opcode },
5810
    { Bad_Opcode },
5811
    { Bad_Opcode },
5812
    /* 40 */
5813
    { Bad_Opcode },
5814
    { Bad_Opcode },
5815
    { Bad_Opcode },
5816
    { Bad_Opcode },
5817
    { Bad_Opcode },
5818
    { Bad_Opcode },
5819
    { Bad_Opcode },
5820
    { Bad_Opcode },
5821
    /* 48 */
5822
    { Bad_Opcode },
5823
    { Bad_Opcode },
5824
    { Bad_Opcode },
5825
    { Bad_Opcode },
5826
    { Bad_Opcode },
5827
    { Bad_Opcode },
5828
    { Bad_Opcode },
5829
    { Bad_Opcode },
5830
    /* 50 */
5831
    { Bad_Opcode },
5832
    { Bad_Opcode },
5833
    { Bad_Opcode },
5834
    { Bad_Opcode },
5835
    { Bad_Opcode },
5836
    { Bad_Opcode },
5837
    { Bad_Opcode },
5838
    { Bad_Opcode },
5839
    /* 58 */
5840
    { Bad_Opcode },
5841
    { Bad_Opcode },
5842
    { Bad_Opcode },
5843
    { Bad_Opcode },
5844
    { Bad_Opcode },
5845
    { Bad_Opcode },
5846
    { Bad_Opcode },
5847
    { Bad_Opcode },
5848
    /* 60 */
5849
    { Bad_Opcode },
5850
    { Bad_Opcode },
5851
    { Bad_Opcode },
5852
    { Bad_Opcode },
5853
    { Bad_Opcode },
5854
    { Bad_Opcode },
5855
    { Bad_Opcode },
5856
    { Bad_Opcode },
5857
    /* 68 */
5858
    { Bad_Opcode },
5859
    { Bad_Opcode },
5860
    { Bad_Opcode },
5861
    { Bad_Opcode },
5862
    { Bad_Opcode },
5863
    { Bad_Opcode },
5864
    { Bad_Opcode },
5865
    { Bad_Opcode },
5866
    /* 70 */
5867
    { Bad_Opcode },
5868
    { Bad_Opcode },
5869
    { Bad_Opcode },
5870
    { Bad_Opcode },
5871
    { Bad_Opcode },
5872
    { Bad_Opcode },
5873
    { Bad_Opcode },
5874
    { Bad_Opcode },
5875
    /* 78 */
5876
    { Bad_Opcode },
5877
    { Bad_Opcode },
5878
    { Bad_Opcode },
5879
    { Bad_Opcode },
5880
    { Bad_Opcode },
5881
    { Bad_Opcode },
5882
    { Bad_Opcode },
5883
    { Bad_Opcode },
5884
    /* 80 */
5885
    { VEX_W_TABLE (VEX_W_XOP_09_80) },
5886
    { VEX_W_TABLE (VEX_W_XOP_09_81) },
5887
    { VEX_W_TABLE (VEX_W_XOP_09_82) },
5888
    { VEX_W_TABLE (VEX_W_XOP_09_83) },
5889
    { Bad_Opcode },
5890
    { Bad_Opcode },
5891
    { Bad_Opcode },
5892
    { Bad_Opcode },
5893
    /* 88 */
5894
    { Bad_Opcode },
5895
    { Bad_Opcode },
5896
    { Bad_Opcode },
5897
    { Bad_Opcode },
5898
    { Bad_Opcode },
5899
    { Bad_Opcode },
5900
    { Bad_Opcode },
5901
    { Bad_Opcode },
5902
    /* 90 */
5903
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_90) },
5904
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_91) },
5905
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_92) },
5906
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_93) },
5907
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_94) },
5908
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_95) },
5909
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_96) },
5910
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_97) },
5911
    /* 98 */
5912
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_98) },
5913
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_99) },
5914
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_9A) },
5915
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_9B) },
5916
    { Bad_Opcode },
5917
    { Bad_Opcode },
5918
    { Bad_Opcode },
5919
    { Bad_Opcode },
5920
    /* a0 */
5921
    { Bad_Opcode },
5922
    { Bad_Opcode },
5923
    { Bad_Opcode },
5924
    { Bad_Opcode },
5925
    { Bad_Opcode },
5926
    { Bad_Opcode },
5927
    { Bad_Opcode },
5928
    { Bad_Opcode },
5929
    /* a8 */
5930
    { Bad_Opcode },
5931
    { Bad_Opcode },
5932
    { Bad_Opcode },
5933
    { Bad_Opcode },
5934
    { Bad_Opcode },
5935
    { Bad_Opcode },
5936
    { Bad_Opcode },
5937
    { Bad_Opcode },
5938
    /* b0 */
5939
    { Bad_Opcode },
5940
    { Bad_Opcode },
5941
    { Bad_Opcode },
5942
    { Bad_Opcode },
5943
    { Bad_Opcode },
5944
    { Bad_Opcode },
5945
    { Bad_Opcode },
5946
    { Bad_Opcode },
5947
    /* b8 */
5948
    { Bad_Opcode },
5949
    { Bad_Opcode },
5950
    { Bad_Opcode },
5951
    { Bad_Opcode },
5952
    { Bad_Opcode },
5953
    { Bad_Opcode },
5954
    { Bad_Opcode },
5955
    { Bad_Opcode },
5956
    /* c0 */
5957
    { Bad_Opcode },
5958
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_C1) },
5959
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_C2) },
5960
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_C3) },
5961
    { Bad_Opcode },
5962
    { Bad_Opcode },
5963
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_C6) },
5964
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_C7) },
5965
    /* c8 */
5966
    { Bad_Opcode },
5967
    { Bad_Opcode },
5968
    { Bad_Opcode },
5969
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_CB) },
5970
    { Bad_Opcode },
5971
    { Bad_Opcode },
5972
    { Bad_Opcode },
5973
    { Bad_Opcode },
5974
    /* d0 */
5975
    { Bad_Opcode },
5976
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_D1) },
5977
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_D2) },
5978
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_D3) },
5979
    { Bad_Opcode },
5980
    { Bad_Opcode },
5981
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_D6) },
5982
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_D7) },
5983
    /* d8 */
5984
    { Bad_Opcode },
5985
    { Bad_Opcode },
5986
    { Bad_Opcode },
5987
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_DB) },
5988
    { Bad_Opcode },
5989
    { Bad_Opcode },
5990
    { Bad_Opcode },
5991
    { Bad_Opcode },
5992
    /* e0 */
5993
    { Bad_Opcode },
5994
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_E1) },
5995
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_E2) },
5996
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_E3) },
5997
    { Bad_Opcode },
5998
    { Bad_Opcode },
5999
    { Bad_Opcode },
6000
    { Bad_Opcode },
6001
    /* e8 */
6002
    { Bad_Opcode },
6003
    { Bad_Opcode },
6004
    { Bad_Opcode },
6005
    { Bad_Opcode },
6006
    { Bad_Opcode },
6007
    { Bad_Opcode },
6008
    { Bad_Opcode },
6009
    { Bad_Opcode },
6010
    /* f0 */
6011
    { Bad_Opcode },
6012
    { Bad_Opcode },
6013
    { Bad_Opcode },
6014
    { Bad_Opcode },
6015
    { Bad_Opcode },
6016
    { Bad_Opcode },
6017
    { Bad_Opcode },
6018
    { Bad_Opcode },
6019
    /* f8 */
6020
    { Bad_Opcode },
6021
    { Bad_Opcode },
6022
    { Bad_Opcode },
6023
    { Bad_Opcode },
6024
    { Bad_Opcode },
6025
    { Bad_Opcode },
6026
    { Bad_Opcode },
6027
    { Bad_Opcode },
6028
  },
6029
  /* XOP_0A */
6030
  {
6031
    /* 00 */
6032
    { Bad_Opcode },
6033
    { Bad_Opcode },
6034
    { Bad_Opcode },
6035
    { Bad_Opcode },
6036
    { Bad_Opcode },
6037
    { Bad_Opcode },
6038
    { Bad_Opcode },
6039
    { Bad_Opcode },
6040
    /* 08 */
6041
    { Bad_Opcode },
6042
    { Bad_Opcode },
6043
    { Bad_Opcode },
6044
    { Bad_Opcode },
6045
    { Bad_Opcode },
6046
    { Bad_Opcode },
6047
    { Bad_Opcode },
6048
    { Bad_Opcode },
6049
    /* 10 */
6050
    { "bextrS", { Gdq, Edq, Id }, 0 },
6051
    { Bad_Opcode },
6052
    { VEX_LEN_TABLE (VEX_LEN_XOP_0A_12) },
6053
    { Bad_Opcode },
6054
    { Bad_Opcode },
6055
    { Bad_Opcode },
6056
    { Bad_Opcode },
6057
    { Bad_Opcode },
6058
    /* 18 */
6059
    { Bad_Opcode },
6060
    { Bad_Opcode },
6061
    { Bad_Opcode },
6062
    { Bad_Opcode },
6063
    { Bad_Opcode },
6064
    { Bad_Opcode },
6065
    { Bad_Opcode },
6066
    { Bad_Opcode },
6067
    /* 20 */
6068
    { Bad_Opcode },
6069
    { Bad_Opcode },
6070
    { Bad_Opcode },
6071
    { Bad_Opcode },
6072
    { Bad_Opcode },
6073
    { Bad_Opcode },
6074
    { Bad_Opcode },
6075
    { Bad_Opcode },
6076
    /* 28 */
6077
    { Bad_Opcode },
6078
    { Bad_Opcode },
6079
    { Bad_Opcode },
6080
    { Bad_Opcode },
6081
    { Bad_Opcode },
6082
    { Bad_Opcode },
6083
    { Bad_Opcode },
6084
    { Bad_Opcode },
6085
    /* 30 */
6086
    { Bad_Opcode },
6087
    { Bad_Opcode },
6088
    { Bad_Opcode },
6089
    { Bad_Opcode },
6090
    { Bad_Opcode },
6091
    { Bad_Opcode },
6092
    { Bad_Opcode },
6093
    { Bad_Opcode },
6094
    /* 38 */
6095
    { Bad_Opcode },
6096
    { Bad_Opcode },
6097
    { Bad_Opcode },
6098
    { Bad_Opcode },
6099
    { Bad_Opcode },
6100
    { Bad_Opcode },
6101
    { Bad_Opcode },
6102
    { Bad_Opcode },
6103
    /* 40 */
6104
    { Bad_Opcode },
6105
    { Bad_Opcode },
6106
    { Bad_Opcode },
6107
    { Bad_Opcode },
6108
    { Bad_Opcode },
6109
    { Bad_Opcode },
6110
    { Bad_Opcode },
6111
    { Bad_Opcode },
6112
    /* 48 */
6113
    { Bad_Opcode },
6114
    { Bad_Opcode },
6115
    { Bad_Opcode },
6116
    { Bad_Opcode },
6117
    { Bad_Opcode },
6118
    { Bad_Opcode },
6119
    { Bad_Opcode },
6120
    { Bad_Opcode },
6121
    /* 50 */
6122
    { Bad_Opcode },
6123
    { Bad_Opcode },
6124
    { Bad_Opcode },
6125
    { Bad_Opcode },
6126
    { Bad_Opcode },
6127
    { Bad_Opcode },
6128
    { Bad_Opcode },
6129
    { Bad_Opcode },
6130
    /* 58 */
6131
    { Bad_Opcode },
6132
    { Bad_Opcode },
6133
    { Bad_Opcode },
6134
    { Bad_Opcode },
6135
    { Bad_Opcode },
6136
    { Bad_Opcode },
6137
    { Bad_Opcode },
6138
    { Bad_Opcode },
6139
    /* 60 */
6140
    { Bad_Opcode },
6141
    { Bad_Opcode },
6142
    { Bad_Opcode },
6143
    { Bad_Opcode },
6144
    { Bad_Opcode },
6145
    { Bad_Opcode },
6146
    { Bad_Opcode },
6147
    { Bad_Opcode },
6148
    /* 68 */
6149
    { Bad_Opcode },
6150
    { Bad_Opcode },
6151
    { Bad_Opcode },
6152
    { Bad_Opcode },
6153
    { Bad_Opcode },
6154
    { Bad_Opcode },
6155
    { Bad_Opcode },
6156
    { Bad_Opcode },
6157
    /* 70 */
6158
    { Bad_Opcode },
6159
    { Bad_Opcode },
6160
    { Bad_Opcode },
6161
    { Bad_Opcode },
6162
    { Bad_Opcode },
6163
    { Bad_Opcode },
6164
    { Bad_Opcode },
6165
    { Bad_Opcode },
6166
    /* 78 */
6167
    { Bad_Opcode },
6168
    { Bad_Opcode },
6169
    { Bad_Opcode },
6170
    { Bad_Opcode },
6171
    { Bad_Opcode },
6172
    { Bad_Opcode },
6173
    { Bad_Opcode },
6174
    { Bad_Opcode },
6175
    /* 80 */
6176
    { Bad_Opcode },
6177
    { Bad_Opcode },
6178
    { Bad_Opcode },
6179
    { Bad_Opcode },
6180
    { Bad_Opcode },
6181
    { Bad_Opcode },
6182
    { Bad_Opcode },
6183
    { Bad_Opcode },
6184
    /* 88 */
6185
    { Bad_Opcode },
6186
    { Bad_Opcode },
6187
    { Bad_Opcode },
6188
    { Bad_Opcode },
6189
    { Bad_Opcode },
6190
    { Bad_Opcode },
6191
    { Bad_Opcode },
6192
    { Bad_Opcode },
6193
    /* 90 */
6194
    { Bad_Opcode },
6195
    { Bad_Opcode },
6196
    { Bad_Opcode },
6197
    { Bad_Opcode },
6198
    { Bad_Opcode },
6199
    { Bad_Opcode },
6200
    { Bad_Opcode },
6201
    { Bad_Opcode },
6202
    /* 98 */
6203
    { Bad_Opcode },
6204
    { Bad_Opcode },
6205
    { Bad_Opcode },
6206
    { Bad_Opcode },
6207
    { Bad_Opcode },
6208
    { Bad_Opcode },
6209
    { Bad_Opcode },
6210
    { Bad_Opcode },
6211
    /* a0 */
6212
    { Bad_Opcode },
6213
    { Bad_Opcode },
6214
    { Bad_Opcode },
6215
    { Bad_Opcode },
6216
    { Bad_Opcode },
6217
    { Bad_Opcode },
6218
    { Bad_Opcode },
6219
    { Bad_Opcode },
6220
    /* a8 */
6221
    { Bad_Opcode },
6222
    { Bad_Opcode },
6223
    { Bad_Opcode },
6224
    { Bad_Opcode },
6225
    { Bad_Opcode },
6226
    { Bad_Opcode },
6227
    { Bad_Opcode },
6228
    { Bad_Opcode },
6229
    /* b0 */
6230
    { Bad_Opcode },
6231
    { Bad_Opcode },
6232
    { Bad_Opcode },
6233
    { Bad_Opcode },
6234
    { Bad_Opcode },
6235
    { Bad_Opcode },
6236
    { Bad_Opcode },
6237
    { Bad_Opcode },
6238
    /* b8 */
6239
    { Bad_Opcode },
6240
    { Bad_Opcode },
6241
    { Bad_Opcode },
6242
    { Bad_Opcode },
6243
    { Bad_Opcode },
6244
    { Bad_Opcode },
6245
    { Bad_Opcode },
6246
    { Bad_Opcode },
6247
    /* c0 */
6248
    { Bad_Opcode },
6249
    { Bad_Opcode },
6250
    { Bad_Opcode },
6251
    { Bad_Opcode },
6252
    { Bad_Opcode },
6253
    { Bad_Opcode },
6254
    { Bad_Opcode },
6255
    { Bad_Opcode },
6256
    /* c8 */
6257
    { Bad_Opcode },
6258
    { Bad_Opcode },
6259
    { Bad_Opcode },
6260
    { Bad_Opcode },
6261
    { Bad_Opcode },
6262
    { Bad_Opcode },
6263
    { Bad_Opcode },
6264
    { Bad_Opcode },
6265
    /* d0 */
6266
    { Bad_Opcode },
6267
    { Bad_Opcode },
6268
    { Bad_Opcode },
6269
    { Bad_Opcode },
6270
    { Bad_Opcode },
6271
    { Bad_Opcode },
6272
    { Bad_Opcode },
6273
    { Bad_Opcode },
6274
    /* d8 */
6275
    { Bad_Opcode },
6276
    { Bad_Opcode },
6277
    { Bad_Opcode },
6278
    { Bad_Opcode },
6279
    { Bad_Opcode },
6280
    { Bad_Opcode },
6281
    { Bad_Opcode },
6282
    { Bad_Opcode },
6283
    /* e0 */
6284
    { Bad_Opcode },
6285
    { Bad_Opcode },
6286
    { Bad_Opcode },
6287
    { Bad_Opcode },
6288
    { Bad_Opcode },
6289
    { Bad_Opcode },
6290
    { Bad_Opcode },
6291
    { Bad_Opcode },
6292
    /* e8 */
6293
    { Bad_Opcode },
6294
    { Bad_Opcode },
6295
    { Bad_Opcode },
6296
    { Bad_Opcode },
6297
    { Bad_Opcode },
6298
    { Bad_Opcode },
6299
    { Bad_Opcode },
6300
    { Bad_Opcode },
6301
    /* f0 */
6302
    { Bad_Opcode },
6303
    { Bad_Opcode },
6304
    { Bad_Opcode },
6305
    { Bad_Opcode },
6306
    { Bad_Opcode },
6307
    { Bad_Opcode },
6308
    { Bad_Opcode },
6309
    { Bad_Opcode },
6310
    /* f8 */
6311
    { Bad_Opcode },
6312
    { Bad_Opcode },
6313
    { Bad_Opcode },
6314
    { Bad_Opcode },
6315
    { Bad_Opcode },
6316
    { Bad_Opcode },
6317
    { Bad_Opcode },
6318
    { Bad_Opcode },
6319
  },
6320
};
6321
6322
static const struct dis386 vex_table[][256] = {
6323
  /* VEX_0F */
6324
  {
6325
    /* 00 */
6326
    { Bad_Opcode },
6327
    { Bad_Opcode },
6328
    { Bad_Opcode },
6329
    { Bad_Opcode },
6330
    { Bad_Opcode },
6331
    { Bad_Opcode },
6332
    { Bad_Opcode },
6333
    { Bad_Opcode },
6334
    /* 08 */
6335
    { Bad_Opcode },
6336
    { Bad_Opcode },
6337
    { Bad_Opcode },
6338
    { Bad_Opcode },
6339
    { Bad_Opcode },
6340
    { Bad_Opcode },
6341
    { Bad_Opcode },
6342
    { Bad_Opcode },
6343
    /* 10 */
6344
    { PREFIX_TABLE (PREFIX_0F10) },
6345
    { PREFIX_TABLE (PREFIX_0F11) },
6346
    { PREFIX_TABLE (PREFIX_VEX_0F12) },
6347
    { VEX_LEN_TABLE (VEX_LEN_0F13) },
6348
    { "vunpcklpX",  { XM, Vex, EXx }, PREFIX_OPCODE },
6349
    { "vunpckhpX",  { XM, Vex, EXx }, PREFIX_OPCODE },
6350
    { PREFIX_TABLE (PREFIX_VEX_0F16) },
6351
    { VEX_LEN_TABLE (VEX_LEN_0F17) },
6352
    /* 18 */
6353
    { Bad_Opcode },
6354
    { Bad_Opcode },
6355
    { Bad_Opcode },
6356
    { Bad_Opcode },
6357
    { Bad_Opcode },
6358
    { Bad_Opcode },
6359
    { Bad_Opcode },
6360
    { Bad_Opcode },
6361
    /* 20 */
6362
    { Bad_Opcode },
6363
    { Bad_Opcode },
6364
    { Bad_Opcode },
6365
    { Bad_Opcode },
6366
    { Bad_Opcode },
6367
    { Bad_Opcode },
6368
    { Bad_Opcode },
6369
    { Bad_Opcode },
6370
    /* 28 */
6371
    { "vmovapX",  { XM, EXx }, PREFIX_OPCODE },
6372
    { "vmovapX",  { EXxS, XM }, PREFIX_OPCODE },
6373
    { PREFIX_TABLE (PREFIX_VEX_0F2A) },
6374
    { "vmovntpX", { Mx, XM }, PREFIX_OPCODE },
6375
    { PREFIX_TABLE (PREFIX_VEX_0F2C) },
6376
    { PREFIX_TABLE (PREFIX_VEX_0F2D) },
6377
    { PREFIX_TABLE (PREFIX_0F2E) },
6378
    { PREFIX_TABLE (PREFIX_0F2F) },
6379
    /* 30 */
6380
    { Bad_Opcode },
6381
    { Bad_Opcode },
6382
    { Bad_Opcode },
6383
    { Bad_Opcode },
6384
    { Bad_Opcode },
6385
    { Bad_Opcode },
6386
    { Bad_Opcode },
6387
    { Bad_Opcode },
6388
    /* 38 */
6389
    { Bad_Opcode },
6390
    { Bad_Opcode },
6391
    { Bad_Opcode },
6392
    { Bad_Opcode },
6393
    { Bad_Opcode },
6394
    { Bad_Opcode },
6395
    { Bad_Opcode },
6396
    { Bad_Opcode },
6397
    /* 40 */
6398
    { Bad_Opcode },
6399
    { VEX_LEN_TABLE (VEX_LEN_0F41) },
6400
    { VEX_LEN_TABLE (VEX_LEN_0F42) },
6401
    { Bad_Opcode },
6402
    { VEX_LEN_TABLE (VEX_LEN_0F44) },
6403
    { VEX_LEN_TABLE (VEX_LEN_0F45) },
6404
    { VEX_LEN_TABLE (VEX_LEN_0F46) },
6405
    { VEX_LEN_TABLE (VEX_LEN_0F47) },
6406
    /* 48 */
6407
    { Bad_Opcode },
6408
    { Bad_Opcode },
6409
    { VEX_LEN_TABLE (VEX_LEN_0F4A) },
6410
    { VEX_LEN_TABLE (VEX_LEN_0F4B) },
6411
    { Bad_Opcode },
6412
    { Bad_Opcode },
6413
    { Bad_Opcode },
6414
    { Bad_Opcode },
6415
    /* 50 */
6416
    { "vmovmskpX",  { Gdq, Ux }, PREFIX_OPCODE },
6417
    { PREFIX_TABLE (PREFIX_0F51) },
6418
    { PREFIX_TABLE (PREFIX_0F52) },
6419
    { PREFIX_TABLE (PREFIX_0F53) },
6420
    { "vandpX",   { XM, Vex, EXx }, PREFIX_OPCODE },
6421
    { "vandnpX",  { XM, Vex, EXx }, PREFIX_OPCODE },
6422
    { "vorpX",    { XM, Vex, EXx }, PREFIX_OPCODE },
6423
    { "vxorpX",   { XM, Vex, EXx }, PREFIX_OPCODE },
6424
    /* 58 */
6425
    { PREFIX_TABLE (PREFIX_0F58) },
6426
    { PREFIX_TABLE (PREFIX_0F59) },
6427
    { PREFIX_TABLE (PREFIX_0F5A) },
6428
    { PREFIX_TABLE (PREFIX_0F5B) },
6429
    { PREFIX_TABLE (PREFIX_0F5C) },
6430
    { PREFIX_TABLE (PREFIX_0F5D) },
6431
    { PREFIX_TABLE (PREFIX_0F5E) },
6432
    { PREFIX_TABLE (PREFIX_0F5F) },
6433
    /* 60 */
6434
    { "vpunpcklbw", { XM, Vex, EXx }, PREFIX_DATA },
6435
    { "vpunpcklwd", { XM, Vex, EXx }, PREFIX_DATA },
6436
    { "vpunpckldq", { XM, Vex, EXx }, PREFIX_DATA },
6437
    { "vpacksswb",  { XM, Vex, EXx }, PREFIX_DATA },
6438
    { "vpcmpgtb", { XM, Vex, EXx }, PREFIX_DATA },
6439
    { "vpcmpgtw", { XM, Vex, EXx }, PREFIX_DATA },
6440
    { "vpcmpgtd", { XM, Vex, EXx }, PREFIX_DATA },
6441
    { "vpackuswb",  { XM, Vex, EXx }, PREFIX_DATA },
6442
    /* 68 */
6443
    { "vpunpckhbw", { XM, Vex, EXx }, PREFIX_DATA },
6444
    { "vpunpckhwd", { XM, Vex, EXx }, PREFIX_DATA },
6445
    { "vpunpckhdq", { XM, Vex, EXx }, PREFIX_DATA },
6446
    { "vpackssdw",  { XM, Vex, EXx }, PREFIX_DATA },
6447
    { "vpunpcklqdq",  { XM, Vex, EXx }, PREFIX_DATA },
6448
    { "vpunpckhqdq",  { XM, Vex, EXx }, PREFIX_DATA },
6449
    { VEX_LEN_TABLE (VEX_LEN_0F6E) },
6450
    { PREFIX_TABLE (PREFIX_VEX_0F6F) },
6451
    /* 70 */
6452
    { PREFIX_TABLE (PREFIX_VEX_0F70) },
6453
    { REG_TABLE (REG_VEX_0F71) },
6454
    { REG_TABLE (REG_VEX_0F72) },
6455
    { REG_TABLE (REG_VEX_0F73) },
6456
    { "vpcmpeqb", { XM, Vex, EXx }, PREFIX_DATA },
6457
    { "vpcmpeqw", { XM, Vex, EXx }, PREFIX_DATA },
6458
    { "vpcmpeqd", { XM, Vex, EXx }, PREFIX_DATA },
6459
    { VEX_LEN_TABLE (VEX_LEN_0F77) },
6460
    /* 78 */
6461
    { Bad_Opcode },
6462
    { Bad_Opcode },
6463
    { Bad_Opcode },
6464
    { Bad_Opcode },
6465
    { PREFIX_TABLE (PREFIX_0F7C) },
6466
    { PREFIX_TABLE (PREFIX_0F7D) },
6467
    { PREFIX_TABLE (PREFIX_VEX_0F7E) },
6468
    { PREFIX_TABLE (PREFIX_VEX_0F7F) },
6469
    /* 80 */
6470
    { Bad_Opcode },
6471
    { Bad_Opcode },
6472
    { Bad_Opcode },
6473
    { Bad_Opcode },
6474
    { Bad_Opcode },
6475
    { Bad_Opcode },
6476
    { Bad_Opcode },
6477
    { Bad_Opcode },
6478
    /* 88 */
6479
    { Bad_Opcode },
6480
    { Bad_Opcode },
6481
    { Bad_Opcode },
6482
    { Bad_Opcode },
6483
    { Bad_Opcode },
6484
    { Bad_Opcode },
6485
    { Bad_Opcode },
6486
    { Bad_Opcode },
6487
    /* 90 */
6488
    { VEX_LEN_TABLE (VEX_LEN_0F90) },
6489
    { VEX_LEN_TABLE (VEX_LEN_0F91) },
6490
    { VEX_LEN_TABLE (VEX_LEN_0F92) },
6491
    { VEX_LEN_TABLE (VEX_LEN_0F93) },
6492
    { Bad_Opcode },
6493
    { Bad_Opcode },
6494
    { Bad_Opcode },
6495
    { Bad_Opcode },
6496
    /* 98 */
6497
    { VEX_LEN_TABLE (VEX_LEN_0F98) },
6498
    { VEX_LEN_TABLE (VEX_LEN_0F99) },
6499
    { Bad_Opcode },
6500
    { Bad_Opcode },
6501
    { Bad_Opcode },
6502
    { Bad_Opcode },
6503
    { Bad_Opcode },
6504
    { Bad_Opcode },
6505
    /* a0 */
6506
    { Bad_Opcode },
6507
    { Bad_Opcode },
6508
    { Bad_Opcode },
6509
    { Bad_Opcode },
6510
    { Bad_Opcode },
6511
    { Bad_Opcode },
6512
    { Bad_Opcode },
6513
    { Bad_Opcode },
6514
    /* a8 */
6515
    { Bad_Opcode },
6516
    { Bad_Opcode },
6517
    { Bad_Opcode },
6518
    { Bad_Opcode },
6519
    { Bad_Opcode },
6520
    { Bad_Opcode },
6521
    { REG_TABLE (REG_VEX_0FAE) },
6522
    { Bad_Opcode },
6523
    /* b0 */
6524
    { Bad_Opcode },
6525
    { Bad_Opcode },
6526
    { Bad_Opcode },
6527
    { Bad_Opcode },
6528
    { Bad_Opcode },
6529
    { Bad_Opcode },
6530
    { Bad_Opcode },
6531
    { Bad_Opcode },
6532
    /* b8 */
6533
    { Bad_Opcode },
6534
    { Bad_Opcode },
6535
    { Bad_Opcode },
6536
    { Bad_Opcode },
6537
    { Bad_Opcode },
6538
    { Bad_Opcode },
6539
    { Bad_Opcode },
6540
    { Bad_Opcode },
6541
    /* c0 */
6542
    { Bad_Opcode },
6543
    { Bad_Opcode },
6544
    { PREFIX_TABLE (PREFIX_0FC2) },
6545
    { Bad_Opcode },
6546
    { VEX_LEN_TABLE (VEX_LEN_0FC4) },
6547
    { "vpextrw",  { Gd, Uxmm, Ib }, PREFIX_DATA },
6548
    { "vshufpX",  { XM, Vex, EXx, Ib }, PREFIX_OPCODE },
6549
    { Bad_Opcode },
6550
    /* c8 */
6551
    { Bad_Opcode },
6552
    { Bad_Opcode },
6553
    { Bad_Opcode },
6554
    { Bad_Opcode },
6555
    { Bad_Opcode },
6556
    { Bad_Opcode },
6557
    { Bad_Opcode },
6558
    { Bad_Opcode },
6559
    /* d0 */
6560
    { PREFIX_TABLE (PREFIX_0FD0) },
6561
    { "vpsrlw",   { XM, Vex, EXxmm }, PREFIX_DATA },
6562
    { "vpsrld",   { XM, Vex, EXxmm }, PREFIX_DATA },
6563
    { "vpsrlq",   { XM, Vex, EXxmm }, PREFIX_DATA },
6564
    { "vpaddq",   { XM, Vex, EXx }, PREFIX_DATA },
6565
    { "vpmullw",  { XM, Vex, EXx }, PREFIX_DATA },
6566
    { VEX_LEN_TABLE (VEX_LEN_0FD6) },
6567
    { "vpmovmskb",  { Gdq, Ux }, PREFIX_DATA },
6568
    /* d8 */
6569
    { "vpsubusb", { XM, Vex, EXx }, PREFIX_DATA },
6570
    { "vpsubusw", { XM, Vex, EXx }, PREFIX_DATA },
6571
    { "vpminub",  { XM, Vex, EXx }, PREFIX_DATA },
6572
    { "vpand",    { XM, Vex, EXx }, PREFIX_DATA },
6573
    { "vpaddusb", { XM, Vex, EXx }, PREFIX_DATA },
6574
    { "vpaddusw", { XM, Vex, EXx }, PREFIX_DATA },
6575
    { "vpmaxub",  { XM, Vex, EXx }, PREFIX_DATA },
6576
    { "vpandn",   { XM, Vex, EXx }, PREFIX_DATA },
6577
    /* e0 */
6578
    { "vpavgb",   { XM, Vex, EXx }, PREFIX_DATA },
6579
    { "vpsraw",   { XM, Vex, EXxmm }, PREFIX_DATA },
6580
    { "vpsrad",   { XM, Vex, EXxmm }, PREFIX_DATA },
6581
    { "vpavgw",   { XM, Vex, EXx }, PREFIX_DATA },
6582
    { "vpmulhuw", { XM, Vex, EXx }, PREFIX_DATA },
6583
    { "vpmulhw",  { XM, Vex, EXx }, PREFIX_DATA },
6584
    { PREFIX_TABLE (PREFIX_0FE6) },
6585
    { "vmovntdq", { Mx, XM }, PREFIX_DATA },
6586
    /* e8 */
6587
    { "vpsubsb",  { XM, Vex, EXx }, PREFIX_DATA },
6588
    { "vpsubsw",  { XM, Vex, EXx }, PREFIX_DATA },
6589
    { "vpminsw",  { XM, Vex, EXx }, PREFIX_DATA },
6590
    { "vpor",   { XM, Vex, EXx }, PREFIX_DATA },
6591
    { "vpaddsb",  { XM, Vex, EXx }, PREFIX_DATA },
6592
    { "vpaddsw",  { XM, Vex, EXx }, PREFIX_DATA },
6593
    { "vpmaxsw",  { XM, Vex, EXx }, PREFIX_DATA },
6594
    { "vpxor",    { XM, Vex, EXx }, PREFIX_DATA },
6595
    /* f0 */
6596
    { PREFIX_TABLE (PREFIX_0FF0) },
6597
    { "vpsllw",   { XM, Vex, EXxmm }, PREFIX_DATA },
6598
    { "vpslld",   { XM, Vex, EXxmm }, PREFIX_DATA },
6599
    { "vpsllq",   { XM, Vex, EXxmm }, PREFIX_DATA },
6600
    { "vpmuludq", { XM, Vex, EXx }, PREFIX_DATA },
6601
    { "vpmaddwd", { XM, Vex, EXx }, PREFIX_DATA },
6602
    { "vpsadbw",  { XM, Vex, EXx }, PREFIX_DATA },
6603
    { "vmaskmovdqu",  { XM, Uxmm }, PREFIX_DATA },
6604
    /* f8 */
6605
    { "vpsubb",   { XM, Vex, EXx }, PREFIX_DATA },
6606
    { "vpsubw",   { XM, Vex, EXx }, PREFIX_DATA },
6607
    { "vpsubd",   { XM, Vex, EXx }, PREFIX_DATA },
6608
    { "vpsubq",   { XM, Vex, EXx }, PREFIX_DATA },
6609
    { "vpaddb",   { XM, Vex, EXx }, PREFIX_DATA },
6610
    { "vpaddw",   { XM, Vex, EXx }, PREFIX_DATA },
6611
    { "vpaddd",   { XM, Vex, EXx }, PREFIX_DATA },
6612
    { Bad_Opcode },
6613
  },
6614
  /* VEX_0F38 */
6615
  {
6616
    /* 00 */
6617
    { "vpshufb",  { XM, Vex, EXx }, PREFIX_DATA },
6618
    { "vphaddw",  { XM, Vex, EXx }, PREFIX_DATA },
6619
    { "vphaddd",  { XM, Vex, EXx }, PREFIX_DATA },
6620
    { "vphaddsw", { XM, Vex, EXx }, PREFIX_DATA },
6621
    { "vpmaddubsw", { XM, Vex, EXx }, PREFIX_DATA },
6622
    { "vphsubw",  { XM, Vex, EXx }, PREFIX_DATA },
6623
    { "vphsubd",  { XM, Vex, EXx }, PREFIX_DATA },
6624
    { "vphsubsw", { XM, Vex, EXx }, PREFIX_DATA },
6625
    /* 08 */
6626
    { "vpsignb",  { XM, Vex, EXx }, PREFIX_DATA },
6627
    { "vpsignw",  { XM, Vex, EXx }, PREFIX_DATA },
6628
    { "vpsignd",  { XM, Vex, EXx }, PREFIX_DATA },
6629
    { "vpmulhrsw",  { XM, Vex, EXx }, PREFIX_DATA },
6630
    { VEX_W_TABLE (VEX_W_0F380C) },
6631
    { VEX_W_TABLE (VEX_W_0F380D) },
6632
    { VEX_W_TABLE (VEX_W_0F380E) },
6633
    { VEX_W_TABLE (VEX_W_0F380F) },
6634
    /* 10 */
6635
    { Bad_Opcode },
6636
    { Bad_Opcode },
6637
    { Bad_Opcode },
6638
    { VEX_W_TABLE (VEX_W_0F3813) },
6639
    { Bad_Opcode },
6640
    { Bad_Opcode },
6641
    { VEX_LEN_TABLE (VEX_LEN_0F3816) },
6642
    { "vptest",   { XM, EXx }, PREFIX_DATA },
6643
    /* 18 */
6644
    { VEX_W_TABLE (VEX_W_0F3818) },
6645
    { VEX_LEN_TABLE (VEX_LEN_0F3819) },
6646
    { VEX_LEN_TABLE (VEX_LEN_0F381A) },
6647
    { Bad_Opcode },
6648
    { "vpabsb",   { XM, EXx }, PREFIX_DATA },
6649
    { "vpabsw",   { XM, EXx }, PREFIX_DATA },
6650
    { "vpabsd",   { XM, EXx }, PREFIX_DATA },
6651
    { Bad_Opcode },
6652
    /* 20 */
6653
    { "vpmovsxbw",  { XM, EXxmmq }, PREFIX_DATA },
6654
    { "vpmovsxbd",  { XM, EXxmmqd }, PREFIX_DATA },
6655
    { "vpmovsxbq",  { XM, EXxmmdw }, PREFIX_DATA },
6656
    { "vpmovsxwd",  { XM, EXxmmq }, PREFIX_DATA },
6657
    { "vpmovsxwq",  { XM, EXxmmqd }, PREFIX_DATA },
6658
    { "vpmovsxdq",  { XM, EXxmmq }, PREFIX_DATA },
6659
    { Bad_Opcode },
6660
    { Bad_Opcode },
6661
    /* 28 */
6662
    { "vpmuldq",  { XM, Vex, EXx }, PREFIX_DATA },
6663
    { "vpcmpeqq", { XM, Vex, EXx }, PREFIX_DATA },
6664
    { "vmovntdqa",  { XM, Mx }, PREFIX_DATA },
6665
    { "vpackusdw",  { XM, Vex, EXx }, PREFIX_DATA },
6666
    { VEX_W_TABLE (VEX_W_0F382C) },
6667
    { VEX_W_TABLE (VEX_W_0F382D) },
6668
    { VEX_W_TABLE (VEX_W_0F382E) },
6669
    { VEX_W_TABLE (VEX_W_0F382F) },
6670
    /* 30 */
6671
    { "vpmovzxbw",  { XM, EXxmmq }, PREFIX_DATA },
6672
    { "vpmovzxbd",  { XM, EXxmmqd }, PREFIX_DATA },
6673
    { "vpmovzxbq",  { XM, EXxmmdw }, PREFIX_DATA },
6674
    { "vpmovzxwd",  { XM, EXxmmq }, PREFIX_DATA },
6675
    { "vpmovzxwq",  { XM, EXxmmqd }, PREFIX_DATA },
6676
    { "vpmovzxdq",  { XM, EXxmmq }, PREFIX_DATA },
6677
    { VEX_LEN_TABLE (VEX_LEN_0F3836) },
6678
    { "vpcmpgtq", { XM, Vex, EXx }, PREFIX_DATA },
6679
    /* 38 */
6680
    { "vpminsb",  { XM, Vex, EXx }, PREFIX_DATA },
6681
    { "vpminsd",  { XM, Vex, EXx }, PREFIX_DATA },
6682
    { "vpminuw",  { XM, Vex, EXx }, PREFIX_DATA },
6683
    { "vpminud",  { XM, Vex, EXx }, PREFIX_DATA },
6684
    { "vpmaxsb",  { XM, Vex, EXx }, PREFIX_DATA },
6685
    { "vpmaxsd",  { XM, Vex, EXx }, PREFIX_DATA },
6686
    { "vpmaxuw",  { XM, Vex, EXx }, PREFIX_DATA },
6687
    { "vpmaxud",  { XM, Vex, EXx }, PREFIX_DATA },
6688
    /* 40 */
6689
    { "vpmulld",  { XM, Vex, EXx }, PREFIX_DATA },
6690
    { VEX_LEN_TABLE (VEX_LEN_0F3841) },
6691
    { Bad_Opcode },
6692
    { Bad_Opcode },
6693
    { Bad_Opcode },
6694
    { "vpsrlv%DQ", { XM, Vex, EXx }, PREFIX_DATA },
6695
    { VEX_W_TABLE (VEX_W_0F3846) },
6696
    { "vpsllv%DQ", { XM, Vex, EXx }, PREFIX_DATA },
6697
    /* 48 */
6698
    { X86_64_TABLE (X86_64_VEX_0F3848) },
6699
    { X86_64_TABLE (X86_64_VEX_0F3849) },
6700
    { X86_64_TABLE (X86_64_VEX_0F384A) },
6701
    { X86_64_TABLE (X86_64_VEX_0F384B) },
6702
    { Bad_Opcode },
6703
    { Bad_Opcode },
6704
    { Bad_Opcode },
6705
    { Bad_Opcode },
6706
    /* 50 */
6707
    { VEX_W_TABLE (VEX_W_0F3850) },
6708
    { VEX_W_TABLE (VEX_W_0F3851) },
6709
    { VEX_W_TABLE (VEX_W_0F3852) },
6710
    { VEX_W_TABLE (VEX_W_0F3853) },
6711
    { Bad_Opcode },
6712
    { Bad_Opcode },
6713
    { Bad_Opcode },
6714
    { Bad_Opcode },
6715
    /* 58 */
6716
    { VEX_W_TABLE (VEX_W_0F3858) },
6717
    { VEX_W_TABLE (VEX_W_0F3859) },
6718
    { VEX_LEN_TABLE (VEX_LEN_0F385A) },
6719
    { Bad_Opcode },
6720
    { X86_64_TABLE (X86_64_VEX_0F385C) },
6721
    { Bad_Opcode },
6722
    { X86_64_TABLE (X86_64_VEX_0F385E) },
6723
    { X86_64_TABLE (X86_64_VEX_0F385F) },
6724
    /* 60 */
6725
    { Bad_Opcode },
6726
    { Bad_Opcode },
6727
    { Bad_Opcode },
6728
    { Bad_Opcode },
6729
    { Bad_Opcode },
6730
    { Bad_Opcode },
6731
    { Bad_Opcode },
6732
    { Bad_Opcode },
6733
    /* 68 */
6734
    { Bad_Opcode },
6735
    { Bad_Opcode },
6736
    { Bad_Opcode },
6737
    { X86_64_TABLE (X86_64_VEX_0F386B) },
6738
    { X86_64_TABLE (X86_64_VEX_0F386C) },
6739
    { Bad_Opcode },
6740
    { X86_64_TABLE (X86_64_VEX_0F386E) },
6741
    { X86_64_TABLE (X86_64_VEX_0F386F) },
6742
    /* 70 */
6743
    { Bad_Opcode },
6744
    { Bad_Opcode },
6745
    { PREFIX_TABLE (PREFIX_VEX_0F3872) },
6746
    { Bad_Opcode },
6747
    { Bad_Opcode },
6748
    { Bad_Opcode },
6749
    { Bad_Opcode },
6750
    { Bad_Opcode },
6751
    /* 78 */
6752
    { VEX_W_TABLE (VEX_W_0F3878) },
6753
    { VEX_W_TABLE (VEX_W_0F3879) },
6754
    { Bad_Opcode },
6755
    { Bad_Opcode },
6756
    { Bad_Opcode },
6757
    { Bad_Opcode },
6758
    { Bad_Opcode },
6759
    { Bad_Opcode },
6760
    /* 80 */
6761
    { Bad_Opcode },
6762
    { Bad_Opcode },
6763
    { Bad_Opcode },
6764
    { Bad_Opcode },
6765
    { Bad_Opcode },
6766
    { Bad_Opcode },
6767
    { Bad_Opcode },
6768
    { Bad_Opcode },
6769
    /* 88 */
6770
    { Bad_Opcode },
6771
    { Bad_Opcode },
6772
    { Bad_Opcode },
6773
    { Bad_Opcode },
6774
    { "vpmaskmov%DQ", { XM, Vex, Mx }, PREFIX_DATA },
6775
    { Bad_Opcode },
6776
    { "vpmaskmov%DQ", { Mx, Vex, XM }, PREFIX_DATA },
6777
    { Bad_Opcode },
6778
    /* 90 */
6779
    { "vpgatherd%DQ", { XM, MVexVSIBDWpX, VexGatherD }, PREFIX_DATA },
6780
    { "vpgatherq%DQ", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, PREFIX_DATA },
6781
    { "vgatherdp%XW", { XM, MVexVSIBDWpX, VexGatherD }, PREFIX_DATA },
6782
    { "vgatherqp%XW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, PREFIX_DATA },
6783
    { Bad_Opcode },
6784
    { Bad_Opcode },
6785
    { "vfmaddsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6786
    { "vfmsubadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6787
    /* 98 */
6788
    { "vfmadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6789
    { "vfmadd132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6790
    { "vfmsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6791
    { "vfmsub132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6792
    { "vfnmadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6793
    { "vfnmadd132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6794
    { "vfnmsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6795
    { "vfnmsub132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6796
    /* a0 */
6797
    { Bad_Opcode },
6798
    { Bad_Opcode },
6799
    { Bad_Opcode },
6800
    { Bad_Opcode },
6801
    { Bad_Opcode },
6802
    { Bad_Opcode },
6803
    { "vfmaddsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6804
    { "vfmsubadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6805
    /* a8 */
6806
    { "vfmadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6807
    { "vfmadd213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6808
    { "vfmsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6809
    { "vfmsub213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6810
    { "vfnmadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6811
    { "vfnmadd213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6812
    { "vfnmsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6813
    { "vfnmsub213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6814
    /* b0 */
6815
    { VEX_W_TABLE (VEX_W_0F38B0) },
6816
    { VEX_W_TABLE (VEX_W_0F38B1) },
6817
    { Bad_Opcode },
6818
    { Bad_Opcode },
6819
    { VEX_W_TABLE (VEX_W_0F38B4) },
6820
    { VEX_W_TABLE (VEX_W_0F38B5) },
6821
    { "vfmaddsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6822
    { "vfmsubadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6823
    /* b8 */
6824
    { "vfmadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6825
    { "vfmadd231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6826
    { "vfmsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6827
    { "vfmsub231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6828
    { "vfnmadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6829
    { "vfnmadd231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6830
    { "vfnmsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6831
    { "vfnmsub231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6832
    /* c0 */
6833
    { Bad_Opcode },
6834
    { Bad_Opcode },
6835
    { Bad_Opcode },
6836
    { Bad_Opcode },
6837
    { Bad_Opcode },
6838
    { Bad_Opcode },
6839
    { Bad_Opcode },
6840
    { Bad_Opcode },
6841
    /* c8 */
6842
    { Bad_Opcode },
6843
    { Bad_Opcode },
6844
    { Bad_Opcode },
6845
    { PREFIX_TABLE (PREFIX_VEX_0F38CB) },
6846
    { PREFIX_TABLE (PREFIX_VEX_0F38CC) },
6847
    { PREFIX_TABLE (PREFIX_VEX_0F38CD) },
6848
    { Bad_Opcode },
6849
    { VEX_W_TABLE (VEX_W_0F38CF) },
6850
    /* d0 */
6851
    { Bad_Opcode },
6852
    { Bad_Opcode },
6853
    { VEX_W_TABLE (VEX_W_0F38D2) },
6854
    { VEX_W_TABLE (VEX_W_0F38D3) },
6855
    { Bad_Opcode },
6856
    { Bad_Opcode },
6857
    { Bad_Opcode },
6858
    { Bad_Opcode },
6859
    /* d8 */
6860
    { Bad_Opcode },
6861
    { Bad_Opcode },
6862
    { VEX_W_TABLE (VEX_W_0F38DA) },
6863
    { VEX_LEN_TABLE (VEX_LEN_0F38DB) },
6864
    { "vaesenc",  { XM, Vex, EXx }, PREFIX_DATA },
6865
    { "vaesenclast",  { XM, Vex, EXx }, PREFIX_DATA },
6866
    { "vaesdec",  { XM, Vex, EXx }, PREFIX_DATA },
6867
    { "vaesdeclast",  { XM, Vex, EXx }, PREFIX_DATA },
6868
    /* e0 */
6869
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6870
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6871
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6872
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6873
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6874
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6875
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6876
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6877
    /* e8 */
6878
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6879
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6880
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6881
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6882
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6883
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6884
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6885
    { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6886
    /* f0 */
6887
    { Bad_Opcode },
6888
    { Bad_Opcode },
6889
    { VEX_LEN_TABLE (VEX_LEN_0F38F2) },
6890
    { VEX_LEN_TABLE (VEX_LEN_0F38F3) },
6891
    { Bad_Opcode },
6892
    { VEX_LEN_TABLE (VEX_LEN_0F38F5) },
6893
    { VEX_LEN_TABLE (VEX_LEN_0F38F6) },
6894
    { VEX_LEN_TABLE (VEX_LEN_0F38F7) },
6895
    /* f8 */
6896
    { Bad_Opcode },
6897
    { Bad_Opcode },
6898
    { Bad_Opcode },
6899
    { Bad_Opcode },
6900
    { Bad_Opcode },
6901
    { Bad_Opcode },
6902
    { Bad_Opcode },
6903
    { Bad_Opcode },
6904
  },
6905
  /* VEX_0F3A */
6906
  {
6907
    /* 00 */
6908
    { VEX_LEN_TABLE (VEX_LEN_0F3A00) },
6909
    { VEX_LEN_TABLE (VEX_LEN_0F3A01) },
6910
    { VEX_W_TABLE (VEX_W_0F3A02) },
6911
    { Bad_Opcode },
6912
    { VEX_W_TABLE (VEX_W_0F3A04) },
6913
    { VEX_W_TABLE (VEX_W_0F3A05) },
6914
    { VEX_LEN_TABLE (VEX_LEN_0F3A06) },
6915
    { Bad_Opcode },
6916
    /* 08 */
6917
    { "vroundps", { XM, EXx, Ib }, PREFIX_DATA },
6918
    { "vroundpd", { XM, EXx, Ib }, PREFIX_DATA },
6919
    { "vroundss", { XMScalar, VexScalar, EXd, Ib }, PREFIX_DATA },
6920
    { "vroundsd", { XMScalar, VexScalar, EXq, Ib }, PREFIX_DATA },
6921
    { "vblendps", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6922
    { "vblendpd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6923
    { "vpblendw", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6924
    { "vpalignr", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6925
    /* 10 */
6926
    { Bad_Opcode },
6927
    { Bad_Opcode },
6928
    { Bad_Opcode },
6929
    { Bad_Opcode },
6930
    { VEX_LEN_TABLE (VEX_LEN_0F3A14) },
6931
    { VEX_LEN_TABLE (VEX_LEN_0F3A15) },
6932
    { VEX_LEN_TABLE (VEX_LEN_0F3A16) },
6933
    { VEX_LEN_TABLE (VEX_LEN_0F3A17) },
6934
    /* 18 */
6935
    { VEX_LEN_TABLE (VEX_LEN_0F3A18) },
6936
    { VEX_LEN_TABLE (VEX_LEN_0F3A19) },
6937
    { Bad_Opcode },
6938
    { Bad_Opcode },
6939
    { Bad_Opcode },
6940
    { VEX_W_TABLE (VEX_W_0F3A1D) },
6941
    { Bad_Opcode },
6942
    { Bad_Opcode },
6943
    /* 20 */
6944
    { VEX_LEN_TABLE (VEX_LEN_0F3A20) },
6945
    { VEX_LEN_TABLE (VEX_LEN_0F3A21) },
6946
    { VEX_LEN_TABLE (VEX_LEN_0F3A22) },
6947
    { Bad_Opcode },
6948
    { Bad_Opcode },
6949
    { Bad_Opcode },
6950
    { Bad_Opcode },
6951
    { Bad_Opcode },
6952
    /* 28 */
6953
    { Bad_Opcode },
6954
    { Bad_Opcode },
6955
    { Bad_Opcode },
6956
    { Bad_Opcode },
6957
    { Bad_Opcode },
6958
    { Bad_Opcode },
6959
    { Bad_Opcode },
6960
    { Bad_Opcode },
6961
    /* 30 */
6962
    { VEX_LEN_TABLE (VEX_LEN_0F3A30) },
6963
    { VEX_LEN_TABLE (VEX_LEN_0F3A31) },
6964
    { VEX_LEN_TABLE (VEX_LEN_0F3A32) },
6965
    { VEX_LEN_TABLE (VEX_LEN_0F3A33) },
6966
    { Bad_Opcode },
6967
    { Bad_Opcode },
6968
    { Bad_Opcode },
6969
    { Bad_Opcode },
6970
    /* 38 */
6971
    { VEX_LEN_TABLE (VEX_LEN_0F3A38) },
6972
    { VEX_LEN_TABLE (VEX_LEN_0F3A39) },
6973
    { Bad_Opcode },
6974
    { Bad_Opcode },
6975
    { Bad_Opcode },
6976
    { Bad_Opcode },
6977
    { Bad_Opcode },
6978
    { Bad_Opcode },
6979
    /* 40 */
6980
    { "vdpps",    { XM, Vex, EXx, Ib }, PREFIX_DATA },
6981
    { VEX_LEN_TABLE (VEX_LEN_0F3A41) },
6982
    { "vmpsadbw", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6983
    { Bad_Opcode },
6984
    { "vpclmulqdq", { XM, Vex, EXx, PCLMUL }, PREFIX_DATA },
6985
    { Bad_Opcode },
6986
    { VEX_LEN_TABLE (VEX_LEN_0F3A46) },
6987
    { Bad_Opcode },
6988
    /* 48 */
6989
    { "vpermil2ps", { XM, Vex, EXx, XMVexI4, VexI4 }, PREFIX_DATA },
6990
    { "vpermil2pd", { XM, Vex, EXx, XMVexI4, VexI4 }, PREFIX_DATA },
6991
    { VEX_W_TABLE (VEX_W_0F3A4A) },
6992
    { VEX_W_TABLE (VEX_W_0F3A4B) },
6993
    { VEX_W_TABLE (VEX_W_0F3A4C) },
6994
    { Bad_Opcode },
6995
    { Bad_Opcode },
6996
    { Bad_Opcode },
6997
    /* 50 */
6998
    { Bad_Opcode },
6999
    { Bad_Opcode },
7000
    { Bad_Opcode },
7001
    { Bad_Opcode },
7002
    { Bad_Opcode },
7003
    { Bad_Opcode },
7004
    { Bad_Opcode },
7005
    { Bad_Opcode },
7006
    /* 58 */
7007
    { Bad_Opcode },
7008
    { Bad_Opcode },
7009
    { Bad_Opcode },
7010
    { Bad_Opcode },
7011
    { "vfmaddsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7012
    { "vfmaddsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7013
    { "vfmsubaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7014
    { "vfmsubaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7015
    /* 60 */
7016
    { VEX_LEN_TABLE (VEX_LEN_0F3A60) },
7017
    { VEX_LEN_TABLE (VEX_LEN_0F3A61) },
7018
    { VEX_LEN_TABLE (VEX_LEN_0F3A62) },
7019
    { VEX_LEN_TABLE (VEX_LEN_0F3A63) },
7020
    { Bad_Opcode },
7021
    { Bad_Opcode },
7022
    { Bad_Opcode },
7023
    { Bad_Opcode },
7024
    /* 68 */
7025
    { "vfmaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7026
    { "vfmaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7027
    { "vfmaddss", { XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA },
7028
    { "vfmaddsd", { XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA },
7029
    { "vfmsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7030
    { "vfmsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7031
    { "vfmsubss", { XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA },
7032
    { "vfmsubsd", { XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA },
7033
    /* 70 */
7034
    { Bad_Opcode },
7035
    { Bad_Opcode },
7036
    { Bad_Opcode },
7037
    { Bad_Opcode },
7038
    { Bad_Opcode },
7039
    { Bad_Opcode },
7040
    { Bad_Opcode },
7041
    { Bad_Opcode },
7042
    /* 78 */
7043
    { "vfnmaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7044
    { "vfnmaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7045
    { "vfnmaddss",  { XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA },
7046
    { "vfnmaddsd",  { XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA },
7047
    { "vfnmsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7048
    { "vfnmsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7049
    { "vfnmsubss",  { XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA },
7050
    { "vfnmsubsd",  { XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA },
7051
    /* 80 */
7052
    { Bad_Opcode },
7053
    { Bad_Opcode },
7054
    { Bad_Opcode },
7055
    { Bad_Opcode },
7056
    { Bad_Opcode },
7057
    { Bad_Opcode },
7058
    { Bad_Opcode },
7059
    { Bad_Opcode },
7060
    /* 88 */
7061
    { Bad_Opcode },
7062
    { Bad_Opcode },
7063
    { Bad_Opcode },
7064
    { Bad_Opcode },
7065
    { Bad_Opcode },
7066
    { Bad_Opcode },
7067
    { Bad_Opcode },
7068
    { Bad_Opcode },
7069
    /* 90 */
7070
    { Bad_Opcode },
7071
    { Bad_Opcode },
7072
    { Bad_Opcode },
7073
    { Bad_Opcode },
7074
    { Bad_Opcode },
7075
    { Bad_Opcode },
7076
    { Bad_Opcode },
7077
    { Bad_Opcode },
7078
    /* 98 */
7079
    { Bad_Opcode },
7080
    { Bad_Opcode },
7081
    { Bad_Opcode },
7082
    { Bad_Opcode },
7083
    { Bad_Opcode },
7084
    { Bad_Opcode },
7085
    { Bad_Opcode },
7086
    { Bad_Opcode },
7087
    /* a0 */
7088
    { Bad_Opcode },
7089
    { Bad_Opcode },
7090
    { Bad_Opcode },
7091
    { Bad_Opcode },
7092
    { Bad_Opcode },
7093
    { Bad_Opcode },
7094
    { Bad_Opcode },
7095
    { Bad_Opcode },
7096
    /* a8 */
7097
    { Bad_Opcode },
7098
    { Bad_Opcode },
7099
    { Bad_Opcode },
7100
    { Bad_Opcode },
7101
    { Bad_Opcode },
7102
    { Bad_Opcode },
7103
    { Bad_Opcode },
7104
    { Bad_Opcode },
7105
    /* b0 */
7106
    { Bad_Opcode },
7107
    { Bad_Opcode },
7108
    { Bad_Opcode },
7109
    { Bad_Opcode },
7110
    { Bad_Opcode },
7111
    { Bad_Opcode },
7112
    { Bad_Opcode },
7113
    { Bad_Opcode },
7114
    /* b8 */
7115
    { Bad_Opcode },
7116
    { Bad_Opcode },
7117
    { Bad_Opcode },
7118
    { Bad_Opcode },
7119
    { Bad_Opcode },
7120
    { Bad_Opcode },
7121
    { Bad_Opcode },
7122
    { Bad_Opcode },
7123
    /* c0 */
7124
    { Bad_Opcode },
7125
    { Bad_Opcode },
7126
    { Bad_Opcode },
7127
    { Bad_Opcode },
7128
    { Bad_Opcode },
7129
    { Bad_Opcode },
7130
    { Bad_Opcode },
7131
    { Bad_Opcode },
7132
    /* c8 */
7133
    { Bad_Opcode },
7134
    { Bad_Opcode },
7135
    { Bad_Opcode },
7136
    { Bad_Opcode },
7137
    { Bad_Opcode },
7138
    { Bad_Opcode },
7139
    { VEX_W_TABLE (VEX_W_0F3ACE) },
7140
    { VEX_W_TABLE (VEX_W_0F3ACF) },
7141
    /* d0 */
7142
    { Bad_Opcode },
7143
    { Bad_Opcode },
7144
    { Bad_Opcode },
7145
    { Bad_Opcode },
7146
    { Bad_Opcode },
7147
    { Bad_Opcode },
7148
    { Bad_Opcode },
7149
    { Bad_Opcode },
7150
    /* d8 */
7151
    { Bad_Opcode },
7152
    { Bad_Opcode },
7153
    { Bad_Opcode },
7154
    { Bad_Opcode },
7155
    { Bad_Opcode },
7156
    { Bad_Opcode },
7157
    { VEX_W_TABLE (VEX_W_0F3ADE) },
7158
    { VEX_LEN_TABLE (VEX_LEN_0F3ADF) },
7159
    /* e0 */
7160
    { Bad_Opcode },
7161
    { Bad_Opcode },
7162
    { Bad_Opcode },
7163
    { Bad_Opcode },
7164
    { Bad_Opcode },
7165
    { Bad_Opcode },
7166
    { Bad_Opcode },
7167
    { Bad_Opcode },
7168
    /* e8 */
7169
    { Bad_Opcode },
7170
    { Bad_Opcode },
7171
    { Bad_Opcode },
7172
    { Bad_Opcode },
7173
    { Bad_Opcode },
7174
    { Bad_Opcode },
7175
    { Bad_Opcode },
7176
    { Bad_Opcode },
7177
    /* f0 */
7178
    { VEX_LEN_TABLE (VEX_LEN_0F3AF0) },
7179
    { Bad_Opcode },
7180
    { Bad_Opcode },
7181
    { Bad_Opcode },
7182
    { Bad_Opcode },
7183
    { Bad_Opcode },
7184
    { Bad_Opcode },
7185
    { Bad_Opcode },
7186
    /* f8 */
7187
    { Bad_Opcode },
7188
    { Bad_Opcode },
7189
    { Bad_Opcode },
7190
    { Bad_Opcode },
7191
    { Bad_Opcode },
7192
    { Bad_Opcode },
7193
    { Bad_Opcode },
7194
    { Bad_Opcode },
7195
  },
7196
};
7197
7198
#include "i386-dis-evex.h"
7199
7200
static const struct dis386 vex_len_table[][2] = {
7201
  /* VEX_LEN_0F12_P_0 */
7202
  {
7203
    { MOD_TABLE (MOD_0F12_PREFIX_0) },
7204
  },
7205
7206
  /* VEX_LEN_0F12_P_2 */
7207
  {
7208
    { "%XEVmovlpYX",  { XM, Vex, Mq }, 0 },
7209
  },
7210
7211
  /* VEX_LEN_0F13 */
7212
  {
7213
    { "%XEVmovlpYX",  { Mq, XM }, PREFIX_OPCODE },
7214
  },
7215
7216
  /* VEX_LEN_0F16_P_0 */
7217
  {
7218
    { MOD_TABLE (MOD_0F16_PREFIX_0) },
7219
  },
7220
7221
  /* VEX_LEN_0F16_P_2 */
7222
  {
7223
    { "%XEVmovhpYX",  { XM, Vex, Mq }, 0 },
7224
  },
7225
7226
  /* VEX_LEN_0F17 */
7227
  {
7228
    { "%XEVmovhpYX",  { Mq, XM }, PREFIX_OPCODE },
7229
  },
7230
7231
  /* VEX_LEN_0F41 */
7232
  {
7233
    { Bad_Opcode },
7234
    { VEX_W_TABLE (VEX_W_0F41_L_1) },
7235
  },
7236
7237
  /* VEX_LEN_0F42 */
7238
  {
7239
    { Bad_Opcode },
7240
    { VEX_W_TABLE (VEX_W_0F42_L_1) },
7241
  },
7242
7243
  /* VEX_LEN_0F44 */
7244
  {
7245
    { VEX_W_TABLE (VEX_W_0F44_L_0) },
7246
  },
7247
7248
  /* VEX_LEN_0F45 */
7249
  {
7250
    { Bad_Opcode },
7251
    { VEX_W_TABLE (VEX_W_0F45_L_1) },
7252
  },
7253
7254
  /* VEX_LEN_0F46 */
7255
  {
7256
    { Bad_Opcode },
7257
    { VEX_W_TABLE (VEX_W_0F46_L_1) },
7258
  },
7259
7260
  /* VEX_LEN_0F47 */
7261
  {
7262
    { Bad_Opcode },
7263
    { VEX_W_TABLE (VEX_W_0F47_L_1) },
7264
  },
7265
7266
  /* VEX_LEN_0F4A */
7267
  {
7268
    { Bad_Opcode },
7269
    { VEX_W_TABLE (VEX_W_0F4A_L_1) },
7270
  },
7271
7272
  /* VEX_LEN_0F4B */
7273
  {
7274
    { Bad_Opcode },
7275
    { VEX_W_TABLE (VEX_W_0F4B_L_1) },
7276
  },
7277
7278
  /* VEX_LEN_0F6E */
7279
  {
7280
    { "%XEvmovYK",  { XMScalar, Edq }, PREFIX_DATA },
7281
  },
7282
7283
  /* VEX_LEN_0F77 */
7284
  {
7285
    { "vzeroupper", { XX }, 0 },
7286
    { "vzeroall", { XX }, 0 },
7287
  },
7288
7289
  /* VEX_LEN_0F7E_P_1 */
7290
  {
7291
    { "%XEvmovqY",  { XMScalar, EXq }, 0 },
7292
  },
7293
7294
  /* VEX_LEN_0F7E_P_2 */
7295
  {
7296
    { "%XEvmovK", { Edq, XMScalar }, 0 },
7297
  },
7298
7299
  /* VEX_LEN_0F90 */
7300
  {
7301
    { VEX_W_TABLE (VEX_W_0F90_L_0) },
7302
  },
7303
7304
  /* VEX_LEN_0F91 */
7305
  {
7306
    { VEX_W_TABLE (VEX_W_0F91_L_0) },
7307
  },
7308
7309
  /* VEX_LEN_0F92 */
7310
  {
7311
    { VEX_W_TABLE (VEX_W_0F92_L_0) },
7312
  },
7313
7314
  /* VEX_LEN_0F93 */
7315
  {
7316
    { VEX_W_TABLE (VEX_W_0F93_L_0) },
7317
  },
7318
7319
  /* VEX_LEN_0F98 */
7320
  {
7321
    { VEX_W_TABLE (VEX_W_0F98_L_0) },
7322
  },
7323
7324
  /* VEX_LEN_0F99 */
7325
  {
7326
    { VEX_W_TABLE (VEX_W_0F99_L_0) },
7327
  },
7328
7329
  /* VEX_LEN_0FAE_R_2 */
7330
  {
7331
    { "vldmxcsr", { Md }, 0 },
7332
  },
7333
7334
  /* VEX_LEN_0FAE_R_3 */
7335
  {
7336
    { "vstmxcsr", { Md }, 0 },
7337
  },
7338
7339
  /* VEX_LEN_0FC4 */
7340
  {
7341
    { "%XEvpinsrwY",  { XM, Vex, Edw, Ib }, PREFIX_DATA },
7342
  },
7343
7344
  /* VEX_LEN_0FD6 */
7345
  {
7346
    { "%XEvmovqY",  { EXqS, XMScalar }, PREFIX_DATA },
7347
  },
7348
7349
  /* VEX_LEN_0F3816 */
7350
  {
7351
    { Bad_Opcode },
7352
    { VEX_W_TABLE (VEX_W_0F3816_L_1) },
7353
  },
7354
7355
  /* VEX_LEN_0F3819 */
7356
  {
7357
    { Bad_Opcode },
7358
    { VEX_W_TABLE (VEX_W_0F3819_L_1) },
7359
  },
7360
7361
  /* VEX_LEN_0F381A */
7362
  {
7363
    { Bad_Opcode },
7364
    { VEX_W_TABLE (VEX_W_0F381A_L_1) },
7365
  },
7366
7367
  /* VEX_LEN_0F3836 */
7368
  {
7369
    { Bad_Opcode },
7370
    { VEX_W_TABLE (VEX_W_0F3836) },
7371
  },
7372
7373
  /* VEX_LEN_0F3841 */
7374
  {
7375
    { "vphminposuw",  { XM, EXx }, PREFIX_DATA },
7376
  },
7377
7378
  /* VEX_LEN_0F3848_X86_64 */
7379
  {
7380
    { VEX_W_TABLE (VEX_W_0F3848_X86_64_L_0) },
7381
  },
7382
7383
  /* VEX_LEN_0F3849_X86_64 */
7384
  {
7385
    { VEX_W_TABLE (VEX_W_0F3849_X86_64_L_0) },
7386
  },
7387
7388
  /* VEX_LEN_0F384A_X86_64_W_0 */
7389
  {
7390
    { PREFIX_TABLE (PREFIX_VEX_0F384A_X86_64_W_0_L_0) },
7391
  },
7392
7393
  /* VEX_LEN_0F384B_X86_64 */
7394
  {
7395
    { VEX_W_TABLE (VEX_W_0F384B_X86_64_L_0) },
7396
  },
7397
7398
  /* VEX_LEN_0F385A */
7399
  {
7400
    { Bad_Opcode },
7401
    { VEX_W_TABLE (VEX_W_0F385A_L_0) },
7402
  },
7403
7404
  /* VEX_LEN_0F385C_X86_64 */
7405
  {
7406
    { VEX_W_TABLE (VEX_W_0F385C_X86_64_L_0) },
7407
  },
7408
7409
  /* VEX_LEN_0F385E_X86_64 */
7410
  {
7411
    { VEX_W_TABLE (VEX_W_0F385E_X86_64_L_0) },
7412
  },
7413
7414
  /* VEX_LEN_0F385F_X86_64 */
7415
  {
7416
    { VEX_W_TABLE (VEX_W_0F385F_X86_64_L_0) },
7417
  },
7418
7419
  /* VEX_LEN_0F386B_X86_64 */
7420
  {
7421
    { VEX_W_TABLE (VEX_W_0F386B_X86_64_L_0) },
7422
  },
7423
7424
  /* VEX_LEN_0F386C_X86_64 */
7425
  {
7426
    { VEX_W_TABLE (VEX_W_0F386C_X86_64_L_0) },
7427
  },
7428
7429
  /* VEX_LEN_0F386E_X86_64 */
7430
  {
7431
    { VEX_W_TABLE (VEX_W_0F386E_X86_64_L_0) },
7432
  },
7433
7434
  /* VEX_LEN_0F386F_X86_64 */
7435
  {
7436
    { VEX_W_TABLE (VEX_W_0F386F_X86_64_L_0) },
7437
  },
7438
7439
  /* VEX_LEN_0F38CB_P_3_W_0 */
7440
  {
7441
    { Bad_Opcode },
7442
    { "vsha512rnds2", { XM, Vex, Rxmmq }, 0 },
7443
  },
7444
7445
  /* VEX_LEN_0F38CC_P_3_W_0 */
7446
  {
7447
    { Bad_Opcode },
7448
    { "vsha512msg1", { XM, Rxmmq }, 0 },
7449
  },
7450
7451
  /* VEX_LEN_0F38CD_P_3_W_0 */
7452
  {
7453
    { Bad_Opcode },
7454
    { "vsha512msg2", { XM, Rymm }, 0 },
7455
  },
7456
7457
  /* VEX_LEN_0F38DA_W_0_P_0 */
7458
  {
7459
    { "vsm3msg1", { XM, Vex, EXxmm }, 0 },
7460
  },
7461
7462
  /* VEX_LEN_0F38DA_W_0_P_2 */
7463
  {
7464
    { "vsm3msg2", { XM, Vex, EXxmm }, 0 },
7465
  },
7466
7467
  /* VEX_LEN_0F38DB */
7468
  {
7469
    { "vaesimc",  { XM, EXx }, PREFIX_DATA },
7470
  },
7471
7472
  /* VEX_LEN_0F38F2 */
7473
  {
7474
    { PREFIX_TABLE (PREFIX_VEX_0F38F2_L_0) },
7475
  },
7476
7477
  /* VEX_LEN_0F38F3 */
7478
  {
7479
    { PREFIX_TABLE (PREFIX_VEX_0F38F3_L_0) },
7480
  },
7481
7482
  /* VEX_LEN_0F38F5 */
7483
  {
7484
    { PREFIX_TABLE(PREFIX_VEX_0F38F5_L_0) },
7485
  },
7486
7487
  /* VEX_LEN_0F38F6 */
7488
  {
7489
    { PREFIX_TABLE(PREFIX_VEX_0F38F6_L_0) },
7490
  },
7491
7492
  /* VEX_LEN_0F38F7 */
7493
  {
7494
    { PREFIX_TABLE(PREFIX_VEX_0F38F7_L_0) },
7495
  },
7496
7497
  /* VEX_LEN_0F3A00 */
7498
  {
7499
    { Bad_Opcode },
7500
    { VEX_W_TABLE (VEX_W_0F3A00_L_1) },
7501
  },
7502
7503
  /* VEX_LEN_0F3A01 */
7504
  {
7505
    { Bad_Opcode },
7506
    { VEX_W_TABLE (VEX_W_0F3A01_L_1) },
7507
  },
7508
7509
  /* VEX_LEN_0F3A06 */
7510
  {
7511
    { Bad_Opcode },
7512
    { VEX_W_TABLE (VEX_W_0F3A06_L_1) },
7513
  },
7514
7515
  /* VEX_LEN_0F3A14 */
7516
  {
7517
    { "%XEvpextrb", { Edb, XM, Ib }, PREFIX_DATA },
7518
  },
7519
7520
  /* VEX_LEN_0F3A15 */
7521
  {
7522
    { "%XEvpextrw", { Edw, XM, Ib }, PREFIX_DATA },
7523
  },
7524
7525
  /* VEX_LEN_0F3A16  */
7526
  {
7527
    { "%XEvpextrK", { Edq, XM, Ib }, PREFIX_DATA },
7528
  },
7529
7530
  /* VEX_LEN_0F3A17 */
7531
  {
7532
    { "%XEvextractps",  { Ed, XM, Ib }, PREFIX_DATA },
7533
  },
7534
7535
  /* VEX_LEN_0F3A18 */
7536
  {
7537
    { Bad_Opcode },
7538
    { VEX_W_TABLE (VEX_W_0F3A18_L_1) },
7539
  },
7540
7541
  /* VEX_LEN_0F3A19 */
7542
  {
7543
    { Bad_Opcode },
7544
    { VEX_W_TABLE (VEX_W_0F3A19_L_1) },
7545
  },
7546
7547
  /* VEX_LEN_0F3A20 */
7548
  {
7549
    { "%XEvpinsrbY",  { XM, Vex, Edb, Ib }, PREFIX_DATA },
7550
  },
7551
7552
  /* VEX_LEN_0F3A21 */
7553
  {
7554
    { "%XEvinsertpsY",  { XM, Vex, EXd, Ib }, PREFIX_DATA },
7555
  },
7556
7557
  /* VEX_LEN_0F3A22 */
7558
  {
7559
    { "%XEvpinsrYK",  { XM, Vex, Edq, Ib }, PREFIX_DATA },
7560
  },
7561
7562
  /* VEX_LEN_0F3A30 */
7563
  {
7564
    { "kshiftr%BW", { MaskG, MaskR, Ib }, PREFIX_DATA },
7565
  },
7566
7567
  /* VEX_LEN_0F3A31 */
7568
  {
7569
    { "kshiftr%DQ", { MaskG, MaskR, Ib }, PREFIX_DATA },
7570
  },
7571
7572
  /* VEX_LEN_0F3A32 */
7573
  {
7574
    { "kshiftl%BW", { MaskG, MaskR, Ib }, PREFIX_DATA },
7575
  },
7576
7577
  /* VEX_LEN_0F3A33 */
7578
  {
7579
    { "kshiftl%DQ", { MaskG, MaskR, Ib }, PREFIX_DATA },
7580
  },
7581
7582
  /* VEX_LEN_0F3A38 */
7583
  {
7584
    { Bad_Opcode },
7585
    { VEX_W_TABLE (VEX_W_0F3A38_L_1) },
7586
  },
7587
7588
  /* VEX_LEN_0F3A39 */
7589
  {
7590
    { Bad_Opcode },
7591
    { VEX_W_TABLE (VEX_W_0F3A39_L_1) },
7592
  },
7593
7594
  /* VEX_LEN_0F3A41 */
7595
  {
7596
    { "vdppd",    { XM, Vex, EXx, Ib }, PREFIX_DATA },
7597
  },
7598
7599
  /* VEX_LEN_0F3A46 */
7600
  {
7601
    { Bad_Opcode },
7602
    { VEX_W_TABLE (VEX_W_0F3A46_L_1) },
7603
  },
7604
7605
  /* VEX_LEN_0F3A60 */
7606
  {
7607
    { "vpcmpestrm!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
7608
  },
7609
7610
  /* VEX_LEN_0F3A61 */
7611
  {
7612
    { "vpcmpestri!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
7613
  },
7614
7615
  /* VEX_LEN_0F3A62 */
7616
  {
7617
    { "vpcmpistrm", { XM, EXx, Ib }, PREFIX_DATA },
7618
  },
7619
7620
  /* VEX_LEN_0F3A63 */
7621
  {
7622
    { "vpcmpistri", { XM, EXx, Ib }, PREFIX_DATA },
7623
  },
7624
7625
  /* VEX_LEN_0F3ADE_W_0 */
7626
  {
7627
    { "vsm3rnds2", { XM, Vex, EXxmm, Ib }, PREFIX_DATA },
7628
  },
7629
7630
  /* VEX_LEN_0F3ADF */
7631
  {
7632
    { "vaeskeygenassist", { XM, EXx, Ib }, PREFIX_DATA },
7633
  },
7634
7635
  /* VEX_LEN_0F3AF0 */
7636
  {
7637
    { PREFIX_TABLE (PREFIX_VEX_0F3AF0_L_0) },
7638
  },
7639
7640
  /* VEX_LEN_MAP5_F8_X86_64 */
7641
  {
7642
    { VEX_W_TABLE (VEX_W_MAP5_F8_X86_64_L_0) },
7643
  },
7644
7645
  /* VEX_LEN_MAP5_F9_X86_64 */
7646
  {
7647
    { VEX_W_TABLE (VEX_W_MAP5_F9_X86_64_L_0) },
7648
  },
7649
7650
  /* VEX_LEN_MAP5_FD_X86_64 */
7651
  {
7652
    { VEX_W_TABLE (VEX_W_MAP5_FD_X86_64_L_0) },
7653
  },
7654
7655
  /* VEX_LEN_MAP7_F6 */
7656
  {
7657
    { VEX_W_TABLE (VEX_W_MAP7_F6_L_0) },
7658
  },
7659
7660
  /* VEX_LEN_MAP7_F8 */
7661
  {
7662
    { VEX_W_TABLE (VEX_W_MAP7_F8_L_0) },
7663
  },
7664
7665
  /* VEX_LEN_XOP_08_85 */
7666
  {
7667
    { VEX_W_TABLE (VEX_W_XOP_08_85_L_0) },
7668
  },
7669
7670
  /* VEX_LEN_XOP_08_86 */
7671
  {
7672
    { VEX_W_TABLE (VEX_W_XOP_08_86_L_0) },
7673
  },
7674
7675
  /* VEX_LEN_XOP_08_87 */
7676
  {
7677
    { VEX_W_TABLE (VEX_W_XOP_08_87_L_0) },
7678
  },
7679
7680
  /* VEX_LEN_XOP_08_8E */
7681
  {
7682
    { VEX_W_TABLE (VEX_W_XOP_08_8E_L_0) },
7683
  },
7684
7685
  /* VEX_LEN_XOP_08_8F */
7686
  {
7687
    { VEX_W_TABLE (VEX_W_XOP_08_8F_L_0) },
7688
  },
7689
7690
  /* VEX_LEN_XOP_08_95 */
7691
  {
7692
    { VEX_W_TABLE (VEX_W_XOP_08_95_L_0) },
7693
  },
7694
7695
  /* VEX_LEN_XOP_08_96 */
7696
  {
7697
    { VEX_W_TABLE (VEX_W_XOP_08_96_L_0) },
7698
  },
7699
7700
  /* VEX_LEN_XOP_08_97 */
7701
  {
7702
    { VEX_W_TABLE (VEX_W_XOP_08_97_L_0) },
7703
  },
7704
7705
  /* VEX_LEN_XOP_08_9E */
7706
  {
7707
    { VEX_W_TABLE (VEX_W_XOP_08_9E_L_0) },
7708
  },
7709
7710
  /* VEX_LEN_XOP_08_9F */
7711
  {
7712
    { VEX_W_TABLE (VEX_W_XOP_08_9F_L_0) },
7713
  },
7714
7715
  /* VEX_LEN_XOP_08_A3 */
7716
  {
7717
    { "vpperm",   { XM, Vex, EXx, XMVexI4 }, 0 },
7718
  },
7719
7720
  /* VEX_LEN_XOP_08_A6 */
7721
  {
7722
    { VEX_W_TABLE (VEX_W_XOP_08_A6_L_0) },
7723
  },
7724
7725
  /* VEX_LEN_XOP_08_B6 */
7726
  {
7727
    { VEX_W_TABLE (VEX_W_XOP_08_B6_L_0) },
7728
  },
7729
7730
  /* VEX_LEN_XOP_08_C0 */
7731
  {
7732
    { VEX_W_TABLE (VEX_W_XOP_08_C0_L_0) },
7733
  },
7734
7735
  /* VEX_LEN_XOP_08_C1 */
7736
  {
7737
    { VEX_W_TABLE (VEX_W_XOP_08_C1_L_0) },
7738
  },
7739
7740
  /* VEX_LEN_XOP_08_C2 */
7741
  {
7742
    { VEX_W_TABLE (VEX_W_XOP_08_C2_L_0) },
7743
  },
7744
7745
  /* VEX_LEN_XOP_08_C3 */
7746
  {
7747
    { VEX_W_TABLE (VEX_W_XOP_08_C3_L_0) },
7748
  },
7749
7750
  /* VEX_LEN_XOP_08_CC */
7751
  {
7752
    { VEX_W_TABLE (VEX_W_XOP_08_CC_L_0) },
7753
  },
7754
7755
  /* VEX_LEN_XOP_08_CD */
7756
  {
7757
    { VEX_W_TABLE (VEX_W_XOP_08_CD_L_0) },
7758
  },
7759
7760
  /* VEX_LEN_XOP_08_CE */
7761
  {
7762
    { VEX_W_TABLE (VEX_W_XOP_08_CE_L_0) },
7763
  },
7764
7765
  /* VEX_LEN_XOP_08_CF */
7766
  {
7767
    { VEX_W_TABLE (VEX_W_XOP_08_CF_L_0) },
7768
  },
7769
7770
  /* VEX_LEN_XOP_08_EC */
7771
  {
7772
    { VEX_W_TABLE (VEX_W_XOP_08_EC_L_0) },
7773
  },
7774
7775
  /* VEX_LEN_XOP_08_ED */
7776
  {
7777
    { VEX_W_TABLE (VEX_W_XOP_08_ED_L_0) },
7778
  },
7779
7780
  /* VEX_LEN_XOP_08_EE */
7781
  {
7782
    { VEX_W_TABLE (VEX_W_XOP_08_EE_L_0) },
7783
  },
7784
7785
  /* VEX_LEN_XOP_08_EF */
7786
  {
7787
    { VEX_W_TABLE (VEX_W_XOP_08_EF_L_0) },
7788
  },
7789
7790
  /* VEX_LEN_XOP_09_01 */
7791
  {
7792
    { REG_TABLE (REG_XOP_09_01_L_0) },
7793
  },
7794
7795
  /* VEX_LEN_XOP_09_02 */
7796
  {
7797
    { REG_TABLE (REG_XOP_09_02_L_0) },
7798
  },
7799
7800
  /* VEX_LEN_XOP_09_12 */
7801
  {
7802
    { REG_TABLE (REG_XOP_09_12_L_0) },
7803
  },
7804
7805
  /* VEX_LEN_XOP_09_82_W_0 */
7806
  {
7807
    { "vfrczss",  { XM, EXd }, 0 },
7808
  },
7809
7810
  /* VEX_LEN_XOP_09_83_W_0 */
7811
  {
7812
    { "vfrczsd",  { XM, EXq }, 0 },
7813
  },
7814
7815
  /* VEX_LEN_XOP_09_90 */
7816
  {
7817
    { "vprotb",   { XM, EXx, VexW }, 0 },
7818
  },
7819
7820
  /* VEX_LEN_XOP_09_91 */
7821
  {
7822
    { "vprotw",   { XM, EXx, VexW }, 0 },
7823
  },
7824
7825
  /* VEX_LEN_XOP_09_92 */
7826
  {
7827
    { "vprotd",   { XM, EXx, VexW }, 0 },
7828
  },
7829
7830
  /* VEX_LEN_XOP_09_93 */
7831
  {
7832
    { "vprotq",   { XM, EXx, VexW }, 0 },
7833
  },
7834
7835
  /* VEX_LEN_XOP_09_94 */
7836
  {
7837
    { "vpshlb",   { XM, EXx, VexW }, 0 },
7838
  },
7839
7840
  /* VEX_LEN_XOP_09_95 */
7841
  {
7842
    { "vpshlw",   { XM, EXx, VexW }, 0 },
7843
  },
7844
7845
  /* VEX_LEN_XOP_09_96 */
7846
  {
7847
    { "vpshld",   { XM, EXx, VexW }, 0 },
7848
  },
7849
7850
  /* VEX_LEN_XOP_09_97 */
7851
  {
7852
    { "vpshlq",   { XM, EXx, VexW }, 0 },
7853
  },
7854
7855
  /* VEX_LEN_XOP_09_98 */
7856
  {
7857
    { "vpshab",   { XM, EXx, VexW }, 0 },
7858
  },
7859
7860
  /* VEX_LEN_XOP_09_99 */
7861
  {
7862
    { "vpshaw",   { XM, EXx, VexW }, 0 },
7863
  },
7864
7865
  /* VEX_LEN_XOP_09_9A */
7866
  {
7867
    { "vpshad",   { XM, EXx, VexW }, 0 },
7868
  },
7869
7870
  /* VEX_LEN_XOP_09_9B */
7871
  {
7872
    { "vpshaq",   { XM, EXx, VexW }, 0 },
7873
  },
7874
7875
  /* VEX_LEN_XOP_09_C1 */
7876
  {
7877
    { VEX_W_TABLE (VEX_W_XOP_09_C1_L_0) },
7878
  },
7879
7880
  /* VEX_LEN_XOP_09_C2 */
7881
  {
7882
    { VEX_W_TABLE (VEX_W_XOP_09_C2_L_0) },
7883
  },
7884
7885
  /* VEX_LEN_XOP_09_C3 */
7886
  {
7887
    { VEX_W_TABLE (VEX_W_XOP_09_C3_L_0) },
7888
  },
7889
7890
  /* VEX_LEN_XOP_09_C6 */
7891
  {
7892
    { VEX_W_TABLE (VEX_W_XOP_09_C6_L_0) },
7893
  },
7894
7895
  /* VEX_LEN_XOP_09_C7 */
7896
  {
7897
    { VEX_W_TABLE (VEX_W_XOP_09_C7_L_0) },
7898
  },
7899
7900
  /* VEX_LEN_XOP_09_CB */
7901
  {
7902
    { VEX_W_TABLE (VEX_W_XOP_09_CB_L_0) },
7903
  },
7904
7905
  /* VEX_LEN_XOP_09_D1 */
7906
  {
7907
    { VEX_W_TABLE (VEX_W_XOP_09_D1_L_0) },
7908
  },
7909
7910
  /* VEX_LEN_XOP_09_D2 */
7911
  {
7912
    { VEX_W_TABLE (VEX_W_XOP_09_D2_L_0) },
7913
  },
7914
7915
  /* VEX_LEN_XOP_09_D3 */
7916
  {
7917
    { VEX_W_TABLE (VEX_W_XOP_09_D3_L_0) },
7918
  },
7919
7920
  /* VEX_LEN_XOP_09_D6 */
7921
  {
7922
    { VEX_W_TABLE (VEX_W_XOP_09_D6_L_0) },
7923
  },
7924
7925
  /* VEX_LEN_XOP_09_D7 */
7926
  {
7927
    { VEX_W_TABLE (VEX_W_XOP_09_D7_L_0) },
7928
  },
7929
7930
  /* VEX_LEN_XOP_09_DB */
7931
  {
7932
    { VEX_W_TABLE (VEX_W_XOP_09_DB_L_0) },
7933
  },
7934
7935
  /* VEX_LEN_XOP_09_E1 */
7936
  {
7937
    { VEX_W_TABLE (VEX_W_XOP_09_E1_L_0) },
7938
  },
7939
7940
  /* VEX_LEN_XOP_09_E2 */
7941
  {
7942
    { VEX_W_TABLE (VEX_W_XOP_09_E2_L_0) },
7943
  },
7944
7945
  /* VEX_LEN_XOP_09_E3 */
7946
  {
7947
    { VEX_W_TABLE (VEX_W_XOP_09_E3_L_0) },
7948
  },
7949
7950
  /* VEX_LEN_XOP_0A_12 */
7951
  {
7952
    { REG_TABLE (REG_XOP_0A_12_L_0) },
7953
  },
7954
};
7955
7956
#include "i386-dis-evex-len.h"
7957
7958
static const struct dis386 vex_w_table[][2] = {
7959
  {
7960
    /* VEX_W_0F41_L_1_M_1 */
7961
    { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_W_0) },
7962
    { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_W_1) },
7963
  },
7964
  {
7965
    /* VEX_W_0F42_L_1_M_1 */
7966
    { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_W_0) },
7967
    { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_W_1) },
7968
  },
7969
  {
7970
    /* VEX_W_0F44_L_0_M_1 */
7971
    { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_W_0) },
7972
    { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_W_1) },
7973
  },
7974
  {
7975
    /* VEX_W_0F45_L_1_M_1 */
7976
    { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_W_0) },
7977
    { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_W_1) },
7978
  },
7979
  {
7980
    /* VEX_W_0F46_L_1_M_1 */
7981
    { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_W_0) },
7982
    { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_W_1) },
7983
  },
7984
  {
7985
    /* VEX_W_0F47_L_1_M_1 */
7986
    { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_W_0) },
7987
    { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_W_1) },
7988
  },
7989
  {
7990
    /* VEX_W_0F4A_L_1_M_1 */
7991
    { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_W_0) },
7992
    { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_W_1) },
7993
  },
7994
  {
7995
    /* VEX_W_0F4B_L_1_M_1 */
7996
    { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_W_0) },
7997
    { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_W_1) },
7998
  },
7999
  {
8000
    /* VEX_W_0F90_L_0 */
8001
    { PREFIX_TABLE (PREFIX_VEX_0F90_L_0_W_0) },
8002
    { PREFIX_TABLE (PREFIX_VEX_0F90_L_0_W_1) },
8003
  },
8004
  {
8005
    /* VEX_W_0F91_L_0_M_0 */
8006
    { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_W_0) },
8007
    { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_W_1) },
8008
  },
8009
  {
8010
    /* VEX_W_0F92_L_0_M_1 */
8011
    { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_W_0) },
8012
    { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_W_1) },
8013
  },
8014
  {
8015
    /* VEX_W_0F93_L_0_M_1 */
8016
    { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_W_0) },
8017
    { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_W_1) },
8018
  },
8019
  {
8020
    /* VEX_W_0F98_L_0_M_1 */
8021
    { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_W_0) },
8022
    { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_W_1) },
8023
  },
8024
  {
8025
    /* VEX_W_0F99_L_0_M_1 */
8026
    { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_W_0) },
8027
    { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_W_1) },
8028
  },
8029
  {
8030
    /* VEX_W_0F380C  */
8031
    { "%XEvpermilps", { XM, Vex, EXx }, PREFIX_DATA },
8032
  },
8033
  {
8034
    /* VEX_W_0F380D  */
8035
    { "vpermilpd",  { XM, Vex, EXx }, PREFIX_DATA },
8036
  },
8037
  {
8038
    /* VEX_W_0F380E  */
8039
    { "vtestps",  { XM, EXx }, PREFIX_DATA },
8040
  },
8041
  {
8042
    /* VEX_W_0F380F  */
8043
    { "vtestpd",  { XM, EXx }, PREFIX_DATA },
8044
  },
8045
  {
8046
    /* VEX_W_0F3813 */
8047
    { "vcvtph2ps", { XM, EXxmmq }, PREFIX_DATA },
8048
  },
8049
  {
8050
    /* VEX_W_0F3816_L_1  */
8051
    { "vpermps",  { XM, Vex, EXx }, PREFIX_DATA },
8052
  },
8053
  {
8054
    /* VEX_W_0F3818 */
8055
    { "%XEvbroadcastss",  { XM, EXd }, PREFIX_DATA },
8056
  },
8057
  {
8058
    /* VEX_W_0F3819_L_1 */
8059
    { "vbroadcastsd", { XM, EXq }, PREFIX_DATA },
8060
  },
8061
  {
8062
    /* VEX_W_0F381A_L_1 */
8063
    { "vbroadcastf128", { XM, Mxmm }, PREFIX_DATA },
8064
  },
8065
  {
8066
    /* VEX_W_0F382C */
8067
    { "vmaskmovps", { XM, Vex, Mx }, PREFIX_DATA },
8068
  },
8069
  {
8070
    /* VEX_W_0F382D */
8071
    { "vmaskmovpd", { XM, Vex, Mx }, PREFIX_DATA },
8072
  },
8073
  {
8074
    /* VEX_W_0F382E */
8075
    { "vmaskmovps", { Mx, Vex, XM }, PREFIX_DATA },
8076
  },
8077
  {
8078
    /* VEX_W_0F382F */
8079
    { "vmaskmovpd", { Mx, Vex, XM }, PREFIX_DATA },
8080
  },
8081
  {
8082
    /* VEX_W_0F3836  */
8083
    { "vpermd",   { XM, Vex, EXx }, PREFIX_DATA },
8084
  },
8085
  {
8086
    /* VEX_W_0F3846 */
8087
    { "vpsravd",  { XM, Vex, EXx }, PREFIX_DATA },
8088
  },
8089
  {
8090
    /* VEX_W_0F3848_X86_64_L_0 */
8091
    { PREFIX_TABLE (PREFIX_VEX_0F3848_X86_64_L_0_W_0) },
8092
  },
8093
  {
8094
    /* VEX_W_0F3849_X86_64_L_0 */
8095
    { MOD_TABLE (MOD_VEX_0F3849_X86_64_L_0_W_0) },
8096
  },
8097
  {
8098
    /* VEX_W_0F384A_X86_64 */
8099
    { VEX_LEN_TABLE (VEX_LEN_0F384A_X86_64_W_0) },
8100
  },
8101
  {
8102
    /* VEX_W_0F384B_X86_64_L_0 */
8103
    { PREFIX_TABLE (PREFIX_VEX_0F384B_X86_64_L_0_W_0) },
8104
  },
8105
  {
8106
    /* VEX_W_0F3850 */
8107
    { PREFIX_TABLE (PREFIX_VEX_0F3850_W_0) },
8108
  },
8109
  {
8110
    /* VEX_W_0F3851 */
8111
    { PREFIX_TABLE (PREFIX_VEX_0F3851_W_0) },
8112
  },
8113
  {
8114
    /* VEX_W_0F3852 */
8115
    { "%XVvpdpwssd",  { XM, Vex, EXx }, PREFIX_DATA },
8116
  },
8117
  {
8118
    /* VEX_W_0F3853 */
8119
    { "%XVvpdpwssds", { XM, Vex, EXx }, PREFIX_DATA },
8120
  },
8121
  {
8122
    /* VEX_W_0F3858 */
8123
    { "%XEvpbroadcastd", { XM, EXd }, PREFIX_DATA },
8124
  },
8125
  {
8126
    /* VEX_W_0F3859 */
8127
    { "vpbroadcastq", { XM, EXq }, PREFIX_DATA },
8128
  },
8129
  {
8130
    /* VEX_W_0F385A_L_0 */
8131
    { "vbroadcasti128", { XM, Mxmm }, PREFIX_DATA },
8132
  },
8133
  {
8134
    /* VEX_W_0F385C_X86_64_L_0 */
8135
    { PREFIX_TABLE (PREFIX_VEX_0F385C_X86_64_L_0_W_0) },
8136
  },
8137
  {
8138
    /* VEX_W_0F385E_X86_64_L_0 */
8139
    { PREFIX_TABLE (PREFIX_VEX_0F385E_X86_64_L_0_W_0) },
8140
  },
8141
  {
8142
    /* VEX_W_0F385F_X86_64_L_0 */
8143
    { PREFIX_TABLE (PREFIX_VEX_0F385F_X86_64_L_0_W_0) },
8144
  },
8145
  {
8146
    /* VEX_W_0F386B_X86_64_L_0 */
8147
    { PREFIX_TABLE (PREFIX_VEX_0F386B_X86_64_L_0_W_0) },
8148
  },
8149
  {
8150
    /* VEX_W_0F386C_X86_64_L_0 */
8151
    { PREFIX_TABLE (PREFIX_VEX_0F386C_X86_64_L_0_W_0) },
8152
  },
8153
  {
8154
    /* VEX_W_0F386E_X86_64_L_0 */
8155
    { PREFIX_TABLE (PREFIX_VEX_0F386E_X86_64_L_0_W_0) },
8156
  },
8157
  {
8158
    /* VEX_W_0F386F_X86_64_L_0 */
8159
    { PREFIX_TABLE (PREFIX_VEX_0F386F_X86_64_L_0_W_0) },
8160
  },
8161
  {
8162
    /* VEX_W_0F3872_P_1 */
8163
    { "%XVvcvtneps2bf16%XY", { XMM, EXx }, 0 },
8164
  },
8165
  {
8166
    /* VEX_W_0F3878 */
8167
    { "%XEvpbroadcastb",  { XM, EXb }, PREFIX_DATA },
8168
  },
8169
  {
8170
    /* VEX_W_0F3879 */
8171
    { "%XEvpbroadcastw",  { XM, EXw }, PREFIX_DATA },
8172
  },
8173
  {
8174
    /* VEX_W_0F38B0 */
8175
    { PREFIX_TABLE (PREFIX_VEX_0F38B0_W_0) },
8176
  },
8177
  {
8178
    /* VEX_W_0F38B1 */
8179
    { PREFIX_TABLE (PREFIX_VEX_0F38B1_W_0) },
8180
  },
8181
  {
8182
    /* VEX_W_0F38B4 */
8183
    { Bad_Opcode },
8184
    { "%XVvpmadd52luq", { XM, Vex, EXx }, PREFIX_DATA },
8185
  },
8186
  {
8187
    /* VEX_W_0F38B5 */
8188
    { Bad_Opcode },
8189
    { "%XVvpmadd52huq", { XM, Vex, EXx }, PREFIX_DATA },
8190
  },
8191
  {
8192
    /* VEX_W_0F38CB_P_3 */
8193
    { VEX_LEN_TABLE (VEX_LEN_0F38CB_P_3_W_0) },
8194
  },
8195
  {
8196
    /* VEX_W_0F38CC_P_3 */
8197
    { VEX_LEN_TABLE (VEX_LEN_0F38CC_P_3_W_0) },
8198
  },
8199
  {
8200
    /* VEX_W_0F38CD_P_3 */
8201
    { VEX_LEN_TABLE (VEX_LEN_0F38CD_P_3_W_0) },
8202
  },
8203
  {
8204
    /* VEX_W_0F38CF */
8205
    { "%XEvgf2p8mulb", { XM, Vex, EXx }, PREFIX_DATA },
8206
  },
8207
  {
8208
    /* VEX_W_0F38D2 */
8209
    { PREFIX_TABLE (PREFIX_VEX_0F38D2_W_0) },
8210
  },
8211
  {
8212
    /* VEX_W_0F38D3 */
8213
    { PREFIX_TABLE (PREFIX_VEX_0F38D3_W_0) },
8214
  },
8215
  {
8216
    /* VEX_W_0F38DA */
8217
    { PREFIX_TABLE (PREFIX_VEX_0F38DA_W_0) },
8218
  },
8219
  {
8220
    /* VEX_W_0F3A00_L_1 */
8221
    { Bad_Opcode },
8222
    { "%XEvpermq",    { XM, EXx, Ib }, PREFIX_DATA },
8223
  },
8224
  {
8225
    /* VEX_W_0F3A01_L_1 */
8226
    { Bad_Opcode },
8227
    { "%XEvpermpd", { XM, EXx, Ib }, PREFIX_DATA },
8228
  },
8229
  {
8230
    /* VEX_W_0F3A02 */
8231
    { "vpblendd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
8232
  },
8233
  {
8234
    /* VEX_W_0F3A04 */
8235
    { "%XEvpermilps", { XM, EXx, Ib }, PREFIX_DATA },
8236
  },
8237
  {
8238
    /* VEX_W_0F3A05 */
8239
    { "vpermilpd",  { XM, EXx, Ib }, PREFIX_DATA },
8240
  },
8241
  {
8242
    /* VEX_W_0F3A06_L_1 */
8243
    { "vperm2f128", { XM, Vex, EXx, Ib }, PREFIX_DATA },
8244
  },
8245
  {
8246
    /* VEX_W_0F3A18_L_1 */
8247
    { "vinsertf128",  { XM, Vex, EXxmm, Ib }, PREFIX_DATA },
8248
  },
8249
  {
8250
    /* VEX_W_0F3A19_L_1 */
8251
    { "vextractf128", { EXxmm, XM, Ib }, PREFIX_DATA },
8252
  },
8253
  {
8254
    /* VEX_W_0F3A1D */
8255
    { "%XEvcvtps2ph", { EXxmmq, XM, EXxEVexS, Ib }, PREFIX_DATA },
8256
  },
8257
  {
8258
    /* VEX_W_0F3A38_L_1 */
8259
    { "vinserti128",  { XM, Vex, EXxmm, Ib }, PREFIX_DATA },
8260
  },
8261
  {
8262
    /* VEX_W_0F3A39_L_1 */
8263
    { "vextracti128", { EXxmm, XM, Ib }, PREFIX_DATA },
8264
  },
8265
  {
8266
    /* VEX_W_0F3A46_L_1 */
8267
    { "vperm2i128", { XM, Vex, EXx, Ib }, PREFIX_DATA },
8268
  },
8269
  {
8270
    /* VEX_W_0F3A4A */
8271
    { "vblendvps",  { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
8272
  },
8273
  {
8274
    /* VEX_W_0F3A4B */
8275
    { "vblendvpd",  { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
8276
  },
8277
  {
8278
    /* VEX_W_0F3A4C */
8279
    { "vpblendvb",  { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
8280
  },
8281
  {
8282
    /* VEX_W_0F3ACE */
8283
    { Bad_Opcode },
8284
    { "%XEvgf2p8affineqb", { XM, Vex, EXx, Ib }, PREFIX_DATA },
8285
  },
8286
  {
8287
    /* VEX_W_0F3ACF */
8288
    { Bad_Opcode },
8289
    { "%XEvgf2p8affineinvqb",  { XM, Vex, EXx, Ib }, PREFIX_DATA },
8290
  },
8291
  {
8292
    /* VEX_W_0F3ADE */
8293
    { VEX_LEN_TABLE (VEX_LEN_0F3ADE_W_0) },
8294
  },
8295
  {
8296
    /* VEX_W_MAP5_F8_X86_64 */
8297
    { PREFIX_TABLE (PREFIX_VEX_MAP5_F8_X86_64_L_0_W_0) },
8298
  },
8299
  {
8300
    /* VEX_W_MAP5_F9_X86_64 */
8301
    { PREFIX_TABLE (PREFIX_VEX_MAP5_F9_X86_64_L_0_W_0) },
8302
  },
8303
  {
8304
    /* VEX_W_MAP5_FD_X86_64 */
8305
    { PREFIX_TABLE (PREFIX_VEX_MAP5_FD_X86_64_L_0_W_0) },
8306
  },
8307
  {
8308
    /* VEX_W_MAP7_F6_L_0 */
8309
    { REG_TABLE (REG_VEX_MAP7_F6_L_0_W_0) },
8310
  },
8311
  {
8312
    /* VEX_W_MAP7_F8_L_0 */
8313
    { REG_TABLE (REG_VEX_MAP7_F8_L_0_W_0) },
8314
  },
8315
  /* VEX_W_XOP_08_85_L_0 */
8316
  {
8317
    { "vpmacssww",  { XM, Vex, EXx, XMVexI4 }, 0 },
8318
  },
8319
  /* VEX_W_XOP_08_86_L_0 */
8320
  {
8321
    { "vpmacsswd",  { XM, Vex, EXx, XMVexI4 }, 0 },
8322
  },
8323
  /* VEX_W_XOP_08_87_L_0 */
8324
  {
8325
    { "vpmacssdql",   { XM, Vex, EXx, XMVexI4 }, 0 },
8326
  },
8327
  /* VEX_W_XOP_08_8E_L_0 */
8328
  {
8329
    { "vpmacssdd",  { XM, Vex, EXx, XMVexI4 }, 0 },
8330
  },
8331
  /* VEX_W_XOP_08_8F_L_0 */
8332
  {
8333
    { "vpmacssdqh",   { XM, Vex, EXx, XMVexI4 }, 0 },
8334
  },
8335
  /* VEX_W_XOP_08_95_L_0 */
8336
  {
8337
    { "vpmacsww",   { XM, Vex, EXx, XMVexI4 }, 0 },
8338
  },
8339
  /* VEX_W_XOP_08_96_L_0 */
8340
  {
8341
    { "vpmacswd",   { XM, Vex, EXx, XMVexI4 }, 0 },
8342
  },
8343
  /* VEX_W_XOP_08_97_L_0 */
8344
  {
8345
    { "vpmacsdql",  { XM, Vex, EXx, XMVexI4 }, 0 },
8346
  },
8347
  /* VEX_W_XOP_08_9E_L_0 */
8348
  {
8349
    { "vpmacsdd",   { XM, Vex, EXx, XMVexI4 }, 0 },
8350
  },
8351
  /* VEX_W_XOP_08_9F_L_0 */
8352
  {
8353
    { "vpmacsdqh",  { XM, Vex, EXx, XMVexI4 }, 0 },
8354
  },
8355
  /* VEX_W_XOP_08_A6_L_0 */
8356
  {
8357
    { "vpmadcsswd",   { XM, Vex, EXx, XMVexI4 }, 0 },
8358
  },
8359
  /* VEX_W_XOP_08_B6_L_0 */
8360
  {
8361
    { "vpmadcswd",  { XM, Vex, EXx, XMVexI4 }, 0 },
8362
  },
8363
  /* VEX_W_XOP_08_C0_L_0 */
8364
  {
8365
    { "vprotb",   { XM, EXx, Ib }, 0 },
8366
  },
8367
  /* VEX_W_XOP_08_C1_L_0 */
8368
  {
8369
    { "vprotw",   { XM, EXx, Ib }, 0 },
8370
  },
8371
  /* VEX_W_XOP_08_C2_L_0 */
8372
  {
8373
    { "vprotd",   { XM, EXx, Ib }, 0 },
8374
  },
8375
  /* VEX_W_XOP_08_C3_L_0 */
8376
  {
8377
    { "vprotq",   { XM, EXx, Ib }, 0 },
8378
  },
8379
  /* VEX_W_XOP_08_CC_L_0 */
8380
  {
8381
     { "vpcomb",  { XM, Vex, EXx, VPCOM }, 0 },
8382
  },
8383
  /* VEX_W_XOP_08_CD_L_0 */
8384
  {
8385
     { "vpcomw",  { XM, Vex, EXx, VPCOM }, 0 },
8386
  },
8387
  /* VEX_W_XOP_08_CE_L_0 */
8388
  {
8389
     { "vpcomd",  { XM, Vex, EXx, VPCOM }, 0 },
8390
  },
8391
  /* VEX_W_XOP_08_CF_L_0 */
8392
  {
8393
     { "vpcomq",  { XM, Vex, EXx, VPCOM }, 0 },
8394
  },
8395
  /* VEX_W_XOP_08_EC_L_0 */
8396
  {
8397
     { "vpcomub", { XM, Vex, EXx, VPCOM }, 0 },
8398
  },
8399
  /* VEX_W_XOP_08_ED_L_0 */
8400
  {
8401
     { "vpcomuw", { XM, Vex, EXx, VPCOM }, 0 },
8402
  },
8403
  /* VEX_W_XOP_08_EE_L_0 */
8404
  {
8405
     { "vpcomud", { XM, Vex, EXx, VPCOM }, 0 },
8406
  },
8407
  /* VEX_W_XOP_08_EF_L_0 */
8408
  {
8409
     { "vpcomuq", { XM, Vex, EXx, VPCOM }, 0 },
8410
  },
8411
  /* VEX_W_XOP_09_80 */
8412
  {
8413
    { "vfrczps",  { XM, EXx }, 0 },
8414
  },
8415
  /* VEX_W_XOP_09_81 */
8416
  {
8417
    { "vfrczpd",  { XM, EXx }, 0 },
8418
  },
8419
  /* VEX_W_XOP_09_82 */
8420
  {
8421
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_82_W_0) },
8422
  },
8423
  /* VEX_W_XOP_09_83 */
8424
  {
8425
    { VEX_LEN_TABLE (VEX_LEN_XOP_09_83_W_0) },
8426
  },
8427
  /* VEX_W_XOP_09_C1_L_0 */
8428
  {
8429
    { "vphaddbw", { XM, EXxmm }, 0 },
8430
  },
8431
  /* VEX_W_XOP_09_C2_L_0 */
8432
  {
8433
    { "vphaddbd", { XM, EXxmm }, 0 },
8434
  },
8435
  /* VEX_W_XOP_09_C3_L_0 */
8436
  {
8437
    { "vphaddbq", { XM, EXxmm }, 0 },
8438
  },
8439
  /* VEX_W_XOP_09_C6_L_0 */
8440
  {
8441
    { "vphaddwd", { XM, EXxmm }, 0 },
8442
  },
8443
  /* VEX_W_XOP_09_C7_L_0 */
8444
  {
8445
    { "vphaddwq", { XM, EXxmm }, 0 },
8446
  },
8447
  /* VEX_W_XOP_09_CB_L_0 */
8448
  {
8449
    { "vphadddq", { XM, EXxmm }, 0 },
8450
  },
8451
  /* VEX_W_XOP_09_D1_L_0 */
8452
  {
8453
    { "vphaddubw",  { XM, EXxmm }, 0 },
8454
  },
8455
  /* VEX_W_XOP_09_D2_L_0 */
8456
  {
8457
    { "vphaddubd",  { XM, EXxmm }, 0 },
8458
  },
8459
  /* VEX_W_XOP_09_D3_L_0 */
8460
  {
8461
    { "vphaddubq",  { XM, EXxmm }, 0 },
8462
  },
8463
  /* VEX_W_XOP_09_D6_L_0 */
8464
  {
8465
    { "vphadduwd",  { XM, EXxmm }, 0 },
8466
  },
8467
  /* VEX_W_XOP_09_D7_L_0 */
8468
  {
8469
    { "vphadduwq",  { XM, EXxmm }, 0 },
8470
  },
8471
  /* VEX_W_XOP_09_DB_L_0 */
8472
  {
8473
    { "vphaddudq",  { XM, EXxmm }, 0 },
8474
  },
8475
  /* VEX_W_XOP_09_E1_L_0 */
8476
  {
8477
    { "vphsubbw", { XM, EXxmm }, 0 },
8478
  },
8479
  /* VEX_W_XOP_09_E2_L_0 */
8480
  {
8481
    { "vphsubwd", { XM, EXxmm }, 0 },
8482
  },
8483
  /* VEX_W_XOP_09_E3_L_0 */
8484
  {
8485
    { "vphsubdq", { XM, EXxmm }, 0 },
8486
  },
8487
8488
#include "i386-dis-evex-w.h"
8489
};
8490
8491
static const struct dis386 mod_table[][2] = {
8492
  {
8493
    /* MOD_62_32BIT */
8494
    { "bound{S|}",  { Gv, Ma }, 0 },
8495
    { EVEX_TABLE () },
8496
  },
8497
  {
8498
    /* MOD_C4_32BIT */
8499
    { "lesS",   { Gv, Mp }, 0 },
8500
    { VEX_C4_TABLE () },
8501
  },
8502
  {
8503
    /* MOD_C5_32BIT */
8504
    { "ldsS",   { Gv, Mp }, 0 },
8505
    { VEX_C5_TABLE () },
8506
  },
8507
  {
8508
    /* MOD_0F01_REG_0 */
8509
    { X86_64_TABLE (X86_64_0F01_REG_0) },
8510
    { RM_TABLE (RM_0F01_REG_0) },
8511
  },
8512
  {
8513
    /* MOD_0F01_REG_1 */
8514
    { X86_64_TABLE (X86_64_0F01_REG_1) },
8515
    { RM_TABLE (RM_0F01_REG_1) },
8516
  },
8517
  {
8518
    /* MOD_0F01_REG_2 */
8519
    { X86_64_TABLE (X86_64_0F01_REG_2) },
8520
    { RM_TABLE (RM_0F01_REG_2) },
8521
  },
8522
  {
8523
    /* MOD_0F01_REG_3 */
8524
    { X86_64_TABLE (X86_64_0F01_REG_3) },
8525
    { RM_TABLE (RM_0F01_REG_3) },
8526
  },
8527
  {
8528
    /* MOD_0F01_REG_5 */
8529
    { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_0) },
8530
    { RM_TABLE (RM_0F01_REG_5_MOD_3) },
8531
  },
8532
  {
8533
    /* MOD_0F01_REG_7 */
8534
    { "invlpg",   { Mb }, 0 },
8535
    { RM_TABLE (RM_0F01_REG_7_MOD_3) },
8536
  },
8537
  {
8538
    /* MOD_0F12_PREFIX_0 */
8539
    { "%XEVmovlpYX",  { XM, Vex, EXq }, 0 },
8540
    { "%XEVmovhlpY%XS", { XM, Vex, EXq }, 0 },
8541
  },
8542
  {
8543
    /* MOD_0F16_PREFIX_0 */
8544
    { "%XEVmovhpYX",  { XM, Vex, EXq }, 0 },
8545
    { "%XEVmovlhpY%XS", { XM, Vex, EXq }, 0 },
8546
  },
8547
  {
8548
    /* MOD_0F18_REG_0 */
8549
    { "prefetchnta",  { Mb }, 0 },
8550
    { "nopQ",   { Ev }, 0 },
8551
  },
8552
  {
8553
    /* MOD_0F18_REG_1 */
8554
    { "prefetcht0", { Mb }, 0 },
8555
    { "nopQ",   { Ev }, 0 },
8556
  },
8557
  {
8558
    /* MOD_0F18_REG_2 */
8559
    { "prefetcht1", { Mb }, 0 },
8560
    { "nopQ",   { Ev }, 0 },
8561
  },
8562
  {
8563
    /* MOD_0F18_REG_3 */
8564
    { "prefetcht2", { Mb }, 0 },
8565
    { "nopQ",   { Ev }, 0 },
8566
  },
8567
  {
8568
    /* MOD_0F18_REG_4 */
8569
    { "prefetchrst2", { Mb }, 0 },
8570
    { "nopQ",   { Ev }, 0 },
8571
  },
8572
  {
8573
    /* MOD_0F18_REG_6 */
8574
    { X86_64_TABLE (X86_64_0F18_REG_6_MOD_0) },
8575
    { "nopQ",   { Ev }, 0 },
8576
  },
8577
  {
8578
    /* MOD_0F18_REG_7 */
8579
    { X86_64_TABLE (X86_64_0F18_REG_7_MOD_0) },
8580
    { "nopQ",   { Ev }, 0 },
8581
  },
8582
  {
8583
    /* MOD_0F1A_PREFIX_0 */
8584
    { "bndldx",   { Gbnd, Mv_bnd }, 0 },
8585
    { "nopQ",   { Ev }, 0 },
8586
  },
8587
  {
8588
    /* MOD_0F1B_PREFIX_0 */
8589
    { "bndstx",   { Mv_bnd, Gbnd }, 0 },
8590
    { "nopQ",   { Ev }, 0 },
8591
  },
8592
  {
8593
    /* MOD_0F1B_PREFIX_1 */
8594
    { "bndmk",    { Gbnd, Mv_bnd }, 0 },
8595
    { "nopQ",   { Ev }, PREFIX_IGNORED },
8596
  },
8597
  {
8598
    /* MOD_0F1C_PREFIX_0 */
8599
    { REG_TABLE (REG_0F1C_P_0_MOD_0) },
8600
    { "nopQ",   { Ev }, 0 },
8601
  },
8602
  {
8603
    /* MOD_0F1E_PREFIX_1 */
8604
    { "nopQ",   { Ev }, PREFIX_IGNORED },
8605
    { REG_TABLE (REG_0F1E_P_1_MOD_3) },
8606
  },
8607
  {
8608
    /* MOD_0FAE_REG_0 */
8609
    { "fxsave",   { FXSAVE }, 0 },
8610
    { PREFIX_TABLE (PREFIX_0FAE_REG_0_MOD_3) },
8611
  },
8612
  {
8613
    /* MOD_0FAE_REG_1 */
8614
    { "fxrstor",  { FXSAVE }, 0 },
8615
    { PREFIX_TABLE (PREFIX_0FAE_REG_1_MOD_3) },
8616
  },
8617
  {
8618
    /* MOD_0FAE_REG_2 */
8619
    { "ldmxcsr",  { Md }, 0 },
8620
    { PREFIX_TABLE (PREFIX_0FAE_REG_2_MOD_3) },
8621
  },
8622
  {
8623
    /* MOD_0FAE_REG_3 */
8624
    { "stmxcsr",  { Md }, 0 },
8625
    { PREFIX_TABLE (PREFIX_0FAE_REG_3_MOD_3) },
8626
  },
8627
  {
8628
    /* MOD_0FAE_REG_4 */
8629
    { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_0) },
8630
    { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_3) },
8631
  },
8632
  {
8633
    /* MOD_0FAE_REG_5 */
8634
    { "xrstor",   { FXSAVE }, PREFIX_OPCODE | PREFIX_REX2_ILLEGAL },
8635
    { PREFIX_TABLE (PREFIX_0FAE_REG_5_MOD_3) },
8636
  },
8637
  {
8638
    /* MOD_0FAE_REG_6 */
8639
    { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_0) },
8640
    { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_3) },
8641
  },
8642
  {
8643
    /* MOD_0FAE_REG_7 */
8644
    { PREFIX_TABLE (PREFIX_0FAE_REG_7_MOD_0) },
8645
    { RM_TABLE (RM_0FAE_REG_7_MOD_3) },
8646
  },
8647
  {
8648
    /* MOD_0FC7_REG_6 */
8649
    { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_0) },
8650
    { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_3) }
8651
  },
8652
  {
8653
    /* MOD_0FC7_REG_7 */
8654
    { "vmptrst",  { Mq }, 0 },
8655
    { PREFIX_TABLE (PREFIX_0FC7_REG_7_MOD_3) }
8656
  },
8657
  {
8658
    /* MOD_0F38DC_PREFIX_1 */
8659
    { "aesenc128kl",    { XM, M }, 0 },
8660
    { "loadiwkey",      { XM, EXx }, 0 },
8661
  },
8662
  /* MOD_0F38F8 */
8663
  {
8664
    { PREFIX_TABLE (PREFIX_0F38F8_M_0) },
8665
    { X86_64_TABLE (X86_64_0F38F8_M_1) },
8666
  },
8667
  {
8668
    /* MOD_VEX_0F3849_X86_64_L_0_W_0 */
8669
    { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_0) },
8670
    { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_1) },
8671
  },
8672
8673
#include "i386-dis-evex-mod.h"
8674
};
8675
8676
static const struct dis386 rm_table[][8] = {
8677
  {
8678
    /* RM_C6_REG_7 */
8679
    { "xabort",   { Skip_MODRM, Ib }, 0 },
8680
  },
8681
  {
8682
    /* RM_C7_REG_7 */
8683
    { "xbeginT",  { Skip_MODRM, Jdqw }, 0 },
8684
  },
8685
  {
8686
    /* RM_0F01_REG_0 */
8687
    { "enclv",    { Skip_MODRM }, 0 },
8688
    { "vmcall",   { Skip_MODRM }, 0 },
8689
    { "vmlaunch", { Skip_MODRM }, 0 },
8690
    { "vmresume", { Skip_MODRM }, 0 },
8691
    { "vmxoff",   { Skip_MODRM }, 0 },
8692
    { "pconfig",  { Skip_MODRM }, 0 },
8693
    { PREFIX_TABLE (PREFIX_0F01_REG_0_MOD_3_RM_6) },
8694
    { PREFIX_TABLE (PREFIX_0F01_REG_0_MOD_3_RM_7) },
8695
  },
8696
  {
8697
    /* RM_0F01_REG_1 */
8698
    { "monitor",  { { OP_Monitor, 0 } }, 0 },
8699
    { "mwait",    { { OP_Mwait, 0 } }, 0 },
8700
    { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_2) },
8701
    { "stac",   { Skip_MODRM }, 0 },
8702
    { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_4) },
8703
    { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_5) },
8704
    { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_6) },
8705
    { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_7) },
8706
  },
8707
  {
8708
    /* RM_0F01_REG_2 */
8709
    { "xgetbv",   { Skip_MODRM }, 0 },
8710
    { "xsetbv",   { Skip_MODRM }, 0 },
8711
    { Bad_Opcode },
8712
    { Bad_Opcode },
8713
    { "vmfunc",   { Skip_MODRM }, 0 },
8714
    { "xend",   { Skip_MODRM }, 0 },
8715
    { "xtest",    { Skip_MODRM }, 0 },
8716
    { "enclu",    { Skip_MODRM }, 0 },
8717
  },
8718
  {
8719
    /* RM_0F01_REG_3 */
8720
    { "vmrun",    { Skip_MODRM }, 0 },
8721
    { PREFIX_TABLE (PREFIX_0F01_REG_3_RM_1) },
8722
    { "vmload",   { Skip_MODRM }, 0 },
8723
    { "vmsave",   { Skip_MODRM }, 0 },
8724
    { "stgi",   { Skip_MODRM }, 0 },
8725
    { "clgi",   { Skip_MODRM }, 0 },
8726
    { "skinit",   { Skip_MODRM }, 0 },
8727
    { "invlpga",  { Skip_MODRM }, 0 },
8728
  },
8729
  {
8730
    /* RM_0F01_REG_5_MOD_3 */
8731
    { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_0) },
8732
    { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_1) },
8733
    { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_2) },
8734
    { Bad_Opcode },
8735
    { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_4) },
8736
    { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_5) },
8737
    { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_6) },
8738
    { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_7) },
8739
  },
8740
  {
8741
    /* RM_0F01_REG_7_MOD_3 */
8742
    { "swapgs",   { Skip_MODRM }, 0  },
8743
    { "rdtscp",   { Skip_MODRM }, 0  },
8744
    { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_2) },
8745
    { "mwaitx",   { { OP_Mwait, eBX_reg } }, PREFIX_OPCODE },
8746
    { "clzero",   { Skip_MODRM }, 0  },
8747
    { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_5) },
8748
    { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_6) },
8749
    { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_7) },
8750
  },
8751
  {
8752
    /* RM_0F1E_P_1_MOD_3_REG_7 */
8753
    { "nopQ",   { Ev }, PREFIX_IGNORED },
8754
    { "nopQ",   { Ev }, PREFIX_IGNORED },
8755
    { "endbr64",  { Skip_MODRM }, 0 },
8756
    { "endbr32",  { Skip_MODRM }, 0 },
8757
    { "nopQ",   { Ev }, PREFIX_IGNORED },
8758
    { "nopQ",   { Ev }, PREFIX_IGNORED },
8759
    { "nopQ",   { Ev }, PREFIX_IGNORED },
8760
    { "nopQ",   { Ev }, PREFIX_IGNORED },
8761
  },
8762
  {
8763
    /* RM_0FAE_REG_6_MOD_3 */
8764
    { "mfence",   { Skip_MODRM }, 0 },
8765
  },
8766
  {
8767
    /* RM_0FAE_REG_7_MOD_3 */
8768
    { "sfence",   { Skip_MODRM }, 0 },
8769
  },
8770
  {
8771
    /* RM_0F3A0F_P_1_R_0 */
8772
    { "hreset",   { Skip_MODRM, Ib }, 0 },
8773
  },
8774
  {
8775
    /* RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0_R_0 */
8776
    { "tilerelease",  { Skip_MODRM }, 0 },
8777
  },
8778
  {
8779
    /* RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_3 */
8780
    { "tilezero", { TMM, Skip_MODRM }, 0 },
8781
  },
8782
};
8783
8784
0
#define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
8785
8786
/* The values used here must be non-zero, fit in 'unsigned char', and not be
8787
   in conflict with actual prefix opcodes.  */
8788
788
#define REP_PREFIX  0x01
8789
3.27k
#define XACQUIRE_PREFIX 0x02
8790
5.13k
#define XRELEASE_PREFIX 0x03
8791
2.81k
#define BND_PREFIX  0x04
8792
4.21k
#define NOTRACK_PREFIX  0x05
8793
8794
static enum {
8795
  ckp_okay,
8796
  ckp_bogus,
8797
  ckp_fetch_error,
8798
}
8799
ckprefix (instr_info *ins)
8800
3.66M
{
8801
3.66M
  int i, length;
8802
3.66M
  uint8_t newrex;
8803
8804
3.66M
  i = 0;
8805
3.66M
  length = 0;
8806
  /* The maximum instruction length is 15bytes.  */
8807
4.45M
  while (length < MAX_CODE_LENGTH - 1)
8808
4.45M
    {
8809
4.45M
      if (!fetch_code (ins->info, ins->codep + 1))
8810
3.49k
  return ckp_fetch_error;
8811
4.45M
      newrex = 0;
8812
4.45M
      switch (*ins->codep)
8813
4.45M
  {
8814
  /* REX prefixes family.  */
8815
20.2k
  case 0x40:
8816
46.4k
  case 0x41:
8817
65.0k
  case 0x42:
8818
78.0k
  case 0x43:
8819
91.5k
  case 0x44:
8820
109k
  case 0x45:
8821
126k
  case 0x46:
8822
141k
  case 0x47:
8823
192k
  case 0x48:
8824
232k
  case 0x49:
8825
245k
  case 0x4a:
8826
252k
  case 0x4b:
8827
279k
  case 0x4c:
8828
294k
  case 0x4d:
8829
312k
  case 0x4e:
8830
347k
  case 0x4f:
8831
347k
    if (ins->address_mode == mode_64bit)
8832
312k
      newrex = *ins->codep;
8833
34.9k
    else
8834
34.9k
      return ckp_okay;
8835
312k
    ins->last_rex_prefix = i;
8836
312k
    break;
8837
  /* REX2 must be the last prefix. */
8838
42.4k
  case REX2_OPCODE:
8839
42.4k
    if (ins->address_mode == mode_64bit)
8840
40.7k
      {
8841
40.7k
        if (ins->last_rex_prefix >= 0)
8842
824
    return ckp_bogus;
8843
8844
39.9k
        ins->codep++;
8845
39.9k
        if (!fetch_code (ins->info, ins->codep + 1))
8846
100
    return ckp_fetch_error;
8847
39.8k
        ins->rex2_payload = *ins->codep;
8848
39.8k
        ins->rex2 = ins->rex2_payload >> 4;
8849
39.8k
        ins->rex = (ins->rex2_payload & 0xf) | REX_OPCODE;
8850
39.8k
        ins->codep++;
8851
39.8k
        ins->last_rex2_prefix = i;
8852
39.8k
        ins->all_prefixes[i] = REX2_OPCODE;
8853
39.8k
      }
8854
41.4k
    return ckp_okay;
8855
31.2k
  case 0xf3:
8856
31.2k
    ins->prefixes |= PREFIX_REPZ;
8857
31.2k
    ins->last_repz_prefix = i;
8858
31.2k
    break;
8859
40.9k
  case 0xf2:
8860
40.9k
    ins->prefixes |= PREFIX_REPNZ;
8861
40.9k
    ins->last_repnz_prefix = i;
8862
40.9k
    break;
8863
39.5k
  case 0xf0:
8864
39.5k
    ins->prefixes |= PREFIX_LOCK;
8865
39.5k
    ins->last_lock_prefix = i;
8866
39.5k
    break;
8867
38.3k
  case 0x2e:
8868
38.3k
    ins->prefixes |= PREFIX_CS;
8869
38.3k
    ins->last_seg_prefix = i;
8870
38.3k
    if (ins->address_mode != mode_64bit)
8871
10.7k
      ins->active_seg_prefix = PREFIX_CS;
8872
38.3k
    break;
8873
21.5k
  case 0x36:
8874
21.5k
    ins->prefixes |= PREFIX_SS;
8875
21.5k
    ins->last_seg_prefix = i;
8876
21.5k
    if (ins->address_mode != mode_64bit)
8877
5.82k
      ins->active_seg_prefix = PREFIX_SS;
8878
21.5k
    break;
8879
93.8k
  case 0x3e:
8880
93.8k
    ins->prefixes |= PREFIX_DS;
8881
93.8k
    ins->last_seg_prefix = i;
8882
93.8k
    if (ins->address_mode != mode_64bit)
8883
10.1k
      ins->active_seg_prefix = PREFIX_DS;
8884
93.8k
    break;
8885
31.3k
  case 0x26:
8886
31.3k
    ins->prefixes |= PREFIX_ES;
8887
31.3k
    ins->last_seg_prefix = i;
8888
31.3k
    if (ins->address_mode != mode_64bit)
8889
9.28k
      ins->active_seg_prefix = PREFIX_ES;
8890
31.3k
    break;
8891
65.3k
  case 0x64:
8892
65.3k
    ins->prefixes |= PREFIX_FS;
8893
65.3k
    ins->last_seg_prefix = i;
8894
65.3k
    ins->active_seg_prefix = PREFIX_FS;
8895
65.3k
    break;
8896
48.9k
  case 0x65:
8897
48.9k
    ins->prefixes |= PREFIX_GS;
8898
48.9k
    ins->last_seg_prefix = i;
8899
48.9k
    ins->active_seg_prefix = PREFIX_GS;
8900
48.9k
    break;
8901
71.8k
  case 0x66:
8902
71.8k
    ins->prefixes |= PREFIX_DATA;
8903
71.8k
    ins->last_data_prefix = i;
8904
71.8k
    break;
8905
74.2k
  case 0x67:
8906
74.2k
    ins->prefixes |= PREFIX_ADDR;
8907
74.2k
    ins->last_addr_prefix = i;
8908
74.2k
    break;
8909
23.3k
  case FWAIT_OPCODE:
8910
    /* fwait is really an instruction.  If there are prefixes
8911
       before the fwait, they belong to the fwait, *not* to the
8912
       following instruction.  */
8913
23.3k
    ins->fwait_prefix = i;
8914
23.3k
    if (ins->prefixes || ins->rex)
8915
10.1k
      {
8916
10.1k
        ins->prefixes |= PREFIX_FWAIT;
8917
10.1k
        ins->codep++;
8918
        /* This ensures that the previous REX prefixes are noticed
8919
     as unused prefixes, as in the return case below.  */
8920
10.1k
        return ins->rex ? ckp_bogus : ckp_okay;
8921
10.1k
      }
8922
13.1k
    ins->prefixes = PREFIX_FWAIT;
8923
13.1k
    break;
8924
3.48M
  default:
8925
3.48M
    return ckp_okay;
8926
4.45M
  }
8927
      /* Rex is ignored when followed by another prefix.  */
8928
882k
      if (ins->rex)
8929
91.8k
  return ckp_bogus;
8930
790k
      if (*ins->codep != FWAIT_OPCODE)
8931
777k
  ins->all_prefixes[i++] = *ins->codep;
8932
790k
      ins->rex = newrex;
8933
790k
      ins->codep++;
8934
790k
      length++;
8935
790k
    }
8936
2.64k
  return ckp_bogus;
8937
3.66M
}
8938
8939
/* Return the name of the prefix byte PREF, or NULL if PREF is not a
8940
   prefix byte.  */
8941
8942
static const char *
8943
prefix_name (enum address_mode mode, uint8_t pref, int sizeflag)
8944
479k
{
8945
479k
  static const char *rexes [16] =
8946
479k
    {
8947
479k
      "rex",    /* 0x40 */
8948
479k
      "rex.B",    /* 0x41 */
8949
479k
      "rex.X",    /* 0x42 */
8950
479k
      "rex.XB",   /* 0x43 */
8951
479k
      "rex.R",    /* 0x44 */
8952
479k
      "rex.RB",   /* 0x45 */
8953
479k
      "rex.RX",   /* 0x46 */
8954
479k
      "rex.RXB",  /* 0x47 */
8955
479k
      "rex.W",    /* 0x48 */
8956
479k
      "rex.WB",   /* 0x49 */
8957
479k
      "rex.WX",   /* 0x4a */
8958
479k
      "rex.WXB",  /* 0x4b */
8959
479k
      "rex.WR",   /* 0x4c */
8960
479k
      "rex.WRB",  /* 0x4d */
8961
479k
      "rex.WRX",  /* 0x4e */
8962
479k
      "rex.WRXB", /* 0x4f */
8963
479k
    };
8964
8965
479k
  switch (pref)
8966
479k
    {
8967
    /* REX prefixes family.  */
8968
12.2k
    case 0x40:
8969
19.6k
    case 0x41:
8970
30.7k
    case 0x42:
8971
36.8k
    case 0x43:
8972
43.0k
    case 0x44:
8973
51.5k
    case 0x45:
8974
61.2k
    case 0x46:
8975
70.1k
    case 0x47:
8976
83.6k
    case 0x48:
8977
101k
    case 0x49:
8978
110k
    case 0x4a:
8979
114k
    case 0x4b:
8980
125k
    case 0x4c:
8981
135k
    case 0x4d:
8982
145k
    case 0x4e:
8983
164k
    case 0x4f:
8984
164k
      return rexes [pref - 0x40];
8985
17.2k
    case 0xf3:
8986
17.2k
      return "repz";
8987
19.1k
    case 0xf2:
8988
19.1k
      return "repnz";
8989
29.0k
    case 0xf0:
8990
29.0k
      return "lock";
8991
24.3k
    case 0x2e:
8992
24.3k
      return "cs";
8993
14.3k
    case 0x36:
8994
14.3k
      return "ss";
8995
30.6k
    case 0x3e:
8996
30.6k
      return "ds";
8997
18.8k
    case 0x26:
8998
18.8k
      return "es";
8999
39.8k
    case 0x64:
9000
39.8k
      return "fs";
9001
24.0k
    case 0x65:
9002
24.0k
      return "gs";
9003
30.9k
    case 0x66:
9004
30.9k
      return (sizeflag & DFLAG) ? "data16" : "data32";
9005
39.4k
    case 0x67:
9006
39.4k
      if (mode == mode_64bit)
9007
30.0k
  return (sizeflag & AFLAG) ? "addr32" : "addr64";
9008
9.43k
      else
9009
9.43k
  return (sizeflag & AFLAG) ? "addr16" : "addr32";
9010
166
    case FWAIT_OPCODE:
9011
166
      return "fwait";
9012
394
    case REP_PREFIX:
9013
394
      return "rep";
9014
1.56k
    case XACQUIRE_PREFIX:
9015
1.56k
      return "xacquire";
9016
2.35k
    case XRELEASE_PREFIX:
9017
2.35k
      return "xrelease";
9018
1.40k
    case BND_PREFIX:
9019
1.40k
      return "bnd";
9020
1.98k
    case NOTRACK_PREFIX:
9021
1.98k
      return "notrack";
9022
18.6k
    case REX2_OPCODE:
9023
18.6k
      return "rex2";
9024
335
    default:
9025
335
      return NULL;
9026
479k
    }
9027
479k
}
9028
9029
void
9030
print_i386_disassembler_options (FILE *stream)
9031
0
{
9032
0
  fprintf (stream, _("\n\
9033
0
The following i386/x86-64 specific disassembler options are supported for use\n\
9034
0
with the -M switch (multiple options should be separated by commas):\n"));
9035
9036
0
  fprintf (stream, _("  x86-64      Disassemble in 64bit mode\n"));
9037
0
  fprintf (stream, _("  i386        Disassemble in 32bit mode\n"));
9038
0
  fprintf (stream, _("  i8086       Disassemble in 16bit mode\n"));
9039
0
  fprintf (stream, _("  att         Display instruction in AT&T syntax\n"));
9040
0
  fprintf (stream, _("  intel       Display instruction in Intel syntax\n"));
9041
0
  fprintf (stream, _("  att-mnemonic  (AT&T syntax only)\n"
9042
0
         "              Display instruction with AT&T mnemonic\n"));
9043
0
  fprintf (stream, _("  intel-mnemonic  (AT&T syntax only)\n"
9044
0
         "              Display instruction with Intel mnemonic\n"));
9045
0
  fprintf (stream, _("  addr64      Assume 64bit address size\n"));
9046
0
  fprintf (stream, _("  addr32      Assume 32bit address size\n"));
9047
0
  fprintf (stream, _("  addr16      Assume 16bit address size\n"));
9048
0
  fprintf (stream, _("  data32      Assume 32bit data size\n"));
9049
0
  fprintf (stream, _("  data16      Assume 16bit data size\n"));
9050
0
  fprintf (stream, _("  suffix      Always display instruction suffix in AT&T syntax\n"));
9051
0
  fprintf (stream, _("  amd64       Display instruction in AMD64 ISA\n"));
9052
0
  fprintf (stream, _("  intel64     Display instruction in Intel64 ISA\n"));
9053
0
  fprintf (stream, _("  annotate-immediates  Annotate immediate operands that match symbols\n"));
9054
0
}
9055
9056
/* Bad opcode.  */
9057
static const struct dis386 bad_opcode = { "(bad)", { XX }, 0 };
9058
9059
/* Fetch error indicator.  */
9060
static const struct dis386 err_opcode = { NULL, { XX }, 0 };
9061
9062
static const struct dis386 map5_f8_opcode = { X86_64_TABLE (X86_64_VEX_MAP5_F8) };
9063
static const struct dis386 map5_f9_opcode = { X86_64_TABLE (X86_64_VEX_MAP5_F9) };
9064
static const struct dis386 map5_fd_opcode = { X86_64_TABLE (X86_64_VEX_MAP5_FD) };
9065
static const struct dis386 map7_f6_opcode = { VEX_LEN_TABLE (VEX_LEN_MAP7_F6) };
9066
static const struct dis386 map7_f8_opcode = { VEX_LEN_TABLE (VEX_LEN_MAP7_F8) };
9067
9068
/* Get a pointer to struct dis386 with a valid name.  */
9069
9070
static const struct dis386 *
9071
get_valid_dis386 (const struct dis386 *dp, instr_info *ins)
9072
4.36M
{
9073
4.36M
  int vindex, vex_table_index;
9074
9075
4.36M
  if (dp->name != NULL)
9076
2.44M
    return dp;
9077
9078
1.91M
  switch (dp->op[0].bytemode)
9079
1.91M
    {
9080
542k
    case USE_REG_TABLE:
9081
542k
      dp = &reg_table[dp->op[1].bytemode][ins->modrm.reg];
9082
542k
      break;
9083
9084
46.8k
    case USE_MOD_TABLE:
9085
46.8k
      vindex = ins->modrm.mod == 0x3 ? 1 : 0;
9086
46.8k
      dp = &mod_table[dp->op[1].bytemode][vindex];
9087
46.8k
      break;
9088
9089
5.60k
    case USE_RM_TABLE:
9090
5.60k
      dp = &rm_table[dp->op[1].bytemode][ins->modrm.rm];
9091
5.60k
      break;
9092
9093
98.7k
    case USE_PREFIX_TABLE:
9094
99.6k
    use_prefix_table:
9095
99.6k
      if (ins->need_vex)
9096
50.8k
  {
9097
    /* The prefix in VEX is implicit.  */
9098
50.8k
    switch (ins->vex.prefix)
9099
50.8k
      {
9100
12.2k
      case 0:
9101
12.2k
        vindex = 0;
9102
12.2k
        break;
9103
13.0k
      case REPE_PREFIX_OPCODE:
9104
13.0k
        vindex = 1;
9105
13.0k
        break;
9106
14.6k
      case DATA_PREFIX_OPCODE:
9107
14.6k
        vindex = 2;
9108
14.6k
        break;
9109
10.7k
      case REPNE_PREFIX_OPCODE:
9110
10.7k
        vindex = 3;
9111
10.7k
        break;
9112
0
      default:
9113
0
        abort ();
9114
0
        break;
9115
50.8k
      }
9116
50.8k
  }
9117
48.8k
      else
9118
48.8k
  {
9119
48.8k
    int last_prefix = -1;
9120
48.8k
    int prefix = 0;
9121
48.8k
    vindex = 0;
9122
    /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
9123
       When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
9124
       last one wins.  */
9125
48.8k
    if ((ins->prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
9126
10.8k
      {
9127
10.8k
        if (ins->last_repz_prefix > ins->last_repnz_prefix)
9128
4.82k
    {
9129
4.82k
      vindex = 1;
9130
4.82k
      prefix = PREFIX_REPZ;
9131
4.82k
      last_prefix = ins->last_repz_prefix;
9132
4.82k
    }
9133
5.97k
        else
9134
5.97k
    {
9135
5.97k
      vindex = 3;
9136
5.97k
      prefix = PREFIX_REPNZ;
9137
5.97k
      last_prefix = ins->last_repnz_prefix;
9138
5.97k
    }
9139
9140
        /* Check if prefix should be ignored.  */
9141
10.8k
        if ((((prefix_table[dp->op[1].bytemode][vindex].prefix_requirement
9142
10.8k
         & PREFIX_IGNORED) >> PREFIX_IGNORED_SHIFT)
9143
10.8k
       & prefix) != 0
9144
2.38k
      && !prefix_table[dp->op[1].bytemode][vindex].name)
9145
529
    vindex = 0;
9146
10.8k
      }
9147
9148
48.8k
    if (vindex == 0 && (ins->prefixes & PREFIX_DATA) != 0)
9149
6.41k
      {
9150
6.41k
        vindex = 2;
9151
6.41k
        prefix = PREFIX_DATA;
9152
6.41k
        last_prefix = ins->last_data_prefix;
9153
6.41k
      }
9154
9155
48.8k
    if (vindex != 0)
9156
16.6k
      {
9157
16.6k
        ins->used_prefixes |= prefix;
9158
16.6k
        ins->all_prefixes[last_prefix] = 0;
9159
16.6k
      }
9160
48.8k
  }
9161
99.6k
      dp = &prefix_table[dp->op[1].bytemode][vindex];
9162
99.6k
      break;
9163
9164
3.68k
    case USE_X86_64_EVEX_FROM_VEX_TABLE:
9165
5.19k
    case USE_X86_64_EVEX_PFX_TABLE:
9166
6.74k
    case USE_X86_64_EVEX_W_TABLE:
9167
7.65k
    case USE_X86_64_EVEX_MEM_W_TABLE:
9168
7.65k
      ins->evex_type = evex_from_vex;
9169
      /* EVEX from VEX instructions are 64-bit only and require that EVEX.z,
9170
   EVEX.L'L, EVEX.b, and the lower 2 bits of EVEX.aaa must be 0.  */
9171
7.65k
      if (ins->address_mode != mode_64bit
9172
7.37k
    || (ins->vex.mask_register_specifier & 0x3) != 0
9173
6.56k
    || ins->vex.ll != 0
9174
6.22k
    || ins->vex.zeroing != 0
9175
5.92k
    || ins->vex.b)
9176
1.99k
  return &bad_opcode;
9177
9178
5.66k
      if (dp->op[0].bytemode == USE_X86_64_EVEX_PFX_TABLE)
9179
923
  goto use_prefix_table;
9180
4.73k
      if (dp->op[0].bytemode == USE_X86_64_EVEX_W_TABLE)
9181
1.32k
  goto use_vex_w_table;
9182
3.41k
      if (dp->op[0].bytemode == USE_X86_64_EVEX_MEM_W_TABLE)
9183
563
  {
9184
563
    if (ins->modrm.mod == 3)
9185
304
      return &bad_opcode;
9186
259
    goto use_vex_w_table;
9187
563
  }
9188
9189
      /* Fall through.  */
9190
492k
    case USE_X86_64_TABLE:
9191
492k
      vindex = ins->address_mode == mode_64bit ? 1 : 0;
9192
492k
      dp = &x86_64_table[dp->op[1].bytemode][vindex];
9193
492k
      break;
9194
9195
6.17k
    case USE_3BYTE_TABLE:
9196
6.17k
      if (ins->last_rex2_prefix >= 0)
9197
1.06k
  return &err_opcode;
9198
5.10k
      if (!fetch_code (ins->info, ins->codep + 2))
9199
93
  return &err_opcode;
9200
5.01k
      vindex = *ins->codep++;
9201
5.01k
      dp = &three_byte_table[dp->op[1].bytemode][vindex];
9202
5.01k
      ins->end_codep = ins->codep;
9203
5.01k
      if (!fetch_modrm (ins))
9204
0
  return &err_opcode;
9205
5.01k
      break;
9206
9207
18.1k
    case USE_VEX_LEN_TABLE:
9208
18.1k
      if (!ins->need_vex)
9209
0
  abort ();
9210
9211
18.1k
      switch (ins->vex.length)
9212
18.1k
  {
9213
14.7k
  case 128:
9214
14.7k
    vindex = 0;
9215
14.7k
    break;
9216
638
  case 512:
9217
    /* This allows re-using in particular table entries where only
9218
       128-bit operand size (VEX.L=0 / EVEX.L'L=0) are valid.  */
9219
638
    if (ins->vex.evex)
9220
638
      {
9221
3.37k
  case 256:
9222
3.37k
        vindex = 1;
9223
3.37k
        break;
9224
638
      }
9225
  /* Fall through.  */
9226
0
  default:
9227
0
    abort ();
9228
0
    break;
9229
18.1k
  }
9230
9231
18.1k
      dp = &vex_len_table[dp->op[1].bytemode][vindex];
9232
18.1k
      break;
9233
9234
3.59k
    case USE_EVEX_LEN_TABLE:
9235
3.59k
      if (!ins->vex.evex)
9236
0
  abort ();
9237
9238
3.59k
      switch (ins->vex.length)
9239
3.59k
  {
9240
872
  case 128:
9241
872
    vindex = 0;
9242
872
    break;
9243
890
  case 256:
9244
890
    vindex = 1;
9245
890
    break;
9246
1.83k
  case 512:
9247
1.83k
    vindex = 2;
9248
1.83k
    break;
9249
0
  default:
9250
0
    abort ();
9251
0
    break;
9252
3.59k
  }
9253
9254
3.59k
      dp = &evex_len_table[dp->op[1].bytemode][vindex];
9255
3.59k
      break;
9256
9257
21.2k
    case USE_XOP_8F_TABLE:
9258
21.2k
      if (!fetch_code (ins->info, ins->codep + 3))
9259
151
  return &err_opcode;
9260
21.1k
      ins->rex = ~(*ins->codep >> 5) & 0x7;
9261
9262
      /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm".  */
9263
21.1k
      switch ((*ins->codep & 0x1f))
9264
21.1k
  {
9265
15.2k
  default:
9266
15.2k
    dp = &bad_opcode;
9267
15.2k
    return dp;
9268
2.10k
  case 0x8:
9269
2.10k
    vex_table_index = XOP_08;
9270
2.10k
    break;
9271
2.21k
  case 0x9:
9272
2.21k
    vex_table_index = XOP_09;
9273
2.21k
    break;
9274
1.56k
  case 0xa:
9275
1.56k
    vex_table_index = XOP_0A;
9276
1.56k
    break;
9277
21.1k
  }
9278
5.88k
      ins->codep++;
9279
5.88k
      ins->vex.w = *ins->codep & 0x80;
9280
5.88k
      if (ins->vex.w && ins->address_mode == mode_64bit)
9281
1.58k
  ins->rex |= REX_W;
9282
9283
5.88k
      ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf;
9284
5.88k
      if (ins->address_mode != mode_64bit)
9285
1.73k
  {
9286
    /* In 16/32-bit mode REX_B is silently ignored.  */
9287
1.73k
    ins->rex &= ~REX_B;
9288
1.73k
  }
9289
9290
5.88k
      ins->vex.length = (*ins->codep & 0x4) ? 256 : 128;
9291
5.88k
      switch ((*ins->codep & 0x3))
9292
5.88k
  {
9293
4.48k
  case 0:
9294
4.48k
    break;
9295
390
  case 1:
9296
390
    ins->vex.prefix = DATA_PREFIX_OPCODE;
9297
390
    break;
9298
615
  case 2:
9299
615
    ins->vex.prefix = REPE_PREFIX_OPCODE;
9300
615
    break;
9301
393
  case 3:
9302
393
    ins->vex.prefix = REPNE_PREFIX_OPCODE;
9303
393
    break;
9304
5.88k
  }
9305
5.88k
      ins->need_vex = 3;
9306
5.88k
      ins->codep++;
9307
5.88k
      vindex = *ins->codep++;
9308
5.88k
      dp = &xop_table[vex_table_index][vindex];
9309
9310
5.88k
      ins->end_codep = ins->codep;
9311
5.88k
      if (!fetch_modrm (ins))
9312
330
  return &err_opcode;
9313
9314
      /* No XOP encoding so far allows for a non-zero embedded prefix. Avoid
9315
   having to decode the bits for every otherwise valid encoding.  */
9316
5.55k
      if (ins->vex.prefix)
9317
1.18k
  return &bad_opcode;
9318
4.36k
      break;
9319
9320
53.5k
    case USE_VEX_C4_TABLE:
9321
      /* VEX prefix.  */
9322
53.5k
      if (!fetch_code (ins->info, ins->codep + 3))
9323
298
  return &err_opcode;
9324
53.2k
      ins->rex = ~(*ins->codep >> 5) & 0x7;
9325
53.2k
      switch ((*ins->codep & 0x1f))
9326
53.2k
  {
9327
26.6k
  default:
9328
26.6k
    dp = &bad_opcode;
9329
26.6k
    return dp;
9330
2.62k
  case 0x1:
9331
2.62k
    vex_table_index = VEX_0F;
9332
2.62k
    break;
9333
14.3k
  case 0x2:
9334
14.3k
    vex_table_index = VEX_0F38;
9335
14.3k
    break;
9336
5.23k
  case 0x3:
9337
5.23k
    vex_table_index = VEX_0F3A;
9338
5.23k
    break;
9339
3.04k
  case 0x5:
9340
3.04k
    vex_table_index = VEX_MAP5;
9341
3.04k
    break;
9342
1.32k
  case 0x7:
9343
1.32k
    vex_table_index = VEX_MAP7;
9344
1.32k
    break;
9345
53.2k
  }
9346
26.5k
      ins->codep++;
9347
26.5k
      ins->vex.w = *ins->codep & 0x80;
9348
26.5k
      if (ins->address_mode == mode_64bit)
9349
22.3k
  {
9350
22.3k
    if (ins->vex.w)
9351
7.21k
      ins->rex |= REX_W;
9352
22.3k
  }
9353
4.20k
      else
9354
4.20k
  {
9355
    /* For the 3-byte VEX prefix in 32-bit mode, the REX_B bit
9356
       is ignored, other REX bits are 0 and the highest bit in
9357
       VEX.vvvv is also ignored (but we mustn't clear it here).  */
9358
4.20k
    ins->rex = 0;
9359
4.20k
  }
9360
26.5k
      ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf;
9361
26.5k
      ins->vex.length = (*ins->codep & 0x4) ? 256 : 128;
9362
26.5k
      switch ((*ins->codep & 0x3))
9363
26.5k
  {
9364
10.1k
  case 0:
9365
10.1k
    break;
9366
6.88k
  case 1:
9367
6.88k
    ins->vex.prefix = DATA_PREFIX_OPCODE;
9368
6.88k
    break;
9369
5.75k
  case 2:
9370
5.75k
    ins->vex.prefix = REPE_PREFIX_OPCODE;
9371
5.75k
    break;
9372
3.79k
  case 3:
9373
3.79k
    ins->vex.prefix = REPNE_PREFIX_OPCODE;
9374
3.79k
    break;
9375
26.5k
  }
9376
26.5k
      ins->need_vex = 3;
9377
26.5k
      ins->codep++;
9378
26.5k
      vindex = *ins->codep++;
9379
26.5k
      ins->condition_code = vindex & 0xf;
9380
26.5k
      if (vex_table_index != VEX_MAP7 && vex_table_index != VEX_MAP5)
9381
22.1k
  dp = &vex_table[vex_table_index][vindex];
9382
4.37k
      else if (vindex == 0xf6)
9383
245
  dp = &map7_f6_opcode;
9384
4.12k
      else if (vindex == 0xf8)
9385
1.66k
  {
9386
1.66k
    if (vex_table_index == VEX_MAP5)
9387
982
      dp = &map5_f8_opcode;
9388
678
    else
9389
678
      dp = &map7_f8_opcode;
9390
1.66k
  }
9391
2.46k
      else if (vindex == 0xf9)
9392
207
  dp = &map5_f9_opcode;
9393
2.26k
      else if (vindex == 0xfd)
9394
400
  dp = &map5_fd_opcode;
9395
1.86k
      else
9396
1.86k
  dp = &bad_opcode;
9397
26.5k
      ins->end_codep = ins->codep;
9398
      /* There is no MODRM byte for VEX0F 77.  */
9399
26.5k
      if ((vex_table_index != VEX_0F || vindex != 0x77)
9400
26.3k
    && !fetch_modrm (ins))
9401
766
  return &err_opcode;
9402
25.7k
      break;
9403
9404
25.7k
    case USE_VEX_C5_TABLE:
9405
      /* VEX prefix.  */
9406
21.6k
      if (!fetch_code (ins->info, ins->codep + 2))
9407
242
  return &err_opcode;
9408
21.3k
      ins->rex = (*ins->codep & 0x80) ? 0 : REX_R;
9409
9410
      /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in
9411
   VEX.vvvv is 1.  */
9412
21.3k
      ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf;
9413
21.3k
      ins->vex.length = (*ins->codep & 0x4) ? 256 : 128;
9414
21.3k
      switch ((*ins->codep & 0x3))
9415
21.3k
  {
9416
3.49k
  case 0:
9417
3.49k
    break;
9418
11.2k
  case 1:
9419
11.2k
    ins->vex.prefix = DATA_PREFIX_OPCODE;
9420
11.2k
    break;
9421
2.51k
  case 2:
9422
2.51k
    ins->vex.prefix = REPE_PREFIX_OPCODE;
9423
2.51k
    break;
9424
4.14k
  case 3:
9425
4.14k
    ins->vex.prefix = REPNE_PREFIX_OPCODE;
9426
4.14k
    break;
9427
21.3k
  }
9428
21.3k
      ins->need_vex = 2;
9429
21.3k
      ins->codep++;
9430
21.3k
      vindex = *ins->codep++;
9431
21.3k
      dp = &vex_table[VEX_0F][vindex];
9432
21.3k
      ins->end_codep = ins->codep;
9433
      /* There is no MODRM byte for VEX 77.  */
9434
21.3k
      if (vindex != 0x77 && !fetch_modrm (ins))
9435
305
  return &err_opcode;
9436
21.0k
      break;
9437
9438
23.1k
    case USE_VEX_W_TABLE:
9439
24.6k
    use_vex_w_table:
9440
24.6k
      if (!ins->need_vex)
9441
0
  abort ();
9442
9443
24.6k
      dp = &vex_w_table[dp->op[1].bytemode][ins->vex.w];
9444
24.6k
      break;
9445
9446
116k
    case USE_EVEX_TABLE:
9447
116k
      ins->two_source_ops = false;
9448
      /* EVEX prefix.  */
9449
116k
      ins->vex.evex = true;
9450
116k
      if (!fetch_code (ins->info, ins->codep + 4))
9451
558
  return &err_opcode;
9452
      /* The first byte after 0x62.  */
9453
115k
      if (*ins->codep & 0x8)
9454
18.9k
  ins->rex2 |= REX_B;
9455
115k
      if (!(*ins->codep & 0x10))
9456
61.4k
  ins->rex2 |= REX_R;
9457
9458
115k
      ins->rex = ~(*ins->codep >> 5) & 0x7;
9459
115k
      switch (*ins->codep & 0x7)
9460
115k
  {
9461
5.37k
  default:
9462
5.37k
    return &bad_opcode;
9463
20.6k
  case 0x1:
9464
20.6k
    vex_table_index = EVEX_0F;
9465
20.6k
    break;
9466
30.3k
  case 0x2:
9467
30.3k
    vex_table_index = EVEX_0F38;
9468
30.3k
    break;
9469
15.5k
  case 0x3:
9470
15.5k
    vex_table_index = EVEX_0F3A;
9471
15.5k
    break;
9472
22.9k
  case 0x4:
9473
22.9k
    vex_table_index = EVEX_MAP4;
9474
22.9k
    ins->evex_type = evex_from_legacy;
9475
22.9k
    if (ins->address_mode != mode_64bit)
9476
621
      return &bad_opcode;
9477
22.3k
    ins->rex |= REX_OPCODE;
9478
22.3k
    break;
9479
7.99k
  case 0x5:
9480
7.99k
    vex_table_index = EVEX_MAP5;
9481
7.99k
    break;
9482
9.47k
  case 0x6:
9483
9.47k
    vex_table_index = EVEX_MAP6;
9484
9.47k
    break;
9485
3.43k
  case 0x7:
9486
3.43k
    vex_table_index = EVEX_MAP7;
9487
3.43k
    break;
9488
115k
  }
9489
9490
      /* The second byte after 0x62.  */
9491
109k
      ins->codep++;
9492
109k
      ins->vex.w = *ins->codep & 0x80;
9493
109k
      if (ins->vex.w && ins->address_mode == mode_64bit)
9494
39.1k
  ins->rex |= REX_W;
9495
9496
109k
      ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf;
9497
9498
109k
      if (!(*ins->codep & 0x4))
9499
28.3k
  ins->rex2 |= REX_X;
9500
9501
109k
      switch ((*ins->codep & 0x3))
9502
109k
  {
9503
31.0k
  case 0:
9504
31.0k
    break;
9505
26.3k
  case 1:
9506
26.3k
    ins->vex.prefix = DATA_PREFIX_OPCODE;
9507
26.3k
    break;
9508
28.9k
  case 2:
9509
28.9k
    ins->vex.prefix = REPE_PREFIX_OPCODE;
9510
28.9k
    break;
9511
23.3k
  case 3:
9512
23.3k
    ins->vex.prefix = REPNE_PREFIX_OPCODE;
9513
23.3k
    break;
9514
109k
  }
9515
9516
      /* The third byte after 0x62.  */
9517
109k
      ins->codep++;
9518
9519
      /* Remember the static rounding bits.  */
9520
109k
      ins->vex.ll = (*ins->codep >> 5) & 3;
9521
109k
      ins->vex.b = *ins->codep & 0x10;
9522
9523
109k
      ins->vex.v = *ins->codep & 0x8;
9524
109k
      ins->vex.mask_register_specifier = *ins->codep & 0x7;
9525
109k
      ins->vex.scc = *ins->codep & 0xf;
9526
109k
      ins->vex.zeroing = *ins->codep & 0x80;
9527
      /* Set the NF bit for EVEX-Promoted instructions, this bit will be cleared
9528
   when it's an evex_default one.  */
9529
109k
      ins->vex.nf = *ins->codep & 0x4;
9530
9531
109k
      if (ins->address_mode != mode_64bit)
9532
8.85k
  {
9533
    /* Report bad for !evex_default and when two fixed values of evex
9534
       change.  */
9535
8.85k
    if (ins->evex_type != evex_default
9536
8.85k
        || (ins->rex2 & (REX_B | REX_X)))
9537
1.38k
      return &bad_opcode;
9538
    /* In 16/32-bit mode silently ignore following bits.  */
9539
7.46k
    ins->rex &= ~REX_B;
9540
7.46k
    ins->rex2 &= ~REX_R;
9541
7.46k
  }
9542
9543
108k
      ins->need_vex = 4;
9544
9545
108k
      ins->codep++;
9546
108k
      vindex = *ins->codep++;
9547
108k
      ins->condition_code = vindex & 0xf;
9548
108k
      if (vex_table_index != EVEX_MAP7)
9549
105k
  dp = &evex_table[vex_table_index][vindex];
9550
2.92k
      else if (vindex == 0xf8)
9551
309
  dp = &map7_f8_opcode;
9552
2.62k
      else if (vindex == 0xf6)
9553
312
  dp = &map7_f6_opcode;
9554
2.30k
      else
9555
2.30k
  dp = &bad_opcode;
9556
108k
      ins->end_codep = ins->codep;
9557
108k
      if (!fetch_modrm (ins))
9558
912
  return &err_opcode;
9559
9560
107k
      if (ins->modrm.mod == 3 && (ins->rex2 & REX_X))
9561
3.80k
  return &bad_opcode;
9562
9563
      /* Set vector length. For EVEX-promoted instructions, evex.ll == 0b00,
9564
   which has the same encoding as vex.length == 128 and they can share
9565
   the same processing with vex.length in OP_VEX.  */
9566
103k
      if (ins->modrm.mod == 3 && ins->vex.b && ins->evex_type != evex_from_legacy)
9567
8.81k
  ins->vex.length = 512;
9568
94.9k
      else
9569
94.9k
  {
9570
94.9k
    switch (ins->vex.ll)
9571
94.9k
      {
9572
37.5k
      case 0x0:
9573
37.5k
        ins->vex.length = 128;
9574
37.5k
        break;
9575
21.8k
      case 0x1:
9576
21.8k
        ins->vex.length = 256;
9577
21.8k
        break;
9578
26.2k
      case 0x2:
9579
26.2k
        ins->vex.length = 512;
9580
26.2k
        break;
9581
9.26k
      default:
9582
9.26k
        return &bad_opcode;
9583
94.9k
      }
9584
94.9k
  }
9585
94.4k
      break;
9586
9587
461k
    case 0:
9588
461k
      dp = &bad_opcode;
9589
461k
      break;
9590
9591
0
    default:
9592
0
      abort ();
9593
1.91M
    }
9594
9595
1.84M
  if (dp->name != NULL)
9596
994k
    return dp;
9597
851k
  else
9598
851k
    return get_valid_dis386 (dp, ins);
9599
1.84M
}
9600
9601
static bool
9602
get_sib (instr_info *ins, int sizeflag)
9603
3.54M
{
9604
  /* If modrm.mod == 3, operand must be register.  */
9605
3.54M
  if (ins->need_modrm
9606
2.12M
      && ((sizeflag & AFLAG) || ins->address_mode == mode_64bit)
9607
1.94M
      && ins->modrm.mod != 3
9608
1.39M
      && ins->modrm.rm == 4)
9609
101k
    {
9610
101k
      if (!fetch_code (ins->info, ins->codep + 2))
9611
1.80k
  return false;
9612
99.9k
      ins->sib.index = (ins->codep[1] >> 3) & 7;
9613
99.9k
      ins->sib.scale = (ins->codep[1] >> 6) & 3;
9614
99.9k
      ins->sib.base = ins->codep[1] & 7;
9615
99.9k
      ins->has_sib = true;
9616
99.9k
    }
9617
3.44M
  else
9618
3.44M
    ins->has_sib = false;
9619
9620
3.54M
  return true;
9621
3.54M
}
9622
9623
/* Like oappend_with_style (below) but always with text style.  */
9624
9625
static void
9626
oappend (instr_info *ins, const char *s)
9627
1.46M
{
9628
1.46M
  oappend_with_style (ins, s, dis_style_text);
9629
1.46M
}
9630
9631
/* Like oappend (above), but S is a string starting with '%'.  In
9632
   Intel syntax, the '%' is elided.  */
9633
9634
static void
9635
oappend_register (instr_info *ins, const char *s)
9636
4.24M
{
9637
4.24M
  oappend_with_style (ins, s + ins->intel_syntax, dis_style_register);
9638
4.24M
}
9639
9640
/* Wrap around a call to INS->info->fprintf_styled_func, printing FMT.
9641
   STYLE is the default style to use in the fprintf_styled_func calls,
9642
   however, FMT might include embedded style markers (see oappend_style),
9643
   these embedded markers are not printed, but instead change the style
9644
   used in the next fprintf_styled_func call.  */
9645
9646
static void ATTRIBUTE_PRINTF_3
9647
i386_dis_printf (const disassemble_info *info, enum disassembler_style style,
9648
     const char *fmt, ...)
9649
10.5M
{
9650
10.5M
  va_list ap;
9651
10.5M
  enum disassembler_style curr_style = style;
9652
10.5M
  const char *start, *curr;
9653
10.5M
  char staging_area[50];
9654
9655
10.5M
  va_start (ap, fmt);
9656
  /* In particular print_insn()'s processing of op_txt[] can hand rather long
9657
     strings here.  Bypass vsnprintf() in such cases to avoid capacity issues
9658
     with the staging area.  */
9659
10.5M
  if (strcmp (fmt, "%s"))
9660
6.08M
    {
9661
6.08M
      int res = vsnprintf (staging_area, sizeof (staging_area), fmt, ap);
9662
9663
6.08M
      va_end (ap);
9664
9665
6.08M
      if (res < 0)
9666
0
  return;
9667
9668
6.08M
      if ((size_t) res >= sizeof (staging_area))
9669
0
  abort ();
9670
9671
6.08M
      start = curr = staging_area;
9672
6.08M
    }
9673
4.48M
  else
9674
4.48M
    {
9675
4.48M
      start = curr = va_arg (ap, const char *);
9676
4.48M
      va_end (ap);
9677
4.48M
    }
9678
9679
10.5M
  do
9680
74.0M
    {
9681
74.0M
      if (*curr == '\0'
9682
63.4M
    || (*curr == STYLE_MARKER_CHAR
9683
63.4M
        && ISXDIGIT (*(curr + 1))
9684
9.49M
        && *(curr + 2) == STYLE_MARKER_CHAR))
9685
20.0M
  {
9686
    /* Output content between our START position and CURR.  */
9687
20.0M
    int len = curr - start;
9688
20.0M
    int n = (*info->fprintf_styled_func) (info->stream, curr_style,
9689
20.0M
            "%.*s", len, start);
9690
20.0M
    if (n < 0)
9691
0
      break;
9692
9693
20.0M
    if (*curr == '\0')
9694
10.5M
      break;
9695
9696
    /* Skip over the initial STYLE_MARKER_CHAR.  */
9697
9.49M
    ++curr;
9698
9699
    /* Update the CURR_STYLE.  As there are less than 16 styles, it
9700
       is possible, that if the input is corrupted in some way, that
9701
       we might set CURR_STYLE to an invalid value.  Don't worry
9702
       though, we check for this situation.  */
9703
9.49M
    if (*curr >= '0' && *curr <= '9')
9704
9.49M
      curr_style = (enum disassembler_style) (*curr - '0');
9705
0
    else if (*curr >= 'a' && *curr <= 'f')
9706
0
      curr_style = (enum disassembler_style) (*curr - 'a' + 10);
9707
0
    else
9708
0
      curr_style = dis_style_text;
9709
9710
    /* Check for an invalid style having been selected.  This should
9711
       never happen, but it doesn't hurt to be a little paranoid.  */
9712
9.49M
    if (curr_style > dis_style_comment_start)
9713
0
      curr_style = dis_style_text;
9714
9715
    /* Skip the hex character, and the closing STYLE_MARKER_CHAR.  */
9716
9.49M
    curr += 2;
9717
9718
    /* Reset the START to after the style marker.  */
9719
9.49M
    start = curr;
9720
9.49M
  }
9721
53.9M
      else
9722
53.9M
  ++curr;
9723
74.0M
    }
9724
10.5M
  while (true);
9725
10.5M
}
9726
9727
static int
9728
print_insn (bfd_vma pc, disassemble_info *info, int intel_syntax)
9729
3.66M
{
9730
3.66M
  const struct dis386 *dp;
9731
3.66M
  int i;
9732
3.66M
  int ret;
9733
3.66M
  char *op_txt[MAX_OPERANDS];
9734
3.66M
  int needcomma;
9735
3.66M
  bool intel_swap_2_3;
9736
3.66M
  int sizeflag, orig_sizeflag;
9737
3.66M
  const char *p;
9738
3.66M
  struct dis_private priv;
9739
3.66M
  int prefix_length;
9740
3.66M
  int op_count;
9741
3.66M
  instr_info ins = {
9742
3.66M
    .info = info,
9743
3.66M
    .intel_syntax = intel_syntax >= 0
9744
3.66M
        ? intel_syntax
9745
3.66M
        : (info->mach & bfd_mach_i386_intel_syntax) != 0,
9746
3.66M
    .intel_mnemonic = !SYSV386_COMPAT,
9747
3.66M
    .op_index[0 ... MAX_OPERANDS - 1] = -1,
9748
3.66M
    .start_pc = pc,
9749
3.66M
    .start_codep = priv.the_buffer,
9750
3.66M
    .codep = priv.the_buffer,
9751
3.66M
    .obufp = ins.obuf,
9752
3.66M
    .cbufp = ins.cbuf,
9753
3.66M
    .last_lock_prefix = -1,
9754
3.66M
    .last_repz_prefix = -1,
9755
3.66M
    .last_repnz_prefix = -1,
9756
3.66M
    .last_data_prefix = -1,
9757
3.66M
    .last_addr_prefix = -1,
9758
3.66M
    .last_rex_prefix = -1,
9759
3.66M
    .last_rex2_prefix = -1,
9760
3.66M
    .last_seg_prefix = -1,
9761
3.66M
    .fwait_prefix = -1,
9762
3.66M
  };
9763
3.66M
  char op_out[MAX_OPERANDS][MAX_OPERAND_BUFFER_SIZE];
9764
9765
3.66M
  priv.orig_sizeflag = AFLAG | DFLAG;
9766
3.66M
  if ((info->mach & bfd_mach_i386_i386) != 0)
9767
428k
    ins.address_mode = mode_32bit;
9768
3.23M
  else if (info->mach == bfd_mach_i386_i8086)
9769
288k
    {
9770
288k
      ins.address_mode = mode_16bit;
9771
288k
      priv.orig_sizeflag = 0;
9772
288k
    }
9773
2.94M
  else
9774
2.94M
    ins.address_mode = mode_64bit;
9775
9776
4.36M
  for (p = info->disassembler_options; p != NULL;)
9777
698k
    {
9778
698k
      if (startswith (p, "amd64"))
9779
1.30k
  ins.isa64 = amd64;
9780
697k
      else if (startswith (p, "intel64"))
9781
16.2k
  ins.isa64 = intel64;
9782
681k
      else if (startswith (p, "x86-64"))
9783
1.37k
  {
9784
1.37k
    ins.address_mode = mode_64bit;
9785
1.37k
    priv.orig_sizeflag |= AFLAG | DFLAG;
9786
1.37k
  }
9787
679k
      else if (startswith (p, "i386"))
9788
2.65k
  {
9789
2.65k
    ins.address_mode = mode_32bit;
9790
2.65k
    priv.orig_sizeflag |= AFLAG | DFLAG;
9791
2.65k
  }
9792
677k
      else if (startswith (p, "i8086"))
9793
10.7k
  {
9794
10.7k
    ins.address_mode = mode_16bit;
9795
10.7k
    priv.orig_sizeflag &= ~(AFLAG | DFLAG);
9796
10.7k
  }
9797
666k
      else if (startswith (p, "intel"))
9798
64.8k
  {
9799
64.8k
    if (startswith (p + 5, "-mnemonic"))
9800
246
      ins.intel_mnemonic = true;
9801
64.5k
    else
9802
64.5k
      ins.intel_syntax = 1;
9803
64.8k
  }
9804
601k
      else if (startswith (p, "att"))
9805
5.11k
  {
9806
5.11k
    ins.intel_syntax = 0;
9807
5.11k
    if (startswith (p + 3, "-mnemonic"))
9808
268
      ins.intel_mnemonic = false;
9809
5.11k
  }
9810
596k
      else if (startswith (p, "addr"))
9811
12.6k
  {
9812
12.6k
    if (ins.address_mode == mode_64bit)
9813
6.41k
      {
9814
6.41k
        if (p[4] == '3' && p[5] == '2')
9815
2.98k
    priv.orig_sizeflag &= ~AFLAG;
9816
3.43k
        else if (p[4] == '6' && p[5] == '4')
9817
268
    priv.orig_sizeflag |= AFLAG;
9818
6.41k
      }
9819
6.22k
    else
9820
6.22k
      {
9821
6.22k
        if (p[4] == '1' && p[5] == '6')
9822
806
    priv.orig_sizeflag &= ~AFLAG;
9823
5.41k
        else if (p[4] == '3' && p[5] == '2')
9824
1.89k
    priv.orig_sizeflag |= AFLAG;
9825
6.22k
      }
9826
12.6k
  }
9827
584k
      else if (startswith (p, "data"))
9828
14.6k
  {
9829
14.6k
    if (p[4] == '1' && p[5] == '6')
9830
7.02k
      priv.orig_sizeflag &= ~DFLAG;
9831
7.58k
    else if (p[4] == '3' && p[5] == '2')
9832
492
      priv.orig_sizeflag |= DFLAG;
9833
14.6k
  }
9834
569k
      else if (startswith (p, "suffix"))
9835
65.4k
  priv.orig_sizeflag |= SUFFIX_ALWAYS;
9836
9837
504k
      else if (startswith (p, "annotate"))
9838
328
  annotate_immediates = true;
9839
9840
698k
      p = strchr (p, ',');
9841
698k
      if (p != NULL)
9842
217k
  p++;
9843
698k
    }
9844
9845
3.66M
  if (ins.address_mode == mode_64bit && sizeof (bfd_vma) < 8)
9846
0
    {
9847
0
      i386_dis_printf (info, dis_style_text, _("64-bit address is disabled"));
9848
0
      return -1;
9849
0
    }
9850
9851
3.66M
  if (ins.intel_syntax)
9852
972k
    {
9853
972k
      ins.open_char = '[';
9854
972k
      ins.close_char = ']';
9855
972k
      ins.separator_char = '+';
9856
972k
      ins.scale_char = '*';
9857
972k
    }
9858
2.69M
  else
9859
2.69M
    {
9860
2.69M
      ins.open_char = '(';
9861
2.69M
      ins.close_char =  ')';
9862
2.69M
      ins.separator_char = ',';
9863
2.69M
      ins.scale_char = ',';
9864
2.69M
    }
9865
9866
  /* The output looks better if we put 7 bytes on a line, since that
9867
     puts most long word instructions on a single line.  */
9868
3.66M
  info->bytes_per_line = 7;
9869
9870
3.66M
  info->private_data = &priv;
9871
3.66M
  priv.fetched = 0;
9872
3.66M
  priv.insn_start = pc;
9873
9874
21.9M
  for (i = 0; i < MAX_OPERANDS; ++i)
9875
18.3M
    {
9876
18.3M
      op_out[i][0] = 0;
9877
18.3M
      ins.op_out[i] = op_out[i];
9878
18.3M
    }
9879
9880
3.66M
  sizeflag = priv.orig_sizeflag;
9881
9882
3.66M
  switch (ckprefix (&ins))
9883
3.66M
    {
9884
3.56M
    case ckp_okay:
9885
3.56M
      break;
9886
9887
96.1k
    case ckp_bogus:
9888
      /* Too many prefixes or unused REX prefixes.  */
9889
96.1k
      for (i = 0;
9890
231k
     i < (int) ARRAY_SIZE (ins.all_prefixes) && ins.all_prefixes[i];
9891
135k
     i++)
9892
135k
  i386_dis_printf (info, dis_style_mnemonic, "%s%s",
9893
135k
       (i == 0 ? "" : " "),
9894
135k
       prefix_name (ins.address_mode, ins.all_prefixes[i],
9895
135k
              sizeflag));
9896
96.1k
      ret = i;
9897
96.1k
      goto out;
9898
9899
3.59k
    case ckp_fetch_error:
9900
3.59k
      goto fetch_error_out;
9901
3.66M
    }
9902
9903
3.56M
  ins.nr_prefixes = ins.codep - ins.start_codep;
9904
9905
3.56M
  if (!fetch_code (info, ins.codep + 1))
9906
293
    {
9907
49.7k
    fetch_error_out:
9908
49.7k
      ret = fetch_error (&ins);
9909
49.7k
      goto out;
9910
293
    }
9911
9912
3.56M
  ins.two_source_ops = (*ins.codep == 0x62 || *ins.codep == 0xc8);
9913
9914
3.56M
  if ((ins.prefixes & PREFIX_FWAIT)
9915
14.2k
      && (*ins.codep < 0xd8 || *ins.codep > 0xdf))
9916
13.1k
    {
9917
      /* Handle ins.prefixes before fwait.  */
9918
14.9k
      for (i = 0; i < ins.fwait_prefix && ins.all_prefixes[i];
9919
13.1k
     i++)
9920
1.85k
  i386_dis_printf (info, dis_style_mnemonic, "%s ",
9921
1.85k
       prefix_name (ins.address_mode, ins.all_prefixes[i],
9922
1.85k
              sizeflag));
9923
13.1k
      i386_dis_printf (info, dis_style_mnemonic, "fwait");
9924
13.1k
      ret = i + 1;
9925
13.1k
      goto out;
9926
13.1k
    }
9927
9928
  /* REX2.M in rex2 prefix represents map0 or map1.  */
9929
3.55M
  if (ins.last_rex2_prefix < 0 ? *ins.codep == 0x0f : (ins.rex2 & REX2_M))
9930
110k
    {
9931
110k
      if (!ins.rex2)
9932
93.0k
  {
9933
93.0k
    ins.codep++;
9934
93.0k
    if (!fetch_code (info, ins.codep + 1))
9935
175
      goto fetch_error_out;
9936
93.0k
  }
9937
9938
110k
      dp = &dis386_twobyte[*ins.codep];
9939
110k
      ins.need_modrm = twobyte_has_modrm[*ins.codep];
9940
110k
    }
9941
3.44M
  else
9942
3.44M
    {
9943
3.44M
      dp = &dis386[*ins.codep];
9944
3.44M
      ins.need_modrm = onebyte_has_modrm[*ins.codep];
9945
3.44M
    }
9946
3.55M
  ins.condition_code = *ins.codep & 0xf;
9947
3.55M
  ins.codep++;
9948
9949
  /* Save sizeflag for printing the extra ins.prefixes later before updating
9950
     it for mnemonic and operand processing.  The prefix names depend
9951
     only on the address mode.  */
9952
3.55M
  orig_sizeflag = sizeflag;
9953
3.55M
  if (ins.prefixes & PREFIX_ADDR)
9954
38.2k
    sizeflag ^= AFLAG;
9955
3.55M
  if ((ins.prefixes & PREFIX_DATA))
9956
46.6k
    sizeflag ^= DFLAG;
9957
9958
3.55M
  ins.end_codep = ins.codep;
9959
3.55M
  if (ins.need_modrm && !fetch_modrm (&ins))
9960
3.92k
    goto fetch_error_out;
9961
9962
3.54M
  if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
9963
40.3k
    {
9964
40.3k
      if (!get_sib (&ins, sizeflag)
9965
40.1k
    || !dofloat (&ins, sizeflag))
9966
989
  goto fetch_error_out;
9967
40.3k
    }
9968
3.50M
  else
9969
3.50M
    {
9970
3.50M
      dp = get_valid_dis386 (dp, &ins);
9971
3.50M
      if (dp == &err_opcode)
9972
4.72k
  goto fetch_error_out;
9973
9974
      /* For APX instructions promoted from legacy maps 0/1, embedded prefix
9975
   is interpreted as the operand size override.  */
9976
3.50M
      if (ins.evex_type == evex_from_legacy
9977
22.8k
    && ins.vex.prefix == DATA_PREFIX_OPCODE)
9978
3.91k
  sizeflag ^= DFLAG;
9979
9980
3.50M
      if(ins.evex_type == evex_default)
9981
3.47M
  ins.vex.nf = false;
9982
30.5k
      else
9983
  /* For EVEX-promoted formats, we need to clear EVEX.NF (ccmp and ctest
9984
     are cleared separately.) in mask_register_specifier and keep the low
9985
     2 bits of mask_register_specifier to report errors for invalid cases
9986
     .  */
9987
30.5k
  ins.vex.mask_register_specifier &= 0x3;
9988
9989
3.50M
      if (dp != NULL && putop (&ins, dp->name, sizeflag) == 0)
9990
3.50M
  {
9991
3.50M
    if (!get_sib (&ins, sizeflag))
9992
1.63k
      goto fetch_error_out;
9993
20.8M
    for (i = 0; i < MAX_OPERANDS; ++i)
9994
17.4M
      {
9995
17.4M
        ins.obufp = ins.op_out[i];
9996
17.4M
        ins.op_ad = MAX_OPERANDS - 1 - i;
9997
17.4M
        if (dp->op[i].rtn
9998
5.33M
      && !dp->op[i].rtn (&ins, dp->op[i].bytemode, sizeflag))
9999
34.3k
    goto fetch_error_out;
10000
        /* For EVEX instruction after the last operand masking
10001
     should be printed.  */
10002
17.3M
        if (i == 0 && ins.vex.evex)
10003
113k
    {
10004
      /* Don't print {%k0}.  */
10005
113k
      if (ins.vex.mask_register_specifier)
10006
70.1k
        {
10007
70.1k
          const char *reg_name
10008
70.1k
      = att_names_mask[ins.vex.mask_register_specifier];
10009
10010
70.1k
          oappend (&ins, "{");
10011
70.1k
          oappend_register (&ins, reg_name);
10012
70.1k
          oappend (&ins, "}");
10013
10014
70.1k
          if (ins.vex.zeroing)
10015
25.8k
      oappend (&ins, "{z}");
10016
70.1k
        }
10017
43.2k
      else if (ins.vex.zeroing)
10018
8.75k
        {
10019
8.75k
          oappend (&ins, "{bad}");
10020
8.75k
          continue;
10021
8.75k
        }
10022
10023
      /* Instructions with a mask register destination allow for
10024
         zeroing-masking only (if any masking at all), which is
10025
         _not_ expressed by EVEX.z.  */
10026
104k
      if (ins.vex.zeroing && dp->op[0].bytemode == mask_mode)
10027
3.20k
        ins.illegal_masking = true;
10028
10029
      /* S/G insns require a mask and don't allow
10030
         zeroing-masking.  */
10031
104k
      if ((dp->op[0].bytemode == vex_vsib_d_w_dq_mode
10032
102k
           || dp->op[0].bytemode == vex_vsib_q_w_dq_mode)
10033
4.66k
          && (ins.vex.mask_register_specifier == 0
10034
3.80k
        || ins.vex.zeroing))
10035
2.47k
        ins.illegal_masking = true;
10036
10037
104k
      if (ins.illegal_masking)
10038
13.2k
        oappend (&ins, "/(bad)");
10039
104k
    }
10040
17.3M
      }
10041
    /* vex.nf is cleared after being consumed.  */
10042
3.46M
    if (ins.vex.nf)
10043
7.97k
      oappend (&ins, "{bad-nf}");
10044
10045
    /* Check whether rounding control was enabled for an insn not
10046
       supporting it, when evex.b is not treated as evex.nd.  */
10047
3.46M
    if (ins.modrm.mod == 3 && ins.vex.b && ins.evex_type == evex_default
10048
10.1k
        && !(ins.evex_used & EVEX_b_used))
10049
6.49k
      {
10050
17.7k
        for (i = 0; i < MAX_OPERANDS; ++i)
10051
17.7k
    {
10052
17.7k
      ins.obufp = ins.op_out[i];
10053
17.7k
      if (*ins.obufp)
10054
11.2k
        continue;
10055
6.49k
      oappend (&ins, names_rounding[ins.vex.ll]);
10056
6.49k
      oappend (&ins, "bad}");
10057
6.49k
      break;
10058
17.7k
    }
10059
6.49k
      }
10060
3.46M
  }
10061
3.50M
    }
10062
10063
  /* Clear instruction information.  */
10064
3.50M
  info->insn_info_valid = 0;
10065
3.50M
  info->branch_delay_insns = 0;
10066
3.50M
  info->data_size = 0;
10067
3.50M
  info->insn_type = dis_noninsn;
10068
3.50M
  info->target = 0;
10069
3.50M
  info->target2 = 0;
10070
10071
  /* Reset jump operation indicator.  */
10072
3.50M
  ins.op_is_jump = false;
10073
3.50M
  {
10074
3.50M
    int jump_detection = 0;
10075
10076
    /* Extract flags.  */
10077
21.0M
    for (i = 0; i < MAX_OPERANDS; ++i)
10078
17.5M
      {
10079
17.5M
  if ((dp->op[i].rtn == OP_J)
10080
17.3M
      || (dp->op[i].rtn == OP_indirE))
10081
270k
    jump_detection |= 1;
10082
17.2M
  else if ((dp->op[i].rtn == BND_Fixup)
10083
17.0M
     || (!dp->op[i].rtn && !dp->op[i].bytemode))
10084
12.2M
    jump_detection |= 2;
10085
4.97M
  else if ((dp->op[i].bytemode == cond_jump_mode)
10086
4.81M
     || (dp->op[i].bytemode == loop_jcxz_mode))
10087
191k
    jump_detection |= 4;
10088
17.5M
      }
10089
10090
    /* Determine if this is a jump or branch.  */
10091
3.50M
    if ((jump_detection & 0x3) == 0x3)
10092
270k
      {
10093
270k
  ins.op_is_jump = true;
10094
270k
  if (jump_detection & 0x4)
10095
191k
    info->insn_type = dis_condbranch;
10096
78.6k
  else
10097
78.6k
    info->insn_type = (dp->name && !strncmp (dp->name, "call", 4))
10098
78.6k
      ? dis_jsr : dis_branch;
10099
270k
      }
10100
3.50M
  }
10101
  /* The purpose of placing the check here is to wait for the EVEX prefix for
10102
     conditional CMP and TEST to be consumed and cleared, and then make a
10103
     unified judgment. Because they are both in map4, we can not distinguish
10104
     EVEX prefix for conditional CMP and TEST from others during the
10105
     EVEX prefix stage of parsing.  */
10106
3.50M
  if (ins.evex_type == evex_from_legacy)
10107
19.5k
    {
10108
      /* EVEX from legacy instructions, when the EVEX.ND bit is 0,
10109
   all bits of EVEX.vvvv and EVEX.V' must be 1.  */
10110
19.5k
      if (!ins.vex.nd && (ins.vex.register_specifier || !ins.vex.v))
10111
6.70k
  {
10112
6.70k
    i386_dis_printf (info, dis_style_text, "(bad)");
10113
6.70k
    ret = ins.end_codep - priv.the_buffer;
10114
6.70k
    goto out;
10115
6.70k
  }
10116
10117
      /* EVEX from legacy instructions require that EVEX.z, EVEX.L’L and the
10118
   lower 2 bits of EVEX.aaa must be 0.  */
10119
12.8k
      if ((ins.vex.mask_register_specifier & 0x3) != 0
10120
8.91k
    || ins.vex.ll != 0 || ins.vex.zeroing != 0)
10121
8.63k
  {
10122
8.63k
    i386_dis_printf (info, dis_style_text, "(bad)");
10123
8.63k
    ret = ins.end_codep - priv.the_buffer;
10124
8.63k
    goto out;
10125
8.63k
  }
10126
12.8k
    }
10127
  /* If VEX.vvvv and EVEX.vvvv are unused, they must be all 1s, which
10128
     are all 0s in inverted form.  */
10129
3.49M
  if (ins.need_vex && ins.vex.register_specifier != 0)
10130
71.6k
    {
10131
71.6k
      i386_dis_printf (info, dis_style_text, "(bad)");
10132
71.6k
      ret = ins.end_codep - priv.the_buffer;
10133
71.6k
      goto out;
10134
71.6k
    }
10135
10136
3.42M
  if ((dp->prefix_requirement & PREFIX_REX2_ILLEGAL)
10137
415k
      && ins.last_rex2_prefix >= 0 && (ins.rex2 & REX2_SPECIAL) == 0)
10138
2.70k
    {
10139
2.70k
      i386_dis_printf (info, dis_style_text, "(bad)");
10140
2.70k
      ret = ins.end_codep - priv.the_buffer;
10141
2.70k
      goto out;
10142
2.70k
    }
10143
10144
3.41M
  switch (dp->prefix_requirement & ~PREFIX_REX2_ILLEGAL)
10145
3.41M
    {
10146
32.0k
    case PREFIX_DATA:
10147
      /* If only the data prefix is marked as mandatory, its absence renders
10148
   the encoding invalid.  Most other PREFIX_OPCODE rules still apply.  */
10149
32.0k
      if (ins.need_vex ? !ins.vex.prefix : !(ins.prefixes & PREFIX_DATA))
10150
12.9k
  {
10151
12.9k
    i386_dis_printf (info, dis_style_text, "(bad)");
10152
12.9k
    ret = ins.end_codep - priv.the_buffer;
10153
12.9k
    goto out;
10154
12.9k
  }
10155
19.0k
      ins.used_prefixes |= PREFIX_DATA;
10156
      /* Fall through.  */
10157
41.9k
    case PREFIX_OPCODE:
10158
      /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
10159
   unused, opcode is invalid.  Since the PREFIX_DATA prefix may be
10160
   used by putop and MMX/SSE operand and may be overridden by the
10161
   PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
10162
   separately.  */
10163
41.9k
      if (((ins.need_vex
10164
41.9k
      ? ins.vex.prefix == REPE_PREFIX_OPCODE
10165
14.4k
        || ins.vex.prefix == REPNE_PREFIX_OPCODE
10166
41.9k
      : (ins.prefixes
10167
22.8k
         & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
10168
12.5k
     && (ins.used_prefixes
10169
12.5k
         & (PREFIX_REPZ | PREFIX_REPNZ)) == 0)
10170
30.3k
    || (((ins.need_vex
10171
30.3k
    ? ins.vex.prefix == DATA_PREFIX_OPCODE
10172
30.3k
    : ((ins.prefixes
10173
21.5k
        & (PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA))
10174
21.5k
       == PREFIX_DATA))
10175
11.5k
         && (ins.used_prefixes & PREFIX_DATA) == 0))
10176
30.0k
    || (ins.vex.evex && dp->prefix_requirement != PREFIX_DATA
10177
547
        && !ins.vex.w != !(ins.used_prefixes & PREFIX_DATA)))
10178
12.1k
  {
10179
12.1k
    i386_dis_printf (info, dis_style_text, "(bad)");
10180
12.1k
    ret = ins.end_codep - priv.the_buffer;
10181
12.1k
    goto out;
10182
12.1k
  }
10183
29.7k
      break;
10184
10185
29.7k
    case PREFIX_IGNORED:
10186
      /* Zap data size and rep prefixes from used_prefixes and reinstate their
10187
   origins in all_prefixes.  */
10188
2.21k
      ins.used_prefixes &= ~PREFIX_OPCODE;
10189
2.21k
      if (ins.last_data_prefix >= 0)
10190
637
  ins.all_prefixes[ins.last_data_prefix] = 0x66;
10191
2.21k
      if (ins.last_repz_prefix >= 0)
10192
1.12k
  ins.all_prefixes[ins.last_repz_prefix] = 0xf3;
10193
2.21k
      if (ins.last_repnz_prefix >= 0)
10194
1.24k
  ins.all_prefixes[ins.last_repnz_prefix] = 0xf2;
10195
2.21k
      break;
10196
10197
26.0k
    case PREFIX_NP_OR_DATA:
10198
26.0k
      if (ins.vex.prefix == REPE_PREFIX_OPCODE
10199
25.6k
    || ins.vex.prefix == REPNE_PREFIX_OPCODE)
10200
840
  {
10201
840
    i386_dis_printf (info, dis_style_text, "(bad)");
10202
840
    ret = ins.end_codep - priv.the_buffer;
10203
840
    goto out;
10204
840
  }
10205
25.2k
      break;
10206
10207
25.2k
    case NO_PREFIX:
10208
18.5k
      if (ins.vex.prefix)
10209
450
  {
10210
450
    i386_dis_printf (info, dis_style_text, "(bad)");
10211
450
    ret = ins.end_codep - priv.the_buffer;
10212
450
    goto out;
10213
450
  }
10214
18.1k
      break;
10215
3.41M
    }
10216
10217
  /* Check if the REX prefix is used.  */
10218
3.39M
  if ((ins.rex ^ ins.rex_used) == 0
10219
3.00M
      && !ins.need_vex && ins.last_rex_prefix >= 0)
10220
57.2k
    ins.all_prefixes[ins.last_rex_prefix] = 0;
10221
10222
  /* Check if the REX2 prefix is used.  */
10223
3.39M
  if (ins.last_rex2_prefix >= 0
10224
20.2k
      && ((ins.rex2 & REX2_SPECIAL)
10225
19.3k
    || (((ins.rex2 & 7) ^ (ins.rex2_used & 7)) == 0
10226
4.45k
        && (ins.rex ^ ins.rex_used) == 0
10227
2.57k
        && (ins.rex2 & 7))))
10228
3.16k
    ins.all_prefixes[ins.last_rex2_prefix] = 0;
10229
10230
  /* Check if the SEG prefix is used.  */
10231
3.39M
  if ((ins.prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
10232
3.39M
           | PREFIX_FS | PREFIX_GS)) != 0
10233
97.9k
      && (ins.used_prefixes & ins.active_seg_prefix) != 0)
10234
32.4k
    ins.all_prefixes[ins.last_seg_prefix] = 0;
10235
10236
  /* Check if the ADDR prefix is used.  */
10237
3.39M
  if ((ins.prefixes & PREFIX_ADDR) != 0
10238
32.8k
      && (ins.used_prefixes & PREFIX_ADDR) != 0)
10239
18.5k
    ins.all_prefixes[ins.last_addr_prefix] = 0;
10240
10241
  /* Check if the DATA prefix is used.  */
10242
3.39M
  if ((ins.prefixes & PREFIX_DATA) != 0
10243
40.0k
      && (ins.used_prefixes & PREFIX_DATA) != 0
10244
27.3k
      && !ins.need_vex)
10245
26.7k
    ins.all_prefixes[ins.last_data_prefix] = 0;
10246
10247
  /* Print the extra ins.prefixes.  */
10248
3.39M
  prefix_length = 0;
10249
50.8M
  for (i = 0; i < (int) ARRAY_SIZE (ins.all_prefixes); i++)
10250
47.4M
    if (ins.all_prefixes[i])
10251
308k
      {
10252
308k
  const char *name = prefix_name (ins.address_mode, ins.all_prefixes[i],
10253
308k
          orig_sizeflag);
10254
10255
308k
  if (name == NULL)
10256
0
    abort ();
10257
308k
  prefix_length += strlen (name) + 1;
10258
308k
  if (ins.all_prefixes[i] == REX2_OPCODE)
10259
17.1k
    i386_dis_printf (info, dis_style_mnemonic, "{%s 0x%x} ", name,
10260
17.1k
         (unsigned int) ins.rex2_payload);
10261
291k
  else
10262
291k
    i386_dis_printf (info, dis_style_mnemonic, "%s ", name);
10263
308k
      }
10264
10265
  /* Check maximum code length.  */
10266
3.39M
  if ((ins.codep - ins.start_codep) > MAX_CODE_LENGTH)
10267
1.27k
    {
10268
1.27k
      i386_dis_printf (info, dis_style_text, "(bad)");
10269
1.27k
      ret = MAX_CODE_LENGTH;
10270
1.27k
      goto out;
10271
1.27k
    }
10272
10273
  /* Calculate the number of operands this instruction has.  */
10274
3.38M
  op_count = 0;
10275
20.3M
  for (i = 0; i < MAX_OPERANDS; ++i)
10276
16.9M
    if (*ins.op_out[i] != '\0')
10277
4.68M
      ++op_count;
10278
10279
  /* Calculate the number of spaces to print after the mnemonic.  */
10280
3.38M
  ins.obufp = ins.mnemonicendp;
10281
3.38M
  if (op_count > 0)
10282
2.62M
    {
10283
2.62M
      i = strlen (ins.obuf) + prefix_length;
10284
2.62M
      if (i < 7)
10285
2.43M
  i = 7 - i;
10286
187k
      else
10287
187k
  i = 1;
10288
2.62M
    }
10289
769k
  else
10290
769k
    i = 0;
10291
10292
  /* Print the instruction mnemonic along with any trailing whitespace.  */
10293
3.38M
  i386_dis_printf (info, dis_style_mnemonic, "%s%*s", ins.obuf, i, "");
10294
10295
  /* The enter and bound instructions are printed with operands in the same
10296
     order as the intel book; everything else is printed in reverse order.  */
10297
3.38M
  intel_swap_2_3 = false;
10298
3.38M
  if (ins.intel_syntax || ins.two_source_ops)
10299
887k
    {
10300
5.32M
      for (i = 0; i < MAX_OPERANDS; ++i)
10301
4.43M
  op_txt[i] = ins.op_out[i];
10302
10303
887k
      if (ins.intel_syntax && dp && dp->op[2].rtn == OP_Rounding
10304
3.48k
          && dp->op[3].rtn == OP_E && dp->op[4].rtn == NULL)
10305
815
  {
10306
815
    op_txt[2] = ins.op_out[3];
10307
815
    op_txt[3] = ins.op_out[2];
10308
815
    intel_swap_2_3 = true;
10309
815
  }
10310
10311
2.66M
      for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
10312
1.77M
  {
10313
1.77M
    bool riprel;
10314
10315
1.77M
    ins.op_ad = ins.op_index[i];
10316
1.77M
    ins.op_index[i] = ins.op_index[MAX_OPERANDS - 1 - i];
10317
1.77M
    ins.op_index[MAX_OPERANDS - 1 - i] = ins.op_ad;
10318
1.77M
    riprel = ins.op_riprel[i];
10319
1.77M
    ins.op_riprel[i] = ins.op_riprel[MAX_OPERANDS - 1 - i];
10320
1.77M
    ins.op_riprel[MAX_OPERANDS - 1 - i] = riprel;
10321
1.77M
  }
10322
887k
    }
10323
2.50M
  else
10324
2.50M
    {
10325
15.0M
      for (i = 0; i < MAX_OPERANDS; ++i)
10326
12.5M
  op_txt[MAX_OPERANDS - 1 - i] = ins.op_out[i];
10327
2.50M
    }
10328
10329
3.38M
  needcomma = 0;
10330
20.3M
  for (i = 0; i < MAX_OPERANDS; ++i)
10331
16.9M
    if (*op_txt[i])
10332
4.68M
      {
10333
  /* In Intel syntax embedded rounding / SAE are not separate operands.
10334
     Instead they're attached to the prior register operand.  Simply
10335
     suppress emission of the comma to achieve that effect.  */
10336
4.68M
  switch (i & -(ins.intel_syntax && dp))
10337
4.68M
    {
10338
33.9k
    case 2:
10339
33.9k
      if (dp->op[2].rtn == OP_Rounding && !intel_swap_2_3)
10340
493
        needcomma = 0;
10341
33.9k
      break;
10342
3.06k
    case 3:
10343
3.06k
      if (dp->op[3].rtn == OP_Rounding || intel_swap_2_3)
10344
937
        needcomma = 0;
10345
3.06k
      break;
10346
4.68M
    }
10347
4.68M
  if (needcomma)
10348
2.05M
    i386_dis_printf (info, dis_style_text, ",");
10349
4.68M
  if (ins.op_index[i] != -1 && !ins.op_riprel[i])
10350
224k
    {
10351
224k
      bfd_vma target = (bfd_vma) ins.op_address[ins.op_index[i]];
10352
10353
224k
      if (ins.op_is_jump)
10354
224k
        {
10355
224k
    info->insn_info_valid = 1;
10356
224k
    info->branch_delay_insns = 0;
10357
224k
    info->data_size = 0;
10358
224k
    info->target = target;
10359
224k
    info->target2 = 0;
10360
224k
        }
10361
224k
      (*info->print_address_func) (target, info);
10362
224k
    }
10363
4.45M
  else
10364
4.45M
    i386_dis_printf (info, dis_style_text, "%s", op_txt[i]);
10365
4.68M
  needcomma = 1;
10366
4.68M
      }
10367
10368
20.2M
  for (i = 0; i < MAX_OPERANDS; i++)
10369
16.9M
    if (ins.op_index[i] != -1 && ins.op_riprel[i])
10370
26.9k
      {
10371
26.9k
  i386_dis_printf (info, dis_style_comment_start, "        # ");
10372
26.9k
  (*info->print_address_func)
10373
26.9k
    ((bfd_vma)(ins.start_pc + (ins.codep - ins.start_codep)
10374
26.9k
         + ins.op_address[ins.op_index[i]]),
10375
26.9k
    info);
10376
26.9k
  break;
10377
26.9k
      }
10378
3.38M
  if (ins.cbufp != ins.cbuf)
10379
0
    {
10380
0
      if (i == MAX_OPERANDS)
10381
0
  i386_dis_printf (info, dis_style_comment_start, "        # ");
10382
0
      i386_dis_printf (info, dis_style_comment_start, "%s", ins.cbuf);
10383
0
    }
10384
  
10385
3.38M
  ret = ins.codep - priv.the_buffer;
10386
3.66M
 out:
10387
3.66M
  info->private_data = NULL;
10388
3.66M
  return ret;
10389
3.38M
}
10390
10391
/* Here for backwards compatibility.  When gdb stops using
10392
   print_insn_i386_att and print_insn_i386_intel these functions can
10393
   disappear, and print_insn_i386 be merged into print_insn.  */
10394
int
10395
print_insn_i386_att (bfd_vma pc, disassemble_info *info)
10396
0
{
10397
0
  return print_insn (pc, info, 0);
10398
0
}
10399
10400
int
10401
print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
10402
0
{
10403
0
  return print_insn (pc, info, 1);
10404
0
}
10405
10406
int
10407
print_insn_i386 (bfd_vma pc, disassemble_info *info)
10408
3.66M
{
10409
3.66M
  return print_insn (pc, info, -1);
10410
3.66M
}
10411
10412
static const char *float_mem[] = {
10413
  /* d8 */
10414
  "fadd{s|}",
10415
  "fmul{s|}",
10416
  "fcom{s|}",
10417
  "fcomp{s|}",
10418
  "fsub{s|}",
10419
  "fsubr{s|}",
10420
  "fdiv{s|}",
10421
  "fdivr{s|}",
10422
  /* d9 */
10423
  "fld{s|}",
10424
  "(bad)",
10425
  "fst{s|}",
10426
  "fstp{s|}",
10427
  "fldenv{C|C}",
10428
  "fldcw",
10429
  "fNstenv{C|C}",
10430
  "fNstcw",
10431
  /* da */
10432
  "fiadd{l|}",
10433
  "fimul{l|}",
10434
  "ficom{l|}",
10435
  "ficomp{l|}",
10436
  "fisub{l|}",
10437
  "fisubr{l|}",
10438
  "fidiv{l|}",
10439
  "fidivr{l|}",
10440
  /* db */
10441
  "fild{l|}",
10442
  "fisttp{l|}",
10443
  "fist{l|}",
10444
  "fistp{l|}",
10445
  "(bad)",
10446
  "fld{t|}",
10447
  "(bad)",
10448
  "fstp{t|}",
10449
  /* dc */
10450
  "fadd{l|}",
10451
  "fmul{l|}",
10452
  "fcom{l|}",
10453
  "fcomp{l|}",
10454
  "fsub{l|}",
10455
  "fsubr{l|}",
10456
  "fdiv{l|}",
10457
  "fdivr{l|}",
10458
  /* dd */
10459
  "fld{l|}",
10460
  "fisttp{ll|}",
10461
  "fst{l||}",
10462
  "fstp{l|}",
10463
  "frstor{C|C}",
10464
  "(bad)",
10465
  "fNsave{C|C}",
10466
  "fNstsw",
10467
  /* de */
10468
  "fiadd{s|}",
10469
  "fimul{s|}",
10470
  "ficom{s|}",
10471
  "ficomp{s|}",
10472
  "fisub{s|}",
10473
  "fisubr{s|}",
10474
  "fidiv{s|}",
10475
  "fidivr{s|}",
10476
  /* df */
10477
  "fild{s|}",
10478
  "fisttp{s|}",
10479
  "fist{s|}",
10480
  "fistp{s|}",
10481
  "fbld",
10482
  "fild{ll|}",
10483
  "fbstp",
10484
  "fistp{ll|}",
10485
};
10486
10487
static const unsigned char float_mem_mode[] = {
10488
  /* d8 */
10489
  d_mode,
10490
  d_mode,
10491
  d_mode,
10492
  d_mode,
10493
  d_mode,
10494
  d_mode,
10495
  d_mode,
10496
  d_mode,
10497
  /* d9 */
10498
  d_mode,
10499
  0,
10500
  d_mode,
10501
  d_mode,
10502
  0,
10503
  w_mode,
10504
  0,
10505
  w_mode,
10506
  /* da */
10507
  d_mode,
10508
  d_mode,
10509
  d_mode,
10510
  d_mode,
10511
  d_mode,
10512
  d_mode,
10513
  d_mode,
10514
  d_mode,
10515
  /* db */
10516
  d_mode,
10517
  d_mode,
10518
  d_mode,
10519
  d_mode,
10520
  0,
10521
  t_mode,
10522
  0,
10523
  t_mode,
10524
  /* dc */
10525
  q_mode,
10526
  q_mode,
10527
  q_mode,
10528
  q_mode,
10529
  q_mode,
10530
  q_mode,
10531
  q_mode,
10532
  q_mode,
10533
  /* dd */
10534
  q_mode,
10535
  q_mode,
10536
  q_mode,
10537
  q_mode,
10538
  0,
10539
  0,
10540
  0,
10541
  w_mode,
10542
  /* de */
10543
  w_mode,
10544
  w_mode,
10545
  w_mode,
10546
  w_mode,
10547
  w_mode,
10548
  w_mode,
10549
  w_mode,
10550
  w_mode,
10551
  /* df */
10552
  w_mode,
10553
  w_mode,
10554
  w_mode,
10555
  w_mode,
10556
  t_mode,
10557
  q_mode,
10558
  t_mode,
10559
  q_mode
10560
};
10561
10562
#define ST { OP_ST, 0 }
10563
#define STi { OP_STi, 0 }
10564
10565
#define FGRPd9_2 NULL, { { NULL, 1 } }, 0
10566
#define FGRPd9_4 NULL, { { NULL, 2 } }, 0
10567
#define FGRPd9_5 NULL, { { NULL, 3 } }, 0
10568
#define FGRPd9_6 NULL, { { NULL, 4 } }, 0
10569
#define FGRPd9_7 NULL, { { NULL, 5 } }, 0
10570
#define FGRPda_5 NULL, { { NULL, 6 } }, 0
10571
#define FGRPdb_4 NULL, { { NULL, 7 } }, 0
10572
#define FGRPde_3 NULL, { { NULL, 8 } }, 0
10573
#define FGRPdf_4 NULL, { { NULL, 9 } }, 0
10574
10575
static const struct dis386 float_reg[][8] = {
10576
  /* d8 */
10577
  {
10578
    { "fadd", { ST, STi }, 0 },
10579
    { "fmul", { ST, STi }, 0 },
10580
    { "fcom", { STi }, 0 },
10581
    { "fcomp",  { STi }, 0 },
10582
    { "fsub", { ST, STi }, 0 },
10583
    { "fsubr",  { ST, STi }, 0 },
10584
    { "fdiv", { ST, STi }, 0 },
10585
    { "fdivr",  { ST, STi }, 0 },
10586
  },
10587
  /* d9 */
10588
  {
10589
    { "fld",  { STi }, 0 },
10590
    { "fxch", { STi }, 0 },
10591
    { FGRPd9_2 },
10592
    { Bad_Opcode },
10593
    { FGRPd9_4 },
10594
    { FGRPd9_5 },
10595
    { FGRPd9_6 },
10596
    { FGRPd9_7 },
10597
  },
10598
  /* da */
10599
  {
10600
    { "fcmovb", { ST, STi }, 0 },
10601
    { "fcmove", { ST, STi }, 0 },
10602
    { "fcmovbe",{ ST, STi }, 0 },
10603
    { "fcmovu", { ST, STi }, 0 },
10604
    { Bad_Opcode },
10605
    { FGRPda_5 },
10606
    { Bad_Opcode },
10607
    { Bad_Opcode },
10608
  },
10609
  /* db */
10610
  {
10611
    { "fcmovnb",{ ST, STi }, 0 },
10612
    { "fcmovne",{ ST, STi }, 0 },
10613
    { "fcmovnbe",{ ST, STi }, 0 },
10614
    { "fcmovnu",{ ST, STi }, 0 },
10615
    { FGRPdb_4 },
10616
    { "fucomi", { ST, STi }, 0 },
10617
    { "fcomi",  { ST, STi }, 0 },
10618
    { Bad_Opcode },
10619
  },
10620
  /* dc */
10621
  {
10622
    { "fadd", { STi, ST }, 0 },
10623
    { "fmul", { STi, ST }, 0 },
10624
    { Bad_Opcode },
10625
    { Bad_Opcode },
10626
    { "fsub{!M|r}", { STi, ST }, 0 },
10627
    { "fsub{M|}", { STi, ST }, 0 },
10628
    { "fdiv{!M|r}", { STi, ST }, 0 },
10629
    { "fdiv{M|}", { STi, ST }, 0 },
10630
  },
10631
  /* dd */
10632
  {
10633
    { "ffree",  { STi }, 0 },
10634
    { Bad_Opcode },
10635
    { "fst",  { STi }, 0 },
10636
    { "fstp", { STi }, 0 },
10637
    { "fucom",  { STi }, 0 },
10638
    { "fucomp", { STi }, 0 },
10639
    { Bad_Opcode },
10640
    { Bad_Opcode },
10641
  },
10642
  /* de */
10643
  {
10644
    { "faddp",  { STi, ST }, 0 },
10645
    { "fmulp",  { STi, ST }, 0 },
10646
    { Bad_Opcode },
10647
    { FGRPde_3 },
10648
    { "fsub{!M|r}p",  { STi, ST }, 0 },
10649
    { "fsub{M|}p",  { STi, ST }, 0 },
10650
    { "fdiv{!M|r}p",  { STi, ST }, 0 },
10651
    { "fdiv{M|}p",  { STi, ST }, 0 },
10652
  },
10653
  /* df */
10654
  {
10655
    { "ffreep", { STi }, 0 },
10656
    { Bad_Opcode },
10657
    { Bad_Opcode },
10658
    { Bad_Opcode },
10659
    { FGRPdf_4 },
10660
    { "fucomip", { ST, STi }, 0 },
10661
    { "fcomip", { ST, STi }, 0 },
10662
    { Bad_Opcode },
10663
  },
10664
};
10665
10666
static const char *const fgrps[][8] = {
10667
  /* Bad opcode 0 */
10668
  {
10669
    "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10670
  },
10671
10672
  /* d9_2  1 */
10673
  {
10674
    "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10675
  },
10676
10677
  /* d9_4  2 */
10678
  {
10679
    "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
10680
  },
10681
10682
  /* d9_5  3 */
10683
  {
10684
    "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
10685
  },
10686
10687
  /* d9_6  4 */
10688
  {
10689
    "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
10690
  },
10691
10692
  /* d9_7  5 */
10693
  {
10694
    "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
10695
  },
10696
10697
  /* da_5  6 */
10698
  {
10699
    "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10700
  },
10701
10702
  /* db_4  7 */
10703
  {
10704
    "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
10705
    "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
10706
  },
10707
10708
  /* de_3  8 */
10709
  {
10710
    "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10711
  },
10712
10713
  /* df_4  9 */
10714
  {
10715
    "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10716
  },
10717
};
10718
10719
static const char *const oszc_flags[16] = {
10720
  " {dfv=}", " {dfv=cf}", " {dfv=zf}", " {dfv=zf, cf}", " {dfv=sf}",
10721
  " {dfv=sf, cf}", " {dfv=sf, zf}", " {dfv=sf, zf, cf}", " {dfv=of}",
10722
  " {dfv=of, cf}", " {dfv=of, zf}", " {dfv=of, zf, cf}", " {dfv=of, sf}",
10723
  " {dfv=of, sf, cf}", " {dfv=of, sf, zf}", " {dfv=of, sf, zf, cf}"
10724
};
10725
10726
static const char *const scc_suffix[16] = {
10727
  "o", "no", "b", "ae", "e", "ne", "be", "a", "s", "ns", "t", "f",
10728
  "l", "ge", "le", "g"
10729
};
10730
10731
static void
10732
swap_operand (instr_info *ins)
10733
2.15k
{
10734
2.15k
  char *p = ins->mnemonicendp;
10735
10736
2.15k
  if (p[-1] == '}')
10737
404
    {
10738
5.00k
      while (*--p != '{')
10739
4.60k
  {
10740
4.60k
    if (p <= ins->obuf + 2)
10741
0
      abort ();
10742
4.60k
  }
10743
404
      if (p[-1] == ' ')
10744
208
  --p;
10745
404
    }
10746
2.15k
  memmove (p + 2, p, ins->mnemonicendp - p + 1);
10747
2.15k
  p[0] = '.';
10748
2.15k
  p[1] = 's';
10749
2.15k
  ins->mnemonicendp += 2;
10750
2.15k
}
10751
10752
static bool
10753
dofloat (instr_info *ins, int sizeflag)
10754
40.1k
{
10755
40.1k
  const struct dis386 *dp;
10756
40.1k
  unsigned char floatop = ins->codep[-1];
10757
10758
40.1k
  if (ins->modrm.mod != 3)
10759
18.9k
    {
10760
18.9k
      int fp_indx = (floatop - 0xd8) * 8 + ins->modrm.reg;
10761
10762
18.9k
      putop (ins, float_mem[fp_indx], sizeflag);
10763
18.9k
      ins->obufp = ins->op_out[0];
10764
18.9k
      ins->op_ad = 2;
10765
18.9k
      return OP_E (ins, float_mem_mode[fp_indx], sizeflag);
10766
18.9k
    }
10767
  /* Skip mod/rm byte.  */
10768
21.2k
  MODRM_CHECK;
10769
21.2k
  ins->codep++;
10770
10771
21.2k
  dp = &float_reg[floatop - 0xd8][ins->modrm.reg];
10772
21.2k
  if (dp->name == NULL)
10773
12.5k
    {
10774
12.5k
      putop (ins, fgrps[dp->op[0].bytemode][ins->modrm.rm], sizeflag);
10775
10776
      /* Instruction fnstsw is only one with strange arg.  */
10777
12.5k
      if (floatop == 0xdf && ins->codep[-1] == 0xe0)
10778
238
  strcpy (ins->op_out[0], att_names16[0] + ins->intel_syntax);
10779
12.5k
    }
10780
8.68k
  else
10781
8.68k
    {
10782
8.68k
      putop (ins, dp->name, sizeflag);
10783
10784
8.68k
      ins->obufp = ins->op_out[0];
10785
8.68k
      ins->op_ad = 2;
10786
8.68k
      if (dp->op[0].rtn
10787
8.68k
    && !dp->op[0].rtn (ins, dp->op[0].bytemode, sizeflag))
10788
0
  return false;
10789
10790
8.68k
      ins->obufp = ins->op_out[1];
10791
8.68k
      ins->op_ad = 1;
10792
8.68k
      if (dp->op[1].rtn
10793
5.40k
    && !dp->op[1].rtn (ins, dp->op[1].bytemode, sizeflag))
10794
0
  return false;
10795
8.68k
    }
10796
21.2k
  return true;
10797
21.2k
}
10798
10799
static bool
10800
OP_ST (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
10801
       int sizeflag ATTRIBUTE_UNUSED)
10802
5.40k
{
10803
5.40k
  oappend_register (ins, "%st");
10804
5.40k
  return true;
10805
5.40k
}
10806
10807
static bool
10808
OP_STi (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
10809
  int sizeflag ATTRIBUTE_UNUSED)
10810
8.68k
{
10811
8.68k
  char scratch[8];
10812
8.68k
  int res = snprintf (scratch, ARRAY_SIZE (scratch), "%%st(%d)", ins->modrm.rm);
10813
10814
8.68k
  if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
10815
0
    abort ();
10816
8.68k
  oappend_register (ins, scratch);
10817
8.68k
  return true;
10818
8.68k
}
10819
10820
/* Capital letters in template are macros.  */
10821
static int
10822
putop (instr_info *ins, const char *in_template, int sizeflag)
10823
3.54M
{
10824
3.54M
  const char *p;
10825
3.54M
  int alt = 0;
10826
3.54M
  int cond = 1;
10827
3.54M
  unsigned int l = 0, len = 0;
10828
3.54M
  char last[4];
10829
3.54M
  bool evex_printed = false;
10830
10831
  /* We don't want to add any prefix or suffix to (bad), so return early.  */
10832
3.54M
  if (!strncmp (in_template, "(bad)", 5))
10833
543k
    {
10834
543k
      oappend (ins, "(bad)");
10835
543k
      *ins->obufp = 0;
10836
543k
      ins->mnemonicendp = ins->obufp;
10837
543k
      return 0;
10838
543k
    }
10839
10840
17.3M
  for (p = in_template; *p; p++)
10841
14.3M
    {
10842
14.3M
      if (len > l)
10843
250k
  {
10844
250k
    if (l >= sizeof (last) || !ISUPPER (*p))
10845
0
      abort ();
10846
250k
    last[l++] = *p;
10847
250k
    continue;
10848
250k
  }
10849
14.0M
      switch (*p)
10850
14.0M
  {
10851
10.2M
  default:
10852
10.2M
    if (ins->evex_type == evex_from_legacy && !ins->vex.nd
10853
19.5k
        && !(ins->rex2 & 7) && !evex_printed)
10854
943
      {
10855
943
        oappend (ins, "{evex} ");
10856
943
        evex_printed = true;
10857
943
      }
10858
10.2M
    *ins->obufp++ = *p;
10859
10.2M
    break;
10860
250k
  case '%':
10861
250k
    len++;
10862
250k
    break;
10863
149k
  case '!':
10864
149k
    cond = 0;
10865
149k
    break;
10866
352k
  case '{':
10867
352k
    if (ins->intel_syntax)
10868
126k
      {
10869
251k
        while (*++p != '|')
10870
124k
    if (*p == '}' || *p == '\0')
10871
0
      abort ();
10872
126k
        alt = 1;
10873
126k
      }
10874
352k
    break;
10875
352k
  case '|':
10876
247k
    while (*++p != '}')
10877
22.1k
      {
10878
22.1k
        if (*p == '\0')
10879
0
    abort ();
10880
22.1k
      }
10881
225k
    break;
10882
225k
  case '}':
10883
126k
    alt = 0;
10884
126k
    break;
10885
42.8k
  case 'A':
10886
42.8k
    if (ins->intel_syntax)
10887
11.5k
      break;
10888
31.3k
    if ((ins->need_modrm && ins->modrm.mod != 3 && !ins->vex.nd)
10889
9.75k
        || (sizeflag & SUFFIX_ALWAYS))
10890
21.8k
      *ins->obufp++ = 'b';
10891
31.3k
    break;
10892
1.14M
  case 'B':
10893
1.14M
    if (l == 0)
10894
1.13M
      {
10895
1.14M
      case_B:
10896
1.14M
        if (ins->intel_syntax)
10897
242k
    break;
10898
904k
        if (sizeflag & SUFFIX_ALWAYS)
10899
6.40k
    *ins->obufp++ = 'b';
10900
904k
      }
10901
15.5k
    else if (l == 1 && last[0] == 'L')
10902
14.6k
      {
10903
14.6k
        if (ins->address_mode == mode_64bit
10904
11.5k
      && !(ins->prefixes & PREFIX_ADDR))
10905
10.7k
    {
10906
10.7k
      *ins->obufp++ = 'a';
10907
10.7k
      *ins->obufp++ = 'b';
10908
10.7k
      *ins->obufp++ = 's';
10909
10.7k
    }
10910
10911
14.6k
        goto case_B;
10912
14.6k
      }
10913
924
    else if (l && last[0] == 'X')
10914
924
      {
10915
924
        if (!ins->vex.w)
10916
536
    oappend (ins, "bf16");
10917
388
        else
10918
388
    oappend (ins, "{bad}");
10919
924
      }
10920
0
    else
10921
0
      abort ();
10922
905k
    break;
10923
905k
  case 'C':
10924
12.4k
    if (l == 1 && last[0] == 'C')
10925
6.65k
      {
10926
        /* Condition code (taken from the map-0 Jcc entries).  */
10927
6.65k
        for (const char *q = dis386[0x70 | ins->condition_code].name + 1;
10928
10.1k
       ISLOWER(*q); ++q)
10929
10.1k
    *ins->obufp++ = *q;
10930
6.65k
        break;
10931
6.65k
      }
10932
5.83k
    else if (l == 1 && last[0] == 'S')
10933
1.68k
      {
10934
        /* Add scc suffix.  */
10935
1.68k
        oappend (ins, scc_suffix[ins->vex.scc]);
10936
10937
        /* For SCC insns, the ND bit is required to be set to 0.  */
10938
1.68k
        if (ins->vex.nd)
10939
1.35k
    oappend (ins, "(bad)");
10940
10941
        /* These bits have been consumed and should be cleared or restored
10942
     to default values.  */
10943
1.68k
        ins->vex.v = 1;
10944
1.68k
        ins->vex.nf = false;
10945
1.68k
        ins->vex.mask_register_specifier = 0;
10946
1.68k
        break;
10947
1.68k
      }
10948
10949
4.15k
    if (l)
10950
0
      abort ();
10951
4.15k
    if (ins->intel_syntax && !alt)
10952
0
      break;
10953
4.15k
    if ((ins->prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
10954
2.17k
      {
10955
2.17k
        if (sizeflag & DFLAG)
10956
394
    *ins->obufp++ = ins->intel_syntax ? 'd' : 'l';
10957
1.78k
        else
10958
1.78k
    *ins->obufp++ = ins->intel_syntax ? 'w' : 's';
10959
2.17k
        ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
10960
2.17k
      }
10961
4.15k
    break;
10962
19.1k
  case 'D':
10963
19.1k
    if (l == 1)
10964
6.12k
      {
10965
6.12k
        switch (last[0])
10966
6.12k
        {
10967
6.12k
        case 'X':
10968
6.12k
    if (!ins->vex.evex || ins->vex.w)
10969
5.58k
      *ins->obufp++ = 'd';
10970
538
    else
10971
538
      oappend (ins, "{bad}");
10972
6.12k
    break;
10973
0
        default:
10974
0
    abort ();
10975
6.12k
        }
10976
6.12k
        break;
10977
6.12k
      }
10978
13.0k
    if (l)
10979
0
      abort ();
10980
13.0k
    if (ins->intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
10981
11.9k
      break;
10982
1.08k
    USED_REX (REX_W);
10983
1.08k
    if (ins->modrm.mod == 3)
10984
610
      {
10985
610
        if (ins->rex & REX_W)
10986
228
    *ins->obufp++ = 'q';
10987
382
        else
10988
382
    {
10989
382
      if (sizeflag & DFLAG)
10990
192
        *ins->obufp++ = ins->intel_syntax ? 'd' : 'l';
10991
190
      else
10992
190
        *ins->obufp++ = 'w';
10993
382
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
10994
382
    }
10995
610
      }
10996
478
    else
10997
478
      *ins->obufp++ = 'w';
10998
1.08k
    break;
10999
49.7k
  case 'E':
11000
49.7k
    if (l == 1)
11001
39.7k
      {
11002
39.7k
        switch (last[0])
11003
39.7k
    {
11004
935
    case 'M':
11005
935
      if (ins->modrm.mod != 3)
11006
285
        break;
11007
    /* Fall through.  */
11008
37.7k
    case 'X':
11009
37.7k
      if (!ins->vex.evex || ins->vex.b || ins->vex.ll >= 2
11010
14.6k
          || (ins->rex2 & 7)
11011
8.34k
          || (ins->modrm.mod == 3 && (ins->rex & REX_X))
11012
7.30k
          || !ins->vex.v || ins->vex.mask_register_specifier)
11013
32.6k
        break;
11014
      /* AVX512 extends a number of V*D insns to also have V*Q variants,
11015
         merely distinguished by EVEX.W.  Look for a use of the
11016
         respective macro.  */
11017
5.15k
      if (ins->vex.w)
11018
2.33k
        {
11019
2.33k
          const char *pct = strchr (p + 1, '%');
11020
11021
2.33k
          if (pct != NULL && pct[1] == 'D' && pct[2] == 'Q')
11022
796
      break;
11023
2.33k
        }
11024
4.36k
      *ins->obufp++ = '{';
11025
4.36k
      *ins->obufp++ = 'e';
11026
4.36k
      *ins->obufp++ = 'v';
11027
4.36k
      *ins->obufp++ = 'e';
11028
4.36k
      *ins->obufp++ = 'x';
11029
4.36k
      *ins->obufp++ = '}';
11030
4.36k
      *ins->obufp++ = ' ';
11031
4.36k
      break;
11032
1.68k
    case 'N':
11033
      /* Skip printing {evex} for some special instructions in MAP4.  */
11034
1.68k
      evex_printed = true;
11035
1.68k
      break;
11036
0
    default:
11037
0
      abort ();
11038
39.7k
    }
11039
39.7k
    break;
11040
39.7k
      }
11041
    /* For jcxz/jecxz */
11042
10.0k
    if (ins->address_mode == mode_64bit)
11043
8.40k
      {
11044
8.40k
        if (sizeflag & AFLAG)
11045
7.97k
    *ins->obufp++ = 'r';
11046
425
        else
11047
425
    *ins->obufp++ = 'e';
11048
8.40k
      }
11049
1.62k
    else
11050
1.62k
      if (sizeflag & AFLAG)
11051
903
        *ins->obufp++ = 'e';
11052
10.0k
    ins->used_prefixes |= (ins->prefixes & PREFIX_ADDR);
11053
10.0k
    break;
11054
63.1k
  case 'F':
11055
63.1k
    if (l == 0)
11056
18.0k
      {
11057
18.0k
        if (ins->intel_syntax)
11058
3.82k
    break;
11059
14.2k
        if ((ins->prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
11060
1.43k
    {
11061
1.43k
      if (sizeflag & AFLAG)
11062
738
        *ins->obufp++ = ins->address_mode == mode_64bit ? 'q' : 'l';
11063
693
      else
11064
693
        *ins->obufp++ = ins->address_mode == mode_64bit ? 'l' : 'w';
11065
1.43k
      ins->used_prefixes |= (ins->prefixes & PREFIX_ADDR);
11066
1.43k
    }
11067
14.2k
      }
11068
45.0k
    else if (l == 1 && last[0] == 'C')
11069
3.38k
      {
11070
3.38k
        if (ins->vex.nd && !ins->vex.nf)
11071
1.74k
    break;
11072
1.63k
        *ins->obufp++ = 'c';
11073
1.63k
        *ins->obufp++ = 'f';
11074
        /* Skip printing {evex} */
11075
1.63k
        evex_printed = true;
11076
1.63k
      }
11077
41.6k
    else if (l == 1 && last[0] == 'N')
11078
40.0k
      {
11079
40.0k
        if (ins->vex.nf)
11080
2.91k
    {
11081
2.91k
      oappend (ins, "{nf} ");
11082
      /* This bit needs to be cleared after it is consumed.  */
11083
2.91k
      ins->vex.nf = false;
11084
2.91k
      evex_printed = true;
11085
2.91k
    }
11086
37.0k
        else if (ins->evex_type == evex_from_vex && !(ins->rex2 & 7)
11087
650
           && ins->vex.v)
11088
381
    {
11089
381
      oappend (ins, "{evex} ");
11090
381
      evex_printed = true;
11091
381
    }
11092
40.0k
      }
11093
1.68k
    else if (l == 1 && last[0] == 'D')
11094
1.68k
      {
11095
        /* Get oszc flags value from register_specifier.  */
11096
1.68k
        int oszc_value = ~ins->vex.register_specifier & 0xf;
11097
11098
        /* Add {dfv=of, sf, zf, cf} flags.  */
11099
1.68k
        oappend (ins, oszc_flags[oszc_value]);
11100
11101
        /* These bits have been consumed and should be cleared.  */
11102
1.68k
        ins->vex.register_specifier = 0;
11103
1.68k
      }
11104
0
    else
11105
0
      abort ();
11106
57.6k
    break;
11107
57.6k
  case 'G':
11108
47.0k
    if (ins->intel_syntax || (ins->obufp[-1] != 's'
11109
21.7k
            && !(sizeflag & SUFFIX_ALWAYS)))
11110
30.1k
      break;
11111
16.8k
    if ((ins->rex & REX_W) || (sizeflag & DFLAG))
11112
15.8k
      *ins->obufp++ = 'l';
11113
1.05k
    else
11114
1.05k
      *ins->obufp++ = 'w';
11115
16.8k
    if (!(ins->rex & REX_W))
11116
16.4k
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11117
16.8k
    break;
11118
205k
  case 'H':
11119
205k
    if (l == 0)
11120
193k
      {
11121
193k
        if (ins->intel_syntax)
11122
45.1k
          break;
11123
148k
        if ((ins->prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
11124
143k
      || (ins->prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
11125
6.41k
    {
11126
6.41k
      ins->used_prefixes |= ins->prefixes & (PREFIX_CS | PREFIX_DS);
11127
6.41k
      *ins->obufp++ = ',';
11128
6.41k
      *ins->obufp++ = 'p';
11129
11130
      /* Set active_seg_prefix even if not set in 64-bit mode
11131
         because here it is a valid branch hint. */
11132
6.41k
      if (ins->prefixes & PREFIX_DS)
11133
1.23k
        {
11134
1.23k
          ins->active_seg_prefix = PREFIX_DS;
11135
1.23k
          *ins->obufp++ = 't';
11136
1.23k
        }
11137
5.18k
      else
11138
5.18k
        {
11139
5.18k
          ins->active_seg_prefix = PREFIX_CS;
11140
5.18k
          *ins->obufp++ = 'n';
11141
5.18k
        }
11142
6.41k
    }
11143
148k
      }
11144
12.4k
    else if (l == 1 && last[0] == 'X')
11145
12.4k
      {
11146
12.4k
        if (!ins->vex.w)
11147
6.32k
    *ins->obufp++ = 'h';
11148
6.16k
        else
11149
6.16k
    oappend (ins, "{bad}");
11150
12.4k
      }
11151
0
    else
11152
0
      abort ();
11153
160k
    break;
11154
160k
  case 'K':
11155
1.96k
    USED_REX (REX_W);
11156
1.96k
    if (ins->rex & REX_W)
11157
785
      *ins->obufp++ = 'q';
11158
1.18k
    else
11159
1.18k
      *ins->obufp++ = 'd';
11160
1.96k
    break;
11161
1.04k
  case 'L':
11162
1.04k
    if (ins->intel_syntax)
11163
392
      break;
11164
651
    if (sizeflag & SUFFIX_ALWAYS)
11165
444
      {
11166
444
        if (ins->rex & REX_W)
11167
190
    *ins->obufp++ = 'q';
11168
254
        else
11169
254
    *ins->obufp++ = 'l';
11170
444
      }
11171
651
    break;
11172
1.35k
  case 'M':
11173
1.35k
    if (ins->intel_mnemonic != cond)
11174
717
      *ins->obufp++ = 'r';
11175
1.35k
    break;
11176
1.91k
  case 'N':
11177
1.91k
    if ((ins->prefixes & PREFIX_FWAIT) == 0)
11178
1.19k
      *ins->obufp++ = 'n';
11179
719
    else
11180
719
      ins->used_prefixes |= PREFIX_FWAIT;
11181
1.91k
    break;
11182
15.7k
  case 'O':
11183
15.7k
    USED_REX (REX_W);
11184
15.7k
    if (ins->rex & REX_W)
11185
1.33k
      *ins->obufp++ = 'o';
11186
14.4k
    else if (ins->intel_syntax && (sizeflag & DFLAG))
11187
3.34k
      *ins->obufp++ = 'q';
11188
11.1k
    else
11189
11.1k
      *ins->obufp++ = 'd';
11190
15.7k
    if (!(ins->rex & REX_W))
11191
14.4k
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11192
15.7k
    break;
11193
52.7k
  case '@':
11194
52.7k
    if (ins->address_mode == mode_64bit
11195
49.6k
        && (ins->isa64 == intel64 || (ins->rex & REX_W)
11196
46.5k
      || !(ins->prefixes & PREFIX_DATA)))
11197
48.5k
      {
11198
48.5k
        if (sizeflag & SUFFIX_ALWAYS)
11199
1.42k
    *ins->obufp++ = 'q';
11200
48.5k
        break;
11201
48.5k
      }
11202
    /* Fall through.  */
11203
262k
  case 'P':
11204
262k
    if (l == 0)
11205
233k
      {
11206
233k
        if (!cond && ins->last_rex2_prefix >= 0 && (ins->rex & REX_W))
11207
717
    {
11208
      /* For pushp and popp, p is printed and do not print {rex2}
11209
         for them.  */
11210
717
      *ins->obufp++ = 'p';
11211
717
      ins->rex2 |= REX2_SPECIAL;
11212
717
      break;
11213
717
    }
11214
11215
        /* For "!P" print nothing else in Intel syntax.  */
11216
233k
        if (!cond && ins->intel_syntax)
11217
39.1k
    break;
11218
11219
193k
        if ((ins->modrm.mod == 3 || !cond)
11220
114k
      && !(sizeflag & SUFFIX_ALWAYS))
11221
112k
    break;
11222
    /* Fall through.  */
11223
82.2k
  case 'T':
11224
82.2k
        if ((!(ins->rex & REX_W) && (ins->prefixes & PREFIX_DATA))
11225
79.6k
      || ((sizeflag & SUFFIX_ALWAYS)
11226
3.13k
          && ins->address_mode != mode_64bit))
11227
3.76k
    {
11228
3.76k
      *ins->obufp++ = (sizeflag & DFLAG)
11229
3.76k
          ? ins->intel_syntax ? 'd' : 'l' : 'w';
11230
3.76k
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11231
3.76k
    }
11232
78.5k
        else if (sizeflag & SUFFIX_ALWAYS)
11233
2.00k
    *ins->obufp++ = 'q';
11234
82.2k
      }
11235
28.3k
    else if (l == 1 && last[0] == 'L')
11236
28.3k
      {
11237
28.3k
        if ((ins->prefixes & PREFIX_DATA)
11238
27.7k
      || (ins->rex & REX_W)
11239
26.5k
      || (sizeflag & SUFFIX_ALWAYS))
11240
2.48k
    {
11241
2.48k
      USED_REX (REX_W);
11242
2.48k
      if (ins->rex & REX_W)
11243
1.16k
        *ins->obufp++ = 'q';
11244
1.31k
      else
11245
1.31k
        {
11246
1.31k
          if (sizeflag & DFLAG)
11247
610
      *ins->obufp++ = ins->intel_syntax ? 'd' : 'l';
11248
706
          else
11249
706
      *ins->obufp++ = 'w';
11250
1.31k
          ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11251
1.31k
        }
11252
2.48k
    }
11253
28.3k
      }
11254
0
    else
11255
0
      abort ();
11256
110k
    break;
11257
114k
  case 'Q':
11258
114k
    if (l == 0)
11259
100k
      {
11260
100k
        if (ins->intel_syntax && !alt)
11261
28.5k
    break;
11262
71.5k
        USED_REX (REX_W);
11263
71.5k
        if ((ins->need_modrm && ins->modrm.mod != 3 && !ins->vex.nd)
11264
28.3k
      || (sizeflag & SUFFIX_ALWAYS))
11265
43.6k
    {
11266
43.6k
      if (ins->rex & REX_W)
11267
1.57k
        *ins->obufp++ = 'q';
11268
42.0k
      else
11269
42.0k
        {
11270
42.0k
          if (sizeflag & DFLAG)
11271
34.8k
      *ins->obufp++ = ins->intel_syntax ? 'd' : 'l';
11272
7.23k
          else
11273
7.23k
      *ins->obufp++ = 'w';
11274
42.0k
          ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11275
42.0k
        }
11276
43.6k
    }
11277
71.5k
      }
11278
14.4k
    else if (l == 1 && last[0] == 'D')
11279
9.65k
      *ins->obufp++ = ins->vex.w ? 'q' : 'd';
11280
4.75k
    else if (l == 1 && last[0] == 'L')
11281
4.75k
      {
11282
4.75k
        if (cond ? ins->modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)
11283
4.75k
           : ins->address_mode != mode_64bit)
11284
1.51k
    break;
11285
3.23k
        if ((ins->rex & REX_W))
11286
1.22k
    {
11287
1.22k
      USED_REX (REX_W);
11288
1.22k
      *ins->obufp++ = 'q';
11289
1.22k
    }
11290
2.00k
        else if ((ins->address_mode == mode_64bit && cond)
11291
1.21k
          || (sizeflag & SUFFIX_ALWAYS))
11292
985
    *ins->obufp++ = ins->intel_syntax? 'd' : 'l';
11293
3.23k
      }
11294
0
    else
11295
0
      abort ();
11296
84.4k
    break;
11297
84.4k
  case 'R':
11298
60.5k
    USED_REX (REX_W);
11299
60.5k
    if (ins->rex & REX_W)
11300
4.40k
      *ins->obufp++ = 'q';
11301
56.1k
    else if (sizeflag & DFLAG)
11302
50.9k
      {
11303
50.9k
        if (ins->intel_syntax)
11304
9.82k
      *ins->obufp++ = 'd';
11305
41.1k
        else
11306
41.1k
      *ins->obufp++ = 'l';
11307
50.9k
      }
11308
5.16k
    else
11309
5.16k
      *ins->obufp++ = 'w';
11310
60.5k
    if (ins->intel_syntax && !p[1]
11311
8.08k
        && ((ins->rex & REX_W) || (sizeflag & DFLAG)))
11312
7.62k
      *ins->obufp++ = 'e';
11313
60.5k
    if (!(ins->rex & REX_W))
11314
56.1k
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11315
60.5k
    break;
11316
506k
  case 'S':
11317
506k
    if (l == 0)
11318
489k
      {
11319
542k
      case_S:
11320
542k
        if (ins->intel_syntax)
11321
123k
    break;
11322
419k
        if (sizeflag & SUFFIX_ALWAYS)
11323
4.43k
    {
11324
4.43k
      if (ins->rex & REX_W)
11325
672
        *ins->obufp++ = 'q';
11326
3.76k
      else
11327
3.76k
        {
11328
3.76k
          if (sizeflag & DFLAG)
11329
2.17k
      *ins->obufp++ = 'l';
11330
1.59k
          else
11331
1.59k
      *ins->obufp++ = 'w';
11332
3.76k
          ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11333
3.76k
        }
11334
4.43k
    }
11335
419k
        break;
11336
542k
      }
11337
17.4k
    if (l != 1)
11338
0
      abort ();
11339
17.4k
    switch (last[0])
11340
17.4k
      {
11341
12.8k
      case 'L':
11342
12.8k
        if (ins->address_mode == mode_64bit
11343
7.81k
      && !(ins->prefixes & PREFIX_ADDR))
11344
7.24k
    {
11345
7.24k
      *ins->obufp++ = 'a';
11346
7.24k
      *ins->obufp++ = 'b';
11347
7.24k
      *ins->obufp++ = 's';
11348
7.24k
    }
11349
11350
12.8k
        goto case_S;
11351
4.67k
      case 'X':
11352
4.67k
        if (!ins->vex.evex || !ins->vex.w)
11353
3.89k
    *ins->obufp++ = 's';
11354
780
        else
11355
780
    oappend (ins, "{bad}");
11356
4.67k
        break;
11357
0
      default:
11358
0
        abort ();
11359
17.4k
      }
11360
4.67k
    break;
11361
4.67k
  case 'U':
11362
3.55k
    if (l == 1 && (last[0] == 'Z'))
11363
3.55k
      {
11364
        /* Although IMUL/SETcc does not support NDD, the EVEX.ND bit is
11365
     used to control whether its destination register has its upper
11366
     bits zeroed.  */
11367
3.55k
        if (ins->vex.nd)
11368
2.05k
    oappend (ins, "zu");
11369
3.55k
      }
11370
0
    else
11371
0
      abort ();
11372
3.55k
    break;
11373
56.1k
  case 'V':
11374
56.1k
    if (l == 0)
11375
14.6k
      {
11376
14.6k
        if (ins->need_vex)
11377
7.19k
    *ins->obufp++ = 'v';
11378
14.6k
      }
11379
41.5k
    else if (l == 1)
11380
41.5k
      {
11381
41.5k
        switch (last[0])
11382
41.5k
    {
11383
1.06k
    case 'X':
11384
1.06k
      if (ins->vex.evex)
11385
588
        break;
11386
473
      *ins->obufp++ = '{';
11387
473
      *ins->obufp++ = 'v';
11388
473
      *ins->obufp++ = 'e';
11389
473
      *ins->obufp++ = 'x';
11390
473
      *ins->obufp++ = '}';
11391
473
      *ins->obufp++ = ' ';
11392
473
      break;
11393
40.4k
    case 'L':
11394
40.4k
      if (ins->rex & REX_W)
11395
1.19k
        {
11396
1.19k
          *ins->obufp++ = 'a';
11397
1.19k
          *ins->obufp++ = 'b';
11398
1.19k
          *ins->obufp++ = 's';
11399
1.19k
        }
11400
40.4k
      goto case_S;
11401
0
    default:
11402
0
      abort ();
11403
41.5k
    }
11404
41.5k
      }
11405
0
    else
11406
0
      abort ();
11407
15.6k
    break;
11408
26.9k
  case 'W':
11409
26.9k
    if (l == 0)
11410
16.9k
      {
11411
        /* operand size flag for cwtl, cbtw */
11412
16.9k
        USED_REX (REX_W);
11413
16.9k
        if (ins->rex & REX_W)
11414
2.92k
    {
11415
2.92k
      if (ins->intel_syntax)
11416
1.14k
        *ins->obufp++ = 'd';
11417
1.78k
      else
11418
1.78k
        *ins->obufp++ = 'l';
11419
2.92k
    }
11420
14.0k
        else if (sizeflag & DFLAG)
11421
12.7k
    *ins->obufp++ = 'w';
11422
1.31k
        else
11423
1.31k
    *ins->obufp++ = 'b';
11424
16.9k
        if (!(ins->rex & REX_W))
11425
14.0k
    ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11426
16.9k
      }
11427
9.94k
    else if (l == 1)
11428
9.94k
      {
11429
9.94k
        if (!ins->need_vex)
11430
0
    abort ();
11431
9.94k
        if (last[0] == 'X')
11432
7.08k
    *ins->obufp++ = ins->vex.w ? 'd': 's';
11433
2.86k
        else if (last[0] == 'B')
11434
2.86k
    *ins->obufp++ = ins->vex.w ? 'w': 'b';
11435
0
        else
11436
0
    abort ();
11437
9.94k
      }
11438
0
    else
11439
0
      abort ();
11440
26.9k
    break;
11441
26.9k
  case 'X':
11442
9.03k
    if (l != 0)
11443
0
      abort ();
11444
9.03k
    if (ins->need_vex
11445
9.03k
        ? ins->vex.prefix == DATA_PREFIX_OPCODE
11446
9.03k
        : ins->prefixes & PREFIX_DATA)
11447
1.87k
      {
11448
1.87k
        *ins->obufp++ = 'd';
11449
1.87k
        ins->used_prefixes |= PREFIX_DATA;
11450
1.87k
      }
11451
7.15k
    else
11452
7.15k
      *ins->obufp++ = 's';
11453
9.03k
    break;
11454
13.5k
  case 'Y':
11455
13.5k
    if (l == 0)
11456
9.12k
      {
11457
9.12k
        if (ins->vex.mask_register_specifier)
11458
3.37k
    ins->illegal_masking = true;
11459
9.12k
      }
11460
4.47k
    else if (l == 1 && last[0] == 'X')
11461
4.47k
      {
11462
4.47k
        if (!ins->need_vex)
11463
452
    break;
11464
4.02k
        if (ins->intel_syntax
11465
2.95k
      || ((ins->modrm.mod == 3 || ins->vex.b)
11466
1.86k
          && !(sizeflag & SUFFIX_ALWAYS)))
11467
2.34k
    break;
11468
1.67k
        switch (ins->vex.length)
11469
1.67k
    {
11470
324
    case 128:
11471
324
      *ins->obufp++ = 'x';
11472
324
      break;
11473
766
    case 256:
11474
766
      *ins->obufp++ = 'y';
11475
766
      break;
11476
584
    case 512:
11477
584
      if (!ins->vex.evex)
11478
0
    default:
11479
0
        abort ();
11480
1.67k
    }
11481
1.67k
      }
11482
0
    else
11483
0
      abort ();
11484
10.7k
    break;
11485
10.7k
  case 'Z':
11486
7.44k
    if (l == 0)
11487
4.48k
      {
11488
        /* These insns ignore ModR/M.mod: Force it to 3 for OP_E().  */
11489
4.48k
        ins->modrm.mod = 3;
11490
4.48k
        if (!ins->intel_syntax && (sizeflag & SUFFIX_ALWAYS))
11491
304
    *ins->obufp++ = ins->address_mode == mode_64bit ? 'q' : 'l';
11492
4.48k
      }
11493
2.96k
    else if (l == 1 && last[0] == 'X')
11494
2.96k
      {
11495
2.96k
        if (!ins->vex.evex)
11496
0
    abort ();
11497
2.96k
        if (ins->intel_syntax
11498
2.11k
      || ((ins->modrm.mod == 3 || ins->vex.b)
11499
1.43k
          && !(sizeflag & SUFFIX_ALWAYS)))
11500
1.92k
    break;
11501
1.04k
        switch (ins->vex.length)
11502
1.04k
    {
11503
306
    case 128:
11504
306
      *ins->obufp++ = 'x';
11505
306
      break;
11506
361
    case 256:
11507
361
      *ins->obufp++ = 'y';
11508
361
      break;
11509
375
    case 512:
11510
375
      *ins->obufp++ = 'z';
11511
375
      break;
11512
0
    default:
11513
0
      abort ();
11514
1.04k
    }
11515
1.04k
      }
11516
0
    else
11517
0
      abort ();
11518
5.52k
    break;
11519
16.3k
  case '^':
11520
16.3k
    if (ins->intel_syntax)
11521
4.73k
      break;
11522
11.5k
    if (ins->isa64 == intel64 && (ins->rex & REX_W))
11523
194
      {
11524
194
        USED_REX (REX_W);
11525
194
        *ins->obufp++ = 'q';
11526
194
        break;
11527
194
      }
11528
11.3k
    if ((ins->prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
11529
1.04k
      {
11530
1.04k
        if (sizeflag & DFLAG)
11531
574
    *ins->obufp++ = 'l';
11532
467
        else
11533
467
    *ins->obufp++ = 'w';
11534
1.04k
        ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11535
1.04k
      }
11536
11.3k
    break;
11537
14.0M
  }
11538
11539
14.0M
      if (len == l)
11540
13.8M
  len = l = 0;
11541
14.0M
    }
11542
3.00M
  *ins->obufp = 0;
11543
3.00M
  ins->mnemonicendp = ins->obufp;
11544
3.00M
  return 0;
11545
3.00M
}
11546
11547
/* Add a style marker to *INS->obufp that encodes STYLE.  This assumes that
11548
   the buffer pointed to by INS->obufp has space.  A style marker is made
11549
   from the STYLE_MARKER_CHAR followed by STYLE converted to a single hex
11550
   digit, followed by another STYLE_MARKER_CHAR.  This function assumes
11551
   that the number of styles is not greater than 16.  */
11552
11553
static void
11554
oappend_insert_style (instr_info *ins, enum disassembler_style style)
11555
10.5M
{
11556
10.5M
  unsigned num = (unsigned) style;
11557
11558
  /* We currently assume that STYLE can be encoded as a single hex
11559
     character.  If more styles are added then this might start to fail,
11560
     and we'll need to expand this code.  */
11561
10.5M
  if (num > 0xf)
11562
0
    abort ();
11563
11564
10.5M
  *ins->obufp++ = STYLE_MARKER_CHAR;
11565
10.5M
  *ins->obufp++ = (num < 10 ? ('0' + num)
11566
10.5M
       : ((num < 16) ? ('a' + (num - 10)) : '0'));
11567
10.5M
  *ins->obufp++ = STYLE_MARKER_CHAR;
11568
11569
  /* This final null character is not strictly necessary, after inserting a
11570
     style marker we should always be inserting some additional content.
11571
     However, having the buffer null terminated doesn't cost much, and make
11572
     it easier to debug what's going on.  Also, if we do ever forget to add
11573
     any additional content after this style marker, then the buffer will
11574
     still be well formed.  */
11575
10.5M
  *ins->obufp = '\0';
11576
10.5M
}
11577
11578
static void
11579
oappend_with_style (instr_info *ins, const char *s,
11580
        enum disassembler_style style)
11581
6.76M
{
11582
6.76M
  oappend_insert_style (ins, style);
11583
6.76M
  ins->obufp = stpcpy (ins->obufp, s);
11584
6.76M
}
11585
11586
/* Add a comment to the comment buffer.  */
11587
11588
static void
11589
cappend_with_style (instr_info *ins, const char *s,
11590
        enum disassembler_style style)
11591
0
{
11592
0
  if (ins->cbufp + strlen (s) + 4 >= ins->cbuf + COMMENT_BUFFER_SIZE)
11593
0
    return;
11594
11595
0
  unsigned num = (unsigned) style;
11596
11597
0
  *ins->cbufp++ = STYLE_MARKER_CHAR;
11598
0
  *ins->cbufp++ = (num < 10 ? ('0' + num)
11599
0
       : ((num < 16) ? ('a' + (num - 10)) : '0'));
11600
0
  *ins->cbufp++ = STYLE_MARKER_CHAR;
11601
0
  *ins->cbufp = '\0';
11602
11603
0
  ins->cbufp = stpcpy (ins->cbufp, s);
11604
0
}
11605
11606
/* Add a single character C to the buffer pointer to by INS->obufp, marking
11607
   the style for the character as STYLE.  */
11608
11609
static void
11610
oappend_char_with_style (instr_info *ins, const char c,
11611
       enum disassembler_style style)
11612
3.82M
{
11613
3.82M
  oappend_insert_style (ins, style);
11614
3.82M
  *ins->obufp++ = c;
11615
3.82M
  *ins->obufp = '\0';
11616
3.82M
}
11617
11618
/* Like oappend_char_with_style, but always uses dis_style_text.  */
11619
11620
static void
11621
oappend_char (instr_info *ins, const char c)
11622
3.33M
{
11623
3.33M
  oappend_char_with_style (ins, c, dis_style_text);
11624
3.33M
}
11625
11626
static void
11627
append_seg (instr_info *ins)
11628
1.56M
{
11629
  /* Only print the active segment register.  */
11630
1.56M
  if (!ins->active_seg_prefix)
11631
1.51M
    return;
11632
11633
50.0k
  ins->used_prefixes |= ins->active_seg_prefix;
11634
50.0k
  switch (ins->active_seg_prefix)
11635
50.0k
    {
11636
2.06k
    case PREFIX_CS:
11637
2.06k
      oappend_register (ins, att_names_seg[1]);
11638
2.06k
      break;
11639
18.7k
    case PREFIX_DS:
11640
18.7k
      oappend_register (ins, att_names_seg[3]);
11641
18.7k
      break;
11642
1.95k
    case PREFIX_SS:
11643
1.95k
      oappend_register (ins, att_names_seg[2]);
11644
1.95k
      break;
11645
1.77k
    case PREFIX_ES:
11646
1.77k
      oappend_register (ins, att_names_seg[0]);
11647
1.77k
      break;
11648
10.9k
    case PREFIX_FS:
11649
10.9k
      oappend_register (ins, att_names_seg[4]);
11650
10.9k
      break;
11651
14.5k
    case PREFIX_GS:
11652
14.5k
      oappend_register (ins, att_names_seg[5]);
11653
14.5k
      break;
11654
0
    default:
11655
0
      break;
11656
50.0k
    }
11657
50.0k
  oappend_char (ins, ':');
11658
50.0k
}
11659
11660
static void
11661
print_operand_value (instr_info *ins, bfd_vma disp,
11662
         enum disassembler_style style)
11663
662k
{
11664
662k
  char tmp[30];
11665
11666
662k
  if (ins->address_mode != mode_64bit)
11667
134k
    disp &= 0xffffffff;
11668
662k
  sprintf (tmp, "0x%" PRIx64, (uint64_t) disp);
11669
662k
  oappend_with_style (ins, tmp, style);
11670
662k
}
11671
11672
/* Like oappend, but called for immediate operands.  */
11673
11674
static void
11675
oappend_immediate (instr_info *ins, bfd_vma imm)
11676
400k
{
11677
400k
  if (!ins->intel_syntax)
11678
296k
    oappend_char_with_style (ins, '$', dis_style_immediate);
11679
11680
400k
  print_operand_value (ins, imm, dis_style_immediate);
11681
11682
  /* Determine if we can display some more information about this immediate.  */
11683
400k
  if (! annotate_immediates
11684
      /* Don't bother with zero, even if there is symbol associated with it.  */
11685
46.6k
      || imm == 0
11686
      /* For the next tests we need a BFD.  If we do not have one then do not proceed.  */
11687
45.0k
      || ins->info->section == NULL
11688
0
      || ins->info->section->owner == NULL
11689
      /* Save time by avoiding immediates that cannot reference part of the address space.  */
11690
0
      || imm < ins->info->section->owner->start_address
11691
      /* Also skip static object files as their symbols have not been resolved.  */
11692
0
      || (ins->info->section->owner->flags & (EXEC_P | DYNAMIC)) == 0)
11693
400k
    return;
11694
11695
0
  asymbol * sym = ins->info->symbol_at_address_func (imm, ins->info);
11696
0
  if (sym == NULL)
11697
0
    return;
11698
11699
0
  char * annotation = NULL;
11700
11701
  /* FIXME: Potential memory leak: strictly speaking asprintf()
11702
     can return 0 whilst also having allocated some memory.  */
11703
0
  if (asprintf (& annotation, " [%s]", sym->name) > 0)
11704
0
    {
11705
      /* Display the symbol associated with address 'imm'.  */
11706
0
      cappend_with_style (ins, annotation, dis_style_symbol);
11707
0
      free (annotation);
11708
0
    }
11709
0
}
11710
11711
/* Put DISP in BUF as signed hex number.  */
11712
11713
static void
11714
print_displacement (instr_info *ins, bfd_signed_vma val)
11715
359k
{
11716
359k
  char tmp[30];
11717
11718
359k
  if (val < 0)
11719
102k
    {
11720
102k
      oappend_char_with_style (ins, '-', dis_style_address_offset);
11721
102k
      val = (bfd_vma) 0 - val;
11722
11723
      /* Check for possible overflow.  */
11724
102k
      if (val < 0)
11725
0
  {
11726
0
    switch (ins->address_mode)
11727
0
      {
11728
0
      case mode_64bit:
11729
0
        oappend_with_style (ins, "0x8000000000000000",
11730
0
          dis_style_address_offset);
11731
0
        break;
11732
0
      case mode_32bit:
11733
0
        oappend_with_style (ins, "0x80000000",
11734
0
          dis_style_address_offset);
11735
0
        break;
11736
0
      case mode_16bit:
11737
0
        oappend_with_style (ins, "0x8000",
11738
0
          dis_style_address_offset);
11739
0
        break;
11740
0
      }
11741
0
    return;
11742
0
  }
11743
102k
    }
11744
11745
359k
  sprintf (tmp, "0x%" PRIx64, (int64_t) val);
11746
359k
  oappend_with_style (ins, tmp, dis_style_address_offset);
11747
359k
}
11748
11749
static void
11750
intel_operand_size (instr_info *ins, int bytemode, int sizeflag)
11751
436k
{
11752
  /* Check if there is a broadcast, when evex.b is not treated as evex.nd.  */
11753
436k
  if (ins->vex.b && ins->evex_type == evex_default)
11754
6.57k
    {
11755
6.57k
      if (!ins->vex.no_broadcast)
11756
6.00k
  switch (bytemode)
11757
6.00k
    {
11758
1.97k
    case x_mode:
11759
2.47k
    case evex_half_bcst_xmmq_mode:
11760
2.47k
      if (ins->vex.w)
11761
1.28k
        oappend (ins, "QWORD BCST ");
11762
1.18k
      else
11763
1.18k
        oappend (ins, "DWORD BCST ");
11764
2.47k
      break;
11765
900
    case xh_mode:
11766
1.14k
    case evex_half_bcst_xmmqh_mode:
11767
1.42k
    case evex_half_bcst_xmmqdh_mode:
11768
1.42k
      oappend (ins, "WORD BCST ");
11769
1.42k
      break;
11770
2.10k
    default:
11771
2.10k
      ins->vex.no_broadcast = true;
11772
2.10k
      break;
11773
6.00k
    }
11774
6.57k
      return;
11775
6.57k
    }
11776
429k
  switch (bytemode)
11777
429k
    {
11778
234k
    case b_mode:
11779
249k
    case b_swap_mode:
11780
250k
    case db_mode:
11781
250k
      oappend (ins, "BYTE PTR ");
11782
250k
      break;
11783
6.25k
    case w_mode:
11784
6.50k
    case w_swap_mode:
11785
6.96k
    case dw_mode:
11786
6.96k
      oappend (ins, "WORD PTR ");
11787
6.96k
      break;
11788
8.18k
    case indir_v_mode:
11789
8.18k
      if (ins->address_mode == mode_64bit && ins->isa64 == intel64)
11790
208
  {
11791
208
    oappend (ins, "QWORD PTR ");
11792
208
    break;
11793
208
  }
11794
      /* Fall through.  */
11795
11.0k
    case stack_v_mode:
11796
11.0k
      if (ins->address_mode == mode_64bit && ((sizeflag & DFLAG)
11797
1.45k
                || (ins->rex & REX_W)))
11798
7.87k
  {
11799
7.87k
    oappend (ins, "QWORD PTR ");
11800
7.87k
    break;
11801
7.87k
  }
11802
      /* Fall through.  */
11803
71.3k
    case v_mode:
11804
90.0k
    case v_swap_mode:
11805
92.4k
    case dq_mode:
11806
92.4k
      USED_REX (REX_W);
11807
92.4k
      if (ins->rex & REX_W)
11808
3.23k
  oappend (ins, "QWORD PTR ");
11809
89.2k
      else if (bytemode == dq_mode)
11810
2.34k
  oappend (ins, "DWORD PTR ");
11811
86.8k
      else
11812
86.8k
  {
11813
86.8k
    if (sizeflag & DFLAG)
11814
80.0k
      oappend (ins, "DWORD PTR ");
11815
6.85k
    else
11816
6.85k
      oappend (ins, "WORD PTR ");
11817
86.8k
    ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11818
86.8k
  }
11819
92.4k
      break;
11820
12.6k
    case z_mode:
11821
12.6k
      if ((ins->rex & REX_W) || (sizeflag & DFLAG))
11822
10.3k
  *ins->obufp++ = 'D';
11823
12.6k
      oappend (ins, "WORD PTR ");
11824
12.6k
      if (!(ins->rex & REX_W))
11825
11.8k
  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11826
12.6k
      break;
11827
4.15k
    case a_mode:
11828
4.15k
      if (sizeflag & DFLAG)
11829
2.30k
  oappend (ins, "QWORD PTR ");
11830
1.84k
      else
11831
1.84k
  oappend (ins, "DWORD PTR ");
11832
4.15k
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11833
4.15k
      break;
11834
1.79k
    case movsxd_mode:
11835
1.79k
      if (!(sizeflag & DFLAG) && ins->isa64 == intel64)
11836
190
  oappend (ins, "WORD PTR ");
11837
1.60k
      else
11838
1.60k
  oappend (ins, "DWORD PTR ");
11839
1.79k
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11840
1.79k
      break;
11841
2.72k
    case d_mode:
11842
3.26k
    case d_swap_mode:
11843
3.26k
      oappend (ins, "DWORD PTR ");
11844
3.26k
      break;
11845
11.4k
    case q_mode:
11846
12.3k
    case q_swap_mode:
11847
12.3k
      oappend (ins, "QWORD PTR ");
11848
12.3k
      break;
11849
1.08k
    case m_mode:
11850
1.08k
      if (ins->address_mode == mode_64bit)
11851
656
  oappend (ins, "QWORD PTR ");
11852
430
      else
11853
430
  oappend (ins, "DWORD PTR ");
11854
1.08k
      break;
11855
5.24k
    case f_mode:
11856
5.24k
      if (sizeflag & DFLAG)
11857
3.32k
  oappend (ins, "FWORD PTR ");
11858
1.92k
      else
11859
1.92k
  oappend (ins, "DWORD PTR ");
11860
5.24k
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11861
5.24k
      break;
11862
603
    case t_mode:
11863
603
      oappend (ins, "TBYTE PTR ");
11864
603
      break;
11865
8.01k
    case x_mode:
11866
8.67k
    case xh_mode:
11867
9.73k
    case x_swap_mode:
11868
10.0k
    case evex_x_gscat_mode:
11869
10.5k
    case evex_x_nobcst_mode:
11870
10.8k
    case bw_unit_mode:
11871
10.8k
      if (ins->need_vex)
11872
6.87k
  {
11873
6.87k
    switch (ins->vex.length)
11874
6.87k
      {
11875
2.36k
      case 128:
11876
2.36k
        oappend (ins, "XMMWORD PTR ");
11877
2.36k
        break;
11878
2.78k
      case 256:
11879
2.78k
        oappend (ins, "YMMWORD PTR ");
11880
2.78k
        break;
11881
1.72k
      case 512:
11882
1.72k
        oappend (ins, "ZMMWORD PTR ");
11883
1.72k
        break;
11884
0
      default:
11885
0
        abort ();
11886
6.87k
      }
11887
6.87k
  }
11888
3.95k
      else
11889
3.95k
  oappend (ins, "XMMWORD PTR ");
11890
10.8k
      break;
11891
10.8k
    case xmm_mode:
11892
706
      oappend (ins, "XMMWORD PTR ");
11893
706
      break;
11894
416
    case ymm_mode:
11895
416
      oappend (ins, "YMMWORD PTR ");
11896
416
      break;
11897
516
    case xmmq_mode:
11898
1.01k
    case evex_half_bcst_xmmqh_mode:
11899
1.94k
    case evex_half_bcst_xmmq_mode:
11900
1.94k
      switch (ins->vex.length)
11901
1.94k
  {
11902
658
  case 0:
11903
1.03k
  case 128:
11904
1.03k
    oappend (ins, "QWORD PTR ");
11905
1.03k
    break;
11906
408
  case 256:
11907
408
    oappend (ins, "XMMWORD PTR ");
11908
408
    break;
11909
499
  case 512:
11910
499
    oappend (ins, "YMMWORD PTR ");
11911
499
    break;
11912
0
  default:
11913
0
    abort ();
11914
1.94k
  }
11915
1.94k
      break;
11916
1.94k
    case xmmdw_mode:
11917
1.13k
      if (!ins->need_vex)
11918
0
  abort ();
11919
11920
1.13k
      switch (ins->vex.length)
11921
1.13k
  {
11922
480
  case 128:
11923
480
    oappend (ins, "WORD PTR ");
11924
480
    break;
11925
443
  case 256:
11926
443
    oappend (ins, "DWORD PTR ");
11927
443
    break;
11928
213
  case 512:
11929
213
    oappend (ins, "QWORD PTR ");
11930
213
    break;
11931
0
  default:
11932
0
    abort ();
11933
1.13k
  }
11934
1.13k
      break;
11935
1.79k
    case xmmqd_mode:
11936
2.01k
    case evex_half_bcst_xmmqdh_mode:
11937
2.01k
      if (!ins->need_vex)
11938
0
  abort ();
11939
11940
2.01k
      switch (ins->vex.length)
11941
2.01k
  {
11942
434
  case 128:
11943
434
    oappend (ins, "DWORD PTR ");
11944
434
    break;
11945
1.29k
  case 256:
11946
1.29k
    oappend (ins, "QWORD PTR ");
11947
1.29k
    break;
11948
286
  case 512:
11949
286
    oappend (ins, "XMMWORD PTR ");
11950
286
    break;
11951
0
  default:
11952
0
    abort ();
11953
2.01k
  }
11954
2.01k
      break;
11955
2.01k
    case ymmq_mode:
11956
976
      if (!ins->need_vex)
11957
0
  abort ();
11958
11959
976
      switch (ins->vex.length)
11960
976
  {
11961
410
  case 128:
11962
410
    oappend (ins, "QWORD PTR ");
11963
410
    break;
11964
276
  case 256:
11965
276
    oappend (ins, "YMMWORD PTR ");
11966
276
    break;
11967
290
  case 512:
11968
290
    oappend (ins, "ZMMWORD PTR ");
11969
290
    break;
11970
0
  default:
11971
0
    abort ();
11972
976
  }
11973
976
      break;
11974
976
    case o_mode:
11975
339
      oappend (ins, "OWORD PTR ");
11976
339
      break;
11977
1.13k
    case vex_vsib_d_w_dq_mode:
11978
2.42k
    case vex_vsib_q_w_dq_mode:
11979
2.42k
      if (!ins->need_vex)
11980
0
  abort ();
11981
2.42k
      if (ins->vex.w)
11982
843
  oappend (ins, "QWORD PTR ");
11983
1.58k
      else
11984
1.58k
  oappend (ins, "DWORD PTR ");
11985
2.42k
      break;
11986
1.17k
    case mask_bd_mode:
11987
1.17k
      if (!ins->need_vex || ins->vex.length != 128)
11988
0
  abort ();
11989
1.17k
      if (ins->vex.w)
11990
662
  oappend (ins, "DWORD PTR ");
11991
509
      else
11992
509
  oappend (ins, "BYTE PTR ");
11993
1.17k
      break;
11994
901
    case mask_mode:
11995
901
      if (!ins->need_vex)
11996
0
  abort ();
11997
901
      if (ins->vex.w)
11998
285
  oappend (ins, "QWORD PTR ");
11999
616
      else
12000
616
  oappend (ins, "WORD PTR ");
12001
901
      break;
12002
914
    case v_bnd_mode:
12003
1.80k
    case v_bndmk_mode:
12004
7.78k
    default:
12005
7.78k
      break;
12006
429k
    }
12007
429k
}
12008
12009
static void
12010
print_register (instr_info *ins, unsigned int reg, unsigned int rexmask,
12011
    int bytemode, int sizeflag)
12012
1.53M
{
12013
1.53M
  const char (*names)[8];
12014
12015
  /* Masking is invalid for insns with GPR destination. Set the flag uniformly,
12016
     as the consumer will inspect it only for the destination operand.  */
12017
1.53M
  if (bytemode != mask_mode && ins->vex.mask_register_specifier)
12018
6.87k
    ins->illegal_masking = true;
12019
12020
1.53M
  USED_REX (rexmask);
12021
1.53M
  if (ins->rex & rexmask)
12022
49.0k
    reg += 8;
12023
1.53M
  if (ins->rex2 & rexmask)
12024
17.3k
    reg += 16;
12025
12026
1.53M
  switch (bytemode)
12027
1.53M
    {
12028
1.04M
    case b_mode:
12029
1.05M
    case b_swap_mode:
12030
1.05M
      if (reg & 4)
12031
240k
  USED_REX (0);
12032
1.05M
      if (ins->rex || ins->rex2)
12033
21.7k
  names = att_names8rex;
12034
1.03M
      else
12035
1.03M
  names = att_names8;
12036
1.05M
      break;
12037
338
    case w_mode:
12038
338
      names = att_names16;
12039
338
      break;
12040
10.3k
    case d_mode:
12041
11.0k
    case dw_mode:
12042
11.9k
    case db_mode:
12043
11.9k
      names = att_names32;
12044
11.9k
      break;
12045
2.15k
    case q_mode:
12046
2.15k
      names = att_names64;
12047
2.15k
      break;
12048
5.71k
    case m_mode:
12049
5.95k
    case v_bnd_mode:
12050
5.95k
      names = ins->address_mode == mode_64bit ? att_names64 : att_names32;
12051
5.95k
      break;
12052
7.08k
    case bnd_mode:
12053
7.41k
    case bnd_swap_mode:
12054
7.41k
      if (reg > 0x3)
12055
3.21k
  {
12056
3.21k
    oappend (ins, "(bad)");
12057
3.21k
    return;
12058
3.21k
  }
12059
4.20k
      names = att_names_bnd;
12060
4.20k
      break;
12061
11.5k
    case indir_v_mode:
12062
11.5k
      if (ins->address_mode == mode_64bit && ins->isa64 == intel64)
12063
340
  {
12064
340
    names = att_names64;
12065
340
    break;
12066
340
  }
12067
      /* Fall through.  */
12068
18.3k
    case stack_v_mode:
12069
18.3k
      if (ins->address_mode == mode_64bit && ((sizeflag & DFLAG)
12070
1.02k
                || (ins->rex & REX_W)))
12071
12.8k
  {
12072
12.8k
    names = att_names64;
12073
12.8k
    break;
12074
12.8k
  }
12075
5.46k
      bytemode = v_mode;
12076
      /* Fall through.  */
12077
402k
    case v_mode:
12078
412k
    case v_swap_mode:
12079
422k
    case dq_mode:
12080
422k
      USED_REX (REX_W);
12081
422k
      if (ins->rex & REX_W)
12082
60.2k
  names = att_names64;
12083
362k
      else if (bytemode != v_mode && bytemode != v_swap_mode)
12084
8.61k
  names = att_names32;
12085
353k
      else
12086
353k
  {
12087
353k
    if (sizeflag & DFLAG)
12088
308k
      names = att_names32;
12089
45.0k
    else
12090
45.0k
      names = att_names16;
12091
353k
    ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12092
353k
  }
12093
422k
      break;
12094
2.98k
    case movsxd_mode:
12095
2.98k
      if (!(sizeflag & DFLAG) && ins->isa64 == intel64)
12096
190
  names = att_names16;
12097
2.79k
      else
12098
2.79k
  names = att_names32;
12099
2.98k
      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12100
2.98k
      break;
12101
1.38k
    case va_mode:
12102
1.38k
      names = (ins->address_mode == mode_64bit
12103
1.38k
         ? att_names64 : att_names32);
12104
1.38k
      if (!(ins->prefixes & PREFIX_ADDR))
12105
1.03k
  names = (ins->address_mode == mode_16bit
12106
1.03k
         ? att_names16 : names);
12107
348
      else
12108
348
  {
12109
    /* Remove "addr16/addr32".  */
12110
348
    ins->all_prefixes[ins->last_addr_prefix] = 0;
12111
348
    names = (ins->address_mode != mode_32bit
12112
348
           ? att_names32 : att_names16);
12113
348
    ins->used_prefixes |= PREFIX_ADDR;
12114
348
  }
12115
1.38k
      break;
12116
532
    case mask_bd_mode:
12117
14.5k
    case mask_mode:
12118
14.5k
      if (reg > 0x7)
12119
9.20k
  {
12120
9.20k
    oappend (ins, "(bad)");
12121
9.20k
    return;
12122
9.20k
  }
12123
5.36k
      names = att_names_mask;
12124
5.36k
      break;
12125
529
    case 0:
12126
529
      return;
12127
0
    default:
12128
0
      oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
12129
0
      return;
12130
1.53M
    }
12131
1.52M
  oappend_register (ins, names[reg]);
12132
1.52M
}
12133
12134
static bool
12135
get8s (instr_info *ins, bfd_vma *res)
12136
460k
{
12137
460k
  if (!fetch_code (ins->info, ins->codep + 1))
12138
9.31k
    return false;
12139
451k
  *res = ((bfd_vma) *ins->codep++ ^ 0x80) - 0x80;
12140
451k
  return true;
12141
460k
}
12142
12143
static bool
12144
get16 (instr_info *ins, bfd_vma *res)
12145
49.1k
{
12146
49.1k
  if (!fetch_code (ins->info, ins->codep + 2))
12147
3.02k
    return false;
12148
46.1k
  *res = *ins->codep++;
12149
46.1k
  *res |= (bfd_vma) *ins->codep++ << 8;
12150
46.1k
  return true;
12151
49.1k
}
12152
12153
static bool
12154
get16s (instr_info *ins, bfd_vma *res)
12155
16.3k
{
12156
16.3k
  if (!get16 (ins, res))
12157
1.07k
    return false;
12158
15.2k
  *res = (*res ^ 0x8000) - 0x8000;
12159
15.2k
  return true;
12160
16.3k
}
12161
12162
static bool
12163
get32 (instr_info *ins, bfd_vma *res)
12164
302k
{
12165
302k
  if (!fetch_code (ins->info, ins->codep + 4))
12166
14.1k
    return false;
12167
288k
  *res = *ins->codep++;
12168
288k
  *res |= (bfd_vma) *ins->codep++ << 8;
12169
288k
  *res |= (bfd_vma) *ins->codep++ << 16;
12170
288k
  *res |= (bfd_vma) *ins->codep++ << 24;
12171
288k
  return true;
12172
302k
}
12173
12174
static bool
12175
get32s (instr_info *ins, bfd_vma *res)
12176
184k
{
12177
184k
  if (!get32 (ins, res))
12178
9.87k
    return false;
12179
12180
175k
  *res = (*res ^ ((bfd_vma) 1 << 31)) - ((bfd_vma) 1 << 31);
12181
12182
175k
  return true;
12183
184k
}
12184
12185
static bool
12186
get64 (instr_info *ins, uint64_t *res)
12187
18.5k
{
12188
18.5k
  unsigned int a;
12189
18.5k
  unsigned int b;
12190
12191
18.5k
  if (!fetch_code (ins->info, ins->codep + 8))
12192
1.28k
    return false;
12193
17.2k
  a = *ins->codep++;
12194
17.2k
  a |= (unsigned int) *ins->codep++ << 8;
12195
17.2k
  a |= (unsigned int) *ins->codep++ << 16;
12196
17.2k
  a |= (unsigned int) *ins->codep++ << 24;
12197
17.2k
  b = *ins->codep++;
12198
17.2k
  b |= (unsigned int) *ins->codep++ << 8;
12199
17.2k
  b |= (unsigned int) *ins->codep++ << 16;
12200
17.2k
  b |= (unsigned int) *ins->codep++ << 24;
12201
17.2k
  *res = a + ((uint64_t) b << 32);
12202
17.2k
  return true;
12203
18.5k
}
12204
12205
static void
12206
set_op (instr_info *ins, bfd_vma op, bool riprel)
12207
253k
{
12208
253k
  ins->op_index[ins->op_ad] = ins->op_ad;
12209
253k
  if (ins->address_mode == mode_64bit)
12210
211k
    ins->op_address[ins->op_ad] = op;
12211
41.6k
  else /* Mask to get a 32-bit address.  */
12212
41.6k
    ins->op_address[ins->op_ad] = op & 0xffffffff;
12213
253k
  ins->op_riprel[ins->op_ad] = riprel;
12214
253k
}
12215
12216
static bool
12217
BadOp (instr_info *ins)
12218
37.2k
{
12219
  /* Throw away prefixes and 1st. opcode byte.  */
12220
37.2k
  struct dis_private *priv = ins->info->private_data;
12221
12222
37.2k
  ins->codep = priv->the_buffer + ins->nr_prefixes + ins->need_vex + 1;
12223
37.2k
  ins->obufp = stpcpy (ins->obufp, "(bad)");
12224
37.2k
  return true;
12225
37.2k
}
12226
12227
static bool
12228
OP_Skip_MODRM (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
12229
         int sizeflag ATTRIBUTE_UNUSED)
12230
1.83k
{
12231
1.83k
  if (ins->modrm.mod != 3)
12232
736
    return BadOp (ins);
12233
12234
  /* Skip mod/rm byte.  */
12235
1.09k
  MODRM_CHECK;
12236
1.09k
  ins->codep++;
12237
1.09k
  ins->has_skipped_modrm = true;
12238
1.09k
  return true;
12239
1.09k
}
12240
12241
static bool
12242
OP_E_memory (instr_info *ins, int bytemode, int sizeflag)
12243
1.41M
{
12244
1.41M
  int add = (ins->rex & REX_B) ? 8 : 0;
12245
1.41M
  int riprel = 0;
12246
1.41M
  int shift;
12247
12248
1.41M
  add += (ins->rex2 & REX_B) ? 16 : 0;
12249
12250
  /* Handles EVEX other than APX EVEX-promoted instructions.  */
12251
1.41M
  if (ins->vex.evex && ins->evex_type == evex_default)
12252
43.7k
    {
12253
12254
      /* Zeroing-masking is invalid for memory destinations. Set the flag
12255
   uniformly, as the consumer will inspect it only for the destination
12256
   operand.  */
12257
43.7k
      if (ins->vex.zeroing)
12258
15.1k
  ins->illegal_masking = true;
12259
12260
43.7k
      switch (bytemode)
12261
43.7k
  {
12262
230
  case dw_mode:
12263
1.10k
  case w_mode:
12264
1.40k
  case w_swap_mode:
12265
1.40k
    shift = 1;
12266
1.40k
    break;
12267
399
  case db_mode:
12268
655
  case b_mode:
12269
655
    shift = 0;
12270
655
    break;
12271
1.10k
  case dq_mode:
12272
1.10k
    if (ins->address_mode != mode_64bit)
12273
347
      {
12274
1.53k
  case d_mode:
12275
1.98k
  case d_swap_mode:
12276
1.98k
        shift = 2;
12277
1.98k
        break;
12278
1.53k
      }
12279
      /* fall through */
12280
2.78k
  case vex_vsib_d_w_dq_mode:
12281
5.27k
  case vex_vsib_q_w_dq_mode:
12282
5.80k
  case evex_x_gscat_mode:
12283
5.80k
    shift = ins->vex.w ? 3 : 2;
12284
5.80k
    break;
12285
3.26k
  case xh_mode:
12286
4.53k
  case evex_half_bcst_xmmqh_mode:
12287
5.36k
  case evex_half_bcst_xmmqdh_mode:
12288
5.36k
    if (ins->vex.b)
12289
3.42k
      {
12290
3.42k
        shift = ins->vex.w ? 2 : 1;
12291
3.42k
        break;
12292
3.42k
      }
12293
    /* Fall through.  */
12294
18.4k
  case x_mode:
12295
19.8k
  case evex_half_bcst_xmmq_mode:
12296
19.8k
    if (ins->vex.b)
12297
8.75k
      {
12298
8.75k
        shift = ins->vex.w ? 3 : 2;
12299
8.75k
        break;
12300
8.75k
      }
12301
    /* Fall through.  */
12302
11.7k
  case xmmqd_mode:
12303
12.6k
  case xmmdw_mode:
12304
13.0k
  case xmmq_mode:
12305
15.0k
  case ymmq_mode:
12306
15.4k
  case evex_x_nobcst_mode:
12307
15.9k
  case x_swap_mode:
12308
15.9k
    switch (ins->vex.length)
12309
15.9k
      {
12310
6.07k
      case 128:
12311
6.07k
        shift = 4;
12312
6.07k
        break;
12313
4.66k
      case 256:
12314
4.66k
        shift = 5;
12315
4.66k
        break;
12316
5.25k
      case 512:
12317
5.25k
        shift = 6;
12318
5.25k
        break;
12319
0
      default:
12320
0
        abort ();
12321
15.9k
      }
12322
    /* Make necessary corrections to shift for modes that need it.  */
12323
15.9k
    if (bytemode == xmmq_mode
12324
15.6k
        || bytemode == evex_half_bcst_xmmqh_mode
12325
15.1k
        || bytemode == evex_half_bcst_xmmq_mode
12326
14.8k
        || (bytemode == ymmq_mode && ins->vex.length == 128))
12327
2.80k
      shift -= 1;
12328
13.1k
    else if (bytemode == xmmqd_mode
12329
12.5k
             || bytemode == evex_half_bcst_xmmqdh_mode)
12330
893
      shift -= 2;
12331
12.2k
    else if (bytemode == xmmdw_mode)
12332
956
      shift -= 3;
12333
15.9k
    break;
12334
570
  case ymm_mode:
12335
570
    shift = 5;
12336
570
    break;
12337
1.12k
  case xmm_mode:
12338
1.12k
    shift = 4;
12339
1.12k
    break;
12340
1.39k
  case q_mode:
12341
2.57k
  case q_swap_mode:
12342
2.57k
    shift = 3;
12343
2.57k
    break;
12344
1.42k
  case bw_unit_mode:
12345
1.42k
    shift = ins->vex.w ? 1 : 0;
12346
1.42k
    break;
12347
0
  default:
12348
0
    abort ();
12349
43.7k
  }
12350
43.7k
    }
12351
1.37M
  else
12352
1.37M
    shift = 0;
12353
12354
1.41M
  USED_REX (REX_B);
12355
1.41M
  if (ins->intel_syntax)
12356
333k
    intel_operand_size (ins, bytemode, sizeflag);
12357
1.41M
  append_seg (ins);
12358
12359
1.41M
  if ((sizeflag & AFLAG) || ins->address_mode == mode_64bit)
12360
1.30M
    {
12361
      /* 32/64 bit address mode */
12362
1.30M
      bfd_vma disp = 0;
12363
1.30M
      int havedisp;
12364
1.30M
      int havebase;
12365
1.30M
      int needindex;
12366
1.30M
      int needaddr32;
12367
1.30M
      int base, rbase;
12368
1.30M
      int vindex = 0;
12369
1.30M
      int scale = 0;
12370
1.30M
      int addr32flag = !((sizeflag & AFLAG)
12371
14.4k
       || bytemode == v_bnd_mode
12372
13.5k
       || bytemode == v_bndmk_mode
12373
13.0k
       || bytemode == bnd_mode
12374
12.4k
       || bytemode == bnd_swap_mode);
12375
1.30M
      bool check_gather = false;
12376
1.30M
      const char (*indexes)[8] = NULL;
12377
12378
1.30M
      havebase = 1;
12379
1.30M
      base = ins->modrm.rm;
12380
12381
1.30M
      if (base == 4)
12382
92.3k
  {
12383
92.3k
    vindex = ins->sib.index;
12384
92.3k
    USED_REX (REX_X);
12385
92.3k
    if (ins->rex & REX_X)
12386
3.87k
      vindex += 8;
12387
92.3k
    switch (bytemode)
12388
92.3k
      {
12389
2.56k
      case vex_vsib_d_w_dq_mode:
12390
4.98k
      case vex_vsib_q_w_dq_mode:
12391
4.98k
        if (!ins->need_vex)
12392
0
    abort ();
12393
4.98k
        if (ins->vex.evex)
12394
3.22k
    {
12395
      /* S/G EVEX insns require EVEX.X4 not to be set.  */
12396
3.22k
      if (ins->rex2 & REX_X)
12397
377
        {
12398
377
          oappend (ins, "(bad)");
12399
377
          return true;
12400
377
        }
12401
12402
2.85k
      if (!ins->vex.v)
12403
2.33k
        vindex += 16;
12404
2.85k
      check_gather = ins->obufp == ins->op_out[1];
12405
2.85k
    }
12406
12407
4.60k
        switch (ins->vex.length)
12408
4.60k
    {
12409
1.21k
    case 128:
12410
1.21k
      indexes = att_names_xmm;
12411
1.21k
      break;
12412
1.92k
    case 256:
12413
1.92k
      if (!ins->vex.w
12414
846
          || bytemode == vex_vsib_q_w_dq_mode)
12415
1.39k
        indexes = att_names_ymm;
12416
532
      else
12417
532
        indexes = att_names_xmm;
12418
1.92k
      break;
12419
1.46k
    case 512:
12420
1.46k
      if (!ins->vex.w
12421
844
          || bytemode == vex_vsib_q_w_dq_mode)
12422
1.07k
        indexes = att_names_zmm;
12423
389
      else
12424
389
        indexes = att_names_ymm;
12425
1.46k
      break;
12426
0
    default:
12427
0
      abort ();
12428
4.60k
    }
12429
4.60k
        break;
12430
87.3k
      default:
12431
87.3k
        if (ins->rex2 & REX_X)
12432
2.41k
    vindex += 16;
12433
12434
87.3k
        if (vindex != 4)
12435
73.4k
    indexes = ins->address_mode == mode_64bit && !addr32flag
12436
73.4k
        ? att_names64 : att_names32;
12437
87.3k
        break;
12438
92.3k
      }
12439
91.9k
    scale = ins->sib.scale;
12440
91.9k
    base = ins->sib.base;
12441
91.9k
    ins->codep++;
12442
91.9k
  }
12443
1.21M
      else
12444
1.21M
  {
12445
    /* Check for mandatory SIB.  */
12446
1.21M
    if (bytemode == vex_vsib_d_w_dq_mode
12447
1.21M
        || bytemode == vex_vsib_q_w_dq_mode
12448
1.21M
        || bytemode == vex_sibmem_mode)
12449
1.97k
      {
12450
1.97k
        oappend (ins, "(bad)");
12451
1.97k
        return true;
12452
1.97k
      }
12453
1.21M
  }
12454
1.30M
      rbase = base + add;
12455
12456
1.30M
      switch (ins->modrm.mod)
12457
1.30M
  {
12458
992k
  case 0:
12459
992k
    if (base == 5)
12460
42.1k
      {
12461
42.1k
        havebase = 0;
12462
42.1k
        if (ins->address_mode == mode_64bit && !ins->has_sib)
12463
30.8k
    riprel = 1;
12464
42.1k
        if (!get32s (ins, &disp))
12465
3.41k
    return false;
12466
38.7k
        if (riprel && bytemode == v_bndmk_mode)
12467
253
    {
12468
253
      oappend (ins, "(bad)");
12469
253
      return true;
12470
253
    }
12471
38.7k
      }
12472
988k
    break;
12473
988k
  case 1:
12474
213k
    if (!get8s (ins, &disp))
12475
6.08k
      return false;
12476
207k
    if (ins->vex.evex && shift > 0)
12477
17.3k
      disp <<= shift;
12478
207k
    break;
12479
100k
  case 2:
12480
100k
    if (!get32s (ins, &disp))
12481
4.54k
      return false;
12482
95.7k
    break;
12483
1.30M
  }
12484
12485
1.29M
      needindex = 0;
12486
1.29M
      needaddr32 = 0;
12487
1.29M
      if (ins->has_sib
12488
90.6k
    && !havebase
12489
6.20k
    && !indexes
12490
2.47k
    && ins->address_mode != mode_16bit)
12491
2.07k
  {
12492
2.07k
    if (ins->address_mode == mode_64bit)
12493
1.73k
      {
12494
1.73k
        if (addr32flag)
12495
519
    {
12496
      /* Without base nor index registers, zero-extend the
12497
         lower 32-bit displacement to 64 bits.  */
12498
519
      disp &= 0xffffffff;
12499
519
      needindex = 1;
12500
519
    }
12501
1.73k
        needaddr32 = 1;
12502
1.73k
      }
12503
335
    else
12504
335
      {
12505
        /* In 32-bit mode, we need index register to tell [offset]
12506
     from [eiz*1 + offset].  */
12507
335
        needindex = 1;
12508
335
      }
12509
2.07k
  }
12510
12511
1.29M
      havedisp = (havebase
12512
38.5k
      || needindex
12513
37.6k
      || (ins->has_sib && (indexes || scale != 0)));
12514
12515
1.29M
      if (!ins->intel_syntax)
12516
986k
  if (ins->modrm.mod != 0 || base == 5)
12517
241k
    {
12518
241k
      if (havedisp || riprel)
12519
238k
        print_displacement (ins, disp);
12520
3.17k
      else
12521
3.17k
        print_operand_value (ins, disp, dis_style_address_offset);
12522
241k
      if (riprel)
12523
22.2k
        {
12524
22.2k
    set_op (ins, disp, true);
12525
22.2k
    oappend_char (ins, '(');
12526
22.2k
    oappend_with_style (ins, !addr32flag ? "%rip" : "%eip",
12527
22.2k
            dis_style_register);
12528
22.2k
    oappend_char (ins, ')');
12529
22.2k
        }
12530
241k
    }
12531
12532
1.29M
      if ((havebase || indexes || needindex || needaddr32 || riprel)
12533
1.28M
    && (ins->address_mode != mode_64bit
12534
1.12M
        || ((bytemode != v_bnd_mode)
12535
1.12M
      && (bytemode != v_bndmk_mode)
12536
1.12M
      && (bytemode != bnd_mode)
12537
1.12M
      && (bytemode != bnd_swap_mode))))
12538
1.28M
  ins->used_prefixes |= PREFIX_ADDR;
12539
12540
1.29M
      if (havedisp || (ins->intel_syntax && riprel))
12541
1.26M
  {
12542
1.26M
    oappend_char (ins, ins->open_char);
12543
1.26M
    if (ins->intel_syntax && riprel)
12544
5.63k
      {
12545
5.63k
        set_op (ins, disp, true);
12546
5.63k
        oappend_with_style (ins, !addr32flag ? "rip" : "eip",
12547
5.63k
          dis_style_register);
12548
5.63k
      }
12549
1.26M
    if (havebase)
12550
1.25M
      oappend_register
12551
1.25M
        (ins,
12552
1.25M
         (ins->address_mode == mode_64bit && !addr32flag
12553
1.25M
    ? att_names64 : att_names32)[rbase]);
12554
1.26M
    if (ins->has_sib)
12555
89.4k
      {
12556
        /* ESP/RSP won't allow index.  If base isn't ESP/RSP,
12557
     print index to tell base + index from base.  */
12558
89.4k
        if (scale != 0
12559
48.4k
      || needindex
12560
47.8k
      || indexes
12561
4.72k
      || (havebase && base != ESP_REG_NUM))
12562
86.6k
    {
12563
86.6k
      if (!ins->intel_syntax || havebase)
12564
85.3k
        oappend_char (ins, ins->separator_char);
12565
86.6k
      if (indexes)
12566
76.8k
        {
12567
76.8k
          if (ins->address_mode == mode_64bit || vindex < 16)
12568
76.5k
      oappend_register (ins, indexes[vindex]);
12569
319
          else
12570
319
      oappend (ins, "(bad)");
12571
76.8k
        }
12572
9.84k
      else
12573
9.84k
        oappend_register (ins,
12574
9.84k
              ins->address_mode == mode_64bit
12575
7.07k
              && !addr32flag
12576
9.84k
              ? att_index64
12577
9.84k
              : att_index32);
12578
12579
86.6k
      oappend_char (ins, ins->scale_char);
12580
86.6k
      oappend_char_with_style (ins, '0' + (1 << scale),
12581
86.6k
             dis_style_immediate);
12582
86.6k
    }
12583
89.4k
      }
12584
1.26M
    if (ins->intel_syntax
12585
302k
        && (disp || ins->modrm.mod != 0 || base == 5))
12586
97.5k
      {
12587
97.5k
        if (!havedisp || (bfd_signed_vma) disp >= 0)
12588
68.4k
      oappend_char (ins, '+');
12589
97.5k
        if (havedisp)
12590
91.8k
    print_displacement (ins, disp);
12591
5.63k
        else
12592
5.63k
    print_operand_value (ins, disp, dis_style_address_offset);
12593
97.5k
      }
12594
12595
1.26M
    oappend_char (ins, ins->close_char);
12596
12597
1.26M
    if (check_gather)
12598
1.71k
      {
12599
        /* Both XMM/YMM/ZMM registers must be distinct.  */
12600
1.71k
        int modrm_reg = ins->modrm.reg;
12601
12602
1.71k
        if (ins->rex & REX_R)
12603
869
          modrm_reg += 8;
12604
1.71k
        if (ins->rex2 & REX_R)
12605
888
          modrm_reg += 16;
12606
1.71k
        if (vindex == modrm_reg)
12607
351
    oappend (ins, "/(bad)");
12608
1.71k
      }
12609
1.26M
  }
12610
27.9k
      else if (ins->intel_syntax)
12611
2.46k
  {
12612
2.46k
    if (ins->modrm.mod != 0 || base == 5)
12613
2.46k
      {
12614
2.46k
        if (!ins->active_seg_prefix)
12615
1.95k
    {
12616
1.95k
      oappend_register (ins, att_names_seg[ds_reg - es_reg]);
12617
1.95k
      oappend (ins, ":");
12618
1.95k
    }
12619
2.46k
        print_operand_value (ins, disp, dis_style_text);
12620
2.46k
      }
12621
2.46k
  }
12622
1.29M
    }
12623
111k
  else if (bytemode == v_bnd_mode
12624
110k
     || bytemode == v_bndmk_mode
12625
110k
     || bytemode == bnd_mode
12626
109k
     || bytemode == bnd_swap_mode
12627
109k
     || bytemode == vex_vsib_d_w_dq_mode
12628
109k
     || bytemode == vex_vsib_q_w_dq_mode)
12629
2.61k
    {
12630
2.61k
      oappend (ins, "(bad)");
12631
2.61k
      return true;
12632
2.61k
    }
12633
108k
  else
12634
108k
    {
12635
      /* 16 bit address mode */
12636
108k
      bfd_vma disp = 0;
12637
12638
108k
      ins->used_prefixes |= ins->prefixes & PREFIX_ADDR;
12639
108k
      switch (ins->modrm.mod)
12640
108k
  {
12641
80.8k
  case 0:
12642
80.8k
    if (ins->modrm.rm == 6)
12643
4.34k
      {
12644
14.0k
  case 2:
12645
14.0k
        if (!get16s (ins, &disp))
12646
666
    return false;
12647
14.0k
      }
12648
89.8k
    break;
12649
89.8k
  case 1:
12650
17.9k
    if (!get8s (ins, &disp))
12651
694
      return false;
12652
17.2k
    if (ins->vex.evex && shift > 0)
12653
576
      disp <<= shift;
12654
17.2k
    break;
12655
108k
  }
12656
12657
107k
      if (!ins->intel_syntax)
12658
90.0k
  if (ins->modrm.mod != 0 || ins->modrm.rm == 6)
12659
23.7k
    print_displacement (ins, disp);
12660
12661
107k
      if (ins->modrm.mod != 0 || ins->modrm.rm != 6)
12662
102k
  {
12663
102k
    oappend_char (ins, ins->open_char);
12664
102k
    oappend (ins, ins->intel_syntax ? intel_index16[ins->modrm.rm]
12665
102k
            : att_index16[ins->modrm.rm]);
12666
102k
    if (ins->intel_syntax
12667
15.8k
        && (disp || ins->modrm.mod != 0 || ins->modrm.rm == 6))
12668
5.61k
      {
12669
5.61k
        if ((bfd_signed_vma) disp >= 0)
12670
3.16k
    oappend_char (ins, '+');
12671
5.61k
        print_displacement (ins, disp);
12672
5.61k
      }
12673
12674
102k
    oappend_char (ins, ins->close_char);
12675
102k
  }
12676
4.23k
      else if (ins->intel_syntax)
12677
1.25k
  {
12678
1.25k
    if (!ins->active_seg_prefix)
12679
711
      {
12680
711
        oappend_register (ins, att_names_seg[ds_reg - es_reg]);
12681
711
        oappend (ins, ":");
12682
711
      }
12683
1.25k
    print_operand_value (ins, disp & 0xffff, dis_style_text);
12684
1.25k
  }
12685
107k
    }
12686
1.39M
  if (ins->vex.b && ins->evex_type == evex_default)
12687
18.2k
    {
12688
18.2k
      ins->evex_used |= EVEX_b_used;
12689
12690
      /* Broadcast can only ever be valid for memory sources.  */
12691
18.2k
      if (ins->obufp == ins->op_out[0])
12692
0
  ins->vex.no_broadcast = true;
12693
12694
18.2k
      if (!ins->vex.no_broadcast
12695
15.5k
    && (!ins->intel_syntax || !(ins->evex_used & EVEX_len_used)))
12696
12.9k
  {
12697
12.9k
    if (bytemode == xh_mode)
12698
1.62k
      {
12699
1.62k
        switch (ins->vex.length)
12700
1.62k
    {
12701
386
    case 128:
12702
386
      oappend (ins, "{1to8}");
12703
386
      break;
12704
904
    case 256:
12705
904
      oappend (ins, "{1to16}");
12706
904
      break;
12707
339
    case 512:
12708
339
      oappend (ins, "{1to32}");
12709
339
      break;
12710
0
    default:
12711
0
      abort ();
12712
1.62k
    }
12713
1.62k
      }
12714
11.3k
    else if (bytemode == q_mode
12715
10.8k
       || bytemode == ymmq_mode)
12716
1.54k
      ins->vex.no_broadcast = true;
12717
9.76k
    else if (ins->vex.w
12718
3.97k
       || bytemode == evex_half_bcst_xmmqdh_mode
12719
3.70k
       || bytemode == evex_half_bcst_xmmq_mode)
12720
6.63k
      {
12721
6.63k
        switch (ins->vex.length)
12722
6.63k
    {
12723
1.74k
    case 128:
12724
1.74k
      oappend (ins, "{1to2}");
12725
1.74k
      break;
12726
1.30k
    case 256:
12727
1.30k
      oappend (ins, "{1to4}");
12728
1.30k
      break;
12729
3.58k
    case 512:
12730
3.58k
      oappend (ins, "{1to8}");
12731
3.58k
      break;
12732
0
    default:
12733
0
      abort ();
12734
6.63k
    }
12735
6.63k
      }
12736
3.13k
    else if (bytemode == x_mode
12737
1.65k
       || bytemode == evex_half_bcst_xmmqh_mode)
12738
1.95k
      {
12739
1.95k
        switch (ins->vex.length)
12740
1.95k
    {
12741
594
    case 128:
12742
594
      oappend (ins, "{1to4}");
12743
594
      break;
12744
665
    case 256:
12745
665
      oappend (ins, "{1to8}");
12746
665
      break;
12747
698
    case 512:
12748
698
      oappend (ins, "{1to16}");
12749
698
      break;
12750
0
    default:
12751
0
      abort ();
12752
1.95k
    }
12753
1.95k
      }
12754
1.17k
    else
12755
1.17k
      ins->vex.no_broadcast = true;
12756
12.9k
  }
12757
18.2k
      if (ins->vex.no_broadcast)
12758
5.48k
  oappend (ins, "{bad}");
12759
18.2k
    }
12760
12761
1.39M
  return true;
12762
1.39M
}
12763
12764
static bool
12765
OP_E (instr_info *ins, int bytemode, int sizeflag)
12766
1.54M
{
12767
  /* Skip mod/rm byte.  */
12768
1.54M
  MODRM_CHECK;
12769
1.54M
  if (!ins->has_skipped_modrm)
12770
1.54M
    {
12771
1.54M
      ins->codep++;
12772
1.54M
      ins->has_skipped_modrm = true;
12773
1.54M
    }
12774
12775
1.54M
  if (ins->modrm.mod == 3)
12776
223k
    {
12777
223k
      if ((sizeflag & SUFFIX_ALWAYS)
12778
5.79k
    && (bytemode == b_swap_mode
12779
5.52k
        || bytemode == bnd_swap_mode
12780
5.33k
        || bytemode == v_swap_mode))
12781
932
  swap_operand (ins);
12782
12783
223k
      print_register (ins, ins->modrm.rm, REX_B, bytemode, sizeflag);
12784
223k
      return true;
12785
223k
    }
12786
12787
  /* Masking is invalid for insns with GPR-like memory destination. Set the
12788
     flag uniformly, as the consumer will inspect it only for the destination
12789
     operand.  */
12790
1.32M
  if (ins->vex.mask_register_specifier)
12791
5.33k
    ins->illegal_masking = true;
12792
12793
1.32M
  return OP_E_memory (ins, bytemode, sizeflag);
12794
1.54M
}
12795
12796
static bool
12797
OP_indirE (instr_info *ins, int bytemode, int sizeflag)
12798
46.0k
{
12799
46.0k
  if (ins->modrm.mod == 3 && bytemode == f_mode)
12800
    /* bad lcall/ljmp */
12801
3.25k
    return BadOp (ins);
12802
42.8k
  if (!ins->intel_syntax)
12803
26.1k
    oappend (ins, "*");
12804
42.8k
  return OP_E (ins, bytemode, sizeflag);
12805
46.0k
}
12806
12807
static bool
12808
OP_G (instr_info *ins, int bytemode, int sizeflag)
12809
1.31M
{
12810
1.31M
  print_register (ins, ins->modrm.reg, REX_R, bytemode, sizeflag);
12811
1.31M
  return true;
12812
1.31M
}
12813
12814
static bool
12815
OP_REG (instr_info *ins, int code, int sizeflag)
12816
352k
{
12817
352k
  const char *s;
12818
352k
  int add = 0;
12819
12820
352k
  switch (code)
12821
352k
    {
12822
9.46k
    case es_reg: case ss_reg: case cs_reg:
12823
13.4k
    case ds_reg: case fs_reg: case gs_reg:
12824
13.4k
      oappend_register (ins, att_names_seg[code - es_reg]);
12825
13.4k
      return true;
12826
352k
    }
12827
12828
338k
  USED_REX (REX_B);
12829
338k
  if (ins->rex & REX_B)
12830
12.6k
    add = 8;
12831
338k
  if (ins->rex2 & REX_B)
12832
997
    add += 16;
12833
12834
338k
  switch (code)
12835
338k
    {
12836
0
    case ax_reg: case cx_reg: case dx_reg: case bx_reg:
12837
0
    case sp_reg: case bp_reg: case si_reg: case di_reg:
12838
0
      s = att_names16[code - ax_reg + add];
12839
0
      break;
12840
19.6k
    case ah_reg: case ch_reg: case dh_reg: case bh_reg:
12841
19.6k
      USED_REX (0);
12842
      /* Fall through.  */
12843
35.0k
    case al_reg: case cl_reg: case dl_reg: case bl_reg:
12844
35.0k
      if (ins->rex)
12845
2.02k
  s = att_names8rex[code - al_reg + add];
12846
33.0k
      else
12847
33.0k
  s = att_names8[code - al_reg];
12848
35.0k
      break;
12849
79.1k
    case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
12850
148k
    case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
12851
148k
      if (ins->address_mode == mode_64bit
12852
117k
    && ((sizeflag & DFLAG) || (ins->rex & REX_W)))
12853
116k
  {
12854
116k
    s = att_names64[code - rAX_reg + add];
12855
116k
    break;
12856
116k
  }
12857
31.7k
      code += eAX_reg - rAX_reg;
12858
      /* Fall through.  */
12859
127k
    case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
12860
187k
    case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
12861
187k
      USED_REX (REX_W);
12862
187k
      if (ins->rex & REX_W)
12863
2.13k
  s = att_names64[code - eAX_reg + add];
12864
185k
      else
12865
185k
  {
12866
185k
    if (sizeflag & DFLAG)
12867
146k
      s = att_names32[code - eAX_reg + add];
12868
38.8k
    else
12869
38.8k
      s = att_names16[code - eAX_reg + add];
12870
185k
    ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12871
185k
  }
12872
187k
      break;
12873
0
    default:
12874
0
      oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
12875
0
      return true;
12876
338k
    }
12877
338k
  oappend_register (ins, s);
12878
338k
  return true;
12879
338k
}
12880
12881
static bool
12882
OP_IMREG (instr_info *ins, int code, int sizeflag)
12883
462k
{
12884
462k
  const char *s;
12885
12886
462k
  switch (code)
12887
462k
    {
12888
112k
    case indir_dx_reg:
12889
112k
      if (!ins->intel_syntax)
12890
69.5k
  {
12891
69.5k
    oappend (ins, "(%dx)");
12892
69.5k
    return true;
12893
69.5k
  }
12894
43.1k
      s = att_names16[dx_reg - ax_reg];
12895
43.1k
      break;
12896
149k
    case al_reg: case cl_reg:
12897
149k
      s = att_names8[code - al_reg];
12898
149k
      break;
12899
168k
    case eAX_reg:
12900
168k
      USED_REX (REX_W);
12901
168k
      if (ins->rex & REX_W)
12902
3.35k
  {
12903
3.35k
    s = *att_names64;
12904
3.35k
    break;
12905
3.35k
  }
12906
      /* Fall through.  */
12907
196k
    case z_mode_ax_reg:
12908
196k
      if ((ins->rex & REX_W) || (sizeflag & DFLAG))
12909
178k
  s = *att_names32;
12910
17.7k
      else
12911
17.7k
  s = *att_names16;
12912
196k
      if (!(ins->rex & REX_W))
12913
195k
  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12914
196k
      break;
12915
0
    default:
12916
0
      oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
12917
0
      return true;
12918
462k
    }
12919
392k
  oappend_register (ins, s);
12920
392k
  return true;
12921
462k
}
12922
12923
static bool
12924
OP_I (instr_info *ins, int bytemode, int sizeflag)
12925
371k
{
12926
371k
  bfd_vma op;
12927
12928
371k
  switch (bytemode)
12929
371k
    {
12930
223k
    case b_mode:
12931
223k
      if (!fetch_code (ins->info, ins->codep + 1))
12932
5.25k
  return false;
12933
218k
      op = *ins->codep++;
12934
218k
      break;
12935
124k
    case v_mode:
12936
124k
      USED_REX (REX_W);
12937
124k
      if (ins->rex & REX_W)
12938
3.62k
  {
12939
3.62k
    if (!get32s (ins, &op))
12940
986
      return false;
12941
3.62k
  }
12942
121k
      else
12943
121k
  {
12944
121k
    ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12945
121k
    if (sizeflag & DFLAG)
12946
108k
      {
12947
110k
    case d_mode:
12948
110k
        if (!get32 (ins, &op))
12949
3.48k
    return false;
12950
110k
      }
12951
12.3k
    else
12952
12.3k
      {
12953
        /* Fall through.  */
12954
23.9k
    case w_mode:
12955
23.9k
        if (!get16 (ins, &op))
12956
1.01k
    return false;
12957
23.9k
      }
12958
121k
  }
12959
132k
      break;
12960
132k
    case const_1_mode:
12961
9.85k
      if (ins->intel_syntax)
12962
3.48k
  oappend_with_style (ins, "1", dis_style_immediate);
12963
6.37k
      else
12964
6.37k
  oappend_with_style (ins, "$1", dis_style_immediate);
12965
9.85k
      return true;
12966
0
    default:
12967
0
      oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
12968
0
      return true;
12969
371k
    }
12970
12971
350k
  oappend_immediate (ins, op);
12972
350k
  return true;
12973
371k
}
12974
12975
static bool
12976
OP_I64 (instr_info *ins, int bytemode, int sizeflag)
12977
40.4k
{
12978
40.4k
  uint64_t op;
12979
12980
40.4k
  if (bytemode != v_mode || ins->address_mode != mode_64bit
12981
32.4k
      || !(ins->rex & REX_W))
12982
39.2k
    return OP_I (ins, bytemode, sizeflag);
12983
12984
1.19k
  USED_REX (REX_W);
12985
12986
1.19k
  if (!get64 (ins, &op))
12987
209
    return false;
12988
12989
981
  oappend_immediate (ins, op);
12990
981
  return true;
12991
1.19k
}
12992
12993
static bool
12994
OP_sI (instr_info *ins, int bytemode, int sizeflag)
12995
43.5k
{
12996
43.5k
  bfd_vma op;
12997
12998
43.5k
  switch (bytemode)
12999
43.5k
    {
13000
17.9k
    case b_mode:
13001
26.1k
    case b_T_mode:
13002
26.1k
      if (!get8s (ins, &op))
13003
1.11k
  return false;
13004
25.0k
      if (bytemode == b_T_mode)
13005
8.04k
  {
13006
8.04k
    if (ins->address_mode != mode_64bit
13007
5.90k
        || !((sizeflag & DFLAG) || (ins->rex & REX_W)))
13008
2.98k
      {
13009
        /* The operand-size prefix is overridden by a REX prefix.  */
13010
2.98k
        if ((sizeflag & DFLAG) || (ins->rex & REX_W))
13011
1.39k
    op &= 0xffffffff;
13012
1.59k
        else
13013
1.59k
    op &= 0xffff;
13014
2.98k
    }
13015
8.04k
  }
13016
16.9k
      else
13017
16.9k
  {
13018
16.9k
    if (!(ins->rex & REX_W))
13019
10.7k
      {
13020
10.7k
        if (sizeflag & DFLAG)
13021
9.27k
    op &= 0xffffffff;
13022
1.51k
        else
13023
1.51k
    op &= 0xffff;
13024
10.7k
      }
13025
16.9k
  }
13026
25.0k
      break;
13027
17.4k
    case v_mode:
13028
      /* The operand-size prefix is overridden by a REX prefix.  */
13029
17.4k
      if (!(sizeflag & DFLAG) && !(ins->rex & REX_W))
13030
1.17k
  {
13031
1.17k
    if (!get16 (ins, &op))
13032
134
      return false;
13033
1.17k
  }
13034
16.2k
      else if (!get32s (ins, &op))
13035
287
  return false;
13036
16.9k
      break;
13037
16.9k
    default:
13038
0
      oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
13039
0
      return true;
13040
43.5k
    }
13041
13042
42.0k
  oappend_immediate (ins, op);
13043
42.0k
  return true;
13044
43.5k
}
13045
13046
static bool
13047
OP_J (instr_info *ins, int bytemode, int sizeflag)
13048
228k
{
13049
228k
  bfd_vma disp;
13050
228k
  bfd_vma mask = -1;
13051
228k
  bfd_vma segment = 0;
13052
13053
228k
  switch (bytemode)
13054
228k
    {
13055
203k
    case b_mode:
13056
203k
      if (!get8s (ins, &disp))
13057
1.42k
  return false;
13058
201k
      break;
13059
201k
    case v_mode:
13060
24.8k
    case dqw_mode:
13061
24.8k
      if ((sizeflag & DFLAG)
13062
2.79k
    || (ins->address_mode == mode_64bit
13063
1.70k
        && ((ins->isa64 == intel64 && bytemode != dqw_mode)
13064
1.50k
      || (ins->rex & REX_W))))
13065
22.5k
  {
13066
22.5k
    if (!get32s (ins, &disp))
13067
649
      return false;
13068
22.5k
  }
13069
2.27k
      else
13070
2.27k
  {
13071
2.27k
    if (!get16s (ins, &disp))
13072
404
      return false;
13073
    /* In 16bit mode, address is wrapped around at 64k within
13074
       the same segment.  Otherwise, a data16 prefix on a jump
13075
       instruction means that the pc is masked to 16 bits after
13076
       the displacement is added!  */
13077
1.87k
    mask = 0xffff;
13078
1.87k
    if ((ins->prefixes & PREFIX_DATA) == 0)
13079
1.49k
      segment = ((ins->start_pc + (ins->codep - ins->start_codep))
13080
1.49k
           & ~((bfd_vma) 0xffff));
13081
1.87k
  }
13082
23.7k
      if (ins->address_mode != mode_64bit
13083
19.7k
    || (ins->isa64 != intel64 && !(ins->rex & REX_W)))
13084
22.1k
  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13085
23.7k
      break;
13086
0
    default:
13087
0
      oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
13088
0
      return true;
13089
228k
    }
13090
225k
  disp = ((ins->start_pc + (ins->codep - ins->start_codep) + disp) & mask)
13091
225k
   | segment;
13092
225k
  set_op (ins, disp, false);
13093
225k
  print_operand_value (ins, disp, dis_style_text);
13094
225k
  return true;
13095
228k
}
13096
13097
static bool
13098
OP_SEG (instr_info *ins, int bytemode, int sizeflag)
13099
26.3k
{
13100
26.3k
  if (bytemode == w_mode)
13101
10.2k
    {
13102
10.2k
      oappend_register (ins, att_names_seg[ins->modrm.reg]);
13103
10.2k
      return true;
13104
10.2k
    }
13105
16.1k
  return OP_E (ins, ins->modrm.mod == 3 ? bytemode : w_mode, sizeflag);
13106
26.3k
}
13107
13108
static bool
13109
OP_DIR (instr_info *ins, int dummy ATTRIBUTE_UNUSED, int sizeflag)
13110
2.97k
{
13111
2.97k
  bfd_vma seg, offset;
13112
2.97k
  int res;
13113
2.97k
  char scratch[24];
13114
13115
2.97k
  if (sizeflag & DFLAG)
13116
1.55k
    {
13117
1.55k
      if (!get32 (ins, &offset))
13118
1.42k
  return false;;
13119
1.42k
    }
13120
1.42k
  else if (!get16 (ins, &offset))
13121
130
    return false;
13122
2.71k
  if (!get16 (ins, &seg))
13123
2.33k
    return false;;
13124
2.33k
  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13125
13126
2.33k
  res = snprintf (scratch, ARRAY_SIZE (scratch),
13127
2.33k
      ins->intel_syntax ? "0x%x:0x%x" : "$0x%x,$0x%x",
13128
2.33k
      (unsigned) seg, (unsigned) offset);
13129
2.33k
  if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
13130
0
    abort ();
13131
2.33k
  oappend (ins, scratch);
13132
2.33k
  return true;
13133
2.33k
}
13134
13135
static bool
13136
OP_OFF (instr_info *ins, int bytemode, int sizeflag)
13137
9.41k
{
13138
9.41k
  bfd_vma off;
13139
13140
9.41k
  if (ins->intel_syntax && (sizeflag & SUFFIX_ALWAYS))
13141
604
    intel_operand_size (ins, bytemode, sizeflag);
13142
9.41k
  append_seg (ins);
13143
13144
9.41k
  if ((sizeflag & AFLAG) || ins->address_mode == mode_64bit)
13145
5.89k
    {
13146
5.89k
      if (!get32 (ins, &off))
13147
662
  return false;
13148
5.89k
    }
13149
3.51k
  else
13150
3.51k
    {
13151
3.51k
      if (!get16 (ins, &off))
13152
297
  return false;
13153
3.51k
    }
13154
13155
8.45k
  if (ins->intel_syntax)
13156
3.82k
    {
13157
3.82k
      if (!ins->active_seg_prefix)
13158
3.35k
  {
13159
3.35k
    oappend_register (ins, att_names_seg[ds_reg - es_reg]);
13160
3.35k
    oappend (ins, ":");
13161
3.35k
  }
13162
3.82k
    }
13163
8.45k
  print_operand_value (ins, off, dis_style_address_offset);
13164
8.45k
  return true;
13165
9.41k
}
13166
13167
static bool
13168
OP_OFF64 (instr_info *ins, int bytemode, int sizeflag)
13169
26.4k
{
13170
26.4k
  uint64_t off;
13171
13172
26.4k
  if (ins->address_mode != mode_64bit
13173
18.3k
      || (ins->prefixes & PREFIX_ADDR))
13174
9.41k
    return OP_OFF (ins, bytemode, sizeflag);
13175
13176
17.0k
  if (ins->intel_syntax && (sizeflag & SUFFIX_ALWAYS))
13177
414
    intel_operand_size (ins, bytemode, sizeflag);
13178
17.0k
  append_seg (ins);
13179
13180
17.0k
  if (!get64 (ins, &off))
13181
1.00k
    return false;
13182
13183
16.0k
  if (ins->intel_syntax)
13184
5.37k
    {
13185
5.37k
      if (!ins->active_seg_prefix)
13186
4.69k
  {
13187
4.69k
    oappend_register (ins, att_names_seg[ds_reg - es_reg]);
13188
4.69k
    oappend (ins, ":");
13189
4.69k
  }
13190
5.37k
    }
13191
16.0k
  print_operand_value (ins, off, dis_style_address_offset);
13192
16.0k
  return true;
13193
17.0k
}
13194
13195
static void
13196
ptr_reg (instr_info *ins, int code, int sizeflag)
13197
246k
{
13198
246k
  const char *s;
13199
13200
246k
  *ins->obufp++ = ins->open_char;
13201
246k
  ins->used_prefixes |= (ins->prefixes & PREFIX_ADDR);
13202
246k
  if (ins->address_mode == mode_64bit)
13203
212k
    {
13204
212k
      if (!(sizeflag & AFLAG))
13205
3.34k
  s = att_names32[code - eAX_reg];
13206
209k
      else
13207
209k
  s = att_names64[code - eAX_reg];
13208
212k
    }
13209
33.8k
  else if (sizeflag & AFLAG)
13210
20.1k
    s = att_names32[code - eAX_reg];
13211
13.7k
  else
13212
13.7k
    s = att_names16[code - eAX_reg];
13213
246k
  oappend_register (ins, s);
13214
246k
  oappend_char (ins, ins->close_char);
13215
246k
}
13216
13217
static bool
13218
OP_ESreg (instr_info *ins, int code, int sizeflag)
13219
130k
{
13220
130k
  if (ins->intel_syntax)
13221
57.0k
    {
13222
57.0k
      switch (ins->codep[-1])
13223
57.0k
  {
13224
7.08k
  case 0x6d:  /* insw/insl */
13225
7.08k
    intel_operand_size (ins, z_mode, sizeflag);
13226
7.08k
    break;
13227
1.87k
  case 0xa5:  /* movsw/movsl/movsq */
13228
4.81k
  case 0xa7:  /* cmpsw/cmpsl/cmpsq */
13229
6.34k
  case 0xab:  /* stosw/stosl */
13230
7.83k
  case 0xaf:  /* scasw/scasl */
13231
7.83k
    intel_operand_size (ins, v_mode, sizeflag);
13232
7.83k
    break;
13233
42.1k
  default:
13234
42.1k
    intel_operand_size (ins, b_mode, sizeflag);
13235
57.0k
  }
13236
57.0k
    }
13237
130k
  if (ins->address_mode != mode_64bit)
13238
16.9k
    {
13239
16.9k
      oappend_register (ins, att_names_seg[0]);
13240
16.9k
      oappend_char (ins, ':');
13241
16.9k
    }
13242
130k
  ptr_reg (ins, code, sizeflag);
13243
130k
  return true;
13244
130k
}
13245
13246
static bool
13247
OP_DSreg (instr_info *ins, int code, int sizeflag)
13248
115k
{
13249
115k
  if (ins->intel_syntax)
13250
44.4k
    {
13251
44.4k
      switch (ins->codep[-1])
13252
44.4k
  {
13253
192
  case 0x01:  /* rmpupdate/rmpread */
13254
192
    break;
13255
5.54k
  case 0x6f:  /* outsw/outsl */
13256
5.54k
    intel_operand_size (ins, z_mode, sizeflag);
13257
5.54k
    break;
13258
1.87k
  case 0xa5:  /* movsw/movsl/movsq */
13259
4.81k
  case 0xa7:  /* cmpsw/cmpsl/cmpsq */
13260
7.12k
  case 0xad:  /* lodsw/lodsl/lodsq */
13261
7.12k
    intel_operand_size (ins, v_mode, sizeflag);
13262
7.12k
    break;
13263
31.5k
  default:
13264
31.5k
    intel_operand_size (ins, b_mode, sizeflag);
13265
44.4k
  }
13266
44.4k
    }
13267
  /* Outside of 64-bit mode set ins->active_seg_prefix to PREFIX_DS if it
13268
     is unset, so that the default segment register DS is printed.  */
13269
115k
  if (ins->address_mode != mode_64bit && !ins->active_seg_prefix)
13270
15.8k
    ins->active_seg_prefix = PREFIX_DS;
13271
115k
  append_seg (ins);
13272
115k
  ptr_reg (ins, code, sizeflag);
13273
115k
  return true;
13274
115k
}
13275
13276
static bool
13277
OP_C (instr_info *ins, int dummy ATTRIBUTE_UNUSED,
13278
      int sizeflag ATTRIBUTE_UNUSED)
13279
2.39k
{
13280
2.39k
  int add, res;
13281
2.39k
  char scratch[8];
13282
13283
2.39k
  if (ins->rex & REX_R)
13284
710
    {
13285
710
      USED_REX (REX_R);
13286
710
      add = 8;
13287
710
    }
13288
1.68k
  else if (ins->address_mode != mode_64bit && (ins->prefixes & PREFIX_LOCK))
13289
237
    {
13290
237
      ins->all_prefixes[ins->last_lock_prefix] = 0;
13291
237
      ins->used_prefixes |= PREFIX_LOCK;
13292
237
      add = 8;
13293
237
    }
13294
1.44k
  else
13295
1.44k
    add = 0;
13296
2.39k
  res = snprintf (scratch, ARRAY_SIZE (scratch), "%%cr%d",
13297
2.39k
      ins->modrm.reg + add);
13298
2.39k
  if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
13299
0
    abort ();
13300
2.39k
  oappend_register (ins, scratch);
13301
2.39k
  return true;
13302
2.39k
}
13303
13304
static bool
13305
OP_D (instr_info *ins, int dummy ATTRIBUTE_UNUSED,
13306
      int sizeflag ATTRIBUTE_UNUSED)
13307
1.53k
{
13308
1.53k
  int add, res;
13309
1.53k
  char scratch[8];
13310
13311
1.53k
  USED_REX (REX_R);
13312
1.53k
  if (ins->rex & REX_R)
13313
539
    add = 8;
13314
991
  else
13315
991
    add = 0;
13316
1.53k
  res = snprintf (scratch, ARRAY_SIZE (scratch),
13317
1.53k
      ins->intel_syntax ? "dr%d" : "%%db%d",
13318
1.53k
      ins->modrm.reg + add);
13319
1.53k
  if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
13320
0
    abort ();
13321
1.53k
  oappend (ins, scratch);
13322
1.53k
  return true;
13323
1.53k
}
13324
13325
static bool
13326
OP_T (instr_info *ins, int dummy ATTRIBUTE_UNUSED,
13327
      int sizeflag ATTRIBUTE_UNUSED)
13328
559
{
13329
559
  int res;
13330
559
  char scratch[8];
13331
13332
559
  res = snprintf (scratch, ARRAY_SIZE (scratch), "%%tr%d", ins->modrm.reg);
13333
559
  if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
13334
0
    abort ();
13335
559
  oappend_register (ins, scratch);
13336
559
  return true;
13337
559
}
13338
13339
static bool
13340
OP_MMX (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13341
  int sizeflag ATTRIBUTE_UNUSED)
13342
32.8k
{
13343
32.8k
  int reg = ins->modrm.reg;
13344
32.8k
  const char (*names)[8];
13345
13346
32.8k
  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13347
32.8k
  if (ins->prefixes & PREFIX_DATA)
13348
2.01k
    {
13349
2.01k
      names = att_names_xmm;
13350
2.01k
      USED_REX (REX_R);
13351
2.01k
      if (ins->rex & REX_R)
13352
1.24k
  reg += 8;
13353
2.01k
    }
13354
30.8k
  else
13355
30.8k
    names = att_names_mm;
13356
32.8k
  oappend_register (ins, names[reg]);
13357
32.8k
  return true;
13358
32.8k
}
13359
13360
static void
13361
print_vector_reg (instr_info *ins, unsigned int reg, int bytemode)
13362
109k
{
13363
109k
  const char (*names)[8];
13364
13365
109k
  if (bytemode == xmmq_mode
13366
105k
      || bytemode == evex_half_bcst_xmmqh_mode
13367
105k
      || bytemode == evex_half_bcst_xmmq_mode)
13368
5.52k
    {
13369
5.52k
      switch (ins->vex.length)
13370
5.52k
  {
13371
1.13k
  case 0:
13372
2.10k
  case 128:
13373
3.23k
  case 256:
13374
3.23k
    names = att_names_xmm;
13375
3.23k
    break;
13376
2.29k
  case 512:
13377
2.29k
    names = att_names_ymm;
13378
2.29k
    ins->evex_used |= EVEX_len_used;
13379
2.29k
    break;
13380
0
  default:
13381
0
    abort ();
13382
5.52k
  }
13383
5.52k
    }
13384
104k
  else if (bytemode == ymm_mode)
13385
379
    names = att_names_ymm;
13386
103k
  else if (bytemode == tmm_mode)
13387
4.77k
    {
13388
4.77k
      if (reg >= 8)
13389
2.71k
  {
13390
2.71k
    oappend (ins, "(bad)");
13391
2.71k
    return;
13392
2.71k
  }
13393
2.06k
      names = att_names_tmm;
13394
2.06k
    }
13395
99.1k
  else if (ins->need_vex
13396
81.5k
     && bytemode != xmm_mode
13397
79.9k
     && bytemode != scalar_mode
13398
69.5k
     && bytemode != xmmdw_mode
13399
69.2k
     && bytemode != xmmqd_mode
13400
68.8k
     && bytemode != evex_half_bcst_xmmqdh_mode
13401
68.5k
     && bytemode != w_swap_mode
13402
68.0k
     && bytemode != b_mode
13403
67.4k
     && bytemode != w_mode
13404
67.0k
     && bytemode != d_mode
13405
65.8k
     && bytemode != q_mode)
13406
65.0k
    {
13407
65.0k
      ins->evex_used |= EVEX_len_used;
13408
65.0k
      switch (ins->vex.length)
13409
65.0k
  {
13410
28.2k
  case 128:
13411
28.2k
    names = att_names_xmm;
13412
28.2k
    break;
13413
18.1k
  case 256:
13414
18.1k
    if (ins->vex.w
13415
10.8k
        || bytemode != vex_vsib_q_w_dq_mode)
13416
16.7k
      names = att_names_ymm;
13417
1.35k
    else
13418
1.35k
      names = att_names_xmm;
13419
18.1k
    break;
13420
18.6k
  case 512:
13421
18.6k
    if (ins->vex.w
13422
10.1k
        || bytemode != vex_vsib_q_w_dq_mode)
13423
17.6k
      names = att_names_zmm;
13424
995
    else
13425
995
      names = att_names_ymm;
13426
18.6k
    break;
13427
0
  default:
13428
0
    abort ();
13429
65.0k
  }
13430
65.0k
    }
13431
34.0k
  else
13432
34.0k
    names = att_names_xmm;
13433
107k
  oappend_register (ins, names[reg]);
13434
107k
}
13435
13436
static bool
13437
OP_XMM (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13438
86.6k
{
13439
86.6k
  unsigned int reg = ins->modrm.reg;
13440
13441
86.6k
  USED_REX (REX_R);
13442
86.6k
  if (ins->rex & REX_R)
13443
40.2k
    reg += 8;
13444
86.6k
  if (ins->vex.evex)
13445
44.2k
    {
13446
44.2k
      if (ins->rex2 & REX_R)
13447
22.2k
  reg += 16;
13448
44.2k
    }
13449
13450
86.6k
  if (bytemode == tmm_mode)
13451
3.07k
    ins->modrm.reg = reg;
13452
83.5k
  else if (bytemode == scalar_mode)
13453
12.2k
    ins->vex.no_broadcast = true;
13454
13455
86.6k
  print_vector_reg (ins, reg, bytemode);
13456
86.6k
  return true;
13457
86.6k
}
13458
13459
static bool
13460
OP_EM (instr_info *ins, int bytemode, int sizeflag)
13461
32.0k
{
13462
32.0k
  int reg;
13463
32.0k
  const char (*names)[8];
13464
13465
32.0k
  if (ins->modrm.mod != 3)
13466
21.2k
    {
13467
21.2k
      if (ins->intel_syntax
13468
9.26k
    && (bytemode == v_mode || bytemode == v_swap_mode))
13469
8.76k
  {
13470
8.76k
    bytemode = (ins->prefixes & PREFIX_DATA) ? x_mode : q_mode;
13471
8.76k
    ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13472
8.76k
  }
13473
21.2k
      return OP_E (ins, bytemode, sizeflag);
13474
21.2k
    }
13475
13476
10.7k
  if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
13477
190
    swap_operand (ins);
13478
13479
  /* Skip mod/rm byte.  */
13480
10.7k
  MODRM_CHECK;
13481
10.7k
  ins->codep++;
13482
10.7k
  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13483
10.7k
  reg = ins->modrm.rm;
13484
10.7k
  if (ins->prefixes & PREFIX_DATA)
13485
1.13k
    {
13486
1.13k
      names = att_names_xmm;
13487
1.13k
      USED_REX (REX_B);
13488
1.13k
      if (ins->rex & REX_B)
13489
899
  reg += 8;
13490
1.13k
    }
13491
9.62k
  else
13492
9.62k
    names = att_names_mm;
13493
10.7k
  oappend_register (ins, names[reg]);
13494
10.7k
  return true;
13495
10.7k
}
13496
13497
/* cvt* are the only instructions in sse2 which have
13498
   both SSE and MMX operands and also have 0x66 prefix
13499
   in their opcode. 0x66 was originally used to differentiate
13500
   between SSE and MMX instruction(operands). So we have to handle the
13501
   cvt* separately using OP_EMC and OP_MXC */
13502
static bool
13503
OP_EMC (instr_info *ins, int bytemode, int sizeflag)
13504
1.25k
{
13505
1.25k
  if (ins->modrm.mod != 3)
13506
719
    {
13507
719
      if (ins->intel_syntax && bytemode == v_mode)
13508
0
  {
13509
0
    bytemode = (ins->prefixes & PREFIX_DATA) ? x_mode : q_mode;
13510
0
    ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13511
0
  }
13512
719
      return OP_E (ins, bytemode, sizeflag);
13513
719
    }
13514
13515
  /* Skip mod/rm byte.  */
13516
538
  MODRM_CHECK;
13517
538
  ins->codep++;
13518
538
  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13519
538
  oappend_register (ins, att_names_mm[ins->modrm.rm]);
13520
538
  return true;
13521
538
}
13522
13523
static bool
13524
OP_MXC (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13525
  int sizeflag ATTRIBUTE_UNUSED)
13526
347
{
13527
347
  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13528
347
  oappend_register (ins, att_names_mm[ins->modrm.reg]);
13529
347
  return true;
13530
347
}
13531
13532
static bool
13533
OP_EX (instr_info *ins, int bytemode, int sizeflag)
13534
79.7k
{
13535
79.7k
  int reg;
13536
13537
  /* Skip mod/rm byte.  */
13538
79.7k
  MODRM_CHECK;
13539
79.7k
  ins->codep++;
13540
13541
79.7k
  if (bytemode == dq_mode)
13542
365
    bytemode = ins->vex.w ? q_mode : d_mode;
13543
13544
79.7k
  if (ins->modrm.mod != 3)
13545
56.5k
    return OP_E_memory (ins, bytemode, sizeflag);
13546
13547
23.2k
  reg = ins->modrm.rm;
13548
23.2k
  USED_REX (REX_B);
13549
23.2k
  if (ins->rex & REX_B)
13550
6.07k
    reg += 8;
13551
23.2k
  if (ins->vex.evex)
13552
10.2k
    {
13553
10.2k
      USED_REX (REX_X);
13554
10.2k
      if ((ins->rex & REX_X))
13555
3.12k
  reg += 16;
13556
10.2k
      ins->rex2_used &= ~REX_B;
13557
10.2k
    }
13558
12.9k
  else if (ins->rex2 & REX_B)
13559
365
    reg += 16;
13560
13561
23.2k
  if ((sizeflag & SUFFIX_ALWAYS)
13562
2.58k
      && (bytemode == x_swap_mode
13563
2.32k
    || bytemode == w_swap_mode
13564
2.11k
    || bytemode == d_swap_mode
13565
1.74k
    || bytemode == q_swap_mode))
13566
1.02k
    swap_operand (ins);
13567
13568
23.2k
  if (bytemode == tmm_mode)
13569
1.69k
    ins->modrm.rm = reg;
13570
13571
23.2k
  print_vector_reg (ins, reg, bytemode);
13572
23.2k
  return true;
13573
79.7k
}
13574
13575
static bool
13576
OP_R (instr_info *ins, int bytemode, int sizeflag)
13577
16.2k
{
13578
16.2k
  if (ins->modrm.mod != 3)
13579
3.87k
    return BadOp (ins);
13580
13581
12.3k
  switch (bytemode)
13582
12.3k
    {
13583
560
    case d_mode:
13584
1.19k
    case dq_mode:
13585
1.73k
    case q_mode:
13586
2.72k
    case mask_mode:
13587
2.72k
      return OP_E (ins, bytemode, sizeflag);
13588
652
    case q_mm_mode:
13589
652
      return OP_EM (ins, x_mode, sizeflag);
13590
7.15k
    case xmm_mode:
13591
7.15k
      if (ins->vex.length <= 128)
13592
544
  break;
13593
6.60k
      return BadOp (ins);
13594
12.3k
    }
13595
13596
2.36k
  return OP_EX (ins, bytemode, sizeflag);
13597
12.3k
}
13598
13599
static bool
13600
OP_M (instr_info *ins, int bytemode, int sizeflag)
13601
40.6k
{
13602
  /* Skip mod/rm byte.  */
13603
40.6k
  MODRM_CHECK;
13604
40.6k
  ins->codep++;
13605
13606
40.6k
  if (ins->modrm.mod == 3)
13607
    /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
13608
3.47k
    return BadOp (ins);
13609
13610
37.2k
  if (bytemode == x_mode)
13611
347
    ins->vex.no_broadcast = true;
13612
13613
37.2k
  return OP_E_memory (ins, bytemode, sizeflag);
13614
40.6k
}
13615
13616
static bool
13617
OP_0f07 (instr_info *ins, int bytemode, int sizeflag)
13618
2.61k
{
13619
2.61k
  if (ins->modrm.mod != 3 || ins->modrm.rm != 0)
13620
2.08k
    return BadOp (ins);
13621
529
  return OP_E (ins, bytemode, sizeflag);
13622
2.61k
}
13623
13624
/* montmul instruction need display repz and skip modrm */
13625
13626
static bool
13627
MONTMUL_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13628
1.26k
{
13629
1.26k
  if (ins->modrm.mod != 3 || ins->modrm.rm != 0)
13630
786
    return BadOp (ins);
13631
13632
  /* The 0xf3 prefix should be displayed as "repz" for montmul. */
13633
480
  if (ins->prefixes & PREFIX_REPZ)
13634
480
    ins->all_prefixes[ins->last_repz_prefix] = 0xf3;
13635
13636
  /* Skip mod/rm byte.  */
13637
480
  MODRM_CHECK;
13638
480
  ins->codep++;
13639
480
  return true;
13640
480
}
13641
13642
/* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
13643
   32bit mode and "xchg %rax,%rax" in 64bit mode.  */
13644
13645
static bool
13646
NOP_Fixup (instr_info *ins, int opnd, int sizeflag)
13647
29.0k
{
13648
29.0k
  if ((ins->prefixes & PREFIX_DATA) == 0 && (ins->rex & REX_B) == 0)
13649
25.1k
    {
13650
25.1k
      ins->mnemonicendp = stpcpy (ins->obuf, "nop");
13651
25.1k
      return true;
13652
25.1k
    }
13653
3.89k
  if (opnd == 0)
13654
1.94k
    return OP_REG (ins, eAX_reg, sizeflag);
13655
1.94k
  return OP_IMREG (ins, eAX_reg, sizeflag);
13656
3.89k
}
13657
13658
static const char *const Suffix3DNow[] = {
13659
/* 00 */  NULL,   NULL,   NULL,   NULL,
13660
/* 04 */  NULL,   NULL,   NULL,   NULL,
13661
/* 08 */  NULL,   NULL,   NULL,   NULL,
13662
/* 0C */  "pi2fw",  "pi2fd",  NULL,   NULL,
13663
/* 10 */  NULL,   NULL,   NULL,   NULL,
13664
/* 14 */  NULL,   NULL,   NULL,   NULL,
13665
/* 18 */  NULL,   NULL,   NULL,   NULL,
13666
/* 1C */  "pf2iw",  "pf2id",  NULL,   NULL,
13667
/* 20 */  NULL,   NULL,   NULL,   NULL,
13668
/* 24 */  NULL,   NULL,   NULL,   NULL,
13669
/* 28 */  NULL,   NULL,   NULL,   NULL,
13670
/* 2C */  NULL,   NULL,   NULL,   NULL,
13671
/* 30 */  NULL,   NULL,   NULL,   NULL,
13672
/* 34 */  NULL,   NULL,   NULL,   NULL,
13673
/* 38 */  NULL,   NULL,   NULL,   NULL,
13674
/* 3C */  NULL,   NULL,   NULL,   NULL,
13675
/* 40 */  NULL,   NULL,   NULL,   NULL,
13676
/* 44 */  NULL,   NULL,   NULL,   NULL,
13677
/* 48 */  NULL,   NULL,   NULL,   NULL,
13678
/* 4C */  NULL,   NULL,   NULL,   NULL,
13679
/* 50 */  NULL,   NULL,   NULL,   NULL,
13680
/* 54 */  NULL,   NULL,   NULL,   NULL,
13681
/* 58 */  NULL,   NULL,   NULL,   NULL,
13682
/* 5C */  NULL,   NULL,   NULL,   NULL,
13683
/* 60 */  NULL,   NULL,   NULL,   NULL,
13684
/* 64 */  NULL,   NULL,   NULL,   NULL,
13685
/* 68 */  NULL,   NULL,   NULL,   NULL,
13686
/* 6C */  NULL,   NULL,   NULL,   NULL,
13687
/* 70 */  NULL,   NULL,   NULL,   NULL,
13688
/* 74 */  NULL,   NULL,   NULL,   NULL,
13689
/* 78 */  NULL,   NULL,   NULL,   NULL,
13690
/* 7C */  NULL,   NULL,   NULL,   NULL,
13691
/* 80 */  NULL,   NULL,   NULL,   NULL,
13692
/* 84 */  NULL,   NULL,   NULL,   NULL,
13693
/* 88 */  NULL,   NULL,   "pfnacc", NULL,
13694
/* 8C */  NULL,   NULL,   "pfpnacc",  NULL,
13695
/* 90 */  "pfcmpge",  NULL,   NULL,   NULL,
13696
/* 94 */  "pfmin",  NULL,   "pfrcp",  "pfrsqrt",
13697
/* 98 */  NULL,   NULL,   "pfsub",  NULL,
13698
/* 9C */  NULL,   NULL,   "pfadd",  NULL,
13699
/* A0 */  "pfcmpgt",  NULL,   NULL,   NULL,
13700
/* A4 */  "pfmax",  NULL,   "pfrcpit1", "pfrsqit1",
13701
/* A8 */  NULL,   NULL,   "pfsubr", NULL,
13702
/* AC */  NULL,   NULL,   "pfacc",  NULL,
13703
/* B0 */  "pfcmpeq",  NULL,   NULL,   NULL,
13704
/* B4 */  "pfmul",  NULL,   "pfrcpit2", "pmulhrw",
13705
/* B8 */  NULL,   NULL,   NULL,   "pswapd",
13706
/* BC */  NULL,   NULL,   NULL,   "pavgusb",
13707
/* C0 */  NULL,   NULL,   NULL,   NULL,
13708
/* C4 */  NULL,   NULL,   NULL,   NULL,
13709
/* C8 */  NULL,   NULL,   NULL,   NULL,
13710
/* CC */  NULL,   NULL,   NULL,   NULL,
13711
/* D0 */  NULL,   NULL,   NULL,   NULL,
13712
/* D4 */  NULL,   NULL,   NULL,   NULL,
13713
/* D8 */  NULL,   NULL,   NULL,   NULL,
13714
/* DC */  NULL,   NULL,   NULL,   NULL,
13715
/* E0 */  NULL,   NULL,   NULL,   NULL,
13716
/* E4 */  NULL,   NULL,   NULL,   NULL,
13717
/* E8 */  NULL,   NULL,   NULL,   NULL,
13718
/* EC */  NULL,   NULL,   NULL,   NULL,
13719
/* F0 */  NULL,   NULL,   NULL,   NULL,
13720
/* F4 */  NULL,   NULL,   NULL,   NULL,
13721
/* F8 */  NULL,   NULL,   NULL,   NULL,
13722
/* FC */  NULL,   NULL,   NULL,   NULL,
13723
};
13724
13725
static bool
13726
OP_3DNowSuffix (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13727
    int sizeflag ATTRIBUTE_UNUSED)
13728
17.3k
{
13729
17.3k
  const char *mnemonic;
13730
13731
17.3k
  if (!fetch_code (ins->info, ins->codep + 1))
13732
571
    return false;
13733
  /* AMD 3DNow! instructions are specified by an opcode suffix in the
13734
     place where an 8-bit immediate would normally go.  ie. the last
13735
     byte of the instruction.  */
13736
16.7k
  ins->obufp = ins->mnemonicendp;
13737
16.7k
  mnemonic = Suffix3DNow[*ins->codep++];
13738
16.7k
  if (mnemonic)
13739
511
    ins->obufp = stpcpy (ins->obufp, mnemonic);
13740
16.2k
  else
13741
16.2k
    {
13742
      /* Since a variable sized ins->modrm/ins->sib chunk is between the start
13743
   of the opcode (0x0f0f) and the opcode suffix, we need to do
13744
   all the ins->modrm processing first, and don't know until now that
13745
   we have a bad opcode.  This necessitates some cleaning up.  */
13746
16.2k
      ins->op_out[0][0] = '\0';
13747
16.2k
      ins->op_out[1][0] = '\0';
13748
16.2k
      BadOp (ins);
13749
16.2k
    }
13750
16.7k
  ins->mnemonicendp = ins->obufp;
13751
16.7k
  return true;
13752
17.3k
}
13753
13754
static const struct op simd_cmp_op[] =
13755
{
13756
  { STRING_COMMA_LEN ("eq") },
13757
  { STRING_COMMA_LEN ("lt") },
13758
  { STRING_COMMA_LEN ("le") },
13759
  { STRING_COMMA_LEN ("unord") },
13760
  { STRING_COMMA_LEN ("neq") },
13761
  { STRING_COMMA_LEN ("nlt") },
13762
  { STRING_COMMA_LEN ("nle") },
13763
  { STRING_COMMA_LEN ("ord") }
13764
};
13765
13766
static const struct op vex_cmp_op[] =
13767
{
13768
  { STRING_COMMA_LEN ("eq_uq") },
13769
  { STRING_COMMA_LEN ("nge") },
13770
  { STRING_COMMA_LEN ("ngt") },
13771
  { STRING_COMMA_LEN ("false") },
13772
  { STRING_COMMA_LEN ("neq_oq") },
13773
  { STRING_COMMA_LEN ("ge") },
13774
  { STRING_COMMA_LEN ("gt") },
13775
  { STRING_COMMA_LEN ("true") },
13776
  { STRING_COMMA_LEN ("eq_os") },
13777
  { STRING_COMMA_LEN ("lt_oq") },
13778
  { STRING_COMMA_LEN ("le_oq") },
13779
  { STRING_COMMA_LEN ("unord_s") },
13780
  { STRING_COMMA_LEN ("neq_us") },
13781
  { STRING_COMMA_LEN ("nlt_uq") },
13782
  { STRING_COMMA_LEN ("nle_uq") },
13783
  { STRING_COMMA_LEN ("ord_s") },
13784
  { STRING_COMMA_LEN ("eq_us") },
13785
  { STRING_COMMA_LEN ("nge_uq") },
13786
  { STRING_COMMA_LEN ("ngt_uq") },
13787
  { STRING_COMMA_LEN ("false_os") },
13788
  { STRING_COMMA_LEN ("neq_os") },
13789
  { STRING_COMMA_LEN ("ge_oq") },
13790
  { STRING_COMMA_LEN ("gt_oq") },
13791
  { STRING_COMMA_LEN ("true_us") },
13792
};
13793
13794
static bool
13795
CMP_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13796
     int sizeflag ATTRIBUTE_UNUSED)
13797
3.18k
{
13798
3.18k
  unsigned int cmp_type;
13799
13800
3.18k
  if (!fetch_code (ins->info, ins->codep + 1))
13801
718
    return false;
13802
2.46k
  cmp_type = *ins->codep++;
13803
2.46k
  if (cmp_type < ARRAY_SIZE (simd_cmp_op))
13804
692
    {
13805
692
      char suffix[3];
13806
692
      char *p = ins->mnemonicendp - 2;
13807
692
      suffix[0] = p[0];
13808
692
      suffix[1] = p[1];
13809
692
      suffix[2] = '\0';
13810
692
      sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
13811
692
      ins->mnemonicendp += simd_cmp_op[cmp_type].len;
13812
692
    }
13813
1.77k
  else if (ins->need_vex
13814
1.05k
     && cmp_type < ARRAY_SIZE (simd_cmp_op) + ARRAY_SIZE (vex_cmp_op))
13815
304
    {
13816
304
      char suffix[3];
13817
304
      char *p = ins->mnemonicendp - 2;
13818
304
      suffix[0] = p[0];
13819
304
      suffix[1] = p[1];
13820
304
      suffix[2] = '\0';
13821
304
      cmp_type -= ARRAY_SIZE (simd_cmp_op);
13822
304
      sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
13823
304
      ins->mnemonicendp += vex_cmp_op[cmp_type].len;
13824
304
    }
13825
1.46k
  else
13826
1.46k
    {
13827
      /* We have a reserved extension byte.  Output it directly.  */
13828
1.46k
      oappend_immediate (ins, cmp_type);
13829
1.46k
    }
13830
2.46k
  return true;
13831
3.18k
}
13832
13833
static bool
13834
OP_Mwait (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13835
929
{
13836
  /* mwait %eax,%ecx / mwaitx %eax,%ecx,%ebx  */
13837
929
  if (!ins->intel_syntax)
13838
705
    {
13839
705
      strcpy (ins->op_out[0], att_names32[0] + ins->intel_syntax);
13840
705
      strcpy (ins->op_out[1], att_names32[1] + ins->intel_syntax);
13841
705
      if (bytemode == eBX_reg)
13842
304
  strcpy (ins->op_out[2], att_names32[3] + ins->intel_syntax);
13843
705
      ins->two_source_ops = true;
13844
705
    }
13845
  /* Skip mod/rm byte.  */
13846
929
  MODRM_CHECK;
13847
929
  ins->codep++;
13848
929
  return true;
13849
929
}
13850
13851
static bool
13852
OP_Monitor (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13853
      int sizeflag ATTRIBUTE_UNUSED)
13854
2.12k
{
13855
  /* monitor %{e,r,}ax,%ecx,%edx"  */
13856
2.12k
  if (!ins->intel_syntax)
13857
1.05k
    {
13858
1.05k
      const char (*names)[8] = (ins->address_mode == mode_64bit
13859
1.05k
        ? att_names64 : att_names32);
13860
13861
1.05k
      if (ins->prefixes & PREFIX_ADDR)
13862
426
  {
13863
    /* Remove "addr16/addr32".  */
13864
426
    ins->all_prefixes[ins->last_addr_prefix] = 0;
13865
426
    names = (ins->address_mode != mode_32bit
13866
426
       ? att_names32 : att_names16);
13867
426
    ins->used_prefixes |= PREFIX_ADDR;
13868
426
  }
13869
627
      else if (ins->address_mode == mode_16bit)
13870
367
  names = att_names16;
13871
1.05k
      strcpy (ins->op_out[0], names[0] + ins->intel_syntax);
13872
1.05k
      strcpy (ins->op_out[1], att_names32[1] + ins->intel_syntax);
13873
1.05k
      strcpy (ins->op_out[2], att_names32[2] + ins->intel_syntax);
13874
1.05k
      ins->two_source_ops = true;
13875
1.05k
    }
13876
  /* Skip mod/rm byte.  */
13877
2.12k
  MODRM_CHECK;
13878
2.12k
  ins->codep++;
13879
2.12k
  return true;
13880
2.12k
}
13881
13882
static bool
13883
REP_Fixup (instr_info *ins, int bytemode, int sizeflag)
13884
122k
{
13885
  /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
13886
     lods and stos.  */
13887
122k
  if (ins->prefixes & PREFIX_REPZ)
13888
394
    ins->all_prefixes[ins->last_repz_prefix] = REP_PREFIX;
13889
13890
122k
  switch (bytemode)
13891
122k
    {
13892
3.60k
    case al_reg:
13893
10.7k
    case eAX_reg:
13894
46.9k
    case indir_dx_reg:
13895
46.9k
      return OP_IMREG (ins, bytemode, sizeflag);
13896
75.4k
    case eDI_reg:
13897
75.4k
      return OP_ESreg (ins, bytemode, sizeflag);
13898
0
    case eSI_reg:
13899
0
      return OP_DSreg (ins, bytemode, sizeflag);
13900
0
    default:
13901
0
      abort ();
13902
0
      break;
13903
122k
    }
13904
0
  return true;
13905
122k
}
13906
13907
static bool
13908
SEP_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13909
     int sizeflag ATTRIBUTE_UNUSED)
13910
722
{
13911
722
  if (ins->isa64 != amd64)
13912
532
    return true;
13913
13914
190
  ins->obufp = ins->obuf;
13915
190
  BadOp (ins);
13916
190
  ins->mnemonicendp = ins->obufp;
13917
190
  ++ins->codep;
13918
190
  return true;
13919
722
}
13920
13921
/* For BND-prefixed instructions 0xF2 prefix should be displayed as
13922
   "bnd".  */
13923
13924
static bool
13925
BND_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13926
     int sizeflag ATTRIBUTE_UNUSED)
13927
247k
{
13928
247k
  if (ins->prefixes & PREFIX_REPNZ)
13929
1.40k
    ins->all_prefixes[ins->last_repnz_prefix] = BND_PREFIX;
13930
247k
  return true;
13931
247k
}
13932
13933
/* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as
13934
   "notrack".  */
13935
13936
static bool
13937
NOTRACK_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13938
         int sizeflag ATTRIBUTE_UNUSED)
13939
29.8k
{
13940
  /* Since active_seg_prefix is not set in 64-bit mode, check whether
13941
     we've seen a PREFIX_DS.  */
13942
29.8k
  if ((ins->prefixes & PREFIX_DS) != 0
13943
2.78k
      && (ins->address_mode != mode_64bit || ins->last_data_prefix < 0))
13944
2.22k
    {
13945
      /* NOTRACK prefix is only valid on indirect branch instructions.
13946
   NB: DATA prefix is unsupported for Intel64.  */
13947
2.22k
      ins->active_seg_prefix = 0;
13948
2.22k
      ins->all_prefixes[ins->last_seg_prefix] = NOTRACK_PREFIX;
13949
2.22k
    }
13950
29.8k
  return true;
13951
29.8k
}
13952
13953
/* Similar to OP_E.  But the 0xf2/0xf3 ins->prefixes should be displayed as
13954
   "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
13955
 */
13956
13957
static bool
13958
HLE_Fixup1 (instr_info *ins, int bytemode, int sizeflag)
13959
1.03M
{
13960
1.03M
  if (ins->modrm.mod != 3
13961
948k
      && (ins->prefixes & PREFIX_LOCK) != 0)
13962
3.60k
    {
13963
3.60k
      if (ins->prefixes & PREFIX_REPZ)
13964
849
  ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX;
13965
3.60k
      if (ins->prefixes & PREFIX_REPNZ)
13966
300
  ins->all_prefixes[ins->last_repnz_prefix] = XACQUIRE_PREFIX;
13967
3.60k
    }
13968
13969
1.03M
  return OP_E (ins, bytemode, sizeflag);
13970
1.03M
}
13971
13972
/* Similar to OP_E.  But the 0xf2/0xf3 ins->prefixes should be displayed as
13973
   "xacquire"/"xrelease" for memory operand.  No check for LOCK prefix.
13974
 */
13975
13976
static bool
13977
HLE_Fixup2 (instr_info *ins, int bytemode, int sizeflag)
13978
11.5k
{
13979
11.5k
  if (ins->modrm.mod != 3)
13980
9.97k
    {
13981
9.97k
      if (ins->prefixes & PREFIX_REPZ)
13982
747
  ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX;
13983
9.97k
      if (ins->prefixes & PREFIX_REPNZ)
13984
1.19k
  ins->all_prefixes[ins->last_repnz_prefix] = XACQUIRE_PREFIX;
13985
9.97k
    }
13986
13987
11.5k
  return OP_E (ins, bytemode, sizeflag);
13988
11.5k
}
13989
13990
/* Similar to OP_E.  But the 0xf3 prefixes should be displayed as
13991
   "xrelease" for memory operand.  No check for LOCK prefix.   */
13992
13993
static bool
13994
HLE_Fixup3 (instr_info *ins, int bytemode, int sizeflag)
13995
31.9k
{
13996
31.9k
  if (ins->modrm.mod != 3
13997
14.7k
      && ins->last_repz_prefix > ins->last_repnz_prefix
13998
413
      && (ins->prefixes & PREFIX_REPZ) != 0)
13999
413
    ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX;
14000
14001
31.9k
  return OP_E (ins, bytemode, sizeflag);
14002
31.9k
}
14003
14004
static bool
14005
CMPXCHG8B_Fixup (instr_info *ins, int bytemode, int sizeflag)
14006
2.61k
{
14007
2.61k
  USED_REX (REX_W);
14008
2.61k
  if (ins->rex & REX_W)
14009
337
    {
14010
      /* Change cmpxchg8b to cmpxchg16b.  */
14011
337
      char *p = ins->mnemonicendp - 2;
14012
337
      ins->mnemonicendp = stpcpy (p, "16b");
14013
337
      bytemode = o_mode;
14014
337
    }
14015
2.28k
  else if ((ins->prefixes & PREFIX_LOCK) != 0)
14016
1.30k
    {
14017
1.30k
      if (ins->prefixes & PREFIX_REPZ)
14018
768
  ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX;
14019
1.30k
      if (ins->prefixes & PREFIX_REPNZ)
14020
217
  ins->all_prefixes[ins->last_repnz_prefix] = XACQUIRE_PREFIX;
14021
1.30k
    }
14022
14023
2.61k
  return OP_M (ins, bytemode, sizeflag);
14024
2.61k
}
14025
14026
static bool
14027
XMM_Fixup (instr_info *ins, int reg, int sizeflag ATTRIBUTE_UNUSED)
14028
328
{
14029
328
  const char (*names)[8] = att_names_xmm;
14030
14031
328
  if (ins->need_vex)
14032
0
    {
14033
0
      switch (ins->vex.length)
14034
0
  {
14035
0
  case 128:
14036
0
    break;
14037
0
  case 256:
14038
0
    names = att_names_ymm;
14039
0
    break;
14040
0
  default:
14041
0
    abort ();
14042
0
  }
14043
0
    }
14044
328
  oappend_register (ins, names[reg]);
14045
328
  return true;
14046
328
}
14047
14048
static bool
14049
FXSAVE_Fixup (instr_info *ins, int bytemode, int sizeflag)
14050
1.82k
{
14051
  /* Add proper suffix to "fxsave" and "fxrstor".  */
14052
1.82k
  USED_REX (REX_W);
14053
1.82k
  if (ins->rex & REX_W)
14054
759
    {
14055
759
      char *p = ins->mnemonicendp;
14056
759
      *p++ = '6';
14057
759
      *p++ = '4';
14058
759
      *p = '\0';
14059
759
      ins->mnemonicendp = p;
14060
759
    }
14061
1.82k
  return OP_M (ins, bytemode, sizeflag);
14062
1.82k
}
14063
14064
/* Display the destination register operand for instructions with
14065
   VEX. */
14066
14067
static bool
14068
OP_VEX (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
14069
106k
{
14070
106k
  int reg, modrm_reg, sib_index = -1;
14071
106k
  const char (*names)[8];
14072
14073
106k
  if (!ins->need_vex)
14074
46.3k
    return true;
14075
14076
59.8k
  if (ins->evex_type == evex_from_legacy)
14077
7.78k
    {
14078
7.78k
      ins->evex_used |= EVEX_b_used;
14079
7.78k
      if (!ins->vex.nd)
14080
2.79k
  return true;
14081
7.78k
    }
14082
14083
57.0k
  reg = ins->vex.register_specifier;
14084
57.0k
  ins->vex.register_specifier = 0;
14085
57.0k
  if (ins->address_mode != mode_64bit)
14086
8.32k
    {
14087
8.32k
      if (ins->vex.evex && !ins->vex.v)
14088
2.44k
  {
14089
2.44k
    oappend (ins, "(bad)");
14090
2.44k
    return true;
14091
2.44k
  }
14092
14093
5.87k
      reg &= 7;
14094
5.87k
    }
14095
48.7k
  else if (ins->vex.evex && !ins->vex.v)
14096
14.8k
    reg += 16;
14097
14098
54.5k
  switch (bytemode)
14099
54.5k
    {
14100
7.56k
    case scalar_mode:
14101
7.56k
      oappend_register (ins, att_names_xmm[reg]);
14102
7.56k
      return true;
14103
14104
2.39k
    case vex_vsib_d_w_dq_mode:
14105
4.23k
    case vex_vsib_q_w_dq_mode:
14106
      /* This must be the 3rd operand.  */
14107
4.23k
      if (ins->obufp != ins->op_out[2])
14108
0
  abort ();
14109
4.23k
      if (ins->vex.length == 128
14110
2.11k
    || (bytemode != vex_vsib_d_w_dq_mode
14111
1.18k
        && !ins->vex.w))
14112
2.78k
  oappend_register (ins, att_names_xmm[reg]);
14113
1.44k
      else
14114
1.44k
  oappend_register (ins, att_names_ymm[reg]);
14115
14116
      /* All 3 XMM/YMM registers must be distinct.  */
14117
4.23k
      modrm_reg = ins->modrm.reg;
14118
4.23k
      if (ins->rex & REX_R)
14119
1.07k
  modrm_reg += 8;
14120
14121
4.23k
      if (ins->has_sib && ins->modrm.rm == 4)
14122
1.51k
  {
14123
1.51k
    sib_index = ins->sib.index;
14124
1.51k
    if (ins->rex & REX_X)
14125
300
      sib_index += 8;
14126
1.51k
  }
14127
14128
4.23k
      if (reg == modrm_reg || reg == sib_index)
14129
725
  strcpy (ins->obufp, "/(bad)");
14130
4.23k
      if (modrm_reg == sib_index || modrm_reg == reg)
14131
925
  strcat (ins->op_out[0], "/(bad)");
14132
4.23k
      if (sib_index == modrm_reg || sib_index == reg)
14133
632
  strcat (ins->op_out[1], "/(bad)");
14134
14135
4.23k
      return true;
14136
14137
2.80k
    case tmm_mode:
14138
      /* All 3 TMM registers must be distinct.  */
14139
2.80k
      if (reg >= 8)
14140
675
  oappend (ins, "(bad)");
14141
2.13k
      else
14142
2.13k
  {
14143
    /* This must be the 3rd operand.  */
14144
2.13k
    if (ins->obufp != ins->op_out[2])
14145
0
      abort ();
14146
2.13k
    oappend_register (ins, att_names_tmm[reg]);
14147
2.13k
    if (reg == ins->modrm.reg || reg == ins->modrm.rm)
14148
1.29k
      strcpy (ins->obufp, "/(bad)");
14149
2.13k
  }
14150
14151
2.80k
      if (ins->modrm.reg == ins->modrm.rm || ins->modrm.reg == reg
14152
1.45k
    || ins->modrm.rm == reg)
14153
2.30k
  {
14154
2.30k
    if (ins->modrm.reg <= 8
14155
1.78k
        && (ins->modrm.reg == ins->modrm.rm || ins->modrm.reg == reg))
14156
851
      strcat (ins->op_out[0], "/(bad)");
14157
2.30k
    if (ins->modrm.rm <= 8
14158
1.74k
        && (ins->modrm.rm == ins->modrm.reg || ins->modrm.rm == reg))
14159
1.36k
      strcat (ins->op_out[1], "/(bad)");
14160
2.30k
  }
14161
14162
2.80k
      return true;
14163
14164
3.88k
    case v_mode:
14165
7.91k
    case dq_mode:
14166
7.91k
      if (ins->rex & REX_W)
14167
792
  oappend_register (ins, att_names64[reg]);
14168
7.12k
      else if (bytemode == v_mode
14169
3.39k
         && !(sizeflag & DFLAG))
14170
547
  oappend_register (ins, att_names16[reg]);
14171
6.58k
      else
14172
6.58k
  oappend_register (ins, att_names32[reg]);
14173
7.91k
      return true;
14174
14175
591
    case b_mode:
14176
591
      oappend_register (ins, att_names8rex[reg]);
14177
591
      return true;
14178
14179
467
    case q_mode:
14180
467
      oappend_register (ins, att_names64[reg]);
14181
467
      return true;
14182
54.5k
    }
14183
14184
30.9k
  switch (ins->vex.length)
14185
30.9k
    {
14186
14.3k
    case 128:
14187
14.3k
      switch (bytemode)
14188
14.3k
  {
14189
14.3k
  case x_mode:
14190
14.3k
    names = att_names_xmm;
14191
14.3k
    ins->evex_used |= EVEX_len_used;
14192
14.3k
    break;
14193
0
  case mask_bd_mode:
14194
0
  case mask_mode:
14195
0
    if (reg > 0x7)
14196
0
      {
14197
0
        oappend (ins, "(bad)");
14198
0
        return true;
14199
0
      }
14200
0
    names = att_names_mask;
14201
0
    break;
14202
0
  default:
14203
0
    abort ();
14204
0
    return true;
14205
14.3k
  }
14206
14.3k
      break;
14207
14.3k
    case 256:
14208
8.11k
      switch (bytemode)
14209
8.11k
  {
14210
7.17k
  case x_mode:
14211
7.17k
    names = att_names_ymm;
14212
7.17k
    ins->evex_used |= EVEX_len_used;
14213
7.17k
    break;
14214
0
  case mask_bd_mode:
14215
933
  case mask_mode:
14216
933
    if (reg <= 0x7)
14217
448
      {
14218
448
        names = att_names_mask;
14219
448
        break;
14220
448
      }
14221
    /* Fall through.  */
14222
485
  default:
14223
    /* See PR binutils/20893 for a reproducer.  */
14224
485
    oappend (ins, "(bad)");
14225
485
    return true;
14226
8.11k
  }
14227
7.62k
      break;
14228
8.54k
    case 512:
14229
8.54k
      names = att_names_zmm;
14230
8.54k
      ins->evex_used |= EVEX_len_used;
14231
8.54k
      break;
14232
0
    default:
14233
0
      abort ();
14234
0
      break;
14235
30.9k
    }
14236
30.5k
  oappend_register (ins, names[reg]);
14237
30.5k
  return true;
14238
30.9k
}
14239
14240
static bool
14241
OP_VexR (instr_info *ins, int bytemode, int sizeflag)
14242
4.00k
{
14243
4.00k
  if (ins->modrm.mod == 3)
14244
1.82k
    return OP_VEX (ins, bytemode, sizeflag);
14245
2.18k
  return true;
14246
4.00k
}
14247
14248
static bool
14249
OP_VexW (instr_info *ins, int bytemode, int sizeflag)
14250
983
{
14251
983
  OP_VEX (ins, bytemode, sizeflag);
14252
14253
983
  if (ins->vex.w)
14254
715
    {
14255
      /* Swap 2nd and 3rd operands.  */
14256
715
      char *tmp = ins->op_out[2];
14257
14258
715
      ins->op_out[2] = ins->op_out[1];
14259
715
      ins->op_out[1] = tmp;
14260
715
    }
14261
983
  return true;
14262
983
}
14263
14264
static bool
14265
OP_REG_VexI4 (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
14266
2.46k
{
14267
2.46k
  int reg;
14268
2.46k
  const char (*names)[8] = att_names_xmm;
14269
14270
2.46k
  if (!fetch_code (ins->info, ins->codep + 1))
14271
229
    return false;
14272
2.23k
  reg = *ins->codep++;
14273
14274
2.23k
  if (bytemode != x_mode && bytemode != scalar_mode)
14275
0
    abort ();
14276
14277
2.23k
  reg >>= 4;
14278
2.23k
  if (ins->address_mode != mode_64bit)
14279
483
    reg &= 7;
14280
14281
2.23k
  if (bytemode == x_mode && ins->vex.length == 256)
14282
1.21k
    names = att_names_ymm;
14283
14284
2.23k
  oappend_register (ins, names[reg]);
14285
14286
2.23k
  if (ins->vex.w)
14287
1.09k
    {
14288
      /* Swap 3rd and 4th operands.  */
14289
1.09k
      char *tmp = ins->op_out[3];
14290
14291
1.09k
      ins->op_out[3] = ins->op_out[2];
14292
1.09k
      ins->op_out[2] = tmp;
14293
1.09k
    }
14294
2.23k
  return true;
14295
2.23k
}
14296
14297
static bool
14298
OP_VexI4 (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
14299
    int sizeflag ATTRIBUTE_UNUSED)
14300
1.40k
{
14301
1.40k
  oappend_immediate (ins, ins->codep[-1] & 0xf);
14302
1.40k
  return true;
14303
1.40k
}
14304
14305
static bool
14306
VPCMP_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
14307
       int sizeflag ATTRIBUTE_UNUSED)
14308
3.05k
{
14309
3.05k
  unsigned int cmp_type;
14310
14311
3.05k
  if (!ins->vex.evex)
14312
0
    abort ();
14313
14314
3.05k
  if (!fetch_code (ins->info, ins->codep + 1))
14315
310
    return false;
14316
2.74k
  cmp_type = *ins->codep++;
14317
  /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
14318
     If it's the case, print suffix, otherwise - print the immediate.  */
14319
2.74k
  if (cmp_type < ARRAY_SIZE (simd_cmp_op)
14320
2.29k
      && cmp_type != 3
14321
2.12k
      && cmp_type != 7)
14322
1.82k
    {
14323
1.82k
      char suffix[3];
14324
1.82k
      char *p = ins->mnemonicendp - 2;
14325
14326
      /* vpcmp* can have both one- and two-lettered suffix.  */
14327
1.82k
      if (p[0] == 'p')
14328
813
  {
14329
813
    p++;
14330
813
    suffix[0] = p[0];
14331
813
    suffix[1] = '\0';
14332
813
  }
14333
1.01k
      else
14334
1.01k
  {
14335
1.01k
    suffix[0] = p[0];
14336
1.01k
    suffix[1] = p[1];
14337
1.01k
    suffix[2] = '\0';
14338
1.01k
  }
14339
14340
1.82k
      sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
14341
1.82k
      ins->mnemonicendp += simd_cmp_op[cmp_type].len;
14342
1.82k
    }
14343
923
  else
14344
923
    {
14345
      /* We have a reserved extension byte.  Output it directly.  */
14346
923
      oappend_immediate (ins, cmp_type);
14347
923
    }
14348
2.74k
  return true;
14349
3.05k
}
14350
14351
static const struct op xop_cmp_op[] =
14352
{
14353
  { STRING_COMMA_LEN ("lt") },
14354
  { STRING_COMMA_LEN ("le") },
14355
  { STRING_COMMA_LEN ("gt") },
14356
  { STRING_COMMA_LEN ("ge") },
14357
  { STRING_COMMA_LEN ("eq") },
14358
  { STRING_COMMA_LEN ("neq") },
14359
  { STRING_COMMA_LEN ("false") },
14360
  { STRING_COMMA_LEN ("true") }
14361
};
14362
14363
static bool
14364
VPCOM_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
14365
       int sizeflag ATTRIBUTE_UNUSED)
14366
1.54k
{
14367
1.54k
  unsigned int cmp_type;
14368
14369
1.54k
  if (!fetch_code (ins->info, ins->codep + 1))
14370
128
    return false;
14371
1.41k
  cmp_type = *ins->codep++;
14372
1.41k
  if (cmp_type < ARRAY_SIZE (xop_cmp_op))
14373
750
    {
14374
750
      char suffix[3];
14375
750
      char *p = ins->mnemonicendp - 2;
14376
14377
      /* vpcom* can have both one- and two-lettered suffix.  */
14378
750
      if (p[0] == 'm')
14379
358
  {
14380
358
    p++;
14381
358
    suffix[0] = p[0];
14382
358
    suffix[1] = '\0';
14383
358
  }
14384
392
      else
14385
392
  {
14386
392
    suffix[0] = p[0];
14387
392
    suffix[1] = p[1];
14388
392
    suffix[2] = '\0';
14389
392
  }
14390
14391
750
      sprintf (p, "%s%s", xop_cmp_op[cmp_type].name, suffix);
14392
750
      ins->mnemonicendp += xop_cmp_op[cmp_type].len;
14393
750
    }
14394
667
  else
14395
667
    {
14396
      /* We have a reserved extension byte.  Output it directly.  */
14397
667
      oappend_immediate (ins, cmp_type);
14398
667
    }
14399
1.41k
  return true;
14400
1.54k
}
14401
14402
static const struct op pclmul_op[] =
14403
{
14404
  { STRING_COMMA_LEN ("lql") },
14405
  { STRING_COMMA_LEN ("hql") },
14406
  { STRING_COMMA_LEN ("lqh") },
14407
  { STRING_COMMA_LEN ("hqh") }
14408
};
14409
14410
static bool
14411
PCLMUL_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
14412
        int sizeflag ATTRIBUTE_UNUSED)
14413
3.46k
{
14414
3.46k
  unsigned int pclmul_type;
14415
14416
3.46k
  if (!fetch_code (ins->info, ins->codep + 1))
14417
203
    return false;
14418
3.25k
  pclmul_type = *ins->codep++;
14419
3.25k
  switch (pclmul_type)
14420
3.25k
    {
14421
673
    case 0x10:
14422
673
      pclmul_type = 2;
14423
673
      break;
14424
735
    case 0x11:
14425
735
      pclmul_type = 3;
14426
735
      break;
14427
1.85k
    default:
14428
1.85k
      break;
14429
3.25k
    }
14430
3.25k
  if (pclmul_type < ARRAY_SIZE (pclmul_op))
14431
1.64k
    {
14432
1.64k
      char suffix[4];
14433
1.64k
      char *p = ins->mnemonicendp - 3;
14434
1.64k
      suffix[0] = p[0];
14435
1.64k
      suffix[1] = p[1];
14436
1.64k
      suffix[2] = p[2];
14437
1.64k
      suffix[3] = '\0';
14438
1.64k
      sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
14439
1.64k
      ins->mnemonicendp += pclmul_op[pclmul_type].len;
14440
1.64k
    }
14441
1.61k
  else
14442
1.61k
    {
14443
      /* We have a reserved extension byte.  Output it directly.  */
14444
1.61k
      oappend_immediate (ins, pclmul_type);
14445
1.61k
    }
14446
3.25k
  return true;
14447
3.25k
}
14448
14449
static bool
14450
MOVSXD_Fixup (instr_info *ins, int bytemode, int sizeflag)
14451
13.2k
{
14452
  /* Add proper suffix to "movsxd".  */
14453
13.2k
  char *p = ins->mnemonicendp;
14454
14455
13.2k
  switch (bytemode)
14456
13.2k
    {
14457
13.2k
    case movsxd_mode:
14458
13.2k
      if (!ins->intel_syntax)
14459
10.6k
  {
14460
10.6k
    USED_REX (REX_W);
14461
10.6k
    if (ins->rex & REX_W)
14462
729
      {
14463
729
        *p++ = 'l';
14464
729
        *p++ = 'q';
14465
729
        break;
14466
729
      }
14467
10.6k
  }
14468
14469
12.5k
      *p++ = 'x';
14470
12.5k
      *p++ = 'd';
14471
12.5k
      break;
14472
0
    default:
14473
0
      oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
14474
0
      break;
14475
13.2k
    }
14476
14477
13.2k
  ins->mnemonicendp = p;
14478
13.2k
  *p = '\0';
14479
13.2k
  return OP_E (ins, bytemode, sizeflag);
14480
13.2k
}
14481
14482
static bool
14483
DistinctDest_Fixup (instr_info *ins, int bytemode, int sizeflag)
14484
5.18k
{
14485
5.18k
  unsigned int reg = ins->vex.register_specifier;
14486
5.18k
  unsigned int modrm_reg = ins->modrm.reg;
14487
5.18k
  unsigned int modrm_rm = ins->modrm.rm;
14488
14489
  /* Calc destination register number.  */
14490
5.18k
  if (ins->rex & REX_R)
14491
753
    modrm_reg += 8;
14492
5.18k
  if (ins->rex2 & REX_R)
14493
1.02k
    modrm_reg += 16;
14494
14495
  /* Calc src1 register number.  */
14496
5.18k
  if (ins->address_mode != mode_64bit)
14497
1.43k
    reg &= 7;
14498
3.74k
  else if (ins->vex.evex && !ins->vex.v)
14499
1.78k
    reg += 16;
14500
14501
  /* Calc src2 register number.  */
14502
5.18k
  if (ins->modrm.mod == 3)
14503
1.81k
    {
14504
1.81k
      if (ins->rex & REX_B)
14505
1.21k
        modrm_rm += 8;
14506
1.81k
      if (ins->rex & REX_X)
14507
453
        modrm_rm += 16;
14508
1.81k
    }
14509
14510
  /* Destination and source registers must be distinct, output bad if
14511
     dest == src1 or dest == src2.  */
14512
5.18k
  if (modrm_reg == reg
14513
3.17k
      || (ins->modrm.mod == 3
14514
1.81k
    && modrm_reg == modrm_rm))
14515
2.23k
    {
14516
2.23k
      oappend (ins, "(bad)");
14517
2.23k
      return true;
14518
2.23k
    }
14519
2.95k
  return OP_XMM (ins, bytemode, sizeflag);
14520
5.18k
}
14521
14522
static bool
14523
OP_Rounding (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
14524
20.3k
{
14525
20.3k
  if (ins->modrm.mod != 3 || !ins->vex.b)
14526
16.5k
    return true;
14527
14528
3.75k
  ins->evex_used |= EVEX_b_used;
14529
3.75k
  switch (bytemode)
14530
3.75k
    {
14531
1.00k
    case evex_rounding_64_mode:
14532
1.00k
      if (ins->address_mode != mode_64bit || !ins->vex.w)
14533
559
        return true;
14534
      /* Fall through.  */
14535
2.26k
    case evex_rounding_mode:
14536
2.26k
      oappend (ins, names_rounding[ins->vex.ll]);
14537
2.26k
      break;
14538
934
    case evex_sae_mode:
14539
934
      oappend (ins, "{");
14540
934
      break;
14541
0
    default:
14542
0
      abort ();
14543
3.75k
    }
14544
3.19k
  oappend (ins, "sae}");
14545
3.19k
  return true;
14546
3.75k
}
14547
14548
static bool
14549
PREFETCHI_Fixup (instr_info *ins, int bytemode, int sizeflag)
14550
2.39k
{
14551
2.39k
  if (ins->modrm.mod != 0 || ins->modrm.rm != 5)
14552
2.04k
    {
14553
2.04k
      if (ins->intel_syntax)
14554
719
  {
14555
719
    ins->mnemonicendp = stpcpy (ins->obuf, "nop   ");
14556
719
  }
14557
1.32k
      else
14558
1.32k
  {
14559
1.32k
    USED_REX (REX_W);
14560
1.32k
    if (ins->rex & REX_W)
14561
359
      ins->mnemonicendp = stpcpy (ins->obuf, "nopq  ");
14562
964
    else
14563
964
      {
14564
964
        if (sizeflag & DFLAG)
14565
762
    ins->mnemonicendp = stpcpy (ins->obuf, "nopl  ");
14566
202
        else
14567
202
    ins->mnemonicendp = stpcpy (ins->obuf, "nopw  ");
14568
964
        ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
14569
964
      }
14570
1.32k
  }
14571
2.04k
      bytemode = v_mode;
14572
2.04k
    }
14573
14574
2.39k
  return OP_M (ins, bytemode, sizeflag);
14575
2.39k
}
14576
14577
static bool
14578
PUSH2_POP2_Fixup (instr_info *ins, int bytemode, int sizeflag)
14579
1.78k
{
14580
1.78k
  if (ins->modrm.mod != 3)
14581
276
    return true;
14582
14583
1.51k
  unsigned int vvvv_reg = ins->vex.register_specifier
14584
1.51k
    | (!ins->vex.v << 4);
14585
1.51k
  unsigned int rm_reg = ins->modrm.rm + (ins->rex & REX_B ? 8 : 0)
14586
1.51k
    + (ins->rex2 & REX_B ? 16 : 0);
14587
14588
  /* Push2/Pop2 cannot use RSP and Pop2 cannot pop two same registers.  */
14589
1.51k
  if (!ins->vex.nd || vvvv_reg == 0x4 || rm_reg == 0x4
14590
657
      || (!ins->modrm.reg
14591
402
    && vvvv_reg == rm_reg))
14592
1.04k
    {
14593
1.04k
      oappend (ins, "(bad)");
14594
1.04k
      return true;
14595
1.04k
    }
14596
14597
467
  return OP_VEX (ins, bytemode, sizeflag);
14598
1.51k
}
14599
14600
static bool
14601
JMPABS_Fixup (instr_info *ins, int bytemode, int sizeflag)
14602
17.3k
{
14603
17.3k
  if (ins->last_rex2_prefix >= 0)
14604
2.01k
    {
14605
2.01k
      uint64_t op;
14606
14607
2.01k
      if ((ins->prefixes & (PREFIX_OPCODE | PREFIX_ADDR | PREFIX_LOCK)) != 0x0
14608
1.72k
    || (ins->rex & REX_W) != 0x0)
14609
1.40k
  {
14610
1.40k
    oappend (ins, "(bad)");
14611
1.40k
    return true;
14612
1.40k
  }
14613
14614
612
      if (bytemode == eAX_reg)
14615
306
  return true;
14616
14617
306
      if (!get64 (ins, &op))
14618
69
  return false;
14619
14620
237
      ins->mnemonicendp = stpcpy (ins->obuf, "jmpabs");
14621
237
      ins->rex2 |= REX2_SPECIAL;
14622
237
      oappend_immediate (ins, op);
14623
14624
237
      return true;
14625
306
    }
14626
14627
15.3k
  if (bytemode == eAX_reg)
14628
7.67k
    return OP_IMREG (ins, bytemode, sizeflag);
14629
7.67k
  return OP_OFF64 (ins, bytemode, sizeflag);
14630
15.3k
}
14631
14632
static bool
14633
CFCMOV_Fixup (instr_info *ins, int opnd, int sizeflag)
14634
6.70k
{
14635
  /* EVEX.NF is used as a direction bit in the 2-operand case to reverse the
14636
     source and destination operands.  */
14637
6.70k
  bool dstmem = !ins->vex.nd && ins->vex.nf;
14638
14639
6.70k
  if (opnd == 0)
14640
3.38k
    {
14641
3.38k
      if (dstmem)
14642
565
  return OP_E (ins, v_swap_mode, sizeflag);
14643
2.82k
      return OP_G (ins, v_mode, sizeflag);
14644
3.38k
    }
14645
14646
  /* These bits have been consumed and should be cleared.  */
14647
3.31k
  ins->vex.nf = false;
14648
3.31k
  ins->vex.mask_register_specifier = 0;
14649
14650
3.31k
  if (dstmem)
14651
499
    return OP_G (ins, v_mode, sizeflag);
14652
2.82k
  return OP_E (ins, v_mode, sizeflag);
14653
3.31k
}