Home | History | Annotate | Line # | Download | only in opcodes
i386-dis.c revision 1.1.1.13
      1 /* Print i386 instructions for GDB, the GNU debugger.
      2    Copyright (C) 1988-2025 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 (at) prep.ai.mit.edu)
     23    July 1988
     24     modified by John Hassey (hassey (at) dg-rtp.dg.com)
     25     x86-64 support added by Jan Hubicka (jh (at) suse.cz)
     26     VIA PadLock support by Michal Ludvig (mludvig (at) suse.cz).  */
     27 
     28 /* The main tables describing the instructions is essentially a copy
     29    of the "Opcode Map" chapter (Appendix A) of the Intel 80386
     30    Programmers Manual.  Usually, there is a capital letter, followed
     31    by a small letter.  The capital letter tell the addressing mode,
     32    and the small letter tells about the operand size.  Refer to
     33    the Intel manual for details.  */
     34 
     35 #include "sysdep.h"
     36 #include "disassemble.h"
     37 #include "opintl.h"
     38 #include "opcode/i386.h"
     39 #include "libiberty.h"
     40 #include "safe-ctype.h"
     41 
     42 typedef struct instr_info instr_info;
     43 
     44 static bool dofloat (instr_info *, int);
     45 static int putop (instr_info *, const char *, int);
     46 static void oappend_with_style (instr_info *, const char *,
     47 				enum disassembler_style);
     48 
     49 static bool OP_E (instr_info *, int, int);
     50 static bool OP_E_memory (instr_info *, int, int);
     51 static bool OP_indirE (instr_info *, int, int);
     52 static bool OP_G (instr_info *, int, int);
     53 static bool OP_ST (instr_info *, int, int);
     54 static bool OP_STi (instr_info *, int, int);
     55 static bool OP_Skip_MODRM (instr_info *, int, int);
     56 static bool OP_REG (instr_info *, int, int);
     57 static bool OP_IMREG (instr_info *, int, int);
     58 static bool OP_I (instr_info *, int, int);
     59 static bool OP_I64 (instr_info *, int, int);
     60 static bool OP_sI (instr_info *, int, int);
     61 static bool OP_J (instr_info *, int, int);
     62 static bool OP_SEG (instr_info *, int, int);
     63 static bool OP_DIR (instr_info *, int, int);
     64 static bool OP_OFF (instr_info *, int, int);
     65 static bool OP_OFF64 (instr_info *, int, int);
     66 static bool OP_ESreg (instr_info *, int, int);
     67 static bool OP_DSreg (instr_info *, int, int);
     68 static bool OP_C (instr_info *, int, int);
     69 static bool OP_D (instr_info *, int, int);
     70 static bool OP_T (instr_info *, int, int);
     71 static bool OP_MMX (instr_info *, int, int);
     72 static bool OP_XMM (instr_info *, int, int);
     73 static bool OP_EM (instr_info *, int, int);
     74 static bool OP_EX (instr_info *, int, int);
     75 static bool OP_EMC (instr_info *, int,int);
     76 static bool OP_MXC (instr_info *, int,int);
     77 static bool OP_R (instr_info *, int, int);
     78 static bool OP_M (instr_info *, int, int);
     79 static bool OP_VEX (instr_info *, int, int);
     80 static bool OP_VexR (instr_info *, int, int);
     81 static bool OP_VexW (instr_info *, int, int);
     82 static bool OP_Rounding (instr_info *, int, int);
     83 static bool OP_REG_VexI4 (instr_info *, int, int);
     84 static bool OP_VexI4 (instr_info *, int, int);
     85 static bool OP_0f07 (instr_info *, int, int);
     86 static bool OP_Monitor (instr_info *, int, int);
     87 static bool OP_Mwait (instr_info *, int, int);
     88 
     89 static bool PCLMUL_Fixup (instr_info *, int, int);
     90 static bool VPCMP_Fixup (instr_info *, int, int);
     91 static bool VPCOM_Fixup (instr_info *, int, int);
     92 static bool NOP_Fixup (instr_info *, int, int);
     93 static bool MONTMUL_Fixup (instr_info *, int, int);
     94 static bool OP_3DNowSuffix (instr_info *, int, int);
     95 static bool CMP_Fixup (instr_info *, int, int);
     96 static bool REP_Fixup (instr_info *, int, int);
     97 static bool SEP_Fixup (instr_info *, int, int);
     98 static bool BND_Fixup (instr_info *, int, int);
     99 static bool NOTRACK_Fixup (instr_info *, int, int);
    100 static bool HLE_Fixup1 (instr_info *, int, int);
    101 static bool HLE_Fixup2 (instr_info *, int, int);
    102 static bool HLE_Fixup3 (instr_info *, int, int);
    103 static bool CMPXCHG8B_Fixup (instr_info *, int, int);
    104 static bool XMM_Fixup (instr_info *, int, int);
    105 static bool FXSAVE_Fixup (instr_info *, int, int);
    106 static bool MOVSXD_Fixup (instr_info *, int, int);
    107 static bool DistinctDest_Fixup (instr_info *, int, int);
    108 static bool PREFETCHI_Fixup (instr_info *, int, int);
    109 static bool PUSH2_POP2_Fixup (instr_info *, int, int);
    110 static bool JMPABS_Fixup (instr_info *, int, int);
    111 static bool CFCMOV_Fixup (instr_info *, int, int);
    112 
    113 static void ATTRIBUTE_PRINTF_3 i386_dis_printf (const disassemble_info *,
    114 						enum disassembler_style,
    115 						const char *, ...);
    116 
    117 /* This character is used to encode style information within the output
    118    buffers.  See oappend_insert_style for more details.  */
    119 #define STYLE_MARKER_CHAR '\002'
    120 
    121 /* The maximum operand buffer size.  */
    122 #define MAX_OPERAND_BUFFER_SIZE 128
    123 
    124 enum address_mode
    125 {
    126   mode_16bit,
    127   mode_32bit,
    128   mode_64bit
    129 };
    130 
    131 static const char *prefix_name (enum address_mode, uint8_t, int);
    132 
    133 enum x86_64_isa
    134 {
    135   amd64 = 1,
    136   intel64
    137 };
    138 
    139 enum evex_type
    140 {
    141   evex_default = 0,
    142   evex_from_legacy,
    143   evex_from_vex,
    144 };
    145 
    146 struct instr_info
    147 {
    148   enum address_mode address_mode;
    149 
    150   /* Flags for the prefixes for the current instruction.  See below.  */
    151   int prefixes;
    152 
    153   /* REX prefix the current instruction.  See below.  */
    154   uint8_t rex;
    155   /* Bits of REX we've already used.  */
    156   uint8_t rex_used;
    157 
    158   /* Record W R4 X4 B4 bits for rex2.  */
    159   unsigned char rex2;
    160   /* Bits of rex2 we've already used.  */
    161   unsigned char rex2_used;
    162   unsigned char rex2_payload;
    163 
    164   bool need_modrm;
    165   unsigned char condition_code;
    166   unsigned char need_vex;
    167   bool has_sib;
    168 
    169   /* Flags for ins->prefixes which we somehow handled when printing the
    170      current instruction.  */
    171   int used_prefixes;
    172 
    173   /* Flags for EVEX bits which we somehow handled when printing the
    174      current instruction.  */
    175   int evex_used;
    176 
    177   char obuf[MAX_OPERAND_BUFFER_SIZE];
    178   char *obufp;
    179   char *mnemonicendp;
    180   const uint8_t *start_codep;
    181   uint8_t *codep;
    182   const uint8_t *end_codep;
    183   unsigned char nr_prefixes;
    184   signed char last_lock_prefix;
    185   signed char last_repz_prefix;
    186   signed char last_repnz_prefix;
    187   signed char last_data_prefix;
    188   signed char last_addr_prefix;
    189   signed char last_rex_prefix;
    190   signed char last_rex2_prefix;
    191   signed char last_seg_prefix;
    192   signed char fwait_prefix;
    193   /* The active segment register prefix.  */
    194   unsigned char active_seg_prefix;
    195 
    196 #define MAX_CODE_LENGTH 15
    197   /* We can up to 14 ins->prefixes since the maximum instruction length is
    198      15bytes.  */
    199   uint8_t all_prefixes[MAX_CODE_LENGTH - 1];
    200   disassemble_info *info;
    201 
    202   struct
    203   {
    204     int mod;
    205     int reg;
    206     int rm;
    207   }
    208   modrm;
    209 
    210   struct
    211   {
    212     int scale;
    213     int index;
    214     int base;
    215   }
    216   sib;
    217 
    218   struct
    219   {
    220     int register_specifier;
    221     int length;
    222     int prefix;
    223     int mask_register_specifier;
    224     int scc;
    225     int ll;
    226     bool w;
    227     bool evex;
    228     bool v;
    229     bool zeroing;
    230     bool b;
    231     bool no_broadcast;
    232     bool nf;
    233   }
    234   vex;
    235 
    236 /* For APX EVEX-promoted prefix, EVEX.ND shares the same bit as vex.b.  */
    237 #define nd b
    238 
    239   enum evex_type evex_type;
    240 
    241   /* Remember if the current op is a jump instruction.  */
    242   bool op_is_jump;
    243 
    244   bool two_source_ops;
    245 
    246   /* Record whether EVEX masking is used incorrectly.  */
    247   bool illegal_masking;
    248 
    249   /* Record whether the modrm byte has been skipped.  */
    250   bool has_skipped_modrm;
    251 
    252   unsigned char op_ad;
    253   signed char op_index[MAX_OPERANDS];
    254   bool op_riprel[MAX_OPERANDS];
    255   char *op_out[MAX_OPERANDS];
    256   bfd_vma op_address[MAX_OPERANDS];
    257   bfd_vma start_pc;
    258 
    259   /* On the 386's of 1988, the maximum length of an instruction is 15 bytes.
    260    *   (see topic "Redundant ins->prefixes" in the "Differences from 8086"
    261    *   section of the "Virtual 8086 Mode" chapter.)
    262    * 'pc' should be the address of this instruction, it will
    263    *   be used to print the target address if this is a relative jump or call
    264    * The function returns the length of this instruction in bytes.
    265    */
    266   char intel_syntax;
    267   bool intel_mnemonic;
    268   char open_char;
    269   char close_char;
    270   char separator_char;
    271   char scale_char;
    272 
    273   enum x86_64_isa isa64;
    274 };
    275 
    276 struct dis_private {
    277   bfd_vma insn_start;
    278   int orig_sizeflag;
    279 
    280   /* Indexes first byte not fetched.  */
    281   unsigned int fetched;
    282   uint8_t the_buffer[2 * MAX_CODE_LENGTH - 1];
    283 };
    284 
    285 /* Mark parts used in the REX prefix.  When we are testing for
    286    empty prefix (for 8bit register REX extension), just mask it
    287    out.  Otherwise test for REX bit is excuse for existence of REX
    288    only in case value is nonzero.  */
    289 #define USED_REX(value)					\
    290   {							\
    291     if (value)						\
    292       {							\
    293 	if (ins->rex & value)				\
    294 	  ins->rex_used |= (value) | REX_OPCODE;	\
    295 	if (ins->rex2 & value)				\
    296 	  {						\
    297 	    ins->rex2_used |= (value);			\
    298 	    ins->rex_used |= REX_OPCODE;		\
    299 	  }						\
    300       }							\
    301     else						\
    302       ins->rex_used |= REX_OPCODE;			\
    303   }
    304 
    305 
    306 #define EVEX_b_used 1
    307 #define EVEX_len_used 2
    308 
    309 
    310 /* {rex2} is not printed when the REX2_SPECIAL is set.  */
    311 #define REX2_SPECIAL 16
    312 
    313 /* Flags stored in PREFIXES.  */
    314 #define PREFIX_REPZ 1
    315 #define PREFIX_REPNZ 2
    316 #define PREFIX_CS 4
    317 #define PREFIX_SS 8
    318 #define PREFIX_DS 0x10
    319 #define PREFIX_ES 0x20
    320 #define PREFIX_FS 0x40
    321 #define PREFIX_GS 0x80
    322 #define PREFIX_LOCK 0x100
    323 #define PREFIX_DATA 0x200
    324 #define PREFIX_ADDR 0x400
    325 #define PREFIX_FWAIT 0x800
    326 #define PREFIX_REX2 0x1000
    327 #define PREFIX_NP_OR_DATA 0x2000
    328 #define NO_PREFIX   0x4000
    329 
    330 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
    331    to ADDR (exclusive) are valid.  Returns true for success, false
    332    on error.  */
    333 static bool
    334 fetch_code (struct disassemble_info *info, const uint8_t *until)
    335 {
    336   int status = -1;
    337   struct dis_private *priv = info->private_data;
    338   bfd_vma start = priv->insn_start + priv->fetched;
    339   uint8_t *fetch_end = priv->the_buffer + priv->fetched;
    340   ptrdiff_t needed = until - fetch_end;
    341 
    342   if (needed <= 0)
    343     return true;
    344 
    345   if (priv->fetched + (size_t) needed <= ARRAY_SIZE (priv->the_buffer))
    346     status = (*info->read_memory_func) (start, fetch_end, needed, info);
    347   if (status != 0)
    348     {
    349       /* If we did manage to read at least one byte, then
    350 	 print_insn_i386 will do something sensible.  Otherwise, print
    351 	 an error.  We do that here because this is where we know
    352 	 STATUS.  */
    353       if (!priv->fetched)
    354 	(*info->memory_error_func) (status, start, info);
    355       return false;
    356     }
    357 
    358   priv->fetched += needed;
    359   return true;
    360 }
    361 
    362 static bool
    363 fetch_modrm (instr_info *ins)
    364 {
    365   if (!fetch_code (ins->info, ins->codep + 1))
    366     return false;
    367 
    368   ins->modrm.mod = (*ins->codep >> 6) & 3;
    369   ins->modrm.reg = (*ins->codep >> 3) & 7;
    370   ins->modrm.rm = *ins->codep & 7;
    371 
    372   return true;
    373 }
    374 
    375 static int
    376 fetch_error (const instr_info *ins)
    377 {
    378   /* Getting here means we tried for data but didn't get it.  That
    379      means we have an incomplete instruction of some sort.  Just
    380      print the first byte as a prefix or a .byte pseudo-op.  */
    381   const struct dis_private *priv = ins->info->private_data;
    382   const char *name = NULL;
    383 
    384   if (ins->codep <= priv->the_buffer)
    385     return -1;
    386 
    387   if (ins->prefixes || ins->fwait_prefix >= 0 || (ins->rex & REX_OPCODE))
    388     name = prefix_name (ins->address_mode, priv->the_buffer[0],
    389 			priv->orig_sizeflag);
    390   if (name != NULL)
    391     i386_dis_printf (ins->info, dis_style_mnemonic, "%s", name);
    392   else
    393     {
    394       /* Just print the first byte as a .byte instruction.  */
    395       i386_dis_printf (ins->info, dis_style_assembler_directive, ".byte ");
    396       i386_dis_printf (ins->info, dis_style_immediate, "%#x",
    397 		       (unsigned int) priv->the_buffer[0]);
    398     }
    399 
    400   return 1;
    401 }
    402 
    403 /* Possible values for prefix requirement.  */
    404 #define PREFIX_IGNORED_SHIFT	16
    405 #define PREFIX_IGNORED_REPZ	(PREFIX_REPZ << PREFIX_IGNORED_SHIFT)
    406 #define PREFIX_IGNORED_REPNZ	(PREFIX_REPNZ << PREFIX_IGNORED_SHIFT)
    407 #define PREFIX_IGNORED_DATA	(PREFIX_DATA << PREFIX_IGNORED_SHIFT)
    408 #define PREFIX_IGNORED_ADDR	(PREFIX_ADDR << PREFIX_IGNORED_SHIFT)
    409 #define PREFIX_IGNORED_LOCK	(PREFIX_LOCK << PREFIX_IGNORED_SHIFT)
    410 #define PREFIX_REX2_ILLEGAL	(PREFIX_REX2 << PREFIX_IGNORED_SHIFT)
    411 
    412 /* Opcode prefixes.  */
    413 #define PREFIX_OPCODE		(PREFIX_REPZ \
    414 				 | PREFIX_REPNZ \
    415 				 | PREFIX_DATA)
    416 
    417 /* Prefixes ignored.  */
    418 #define PREFIX_IGNORED		(PREFIX_IGNORED_REPZ \
    419 				 | PREFIX_IGNORED_REPNZ \
    420 				 | PREFIX_IGNORED_DATA)
    421 
    422 #define XX { NULL, 0 }
    423 #define Bad_Opcode NULL, { { NULL, 0 } }, 0
    424 
    425 #define Eb { OP_E, b_mode }
    426 #define Ebnd { OP_E, bnd_mode }
    427 #define EbS { OP_E, b_swap_mode }
    428 #define EbndS { OP_E, bnd_swap_mode }
    429 #define Ev { OP_E, v_mode }
    430 #define Eva { OP_E, va_mode }
    431 #define Ev_bnd { OP_E, v_bnd_mode }
    432 #define EvS { OP_E, v_swap_mode }
    433 #define Ed { OP_E, d_mode }
    434 #define Edq { OP_E, dq_mode }
    435 #define Edb { OP_E, db_mode }
    436 #define Edw { OP_E, dw_mode }
    437 #define Eq { OP_E, q_mode }
    438 #define indirEv { OP_indirE, indir_v_mode }
    439 #define indirEp { OP_indirE, f_mode }
    440 #define stackEv { OP_E, stack_v_mode }
    441 #define Em { OP_E, m_mode }
    442 #define Ew { OP_E, w_mode }
    443 #define M { OP_M, 0 }		/* lea, lgdt, etc. */
    444 #define Ma { OP_M, a_mode }
    445 #define Mb { OP_M, b_mode }
    446 #define Md { OP_M, d_mode }
    447 #define Mdq { OP_M, dq_mode }
    448 #define Mo { OP_M, o_mode }
    449 #define Mp { OP_M, f_mode }		/* 32 or 48 bit memory operand for LDS, LES etc */
    450 #define Mq { OP_M, q_mode }
    451 #define Mv { OP_M, v_mode }
    452 #define Mv_bnd { OP_M, v_bndmk_mode }
    453 #define Mw { OP_M, w_mode }
    454 #define Mx { OP_M, x_mode }
    455 #define Mxmm { OP_M, xmm_mode }
    456 #define Mymm { OP_M, ymm_mode }
    457 #define Gb { OP_G, b_mode }
    458 #define Gbnd { OP_G, bnd_mode }
    459 #define Gv { OP_G, v_mode }
    460 #define Gd { OP_G, d_mode }
    461 #define Gdq { OP_G, dq_mode }
    462 #define Gq { OP_G, q_mode }
    463 #define Gm { OP_G, m_mode }
    464 #define Gva { OP_G, va_mode }
    465 #define Gw { OP_G, w_mode }
    466 #define Ib { OP_I, b_mode }
    467 #define sIb { OP_sI, b_mode }	/* sign extened byte */
    468 #define sIbT { OP_sI, b_T_mode } /* sign extened byte like 'T' */
    469 #define Iv { OP_I, v_mode }
    470 #define sIv { OP_sI, v_mode }
    471 #define Iv64 { OP_I64, v_mode }
    472 #define Id { OP_I, d_mode }
    473 #define Iw { OP_I, w_mode }
    474 #define I1 { OP_I, const_1_mode }
    475 #define Jb { OP_J, b_mode }
    476 #define Jv { OP_J, v_mode }
    477 #define Jdqw { OP_J, dqw_mode }
    478 #define Cm { OP_C, m_mode }
    479 #define Dm { OP_D, m_mode }
    480 #define Td { OP_T, d_mode }
    481 #define Skip_MODRM { OP_Skip_MODRM, 0 }
    482 
    483 #define RMeAX { OP_REG, eAX_reg }
    484 #define RMeBX { OP_REG, eBX_reg }
    485 #define RMeCX { OP_REG, eCX_reg }
    486 #define RMeDX { OP_REG, eDX_reg }
    487 #define RMeSP { OP_REG, eSP_reg }
    488 #define RMeBP { OP_REG, eBP_reg }
    489 #define RMeSI { OP_REG, eSI_reg }
    490 #define RMeDI { OP_REG, eDI_reg }
    491 #define RMrAX { OP_REG, rAX_reg }
    492 #define RMrBX { OP_REG, rBX_reg }
    493 #define RMrCX { OP_REG, rCX_reg }
    494 #define RMrDX { OP_REG, rDX_reg }
    495 #define RMrSP { OP_REG, rSP_reg }
    496 #define RMrBP { OP_REG, rBP_reg }
    497 #define RMrSI { OP_REG, rSI_reg }
    498 #define RMrDI { OP_REG, rDI_reg }
    499 #define RMAL { OP_REG, al_reg }
    500 #define RMCL { OP_REG, cl_reg }
    501 #define RMDL { OP_REG, dl_reg }
    502 #define RMBL { OP_REG, bl_reg }
    503 #define RMAH { OP_REG, ah_reg }
    504 #define RMCH { OP_REG, ch_reg }
    505 #define RMDH { OP_REG, dh_reg }
    506 #define RMBH { OP_REG, bh_reg }
    507 #define RMAX { OP_REG, ax_reg }
    508 #define RMDX { OP_REG, dx_reg }
    509 
    510 #define eAX { OP_IMREG, eAX_reg }
    511 #define AL { OP_IMREG, al_reg }
    512 #define CL { OP_IMREG, cl_reg }
    513 #define zAX { OP_IMREG, z_mode_ax_reg }
    514 #define indirDX { OP_IMREG, indir_dx_reg }
    515 
    516 #define Sw { OP_SEG, w_mode }
    517 #define Sv { OP_SEG, v_mode }
    518 #define Ap { OP_DIR, 0 }
    519 #define Ob { OP_OFF64, b_mode }
    520 #define Ov { OP_OFF64, v_mode }
    521 #define Xb { OP_DSreg, eSI_reg }
    522 #define Xv { OP_DSreg, eSI_reg }
    523 #define Xz { OP_DSreg, eSI_reg }
    524 #define Yb { OP_ESreg, eDI_reg }
    525 #define Yv { OP_ESreg, eDI_reg }
    526 #define DSCX { OP_DSreg, eCX_reg }
    527 #define DSBX { OP_DSreg, eBX_reg }
    528 
    529 #define es { OP_REG, es_reg }
    530 #define ss { OP_REG, ss_reg }
    531 #define cs { OP_REG, cs_reg }
    532 #define ds { OP_REG, ds_reg }
    533 #define fs { OP_REG, fs_reg }
    534 #define gs { OP_REG, gs_reg }
    535 
    536 #define MX { OP_MMX, 0 }
    537 #define XM { OP_XMM, 0 }
    538 #define XMScalar { OP_XMM, scalar_mode }
    539 #define XMGatherD { OP_XMM, vex_vsib_d_w_dq_mode }
    540 #define XMGatherQ { OP_XMM, vex_vsib_q_w_dq_mode }
    541 #define XMM { OP_XMM, xmm_mode }
    542 #define TMM { OP_XMM, tmm_mode }
    543 #define XMxmmq { OP_XMM, xmmq_mode }
    544 #define EM { OP_EM, v_mode }
    545 #define EMS { OP_EM, v_swap_mode }
    546 #define EMd { OP_EM, d_mode }
    547 #define EMx { OP_EM, x_mode }
    548 #define EXbwUnit { OP_EX, bw_unit_mode }
    549 #define EXb { OP_EX, b_mode }
    550 #define EXw { OP_EX, w_mode }
    551 #define EXd { OP_EX, d_mode }
    552 #define EXdS { OP_EX, d_swap_mode }
    553 #define EXwS { OP_EX, w_swap_mode }
    554 #define EXq { OP_EX, q_mode }
    555 #define EXqS { OP_EX, q_swap_mode }
    556 #define EXdq { OP_EX, dq_mode }
    557 #define EXx { OP_EX, x_mode }
    558 #define EXxh { OP_EX, xh_mode }
    559 #define EXxS { OP_EX, x_swap_mode }
    560 #define EXxmm { OP_EX, xmm_mode }
    561 #define EXymm { OP_EX, ymm_mode }
    562 #define EXxmmq { OP_EX, xmmq_mode }
    563 #define EXxmmqh { OP_EX, evex_half_bcst_xmmqh_mode }
    564 #define EXEvexHalfBcstXmmq { OP_EX, evex_half_bcst_xmmq_mode }
    565 #define EXxmmdw { OP_EX, xmmdw_mode }
    566 #define EXxmmqd { OP_EX, xmmqd_mode }
    567 #define EXxmmqdh { OP_EX, evex_half_bcst_xmmqdh_mode }
    568 #define EXymmq { OP_EX, ymmq_mode }
    569 #define EXEvexXGscat { OP_EX, evex_x_gscat_mode }
    570 #define EXEvexXNoBcst { OP_EX, evex_x_nobcst_mode }
    571 #define Rd { OP_R, d_mode }
    572 #define Rdq { OP_R, dq_mode }
    573 #define Rq { OP_R, q_mode }
    574 #define Nq { OP_R, q_mm_mode }
    575 #define Ux { OP_R, x_mode }
    576 #define Uxmm { OP_R, xmm_mode }
    577 #define Rxmmq { OP_R, xmmq_mode }
    578 #define Rymm { OP_R, ymm_mode }
    579 #define Rtmm { OP_R, tmm_mode }
    580 #define EMCq { OP_EMC, q_mode }
    581 #define MXC { OP_MXC, 0 }
    582 #define OPSUF { OP_3DNowSuffix, 0 }
    583 #define SEP { SEP_Fixup, 0 }
    584 #define CMP { CMP_Fixup, 0 }
    585 #define XMM0 { XMM_Fixup, 0 }
    586 #define FXSAVE { FXSAVE_Fixup, 0 }
    587 
    588 #define Vex { OP_VEX, x_mode }
    589 #define VexW { OP_VexW, x_mode }
    590 #define VexScalar { OP_VEX, scalar_mode }
    591 #define VexScalarR { OP_VexR, scalar_mode }
    592 #define VexGatherD { OP_VEX, vex_vsib_d_w_dq_mode }
    593 #define VexGatherQ { OP_VEX, vex_vsib_q_w_dq_mode }
    594 #define VexGdq { OP_VEX, dq_mode }
    595 #define VexGb { OP_VEX, b_mode }
    596 #define VexGv { OP_VEX, v_mode }
    597 #define VexTmm { OP_VEX, tmm_mode }
    598 #define XMVexI4 { OP_REG_VexI4, x_mode }
    599 #define XMVexScalarI4 { OP_REG_VexI4, scalar_mode }
    600 #define VexI4 { OP_VexI4, 0 }
    601 #define PCLMUL { PCLMUL_Fixup, 0 }
    602 #define VPCMP { VPCMP_Fixup, 0 }
    603 #define VPCOM { VPCOM_Fixup, 0 }
    604 
    605 #define EXxEVexR { OP_Rounding, evex_rounding_mode }
    606 #define EXxEVexR64 { OP_Rounding, evex_rounding_64_mode }
    607 #define EXxEVexS { OP_Rounding, evex_sae_mode }
    608 
    609 #define MaskG { OP_G, mask_mode }
    610 #define MaskE { OP_E, mask_mode }
    611 #define MaskR { OP_R, mask_mode }
    612 #define MaskBDE { OP_E, mask_bd_mode }
    613 #define MaskVex { OP_VEX, mask_mode }
    614 
    615 #define MVexVSIBDWpX { OP_M, vex_vsib_d_w_dq_mode }
    616 #define MVexVSIBQWpX { OP_M, vex_vsib_q_w_dq_mode }
    617 
    618 #define MVexSIBMEM { OP_M, vex_sibmem_mode }
    619 
    620 /* Used handle "rep" prefix for string instructions.  */
    621 #define Xbr { REP_Fixup, eSI_reg }
    622 #define Xvr { REP_Fixup, eSI_reg }
    623 #define Ybr { REP_Fixup, eDI_reg }
    624 #define Yvr { REP_Fixup, eDI_reg }
    625 #define Yzr { REP_Fixup, eDI_reg }
    626 #define indirDXr { REP_Fixup, indir_dx_reg }
    627 #define ALr { REP_Fixup, al_reg }
    628 #define eAXr { REP_Fixup, eAX_reg }
    629 
    630 /* Used handle HLE prefix for lockable instructions.  */
    631 #define Ebh1 { HLE_Fixup1, b_mode }
    632 #define Evh1 { HLE_Fixup1, v_mode }
    633 #define Ebh2 { HLE_Fixup2, b_mode }
    634 #define Evh2 { HLE_Fixup2, v_mode }
    635 #define Ebh3 { HLE_Fixup3, b_mode }
    636 #define Evh3 { HLE_Fixup3, v_mode }
    637 
    638 #define BND { BND_Fixup, 0 }
    639 #define NOTRACK { NOTRACK_Fixup, 0 }
    640 
    641 #define cond_jump_flag { NULL, cond_jump_mode }
    642 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
    643 
    644 /* bits in sizeflag */
    645 #define SUFFIX_ALWAYS 4
    646 #define AFLAG 2
    647 #define DFLAG 1
    648 
    649 enum
    650 {
    651   /* byte operand */
    652   b_mode = 1,
    653   /* byte operand with operand swapped */
    654   b_swap_mode,
    655   /* byte operand, sign extend like 'T' suffix */
    656   b_T_mode,
    657   /* operand size depends on prefixes */
    658   v_mode,
    659   /* operand size depends on prefixes with operand swapped */
    660   v_swap_mode,
    661   /* operand size depends on address prefix */
    662   va_mode,
    663   /* word operand */
    664   w_mode,
    665   /* double word operand  */
    666   d_mode,
    667   /* word operand with operand swapped  */
    668   w_swap_mode,
    669   /* double word operand with operand swapped */
    670   d_swap_mode,
    671   /* quad word operand */
    672   q_mode,
    673   /* 8-byte MM operand */
    674   q_mm_mode,
    675   /* quad word operand with operand swapped */
    676   q_swap_mode,
    677   /* ten-byte operand */
    678   t_mode,
    679   /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand.  In EVEX with
    680      broadcast enabled.  */
    681   x_mode,
    682   /* Similar to x_mode, but with different EVEX mem shifts.  */
    683   evex_x_gscat_mode,
    684   /* Similar to x_mode, but with yet different EVEX mem shifts.  */
    685   bw_unit_mode,
    686   /* Similar to x_mode, but with disabled broadcast.  */
    687   evex_x_nobcst_mode,
    688   /* Similar to x_mode, but with operands swapped and disabled broadcast
    689      in EVEX.  */
    690   x_swap_mode,
    691   /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand.  In EVEX with
    692      broadcast of 16bit enabled.  */
    693   xh_mode,
    694   /* 16-byte XMM operand */
    695   xmm_mode,
    696   /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
    697      memory operand (depending on vector length).  Broadcast isn't
    698      allowed.  */
    699   xmmq_mode,
    700   /* Same as xmmq_mode, but broadcast is allowed.  */
    701   evex_half_bcst_xmmq_mode,
    702   /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
    703      memory operand (depending on vector length).  16bit broadcast.  */
    704   evex_half_bcst_xmmqh_mode,
    705   /* 16-byte XMM, word, double word or quad word operand.  */
    706   xmmdw_mode,
    707   /* 16-byte XMM, double word, quad word operand or xmm word operand.  */
    708   xmmqd_mode,
    709   /* 16-byte XMM, double word, quad word operand or xmm word operand.
    710      16bit broadcast.  */
    711   evex_half_bcst_xmmqdh_mode,
    712   /* 32-byte YMM operand */
    713   ymm_mode,
    714   /* quad word, ymmword or zmmword memory operand.  */
    715   ymmq_mode,
    716   /* TMM operand */
    717   tmm_mode,
    718   /* d_mode in 32bit, q_mode in 64bit mode.  */
    719   m_mode,
    720   /* pair of v_mode operands */
    721   a_mode,
    722   cond_jump_mode,
    723   loop_jcxz_mode,
    724   movsxd_mode,
    725   v_bnd_mode,
    726   /* like v_bnd_mode in 32bit, no RIP-rel in 64bit mode.  */
    727   v_bndmk_mode,
    728   /* operand size depends on REX.W / VEX.W.  */
    729   dq_mode,
    730   /* Displacements like v_mode without considering Intel64 ISA.  */
    731   dqw_mode,
    732   /* bounds operand */
    733   bnd_mode,
    734   /* bounds operand with operand swapped */
    735   bnd_swap_mode,
    736   /* 4- or 6-byte pointer operand */
    737   f_mode,
    738   const_1_mode,
    739   /* v_mode for indirect branch opcodes.  */
    740   indir_v_mode,
    741   /* v_mode for stack-related opcodes.  */
    742   stack_v_mode,
    743   /* non-quad operand size depends on prefixes */
    744   z_mode,
    745   /* 16-byte operand */
    746   o_mode,
    747   /* registers like d_mode, memory like b_mode.  */
    748   db_mode,
    749   /* registers like d_mode, memory like w_mode.  */
    750   dw_mode,
    751 
    752   /* Operand size depends on the VEX.W bit, with VSIB dword indices.  */
    753   vex_vsib_d_w_dq_mode,
    754   /* Operand size depends on the VEX.W bit, with VSIB qword indices.  */
    755   vex_vsib_q_w_dq_mode,
    756   /* mandatory non-vector SIB.  */
    757   vex_sibmem_mode,
    758 
    759   /* scalar, ignore vector length.  */
    760   scalar_mode,
    761 
    762   /* Static rounding.  */
    763   evex_rounding_mode,
    764   /* Static rounding, 64-bit mode only.  */
    765   evex_rounding_64_mode,
    766   /* Supress all exceptions.  */
    767   evex_sae_mode,
    768 
    769   /* Mask register operand.  */
    770   mask_mode,
    771   /* Mask register operand.  */
    772   mask_bd_mode,
    773 
    774   es_reg,
    775   cs_reg,
    776   ss_reg,
    777   ds_reg,
    778   fs_reg,
    779   gs_reg,
    780 
    781   eAX_reg,
    782   eCX_reg,
    783   eDX_reg,
    784   eBX_reg,
    785   eSP_reg,
    786   eBP_reg,
    787   eSI_reg,
    788   eDI_reg,
    789 
    790   al_reg,
    791   cl_reg,
    792   dl_reg,
    793   bl_reg,
    794   ah_reg,
    795   ch_reg,
    796   dh_reg,
    797   bh_reg,
    798 
    799   ax_reg,
    800   cx_reg,
    801   dx_reg,
    802   bx_reg,
    803   sp_reg,
    804   bp_reg,
    805   si_reg,
    806   di_reg,
    807 
    808   rAX_reg,
    809   rCX_reg,
    810   rDX_reg,
    811   rBX_reg,
    812   rSP_reg,
    813   rBP_reg,
    814   rSI_reg,
    815   rDI_reg,
    816 
    817   z_mode_ax_reg,
    818   indir_dx_reg
    819 };
    820 
    821 enum
    822 {
    823   FLOATCODE = 1,
    824   USE_REG_TABLE,
    825   USE_MOD_TABLE,
    826   USE_RM_TABLE,
    827   USE_PREFIX_TABLE,
    828   USE_X86_64_TABLE,
    829   USE_X86_64_EVEX_FROM_VEX_TABLE,
    830   USE_X86_64_EVEX_PFX_TABLE,
    831   USE_X86_64_EVEX_W_TABLE,
    832   USE_X86_64_EVEX_MEM_W_TABLE,
    833   USE_3BYTE_TABLE,
    834   USE_XOP_8F_TABLE,
    835   USE_VEX_C4_TABLE,
    836   USE_VEX_C5_TABLE,
    837   USE_VEX_LEN_TABLE,
    838   USE_VEX_W_TABLE,
    839   USE_EVEX_TABLE,
    840   USE_EVEX_LEN_TABLE
    841 };
    842 
    843 #define FLOAT			NULL, { { NULL, FLOATCODE } }, 0
    844 
    845 #define DIS386(T, I)		NULL, { { NULL, (T)}, { NULL,  (I) } }, 0
    846 #define REG_TABLE(I)		DIS386 (USE_REG_TABLE, (I))
    847 #define MOD_TABLE(I)		DIS386 (USE_MOD_TABLE, (I))
    848 #define RM_TABLE(I)		DIS386 (USE_RM_TABLE, (I))
    849 #define PREFIX_TABLE(I)		DIS386 (USE_PREFIX_TABLE, (I))
    850 #define X86_64_TABLE(I)		DIS386 (USE_X86_64_TABLE, (I))
    851 #define X86_64_EVEX_FROM_VEX_TABLE(I) \
    852   DIS386 (USE_X86_64_EVEX_FROM_VEX_TABLE, (I))
    853 #define X86_64_EVEX_PFX_TABLE(I) DIS386 (USE_X86_64_EVEX_PFX_TABLE, (I))
    854 #define X86_64_EVEX_W_TABLE(I) DIS386 (USE_X86_64_EVEX_W_TABLE, (I))
    855 #define X86_64_EVEX_MEM_W_TABLE(I) DIS386 (USE_X86_64_EVEX_MEM_W_TABLE, (I))
    856 #define THREE_BYTE_TABLE(I)	DIS386 (USE_3BYTE_TABLE, (I))
    857 #define XOP_8F_TABLE()		DIS386 (USE_XOP_8F_TABLE, 0)
    858 #define VEX_C4_TABLE()		DIS386 (USE_VEX_C4_TABLE, 0)
    859 #define VEX_C5_TABLE()		DIS386 (USE_VEX_C5_TABLE, 0)
    860 #define VEX_LEN_TABLE(I)	DIS386 (USE_VEX_LEN_TABLE, (I))
    861 #define VEX_W_TABLE(I)		DIS386 (USE_VEX_W_TABLE, (I))
    862 #define EVEX_TABLE()		DIS386 (USE_EVEX_TABLE, 0)
    863 #define EVEX_LEN_TABLE(I)	DIS386 (USE_EVEX_LEN_TABLE, (I))
    864 
    865 enum
    866 {
    867   REG_80 = 0,
    868   REG_81,
    869   REG_83,
    870   REG_8F,
    871   REG_C0,
    872   REG_C1,
    873   REG_C6,
    874   REG_C7,
    875   REG_D0,
    876   REG_D1,
    877   REG_D2,
    878   REG_D3,
    879   REG_F6,
    880   REG_F7,
    881   REG_FE,
    882   REG_FF,
    883   REG_0F00,
    884   REG_0F01,
    885   REG_0F0D,
    886   REG_0F18,
    887   REG_0F1C_P_0_MOD_0,
    888   REG_0F1E_P_1_MOD_3,
    889   REG_0F38D8_PREFIX_1,
    890   REG_0F3A0F_P_1,
    891   REG_0F71,
    892   REG_0F72,
    893   REG_0F73,
    894   REG_0FA6,
    895   REG_0FA7,
    896   REG_0FAE,
    897   REG_0FBA,
    898   REG_0FC7,
    899   REG_VEX_0F71,
    900   REG_VEX_0F72,
    901   REG_VEX_0F73,
    902   REG_VEX_0FAE,
    903   REG_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0,
    904   REG_VEX_0F38F3_L_0_P_0,
    905   REG_VEX_MAP7_F6_L_0_W_0,
    906   REG_VEX_MAP7_F8_L_0_W_0,
    907 
    908   REG_XOP_09_01_L_0,
    909   REG_XOP_09_02_L_0,
    910   REG_XOP_09_12_L_0,
    911   REG_XOP_0A_12_L_0,
    912 
    913   REG_EVEX_0F71,
    914   REG_EVEX_0F72,
    915   REG_EVEX_0F73,
    916   REG_EVEX_0F38C6_L_2,
    917   REG_EVEX_0F38C7_L_2,
    918   REG_EVEX_MAP4_80,
    919   REG_EVEX_MAP4_81,
    920   REG_EVEX_MAP4_83,
    921   REG_EVEX_MAP4_8F,
    922   REG_EVEX_MAP4_F6,
    923   REG_EVEX_MAP4_F7,
    924   REG_EVEX_MAP4_FE,
    925   REG_EVEX_MAP4_FF,
    926 };
    927 
    928 enum
    929 {
    930   MOD_62_32BIT = 0,
    931   MOD_C4_32BIT,
    932   MOD_C5_32BIT,
    933   MOD_0F01_REG_0,
    934   MOD_0F01_REG_1,
    935   MOD_0F01_REG_2,
    936   MOD_0F01_REG_3,
    937   MOD_0F01_REG_5,
    938   MOD_0F01_REG_7,
    939   MOD_0F12_PREFIX_0,
    940   MOD_0F16_PREFIX_0,
    941   MOD_0F18_REG_0,
    942   MOD_0F18_REG_1,
    943   MOD_0F18_REG_2,
    944   MOD_0F18_REG_3,
    945   MOD_0F18_REG_4,
    946   MOD_0F18_REG_6,
    947   MOD_0F18_REG_7,
    948   MOD_0F1A_PREFIX_0,
    949   MOD_0F1B_PREFIX_0,
    950   MOD_0F1B_PREFIX_1,
    951   MOD_0F1C_PREFIX_0,
    952   MOD_0F1E_PREFIX_1,
    953   MOD_0FAE_REG_0,
    954   MOD_0FAE_REG_1,
    955   MOD_0FAE_REG_2,
    956   MOD_0FAE_REG_3,
    957   MOD_0FAE_REG_4,
    958   MOD_0FAE_REG_5,
    959   MOD_0FAE_REG_6,
    960   MOD_0FAE_REG_7,
    961   MOD_0FC7_REG_6,
    962   MOD_0FC7_REG_7,
    963   MOD_0F38DC_PREFIX_1,
    964   MOD_0F38F8,
    965 
    966   MOD_VEX_0F3849_X86_64_L_0_W_0,
    967 
    968   MOD_EVEX_MAP4_60,
    969   MOD_EVEX_MAP4_61,
    970   MOD_EVEX_MAP4_F8_P_1,
    971   MOD_EVEX_MAP4_F8_P_3,
    972 };
    973 
    974 enum
    975 {
    976   RM_C6_REG_7 = 0,
    977   RM_C7_REG_7,
    978   RM_0F01_REG_0,
    979   RM_0F01_REG_1,
    980   RM_0F01_REG_2,
    981   RM_0F01_REG_3,
    982   RM_0F01_REG_5_MOD_3,
    983   RM_0F01_REG_7_MOD_3,
    984   RM_0F1E_P_1_MOD_3_REG_7,
    985   RM_0FAE_REG_6_MOD_3_P_0,
    986   RM_0FAE_REG_7_MOD_3,
    987   RM_0F3A0F_P_1_R_0,
    988 
    989   RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0_R_0,
    990   RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_3,
    991 };
    992 
    993 enum
    994 {
    995   PREFIX_90 = 0,
    996   PREFIX_0F00_REG_6_X86_64,
    997   PREFIX_0F01_REG_0_MOD_3_RM_6,
    998   PREFIX_0F01_REG_0_MOD_3_RM_7,
    999   PREFIX_0F01_REG_1_RM_2,
   1000   PREFIX_0F01_REG_1_RM_4,
   1001   PREFIX_0F01_REG_1_RM_5,
   1002   PREFIX_0F01_REG_1_RM_6,
   1003   PREFIX_0F01_REG_1_RM_7,
   1004   PREFIX_0F01_REG_3_RM_1,
   1005   PREFIX_0F01_REG_5_MOD_0,
   1006   PREFIX_0F01_REG_5_MOD_3_RM_0,
   1007   PREFIX_0F01_REG_5_MOD_3_RM_1,
   1008   PREFIX_0F01_REG_5_MOD_3_RM_2,
   1009   PREFIX_0F01_REG_5_MOD_3_RM_4,
   1010   PREFIX_0F01_REG_5_MOD_3_RM_5,
   1011   PREFIX_0F01_REG_5_MOD_3_RM_6,
   1012   PREFIX_0F01_REG_5_MOD_3_RM_7,
   1013   PREFIX_0F01_REG_7_MOD_3_RM_2,
   1014   PREFIX_0F01_REG_7_MOD_3_RM_5,
   1015   PREFIX_0F01_REG_7_MOD_3_RM_6,
   1016   PREFIX_0F01_REG_7_MOD_3_RM_7,
   1017   PREFIX_0F09,
   1018   PREFIX_0F10,
   1019   PREFIX_0F11,
   1020   PREFIX_0F12,
   1021   PREFIX_0F16,
   1022   PREFIX_0F18_REG_6_MOD_0_X86_64,
   1023   PREFIX_0F18_REG_7_MOD_0_X86_64,
   1024   PREFIX_0F1A,
   1025   PREFIX_0F1B,
   1026   PREFIX_0F1C,
   1027   PREFIX_0F1E,
   1028   PREFIX_0F2A,
   1029   PREFIX_0F2B,
   1030   PREFIX_0F2C,
   1031   PREFIX_0F2D,
   1032   PREFIX_0F2E,
   1033   PREFIX_0F2F,
   1034   PREFIX_0F51,
   1035   PREFIX_0F52,
   1036   PREFIX_0F53,
   1037   PREFIX_0F58,
   1038   PREFIX_0F59,
   1039   PREFIX_0F5A,
   1040   PREFIX_0F5B,
   1041   PREFIX_0F5C,
   1042   PREFIX_0F5D,
   1043   PREFIX_0F5E,
   1044   PREFIX_0F5F,
   1045   PREFIX_0F60,
   1046   PREFIX_0F61,
   1047   PREFIX_0F62,
   1048   PREFIX_0F6F,
   1049   PREFIX_0F70,
   1050   PREFIX_0F78,
   1051   PREFIX_0F79,
   1052   PREFIX_0F7C,
   1053   PREFIX_0F7D,
   1054   PREFIX_0F7E,
   1055   PREFIX_0F7F,
   1056   PREFIX_0FA6_REG_0,
   1057   PREFIX_0FA6_REG_5,
   1058   PREFIX_0FA7_REG_6,
   1059   PREFIX_0FAE_REG_0_MOD_3,
   1060   PREFIX_0FAE_REG_1_MOD_3,
   1061   PREFIX_0FAE_REG_2_MOD_3,
   1062   PREFIX_0FAE_REG_3_MOD_3,
   1063   PREFIX_0FAE_REG_4_MOD_0,
   1064   PREFIX_0FAE_REG_4_MOD_3,
   1065   PREFIX_0FAE_REG_5_MOD_3,
   1066   PREFIX_0FAE_REG_6_MOD_0,
   1067   PREFIX_0FAE_REG_6_MOD_3,
   1068   PREFIX_0FAE_REG_7_MOD_0,
   1069   PREFIX_0FB8,
   1070   PREFIX_0FBC,
   1071   PREFIX_0FBD,
   1072   PREFIX_0FC2,
   1073   PREFIX_0FC7_REG_6_MOD_0,
   1074   PREFIX_0FC7_REG_6_MOD_3,
   1075   PREFIX_0FC7_REG_7_MOD_3,
   1076   PREFIX_0FD0,
   1077   PREFIX_0FD6,
   1078   PREFIX_0FE6,
   1079   PREFIX_0FE7,
   1080   PREFIX_0FF0,
   1081   PREFIX_0FF7,
   1082   PREFIX_0F38D8,
   1083   PREFIX_0F38DC,
   1084   PREFIX_0F38DD,
   1085   PREFIX_0F38DE,
   1086   PREFIX_0F38DF,
   1087   PREFIX_0F38F0,
   1088   PREFIX_0F38F1,
   1089   PREFIX_0F38F6,
   1090   PREFIX_0F38F8_M_0,
   1091   PREFIX_0F38F8_M_1_X86_64,
   1092   PREFIX_0F38FA,
   1093   PREFIX_0F38FB,
   1094   PREFIX_0F38FC,
   1095   PREFIX_0F3A0F,
   1096   PREFIX_VEX_0F12,
   1097   PREFIX_VEX_0F16,
   1098   PREFIX_VEX_0F2A,
   1099   PREFIX_VEX_0F2C,
   1100   PREFIX_VEX_0F2D,
   1101   PREFIX_VEX_0F41_L_1_W_0,
   1102   PREFIX_VEX_0F41_L_1_W_1,
   1103   PREFIX_VEX_0F42_L_1_W_0,
   1104   PREFIX_VEX_0F42_L_1_W_1,
   1105   PREFIX_VEX_0F44_L_0_W_0,
   1106   PREFIX_VEX_0F44_L_0_W_1,
   1107   PREFIX_VEX_0F45_L_1_W_0,
   1108   PREFIX_VEX_0F45_L_1_W_1,
   1109   PREFIX_VEX_0F46_L_1_W_0,
   1110   PREFIX_VEX_0F46_L_1_W_1,
   1111   PREFIX_VEX_0F47_L_1_W_0,
   1112   PREFIX_VEX_0F47_L_1_W_1,
   1113   PREFIX_VEX_0F4A_L_1_W_0,
   1114   PREFIX_VEX_0F4A_L_1_W_1,
   1115   PREFIX_VEX_0F4B_L_1_W_0,
   1116   PREFIX_VEX_0F4B_L_1_W_1,
   1117   PREFIX_VEX_0F6F,
   1118   PREFIX_VEX_0F70,
   1119   PREFIX_VEX_0F7E,
   1120   PREFIX_VEX_0F7F,
   1121   PREFIX_VEX_0F90_L_0_W_0,
   1122   PREFIX_VEX_0F90_L_0_W_1,
   1123   PREFIX_VEX_0F91_L_0_W_0,
   1124   PREFIX_VEX_0F91_L_0_W_1,
   1125   PREFIX_VEX_0F92_L_0_W_0,
   1126   PREFIX_VEX_0F92_L_0_W_1,
   1127   PREFIX_VEX_0F93_L_0_W_0,
   1128   PREFIX_VEX_0F93_L_0_W_1,
   1129   PREFIX_VEX_0F98_L_0_W_0,
   1130   PREFIX_VEX_0F98_L_0_W_1,
   1131   PREFIX_VEX_0F99_L_0_W_0,
   1132   PREFIX_VEX_0F99_L_0_W_1,
   1133   PREFIX_VEX_0F3848_X86_64_L_0_W_0,
   1134   PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_0,
   1135   PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_1,
   1136   PREFIX_VEX_0F384A_X86_64_W_0_L_0,
   1137   PREFIX_VEX_0F384B_X86_64_L_0_W_0,
   1138   PREFIX_VEX_0F3850_W_0,
   1139   PREFIX_VEX_0F3851_W_0,
   1140   PREFIX_VEX_0F385C_X86_64_L_0_W_0,
   1141   PREFIX_VEX_0F385E_X86_64_L_0_W_0,
   1142   PREFIX_VEX_0F385F_X86_64_L_0_W_0,
   1143   PREFIX_VEX_0F386B_X86_64_L_0_W_0,
   1144   PREFIX_VEX_0F386C_X86_64_L_0_W_0,
   1145   PREFIX_VEX_0F386E_X86_64_L_0_W_0,
   1146   PREFIX_VEX_0F386F_X86_64_L_0_W_0,
   1147   PREFIX_VEX_0F3872,
   1148   PREFIX_VEX_0F38B0_W_0,
   1149   PREFIX_VEX_0F38B1_W_0,
   1150   PREFIX_VEX_0F38D2_W_0,
   1151   PREFIX_VEX_0F38D3_W_0,
   1152   PREFIX_VEX_0F38CB,
   1153   PREFIX_VEX_0F38CC,
   1154   PREFIX_VEX_0F38CD,
   1155   PREFIX_VEX_0F38DA_W_0,
   1156   PREFIX_VEX_0F38F2_L_0,
   1157   PREFIX_VEX_0F38F3_L_0,
   1158   PREFIX_VEX_0F38F5_L_0,
   1159   PREFIX_VEX_0F38F6_L_0,
   1160   PREFIX_VEX_0F38F7_L_0,
   1161   PREFIX_VEX_0F3AF0_L_0,
   1162   PREFIX_VEX_MAP5_F8_X86_64_L_0_W_0,
   1163   PREFIX_VEX_MAP5_F9_X86_64_L_0_W_0,
   1164   PREFIX_VEX_MAP5_FD_X86_64_L_0_W_0,
   1165   PREFIX_VEX_MAP7_F6_L_0_W_0_R_0_X86_64,
   1166   PREFIX_VEX_MAP7_F8_L_0_W_0_R_0_X86_64,
   1167 
   1168   PREFIX_EVEX_0F2E,
   1169   PREFIX_EVEX_0F2F,
   1170   PREFIX_EVEX_0F5B,
   1171   PREFIX_EVEX_0F6F,
   1172   PREFIX_EVEX_0F70,
   1173   PREFIX_EVEX_0F78,
   1174   PREFIX_EVEX_0F79,
   1175   PREFIX_EVEX_0F7A,
   1176   PREFIX_EVEX_0F7B,
   1177   PREFIX_EVEX_0F7E,
   1178   PREFIX_EVEX_0F7F,
   1179   PREFIX_EVEX_0FC2,
   1180   PREFIX_EVEX_0FE6,
   1181   PREFIX_EVEX_0F3810,
   1182   PREFIX_EVEX_0F3811,
   1183   PREFIX_EVEX_0F3812,
   1184   PREFIX_EVEX_0F3813,
   1185   PREFIX_EVEX_0F3814,
   1186   PREFIX_EVEX_0F3815,
   1187   PREFIX_EVEX_0F3820,
   1188   PREFIX_EVEX_0F3821,
   1189   PREFIX_EVEX_0F3822,
   1190   PREFIX_EVEX_0F3823,
   1191   PREFIX_EVEX_0F3824,
   1192   PREFIX_EVEX_0F3825,
   1193   PREFIX_EVEX_0F3826,
   1194   PREFIX_EVEX_0F3827,
   1195   PREFIX_EVEX_0F3828,
   1196   PREFIX_EVEX_0F3829,
   1197   PREFIX_EVEX_0F382A,
   1198   PREFIX_EVEX_0F3830,
   1199   PREFIX_EVEX_0F3831,
   1200   PREFIX_EVEX_0F3832,
   1201   PREFIX_EVEX_0F3833,
   1202   PREFIX_EVEX_0F3834,
   1203   PREFIX_EVEX_0F3835,
   1204   PREFIX_EVEX_0F3838,
   1205   PREFIX_EVEX_0F3839,
   1206   PREFIX_EVEX_0F383A,
   1207   PREFIX_EVEX_0F384A_X86_64_W_0_L_2,
   1208   PREFIX_EVEX_0F3852,
   1209   PREFIX_EVEX_0F3853,
   1210   PREFIX_EVEX_0F3868,
   1211   PREFIX_EVEX_0F386D_X86_64_W_0_L_2,
   1212   PREFIX_EVEX_0F3872,
   1213   PREFIX_EVEX_0F3874,
   1214   PREFIX_EVEX_0F389A,
   1215   PREFIX_EVEX_0F389B,
   1216   PREFIX_EVEX_0F38AA,
   1217   PREFIX_EVEX_0F38AB,
   1218 
   1219   PREFIX_EVEX_0F3A07_X86_64_W_0_L_2,
   1220   PREFIX_EVEX_0F3A08,
   1221   PREFIX_EVEX_0F3A0A,
   1222   PREFIX_EVEX_0F3A26,
   1223   PREFIX_EVEX_0F3A27,
   1224   PREFIX_EVEX_0F3A42_W_0,
   1225   PREFIX_EVEX_0F3A52,
   1226   PREFIX_EVEX_0F3A53,
   1227   PREFIX_EVEX_0F3A56,
   1228   PREFIX_EVEX_0F3A57,
   1229   PREFIX_EVEX_0F3A66,
   1230   PREFIX_EVEX_0F3A67,
   1231   PREFIX_EVEX_0F3A77_X86_64_W_0_L_2,
   1232   PREFIX_EVEX_0F3AC2,
   1233 
   1234   PREFIX_EVEX_MAP4_4x,
   1235   PREFIX_EVEX_MAP4_F0,
   1236   PREFIX_EVEX_MAP4_F1,
   1237   PREFIX_EVEX_MAP4_F2,
   1238   PREFIX_EVEX_MAP4_F8,
   1239 
   1240   PREFIX_EVEX_MAP5_10,
   1241   PREFIX_EVEX_MAP5_11,
   1242   PREFIX_EVEX_MAP5_18,
   1243   PREFIX_EVEX_MAP5_1B,
   1244   PREFIX_EVEX_MAP5_1D,
   1245   PREFIX_EVEX_MAP5_1E,
   1246   PREFIX_EVEX_MAP5_2A,
   1247   PREFIX_EVEX_MAP5_2C,
   1248   PREFIX_EVEX_MAP5_2D,
   1249   PREFIX_EVEX_MAP5_2E,
   1250   PREFIX_EVEX_MAP5_2F,
   1251   PREFIX_EVEX_MAP5_51,
   1252   PREFIX_EVEX_MAP5_58,
   1253   PREFIX_EVEX_MAP5_59,
   1254   PREFIX_EVEX_MAP5_5A,
   1255   PREFIX_EVEX_MAP5_5B,
   1256   PREFIX_EVEX_MAP5_5C,
   1257   PREFIX_EVEX_MAP5_5D,
   1258   PREFIX_EVEX_MAP5_5E,
   1259   PREFIX_EVEX_MAP5_5F,
   1260   PREFIX_EVEX_MAP5_68,
   1261   PREFIX_EVEX_MAP5_69,
   1262   PREFIX_EVEX_MAP5_6A,
   1263   PREFIX_EVEX_MAP5_6B,
   1264   PREFIX_EVEX_MAP5_6C,
   1265   PREFIX_EVEX_MAP5_6D,
   1266   PREFIX_EVEX_MAP5_6E_L_0,
   1267   PREFIX_EVEX_MAP5_6F_X86_64,
   1268   PREFIX_EVEX_MAP5_74,
   1269   PREFIX_EVEX_MAP5_78,
   1270   PREFIX_EVEX_MAP5_79,
   1271   PREFIX_EVEX_MAP5_7A,
   1272   PREFIX_EVEX_MAP5_7B,
   1273   PREFIX_EVEX_MAP5_7C,
   1274   PREFIX_EVEX_MAP5_7D,
   1275   PREFIX_EVEX_MAP5_7E_L_0,
   1276 
   1277   PREFIX_EVEX_MAP6_13,
   1278   PREFIX_EVEX_MAP6_2C,
   1279   PREFIX_EVEX_MAP6_42,
   1280   PREFIX_EVEX_MAP6_4C,
   1281   PREFIX_EVEX_MAP6_4E,
   1282   PREFIX_EVEX_MAP6_56,
   1283   PREFIX_EVEX_MAP6_57,
   1284   PREFIX_EVEX_MAP6_98,
   1285   PREFIX_EVEX_MAP6_9A,
   1286   PREFIX_EVEX_MAP6_9C,
   1287   PREFIX_EVEX_MAP6_9E,
   1288   PREFIX_EVEX_MAP6_A8,
   1289   PREFIX_EVEX_MAP6_AA,
   1290   PREFIX_EVEX_MAP6_AC,
   1291   PREFIX_EVEX_MAP6_AE,
   1292   PREFIX_EVEX_MAP6_B8,
   1293   PREFIX_EVEX_MAP6_BA,
   1294   PREFIX_EVEX_MAP6_BC,
   1295   PREFIX_EVEX_MAP6_BE,
   1296   PREFIX_EVEX_MAP6_D6,
   1297   PREFIX_EVEX_MAP6_D7,
   1298 };
   1299 
   1300 enum
   1301 {
   1302   X86_64_06 = 0,
   1303   X86_64_07,
   1304   X86_64_0E,
   1305   X86_64_16,
   1306   X86_64_17,
   1307   X86_64_1E,
   1308   X86_64_1F,
   1309   X86_64_27,
   1310   X86_64_2F,
   1311   X86_64_37,
   1312   X86_64_3F,
   1313   X86_64_60,
   1314   X86_64_61,
   1315   X86_64_62,
   1316   X86_64_63,
   1317   X86_64_6D,
   1318   X86_64_6F,
   1319   X86_64_82,
   1320   X86_64_9A,
   1321   X86_64_C2,
   1322   X86_64_C3,
   1323   X86_64_C4,
   1324   X86_64_C5,
   1325   X86_64_CE,
   1326   X86_64_D4,
   1327   X86_64_D5,
   1328   X86_64_D6,
   1329   X86_64_E8,
   1330   X86_64_E9,
   1331   X86_64_EA,
   1332   X86_64_0F00_REG_6,
   1333   X86_64_0F01_REG_0,
   1334   X86_64_0F01_REG_0_MOD_3_RM_6_P_1,
   1335   X86_64_0F01_REG_0_MOD_3_RM_6_P_3,
   1336   X86_64_0F01_REG_0_MOD_3_RM_7_P_0,
   1337   X86_64_0F01_REG_1,
   1338   X86_64_0F01_REG_1_RM_2_PREFIX_1,
   1339   X86_64_0F01_REG_1_RM_2_PREFIX_3,
   1340   X86_64_0F01_REG_1_RM_5_PREFIX_2,
   1341   X86_64_0F01_REG_1_RM_6_PREFIX_2,
   1342   X86_64_0F01_REG_1_RM_7_PREFIX_2,
   1343   X86_64_0F01_REG_2,
   1344   X86_64_0F01_REG_3,
   1345   X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1,
   1346   X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1,
   1347   X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1,
   1348   X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1,
   1349   X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_1,
   1350   X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_3,
   1351   X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1,
   1352   X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3,
   1353   X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1,
   1354   X86_64_0F18_REG_6_MOD_0,
   1355   X86_64_0F18_REG_7_MOD_0,
   1356   X86_64_0F24,
   1357   X86_64_0F26,
   1358   X86_64_0F388A,
   1359   X86_64_0F388B,
   1360   X86_64_0F38F8_M_1,
   1361   X86_64_0FC7_REG_6_MOD_3_PREFIX_1,
   1362 
   1363   X86_64_VEX_0F3848,
   1364   X86_64_VEX_0F3849,
   1365   X86_64_VEX_0F384A,
   1366   X86_64_VEX_0F384B,
   1367   X86_64_VEX_0F385C,
   1368   X86_64_VEX_0F385E,
   1369   X86_64_VEX_0F385F,
   1370   X86_64_VEX_0F386B,
   1371   X86_64_VEX_0F386C,
   1372   X86_64_VEX_0F386E,
   1373   X86_64_VEX_0F386F,
   1374   X86_64_VEX_0F38Ex,
   1375 
   1376   X86_64_VEX_MAP5_F8,
   1377   X86_64_VEX_MAP5_F9,
   1378   X86_64_VEX_MAP5_FD,
   1379   X86_64_VEX_MAP7_F6_L_0_W_0_R_0,
   1380   X86_64_VEX_MAP7_F8_L_0_W_0_R_0,
   1381 
   1382   X86_64_EVEX_0F384A,
   1383   X86_64_EVEX_0F386D,
   1384   X86_64_EVEX_0F3A07,
   1385   X86_64_EVEX_0F3A77,
   1386 
   1387   X86_64_EVEX_MAP5_6F,
   1388 };
   1389 
   1390 enum
   1391 {
   1392   THREE_BYTE_0F38 = 0,
   1393   THREE_BYTE_0F3A
   1394 };
   1395 
   1396 enum
   1397 {
   1398   XOP_08 = 0,
   1399   XOP_09,
   1400   XOP_0A
   1401 };
   1402 
   1403 enum
   1404 {
   1405   VEX_0F = 0,
   1406   VEX_0F38,
   1407   VEX_0F3A,
   1408   VEX_MAP5,
   1409   VEX_MAP7,
   1410 };
   1411 
   1412 enum
   1413 {
   1414   EVEX_0F = 0,
   1415   EVEX_0F38,
   1416   EVEX_0F3A,
   1417   EVEX_MAP4,
   1418   EVEX_MAP5,
   1419   EVEX_MAP6,
   1420   EVEX_MAP7,
   1421 };
   1422 
   1423 enum
   1424 {
   1425   VEX_LEN_0F12_P_0 = 0,
   1426   VEX_LEN_0F12_P_2,
   1427   VEX_LEN_0F13,
   1428   VEX_LEN_0F16_P_0,
   1429   VEX_LEN_0F16_P_2,
   1430   VEX_LEN_0F17,
   1431   VEX_LEN_0F41,
   1432   VEX_LEN_0F42,
   1433   VEX_LEN_0F44,
   1434   VEX_LEN_0F45,
   1435   VEX_LEN_0F46,
   1436   VEX_LEN_0F47,
   1437   VEX_LEN_0F4A,
   1438   VEX_LEN_0F4B,
   1439   VEX_LEN_0F6E,
   1440   VEX_LEN_0F77,
   1441   VEX_LEN_0F7E_P_1,
   1442   VEX_LEN_0F7E_P_2,
   1443   VEX_LEN_0F90,
   1444   VEX_LEN_0F91,
   1445   VEX_LEN_0F92,
   1446   VEX_LEN_0F93,
   1447   VEX_LEN_0F98,
   1448   VEX_LEN_0F99,
   1449   VEX_LEN_0FAE_R_2,
   1450   VEX_LEN_0FAE_R_3,
   1451   VEX_LEN_0FC4,
   1452   VEX_LEN_0FD6,
   1453   VEX_LEN_0F3816,
   1454   VEX_LEN_0F3819,
   1455   VEX_LEN_0F381A,
   1456   VEX_LEN_0F3836,
   1457   VEX_LEN_0F3841,
   1458   VEX_LEN_0F3848_X86_64,
   1459   VEX_LEN_0F3849_X86_64,
   1460   VEX_LEN_0F384A_X86_64_W_0,
   1461   VEX_LEN_0F384B_X86_64,
   1462   VEX_LEN_0F385A,
   1463   VEX_LEN_0F385C_X86_64,
   1464   VEX_LEN_0F385E_X86_64,
   1465   VEX_LEN_0F385F_X86_64,
   1466   VEX_LEN_0F386B_X86_64,
   1467   VEX_LEN_0F386C_X86_64,
   1468   VEX_LEN_0F386E_X86_64,
   1469   VEX_LEN_0F386F_X86_64,
   1470   VEX_LEN_0F38CB_P_3_W_0,
   1471   VEX_LEN_0F38CC_P_3_W_0,
   1472   VEX_LEN_0F38CD_P_3_W_0,
   1473   VEX_LEN_0F38DA_W_0_P_0,
   1474   VEX_LEN_0F38DA_W_0_P_2,
   1475   VEX_LEN_0F38DB,
   1476   VEX_LEN_0F38F2,
   1477   VEX_LEN_0F38F3,
   1478   VEX_LEN_0F38F5,
   1479   VEX_LEN_0F38F6,
   1480   VEX_LEN_0F38F7,
   1481   VEX_LEN_0F3A00,
   1482   VEX_LEN_0F3A01,
   1483   VEX_LEN_0F3A06,
   1484   VEX_LEN_0F3A14,
   1485   VEX_LEN_0F3A15,
   1486   VEX_LEN_0F3A16,
   1487   VEX_LEN_0F3A17,
   1488   VEX_LEN_0F3A18,
   1489   VEX_LEN_0F3A19,
   1490   VEX_LEN_0F3A20,
   1491   VEX_LEN_0F3A21,
   1492   VEX_LEN_0F3A22,
   1493   VEX_LEN_0F3A30,
   1494   VEX_LEN_0F3A31,
   1495   VEX_LEN_0F3A32,
   1496   VEX_LEN_0F3A33,
   1497   VEX_LEN_0F3A38,
   1498   VEX_LEN_0F3A39,
   1499   VEX_LEN_0F3A41,
   1500   VEX_LEN_0F3A46,
   1501   VEX_LEN_0F3A60,
   1502   VEX_LEN_0F3A61,
   1503   VEX_LEN_0F3A62,
   1504   VEX_LEN_0F3A63,
   1505   VEX_LEN_0F3ADE_W_0,
   1506   VEX_LEN_0F3ADF,
   1507   VEX_LEN_0F3AF0,
   1508   VEX_LEN_MAP5_F8_X86_64,
   1509   VEX_LEN_MAP5_F9_X86_64,
   1510   VEX_LEN_MAP5_FD_X86_64,
   1511   VEX_LEN_MAP7_F6,
   1512   VEX_LEN_MAP7_F8,
   1513   VEX_LEN_XOP_08_85,
   1514   VEX_LEN_XOP_08_86,
   1515   VEX_LEN_XOP_08_87,
   1516   VEX_LEN_XOP_08_8E,
   1517   VEX_LEN_XOP_08_8F,
   1518   VEX_LEN_XOP_08_95,
   1519   VEX_LEN_XOP_08_96,
   1520   VEX_LEN_XOP_08_97,
   1521   VEX_LEN_XOP_08_9E,
   1522   VEX_LEN_XOP_08_9F,
   1523   VEX_LEN_XOP_08_A3,
   1524   VEX_LEN_XOP_08_A6,
   1525   VEX_LEN_XOP_08_B6,
   1526   VEX_LEN_XOP_08_C0,
   1527   VEX_LEN_XOP_08_C1,
   1528   VEX_LEN_XOP_08_C2,
   1529   VEX_LEN_XOP_08_C3,
   1530   VEX_LEN_XOP_08_CC,
   1531   VEX_LEN_XOP_08_CD,
   1532   VEX_LEN_XOP_08_CE,
   1533   VEX_LEN_XOP_08_CF,
   1534   VEX_LEN_XOP_08_EC,
   1535   VEX_LEN_XOP_08_ED,
   1536   VEX_LEN_XOP_08_EE,
   1537   VEX_LEN_XOP_08_EF,
   1538   VEX_LEN_XOP_09_01,
   1539   VEX_LEN_XOP_09_02,
   1540   VEX_LEN_XOP_09_12,
   1541   VEX_LEN_XOP_09_82_W_0,
   1542   VEX_LEN_XOP_09_83_W_0,
   1543   VEX_LEN_XOP_09_90,
   1544   VEX_LEN_XOP_09_91,
   1545   VEX_LEN_XOP_09_92,
   1546   VEX_LEN_XOP_09_93,
   1547   VEX_LEN_XOP_09_94,
   1548   VEX_LEN_XOP_09_95,
   1549   VEX_LEN_XOP_09_96,
   1550   VEX_LEN_XOP_09_97,
   1551   VEX_LEN_XOP_09_98,
   1552   VEX_LEN_XOP_09_99,
   1553   VEX_LEN_XOP_09_9A,
   1554   VEX_LEN_XOP_09_9B,
   1555   VEX_LEN_XOP_09_C1,
   1556   VEX_LEN_XOP_09_C2,
   1557   VEX_LEN_XOP_09_C3,
   1558   VEX_LEN_XOP_09_C6,
   1559   VEX_LEN_XOP_09_C7,
   1560   VEX_LEN_XOP_09_CB,
   1561   VEX_LEN_XOP_09_D1,
   1562   VEX_LEN_XOP_09_D2,
   1563   VEX_LEN_XOP_09_D3,
   1564   VEX_LEN_XOP_09_D6,
   1565   VEX_LEN_XOP_09_D7,
   1566   VEX_LEN_XOP_09_DB,
   1567   VEX_LEN_XOP_09_E1,
   1568   VEX_LEN_XOP_09_E2,
   1569   VEX_LEN_XOP_09_E3,
   1570   VEX_LEN_XOP_0A_12,
   1571 };
   1572 
   1573 enum
   1574 {
   1575   EVEX_LEN_0F7E_P_1_W_0 = 0,
   1576   EVEX_LEN_0FD6_P_2_W_0,
   1577   EVEX_LEN_0F3816,
   1578   EVEX_LEN_0F3819,
   1579   EVEX_LEN_0F381A,
   1580   EVEX_LEN_0F381B,
   1581   EVEX_LEN_0F3836,
   1582   EVEX_LEN_0F384A_X86_64_W_0,
   1583   EVEX_LEN_0F385A,
   1584   EVEX_LEN_0F385B,
   1585   EVEX_LEN_0F386D_X86_64_W_0,
   1586   EVEX_LEN_0F38C6,
   1587   EVEX_LEN_0F38C7,
   1588   EVEX_LEN_0F3A00,
   1589   EVEX_LEN_0F3A01,
   1590   EVEX_LEN_0F3A07_X86_64_W_0,
   1591   EVEX_LEN_0F3A18,
   1592   EVEX_LEN_0F3A19,
   1593   EVEX_LEN_0F3A1A,
   1594   EVEX_LEN_0F3A1B,
   1595   EVEX_LEN_0F3A23,
   1596   EVEX_LEN_0F3A38,
   1597   EVEX_LEN_0F3A39,
   1598   EVEX_LEN_0F3A3A,
   1599   EVEX_LEN_0F3A3B,
   1600   EVEX_LEN_0F3A43,
   1601   EVEX_LEN_0F3A77_X86_64_W_0,
   1602 
   1603   EVEX_LEN_MAP5_6E,
   1604   EVEX_LEN_MAP5_7E,
   1605 };
   1606 
   1607 enum
   1608 {
   1609   VEX_W_0F41_L_1 = 0,
   1610   VEX_W_0F42_L_1,
   1611   VEX_W_0F44_L_0,
   1612   VEX_W_0F45_L_1,
   1613   VEX_W_0F46_L_1,
   1614   VEX_W_0F47_L_1,
   1615   VEX_W_0F4A_L_1,
   1616   VEX_W_0F4B_L_1,
   1617   VEX_W_0F90_L_0,
   1618   VEX_W_0F91_L_0,
   1619   VEX_W_0F92_L_0,
   1620   VEX_W_0F93_L_0,
   1621   VEX_W_0F98_L_0,
   1622   VEX_W_0F99_L_0,
   1623   VEX_W_0F380C,
   1624   VEX_W_0F380D,
   1625   VEX_W_0F380E,
   1626   VEX_W_0F380F,
   1627   VEX_W_0F3813,
   1628   VEX_W_0F3816_L_1,
   1629   VEX_W_0F3818,
   1630   VEX_W_0F3819_L_1,
   1631   VEX_W_0F381A_L_1,
   1632   VEX_W_0F382C,
   1633   VEX_W_0F382D,
   1634   VEX_W_0F382E,
   1635   VEX_W_0F382F,
   1636   VEX_W_0F3836,
   1637   VEX_W_0F3846,
   1638   VEX_W_0F3848_X86_64_L_0,
   1639   VEX_W_0F3849_X86_64_L_0,
   1640   VEX_W_0F384A_X86_64,
   1641   VEX_W_0F384B_X86_64_L_0,
   1642   VEX_W_0F3850,
   1643   VEX_W_0F3851,
   1644   VEX_W_0F3852,
   1645   VEX_W_0F3853,
   1646   VEX_W_0F3858,
   1647   VEX_W_0F3859,
   1648   VEX_W_0F385A_L_0,
   1649   VEX_W_0F385C_X86_64_L_0,
   1650   VEX_W_0F385E_X86_64_L_0,
   1651   VEX_W_0F385F_X86_64_L_0,
   1652   VEX_W_0F386B_X86_64_L_0,
   1653   VEX_W_0F386C_X86_64_L_0,
   1654   VEX_W_0F386E_X86_64_L_0,
   1655   VEX_W_0F386F_X86_64_L_0,
   1656   VEX_W_0F3872_P_1,
   1657   VEX_W_0F3878,
   1658   VEX_W_0F3879,
   1659   VEX_W_0F38B0,
   1660   VEX_W_0F38B1,
   1661   VEX_W_0F38B4,
   1662   VEX_W_0F38B5,
   1663   VEX_W_0F38CB_P_3,
   1664   VEX_W_0F38CC_P_3,
   1665   VEX_W_0F38CD_P_3,
   1666   VEX_W_0F38CF,
   1667   VEX_W_0F38D2,
   1668   VEX_W_0F38D3,
   1669   VEX_W_0F38DA,
   1670   VEX_W_0F3A00_L_1,
   1671   VEX_W_0F3A01_L_1,
   1672   VEX_W_0F3A02,
   1673   VEX_W_0F3A04,
   1674   VEX_W_0F3A05,
   1675   VEX_W_0F3A06_L_1,
   1676   VEX_W_0F3A18_L_1,
   1677   VEX_W_0F3A19_L_1,
   1678   VEX_W_0F3A1D,
   1679   VEX_W_0F3A38_L_1,
   1680   VEX_W_0F3A39_L_1,
   1681   VEX_W_0F3A46_L_1,
   1682   VEX_W_0F3A4A,
   1683   VEX_W_0F3A4B,
   1684   VEX_W_0F3A4C,
   1685   VEX_W_0F3ACE,
   1686   VEX_W_0F3ACF,
   1687   VEX_W_0F3ADE,
   1688   VEX_W_MAP5_F8_X86_64_L_0,
   1689   VEX_W_MAP5_F9_X86_64_L_0,
   1690   VEX_W_MAP5_FD_X86_64_L_0,
   1691   VEX_W_MAP7_F6_L_0,
   1692   VEX_W_MAP7_F8_L_0,
   1693 
   1694   VEX_W_XOP_08_85_L_0,
   1695   VEX_W_XOP_08_86_L_0,
   1696   VEX_W_XOP_08_87_L_0,
   1697   VEX_W_XOP_08_8E_L_0,
   1698   VEX_W_XOP_08_8F_L_0,
   1699   VEX_W_XOP_08_95_L_0,
   1700   VEX_W_XOP_08_96_L_0,
   1701   VEX_W_XOP_08_97_L_0,
   1702   VEX_W_XOP_08_9E_L_0,
   1703   VEX_W_XOP_08_9F_L_0,
   1704   VEX_W_XOP_08_A6_L_0,
   1705   VEX_W_XOP_08_B6_L_0,
   1706   VEX_W_XOP_08_C0_L_0,
   1707   VEX_W_XOP_08_C1_L_0,
   1708   VEX_W_XOP_08_C2_L_0,
   1709   VEX_W_XOP_08_C3_L_0,
   1710   VEX_W_XOP_08_CC_L_0,
   1711   VEX_W_XOP_08_CD_L_0,
   1712   VEX_W_XOP_08_CE_L_0,
   1713   VEX_W_XOP_08_CF_L_0,
   1714   VEX_W_XOP_08_EC_L_0,
   1715   VEX_W_XOP_08_ED_L_0,
   1716   VEX_W_XOP_08_EE_L_0,
   1717   VEX_W_XOP_08_EF_L_0,
   1718 
   1719   VEX_W_XOP_09_80,
   1720   VEX_W_XOP_09_81,
   1721   VEX_W_XOP_09_82,
   1722   VEX_W_XOP_09_83,
   1723   VEX_W_XOP_09_C1_L_0,
   1724   VEX_W_XOP_09_C2_L_0,
   1725   VEX_W_XOP_09_C3_L_0,
   1726   VEX_W_XOP_09_C6_L_0,
   1727   VEX_W_XOP_09_C7_L_0,
   1728   VEX_W_XOP_09_CB_L_0,
   1729   VEX_W_XOP_09_D1_L_0,
   1730   VEX_W_XOP_09_D2_L_0,
   1731   VEX_W_XOP_09_D3_L_0,
   1732   VEX_W_XOP_09_D6_L_0,
   1733   VEX_W_XOP_09_D7_L_0,
   1734   VEX_W_XOP_09_DB_L_0,
   1735   VEX_W_XOP_09_E1_L_0,
   1736   VEX_W_XOP_09_E2_L_0,
   1737   VEX_W_XOP_09_E3_L_0,
   1738 
   1739   EVEX_W_0F5B_P_0,
   1740   EVEX_W_0F62,
   1741   EVEX_W_0F66,
   1742   EVEX_W_0F6A,
   1743   EVEX_W_0F6B,
   1744   EVEX_W_0F6C,
   1745   EVEX_W_0F6D,
   1746   EVEX_W_0F6F_P_1,
   1747   EVEX_W_0F6F_P_2,
   1748   EVEX_W_0F6F_P_3,
   1749   EVEX_W_0F70_P_2,
   1750   EVEX_W_0F72_R_2,
   1751   EVEX_W_0F72_R_4,
   1752   EVEX_W_0F72_R_6,
   1753   EVEX_W_0F73_R_2,
   1754   EVEX_W_0F73_R_6,
   1755   EVEX_W_0F76,
   1756   EVEX_W_0F78_P_0,
   1757   EVEX_W_0F78_P_2,
   1758   EVEX_W_0F79_P_0,
   1759   EVEX_W_0F79_P_2,
   1760   EVEX_W_0F7A_P_1,
   1761   EVEX_W_0F7A_P_2,
   1762   EVEX_W_0F7A_P_3,
   1763   EVEX_W_0F7B_P_2,
   1764   EVEX_W_0F7E_P_1,
   1765   EVEX_W_0F7F_P_1,
   1766   EVEX_W_0F7F_P_2,
   1767   EVEX_W_0F7F_P_3,
   1768   EVEX_W_0FD2,
   1769   EVEX_W_0FD3,
   1770   EVEX_W_0FD4,
   1771   EVEX_W_0FD6,
   1772   EVEX_W_0FE2,
   1773   EVEX_W_0FE6_P_1,
   1774   EVEX_W_0FE7,
   1775   EVEX_W_0FF2,
   1776   EVEX_W_0FF3,
   1777   EVEX_W_0FF4,
   1778   EVEX_W_0FFA,
   1779   EVEX_W_0FFB,
   1780   EVEX_W_0FFE,
   1781 
   1782   EVEX_W_0F3810_P_1,
   1783   EVEX_W_0F3810_P_2,
   1784   EVEX_W_0F3811_P_1,
   1785   EVEX_W_0F3811_P_2,
   1786   EVEX_W_0F3812_P_1,
   1787   EVEX_W_0F3812_P_2,
   1788   EVEX_W_0F3813_P_1,
   1789   EVEX_W_0F3814_P_1,
   1790   EVEX_W_0F3815_P_1,
   1791   EVEX_W_0F3819_L_n,
   1792   EVEX_W_0F381A_L_n,
   1793   EVEX_W_0F381B_L_2,
   1794   EVEX_W_0F381E,
   1795   EVEX_W_0F381F,
   1796   EVEX_W_0F3820_P_1,
   1797   EVEX_W_0F3821_P_1,
   1798   EVEX_W_0F3822_P_1,
   1799   EVEX_W_0F3823_P_1,
   1800   EVEX_W_0F3824_P_1,
   1801   EVEX_W_0F3825_P_1,
   1802   EVEX_W_0F3825_P_2,
   1803   EVEX_W_0F3828_P_2,
   1804   EVEX_W_0F3829_P_2,
   1805   EVEX_W_0F382A_P_1,
   1806   EVEX_W_0F382A_P_2,
   1807   EVEX_W_0F382B,
   1808   EVEX_W_0F3830_P_1,
   1809   EVEX_W_0F3831_P_1,
   1810   EVEX_W_0F3832_P_1,
   1811   EVEX_W_0F3833_P_1,
   1812   EVEX_W_0F3834_P_1,
   1813   EVEX_W_0F3835_P_1,
   1814   EVEX_W_0F3835_P_2,
   1815   EVEX_W_0F3837,
   1816   EVEX_W_0F383A_P_1,
   1817   EVEX_W_0F384A_X86_64,
   1818   EVEX_W_0F3859,
   1819   EVEX_W_0F385A_L_n,
   1820   EVEX_W_0F385B_L_2,
   1821   EVEX_W_0F386D_X86_64,
   1822   EVEX_W_0F3870,
   1823   EVEX_W_0F3872_P_2,
   1824   EVEX_W_0F387A,
   1825   EVEX_W_0F387B,
   1826   EVEX_W_0F3883,
   1827 
   1828   EVEX_W_0F3A07_X86_64,
   1829   EVEX_W_0F3A18_L_n,
   1830   EVEX_W_0F3A19_L_n,
   1831   EVEX_W_0F3A1A_L_2,
   1832   EVEX_W_0F3A1B_L_2,
   1833   EVEX_W_0F3A21,
   1834   EVEX_W_0F3A23_L_n,
   1835   EVEX_W_0F3A38_L_n,
   1836   EVEX_W_0F3A39_L_n,
   1837   EVEX_W_0F3A3A_L_2,
   1838   EVEX_W_0F3A3B_L_2,
   1839   EVEX_W_0F3A42,
   1840   EVEX_W_0F3A43_L_n,
   1841   EVEX_W_0F3A70,
   1842   EVEX_W_0F3A72,
   1843   EVEX_W_0F3A77_X86_64,
   1844 
   1845   EVEX_W_MAP4_8F_R_0,
   1846   EVEX_W_MAP4_F8_P1_M_1,
   1847   EVEX_W_MAP4_F8_P3_M_1,
   1848   EVEX_W_MAP4_FF_R_6,
   1849 
   1850   EVEX_W_MAP5_5B_P_0,
   1851   EVEX_W_MAP5_6C_P_0,
   1852   EVEX_W_MAP5_6C_P_2,
   1853   EVEX_W_MAP5_6D_P_0,
   1854   EVEX_W_MAP5_6D_P_2,
   1855   EVEX_W_MAP5_6E_P_1,
   1856   EVEX_W_MAP5_7A_P_3,
   1857   EVEX_W_MAP5_7E_P_1,
   1858 };
   1859 
   1860 typedef bool (*op_rtn) (instr_info *ins, int bytemode, int sizeflag);
   1861 
   1862 struct dis386 {
   1863   const char *name;
   1864   struct
   1865     {
   1866       op_rtn rtn;
   1867       int bytemode;
   1868     } op[MAX_OPERANDS];
   1869   unsigned int prefix_requirement;
   1870 };
   1871 
   1872 /* Upper case letters in the instruction names here are macros.
   1873    'A' => print 'b' if no (suitable) register operand or suffix_always is true
   1874    'B' => print 'b' if suffix_always is true
   1875    'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
   1876 	  size prefix
   1877    'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
   1878 	  suffix_always is true
   1879    'E' => print 'e' if 32-bit form of jcxz
   1880    'F' => print 'w' or 'l' depending on address size prefix (loop insns)
   1881    'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
   1882    'H' => print ",pt" or ",pn" branch hint
   1883    'I' unused.
   1884    'J' unused.
   1885    'K' => print 'd' or 'q' if rex prefix is present.
   1886    'L' => print 'l' or 'q' if suffix_always is true
   1887    'M' => print 'r' if intel_mnemonic is false.
   1888    'N' => print 'n' if instruction has no wait "prefix"
   1889    'O' => print 'd' or 'o' (or 'q' in Intel mode)
   1890    'P' => behave as 'T' except with register operand outside of suffix_always
   1891 	  mode
   1892    'Q' => print 'w', 'l' or 'q' if no (suitable) register operand or
   1893 	  suffix_always is true
   1894    'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
   1895    'S' => print 'w', 'l' or 'q' if suffix_always is true
   1896    'T' => print 'w', 'l'/'d', or 'q' if instruction has an operand size
   1897 	  prefix or if suffix_always is true.
   1898    'U' unused.
   1899    'V' => print 'v' for VEX/EVEX and nothing for legacy encodings.
   1900    'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
   1901    'X' => print 's', 'd' depending on data16 prefix (for XMM)
   1902    'Y' => no output, mark EVEX.aaa != 0 as bad.
   1903    'Z' => print 'q' in 64bit mode and 'l' otherwise, if suffix_always is true.
   1904    '!' => change condition from true to false or from false to true.
   1905    '%' => add 1 upper case letter to the macro.
   1906    '^' => print 'w', 'l', or 'q' (Intel64 ISA only) depending on operand size
   1907 	  prefix or suffix_always is true (lcall/ljmp).
   1908    '@' => in 64bit mode for Intel64 ISA or if instruction
   1909 	  has no operand sizing prefix, print 'q' if suffix_always is true or
   1910 	  nothing otherwise; behave as 'P' in all other cases
   1911 
   1912    2 upper case letter macros:
   1913    "CC" => print condition code
   1914    "XY" => print 'x' or 'y' if suffix_always is true or no register
   1915 	   operands and no broadcast.
   1916    "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
   1917 	   register operands and no broadcast.
   1918    "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
   1919    "XD" => print 'd' if !EVEX or EVEX.W=1, EVEX.W=0 is not a valid encoding
   1920    "XH" => print 'h' if EVEX.W=0, EVEX.W=1 is not a valid encoding (for FP16)
   1921    "XB" => print 'bf16' if EVEX.W=0, EVEX.W=1 is not a valid encoding
   1922 	   (for BF16)
   1923    "XS" => print 's' if !EVEX or EVEX.W=0, EVEX.W=1 is not a valid encoding
   1924    "XV" => print "{vex} " pseudo prefix
   1925    "XE" => print "{evex} " pseudo prefix if no EVEX-specific functionality is
   1926 	   is used by an EVEX-encoded (AVX512VL) instruction.
   1927    "ME" => Similar to "XE", but only print "{evex} " when there is no
   1928 	   memory operand.
   1929    "NF" => print "{nf} " pseudo prefix when EVEX.NF = 1 and print "{evex} "
   1930 	   pseudo prefix when instructions without NF, EGPR and VVVV,
   1931    "NE" => don't print "{evex} " pseudo prefix for some special instructions
   1932 	   in MAP4.
   1933    "ZU" => print 'zu' if EVEX.ZU=1.
   1934    "SC" => print suffix SCC for SCC insns
   1935    "YK" keep unused, to avoid ambiguity with the combined use of Y and K.
   1936    "YX" keep unused, to avoid ambiguity with the combined use of Y and X.
   1937    "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand, cond
   1938 	   being false, or no operand at all in 64bit mode, or if suffix_always
   1939 	   is true.
   1940    "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
   1941    "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
   1942    "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
   1943    "DQ" => print 'd' or 'q' depending on the VEX.W bit
   1944    "DF" => print default flag value for SCC insns
   1945    "BW" => print 'b' or 'w' depending on the VEX.W bit
   1946    "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
   1947 	   an operand size prefix, or suffix_always is true.  print
   1948 	   'q' if rex prefix is present.
   1949 
   1950    Many of the above letters print nothing in Intel mode.  See "putop"
   1951    for the details.
   1952 
   1953    Braces '{' and '}', and vertical bars '|', indicate alternative
   1954    mnemonic strings for AT&T and Intel.  */
   1955 
   1956 static const struct dis386 dis386[] = {
   1957   /* 00 */
   1958   { "addB",		{ Ebh1, Gb }, 0 },
   1959   { "addS",		{ Evh1, Gv }, 0 },
   1960   { "addB",		{ Gb, EbS }, 0 },
   1961   { "addS",		{ Gv, EvS }, 0 },
   1962   { "addB",		{ AL, Ib }, 0 },
   1963   { "addS",		{ eAX, Iv }, 0 },
   1964   { X86_64_TABLE (X86_64_06) },
   1965   { X86_64_TABLE (X86_64_07) },
   1966   /* 08 */
   1967   { "orB",		{ Ebh1, Gb }, 0 },
   1968   { "orS",		{ Evh1, Gv }, 0 },
   1969   { "orB",		{ Gb, EbS }, 0 },
   1970   { "orS",		{ Gv, EvS }, 0 },
   1971   { "orB",		{ AL, Ib }, 0 },
   1972   { "orS",		{ eAX, Iv }, 0 },
   1973   { X86_64_TABLE (X86_64_0E) },
   1974   { Bad_Opcode },	/* 0x0f extended opcode escape */
   1975   /* 10 */
   1976   { "adcB",		{ Ebh1, Gb }, 0 },
   1977   { "adcS",		{ Evh1, Gv }, 0 },
   1978   { "adcB",		{ Gb, EbS }, 0 },
   1979   { "adcS",		{ Gv, EvS }, 0 },
   1980   { "adcB",		{ AL, Ib }, 0 },
   1981   { "adcS",		{ eAX, Iv }, 0 },
   1982   { X86_64_TABLE (X86_64_16) },
   1983   { X86_64_TABLE (X86_64_17) },
   1984   /* 18 */
   1985   { "sbbB",		{ Ebh1, Gb }, 0 },
   1986   { "sbbS",		{ Evh1, Gv }, 0 },
   1987   { "sbbB",		{ Gb, EbS }, 0 },
   1988   { "sbbS",		{ Gv, EvS }, 0 },
   1989   { "sbbB",		{ AL, Ib }, 0 },
   1990   { "sbbS",		{ eAX, Iv }, 0 },
   1991   { X86_64_TABLE (X86_64_1E) },
   1992   { X86_64_TABLE (X86_64_1F) },
   1993   /* 20 */
   1994   { "andB",		{ Ebh1, Gb }, 0 },
   1995   { "andS",		{ Evh1, Gv }, 0 },
   1996   { "andB",		{ Gb, EbS }, 0 },
   1997   { "andS",		{ Gv, EvS }, 0 },
   1998   { "andB",		{ AL, Ib }, 0 },
   1999   { "andS",		{ eAX, Iv }, 0 },
   2000   { Bad_Opcode },	/* SEG ES prefix */
   2001   { X86_64_TABLE (X86_64_27) },
   2002   /* 28 */
   2003   { "subB",		{ Ebh1, Gb }, 0 },
   2004   { "subS",		{ Evh1, Gv }, 0 },
   2005   { "subB",		{ Gb, EbS }, 0 },
   2006   { "subS",		{ Gv, EvS }, 0 },
   2007   { "subB",		{ AL, Ib }, 0 },
   2008   { "subS",		{ eAX, Iv }, 0 },
   2009   { Bad_Opcode },	/* SEG CS prefix */
   2010   { X86_64_TABLE (X86_64_2F) },
   2011   /* 30 */
   2012   { "xorB",		{ Ebh1, Gb }, 0 },
   2013   { "xorS",		{ Evh1, Gv }, 0 },
   2014   { "xorB",		{ Gb, EbS }, 0 },
   2015   { "xorS",		{ Gv, EvS }, 0 },
   2016   { "xorB",		{ AL, Ib }, 0 },
   2017   { "xorS",		{ eAX, Iv }, 0 },
   2018   { Bad_Opcode },	/* SEG SS prefix */
   2019   { X86_64_TABLE (X86_64_37) },
   2020   /* 38 */
   2021   { "cmpB",		{ Eb, Gb }, 0 },
   2022   { "cmpS",		{ Ev, Gv }, 0 },
   2023   { "cmpB",		{ Gb, EbS }, 0 },
   2024   { "cmpS",		{ Gv, EvS }, 0 },
   2025   { "cmpB",		{ AL, Ib }, 0 },
   2026   { "cmpS",		{ eAX, Iv }, 0 },
   2027   { Bad_Opcode },	/* SEG DS prefix */
   2028   { X86_64_TABLE (X86_64_3F) },
   2029   /* 40 */
   2030   { "inc{S|}",		{ RMeAX }, 0 },
   2031   { "inc{S|}",		{ RMeCX }, 0 },
   2032   { "inc{S|}",		{ RMeDX }, 0 },
   2033   { "inc{S|}",		{ RMeBX }, 0 },
   2034   { "inc{S|}",		{ RMeSP }, 0 },
   2035   { "inc{S|}",		{ RMeBP }, 0 },
   2036   { "inc{S|}",		{ RMeSI }, 0 },
   2037   { "inc{S|}",		{ RMeDI }, 0 },
   2038   /* 48 */
   2039   { "dec{S|}",		{ RMeAX }, 0 },
   2040   { "dec{S|}",		{ RMeCX }, 0 },
   2041   { "dec{S|}",		{ RMeDX }, 0 },
   2042   { "dec{S|}",		{ RMeBX }, 0 },
   2043   { "dec{S|}",		{ RMeSP }, 0 },
   2044   { "dec{S|}",		{ RMeBP }, 0 },
   2045   { "dec{S|}",		{ RMeSI }, 0 },
   2046   { "dec{S|}",		{ RMeDI }, 0 },
   2047   /* 50 */
   2048   { "push!P",		{ RMrAX }, 0 },
   2049   { "push!P",		{ RMrCX }, 0 },
   2050   { "push!P",		{ RMrDX }, 0 },
   2051   { "push!P",		{ RMrBX }, 0 },
   2052   { "push!P",		{ RMrSP }, 0 },
   2053   { "push!P",		{ RMrBP }, 0 },
   2054   { "push!P",		{ RMrSI }, 0 },
   2055   { "push!P",		{ RMrDI }, 0 },
   2056   /* 58 */
   2057   { "pop!P",		{ RMrAX }, 0 },
   2058   { "pop!P",		{ RMrCX }, 0 },
   2059   { "pop!P",		{ RMrDX }, 0 },
   2060   { "pop!P",		{ RMrBX }, 0 },
   2061   { "pop!P",		{ RMrSP }, 0 },
   2062   { "pop!P",		{ RMrBP }, 0 },
   2063   { "pop!P",		{ RMrSI }, 0 },
   2064   { "pop!P",		{ RMrDI }, 0 },
   2065   /* 60 */
   2066   { X86_64_TABLE (X86_64_60) },
   2067   { X86_64_TABLE (X86_64_61) },
   2068   { X86_64_TABLE (X86_64_62) },
   2069   { X86_64_TABLE (X86_64_63) },
   2070   { Bad_Opcode },	/* seg fs */
   2071   { Bad_Opcode },	/* seg gs */
   2072   { Bad_Opcode },	/* op size prefix */
   2073   { Bad_Opcode },	/* adr size prefix */
   2074   /* 68 */
   2075   { "pushP",		{ sIv }, 0 },
   2076   { "imulS",		{ Gv, Ev, Iv }, 0 },
   2077   { "pushP",		{ sIbT }, 0 },
   2078   { "imulS",		{ Gv, Ev, sIb }, 0 },
   2079   { "ins{b|}",		{ Ybr, indirDX }, 0 },
   2080   { X86_64_TABLE (X86_64_6D) },
   2081   { "outs{b|}",		{ indirDXr, Xb }, 0 },
   2082   { X86_64_TABLE (X86_64_6F) },
   2083   /* 70 */
   2084   { "joH",		{ Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
   2085   { "jnoH",		{ Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
   2086   { "jbH",		{ Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
   2087   { "jaeH",		{ Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
   2088   { "jeH",		{ Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
   2089   { "jneH",		{ Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
   2090   { "jbeH",		{ Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
   2091   { "jaH",		{ Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
   2092   /* 78 */
   2093   { "jsH",		{ Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
   2094   { "jnsH",		{ Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
   2095   { "jpH",		{ Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
   2096   { "jnpH",		{ Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
   2097   { "jlH",		{ Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
   2098   { "jgeH",		{ Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
   2099   { "jleH",		{ Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
   2100   { "jgH",		{ Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
   2101   /* 80 */
   2102   { REG_TABLE (REG_80) },
   2103   { REG_TABLE (REG_81) },
   2104   { X86_64_TABLE (X86_64_82) },
   2105   { REG_TABLE (REG_83) },
   2106   { "testB",		{ Eb, Gb }, 0 },
   2107   { "testS",		{ Ev, Gv }, 0 },
   2108   { "xchgB",		{ Ebh2, Gb }, 0 },
   2109   { "xchgS",		{ Evh2, Gv }, 0 },
   2110   /* 88 */
   2111   { "movB",		{ Ebh3, Gb }, 0 },
   2112   { "movS",		{ Evh3, Gv }, 0 },
   2113   { "movB",		{ Gb, EbS }, 0 },
   2114   { "movS",		{ Gv, EvS }, 0 },
   2115   { "movD",		{ Sv, Sw }, 0 },
   2116   { "leaS",		{ Gv, M }, 0 },
   2117   { "movD",		{ Sw, Sv }, 0 },
   2118   { REG_TABLE (REG_8F) },
   2119   /* 90 */
   2120   { PREFIX_TABLE (PREFIX_90) },
   2121   { "xchgS",		{ RMeCX, eAX }, 0 },
   2122   { "xchgS",		{ RMeDX, eAX }, 0 },
   2123   { "xchgS",		{ RMeBX, eAX }, 0 },
   2124   { "xchgS",		{ RMeSP, eAX }, 0 },
   2125   { "xchgS",		{ RMeBP, eAX }, 0 },
   2126   { "xchgS",		{ RMeSI, eAX }, 0 },
   2127   { "xchgS",		{ RMeDI, eAX }, 0 },
   2128   /* 98 */
   2129   { "cW{t|}R",		{ XX }, 0 },
   2130   { "cR{t|}O",		{ XX }, 0 },
   2131   { X86_64_TABLE (X86_64_9A) },
   2132   { Bad_Opcode },	/* fwait */
   2133   { "pushfP",		{ XX }, 0 },
   2134   { "popfP",		{ XX }, 0 },
   2135   { "sahf",		{ XX }, 0 },
   2136   { "lahf",		{ XX }, 0 },
   2137   /* a0 */
   2138   { "mov%LB",		{ AL, Ob }, PREFIX_REX2_ILLEGAL },
   2139   { "mov%LS",		{ { JMPABS_Fixup, eAX_reg }, { JMPABS_Fixup, v_mode } }, PREFIX_REX2_ILLEGAL },
   2140   { "mov%LB",		{ Ob, AL }, PREFIX_REX2_ILLEGAL },
   2141   { "mov%LS",		{ Ov, eAX }, PREFIX_REX2_ILLEGAL },
   2142   { "movs{b|}",		{ Ybr, Xb }, PREFIX_REX2_ILLEGAL },
   2143   { "movs{R|}",		{ Yvr, Xv }, PREFIX_REX2_ILLEGAL },
   2144   { "cmps{b|}",		{ Xb, Yb }, PREFIX_REX2_ILLEGAL },
   2145   { "cmps{R|}",		{ Xv, Yv }, PREFIX_REX2_ILLEGAL },
   2146   /* a8 */
   2147   { "testB",		{ AL, Ib }, PREFIX_REX2_ILLEGAL },
   2148   { "testS",		{ eAX, Iv }, PREFIX_REX2_ILLEGAL },
   2149   { "stosB",		{ Ybr, AL }, PREFIX_REX2_ILLEGAL },
   2150   { "stosS",		{ Yvr, eAX }, PREFIX_REX2_ILLEGAL },
   2151   { "lodsB",		{ ALr, Xb }, PREFIX_REX2_ILLEGAL },
   2152   { "lodsS",		{ eAXr, Xv }, PREFIX_REX2_ILLEGAL },
   2153   { "scasB",		{ AL, Yb }, PREFIX_REX2_ILLEGAL },
   2154   { "scasS",		{ eAX, Yv }, PREFIX_REX2_ILLEGAL },
   2155   /* b0 */
   2156   { "movB",		{ RMAL, Ib }, 0 },
   2157   { "movB",		{ RMCL, Ib }, 0 },
   2158   { "movB",		{ RMDL, Ib }, 0 },
   2159   { "movB",		{ RMBL, Ib }, 0 },
   2160   { "movB",		{ RMAH, Ib }, 0 },
   2161   { "movB",		{ RMCH, Ib }, 0 },
   2162   { "movB",		{ RMDH, Ib }, 0 },
   2163   { "movB",		{ RMBH, Ib }, 0 },
   2164   /* b8 */
   2165   { "mov%LV",		{ RMeAX, Iv64 }, 0 },
   2166   { "mov%LV",		{ RMeCX, Iv64 }, 0 },
   2167   { "mov%LV",		{ RMeDX, Iv64 }, 0 },
   2168   { "mov%LV",		{ RMeBX, Iv64 }, 0 },
   2169   { "mov%LV",		{ RMeSP, Iv64 }, 0 },
   2170   { "mov%LV",		{ RMeBP, Iv64 }, 0 },
   2171   { "mov%LV",		{ RMeSI, Iv64 }, 0 },
   2172   { "mov%LV",		{ RMeDI, Iv64 }, 0 },
   2173   /* c0 */
   2174   { REG_TABLE (REG_C0) },
   2175   { REG_TABLE (REG_C1) },
   2176   { X86_64_TABLE (X86_64_C2) },
   2177   { X86_64_TABLE (X86_64_C3) },
   2178   { X86_64_TABLE (X86_64_C4) },
   2179   { X86_64_TABLE (X86_64_C5) },
   2180   { REG_TABLE (REG_C6) },
   2181   { REG_TABLE (REG_C7) },
   2182   /* c8 */
   2183   { "enterP",		{ Iw, Ib }, 0 },
   2184   { "leaveP",		{ XX }, 0 },
   2185   { "{l|}ret{|f}%LP",	{ Iw }, 0 },
   2186   { "{l|}ret{|f}%LP",	{ XX }, 0 },
   2187   { "int3",		{ XX }, 0 },
   2188   { "int",		{ Ib }, 0 },
   2189   { X86_64_TABLE (X86_64_CE) },
   2190   { "iret%LP",		{ XX }, 0 },
   2191   /* d0 */
   2192   { REG_TABLE (REG_D0) },
   2193   { REG_TABLE (REG_D1) },
   2194   { REG_TABLE (REG_D2) },
   2195   { REG_TABLE (REG_D3) },
   2196   { X86_64_TABLE (X86_64_D4) },
   2197   { X86_64_TABLE (X86_64_D5) },
   2198   { X86_64_TABLE (X86_64_D6) },
   2199   { "xlat",		{ DSBX }, 0 },
   2200   /* d8 */
   2201   { FLOAT },
   2202   { FLOAT },
   2203   { FLOAT },
   2204   { FLOAT },
   2205   { FLOAT },
   2206   { FLOAT },
   2207   { FLOAT },
   2208   { FLOAT },
   2209   /* e0 */
   2210   { "loopneFH",		{ Jb, XX, loop_jcxz_flag }, PREFIX_REX2_ILLEGAL },
   2211   { "loopeFH",		{ Jb, XX, loop_jcxz_flag }, PREFIX_REX2_ILLEGAL },
   2212   { "loopFH",		{ Jb, XX, loop_jcxz_flag }, PREFIX_REX2_ILLEGAL },
   2213   { "jEcxzH",		{ Jb, XX, loop_jcxz_flag }, PREFIX_REX2_ILLEGAL },
   2214   { "inB",		{ AL, Ib }, PREFIX_REX2_ILLEGAL },
   2215   { "inG",		{ zAX, Ib }, PREFIX_REX2_ILLEGAL },
   2216   { "outB",		{ Ib, AL }, PREFIX_REX2_ILLEGAL },
   2217   { "outG",		{ Ib, zAX }, PREFIX_REX2_ILLEGAL },
   2218   /* e8 */
   2219   { X86_64_TABLE (X86_64_E8) },
   2220   { X86_64_TABLE (X86_64_E9) },
   2221   { X86_64_TABLE (X86_64_EA) },
   2222   { "jmp",		{ Jb, BND }, PREFIX_REX2_ILLEGAL },
   2223   { "inB",		{ AL, indirDX }, PREFIX_REX2_ILLEGAL },
   2224   { "inG",		{ zAX, indirDX }, PREFIX_REX2_ILLEGAL },
   2225   { "outB",		{ indirDX, AL }, PREFIX_REX2_ILLEGAL },
   2226   { "outG",		{ indirDX, zAX }, PREFIX_REX2_ILLEGAL },
   2227   /* f0 */
   2228   { Bad_Opcode },	/* lock prefix */
   2229   { "int1",		{ XX }, 0 },
   2230   { Bad_Opcode },	/* repne */
   2231   { Bad_Opcode },	/* repz */
   2232   { "hlt",		{ XX }, 0 },
   2233   { "cmc",		{ XX }, 0 },
   2234   { REG_TABLE (REG_F6) },
   2235   { REG_TABLE (REG_F7) },
   2236   /* f8 */
   2237   { "clc",		{ XX }, 0 },
   2238   { "stc",		{ XX }, 0 },
   2239   { "cli",		{ XX }, 0 },
   2240   { "sti",		{ XX }, 0 },
   2241   { "cld",		{ XX }, 0 },
   2242   { "std",		{ XX }, 0 },
   2243   { REG_TABLE (REG_FE) },
   2244   { REG_TABLE (REG_FF) },
   2245 };
   2246 
   2247 static const struct dis386 dis386_twobyte[] = {
   2248   /* 00 */
   2249   { REG_TABLE (REG_0F00 ) },
   2250   { REG_TABLE (REG_0F01 ) },
   2251   { "larS",		{ Gv, Sv }, 0 },
   2252   { "lslS",		{ Gv, Sv }, 0 },
   2253   { Bad_Opcode },
   2254   { "syscall",		{ XX }, 0 },
   2255   { "clts",		{ XX }, 0 },
   2256   { "sysret%LQ",		{ XX }, 0 },
   2257   /* 08 */
   2258   { "invd",		{ XX }, 0 },
   2259   { PREFIX_TABLE (PREFIX_0F09) },
   2260   { Bad_Opcode },
   2261   { "ud2",		{ XX }, 0 },
   2262   { Bad_Opcode },
   2263   { REG_TABLE (REG_0F0D) },
   2264   { "femms",		{ XX }, 0 },
   2265   { "",			{ MX, EM, OPSUF }, 0 }, /* See OP_3DNowSuffix.  */
   2266   /* 10 */
   2267   { PREFIX_TABLE (PREFIX_0F10) },
   2268   { PREFIX_TABLE (PREFIX_0F11) },
   2269   { PREFIX_TABLE (PREFIX_0F12) },
   2270   { "movlpX",		{ Mq, XM }, PREFIX_OPCODE },
   2271   { "unpcklpX",		{ XM, EXx }, PREFIX_OPCODE },
   2272   { "unpckhpX",		{ XM, EXx }, PREFIX_OPCODE },
   2273   { PREFIX_TABLE (PREFIX_0F16) },
   2274   { "movhpX",		{ Mq, XM }, PREFIX_OPCODE },
   2275   /* 18 */
   2276   { REG_TABLE (REG_0F18) },
   2277   { "nopQ",		{ Ev }, 0 },
   2278   { PREFIX_TABLE (PREFIX_0F1A) },
   2279   { PREFIX_TABLE (PREFIX_0F1B) },
   2280   { PREFIX_TABLE (PREFIX_0F1C) },
   2281   { "nopQ",		{ Ev }, 0 },
   2282   { PREFIX_TABLE (PREFIX_0F1E) },
   2283   { "nopQ",		{ Ev }, 0 },
   2284   /* 20 */
   2285   { "movZ",		{ Em, Cm }, 0 },
   2286   { "movZ",		{ Em, Dm }, 0 },
   2287   { "movZ",		{ Cm, Em }, 0 },
   2288   { "movZ",		{ Dm, Em }, 0 },
   2289   { X86_64_TABLE (X86_64_0F24) },
   2290   { Bad_Opcode },
   2291   { X86_64_TABLE (X86_64_0F26) },
   2292   { Bad_Opcode },
   2293   /* 28 */
   2294   { "movapX",		{ XM, EXx }, PREFIX_OPCODE },
   2295   { "movapX",		{ EXxS, XM }, PREFIX_OPCODE },
   2296   { PREFIX_TABLE (PREFIX_0F2A) },
   2297   { PREFIX_TABLE (PREFIX_0F2B) },
   2298   { PREFIX_TABLE (PREFIX_0F2C) },
   2299   { PREFIX_TABLE (PREFIX_0F2D) },
   2300   { PREFIX_TABLE (PREFIX_0F2E) },
   2301   { PREFIX_TABLE (PREFIX_0F2F) },
   2302   /* 30 */
   2303   { "wrmsr",		{ XX }, PREFIX_REX2_ILLEGAL },
   2304   { "rdtsc",		{ XX }, PREFIX_REX2_ILLEGAL },
   2305   { "rdmsr",		{ XX }, PREFIX_REX2_ILLEGAL },
   2306   { "rdpmc",		{ XX }, PREFIX_REX2_ILLEGAL },
   2307   { "sysenter",		{ SEP }, PREFIX_REX2_ILLEGAL },
   2308   { "sysexit%LQ",	{ SEP }, PREFIX_REX2_ILLEGAL },
   2309   { Bad_Opcode },
   2310   { "getsec",		{ XX }, PREFIX_REX2_ILLEGAL },
   2311   /* 38 */
   2312   { THREE_BYTE_TABLE (THREE_BYTE_0F38) },
   2313   { Bad_Opcode },
   2314   { THREE_BYTE_TABLE (THREE_BYTE_0F3A) },
   2315   { Bad_Opcode },
   2316   { Bad_Opcode },
   2317   { Bad_Opcode },
   2318   { Bad_Opcode },
   2319   { Bad_Opcode },
   2320   /* 40 */
   2321   { "cmovoS",		{ Gv, Ev }, 0 },
   2322   { "cmovnoS",		{ Gv, Ev }, 0 },
   2323   { "cmovbS",		{ Gv, Ev }, 0 },
   2324   { "cmovaeS",		{ Gv, Ev }, 0 },
   2325   { "cmoveS",		{ Gv, Ev }, 0 },
   2326   { "cmovneS",		{ Gv, Ev }, 0 },
   2327   { "cmovbeS",		{ Gv, Ev }, 0 },
   2328   { "cmovaS",		{ Gv, Ev }, 0 },
   2329   /* 48 */
   2330   { "cmovsS",		{ Gv, Ev }, 0 },
   2331   { "cmovnsS",		{ Gv, Ev }, 0 },
   2332   { "cmovpS",		{ Gv, Ev }, 0 },
   2333   { "cmovnpS",		{ Gv, Ev }, 0 },
   2334   { "cmovlS",		{ Gv, Ev }, 0 },
   2335   { "cmovgeS",		{ Gv, Ev }, 0 },
   2336   { "cmovleS",		{ Gv, Ev }, 0 },
   2337   { "cmovgS",		{ Gv, Ev }, 0 },
   2338   /* 50 */
   2339   { "movmskpX",		{ Gdq, Ux }, PREFIX_OPCODE },
   2340   { PREFIX_TABLE (PREFIX_0F51) },
   2341   { PREFIX_TABLE (PREFIX_0F52) },
   2342   { PREFIX_TABLE (PREFIX_0F53) },
   2343   { "andpX",		{ XM, EXx }, PREFIX_OPCODE },
   2344   { "andnpX",		{ XM, EXx }, PREFIX_OPCODE },
   2345   { "orpX",		{ XM, EXx }, PREFIX_OPCODE },
   2346   { "xorpX",		{ XM, EXx }, PREFIX_OPCODE },
   2347   /* 58 */
   2348   { PREFIX_TABLE (PREFIX_0F58) },
   2349   { PREFIX_TABLE (PREFIX_0F59) },
   2350   { PREFIX_TABLE (PREFIX_0F5A) },
   2351   { PREFIX_TABLE (PREFIX_0F5B) },
   2352   { PREFIX_TABLE (PREFIX_0F5C) },
   2353   { PREFIX_TABLE (PREFIX_0F5D) },
   2354   { PREFIX_TABLE (PREFIX_0F5E) },
   2355   { PREFIX_TABLE (PREFIX_0F5F) },
   2356   /* 60 */
   2357   { PREFIX_TABLE (PREFIX_0F60) },
   2358   { PREFIX_TABLE (PREFIX_0F61) },
   2359   { PREFIX_TABLE (PREFIX_0F62) },
   2360   { "packsswb",		{ MX, EM }, PREFIX_OPCODE },
   2361   { "pcmpgtb",		{ MX, EM }, PREFIX_OPCODE },
   2362   { "pcmpgtw",		{ MX, EM }, PREFIX_OPCODE },
   2363   { "pcmpgtd",		{ MX, EM }, PREFIX_OPCODE },
   2364   { "packuswb",		{ MX, EM }, PREFIX_OPCODE },
   2365   /* 68 */
   2366   { "punpckhbw",	{ MX, EM }, PREFIX_OPCODE },
   2367   { "punpckhwd",	{ MX, EM }, PREFIX_OPCODE },
   2368   { "punpckhdq",	{ MX, EM }, PREFIX_OPCODE },
   2369   { "packssdw",		{ MX, EM }, PREFIX_OPCODE },
   2370   { "punpcklqdq", { XM, EXx }, PREFIX_DATA },
   2371   { "punpckhqdq", { XM, EXx }, PREFIX_DATA },
   2372   { "movK",		{ MX, Edq }, PREFIX_OPCODE },
   2373   { PREFIX_TABLE (PREFIX_0F6F) },
   2374   /* 70 */
   2375   { PREFIX_TABLE (PREFIX_0F70) },
   2376   { REG_TABLE (REG_0F71) },
   2377   { REG_TABLE (REG_0F72) },
   2378   { REG_TABLE (REG_0F73) },
   2379   { "pcmpeqb",		{ MX, EM }, PREFIX_OPCODE },
   2380   { "pcmpeqw",		{ MX, EM }, PREFIX_OPCODE },
   2381   { "pcmpeqd",		{ MX, EM }, PREFIX_OPCODE },
   2382   { "emms",		{ XX }, PREFIX_OPCODE },
   2383   /* 78 */
   2384   { PREFIX_TABLE (PREFIX_0F78) },
   2385   { PREFIX_TABLE (PREFIX_0F79) },
   2386   { Bad_Opcode },
   2387   { Bad_Opcode },
   2388   { PREFIX_TABLE (PREFIX_0F7C) },
   2389   { PREFIX_TABLE (PREFIX_0F7D) },
   2390   { PREFIX_TABLE (PREFIX_0F7E) },
   2391   { PREFIX_TABLE (PREFIX_0F7F) },
   2392   /* 80 */
   2393   { "joH",		{ Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
   2394   { "jnoH",		{ Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
   2395   { "jbH",		{ Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
   2396   { "jaeH",		{ Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
   2397   { "jeH",		{ Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
   2398   { "jneH",		{ Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
   2399   { "jbeH",		{ Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
   2400   { "jaH",		{ Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
   2401   /* 88 */
   2402   { "jsH",		{ Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
   2403   { "jnsH",		{ Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
   2404   { "jpH",		{ Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
   2405   { "jnpH",		{ Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
   2406   { "jlH",		{ Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
   2407   { "jgeH",		{ Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
   2408   { "jleH",		{ Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
   2409   { "jgH",		{ Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
   2410   /* 90 */
   2411   { "seto",		{ Eb }, 0 },
   2412   { "setno",		{ Eb }, 0 },
   2413   { "setb",		{ Eb }, 0 },
   2414   { "setae",		{ Eb }, 0 },
   2415   { "sete",		{ Eb }, 0 },
   2416   { "setne",		{ Eb }, 0 },
   2417   { "setbe",		{ Eb }, 0 },
   2418   { "seta",		{ Eb }, 0 },
   2419   /* 98 */
   2420   { "sets",		{ Eb }, 0 },
   2421   { "setns",		{ Eb }, 0 },
   2422   { "setp",		{ Eb }, 0 },
   2423   { "setnp",		{ Eb }, 0 },
   2424   { "setl",		{ Eb }, 0 },
   2425   { "setge",		{ Eb }, 0 },
   2426   { "setle",		{ Eb }, 0 },
   2427   { "setg",		{ Eb }, 0 },
   2428   /* a0 */
   2429   { "pushP",		{ fs }, 0 },
   2430   { "popP",		{ fs }, 0 },
   2431   { "cpuid",		{ XX }, 0 },
   2432   { "btS",		{ Ev, Gv }, 0 },
   2433   { "shldS",		{ Ev, Gv, Ib }, 0 },
   2434   { "shldS",		{ Ev, Gv, CL }, 0 },
   2435   { REG_TABLE (REG_0FA6) },
   2436   { REG_TABLE (REG_0FA7) },
   2437   /* a8 */
   2438   { "pushP",		{ gs }, 0 },
   2439   { "popP",		{ gs }, 0 },
   2440   { "rsm",		{ XX }, 0 },
   2441   { "btsS",		{ Evh1, Gv }, 0 },
   2442   { "shrdS",		{ Ev, Gv, Ib }, 0 },
   2443   { "shrdS",		{ Ev, Gv, CL }, 0 },
   2444   { REG_TABLE (REG_0FAE) },
   2445   { "imulS",		{ Gv, Ev }, 0 },
   2446   /* b0 */
   2447   { "cmpxchgB",		{ Ebh1, Gb }, 0 },
   2448   { "cmpxchgS",		{ Evh1, Gv }, 0 },
   2449   { "lssS",		{ Gv, Mp }, 0 },
   2450   { "btrS",		{ Evh1, Gv }, 0 },
   2451   { "lfsS",		{ Gv, Mp }, 0 },
   2452   { "lgsS",		{ Gv, Mp }, 0 },
   2453   { "movz{bR|x}",	{ Gv, Eb }, 0 },
   2454   { "movz{wR|x}",	{ Gv, Ew }, 0 }, /* yes, there really is movzww ! */
   2455   /* b8 */
   2456   { PREFIX_TABLE (PREFIX_0FB8) },
   2457   { "ud1S",		{ Gv, Ev }, 0 },
   2458   { REG_TABLE (REG_0FBA) },
   2459   { "btcS",		{ Evh1, Gv }, 0 },
   2460   { PREFIX_TABLE (PREFIX_0FBC) },
   2461   { PREFIX_TABLE (PREFIX_0FBD) },
   2462   { "movs{bR|x}",	{ Gv, Eb }, 0 },
   2463   { "movs{wR|x}",	{ Gv, Ew }, 0 }, /* yes, there really is movsww ! */
   2464   /* c0 */
   2465   { "xaddB",		{ Ebh1, Gb }, 0 },
   2466   { "xaddS",		{ Evh1, Gv }, 0 },
   2467   { PREFIX_TABLE (PREFIX_0FC2) },
   2468   { "movntiS",		{ Mdq, Gdq }, PREFIX_OPCODE },
   2469   { "pinsrw",		{ MX, Edw, Ib }, PREFIX_OPCODE },
   2470   { "pextrw",		{ Gd, Nq, Ib }, PREFIX_OPCODE },
   2471   { "shufpX",		{ XM, EXx, Ib }, PREFIX_OPCODE },
   2472   { REG_TABLE (REG_0FC7) },
   2473   /* c8 */
   2474   { "bswap",		{ RMeAX }, 0 },
   2475   { "bswap",		{ RMeCX }, 0 },
   2476   { "bswap",		{ RMeDX }, 0 },
   2477   { "bswap",		{ RMeBX }, 0 },
   2478   { "bswap",		{ RMeSP }, 0 },
   2479   { "bswap",		{ RMeBP }, 0 },
   2480   { "bswap",		{ RMeSI }, 0 },
   2481   { "bswap",		{ RMeDI }, 0 },
   2482   /* d0 */
   2483   { PREFIX_TABLE (PREFIX_0FD0) },
   2484   { "psrlw",		{ MX, EM }, PREFIX_OPCODE },
   2485   { "psrld",		{ MX, EM }, PREFIX_OPCODE },
   2486   { "psrlq",		{ MX, EM }, PREFIX_OPCODE },
   2487   { "paddq",		{ MX, EM }, PREFIX_OPCODE },
   2488   { "pmullw",		{ MX, EM }, PREFIX_OPCODE },
   2489   { PREFIX_TABLE (PREFIX_0FD6) },
   2490   { "pmovmskb",		{ Gdq, Nq }, PREFIX_OPCODE },
   2491   /* d8 */
   2492   { "psubusb",		{ MX, EM }, PREFIX_OPCODE },
   2493   { "psubusw",		{ MX, EM }, PREFIX_OPCODE },
   2494   { "pminub",		{ MX, EM }, PREFIX_OPCODE },
   2495   { "pand",		{ MX, EM }, PREFIX_OPCODE },
   2496   { "paddusb",		{ MX, EM }, PREFIX_OPCODE },
   2497   { "paddusw",		{ MX, EM }, PREFIX_OPCODE },
   2498   { "pmaxub",		{ MX, EM }, PREFIX_OPCODE },
   2499   { "pandn",		{ MX, EM }, PREFIX_OPCODE },
   2500   /* e0 */
   2501   { "pavgb",		{ MX, EM }, PREFIX_OPCODE },
   2502   { "psraw",		{ MX, EM }, PREFIX_OPCODE },
   2503   { "psrad",		{ MX, EM }, PREFIX_OPCODE },
   2504   { "pavgw",		{ MX, EM }, PREFIX_OPCODE },
   2505   { "pmulhuw",		{ MX, EM }, PREFIX_OPCODE },
   2506   { "pmulhw",		{ MX, EM }, PREFIX_OPCODE },
   2507   { PREFIX_TABLE (PREFIX_0FE6) },
   2508   { PREFIX_TABLE (PREFIX_0FE7) },
   2509   /* e8 */
   2510   { "psubsb",		{ MX, EM }, PREFIX_OPCODE },
   2511   { "psubsw",		{ MX, EM }, PREFIX_OPCODE },
   2512   { "pminsw",		{ MX, EM }, PREFIX_OPCODE },
   2513   { "por",		{ MX, EM }, PREFIX_OPCODE },
   2514   { "paddsb",		{ MX, EM }, PREFIX_OPCODE },
   2515   { "paddsw",		{ MX, EM }, PREFIX_OPCODE },
   2516   { "pmaxsw",		{ MX, EM }, PREFIX_OPCODE },
   2517   { "pxor",		{ MX, EM }, PREFIX_OPCODE },
   2518   /* f0 */
   2519   { PREFIX_TABLE (PREFIX_0FF0) },
   2520   { "psllw",		{ MX, EM }, PREFIX_OPCODE },
   2521   { "pslld",		{ MX, EM }, PREFIX_OPCODE },
   2522   { "psllq",		{ MX, EM }, PREFIX_OPCODE },
   2523   { "pmuludq",		{ MX, EM }, PREFIX_OPCODE },
   2524   { "pmaddwd",		{ MX, EM }, PREFIX_OPCODE },
   2525   { "psadbw",		{ MX, EM }, PREFIX_OPCODE },
   2526   { PREFIX_TABLE (PREFIX_0FF7) },
   2527   /* f8 */
   2528   { "psubb",		{ MX, EM }, PREFIX_OPCODE },
   2529   { "psubw",		{ MX, EM }, PREFIX_OPCODE },
   2530   { "psubd",		{ MX, EM }, PREFIX_OPCODE },
   2531   { "psubq",		{ MX, EM }, PREFIX_OPCODE },
   2532   { "paddb",		{ MX, EM }, PREFIX_OPCODE },
   2533   { "paddw",		{ MX, EM }, PREFIX_OPCODE },
   2534   { "paddd",		{ MX, EM }, PREFIX_OPCODE },
   2535   { "ud0S",		{ Gv, Ev }, 0 },
   2536 };
   2537 
   2538 static const bool onebyte_has_modrm[256] = {
   2539   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
   2540   /*       -------------------------------        */
   2541   /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
   2542   /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
   2543   /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
   2544   /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
   2545   /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
   2546   /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
   2547   /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
   2548   /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
   2549   /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
   2550   /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
   2551   /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
   2552   /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
   2553   /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
   2554   /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
   2555   /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
   2556   /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1  /* f0 */
   2557   /*       -------------------------------        */
   2558   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
   2559 };
   2560 
   2561 static const bool twobyte_has_modrm[256] = {
   2562   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
   2563   /*       -------------------------------        */
   2564   /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
   2565   /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
   2566   /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
   2567   /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
   2568   /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
   2569   /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
   2570   /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
   2571   /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
   2572   /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
   2573   /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
   2574   /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
   2575   /* b0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bf */
   2576   /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
   2577   /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
   2578   /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
   2579   /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1  /* ff */
   2580   /*       -------------------------------        */
   2581   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
   2582 };
   2583 
   2584 
   2585 struct op
   2586   {
   2587     const char *name;
   2588     unsigned int len;
   2589   };
   2590 
   2591 /* If we are accessing mod/rm/reg without need_modrm set, then the
   2592    values are stale.  Hitting this abort likely indicates that you
   2593    need to update onebyte_has_modrm or twobyte_has_modrm.  */
   2594 #define MODRM_CHECK  if (!ins->need_modrm) abort ()
   2595 
   2596 static const char intel_index16[][6] = {
   2597   "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
   2598 };
   2599 
   2600 static const char att_names64[][8] = {
   2601   "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
   2602   "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15",
   2603   "%r16", "%r17", "%r18", "%r19", "%r20", "%r21", "%r22", "%r23",
   2604   "%r24", "%r25", "%r26", "%r27", "%r28", "%r29", "%r30", "%r31",
   2605 };
   2606 static const char att_names32[][8] = {
   2607   "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
   2608   "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d",
   2609   "%r16d", "%r17d", "%r18d", "%r19d", "%r20d", "%r21d", "%r22d", "%r23d",
   2610   "%r24d", "%r25d", "%r26d", "%r27d", "%r28d", "%r29d", "%r30d", "%r31d",
   2611 };
   2612 static const char att_names16[][8] = {
   2613   "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
   2614   "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w",
   2615   "%r16w", "%r17w", "%r18w", "%r19w", "%r20w", "%r21w", "%r22w", "%r23w",
   2616   "%r24w", "%r25w", "%r26w", "%r27w", "%r28w", "%r29w", "%r30w", "%r31w",
   2617 };
   2618 static const char att_names8[][8] = {
   2619   "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
   2620 };
   2621 static const char att_names8rex[][8] = {
   2622   "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
   2623   "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b",
   2624   "%r16b", "%r17b", "%r18b", "%r19b", "%r20b", "%r21b", "%r22b", "%r23b",
   2625   "%r24b", "%r25b", "%r26b", "%r27b", "%r28b", "%r29b", "%r30b", "%r31b",
   2626 };
   2627 static const char att_names_seg[][4] = {
   2628   "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
   2629 };
   2630 static const char att_index64[] = "%riz";
   2631 static const char att_index32[] = "%eiz";
   2632 static const char att_index16[][8] = {
   2633   "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
   2634 };
   2635 
   2636 static const char att_names_mm[][8] = {
   2637   "%mm0", "%mm1", "%mm2", "%mm3",
   2638   "%mm4", "%mm5", "%mm6", "%mm7"
   2639 };
   2640 
   2641 static const char att_names_bnd[][8] = {
   2642   "%bnd0", "%bnd1", "%bnd2", "%bnd3"
   2643 };
   2644 
   2645 static const char att_names_xmm[][8] = {
   2646   "%xmm0", "%xmm1", "%xmm2", "%xmm3",
   2647   "%xmm4", "%xmm5", "%xmm6", "%xmm7",
   2648   "%xmm8", "%xmm9", "%xmm10", "%xmm11",
   2649   "%xmm12", "%xmm13", "%xmm14", "%xmm15",
   2650   "%xmm16", "%xmm17", "%xmm18", "%xmm19",
   2651   "%xmm20", "%xmm21", "%xmm22", "%xmm23",
   2652   "%xmm24", "%xmm25", "%xmm26", "%xmm27",
   2653   "%xmm28", "%xmm29", "%xmm30", "%xmm31"
   2654 };
   2655 
   2656 static const char att_names_ymm[][8] = {
   2657   "%ymm0", "%ymm1", "%ymm2", "%ymm3",
   2658   "%ymm4", "%ymm5", "%ymm6", "%ymm7",
   2659   "%ymm8", "%ymm9", "%ymm10", "%ymm11",
   2660   "%ymm12", "%ymm13", "%ymm14", "%ymm15",
   2661   "%ymm16", "%ymm17", "%ymm18", "%ymm19",
   2662   "%ymm20", "%ymm21", "%ymm22", "%ymm23",
   2663   "%ymm24", "%ymm25", "%ymm26", "%ymm27",
   2664   "%ymm28", "%ymm29", "%ymm30", "%ymm31"
   2665 };
   2666 
   2667 static const char att_names_zmm[][8] = {
   2668   "%zmm0", "%zmm1", "%zmm2", "%zmm3",
   2669   "%zmm4", "%zmm5", "%zmm6", "%zmm7",
   2670   "%zmm8", "%zmm9", "%zmm10", "%zmm11",
   2671   "%zmm12", "%zmm13", "%zmm14", "%zmm15",
   2672   "%zmm16", "%zmm17", "%zmm18", "%zmm19",
   2673   "%zmm20", "%zmm21", "%zmm22", "%zmm23",
   2674   "%zmm24", "%zmm25", "%zmm26", "%zmm27",
   2675   "%zmm28", "%zmm29", "%zmm30", "%zmm31"
   2676 };
   2677 
   2678 static const char att_names_tmm[][8] = {
   2679   "%tmm0", "%tmm1", "%tmm2", "%tmm3",
   2680   "%tmm4", "%tmm5", "%tmm6", "%tmm7"
   2681 };
   2682 
   2683 static const char att_names_mask[][8] = {
   2684   "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
   2685 };
   2686 
   2687 static const char *const names_rounding[] =
   2688 {
   2689   "{rn-",
   2690   "{rd-",
   2691   "{ru-",
   2692   "{rz-"
   2693 };
   2694 
   2695 static const struct dis386 reg_table[][8] = {
   2696   /* REG_80 */
   2697   {
   2698     { "addA",	{ Ebh1, Ib }, 0 },
   2699     { "orA",	{ Ebh1, Ib }, 0 },
   2700     { "adcA",	{ Ebh1, Ib }, 0 },
   2701     { "sbbA",	{ Ebh1, Ib }, 0 },
   2702     { "andA",	{ Ebh1, Ib }, 0 },
   2703     { "subA",	{ Ebh1, Ib }, 0 },
   2704     { "xorA",	{ Ebh1, Ib }, 0 },
   2705     { "cmpA",	{ Eb, Ib }, 0 },
   2706   },
   2707   /* REG_81 */
   2708   {
   2709     { "addQ",	{ Evh1, Iv }, 0 },
   2710     { "orQ",	{ Evh1, Iv }, 0 },
   2711     { "adcQ",	{ Evh1, Iv }, 0 },
   2712     { "sbbQ",	{ Evh1, Iv }, 0 },
   2713     { "andQ",	{ Evh1, Iv }, 0 },
   2714     { "subQ",	{ Evh1, Iv }, 0 },
   2715     { "xorQ",	{ Evh1, Iv }, 0 },
   2716     { "cmpQ",	{ Ev, Iv }, 0 },
   2717   },
   2718   /* REG_83 */
   2719   {
   2720     { "addQ",	{ Evh1, sIb }, 0 },
   2721     { "orQ",	{ Evh1, sIb }, 0 },
   2722     { "adcQ",	{ Evh1, sIb }, 0 },
   2723     { "sbbQ",	{ Evh1, sIb }, 0 },
   2724     { "andQ",	{ Evh1, sIb }, 0 },
   2725     { "subQ",	{ Evh1, sIb }, 0 },
   2726     { "xorQ",	{ Evh1, sIb }, 0 },
   2727     { "cmpQ",	{ Ev, sIb }, 0 },
   2728   },
   2729   /* REG_8F */
   2730   {
   2731     { "pop{P|}", { stackEv }, 0 },
   2732     { XOP_8F_TABLE () },
   2733     { Bad_Opcode },
   2734     { Bad_Opcode },
   2735     { Bad_Opcode },
   2736     { XOP_8F_TABLE () },
   2737   },
   2738   /* REG_C0 */
   2739   {
   2740     { "%NFrolA",	{ VexGb, Eb, Ib }, NO_PREFIX },
   2741     { "%NFrorA",	{ VexGb, Eb, Ib }, NO_PREFIX },
   2742     { "rclA",	{ VexGb, Eb, Ib }, NO_PREFIX },
   2743     { "rcrA",	{ VexGb, Eb, Ib }, NO_PREFIX },
   2744     { "%NFshlA",	{ VexGb, Eb, Ib }, NO_PREFIX },
   2745     { "%NFshrA",	{ VexGb, Eb, Ib }, NO_PREFIX },
   2746     { "%NFshlA",	{ VexGb, Eb, Ib }, NO_PREFIX },
   2747     { "%NFsarA",	{ VexGb, Eb, Ib }, NO_PREFIX },
   2748   },
   2749   /* REG_C1 */
   2750   {
   2751     { "%NFrolQ",	{ VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
   2752     { "%NFrorQ",	{ VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
   2753     { "rclQ",	{ VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
   2754     { "rcrQ",	{ VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
   2755     { "%NFshlQ",	{ VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
   2756     { "%NFshrQ",	{ VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
   2757     { "%NFshlQ",	{ VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
   2758     { "%NFsarQ",	{ VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
   2759   },
   2760   /* REG_C6 */
   2761   {
   2762     { "movA",	{ Ebh3, Ib }, 0 },
   2763     { Bad_Opcode },
   2764     { Bad_Opcode },
   2765     { Bad_Opcode },
   2766     { Bad_Opcode },
   2767     { Bad_Opcode },
   2768     { Bad_Opcode },
   2769     { RM_TABLE (RM_C6_REG_7) },
   2770   },
   2771   /* REG_C7 */
   2772   {
   2773     { "movQ",	{ Evh3, Iv }, 0 },
   2774     { Bad_Opcode },
   2775     { Bad_Opcode },
   2776     { Bad_Opcode },
   2777     { Bad_Opcode },
   2778     { Bad_Opcode },
   2779     { Bad_Opcode },
   2780     { RM_TABLE (RM_C7_REG_7) },
   2781   },
   2782   /* REG_D0 */
   2783   {
   2784     { "%NFrolA",	{ VexGb, Eb, I1 }, NO_PREFIX },
   2785     { "%NFrorA",	{ VexGb, Eb, I1 }, NO_PREFIX },
   2786     { "rclA",	{ VexGb, Eb, I1 }, NO_PREFIX },
   2787     { "rcrA",	{ VexGb, Eb, I1 }, NO_PREFIX },
   2788     { "%NFshlA",	{ VexGb, Eb, I1 }, NO_PREFIX },
   2789     { "%NFshrA",	{ VexGb, Eb, I1 }, NO_PREFIX },
   2790     { "%NFshlA",	{ VexGb, Eb, I1 }, NO_PREFIX },
   2791     { "%NFsarA",	{ VexGb, Eb, I1 }, NO_PREFIX },
   2792   },
   2793   /* REG_D1 */
   2794   {
   2795     { "%NFrolQ",	{ VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
   2796     { "%NFrorQ",	{ VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
   2797     { "rclQ",	{ VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
   2798     { "rcrQ",	{ VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
   2799     { "%NFshlQ",	{ VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
   2800     { "%NFshrQ",	{ VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
   2801     { "%NFshlQ",	{ VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
   2802     { "%NFsarQ",	{ VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
   2803   },
   2804   /* REG_D2 */
   2805   {
   2806     { "%NFrolA",	{ VexGb, Eb, CL }, NO_PREFIX },
   2807     { "%NFrorA",	{ VexGb, Eb, CL }, NO_PREFIX },
   2808     { "rclA",	{ VexGb, Eb, CL }, NO_PREFIX },
   2809     { "rcrA",	{ VexGb, Eb, CL }, NO_PREFIX },
   2810     { "%NFshlA",	{ VexGb, Eb, CL }, NO_PREFIX },
   2811     { "%NFshrA",	{ VexGb, Eb, CL }, NO_PREFIX },
   2812     { "%NFshlA",	{ VexGb, Eb, CL }, NO_PREFIX },
   2813     { "%NFsarA",	{ VexGb, Eb, CL }, NO_PREFIX },
   2814   },
   2815   /* REG_D3 */
   2816   {
   2817     { "%NFrolQ",	{ VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
   2818     { "%NFrorQ",	{ VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
   2819     { "rclQ",	{ VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
   2820     { "rcrQ",	{ VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
   2821     { "%NFshlQ",	{ VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
   2822     { "%NFshrQ",	{ VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
   2823     { "%NFshlQ",	{ VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
   2824     { "%NFsarQ",	{ VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
   2825   },
   2826   /* REG_F6 */
   2827   {
   2828     { "testA",	{ Eb, Ib }, 0 },
   2829     { "testA",	{ Eb, Ib }, 0 },
   2830     { "notA",	{ Ebh1 }, 0 },
   2831     { "negA",	{ Ebh1 }, 0 },
   2832     { "mulA",	{ Eb }, 0 },	/* Don't print the implicit %al register,  */
   2833     { "imulA",	{ Eb }, 0 },	/* to distinguish these opcodes from other */
   2834     { "divA",	{ Eb }, 0 },	/* mul/imul opcodes.  Do the same for div  */
   2835     { "idivA",	{ Eb }, 0 },	/* and idiv for consistency.		   */
   2836   },
   2837   /* REG_F7 */
   2838   {
   2839     { "testQ",	{ Ev, Iv }, 0 },
   2840     { "testQ",	{ Ev, Iv }, 0 },
   2841     { "notQ",	{ Evh1 }, 0 },
   2842     { "negQ",	{ Evh1 }, 0 },
   2843     { "mulQ",	{ Ev }, 0 },	/* Don't print the implicit register.  */
   2844     { "imulQ",	{ Ev }, 0 },
   2845     { "divQ",	{ Ev }, 0 },
   2846     { "idivQ",	{ Ev }, 0 },
   2847   },
   2848   /* REG_FE */
   2849   {
   2850     { "incA",	{ Ebh1 }, 0 },
   2851     { "decA",	{ Ebh1 }, 0 },
   2852   },
   2853   /* REG_FF */
   2854   {
   2855     { "incQ",	{ Evh1 }, 0 },
   2856     { "decQ",	{ Evh1 }, 0 },
   2857     { "call{@|}", { NOTRACK, indirEv, BND }, 0 },
   2858     { "{l|}call^", { indirEp }, 0 },
   2859     { "jmp{@|}", { NOTRACK, indirEv, BND }, 0 },
   2860     { "{l|}jmp^", { indirEp }, 0 },
   2861     { "push{P|}", { stackEv }, 0 },
   2862     { Bad_Opcode },
   2863   },
   2864   /* REG_0F00 */
   2865   {
   2866     { "sldtD",	{ Sv }, 0 },
   2867     { "strD",	{ Sv }, 0 },
   2868     { "lldtD",	{ Sv }, 0 },
   2869     { "ltrD",	{ Sv }, 0 },
   2870     { "verrD",	{ Sv }, 0 },
   2871     { "verwD",	{ Sv }, 0 },
   2872     { X86_64_TABLE (X86_64_0F00_REG_6) },
   2873     { Bad_Opcode },
   2874   },
   2875   /* REG_0F01 */
   2876   {
   2877     { MOD_TABLE (MOD_0F01_REG_0) },
   2878     { MOD_TABLE (MOD_0F01_REG_1) },
   2879     { MOD_TABLE (MOD_0F01_REG_2) },
   2880     { MOD_TABLE (MOD_0F01_REG_3) },
   2881     { "smswD",	{ Sv }, 0 },
   2882     { MOD_TABLE (MOD_0F01_REG_5) },
   2883     { "lmsw",	{ Ew }, 0 },
   2884     { MOD_TABLE (MOD_0F01_REG_7) },
   2885   },
   2886   /* REG_0F0D */
   2887   {
   2888     { "prefetch",	{ Mb }, 0 },
   2889     { "prefetchw",	{ Mb }, 0 },
   2890     { "prefetchwt1",	{ Mb }, 0 },
   2891     { "prefetch",	{ Mb }, 0 },
   2892     { "prefetch",	{ Mb }, 0 },
   2893     { "prefetch",	{ Mb }, 0 },
   2894     { "prefetch",	{ Mb }, 0 },
   2895     { "prefetch",	{ Mb }, 0 },
   2896   },
   2897   /* REG_0F18 */
   2898   {
   2899     { MOD_TABLE (MOD_0F18_REG_0) },
   2900     { MOD_TABLE (MOD_0F18_REG_1) },
   2901     { MOD_TABLE (MOD_0F18_REG_2) },
   2902     { MOD_TABLE (MOD_0F18_REG_3) },
   2903     { MOD_TABLE (MOD_0F18_REG_4) },
   2904     { "nopQ",		{ Ev }, 0 },
   2905     { MOD_TABLE (MOD_0F18_REG_6) },
   2906     { MOD_TABLE (MOD_0F18_REG_7) },
   2907   },
   2908   /* REG_0F1C_P_0_MOD_0 */
   2909   {
   2910     { "cldemote",	{ Mb }, 0 },
   2911     { "nopQ",		{ Ev }, 0 },
   2912     { "nopQ",		{ Ev }, 0 },
   2913     { "nopQ",		{ Ev }, 0 },
   2914     { "nopQ",		{ Ev }, 0 },
   2915     { "nopQ",		{ Ev }, 0 },
   2916     { "nopQ",		{ Ev }, 0 },
   2917     { "nopQ",		{ Ev }, 0 },
   2918   },
   2919   /* REG_0F1E_P_1_MOD_3 */
   2920   {
   2921     { "nopQ",		{ Ev }, PREFIX_IGNORED },
   2922     { "rdsspK",		{ Edq }, 0 },
   2923     { "nopQ",		{ Ev }, PREFIX_IGNORED },
   2924     { "nopQ",		{ Ev }, PREFIX_IGNORED },
   2925     { "nopQ",		{ Ev }, PREFIX_IGNORED },
   2926     { "nopQ",		{ Ev }, PREFIX_IGNORED },
   2927     { "nopQ",		{ Ev }, PREFIX_IGNORED },
   2928     { RM_TABLE (RM_0F1E_P_1_MOD_3_REG_7) },
   2929   },
   2930   /* REG_0F38D8_PREFIX_1 */
   2931   {
   2932     { "aesencwide128kl",	{ M }, 0 },
   2933     { "aesdecwide128kl",	{ M }, 0 },
   2934     { "aesencwide256kl",	{ M }, 0 },
   2935     { "aesdecwide256kl",	{ M }, 0 },
   2936   },
   2937   /* REG_0F3A0F_P_1 */
   2938   {
   2939     { RM_TABLE (RM_0F3A0F_P_1_R_0) },
   2940   },
   2941   /* REG_0F71 */
   2942   {
   2943     { Bad_Opcode },
   2944     { Bad_Opcode },
   2945     { "psrlw",		{ Nq, Ib }, PREFIX_OPCODE },
   2946     { Bad_Opcode },
   2947     { "psraw",		{ Nq, Ib }, PREFIX_OPCODE },
   2948     { Bad_Opcode },
   2949     { "psllw",		{ Nq, Ib }, PREFIX_OPCODE },
   2950   },
   2951   /* REG_0F72 */
   2952   {
   2953     { Bad_Opcode },
   2954     { Bad_Opcode },
   2955     { "psrld",		{ Nq, Ib }, PREFIX_OPCODE },
   2956     { Bad_Opcode },
   2957     { "psrad",		{ Nq, Ib }, PREFIX_OPCODE },
   2958     { Bad_Opcode },
   2959     { "pslld",		{ Nq, Ib }, PREFIX_OPCODE },
   2960   },
   2961   /* REG_0F73 */
   2962   {
   2963     { Bad_Opcode },
   2964     { Bad_Opcode },
   2965     { "psrlq",		{ Nq, Ib }, PREFIX_OPCODE },
   2966     { "psrldq",		{ Ux, Ib }, PREFIX_DATA },
   2967     { Bad_Opcode },
   2968     { Bad_Opcode },
   2969     { "psllq",		{ Nq, Ib }, PREFIX_OPCODE },
   2970     { "pslldq",		{ Ux, Ib }, PREFIX_DATA },
   2971   },
   2972   /* REG_0FA6 */
   2973   {
   2974     { PREFIX_TABLE (PREFIX_0FA6_REG_0) },
   2975     { "xsha1",		{ { OP_0f07, 0 } }, 0 },
   2976     { "xsha256",	{ { OP_0f07, 0 } }, 0 },
   2977     { "xsha384",	{ { OP_0f07, 0 } }, 0 },
   2978     { "xsha512",	{ { OP_0f07, 0 } }, 0 },
   2979     { PREFIX_TABLE (PREFIX_0FA6_REG_5) },
   2980     { "montmul2",	{ { OP_0f07, 0 } }, 0 },
   2981     { "xmodexp",	{ { OP_0f07, 0 } }, 0 },
   2982   },
   2983   /* REG_0FA7 */
   2984   {
   2985     { "xstore-rng",	{ { OP_0f07, 0 } }, 0 },
   2986     { "xcrypt-ecb",	{ { OP_0f07, 0 } }, 0 },
   2987     { "xcrypt-cbc",	{ { OP_0f07, 0 } }, 0 },
   2988     { "xcrypt-ctr",	{ { OP_0f07, 0 } }, 0 },
   2989     { "xcrypt-cfb",	{ { OP_0f07, 0 } }, 0 },
   2990     { "xcrypt-ofb",	{ { OP_0f07, 0 } }, 0 },
   2991     { PREFIX_TABLE (PREFIX_0FA7_REG_6) },
   2992     { "xrng2",		{ { OP_0f07, 0 } }, 0 },
   2993   },
   2994   /* REG_0FAE */
   2995   {
   2996     { MOD_TABLE (MOD_0FAE_REG_0) },
   2997     { MOD_TABLE (MOD_0FAE_REG_1) },
   2998     { MOD_TABLE (MOD_0FAE_REG_2) },
   2999     { MOD_TABLE (MOD_0FAE_REG_3) },
   3000     { MOD_TABLE (MOD_0FAE_REG_4) },
   3001     { MOD_TABLE (MOD_0FAE_REG_5) },
   3002     { MOD_TABLE (MOD_0FAE_REG_6) },
   3003     { MOD_TABLE (MOD_0FAE_REG_7) },
   3004   },
   3005   /* REG_0FBA */
   3006   {
   3007     { Bad_Opcode },
   3008     { Bad_Opcode },
   3009     { Bad_Opcode },
   3010     { Bad_Opcode },
   3011     { "btQ",	{ Ev, Ib }, 0 },
   3012     { "btsQ",	{ Evh1, Ib }, 0 },
   3013     { "btrQ",	{ Evh1, Ib }, 0 },
   3014     { "btcQ",	{ Evh1, Ib }, 0 },
   3015   },
   3016   /* REG_0FC7 */
   3017   {
   3018     { Bad_Opcode },
   3019     { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } }, 0 },
   3020     { Bad_Opcode },
   3021     { "xrstors", { FXSAVE }, PREFIX_REX2_ILLEGAL },
   3022     { "xsavec", { FXSAVE }, PREFIX_REX2_ILLEGAL },
   3023     { "xsaves", { FXSAVE }, PREFIX_REX2_ILLEGAL },
   3024     { MOD_TABLE (MOD_0FC7_REG_6) },
   3025     { MOD_TABLE (MOD_0FC7_REG_7) },
   3026   },
   3027   /* REG_VEX_0F71 */
   3028   {
   3029     { Bad_Opcode },
   3030     { Bad_Opcode },
   3031     { "vpsrlw",		{ Vex, Ux, Ib }, PREFIX_DATA },
   3032     { Bad_Opcode },
   3033     { "vpsraw",		{ Vex, Ux, Ib }, PREFIX_DATA },
   3034     { Bad_Opcode },
   3035     { "vpsllw",		{ Vex, Ux, Ib }, PREFIX_DATA },
   3036   },
   3037   /* REG_VEX_0F72 */
   3038   {
   3039     { Bad_Opcode },
   3040     { Bad_Opcode },
   3041     { "vpsrld",		{ Vex, Ux, Ib }, PREFIX_DATA },
   3042     { Bad_Opcode },
   3043     { "vpsrad",		{ Vex, Ux, Ib }, PREFIX_DATA },
   3044     { Bad_Opcode },
   3045     { "vpslld",		{ Vex, Ux, Ib }, PREFIX_DATA },
   3046   },
   3047   /* REG_VEX_0F73 */
   3048   {
   3049     { Bad_Opcode },
   3050     { Bad_Opcode },
   3051     { "vpsrlq",		{ Vex, Ux, Ib }, PREFIX_DATA },
   3052     { "vpsrldq",	{ Vex, Ux, Ib }, PREFIX_DATA },
   3053     { Bad_Opcode },
   3054     { Bad_Opcode },
   3055     { "vpsllq",		{ Vex, Ux, Ib }, PREFIX_DATA },
   3056     { "vpslldq",	{ Vex, Ux, Ib }, PREFIX_DATA },
   3057   },
   3058   /* REG_VEX_0FAE */
   3059   {
   3060     { Bad_Opcode },
   3061     { Bad_Opcode },
   3062     { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2) },
   3063     { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3) },
   3064   },
   3065   /* REG_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0 */
   3066   {
   3067     { RM_TABLE (RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0_R_0) },
   3068   },
   3069   /* REG_VEX_0F38F3_L_0_P_0 */
   3070   {
   3071     { Bad_Opcode },
   3072     { "%NFblsrS",		{ VexGdq, Edq }, 0 },
   3073     { "%NFblsmskS",		{ VexGdq, Edq }, 0 },
   3074     { "%NFblsiS",		{ VexGdq, Edq }, 0 },
   3075   },
   3076   /* REG_VEX_MAP7_F6_L_0_W_0 */
   3077   {
   3078     { X86_64_TABLE (X86_64_VEX_MAP7_F6_L_0_W_0_R_0) },
   3079   },
   3080   /* REG_VEX_MAP7_F8_L_0_W_0 */
   3081   {
   3082     { X86_64_TABLE (X86_64_VEX_MAP7_F8_L_0_W_0_R_0) },
   3083   },
   3084   /* REG_XOP_09_01_L_0 */
   3085   {
   3086     { Bad_Opcode },
   3087     { "blcfill",	{ VexGdq, Edq }, 0 },
   3088     { "blsfill",	{ VexGdq, Edq }, 0 },
   3089     { "blcs",	{ VexGdq, Edq }, 0 },
   3090     { "tzmsk",	{ VexGdq, Edq }, 0 },
   3091     { "blcic",	{ VexGdq, Edq }, 0 },
   3092     { "blsic",	{ VexGdq, Edq }, 0 },
   3093     { "t1mskc",	{ VexGdq, Edq }, 0 },
   3094   },
   3095   /* REG_XOP_09_02_L_0 */
   3096   {
   3097     { Bad_Opcode },
   3098     { "blcmsk",	{ VexGdq, Edq }, 0 },
   3099     { Bad_Opcode },
   3100     { Bad_Opcode },
   3101     { Bad_Opcode },
   3102     { Bad_Opcode },
   3103     { "blci",	{ VexGdq, Edq }, 0 },
   3104   },
   3105   /* REG_XOP_09_12_L_0 */
   3106   {
   3107     { "llwpcb",	{ Rdq }, 0 },
   3108     { "slwpcb",	{ Rdq }, 0 },
   3109   },
   3110   /* REG_XOP_0A_12_L_0 */
   3111   {
   3112     { "lwpins",	{ VexGdq, Ed, Id }, 0 },
   3113     { "lwpval",	{ VexGdq, Ed, Id }, 0 },
   3114   },
   3115 
   3116 #include "i386-dis-evex-reg.h"
   3117 };
   3118 
   3119 static const struct dis386 prefix_table[][4] = {
   3120   /* PREFIX_90 */
   3121   {
   3122     { "xchgS", { { NOP_Fixup, 0 }, { NOP_Fixup, 1 } }, 0 },
   3123     { "pause", { XX }, 0 },
   3124     { "xchgS", { { NOP_Fixup, 0 }, { NOP_Fixup, 1 } }, 0 },
   3125     { NULL, { { NULL, 0 } }, PREFIX_IGNORED }
   3126   },
   3127 
   3128   /* PREFIX_0F00_REG_6_X86_64 */
   3129   {
   3130     { Bad_Opcode },
   3131     { Bad_Opcode },
   3132     { Bad_Opcode },
   3133     { "lkgsD", { Sv }, 0 },
   3134   },
   3135 
   3136   /* PREFIX_0F01_REG_0_MOD_3_RM_6 */
   3137   {
   3138     { "wrmsrns",        { Skip_MODRM }, 0 },
   3139     { X86_64_TABLE (X86_64_0F01_REG_0_MOD_3_RM_6_P_1) },
   3140     { Bad_Opcode },
   3141     { X86_64_TABLE (X86_64_0F01_REG_0_MOD_3_RM_6_P_3) },
   3142   },
   3143 
   3144   /* PREFIX_0F01_REG_0_MOD_3_RM_7 */
   3145   {
   3146     { X86_64_TABLE (X86_64_0F01_REG_0_MOD_3_RM_7_P_0) },
   3147   },
   3148 
   3149   /* PREFIX_0F01_REG_1_RM_2 */
   3150   {
   3151     { "clac",		{ Skip_MODRM }, 0 },
   3152     { X86_64_TABLE (X86_64_0F01_REG_1_RM_2_PREFIX_1) },
   3153     { Bad_Opcode },
   3154     { X86_64_TABLE (X86_64_0F01_REG_1_RM_2_PREFIX_3)},
   3155   },
   3156 
   3157   /* PREFIX_0F01_REG_1_RM_4 */
   3158   {
   3159     { Bad_Opcode },
   3160     { Bad_Opcode },
   3161     { "tdcall", 	{ Skip_MODRM }, 0 },
   3162     { Bad_Opcode },
   3163   },
   3164 
   3165   /* PREFIX_0F01_REG_1_RM_5 */
   3166   {
   3167     { Bad_Opcode },
   3168     { Bad_Opcode },
   3169     { X86_64_TABLE (X86_64_0F01_REG_1_RM_5_PREFIX_2) },
   3170     { Bad_Opcode },
   3171   },
   3172 
   3173   /* PREFIX_0F01_REG_1_RM_6 */
   3174   {
   3175     { Bad_Opcode },
   3176     { Bad_Opcode },
   3177     { X86_64_TABLE (X86_64_0F01_REG_1_RM_6_PREFIX_2) },
   3178     { Bad_Opcode },
   3179   },
   3180 
   3181   /* PREFIX_0F01_REG_1_RM_7 */
   3182   {
   3183     { "encls",		{ Skip_MODRM }, 0 },
   3184     { Bad_Opcode },
   3185     { X86_64_TABLE (X86_64_0F01_REG_1_RM_7_PREFIX_2) },
   3186     { Bad_Opcode },
   3187   },
   3188 
   3189   /* PREFIX_0F01_REG_3_RM_1 */
   3190   {
   3191     { "vmmcall",	{ Skip_MODRM }, 0 },
   3192     { "vmgexit",	{ Skip_MODRM }, 0 },
   3193     { Bad_Opcode },
   3194     { "vmgexit",	{ Skip_MODRM }, 0 },
   3195   },
   3196 
   3197   /* PREFIX_0F01_REG_5_MOD_0 */
   3198   {
   3199     { Bad_Opcode },
   3200     { "rstorssp",	{ Mq }, PREFIX_OPCODE },
   3201   },
   3202 
   3203   /* PREFIX_0F01_REG_5_MOD_3_RM_0 */
   3204   {
   3205     { "serialize",	{ Skip_MODRM }, PREFIX_OPCODE },
   3206     { "setssbsy",	{ Skip_MODRM }, PREFIX_OPCODE },
   3207     { Bad_Opcode },
   3208     { "xsusldtrk",	{ Skip_MODRM }, PREFIX_OPCODE },
   3209   },
   3210 
   3211   /* PREFIX_0F01_REG_5_MOD_3_RM_1 */
   3212   {
   3213     { Bad_Opcode },
   3214     { Bad_Opcode },
   3215     { Bad_Opcode },
   3216     { "xresldtrk",     { Skip_MODRM }, PREFIX_OPCODE },
   3217   },
   3218 
   3219   /* PREFIX_0F01_REG_5_MOD_3_RM_2 */
   3220   {
   3221     { Bad_Opcode },
   3222     { "saveprevssp",	{ Skip_MODRM }, PREFIX_OPCODE },
   3223   },
   3224 
   3225   /* PREFIX_0F01_REG_5_MOD_3_RM_4 */
   3226   {
   3227     { Bad_Opcode },
   3228     { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1) },
   3229   },
   3230 
   3231   /* PREFIX_0F01_REG_5_MOD_3_RM_5 */
   3232   {
   3233     { Bad_Opcode },
   3234     { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1) },
   3235   },
   3236 
   3237   /* PREFIX_0F01_REG_5_MOD_3_RM_6 */
   3238   {
   3239     { "rdpkru", { Skip_MODRM }, 0 },
   3240     { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1) },
   3241   },
   3242 
   3243   /* PREFIX_0F01_REG_5_MOD_3_RM_7 */
   3244   {
   3245     { "wrpkru",	{ Skip_MODRM }, 0 },
   3246     { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1) },
   3247   },
   3248 
   3249   /* PREFIX_0F01_REG_7_MOD_3_RM_2 */
   3250   {
   3251     { "monitorx",	{ { OP_Monitor, 0 } }, 0  },
   3252     { "mcommit",	{ Skip_MODRM }, 0 },
   3253   },
   3254 
   3255   /* PREFIX_0F01_REG_7_MOD_3_RM_5 */
   3256   {
   3257     { "rdpru", { Skip_MODRM }, 0 },
   3258     { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_1) },
   3259     { Bad_Opcode },
   3260     { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_3) },
   3261   },
   3262 
   3263   /* PREFIX_0F01_REG_7_MOD_3_RM_6 */
   3264   {
   3265     { "invlpgb",        { Skip_MODRM }, 0 },
   3266     { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1) },
   3267     { Bad_Opcode },
   3268     { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3) },
   3269   },
   3270 
   3271   /* PREFIX_0F01_REG_7_MOD_3_RM_7 */
   3272   {
   3273     { "tlbsync",        { Skip_MODRM }, 0 },
   3274     { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1) },
   3275     { Bad_Opcode },
   3276     { "pvalidate",      { Skip_MODRM }, 0 },
   3277   },
   3278 
   3279   /* PREFIX_0F09 */
   3280   {
   3281     { "wbinvd",   { XX }, 0 },
   3282     { "wbnoinvd", { XX }, 0 },
   3283   },
   3284 
   3285   /* PREFIX_0F10 */
   3286   {
   3287     { "%XEVmovupX",	{ XM, EXEvexXNoBcst }, 0 },
   3288     { "%XEVmovs%XS",	{ XMScalar, VexScalarR, EXd }, 0 },
   3289     { "%XEVmovupX",	{ XM, EXEvexXNoBcst }, 0 },
   3290     { "%XEVmovs%XD",	{ XMScalar, VexScalarR, EXq }, 0 },
   3291   },
   3292 
   3293   /* PREFIX_0F11 */
   3294   {
   3295     { "%XEVmovupX",	{ EXxS, XM }, 0 },
   3296     { "%XEVmovs%XS",	{ EXdS, VexScalarR, XMScalar }, 0 },
   3297     { "%XEVmovupX",	{ EXxS, XM }, 0 },
   3298     { "%XEVmovs%XD",	{ EXqS, VexScalarR, XMScalar }, 0 },
   3299   },
   3300 
   3301   /* PREFIX_0F12 */
   3302   {
   3303     { MOD_TABLE (MOD_0F12_PREFIX_0) },
   3304     { "movsldup",	{ XM, EXx }, 0 },
   3305     { "%XEVmovlpYX",	{ XM, Vex, Mq }, 0 },
   3306     { "movddup",	{ XM, EXq }, 0 },
   3307   },
   3308 
   3309   /* PREFIX_0F16 */
   3310   {
   3311     { MOD_TABLE (MOD_0F16_PREFIX_0) },
   3312     { "movshdup",	{ XM, EXx }, 0 },
   3313     { "%XEVmovhpYX",	{ XM, Vex, Mq }, 0 },
   3314   },
   3315 
   3316   /* PREFIX_0F18_REG_6_MOD_0_X86_64 */
   3317   {
   3318     { "prefetchit1",	{ { PREFETCHI_Fixup, b_mode } }, 0 },
   3319     { "nopQ",		{ Ev }, 0 },
   3320     { "nopQ",		{ Ev }, 0 },
   3321     { "nopQ",		{ Ev }, 0 },
   3322   },
   3323 
   3324   /* PREFIX_0F18_REG_7_MOD_0_X86_64 */
   3325   {
   3326     { "prefetchit0",	{ { PREFETCHI_Fixup, b_mode } }, 0 },
   3327     { "nopQ",		{ Ev }, 0 },
   3328     { "nopQ",		{ Ev }, 0 },
   3329     { "nopQ",		{ Ev }, 0 },
   3330   },
   3331 
   3332   /* PREFIX_0F1A */
   3333   {
   3334     { MOD_TABLE (MOD_0F1A_PREFIX_0) },
   3335     { "bndcl",  { Gbnd, Ev_bnd }, 0 },
   3336     { "bndmov", { Gbnd, Ebnd }, 0 },
   3337     { "bndcu",  { Gbnd, Ev_bnd }, 0 },
   3338   },
   3339 
   3340   /* PREFIX_0F1B */
   3341   {
   3342     { MOD_TABLE (MOD_0F1B_PREFIX_0) },
   3343     { MOD_TABLE (MOD_0F1B_PREFIX_1) },
   3344     { "bndmov", { EbndS, Gbnd }, 0 },
   3345     { "bndcn",  { Gbnd, Ev_bnd }, 0 },
   3346   },
   3347 
   3348   /* PREFIX_0F1C */
   3349   {
   3350     { MOD_TABLE (MOD_0F1C_PREFIX_0) },
   3351     { "nopQ",	{ Ev }, PREFIX_IGNORED },
   3352     { "nopQ",	{ Ev }, 0 },
   3353     { "nopQ",	{ Ev }, PREFIX_IGNORED },
   3354   },
   3355 
   3356   /* PREFIX_0F1E */
   3357   {
   3358     { "nopQ",	{ Ev }, 0 },
   3359     { MOD_TABLE (MOD_0F1E_PREFIX_1) },
   3360     { "nopQ",	{ Ev }, 0 },
   3361     { NULL,	{ XX }, PREFIX_IGNORED },
   3362   },
   3363 
   3364   /* PREFIX_0F2A */
   3365   {
   3366     { "cvtpi2ps", { XM, EMCq }, PREFIX_OPCODE },
   3367     { "cvtsi2ss{%LQ|}", { XM, Edq }, PREFIX_OPCODE },
   3368     { "cvtpi2pd", { XM, EMCq }, PREFIX_OPCODE },
   3369     { "cvtsi2sd{%LQ|}", { XM, Edq }, 0 },
   3370   },
   3371 
   3372   /* PREFIX_0F2B */
   3373   {
   3374     { "movntps", { Mx, XM }, 0 },
   3375     { "movntss", { Md, XM }, 0 },
   3376     { "movntpd", { Mx, XM }, 0 },
   3377     { "movntsd", { Mq, XM }, 0 },
   3378   },
   3379 
   3380   /* PREFIX_0F2C */
   3381   {
   3382     { "cvttps2pi", { MXC, EXq }, PREFIX_OPCODE },
   3383     { "cvttss2si", { Gdq, EXd }, PREFIX_OPCODE },
   3384     { "cvttpd2pi", { MXC, EXx }, PREFIX_OPCODE },
   3385     { "cvttsd2si", { Gdq, EXq }, PREFIX_OPCODE },
   3386   },
   3387 
   3388   /* PREFIX_0F2D */
   3389   {
   3390     { "cvtps2pi", { MXC, EXq }, PREFIX_OPCODE },
   3391     { "cvtss2si", { Gdq, EXd }, PREFIX_OPCODE },
   3392     { "cvtpd2pi", { MXC, EXx }, PREFIX_OPCODE },
   3393     { "cvtsd2si", { Gdq, EXq }, PREFIX_OPCODE },
   3394   },
   3395 
   3396   /* PREFIX_0F2E */
   3397   {
   3398     { "VucomisYX",	{ XMScalar, EXd, EXxEVexS }, 0 },
   3399     { Bad_Opcode },
   3400     { "VucomisYX",	{ XMScalar, EXq, EXxEVexS }, 0 },
   3401   },
   3402 
   3403   /* PREFIX_0F2F */
   3404   {
   3405     { "VcomisYX",	{ XMScalar, EXd, EXxEVexS }, 0 },
   3406     { Bad_Opcode },
   3407     { "VcomisYX",	{ XMScalar, EXq, EXxEVexS }, 0 },
   3408   },
   3409 
   3410   /* PREFIX_0F51 */
   3411   {
   3412     { "%XEVsqrtpX",	{ XM, EXx, EXxEVexR }, 0 },
   3413     { "%XEVsqrts%XS",	{ XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
   3414     { "%XEVsqrtpX",	{ XM, EXx, EXxEVexR }, 0 },
   3415     { "%XEVsqrts%XD",	{ XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
   3416   },
   3417 
   3418   /* PREFIX_0F52 */
   3419   {
   3420     { "Vrsqrtps",	{ XM, EXx }, 0 },
   3421     { "Vrsqrtss",	{ XMScalar, VexScalar, EXd }, 0 },
   3422   },
   3423 
   3424   /* PREFIX_0F53 */
   3425   {
   3426     { "Vrcpps",		{ XM, EXx }, 0 },
   3427     { "Vrcpss",		{ XMScalar, VexScalar, EXd }, 0 },
   3428   },
   3429 
   3430   /* PREFIX_0F58 */
   3431   {
   3432     { "%XEVaddpX",	{ XM, Vex, EXx, EXxEVexR }, 0 },
   3433     { "%XEVadds%XS",	{ XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
   3434     { "%XEVaddpX",	{ XM, Vex, EXx, EXxEVexR }, 0 },
   3435     { "%XEVadds%XD",	{ XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
   3436   },
   3437 
   3438   /* PREFIX_0F59 */
   3439   {
   3440     { "%XEVmulpX",	{ XM, Vex, EXx, EXxEVexR }, 0 },
   3441     { "%XEVmuls%XS",	{ XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
   3442     { "%XEVmulpX",	{ XM, Vex, EXx, EXxEVexR }, 0 },
   3443     { "%XEVmuls%XD",	{ XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
   3444   },
   3445 
   3446   /* PREFIX_0F5A */
   3447   {
   3448     { "%XEVcvtp%XS2pd", { XM, EXEvexHalfBcstXmmq, EXxEVexS }, 0 },
   3449     { "%XEVcvts%XS2sd", { XMScalar, VexScalar, EXd, EXxEVexS }, 0 },
   3450     { "%XEVcvtp%XD2ps%XY", { XMxmmq, EXx, EXxEVexR }, 0 },
   3451     { "%XEVcvts%XD2ss", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
   3452   },
   3453 
   3454   /* PREFIX_0F5B */
   3455   {
   3456     { "Vcvtdq2ps",	{ XM, EXx }, 0 },
   3457     { "Vcvttps2dq",	{ XM, EXx }, 0 },
   3458     { "Vcvtps2dq",	{ XM, EXx }, 0 },
   3459   },
   3460 
   3461   /* PREFIX_0F5C */
   3462   {
   3463     { "%XEVsubpX",	{ XM, Vex, EXx, EXxEVexR }, 0 },
   3464     { "%XEVsubs%XS",	{ XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
   3465     { "%XEVsubpX",	{ XM, Vex, EXx, EXxEVexR }, 0 },
   3466     { "%XEVsubs%XD",	{ XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
   3467   },
   3468 
   3469   /* PREFIX_0F5D */
   3470   {
   3471     { "%XEVminpX",	{ XM, Vex, EXx, EXxEVexS }, 0 },
   3472     { "%XEVmins%XS",	{ XMScalar, VexScalar, EXd, EXxEVexS }, 0 },
   3473     { "%XEVminpX",	{ XM, Vex, EXx, EXxEVexS }, 0 },
   3474     { "%XEVmins%XD",	{ XMScalar, VexScalar, EXq, EXxEVexS }, 0 },
   3475   },
   3476 
   3477   /* PREFIX_0F5E */
   3478   {
   3479     { "%XEVdivpX",	{ XM, Vex, EXx, EXxEVexR }, 0 },
   3480     { "%XEVdivs%XS",	{ XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
   3481     { "%XEVdivpX",	{ XM, Vex, EXx, EXxEVexR }, 0 },
   3482     { "%XEVdivs%XD",	{ XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
   3483   },
   3484 
   3485   /* PREFIX_0F5F */
   3486   {
   3487     { "%XEVmaxpX",	{ XM, Vex, EXx, EXxEVexS }, 0 },
   3488     { "%XEVmaxs%XS",	{ XMScalar, VexScalar, EXd, EXxEVexS }, 0 },
   3489     { "%XEVmaxpX",	{ XM, Vex, EXx, EXxEVexS }, 0 },
   3490     { "%XEVmaxs%XD",	{ XMScalar, VexScalar, EXq, EXxEVexS }, 0 },
   3491   },
   3492 
   3493   /* PREFIX_0F60 */
   3494   {
   3495     { "punpcklbw",{ MX, EMd }, PREFIX_OPCODE },
   3496     { Bad_Opcode },
   3497     { "punpcklbw",{ MX, EMx }, PREFIX_OPCODE },
   3498   },
   3499 
   3500   /* PREFIX_0F61 */
   3501   {
   3502     { "punpcklwd",{ MX, EMd }, PREFIX_OPCODE },
   3503     { Bad_Opcode },
   3504     { "punpcklwd",{ MX, EMx }, PREFIX_OPCODE },
   3505   },
   3506 
   3507   /* PREFIX_0F62 */
   3508   {
   3509     { "punpckldq",{ MX, EMd }, PREFIX_OPCODE },
   3510     { Bad_Opcode },
   3511     { "punpckldq",{ MX, EMx }, PREFIX_OPCODE },
   3512   },
   3513 
   3514   /* PREFIX_0F6F */
   3515   {
   3516     { "movq",	{ MX, EM }, PREFIX_OPCODE },
   3517     { "movdqu",	{ XM, EXx }, PREFIX_OPCODE },
   3518     { "movdqa",	{ XM, EXx }, PREFIX_OPCODE },
   3519   },
   3520 
   3521   /* PREFIX_0F70 */
   3522   {
   3523     { "pshufw",	{ MX, EM, Ib }, PREFIX_OPCODE },
   3524     { "pshufhw",{ XM, EXx, Ib }, PREFIX_OPCODE },
   3525     { "pshufd",	{ XM, EXx, Ib }, PREFIX_OPCODE },
   3526     { "pshuflw",{ XM, EXx, Ib }, PREFIX_OPCODE },
   3527   },
   3528 
   3529   /* PREFIX_0F78 */
   3530   {
   3531     {"vmread",	{ Em, Gm }, 0 },
   3532     { Bad_Opcode },
   3533     {"extrq",	{ Uxmm, Ib, Ib }, 0 },
   3534     {"insertq",	{ XM, Uxmm, Ib, Ib }, 0 },
   3535   },
   3536 
   3537   /* PREFIX_0F79 */
   3538   {
   3539     {"vmwrite",	{ Gm, Em }, 0 },
   3540     { Bad_Opcode },
   3541     {"extrq",	{ XM, Uxmm }, 0 },
   3542     {"insertq",	{ XM, Uxmm }, 0 },
   3543   },
   3544 
   3545   /* PREFIX_0F7C */
   3546   {
   3547     { Bad_Opcode },
   3548     { Bad_Opcode },
   3549     { "Vhaddpd",	{ XM, Vex, EXx }, 0 },
   3550     { "Vhaddps",	{ XM, Vex, EXx }, 0 },
   3551   },
   3552 
   3553   /* PREFIX_0F7D */
   3554   {
   3555     { Bad_Opcode },
   3556     { Bad_Opcode },
   3557     { "Vhsubpd",	{ XM, Vex, EXx }, 0 },
   3558     { "Vhsubps",	{ XM, Vex, EXx }, 0 },
   3559   },
   3560 
   3561   /* PREFIX_0F7E */
   3562   {
   3563     { "movK",	{ Edq, MX }, PREFIX_OPCODE },
   3564     { "movq",	{ XM, EXq }, PREFIX_OPCODE },
   3565     { "movK",	{ Edq, XM }, PREFIX_OPCODE },
   3566   },
   3567 
   3568   /* PREFIX_0F7F */
   3569   {
   3570     { "movq",	{ EMS, MX }, PREFIX_OPCODE },
   3571     { "movdqu",	{ EXxS, XM }, PREFIX_OPCODE },
   3572     { "movdqa",	{ EXxS, XM }, PREFIX_OPCODE },
   3573   },
   3574 
   3575   /* PREFIX_0FA6_REG_0 */
   3576   {
   3577     { Bad_Opcode },
   3578     { "montmul",	{ { MONTMUL_Fixup, 0 } }, 0},
   3579     { Bad_Opcode },
   3580     { "sm2",	{ Skip_MODRM }, 0 },
   3581   },
   3582 
   3583   /* PREFIX_0FA6_REG_5 */
   3584   {
   3585     { Bad_Opcode },
   3586     { "sm3",	{ Skip_MODRM }, 0 },
   3587   },
   3588 
   3589   /* PREFIX_0FA7_REG_6 */
   3590   {
   3591     { Bad_Opcode },
   3592     { "sm4",	{ Skip_MODRM }, 0 },
   3593   },
   3594 
   3595   /* PREFIX_0FAE_REG_0_MOD_3 */
   3596   {
   3597     { Bad_Opcode },
   3598     { "rdfsbase", { Ev }, 0 },
   3599   },
   3600 
   3601   /* PREFIX_0FAE_REG_1_MOD_3 */
   3602   {
   3603     { Bad_Opcode },
   3604     { "rdgsbase", { Ev }, 0 },
   3605   },
   3606 
   3607   /* PREFIX_0FAE_REG_2_MOD_3 */
   3608   {
   3609     { Bad_Opcode },
   3610     { "wrfsbase", { Ev }, 0 },
   3611   },
   3612 
   3613   /* PREFIX_0FAE_REG_3_MOD_3 */
   3614   {
   3615     { Bad_Opcode },
   3616     { "wrgsbase", { Ev }, 0 },
   3617   },
   3618 
   3619   /* PREFIX_0FAE_REG_4_MOD_0 */
   3620   {
   3621     { "xsave",	{ FXSAVE }, PREFIX_REX2_ILLEGAL },
   3622     { "ptwrite{%LQ|}", { Edq }, 0 },
   3623   },
   3624 
   3625   /* PREFIX_0FAE_REG_4_MOD_3 */
   3626   {
   3627     { Bad_Opcode },
   3628     { "ptwrite{%LQ|}", { Edq }, 0 },
   3629   },
   3630 
   3631   /* PREFIX_0FAE_REG_5_MOD_3 */
   3632   {
   3633     { "lfence",		{ Skip_MODRM }, 0 },
   3634     { "incsspK",	{ Edq }, PREFIX_OPCODE },
   3635   },
   3636 
   3637   /* PREFIX_0FAE_REG_6_MOD_0 */
   3638   {
   3639     { "xsaveopt",	{ FXSAVE }, PREFIX_OPCODE | PREFIX_REX2_ILLEGAL },
   3640     { "clrssbsy",	{ Mq }, PREFIX_OPCODE },
   3641     { "clwb",	{ Mb }, PREFIX_OPCODE },
   3642   },
   3643 
   3644   /* PREFIX_0FAE_REG_6_MOD_3 */
   3645   {
   3646     { RM_TABLE (RM_0FAE_REG_6_MOD_3_P_0) },
   3647     { "umonitor",	{ Eva }, PREFIX_OPCODE },
   3648     { "tpause",	{ Edq }, PREFIX_OPCODE },
   3649     { "umwait",	{ Edq }, PREFIX_OPCODE },
   3650   },
   3651 
   3652   /* PREFIX_0FAE_REG_7_MOD_0 */
   3653   {
   3654     { "clflush",	{ Mb }, 0 },
   3655     { Bad_Opcode },
   3656     { "clflushopt",	{ Mb }, 0 },
   3657   },
   3658 
   3659   /* PREFIX_0FB8 */
   3660   {
   3661     { Bad_Opcode },
   3662     { "popcntS", { Gv, Ev }, 0 },
   3663   },
   3664 
   3665   /* PREFIX_0FBC */
   3666   {
   3667     { "bsfS",	{ Gv, Ev }, 0 },
   3668     { "tzcntS",	{ Gv, Ev }, 0 },
   3669     { "bsfS",	{ Gv, Ev }, 0 },
   3670   },
   3671 
   3672   /* PREFIX_0FBD */
   3673   {
   3674     { "bsrS",	{ Gv, Ev }, 0 },
   3675     { "lzcntS",	{ Gv, Ev }, 0 },
   3676     { "bsrS",	{ Gv, Ev }, 0 },
   3677   },
   3678 
   3679   /* PREFIX_0FC2 */
   3680   {
   3681     { "VcmppX",	{ XM, Vex, EXx, CMP }, 0 },
   3682     { "Vcmpss",	{ XMScalar, VexScalar, EXd, CMP }, 0 },
   3683     { "VcmppX",	{ XM, Vex, EXx, CMP }, 0 },
   3684     { "Vcmpsd",	{ XMScalar, VexScalar, EXq, CMP }, 0 },
   3685   },
   3686 
   3687   /* PREFIX_0FC7_REG_6_MOD_0 */
   3688   {
   3689     { "vmptrld",{ Mq }, 0 },
   3690     { "vmxon",	{ Mq }, 0 },
   3691     { "vmclear",{ Mq }, 0 },
   3692   },
   3693 
   3694   /* PREFIX_0FC7_REG_6_MOD_3 */
   3695   {
   3696     { "rdrand",	{ Ev }, 0 },
   3697     { X86_64_TABLE (X86_64_0FC7_REG_6_MOD_3_PREFIX_1) },
   3698     { "rdrand",	{ Ev }, 0 }
   3699   },
   3700 
   3701   /* PREFIX_0FC7_REG_7_MOD_3 */
   3702   {
   3703     { "rdseed",	{ Ev }, 0 },
   3704     { "rdpid",	{ Em }, 0 },
   3705     { "rdseed",	{ Ev }, 0 },
   3706   },
   3707 
   3708   /* PREFIX_0FD0 */
   3709   {
   3710     { Bad_Opcode },
   3711     { Bad_Opcode },
   3712     { "VaddsubpX",	{ XM, Vex, EXx }, 0 },
   3713     { "VaddsubpX",	{ XM, Vex, EXx }, 0 },
   3714   },
   3715 
   3716   /* PREFIX_0FD6 */
   3717   {
   3718     { Bad_Opcode },
   3719     { "movq2dq",{ XM, Nq }, 0 },
   3720     { "movq",	{ EXqS, XM }, 0 },
   3721     { "movdq2q",{ MX, Ux }, 0 },
   3722   },
   3723 
   3724   /* PREFIX_0FE6 */
   3725   {
   3726     { Bad_Opcode },
   3727     { "Vcvtdq2pd",	{ XM, EXxmmq }, 0 },
   3728     { "Vcvttpd2dq%XY",	{ XMM, EXx }, 0 },
   3729     { "Vcvtpd2dq%XY",	{ XMM, EXx }, 0 },
   3730   },
   3731 
   3732   /* PREFIX_0FE7 */
   3733   {
   3734     { "movntq",		{ Mq, MX }, 0 },
   3735     { Bad_Opcode },
   3736     { "movntdq",	{ Mx, XM }, 0 },
   3737   },
   3738 
   3739   /* PREFIX_0FF0 */
   3740   {
   3741     { Bad_Opcode },
   3742     { Bad_Opcode },
   3743     { Bad_Opcode },
   3744     { "Vlddqu",		{ XM, M }, 0 },
   3745   },
   3746 
   3747   /* PREFIX_0FF7 */
   3748   {
   3749     { "maskmovq", { MX, Nq }, PREFIX_OPCODE },
   3750     { Bad_Opcode },
   3751     { "maskmovdqu", { XM, Ux }, PREFIX_OPCODE },
   3752   },
   3753 
   3754   /* PREFIX_0F38D8 */
   3755   {
   3756     { Bad_Opcode },
   3757     { REG_TABLE (REG_0F38D8_PREFIX_1) },
   3758   },
   3759 
   3760   /* PREFIX_0F38DC */
   3761   {
   3762     { Bad_Opcode },
   3763     { MOD_TABLE (MOD_0F38DC_PREFIX_1) },
   3764     { "aesenc", { XM, EXx }, 0 },
   3765   },
   3766 
   3767   /* PREFIX_0F38DD */
   3768   {
   3769     { Bad_Opcode },
   3770     { "aesdec128kl", { XM, M }, 0 },
   3771     { "aesenclast", { XM, EXx }, 0 },
   3772   },
   3773 
   3774   /* PREFIX_0F38DE */
   3775   {
   3776     { Bad_Opcode },
   3777     { "aesenc256kl", { XM, M }, 0 },
   3778     { "aesdec", { XM, EXx }, 0 },
   3779   },
   3780 
   3781   /* PREFIX_0F38DF */
   3782   {
   3783     { Bad_Opcode },
   3784     { "aesdec256kl", { XM, M }, 0 },
   3785     { "aesdeclast", { XM, EXx }, 0 },
   3786   },
   3787 
   3788   /* PREFIX_0F38F0 */
   3789   {
   3790     { "movbeS",	{ Gv, Mv }, PREFIX_OPCODE },
   3791     { Bad_Opcode },
   3792     { "movbeS",	{ Gv, Mv }, PREFIX_OPCODE },
   3793     { "crc32A",	{ Gdq, Eb }, PREFIX_OPCODE },
   3794   },
   3795 
   3796   /* PREFIX_0F38F1 */
   3797   {
   3798     { "movbeS",	{ Mv, Gv }, PREFIX_OPCODE },
   3799     { Bad_Opcode },
   3800     { "movbeS",	{ Mv, Gv }, PREFIX_OPCODE },
   3801     { "crc32Q",	{ Gdq, Ev }, PREFIX_OPCODE },
   3802   },
   3803 
   3804   /* PREFIX_0F38F6 */
   3805   {
   3806     { "wrssK",	{ M, Gdq }, 0 },
   3807     { "adoxL",	{ VexGdq, Gdq, Edq }, 0 },
   3808     { "adcxL",	{ VexGdq, Gdq, Edq }, 0 },
   3809     { Bad_Opcode },
   3810   },
   3811 
   3812   /* PREFIX_0F38F8_M_0 */
   3813   {
   3814     { Bad_Opcode },
   3815     { "enqcmds", { Gva, M }, 0 },
   3816     { "movdir64b", { Gva, M }, 0 },
   3817     { "enqcmd",	{ Gva, M }, 0 },
   3818   },
   3819 
   3820   /* PREFIX_0F38F8_M_1_X86_64 */
   3821   {
   3822     { Bad_Opcode },
   3823     { "uwrmsr",		{ Gq, Rq }, 0 },
   3824     { Bad_Opcode },
   3825     { "urdmsr",		{ Rq, Gq }, 0 },
   3826   },
   3827 
   3828   /* PREFIX_0F38FA */
   3829   {
   3830     { Bad_Opcode },
   3831     { "encodekey128", { Gd, Rd }, 0 },
   3832   },
   3833 
   3834   /* PREFIX_0F38FB */
   3835   {
   3836     { Bad_Opcode },
   3837     { "encodekey256", { Gd, Rd }, 0 },
   3838   },
   3839 
   3840   /* PREFIX_0F38FC */
   3841   {
   3842     { "aadd",	{ Mdq, Gdq }, 0 },
   3843     { "axor",	{ Mdq, Gdq }, 0 },
   3844     { "aand",	{ Mdq, Gdq }, 0 },
   3845     { "aor",	{ Mdq, Gdq }, 0 },
   3846   },
   3847 
   3848   /* PREFIX_0F3A0F */
   3849   {
   3850     { Bad_Opcode },
   3851     { REG_TABLE (REG_0F3A0F_P_1) },
   3852   },
   3853 
   3854   /* PREFIX_VEX_0F12 */
   3855   {
   3856     { VEX_LEN_TABLE (VEX_LEN_0F12_P_0) },
   3857     { "%XEvmov%XSldup",	{ XM, EXEvexXNoBcst }, 0 },
   3858     { VEX_LEN_TABLE (VEX_LEN_0F12_P_2) },
   3859     { "%XEvmov%XDdup",	{ XM, EXymmq }, 0 },
   3860   },
   3861 
   3862   /* PREFIX_VEX_0F16 */
   3863   {
   3864     { VEX_LEN_TABLE (VEX_LEN_0F16_P_0) },
   3865     { "%XEvmov%XShdup",	{ XM, EXEvexXNoBcst }, 0 },
   3866     { VEX_LEN_TABLE (VEX_LEN_0F16_P_2) },
   3867   },
   3868 
   3869   /* PREFIX_VEX_0F2A */
   3870   {
   3871     { Bad_Opcode },
   3872     { "%XEvcvtsi2ssY{%LQ|}",	{ XMScalar, VexScalar, EXxEVexR, Edq }, 0 },
   3873     { Bad_Opcode },
   3874     { "%XEvcvtsi2sdY{%LQ|}",	{ XMScalar, VexScalar, EXxEVexR64, Edq }, 0 },
   3875   },
   3876 
   3877   /* PREFIX_VEX_0F2C */
   3878   {
   3879     { Bad_Opcode },
   3880     { "%XEvcvttss2si",	{ Gdq, EXd, EXxEVexS }, 0 },
   3881     { Bad_Opcode },
   3882     { "%XEvcvttsd2si",	{ Gdq, EXq, EXxEVexS }, 0 },
   3883   },
   3884 
   3885   /* PREFIX_VEX_0F2D */
   3886   {
   3887     { Bad_Opcode },
   3888     { "%XEvcvtss2si",	{ Gdq, EXd, EXxEVexR }, 0 },
   3889     { Bad_Opcode },
   3890     { "%XEvcvtsd2si",	{ Gdq, EXq, EXxEVexR }, 0 },
   3891   },
   3892 
   3893   /* PREFIX_VEX_0F41_L_1_W_0 */
   3894   {
   3895     { "kandw",          { MaskG, MaskVex, MaskR }, 0 },
   3896     { Bad_Opcode },
   3897     { "kandb",          { MaskG, MaskVex, MaskR }, 0 },
   3898   },
   3899 
   3900   /* PREFIX_VEX_0F41_L_1_W_1 */
   3901   {
   3902     { "kandq",          { MaskG, MaskVex, MaskR }, 0 },
   3903     { Bad_Opcode },
   3904     { "kandd",          { MaskG, MaskVex, MaskR }, 0 },
   3905   },
   3906 
   3907   /* PREFIX_VEX_0F42_L_1_W_0 */
   3908   {
   3909     { "kandnw",         { MaskG, MaskVex, MaskR }, 0 },
   3910     { Bad_Opcode },
   3911     { "kandnb",         { MaskG, MaskVex, MaskR }, 0 },
   3912   },
   3913 
   3914   /* PREFIX_VEX_0F42_L_1_W_1 */
   3915   {
   3916     { "kandnq",         { MaskG, MaskVex, MaskR }, 0 },
   3917     { Bad_Opcode },
   3918     { "kandnd",         { MaskG, MaskVex, MaskR }, 0 },
   3919   },
   3920 
   3921   /* PREFIX_VEX_0F44_L_0_W_0 */
   3922   {
   3923     { "knotw",          { MaskG, MaskR }, 0 },
   3924     { Bad_Opcode },
   3925     { "knotb",          { MaskG, MaskR }, 0 },
   3926   },
   3927 
   3928   /* PREFIX_VEX_0F44_L_0_W_1 */
   3929   {
   3930     { "knotq",          { MaskG, MaskR }, 0 },
   3931     { Bad_Opcode },
   3932     { "knotd",          { MaskG, MaskR }, 0 },
   3933   },
   3934 
   3935   /* PREFIX_VEX_0F45_L_1_W_0 */
   3936   {
   3937     { "korw",       { MaskG, MaskVex, MaskR }, 0 },
   3938     { Bad_Opcode },
   3939     { "korb",       { MaskG, MaskVex, MaskR }, 0 },
   3940   },
   3941 
   3942   /* PREFIX_VEX_0F45_L_1_W_1 */
   3943   {
   3944     { "korq",       { MaskG, MaskVex, MaskR }, 0 },
   3945     { Bad_Opcode },
   3946     { "kord",       { MaskG, MaskVex, MaskR }, 0 },
   3947   },
   3948 
   3949   /* PREFIX_VEX_0F46_L_1_W_0 */
   3950   {
   3951     { "kxnorw",     { MaskG, MaskVex, MaskR }, 0 },
   3952     { Bad_Opcode },
   3953     { "kxnorb",     { MaskG, MaskVex, MaskR }, 0 },
   3954   },
   3955 
   3956   /* PREFIX_VEX_0F46_L_1_W_1 */
   3957   {
   3958     { "kxnorq",     { MaskG, MaskVex, MaskR }, 0 },
   3959     { Bad_Opcode },
   3960     { "kxnord",     { MaskG, MaskVex, MaskR }, 0 },
   3961   },
   3962 
   3963   /* PREFIX_VEX_0F47_L_1_W_0 */
   3964   {
   3965     { "kxorw",      { MaskG, MaskVex, MaskR }, 0 },
   3966     { Bad_Opcode },
   3967     { "kxorb",      { MaskG, MaskVex, MaskR }, 0 },
   3968   },
   3969 
   3970   /* PREFIX_VEX_0F47_L_1_W_1 */
   3971   {
   3972     { "kxorq",      { MaskG, MaskVex, MaskR }, 0 },
   3973     { Bad_Opcode },
   3974     { "kxord",      { MaskG, MaskVex, MaskR }, 0 },
   3975   },
   3976 
   3977   /* PREFIX_VEX_0F4A_L_1_W_0 */
   3978   {
   3979     { "kaddw",          { MaskG, MaskVex, MaskR }, 0 },
   3980     { Bad_Opcode },
   3981     { "kaddb",          { MaskG, MaskVex, MaskR }, 0 },
   3982   },
   3983 
   3984   /* PREFIX_VEX_0F4A_L_1_W_1 */
   3985   {
   3986     { "kaddq",          { MaskG, MaskVex, MaskR }, 0 },
   3987     { Bad_Opcode },
   3988     { "kaddd",          { MaskG, MaskVex, MaskR }, 0 },
   3989   },
   3990 
   3991   /* PREFIX_VEX_0F4B_L_1_W_0 */
   3992   {
   3993     { "kunpckwd",   { MaskG, MaskVex, MaskR }, 0 },
   3994     { Bad_Opcode },
   3995     { "kunpckbw",   { MaskG, MaskVex, MaskR }, 0 },
   3996   },
   3997 
   3998   /* PREFIX_VEX_0F4B_L_1_W_1 */
   3999   {
   4000     { "kunpckdq",   { MaskG, MaskVex, MaskR }, 0 },
   4001   },
   4002 
   4003   /* PREFIX_VEX_0F6F */
   4004   {
   4005     { Bad_Opcode },
   4006     { "vmovdqu",	{ XM, EXx }, 0 },
   4007     { "vmovdqa",	{ XM, EXx }, 0 },
   4008   },
   4009 
   4010   /* PREFIX_VEX_0F70 */
   4011   {
   4012     { Bad_Opcode },
   4013     { "vpshufhw",	{ XM, EXx, Ib }, 0 },
   4014     { "vpshufd",	{ XM, EXx, Ib }, 0 },
   4015     { "vpshuflw",	{ XM, EXx, Ib }, 0 },
   4016   },
   4017 
   4018   /* PREFIX_VEX_0F7E */
   4019   {
   4020     { Bad_Opcode },
   4021     { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1) },
   4022     { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2) },
   4023   },
   4024 
   4025   /* PREFIX_VEX_0F7F */
   4026   {
   4027     { Bad_Opcode },
   4028     { "vmovdqu",	{ EXxS, XM }, 0 },
   4029     { "vmovdqa",	{ EXxS, XM }, 0 },
   4030   },
   4031 
   4032   /* PREFIX_VEX_0F90_L_0_W_0 */
   4033   {
   4034     { "%XEkmovw",		{ MaskG, MaskE }, 0 },
   4035     { Bad_Opcode },
   4036     { "%XEkmovb",		{ MaskG, MaskBDE }, 0 },
   4037   },
   4038 
   4039   /* PREFIX_VEX_0F90_L_0_W_1 */
   4040   {
   4041     { "%XEkmovq",		{ MaskG, MaskE }, 0 },
   4042     { Bad_Opcode },
   4043     { "%XEkmovd",		{ MaskG, MaskBDE }, 0 },
   4044   },
   4045 
   4046   /* PREFIX_VEX_0F91_L_0_W_0 */
   4047   {
   4048     { "%XEkmovw",		{ Mw, MaskG }, 0 },
   4049     { Bad_Opcode },
   4050     { "%XEkmovb",		{ Mb, MaskG }, 0 },
   4051   },
   4052 
   4053   /* PREFIX_VEX_0F91_L_0_W_1 */
   4054   {
   4055     { "%XEkmovq",		{ Mq, MaskG }, 0 },
   4056     { Bad_Opcode },
   4057     { "%XEkmovd",		{ Md, MaskG }, 0 },
   4058   },
   4059 
   4060   /* PREFIX_VEX_0F92_L_0_W_0 */
   4061   {
   4062     { "%XEkmovw",		{ MaskG, Rdq }, 0 },
   4063     { Bad_Opcode },
   4064     { "%XEkmovb",		{ MaskG, Rdq }, 0 },
   4065     { "%XEkmovd",		{ MaskG, Rdq }, 0 },
   4066   },
   4067 
   4068   /* PREFIX_VEX_0F92_L_0_W_1 */
   4069   {
   4070     { Bad_Opcode },
   4071     { Bad_Opcode },
   4072     { Bad_Opcode },
   4073     { "%XEkmovK",		{ MaskG, Rdq }, 0 },
   4074   },
   4075 
   4076   /* PREFIX_VEX_0F93_L_0_W_0 */
   4077   {
   4078     { "%XEkmovw",		{ Gdq, MaskR }, 0 },
   4079     { Bad_Opcode },
   4080     { "%XEkmovb",		{ Gdq, MaskR }, 0 },
   4081     { "%XEkmovd",		{ Gdq, MaskR }, 0 },
   4082   },
   4083 
   4084   /* PREFIX_VEX_0F93_L_0_W_1 */
   4085   {
   4086     { Bad_Opcode },
   4087     { Bad_Opcode },
   4088     { Bad_Opcode },
   4089     { "%XEkmovK",		{ Gdq, MaskR }, 0 },
   4090   },
   4091 
   4092   /* PREFIX_VEX_0F98_L_0_W_0 */
   4093   {
   4094     { "kortestw", { MaskG, MaskR }, 0 },
   4095     { Bad_Opcode },
   4096     { "kortestb", { MaskG, MaskR }, 0 },
   4097   },
   4098 
   4099   /* PREFIX_VEX_0F98_L_0_W_1 */
   4100   {
   4101     { "kortestq", { MaskG, MaskR }, 0 },
   4102     { Bad_Opcode },
   4103     { "kortestd", { MaskG, MaskR }, 0 },
   4104   },
   4105 
   4106   /* PREFIX_VEX_0F99_L_0_W_0 */
   4107   {
   4108     { "ktestw", { MaskG, MaskR }, 0 },
   4109     { Bad_Opcode },
   4110     { "ktestb", { MaskG, MaskR }, 0 },
   4111   },
   4112 
   4113   /* PREFIX_VEX_0F99_L_0_W_1 */
   4114   {
   4115     { "ktestq", { MaskG, MaskR }, 0 },
   4116     { Bad_Opcode },
   4117     { "ktestd", { MaskG, MaskR }, 0 },
   4118   },
   4119 
   4120   /* PREFIX_VEX_0F3848_X86_64_L_0_W_0 */
   4121   {
   4122     { "ttmmultf32ps",	{ TMM, Rtmm, VexTmm }, 0 },
   4123     { Bad_Opcode },
   4124     { "tmmultf32ps",	{ TMM, Rtmm, VexTmm }, 0 },
   4125   },
   4126 
   4127   /* PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_0 */
   4128   {
   4129     { "ldtilecfg", { M }, 0 },
   4130     { Bad_Opcode },
   4131     { "sttilecfg", { M }, 0 },
   4132   },
   4133 
   4134   /* PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_1 */
   4135   {
   4136     { REG_TABLE (REG_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0) },
   4137     { Bad_Opcode },
   4138     { Bad_Opcode },
   4139     { RM_TABLE (RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_3) },
   4140   },
   4141 
   4142   /* PREFIX_VEX_0F384A_X86_64_W_0_L_0 */
   4143   {
   4144     { Bad_Opcode },
   4145     { Bad_Opcode },
   4146     { "tileloaddrst1",	{ TMM, MVexSIBMEM }, 0 },
   4147     { "tileloaddrs",	{ TMM, MVexSIBMEM }, 0 },
   4148   },
   4149 
   4150   /* PREFIX_VEX_0F384B_X86_64_L_0_W_0 */
   4151   {
   4152     { Bad_Opcode },
   4153     { "tilestored",	{ MVexSIBMEM, TMM }, 0 },
   4154     { "tileloaddt1",	{ TMM, MVexSIBMEM }, 0 },
   4155     { "tileloadd",	{ TMM, MVexSIBMEM }, 0 },
   4156   },
   4157 
   4158   /* PREFIX_VEX_0F3850_W_0 */
   4159   {
   4160     { "%XEvpdpbuud",	{ XM, Vex, EXx }, 0 },
   4161     { "%XEvpdpbsud",	{ XM, Vex, EXx }, 0 },
   4162     { "%XVvpdpbusd",	{ XM, Vex, EXx }, 0 },
   4163     { "%XEvpdpbssd",	{ XM, Vex, EXx }, 0 },
   4164   },
   4165 
   4166   /* PREFIX_VEX_0F3851_W_0 */
   4167   {
   4168     { "%XEvpdpbuuds",	{ XM, Vex, EXx }, 0 },
   4169     { "%XEvpdpbsuds",	{ XM, Vex, EXx }, 0 },
   4170     { "%XVvpdpbusds",	{ XM, Vex, EXx }, 0 },
   4171     { "%XEvpdpbssds",	{ XM, Vex, EXx }, 0 },
   4172   },
   4173   /* PREFIX_VEX_0F385C_X86_64_L_0_W_0 */
   4174   {
   4175     { Bad_Opcode },
   4176     { "tdpbf16ps", { TMM, Rtmm, VexTmm }, 0 },
   4177     { Bad_Opcode },
   4178     { "tdpfp16ps", { TMM, Rtmm, VexTmm }, 0 },
   4179   },
   4180 
   4181   /* PREFIX_VEX_0F385E_X86_64_L_0_W_0 */
   4182   {
   4183     { "tdpbuud", {TMM, Rtmm, VexTmm }, 0 },
   4184     { "tdpbsud", {TMM, Rtmm, VexTmm }, 0 },
   4185     { "tdpbusd", {TMM, Rtmm, VexTmm }, 0 },
   4186     { "tdpbssd", {TMM, Rtmm, VexTmm }, 0 },
   4187   },
   4188 
   4189   /* PREFIX_VEX_0F385F_X86_64_L_0_W_0 */
   4190   {
   4191     { Bad_Opcode },
   4192     { "ttransposed",	{ TMM, Rtmm }, 0 },
   4193   },
   4194 
   4195   /* PREFIX_VEX_0F386B_X86_64_L_0_W_0 */
   4196   {
   4197     { "tconjtcmmimfp16ps",	{ TMM, Rtmm, VexTmm }, 0 },
   4198     { "ttcmmrlfp16ps",	{ TMM, Rtmm, VexTmm }, 0 },
   4199     { "tconjtfp16",	{ TMM, Rtmm }, 0 },
   4200     { "ttcmmimfp16ps",	{ TMM, Rtmm, VexTmm }, 0 },
   4201   },
   4202 
   4203   /* PREFIX_VEX_0F386C_X86_64_L_0_W_0 */
   4204   {
   4205     { "tcmmrlfp16ps",	{ TMM, Rtmm, VexTmm }, 0 },
   4206     { "ttdpbf16ps",	{ TMM, Rtmm, VexTmm }, 0 },
   4207     { "tcmmimfp16ps",	{ TMM, Rtmm, VexTmm }, 0 },
   4208     { "ttdpfp16ps",	{ TMM, Rtmm, VexTmm }, 0 },
   4209   },
   4210 
   4211   /* PREFIX_VEX_0F386E_X86_64_L_0_W_0 */
   4212   {
   4213     { "t2rpntlvwz0",	{ TMM, MVexSIBMEM }, 0 },
   4214     { Bad_Opcode },
   4215     { "t2rpntlvwz1",	{ TMM, MVexSIBMEM }, 0 },
   4216   },
   4217 
   4218   /* PREFIX_VEX_0F386F_X86_64_L_0_W_0 */
   4219   {
   4220     { "t2rpntlvwz0t1",	{ TMM, MVexSIBMEM }, 0 },
   4221     { Bad_Opcode },
   4222     { "t2rpntlvwz1t1",	{ TMM, MVexSIBMEM }, 0 },
   4223   },
   4224 
   4225   /* PREFIX_VEX_0F3872 */
   4226   {
   4227     { Bad_Opcode },
   4228     { VEX_W_TABLE (VEX_W_0F3872_P_1) },
   4229   },
   4230 
   4231   /* PREFIX_VEX_0F38B0_W_0 */
   4232   {
   4233     { "vcvtneoph2ps", { XM, Mx }, 0 },
   4234     { "vcvtneebf162ps", { XM, Mx }, 0 },
   4235     { "vcvtneeph2ps", { XM, Mx }, 0 },
   4236     { "vcvtneobf162ps", { XM, Mx }, 0 },
   4237   },
   4238 
   4239   /* PREFIX_VEX_0F38B1_W_0 */
   4240   {
   4241     { Bad_Opcode },
   4242     { "vbcstnebf162ps", { XM, Mw }, 0 },
   4243     { "vbcstnesh2ps", { XM, Mw }, 0 },
   4244   },
   4245 
   4246   /* PREFIX_VEX_0F38D2_W_0 */
   4247   {
   4248     { "%XEvpdpwuud",	{ XM, Vex, EXx }, 0 },
   4249     { "%XEvpdpwsud",	{ XM, Vex, EXx }, 0 },
   4250     { "%XEvpdpwusd",	{ XM, Vex, EXx }, 0 },
   4251   },
   4252 
   4253   /* PREFIX_VEX_0F38D3_W_0 */
   4254   {
   4255     { "%XEvpdpwuuds",	{ XM, Vex, EXx }, 0 },
   4256     { "%XEvpdpwsuds",	{ XM, Vex, EXx }, 0 },
   4257     { "%XEvpdpwusds",	{ XM, Vex, EXx }, 0 },
   4258   },
   4259 
   4260   /* PREFIX_VEX_0F38CB */
   4261   {
   4262     { Bad_Opcode },
   4263     { Bad_Opcode },
   4264     { Bad_Opcode },
   4265     { VEX_W_TABLE (VEX_W_0F38CB_P_3) },
   4266   },
   4267 
   4268   /* PREFIX_VEX_0F38CC */
   4269   {
   4270     { Bad_Opcode },
   4271     { Bad_Opcode },
   4272     { Bad_Opcode },
   4273     { VEX_W_TABLE (VEX_W_0F38CC_P_3) },
   4274   },
   4275 
   4276   /* PREFIX_VEX_0F38CD */
   4277   {
   4278     { Bad_Opcode },
   4279     { Bad_Opcode },
   4280     { Bad_Opcode },
   4281     { VEX_W_TABLE (VEX_W_0F38CD_P_3) },
   4282   },
   4283 
   4284   /* PREFIX_VEX_0F38DA_W_0 */
   4285   {
   4286     { VEX_LEN_TABLE (VEX_LEN_0F38DA_W_0_P_0) },
   4287     { "%XEvsm4key4",	{ XM, Vex, EXx }, 0 },
   4288     { VEX_LEN_TABLE (VEX_LEN_0F38DA_W_0_P_2) },
   4289     { "%XEvsm4rnds4",	{ XM, Vex, EXx }, 0 },
   4290   },
   4291 
   4292   /* PREFIX_VEX_0F38F2_L_0 */
   4293   {
   4294     { "%NFandnS",          { Gdq, VexGdq, Edq }, 0 },
   4295   },
   4296 
   4297   /* PREFIX_VEX_0F38F3_L_0 */
   4298   {
   4299     { REG_TABLE (REG_VEX_0F38F3_L_0_P_0) },
   4300   },
   4301 
   4302   /* PREFIX_VEX_0F38F5_L_0 */
   4303   {
   4304     { "%NFbzhiS",	{ Gdq, Edq, VexGdq }, 0 },
   4305     { "%XEpextS",		{ Gdq, VexGdq, Edq }, 0 },
   4306     { Bad_Opcode },
   4307     { "%XEpdepS",		{ Gdq, VexGdq, Edq }, 0 },
   4308   },
   4309 
   4310   /* PREFIX_VEX_0F38F6_L_0 */
   4311   {
   4312     { Bad_Opcode },
   4313     { Bad_Opcode },
   4314     { Bad_Opcode },
   4315     { "%XEmulxS",		{ Gdq, VexGdq, Edq }, 0 },
   4316   },
   4317 
   4318   /* PREFIX_VEX_0F38F7_L_0 */
   4319   {
   4320     { "%NFbextrS",	{ Gdq, Edq, VexGdq }, 0 },
   4321     { "%XEsarxS",		{ Gdq, Edq, VexGdq }, 0 },
   4322     { "%XEshlxS",		{ Gdq, Edq, VexGdq }, 0 },
   4323     { "%XEshrxS",		{ Gdq, Edq, VexGdq }, 0 },
   4324   },
   4325 
   4326   /* PREFIX_VEX_0F3AF0_L_0 */
   4327   {
   4328     { Bad_Opcode },
   4329     { Bad_Opcode },
   4330     { Bad_Opcode },
   4331     { "%XErorxS",		{ Gdq, Edq, Ib }, 0 },
   4332   },
   4333 
   4334   /* PREFIX_VEX_MAP5_F8_X86_64_L_0_W_0 */
   4335   {
   4336     { "t2rpntlvwz0rs",	{ TMM, MVexSIBMEM }, 0 },
   4337     { Bad_Opcode },
   4338     { "t2rpntlvwz1rs",	{ TMM, MVexSIBMEM }, 0 },
   4339   },
   4340 
   4341   /* PREFIX_VEX_MAP5_F9_X86_64_L_0_W_0 */
   4342   {
   4343     { "t2rpntlvwz0rst1",	{ TMM, MVexSIBMEM }, 0 },
   4344     { Bad_Opcode },
   4345     { "t2rpntlvwz1rst1",	{ TMM, MVexSIBMEM }, 0 },
   4346   },
   4347 
   4348   /* PREFIX_VEX_MAP5_FD_X86_64_L_0_W_0 */
   4349   {
   4350     { "tdpbf8ps",	{ TMM, Rtmm, VexTmm }, 0 },
   4351     { "tdphbf8ps",	{ TMM, Rtmm, VexTmm }, 0 },
   4352     { "tdphf8ps",	{ TMM, Rtmm, VexTmm }, 0 },
   4353     { "tdpbhf8ps",	{ TMM, Rtmm, VexTmm }, 0 },
   4354   },
   4355 
   4356   /* PREFIX_VEX_MAP7_F6_L_0_W_0_R_0_X86_64 */
   4357   {
   4358     { Bad_Opcode },
   4359     { "wrmsrns",	{ Skip_MODRM, Id, Rq }, 0 },
   4360     { Bad_Opcode },
   4361     { "rdmsr",		{ Rq, Id }, 0 },
   4362   },
   4363 
   4364   /* PREFIX_VEX_MAP7_F8_L_0_W_0_R_0_X86_64 */
   4365   {
   4366     { Bad_Opcode },
   4367     { "uwrmsr",	{ Skip_MODRM, Id, Rq }, 0 },
   4368     { Bad_Opcode },
   4369     { "urdmsr",	{ Rq, Id }, 0 },
   4370   },
   4371 
   4372 #include "i386-dis-evex-prefix.h"
   4373 };
   4374 
   4375 static const struct dis386 x86_64_table[][2] = {
   4376   /* X86_64_06 */
   4377   {
   4378     { "pushP", { es }, 0 },
   4379   },
   4380 
   4381   /* X86_64_07 */
   4382   {
   4383     { "popP", { es }, 0 },
   4384   },
   4385 
   4386   /* X86_64_0E */
   4387   {
   4388     { "pushP", { cs }, 0 },
   4389   },
   4390 
   4391   /* X86_64_16 */
   4392   {
   4393     { "pushP", { ss }, 0 },
   4394   },
   4395 
   4396   /* X86_64_17 */
   4397   {
   4398     { "popP", { ss }, 0 },
   4399   },
   4400 
   4401   /* X86_64_1E */
   4402   {
   4403     { "pushP", { ds }, 0 },
   4404   },
   4405 
   4406   /* X86_64_1F */
   4407   {
   4408     { "popP", { ds }, 0 },
   4409   },
   4410 
   4411   /* X86_64_27 */
   4412   {
   4413     { "daa", { XX }, 0 },
   4414   },
   4415 
   4416   /* X86_64_2F */
   4417   {
   4418     { "das", { XX }, 0 },
   4419   },
   4420 
   4421   /* X86_64_37 */
   4422   {
   4423     { "aaa", { XX }, 0 },
   4424   },
   4425 
   4426   /* X86_64_3F */
   4427   {
   4428     { "aas", { XX }, 0 },
   4429   },
   4430 
   4431   /* X86_64_60 */
   4432   {
   4433     { "pushaP", { XX }, 0 },
   4434   },
   4435 
   4436   /* X86_64_61 */
   4437   {
   4438     { "popaP", { XX }, 0 },
   4439   },
   4440 
   4441   /* X86_64_62 */
   4442   {
   4443     { MOD_TABLE (MOD_62_32BIT) },
   4444     { EVEX_TABLE () },
   4445   },
   4446 
   4447   /* X86_64_63 */
   4448   {
   4449     { "arplS", { Sv, Gv }, 0 },
   4450     { "movs", { Gv, { MOVSXD_Fixup, movsxd_mode } }, 0 },
   4451   },
   4452 
   4453   /* X86_64_6D */
   4454   {
   4455     { "ins{R|}", { Yzr, indirDX }, 0 },
   4456     { "ins{G|}", { Yzr, indirDX }, 0 },
   4457   },
   4458 
   4459   /* X86_64_6F */
   4460   {
   4461     { "outs{R|}", { indirDXr, Xz }, 0 },
   4462     { "outs{G|}", { indirDXr, Xz }, 0 },
   4463   },
   4464 
   4465   /* X86_64_82 */
   4466   {
   4467     /* Opcode 0x82 is an alias of opcode 0x80 in 32-bit mode.  */
   4468     { REG_TABLE (REG_80) },
   4469   },
   4470 
   4471   /* X86_64_9A */
   4472   {
   4473     { "{l|}call{P|}", { Ap }, 0 },
   4474   },
   4475 
   4476   /* X86_64_C2 */
   4477   {
   4478     { "retP",		{ Iw, BND }, 0 },
   4479     { "ret@",		{ Iw, BND }, 0 },
   4480   },
   4481 
   4482   /* X86_64_C3 */
   4483   {
   4484     { "retP",		{ BND }, 0 },
   4485     { "ret@",		{ BND }, 0 },
   4486   },
   4487 
   4488   /* X86_64_C4 */
   4489   {
   4490     { MOD_TABLE (MOD_C4_32BIT) },
   4491     { VEX_C4_TABLE () },
   4492   },
   4493 
   4494   /* X86_64_C5 */
   4495   {
   4496     { MOD_TABLE (MOD_C5_32BIT) },
   4497     { VEX_C5_TABLE () },
   4498   },
   4499 
   4500   /* X86_64_CE */
   4501   {
   4502     { "into", { XX }, 0 },
   4503   },
   4504 
   4505   /* X86_64_D4 */
   4506   {
   4507     { "aam", { Ib }, 0 },
   4508   },
   4509 
   4510   /* X86_64_D5 */
   4511   {
   4512     { "aad", { Ib }, 0 },
   4513   },
   4514 
   4515   /* X86_64_D6 */
   4516   {
   4517     { Bad_Opcode },
   4518     { "udb", { XX }, 0 },
   4519   },
   4520 
   4521   /* X86_64_E8 */
   4522   {
   4523     { "callP",		{ Jv, BND }, 0 },
   4524     { "call@",		{ Jv, BND }, PREFIX_REX2_ILLEGAL }
   4525   },
   4526 
   4527   /* X86_64_E9 */
   4528   {
   4529     { "jmpP",		{ Jv, BND }, 0 },
   4530     { "jmp@",		{ Jv, BND }, PREFIX_REX2_ILLEGAL }
   4531   },
   4532 
   4533   /* X86_64_EA */
   4534   {
   4535     { "{l|}jmp{P|}", { Ap }, 0 },
   4536   },
   4537 
   4538   /* X86_64_0F00_REG_6 */
   4539   {
   4540     { Bad_Opcode },
   4541     { PREFIX_TABLE (PREFIX_0F00_REG_6_X86_64) },
   4542   },
   4543 
   4544   /* X86_64_0F01_REG_0 */
   4545   {
   4546     { "sgdt{Q|Q}", { M }, 0 },
   4547     { "sgdt", { M }, 0 },
   4548   },
   4549 
   4550   /* X86_64_0F01_REG_0_MOD_3_RM_6_P_1 */
   4551   {
   4552     { Bad_Opcode },
   4553     { "wrmsrlist",	{ Skip_MODRM }, 0 },
   4554   },
   4555 
   4556   /* X86_64_0F01_REG_0_MOD_3_RM_6_P_3 */
   4557   {
   4558     { Bad_Opcode },
   4559     { "rdmsrlist",	{ Skip_MODRM }, 0 },
   4560   },
   4561 
   4562   /* X86_64_0F01_REG_0_MOD_3_RM_7_P_0 */
   4563   {
   4564     { Bad_Opcode },
   4565     { "pbndkb",		{ Skip_MODRM }, 0 },
   4566   },
   4567 
   4568   /* X86_64_0F01_REG_1 */
   4569   {
   4570     { "sidt{Q|Q}", { M }, 0 },
   4571     { "sidt", { M }, 0 },
   4572   },
   4573 
   4574   /* X86_64_0F01_REG_1_RM_2_PREFIX_1 */
   4575   {
   4576     { Bad_Opcode },
   4577     { "eretu",		{ Skip_MODRM }, 0 },
   4578   },
   4579 
   4580   /* X86_64_0F01_REG_1_RM_2_PREFIX_3 */
   4581   {
   4582     { Bad_Opcode },
   4583     { "erets",		{ Skip_MODRM }, 0 },
   4584   },
   4585 
   4586   /* X86_64_0F01_REG_1_RM_5_PREFIX_2 */
   4587   {
   4588     { Bad_Opcode },
   4589     { "seamret",	{ Skip_MODRM }, 0 },
   4590   },
   4591 
   4592   /* X86_64_0F01_REG_1_RM_6_PREFIX_2 */
   4593   {
   4594     { Bad_Opcode },
   4595     { "seamops",	{ Skip_MODRM }, 0 },
   4596   },
   4597 
   4598   /* X86_64_0F01_REG_1_RM_7_PREFIX_2 */
   4599   {
   4600     { Bad_Opcode },
   4601     { "seamcall",	{ Skip_MODRM }, 0 },
   4602   },
   4603 
   4604   /* X86_64_0F01_REG_2 */
   4605   {
   4606     { "lgdt{Q|Q}", { M }, 0 },
   4607     { "lgdt", { M }, 0 },
   4608   },
   4609 
   4610   /* X86_64_0F01_REG_3 */
   4611   {
   4612     { "lidt{Q|Q}", { M }, 0 },
   4613     { "lidt", { M }, 0 },
   4614   },
   4615 
   4616   /* X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1 */
   4617   {
   4618     { Bad_Opcode },
   4619     { "uiret",	{ Skip_MODRM }, 0 },
   4620   },
   4621 
   4622   /* X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1 */
   4623   {
   4624     { Bad_Opcode },
   4625     { "testui",	{ Skip_MODRM }, 0 },
   4626   },
   4627 
   4628   /* X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1 */
   4629   {
   4630     { Bad_Opcode },
   4631     { "clui",	{ Skip_MODRM }, 0 },
   4632   },
   4633 
   4634   /* X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1 */
   4635   {
   4636     { Bad_Opcode },
   4637     { "stui",	{ Skip_MODRM }, 0 },
   4638   },
   4639 
   4640   /* X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_1 */
   4641   {
   4642     { Bad_Opcode },
   4643     { "rmpquery", { Skip_MODRM }, 0 },
   4644   },
   4645 
   4646   /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3 */
   4647   {
   4648     { Bad_Opcode },
   4649     { "rmpread",	{ DSCX, RMrAX, Skip_MODRM }, 0 },
   4650   },
   4651 
   4652   /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1 */
   4653   {
   4654     { Bad_Opcode },
   4655     { "rmpadjust",	{ Skip_MODRM }, 0 },
   4656   },
   4657 
   4658   /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3 */
   4659   {
   4660     { Bad_Opcode },
   4661     { "rmpupdate",	{ RMrAX, DSCX, Skip_MODRM }, 0 },
   4662   },
   4663 
   4664   /* X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1 */
   4665   {
   4666     { Bad_Opcode },
   4667     { "psmash",	{ Skip_MODRM }, 0 },
   4668   },
   4669 
   4670   /* X86_64_0F18_REG_6_MOD_0 */
   4671   {
   4672     { "nopQ",		{ Ev }, 0 },
   4673     { PREFIX_TABLE (PREFIX_0F18_REG_6_MOD_0_X86_64) },
   4674   },
   4675 
   4676   /* X86_64_0F18_REG_7_MOD_0 */
   4677   {
   4678     { "nopQ",		{ Ev }, 0 },
   4679     { PREFIX_TABLE (PREFIX_0F18_REG_7_MOD_0_X86_64) },
   4680   },
   4681 
   4682   {
   4683     /* X86_64_0F24 */
   4684     { "movZ",		{ Em, Td }, 0 },
   4685   },
   4686 
   4687   {
   4688     /* X86_64_0F26 */
   4689     { "movZ",		{ Td, Em }, 0 },
   4690   },
   4691 
   4692   {
   4693     /* X86_64_0F388A */
   4694     { Bad_Opcode },
   4695     { "movrsB",		{ Gb, Mb }, PREFIX_OPCODE },
   4696   },
   4697 
   4698   {
   4699     /* X86_64_0F388B */
   4700     { Bad_Opcode },
   4701     { "movrsS",		{ Gv, Mv }, PREFIX_OPCODE },
   4702   },
   4703 
   4704   {
   4705     /* X86_64_0F38F8_M_1 */
   4706     { Bad_Opcode },
   4707     { PREFIX_TABLE (PREFIX_0F38F8_M_1_X86_64) },
   4708   },
   4709 
   4710   /* X86_64_0FC7_REG_6_MOD_3_PREFIX_1 */
   4711   {
   4712     { Bad_Opcode },
   4713     { "senduipi",	{ Eq }, 0 },
   4714   },
   4715 
   4716   /* X86_64_VEX_0F3848 */
   4717   {
   4718     { Bad_Opcode },
   4719     { VEX_LEN_TABLE (VEX_LEN_0F3848_X86_64) },
   4720   },
   4721 
   4722   /* X86_64_VEX_0F3849 */
   4723   {
   4724     { Bad_Opcode },
   4725     { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64) },
   4726   },
   4727 
   4728   /* X86_64_VEX_0F384A */
   4729   {
   4730     { Bad_Opcode },
   4731     { VEX_W_TABLE (VEX_W_0F384A_X86_64) },
   4732   },
   4733 
   4734   /* X86_64_VEX_0F384B */
   4735   {
   4736     { Bad_Opcode },
   4737     { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64) },
   4738   },
   4739 
   4740   /* X86_64_VEX_0F385C */
   4741   {
   4742     { Bad_Opcode },
   4743     { VEX_LEN_TABLE (VEX_LEN_0F385C_X86_64) },
   4744   },
   4745 
   4746   /* X86_64_VEX_0F385E */
   4747   {
   4748     { Bad_Opcode },
   4749     { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64) },
   4750   },
   4751 
   4752   /* X86_64_VEX_0F385F */
   4753   {
   4754     { Bad_Opcode },
   4755     { VEX_LEN_TABLE (VEX_LEN_0F385F_X86_64) },
   4756   },
   4757 
   4758   /* X86_64_VEX_0F386B */
   4759   {
   4760     { Bad_Opcode },
   4761     { VEX_LEN_TABLE (VEX_LEN_0F386B_X86_64) },
   4762   },
   4763 
   4764   /* X86_64_VEX_0F386C */
   4765   {
   4766     { Bad_Opcode },
   4767     { VEX_LEN_TABLE (VEX_LEN_0F386C_X86_64) },
   4768   },
   4769 
   4770   /* X86_64_VEX_0F386E */
   4771   {
   4772     { Bad_Opcode },
   4773     { VEX_LEN_TABLE (VEX_LEN_0F386E_X86_64) },
   4774   },
   4775 
   4776   /* X86_64_VEX_0F386F */
   4777   {
   4778     { Bad_Opcode },
   4779     { VEX_LEN_TABLE (VEX_LEN_0F386F_X86_64) },
   4780   },
   4781 
   4782   /* X86_64_VEX_0F38Ex */
   4783   {
   4784     { Bad_Opcode },
   4785     { "%XEcmp%CCxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
   4786   },
   4787 
   4788   /* X86_64_VEX_MAP5_F8 */
   4789   {
   4790     { Bad_Opcode },
   4791     { VEX_LEN_TABLE (VEX_LEN_MAP5_F8_X86_64) },
   4792   },
   4793 
   4794   /* X86_64_VEX_MAP5_F9 */
   4795   {
   4796     { Bad_Opcode },
   4797     { VEX_LEN_TABLE (VEX_LEN_MAP5_F9_X86_64) },
   4798   },
   4799 
   4800   /* X86_64_VEX_MAP5_FD */
   4801   {
   4802     { Bad_Opcode },
   4803     { VEX_LEN_TABLE (VEX_LEN_MAP5_FD_X86_64) },
   4804   },
   4805 
   4806   /* X86_64_VEX_MAP7_F6_L_0_W_0_R_0 */
   4807   {
   4808     { Bad_Opcode },
   4809     { PREFIX_TABLE (PREFIX_VEX_MAP7_F6_L_0_W_0_R_0_X86_64) },
   4810   },
   4811 
   4812   /* X86_64_VEX_MAP7_F8_L_0_W_0_R_0 */
   4813   {
   4814     { Bad_Opcode },
   4815     { PREFIX_TABLE (PREFIX_VEX_MAP7_F8_L_0_W_0_R_0_X86_64) },
   4816   },
   4817 
   4818 #include "i386-dis-evex-x86-64.h"
   4819 };
   4820 
   4821 static const struct dis386 three_byte_table[][256] = {
   4822 
   4823   /* THREE_BYTE_0F38 */
   4824   {
   4825     /* 00 */
   4826     { "pshufb",		{ MX, EM }, PREFIX_OPCODE },
   4827     { "phaddw",		{ MX, EM }, PREFIX_OPCODE },
   4828     { "phaddd",		{ MX, EM }, PREFIX_OPCODE },
   4829     { "phaddsw",	{ MX, EM }, PREFIX_OPCODE },
   4830     { "pmaddubsw",	{ MX, EM }, PREFIX_OPCODE },
   4831     { "phsubw",		{ MX, EM }, PREFIX_OPCODE },
   4832     { "phsubd",		{ MX, EM }, PREFIX_OPCODE },
   4833     { "phsubsw",	{ MX, EM }, PREFIX_OPCODE },
   4834     /* 08 */
   4835     { "psignb",		{ MX, EM }, PREFIX_OPCODE },
   4836     { "psignw",		{ MX, EM }, PREFIX_OPCODE },
   4837     { "psignd",		{ MX, EM }, PREFIX_OPCODE },
   4838     { "pmulhrsw",	{ MX, EM }, PREFIX_OPCODE },
   4839     { Bad_Opcode },
   4840     { Bad_Opcode },
   4841     { Bad_Opcode },
   4842     { Bad_Opcode },
   4843     /* 10 */
   4844     { "pblendvb", { XM, EXx, XMM0 }, PREFIX_DATA },
   4845     { Bad_Opcode },
   4846     { Bad_Opcode },
   4847     { Bad_Opcode },
   4848     { "blendvps", { XM, EXx, XMM0 }, PREFIX_DATA },
   4849     { "blendvpd", { XM, EXx, XMM0 }, PREFIX_DATA },
   4850     { Bad_Opcode },
   4851     { "ptest",  { XM, EXx }, PREFIX_DATA },
   4852     /* 18 */
   4853     { Bad_Opcode },
   4854     { Bad_Opcode },
   4855     { Bad_Opcode },
   4856     { Bad_Opcode },
   4857     { "pabsb",		{ MX, EM }, PREFIX_OPCODE },
   4858     { "pabsw",		{ MX, EM }, PREFIX_OPCODE },
   4859     { "pabsd",		{ MX, EM }, PREFIX_OPCODE },
   4860     { Bad_Opcode },
   4861     /* 20 */
   4862     { "pmovsxbw", { XM, EXq }, PREFIX_DATA },
   4863     { "pmovsxbd", { XM, EXd }, PREFIX_DATA },
   4864     { "pmovsxbq", { XM, EXw }, PREFIX_DATA },
   4865     { "pmovsxwd", { XM, EXq }, PREFIX_DATA },
   4866     { "pmovsxwq", { XM, EXd }, PREFIX_DATA },
   4867     { "pmovsxdq", { XM, EXq }, PREFIX_DATA },
   4868     { Bad_Opcode },
   4869     { Bad_Opcode },
   4870     /* 28 */
   4871     { "pmuldq", { XM, EXx }, PREFIX_DATA },
   4872     { "pcmpeqq", { XM, EXx }, PREFIX_DATA },
   4873     { "movntdqa", { XM, Mx }, PREFIX_DATA },
   4874     { "packusdw", { XM, EXx }, PREFIX_DATA },
   4875     { Bad_Opcode },
   4876     { Bad_Opcode },
   4877     { Bad_Opcode },
   4878     { Bad_Opcode },
   4879     /* 30 */
   4880     { "pmovzxbw", { XM, EXq }, PREFIX_DATA },
   4881     { "pmovzxbd", { XM, EXd }, PREFIX_DATA },
   4882     { "pmovzxbq", { XM, EXw }, PREFIX_DATA },
   4883     { "pmovzxwd", { XM, EXq }, PREFIX_DATA },
   4884     { "pmovzxwq", { XM, EXd }, PREFIX_DATA },
   4885     { "pmovzxdq", { XM, EXq }, PREFIX_DATA },
   4886     { Bad_Opcode },
   4887     { "pcmpgtq", { XM, EXx }, PREFIX_DATA },
   4888     /* 38 */
   4889     { "pminsb",	{ XM, EXx }, PREFIX_DATA },
   4890     { "pminsd",	{ XM, EXx }, PREFIX_DATA },
   4891     { "pminuw",	{ XM, EXx }, PREFIX_DATA },
   4892     { "pminud",	{ XM, EXx }, PREFIX_DATA },
   4893     { "pmaxsb",	{ XM, EXx }, PREFIX_DATA },
   4894     { "pmaxsd",	{ XM, EXx }, PREFIX_DATA },
   4895     { "pmaxuw", { XM, EXx }, PREFIX_DATA },
   4896     { "pmaxud", { XM, EXx }, PREFIX_DATA },
   4897     /* 40 */
   4898     { "pmulld", { XM, EXx }, PREFIX_DATA },
   4899     { "phminposuw", { XM, EXx }, PREFIX_DATA },
   4900     { Bad_Opcode },
   4901     { Bad_Opcode },
   4902     { Bad_Opcode },
   4903     { Bad_Opcode },
   4904     { Bad_Opcode },
   4905     { Bad_Opcode },
   4906     /* 48 */
   4907     { Bad_Opcode },
   4908     { Bad_Opcode },
   4909     { Bad_Opcode },
   4910     { Bad_Opcode },
   4911     { Bad_Opcode },
   4912     { Bad_Opcode },
   4913     { Bad_Opcode },
   4914     { Bad_Opcode },
   4915     /* 50 */
   4916     { Bad_Opcode },
   4917     { Bad_Opcode },
   4918     { Bad_Opcode },
   4919     { Bad_Opcode },
   4920     { Bad_Opcode },
   4921     { Bad_Opcode },
   4922     { Bad_Opcode },
   4923     { Bad_Opcode },
   4924     /* 58 */
   4925     { Bad_Opcode },
   4926     { Bad_Opcode },
   4927     { Bad_Opcode },
   4928     { Bad_Opcode },
   4929     { Bad_Opcode },
   4930     { Bad_Opcode },
   4931     { Bad_Opcode },
   4932     { Bad_Opcode },
   4933     /* 60 */
   4934     { Bad_Opcode },
   4935     { Bad_Opcode },
   4936     { Bad_Opcode },
   4937     { Bad_Opcode },
   4938     { Bad_Opcode },
   4939     { Bad_Opcode },
   4940     { Bad_Opcode },
   4941     { Bad_Opcode },
   4942     /* 68 */
   4943     { Bad_Opcode },
   4944     { Bad_Opcode },
   4945     { Bad_Opcode },
   4946     { Bad_Opcode },
   4947     { Bad_Opcode },
   4948     { Bad_Opcode },
   4949     { Bad_Opcode },
   4950     { Bad_Opcode },
   4951     /* 70 */
   4952     { Bad_Opcode },
   4953     { Bad_Opcode },
   4954     { Bad_Opcode },
   4955     { Bad_Opcode },
   4956     { Bad_Opcode },
   4957     { Bad_Opcode },
   4958     { Bad_Opcode },
   4959     { Bad_Opcode },
   4960     /* 78 */
   4961     { Bad_Opcode },
   4962     { Bad_Opcode },
   4963     { Bad_Opcode },
   4964     { Bad_Opcode },
   4965     { Bad_Opcode },
   4966     { Bad_Opcode },
   4967     { Bad_Opcode },
   4968     { Bad_Opcode },
   4969     /* 80 */
   4970     { "invept",	{ Gm, Mo }, PREFIX_DATA },
   4971     { "invvpid", { Gm, Mo }, PREFIX_DATA },
   4972     { "invpcid", { Gm, M }, PREFIX_DATA },
   4973     { Bad_Opcode },
   4974     { Bad_Opcode },
   4975     { Bad_Opcode },
   4976     { Bad_Opcode },
   4977     { Bad_Opcode },
   4978     /* 88 */
   4979     { Bad_Opcode },
   4980     { Bad_Opcode },
   4981     { X86_64_TABLE (X86_64_0F388A) },
   4982     { X86_64_TABLE (X86_64_0F388B) },
   4983     { Bad_Opcode },
   4984     { Bad_Opcode },
   4985     { Bad_Opcode },
   4986     { Bad_Opcode },
   4987     /* 90 */
   4988     { Bad_Opcode },
   4989     { Bad_Opcode },
   4990     { Bad_Opcode },
   4991     { Bad_Opcode },
   4992     { Bad_Opcode },
   4993     { Bad_Opcode },
   4994     { Bad_Opcode },
   4995     { Bad_Opcode },
   4996     /* 98 */
   4997     { Bad_Opcode },
   4998     { Bad_Opcode },
   4999     { Bad_Opcode },
   5000     { Bad_Opcode },
   5001     { Bad_Opcode },
   5002     { Bad_Opcode },
   5003     { Bad_Opcode },
   5004     { Bad_Opcode },
   5005     /* a0 */
   5006     { Bad_Opcode },
   5007     { Bad_Opcode },
   5008     { Bad_Opcode },
   5009     { Bad_Opcode },
   5010     { Bad_Opcode },
   5011     { Bad_Opcode },
   5012     { Bad_Opcode },
   5013     { Bad_Opcode },
   5014     /* a8 */
   5015     { Bad_Opcode },
   5016     { Bad_Opcode },
   5017     { Bad_Opcode },
   5018     { Bad_Opcode },
   5019     { Bad_Opcode },
   5020     { Bad_Opcode },
   5021     { Bad_Opcode },
   5022     { Bad_Opcode },
   5023     /* b0 */
   5024     { Bad_Opcode },
   5025     { Bad_Opcode },
   5026     { Bad_Opcode },
   5027     { Bad_Opcode },
   5028     { Bad_Opcode },
   5029     { Bad_Opcode },
   5030     { Bad_Opcode },
   5031     { Bad_Opcode },
   5032     /* b8 */
   5033     { Bad_Opcode },
   5034     { Bad_Opcode },
   5035     { Bad_Opcode },
   5036     { Bad_Opcode },
   5037     { Bad_Opcode },
   5038     { Bad_Opcode },
   5039     { Bad_Opcode },
   5040     { Bad_Opcode },
   5041     /* c0 */
   5042     { Bad_Opcode },
   5043     { Bad_Opcode },
   5044     { Bad_Opcode },
   5045     { Bad_Opcode },
   5046     { Bad_Opcode },
   5047     { Bad_Opcode },
   5048     { Bad_Opcode },
   5049     { Bad_Opcode },
   5050     /* c8 */
   5051     { "sha1nexte", { XM, EXxmm }, PREFIX_OPCODE },
   5052     { "sha1msg1", { XM, EXxmm }, PREFIX_OPCODE },
   5053     { "sha1msg2", { XM, EXxmm }, PREFIX_OPCODE },
   5054     { "sha256rnds2", { XM, EXxmm, XMM0 }, PREFIX_OPCODE },
   5055     { "sha256msg1", { XM, EXxmm }, PREFIX_OPCODE },
   5056     { "sha256msg2", { XM, EXxmm }, PREFIX_OPCODE },
   5057     { Bad_Opcode },
   5058     { "gf2p8mulb", { XM, EXxmm }, PREFIX_DATA },
   5059     /* d0 */
   5060     { Bad_Opcode },
   5061     { Bad_Opcode },
   5062     { Bad_Opcode },
   5063     { Bad_Opcode },
   5064     { Bad_Opcode },
   5065     { Bad_Opcode },
   5066     { Bad_Opcode },
   5067     { Bad_Opcode },
   5068     /* d8 */
   5069     { PREFIX_TABLE (PREFIX_0F38D8) },
   5070     { Bad_Opcode },
   5071     { Bad_Opcode },
   5072     { "aesimc", { XM, EXx }, PREFIX_DATA },
   5073     { PREFIX_TABLE (PREFIX_0F38DC) },
   5074     { PREFIX_TABLE (PREFIX_0F38DD) },
   5075     { PREFIX_TABLE (PREFIX_0F38DE) },
   5076     { PREFIX_TABLE (PREFIX_0F38DF) },
   5077     /* e0 */
   5078     { Bad_Opcode },
   5079     { Bad_Opcode },
   5080     { Bad_Opcode },
   5081     { Bad_Opcode },
   5082     { Bad_Opcode },
   5083     { Bad_Opcode },
   5084     { Bad_Opcode },
   5085     { Bad_Opcode },
   5086     /* e8 */
   5087     { Bad_Opcode },
   5088     { Bad_Opcode },
   5089     { Bad_Opcode },
   5090     { Bad_Opcode },
   5091     { Bad_Opcode },
   5092     { Bad_Opcode },
   5093     { Bad_Opcode },
   5094     { Bad_Opcode },
   5095     /* f0 */
   5096     { PREFIX_TABLE (PREFIX_0F38F0) },
   5097     { PREFIX_TABLE (PREFIX_0F38F1) },
   5098     { Bad_Opcode },
   5099     { Bad_Opcode },
   5100     { Bad_Opcode },
   5101     { "wrussK",		{ M, Gdq }, PREFIX_DATA },
   5102     { PREFIX_TABLE (PREFIX_0F38F6) },
   5103     { Bad_Opcode },
   5104     /* f8 */
   5105     { MOD_TABLE (MOD_0F38F8) },
   5106     { "movdiri",	{ Mdq, Gdq }, PREFIX_OPCODE },
   5107     { PREFIX_TABLE (PREFIX_0F38FA) },
   5108     { PREFIX_TABLE (PREFIX_0F38FB) },
   5109     { PREFIX_TABLE (PREFIX_0F38FC) },
   5110     { Bad_Opcode },
   5111     { Bad_Opcode },
   5112     { Bad_Opcode },
   5113   },
   5114   /* THREE_BYTE_0F3A */
   5115   {
   5116     /* 00 */
   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     /* 08 */
   5126     { "roundps", { XM, EXx, Ib }, PREFIX_DATA },
   5127     { "roundpd", { XM, EXx, Ib }, PREFIX_DATA },
   5128     { "roundss", { XM, EXd, Ib }, PREFIX_DATA },
   5129     { "roundsd", { XM, EXq, Ib }, PREFIX_DATA },
   5130     { "blendps", { XM, EXx, Ib }, PREFIX_DATA },
   5131     { "blendpd", { XM, EXx, Ib }, PREFIX_DATA },
   5132     { "pblendw", { XM, EXx, Ib }, PREFIX_DATA },
   5133     { "palignr",	{ MX, EM, Ib }, PREFIX_OPCODE },
   5134     /* 10 */
   5135     { Bad_Opcode },
   5136     { Bad_Opcode },
   5137     { Bad_Opcode },
   5138     { Bad_Opcode },
   5139     { "pextrb",	{ Edb, XM, Ib }, PREFIX_DATA },
   5140     { "pextrw",	{ Edw, XM, Ib }, PREFIX_DATA },
   5141     { "pextrK",	{ Edq, XM, Ib }, PREFIX_DATA },
   5142     { "extractps", { Ed, XM, Ib }, PREFIX_DATA },
   5143     /* 18 */
   5144     { Bad_Opcode },
   5145     { Bad_Opcode },
   5146     { Bad_Opcode },
   5147     { Bad_Opcode },
   5148     { Bad_Opcode },
   5149     { Bad_Opcode },
   5150     { Bad_Opcode },
   5151     { Bad_Opcode },
   5152     /* 20 */
   5153     { "pinsrb",	{ XM, Edb, Ib }, PREFIX_DATA },
   5154     { "insertps", { XM, EXd, Ib }, PREFIX_DATA },
   5155     { "pinsrK",	{ XM, Edq, Ib }, PREFIX_DATA },
   5156     { Bad_Opcode },
   5157     { Bad_Opcode },
   5158     { Bad_Opcode },
   5159     { Bad_Opcode },
   5160     { Bad_Opcode },
   5161     /* 28 */
   5162     { Bad_Opcode },
   5163     { Bad_Opcode },
   5164     { Bad_Opcode },
   5165     { Bad_Opcode },
   5166     { Bad_Opcode },
   5167     { Bad_Opcode },
   5168     { Bad_Opcode },
   5169     { Bad_Opcode },
   5170     /* 30 */
   5171     { Bad_Opcode },
   5172     { Bad_Opcode },
   5173     { Bad_Opcode },
   5174     { Bad_Opcode },
   5175     { Bad_Opcode },
   5176     { Bad_Opcode },
   5177     { Bad_Opcode },
   5178     { Bad_Opcode },
   5179     /* 38 */
   5180     { Bad_Opcode },
   5181     { Bad_Opcode },
   5182     { Bad_Opcode },
   5183     { Bad_Opcode },
   5184     { Bad_Opcode },
   5185     { Bad_Opcode },
   5186     { Bad_Opcode },
   5187     { Bad_Opcode },
   5188     /* 40 */
   5189     { "dpps",	{ XM, EXx, Ib }, PREFIX_DATA },
   5190     { "dppd",	{ XM, EXx, Ib }, PREFIX_DATA },
   5191     { "mpsadbw", { XM, EXx, Ib }, PREFIX_DATA },
   5192     { Bad_Opcode },
   5193     { "pclmulqdq", { XM, EXx, PCLMUL }, PREFIX_DATA },
   5194     { Bad_Opcode },
   5195     { Bad_Opcode },
   5196     { Bad_Opcode },
   5197     /* 48 */
   5198     { Bad_Opcode },
   5199     { Bad_Opcode },
   5200     { Bad_Opcode },
   5201     { Bad_Opcode },
   5202     { Bad_Opcode },
   5203     { Bad_Opcode },
   5204     { Bad_Opcode },
   5205     { Bad_Opcode },
   5206     /* 50 */
   5207     { Bad_Opcode },
   5208     { Bad_Opcode },
   5209     { Bad_Opcode },
   5210     { Bad_Opcode },
   5211     { Bad_Opcode },
   5212     { Bad_Opcode },
   5213     { Bad_Opcode },
   5214     { Bad_Opcode },
   5215     /* 58 */
   5216     { Bad_Opcode },
   5217     { Bad_Opcode },
   5218     { Bad_Opcode },
   5219     { Bad_Opcode },
   5220     { Bad_Opcode },
   5221     { Bad_Opcode },
   5222     { Bad_Opcode },
   5223     { Bad_Opcode },
   5224     /* 60 */
   5225     { "pcmpestrm!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
   5226     { "pcmpestri!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
   5227     { "pcmpistrm", { XM, EXx, Ib }, PREFIX_DATA },
   5228     { "pcmpistri", { XM, EXx, Ib }, PREFIX_DATA },
   5229     { Bad_Opcode },
   5230     { Bad_Opcode },
   5231     { Bad_Opcode },
   5232     { Bad_Opcode },
   5233     /* 68 */
   5234     { Bad_Opcode },
   5235     { Bad_Opcode },
   5236     { Bad_Opcode },
   5237     { Bad_Opcode },
   5238     { Bad_Opcode },
   5239     { Bad_Opcode },
   5240     { Bad_Opcode },
   5241     { Bad_Opcode },
   5242     /* 70 */
   5243     { Bad_Opcode },
   5244     { Bad_Opcode },
   5245     { Bad_Opcode },
   5246     { Bad_Opcode },
   5247     { Bad_Opcode },
   5248     { Bad_Opcode },
   5249     { Bad_Opcode },
   5250     { Bad_Opcode },
   5251     /* 78 */
   5252     { Bad_Opcode },
   5253     { Bad_Opcode },
   5254     { Bad_Opcode },
   5255     { Bad_Opcode },
   5256     { Bad_Opcode },
   5257     { Bad_Opcode },
   5258     { Bad_Opcode },
   5259     { Bad_Opcode },
   5260     /* 80 */
   5261     { Bad_Opcode },
   5262     { Bad_Opcode },
   5263     { Bad_Opcode },
   5264     { Bad_Opcode },
   5265     { Bad_Opcode },
   5266     { Bad_Opcode },
   5267     { Bad_Opcode },
   5268     { Bad_Opcode },
   5269     /* 88 */
   5270     { Bad_Opcode },
   5271     { Bad_Opcode },
   5272     { Bad_Opcode },
   5273     { Bad_Opcode },
   5274     { Bad_Opcode },
   5275     { Bad_Opcode },
   5276     { Bad_Opcode },
   5277     { Bad_Opcode },
   5278     /* 90 */
   5279     { Bad_Opcode },
   5280     { Bad_Opcode },
   5281     { Bad_Opcode },
   5282     { Bad_Opcode },
   5283     { Bad_Opcode },
   5284     { Bad_Opcode },
   5285     { Bad_Opcode },
   5286     { Bad_Opcode },
   5287     /* 98 */
   5288     { Bad_Opcode },
   5289     { Bad_Opcode },
   5290     { Bad_Opcode },
   5291     { Bad_Opcode },
   5292     { Bad_Opcode },
   5293     { Bad_Opcode },
   5294     { Bad_Opcode },
   5295     { Bad_Opcode },
   5296     /* a0 */
   5297     { Bad_Opcode },
   5298     { Bad_Opcode },
   5299     { Bad_Opcode },
   5300     { Bad_Opcode },
   5301     { Bad_Opcode },
   5302     { Bad_Opcode },
   5303     { Bad_Opcode },
   5304     { Bad_Opcode },
   5305     /* a8 */
   5306     { Bad_Opcode },
   5307     { Bad_Opcode },
   5308     { Bad_Opcode },
   5309     { Bad_Opcode },
   5310     { Bad_Opcode },
   5311     { Bad_Opcode },
   5312     { Bad_Opcode },
   5313     { Bad_Opcode },
   5314     /* b0 */
   5315     { Bad_Opcode },
   5316     { Bad_Opcode },
   5317     { Bad_Opcode },
   5318     { Bad_Opcode },
   5319     { Bad_Opcode },
   5320     { Bad_Opcode },
   5321     { Bad_Opcode },
   5322     { Bad_Opcode },
   5323     /* b8 */
   5324     { Bad_Opcode },
   5325     { Bad_Opcode },
   5326     { Bad_Opcode },
   5327     { Bad_Opcode },
   5328     { Bad_Opcode },
   5329     { Bad_Opcode },
   5330     { Bad_Opcode },
   5331     { Bad_Opcode },
   5332     /* c0 */
   5333     { Bad_Opcode },
   5334     { Bad_Opcode },
   5335     { Bad_Opcode },
   5336     { Bad_Opcode },
   5337     { Bad_Opcode },
   5338     { Bad_Opcode },
   5339     { Bad_Opcode },
   5340     { Bad_Opcode },
   5341     /* c8 */
   5342     { Bad_Opcode },
   5343     { Bad_Opcode },
   5344     { Bad_Opcode },
   5345     { Bad_Opcode },
   5346     { "sha1rnds4", { XM, EXxmm, Ib }, PREFIX_OPCODE },
   5347     { Bad_Opcode },
   5348     { "gf2p8affineqb", { XM, EXxmm, Ib }, PREFIX_DATA },
   5349     { "gf2p8affineinvqb", { XM, EXxmm, Ib }, PREFIX_DATA },
   5350     /* d0 */
   5351     { Bad_Opcode },
   5352     { Bad_Opcode },
   5353     { Bad_Opcode },
   5354     { Bad_Opcode },
   5355     { Bad_Opcode },
   5356     { Bad_Opcode },
   5357     { Bad_Opcode },
   5358     { Bad_Opcode },
   5359     /* d8 */
   5360     { Bad_Opcode },
   5361     { Bad_Opcode },
   5362     { Bad_Opcode },
   5363     { Bad_Opcode },
   5364     { Bad_Opcode },
   5365     { Bad_Opcode },
   5366     { Bad_Opcode },
   5367     { "aeskeygenassist", { XM, EXx, Ib }, PREFIX_DATA },
   5368     /* e0 */
   5369     { Bad_Opcode },
   5370     { Bad_Opcode },
   5371     { Bad_Opcode },
   5372     { Bad_Opcode },
   5373     { Bad_Opcode },
   5374     { Bad_Opcode },
   5375     { Bad_Opcode },
   5376     { Bad_Opcode },
   5377     /* e8 */
   5378     { Bad_Opcode },
   5379     { Bad_Opcode },
   5380     { Bad_Opcode },
   5381     { Bad_Opcode },
   5382     { Bad_Opcode },
   5383     { Bad_Opcode },
   5384     { Bad_Opcode },
   5385     { Bad_Opcode },
   5386     /* f0 */
   5387     { PREFIX_TABLE (PREFIX_0F3A0F) },
   5388     { Bad_Opcode },
   5389     { Bad_Opcode },
   5390     { Bad_Opcode },
   5391     { Bad_Opcode },
   5392     { Bad_Opcode },
   5393     { Bad_Opcode },
   5394     { Bad_Opcode },
   5395     /* f8 */
   5396     { Bad_Opcode },
   5397     { Bad_Opcode },
   5398     { Bad_Opcode },
   5399     { Bad_Opcode },
   5400     { Bad_Opcode },
   5401     { Bad_Opcode },
   5402     { Bad_Opcode },
   5403     { Bad_Opcode },
   5404   },
   5405 };
   5406 
   5407 static const struct dis386 xop_table[][256] = {
   5408   /* XOP_08 */
   5409   {
   5410     /* 00 */
   5411     { Bad_Opcode },
   5412     { Bad_Opcode },
   5413     { Bad_Opcode },
   5414     { Bad_Opcode },
   5415     { Bad_Opcode },
   5416     { Bad_Opcode },
   5417     { Bad_Opcode },
   5418     { Bad_Opcode },
   5419     /* 08 */
   5420     { Bad_Opcode },
   5421     { Bad_Opcode },
   5422     { Bad_Opcode },
   5423     { Bad_Opcode },
   5424     { Bad_Opcode },
   5425     { Bad_Opcode },
   5426     { Bad_Opcode },
   5427     { Bad_Opcode },
   5428     /* 10 */
   5429     { Bad_Opcode },
   5430     { Bad_Opcode },
   5431     { Bad_Opcode },
   5432     { Bad_Opcode },
   5433     { Bad_Opcode },
   5434     { Bad_Opcode },
   5435     { Bad_Opcode },
   5436     { Bad_Opcode },
   5437     /* 18 */
   5438     { Bad_Opcode },
   5439     { Bad_Opcode },
   5440     { Bad_Opcode },
   5441     { Bad_Opcode },
   5442     { Bad_Opcode },
   5443     { Bad_Opcode },
   5444     { Bad_Opcode },
   5445     { Bad_Opcode },
   5446     /* 20 */
   5447     { Bad_Opcode },
   5448     { Bad_Opcode },
   5449     { Bad_Opcode },
   5450     { Bad_Opcode },
   5451     { Bad_Opcode },
   5452     { Bad_Opcode },
   5453     { Bad_Opcode },
   5454     { Bad_Opcode },
   5455     /* 28 */
   5456     { Bad_Opcode },
   5457     { Bad_Opcode },
   5458     { Bad_Opcode },
   5459     { Bad_Opcode },
   5460     { Bad_Opcode },
   5461     { Bad_Opcode },
   5462     { Bad_Opcode },
   5463     { Bad_Opcode },
   5464     /* 30 */
   5465     { Bad_Opcode },
   5466     { Bad_Opcode },
   5467     { Bad_Opcode },
   5468     { Bad_Opcode },
   5469     { Bad_Opcode },
   5470     { Bad_Opcode },
   5471     { Bad_Opcode },
   5472     { Bad_Opcode },
   5473     /* 38 */
   5474     { Bad_Opcode },
   5475     { Bad_Opcode },
   5476     { Bad_Opcode },
   5477     { Bad_Opcode },
   5478     { Bad_Opcode },
   5479     { Bad_Opcode },
   5480     { Bad_Opcode },
   5481     { Bad_Opcode },
   5482     /* 40 */
   5483     { Bad_Opcode },
   5484     { Bad_Opcode },
   5485     { Bad_Opcode },
   5486     { Bad_Opcode },
   5487     { Bad_Opcode },
   5488     { Bad_Opcode },
   5489     { Bad_Opcode },
   5490     { Bad_Opcode },
   5491     /* 48 */
   5492     { Bad_Opcode },
   5493     { Bad_Opcode },
   5494     { Bad_Opcode },
   5495     { Bad_Opcode },
   5496     { Bad_Opcode },
   5497     { Bad_Opcode },
   5498     { Bad_Opcode },
   5499     { Bad_Opcode },
   5500     /* 50 */
   5501     { Bad_Opcode },
   5502     { Bad_Opcode },
   5503     { Bad_Opcode },
   5504     { Bad_Opcode },
   5505     { Bad_Opcode },
   5506     { Bad_Opcode },
   5507     { Bad_Opcode },
   5508     { Bad_Opcode },
   5509     /* 58 */
   5510     { Bad_Opcode },
   5511     { Bad_Opcode },
   5512     { Bad_Opcode },
   5513     { Bad_Opcode },
   5514     { Bad_Opcode },
   5515     { Bad_Opcode },
   5516     { Bad_Opcode },
   5517     { Bad_Opcode },
   5518     /* 60 */
   5519     { Bad_Opcode },
   5520     { Bad_Opcode },
   5521     { Bad_Opcode },
   5522     { Bad_Opcode },
   5523     { Bad_Opcode },
   5524     { Bad_Opcode },
   5525     { Bad_Opcode },
   5526     { Bad_Opcode },
   5527     /* 68 */
   5528     { Bad_Opcode },
   5529     { Bad_Opcode },
   5530     { Bad_Opcode },
   5531     { Bad_Opcode },
   5532     { Bad_Opcode },
   5533     { Bad_Opcode },
   5534     { Bad_Opcode },
   5535     { Bad_Opcode },
   5536     /* 70 */
   5537     { Bad_Opcode },
   5538     { Bad_Opcode },
   5539     { Bad_Opcode },
   5540     { Bad_Opcode },
   5541     { Bad_Opcode },
   5542     { Bad_Opcode },
   5543     { Bad_Opcode },
   5544     { Bad_Opcode },
   5545     /* 78 */
   5546     { Bad_Opcode },
   5547     { Bad_Opcode },
   5548     { Bad_Opcode },
   5549     { Bad_Opcode },
   5550     { Bad_Opcode },
   5551     { Bad_Opcode },
   5552     { Bad_Opcode },
   5553     { Bad_Opcode },
   5554     /* 80 */
   5555     { Bad_Opcode },
   5556     { Bad_Opcode },
   5557     { Bad_Opcode },
   5558     { Bad_Opcode },
   5559     { Bad_Opcode },
   5560     { VEX_LEN_TABLE (VEX_LEN_XOP_08_85) },
   5561     { VEX_LEN_TABLE (VEX_LEN_XOP_08_86) },
   5562     { VEX_LEN_TABLE (VEX_LEN_XOP_08_87) },
   5563     /* 88 */
   5564     { Bad_Opcode },
   5565     { Bad_Opcode },
   5566     { Bad_Opcode },
   5567     { Bad_Opcode },
   5568     { Bad_Opcode },
   5569     { Bad_Opcode },
   5570     { VEX_LEN_TABLE (VEX_LEN_XOP_08_8E) },
   5571     { VEX_LEN_TABLE (VEX_LEN_XOP_08_8F) },
   5572     /* 90 */
   5573     { Bad_Opcode },
   5574     { Bad_Opcode },
   5575     { Bad_Opcode },
   5576     { Bad_Opcode },
   5577     { Bad_Opcode },
   5578     { VEX_LEN_TABLE (VEX_LEN_XOP_08_95) },
   5579     { VEX_LEN_TABLE (VEX_LEN_XOP_08_96) },
   5580     { VEX_LEN_TABLE (VEX_LEN_XOP_08_97) },
   5581     /* 98 */
   5582     { Bad_Opcode },
   5583     { Bad_Opcode },
   5584     { Bad_Opcode },
   5585     { Bad_Opcode },
   5586     { Bad_Opcode },
   5587     { Bad_Opcode },
   5588     { VEX_LEN_TABLE (VEX_LEN_XOP_08_9E) },
   5589     { VEX_LEN_TABLE (VEX_LEN_XOP_08_9F) },
   5590     /* a0 */
   5591     { Bad_Opcode },
   5592     { Bad_Opcode },
   5593     { "vpcmov", 	{ XM, Vex, EXx, XMVexI4 }, 0 },
   5594     { VEX_LEN_TABLE (VEX_LEN_XOP_08_A3) },
   5595     { Bad_Opcode },
   5596     { Bad_Opcode },
   5597     { VEX_LEN_TABLE (VEX_LEN_XOP_08_A6) },
   5598     { Bad_Opcode },
   5599     /* a8 */
   5600     { Bad_Opcode },
   5601     { Bad_Opcode },
   5602     { Bad_Opcode },
   5603     { Bad_Opcode },
   5604     { Bad_Opcode },
   5605     { Bad_Opcode },
   5606     { Bad_Opcode },
   5607     { Bad_Opcode },
   5608     /* b0 */
   5609     { Bad_Opcode },
   5610     { Bad_Opcode },
   5611     { Bad_Opcode },
   5612     { Bad_Opcode },
   5613     { Bad_Opcode },
   5614     { Bad_Opcode },
   5615     { VEX_LEN_TABLE (VEX_LEN_XOP_08_B6) },
   5616     { Bad_Opcode },
   5617     /* b8 */
   5618     { Bad_Opcode },
   5619     { Bad_Opcode },
   5620     { Bad_Opcode },
   5621     { Bad_Opcode },
   5622     { Bad_Opcode },
   5623     { Bad_Opcode },
   5624     { Bad_Opcode },
   5625     { Bad_Opcode },
   5626     /* c0 */
   5627     { VEX_LEN_TABLE (VEX_LEN_XOP_08_C0) },
   5628     { VEX_LEN_TABLE (VEX_LEN_XOP_08_C1) },
   5629     { VEX_LEN_TABLE (VEX_LEN_XOP_08_C2) },
   5630     { VEX_LEN_TABLE (VEX_LEN_XOP_08_C3) },
   5631     { Bad_Opcode },
   5632     { Bad_Opcode },
   5633     { Bad_Opcode },
   5634     { Bad_Opcode },
   5635     /* c8 */
   5636     { Bad_Opcode },
   5637     { Bad_Opcode },
   5638     { Bad_Opcode },
   5639     { Bad_Opcode },
   5640     { VEX_LEN_TABLE (VEX_LEN_XOP_08_CC) },
   5641     { VEX_LEN_TABLE (VEX_LEN_XOP_08_CD) },
   5642     { VEX_LEN_TABLE (VEX_LEN_XOP_08_CE) },
   5643     { VEX_LEN_TABLE (VEX_LEN_XOP_08_CF) },
   5644     /* d0 */
   5645     { Bad_Opcode },
   5646     { Bad_Opcode },
   5647     { Bad_Opcode },
   5648     { Bad_Opcode },
   5649     { Bad_Opcode },
   5650     { Bad_Opcode },
   5651     { Bad_Opcode },
   5652     { Bad_Opcode },
   5653     /* d8 */
   5654     { Bad_Opcode },
   5655     { Bad_Opcode },
   5656     { Bad_Opcode },
   5657     { Bad_Opcode },
   5658     { Bad_Opcode },
   5659     { Bad_Opcode },
   5660     { Bad_Opcode },
   5661     { Bad_Opcode },
   5662     /* e0 */
   5663     { Bad_Opcode },
   5664     { Bad_Opcode },
   5665     { Bad_Opcode },
   5666     { Bad_Opcode },
   5667     { Bad_Opcode },
   5668     { Bad_Opcode },
   5669     { Bad_Opcode },
   5670     { Bad_Opcode },
   5671     /* e8 */
   5672     { Bad_Opcode },
   5673     { Bad_Opcode },
   5674     { Bad_Opcode },
   5675     { Bad_Opcode },
   5676     { VEX_LEN_TABLE (VEX_LEN_XOP_08_EC) },
   5677     { VEX_LEN_TABLE (VEX_LEN_XOP_08_ED) },
   5678     { VEX_LEN_TABLE (VEX_LEN_XOP_08_EE) },
   5679     { VEX_LEN_TABLE (VEX_LEN_XOP_08_EF) },
   5680     /* f0 */
   5681     { Bad_Opcode },
   5682     { Bad_Opcode },
   5683     { Bad_Opcode },
   5684     { Bad_Opcode },
   5685     { Bad_Opcode },
   5686     { Bad_Opcode },
   5687     { Bad_Opcode },
   5688     { Bad_Opcode },
   5689     /* f8 */
   5690     { Bad_Opcode },
   5691     { Bad_Opcode },
   5692     { Bad_Opcode },
   5693     { Bad_Opcode },
   5694     { Bad_Opcode },
   5695     { Bad_Opcode },
   5696     { Bad_Opcode },
   5697     { Bad_Opcode },
   5698   },
   5699   /* XOP_09 */
   5700   {
   5701     /* 00 */
   5702     { Bad_Opcode },
   5703     { VEX_LEN_TABLE (VEX_LEN_XOP_09_01) },
   5704     { VEX_LEN_TABLE (VEX_LEN_XOP_09_02) },
   5705     { Bad_Opcode },
   5706     { Bad_Opcode },
   5707     { Bad_Opcode },
   5708     { Bad_Opcode },
   5709     { Bad_Opcode },
   5710     /* 08 */
   5711     { Bad_Opcode },
   5712     { Bad_Opcode },
   5713     { Bad_Opcode },
   5714     { Bad_Opcode },
   5715     { Bad_Opcode },
   5716     { Bad_Opcode },
   5717     { Bad_Opcode },
   5718     { Bad_Opcode },
   5719     /* 10 */
   5720     { Bad_Opcode },
   5721     { Bad_Opcode },
   5722     { VEX_LEN_TABLE (VEX_LEN_XOP_09_12) },
   5723     { Bad_Opcode },
   5724     { Bad_Opcode },
   5725     { Bad_Opcode },
   5726     { Bad_Opcode },
   5727     { Bad_Opcode },
   5728     /* 18 */
   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     /* 20 */
   5738     { Bad_Opcode },
   5739     { Bad_Opcode },
   5740     { Bad_Opcode },
   5741     { Bad_Opcode },
   5742     { Bad_Opcode },
   5743     { Bad_Opcode },
   5744     { Bad_Opcode },
   5745     { Bad_Opcode },
   5746     /* 28 */
   5747     { Bad_Opcode },
   5748     { Bad_Opcode },
   5749     { Bad_Opcode },
   5750     { Bad_Opcode },
   5751     { Bad_Opcode },
   5752     { Bad_Opcode },
   5753     { Bad_Opcode },
   5754     { Bad_Opcode },
   5755     /* 30 */
   5756     { Bad_Opcode },
   5757     { Bad_Opcode },
   5758     { Bad_Opcode },
   5759     { Bad_Opcode },
   5760     { Bad_Opcode },
   5761     { Bad_Opcode },
   5762     { Bad_Opcode },
   5763     { Bad_Opcode },
   5764     /* 38 */
   5765     { Bad_Opcode },
   5766     { Bad_Opcode },
   5767     { Bad_Opcode },
   5768     { Bad_Opcode },
   5769     { Bad_Opcode },
   5770     { Bad_Opcode },
   5771     { Bad_Opcode },
   5772     { Bad_Opcode },
   5773     /* 40 */
   5774     { Bad_Opcode },
   5775     { Bad_Opcode },
   5776     { Bad_Opcode },
   5777     { Bad_Opcode },
   5778     { Bad_Opcode },
   5779     { Bad_Opcode },
   5780     { Bad_Opcode },
   5781     { Bad_Opcode },
   5782     /* 48 */
   5783     { Bad_Opcode },
   5784     { Bad_Opcode },
   5785     { Bad_Opcode },
   5786     { Bad_Opcode },
   5787     { Bad_Opcode },
   5788     { Bad_Opcode },
   5789     { Bad_Opcode },
   5790     { Bad_Opcode },
   5791     /* 50 */
   5792     { Bad_Opcode },
   5793     { Bad_Opcode },
   5794     { Bad_Opcode },
   5795     { Bad_Opcode },
   5796     { Bad_Opcode },
   5797     { Bad_Opcode },
   5798     { Bad_Opcode },
   5799     { Bad_Opcode },
   5800     /* 58 */
   5801     { Bad_Opcode },
   5802     { Bad_Opcode },
   5803     { Bad_Opcode },
   5804     { Bad_Opcode },
   5805     { Bad_Opcode },
   5806     { Bad_Opcode },
   5807     { Bad_Opcode },
   5808     { Bad_Opcode },
   5809     /* 60 */
   5810     { Bad_Opcode },
   5811     { Bad_Opcode },
   5812     { Bad_Opcode },
   5813     { Bad_Opcode },
   5814     { Bad_Opcode },
   5815     { Bad_Opcode },
   5816     { Bad_Opcode },
   5817     { Bad_Opcode },
   5818     /* 68 */
   5819     { Bad_Opcode },
   5820     { Bad_Opcode },
   5821     { Bad_Opcode },
   5822     { Bad_Opcode },
   5823     { Bad_Opcode },
   5824     { Bad_Opcode },
   5825     { Bad_Opcode },
   5826     { Bad_Opcode },
   5827     /* 70 */
   5828     { Bad_Opcode },
   5829     { Bad_Opcode },
   5830     { Bad_Opcode },
   5831     { Bad_Opcode },
   5832     { Bad_Opcode },
   5833     { Bad_Opcode },
   5834     { Bad_Opcode },
   5835     { Bad_Opcode },
   5836     /* 78 */
   5837     { Bad_Opcode },
   5838     { Bad_Opcode },
   5839     { Bad_Opcode },
   5840     { Bad_Opcode },
   5841     { Bad_Opcode },
   5842     { Bad_Opcode },
   5843     { Bad_Opcode },
   5844     { Bad_Opcode },
   5845     /* 80 */
   5846     { VEX_W_TABLE (VEX_W_XOP_09_80) },
   5847     { VEX_W_TABLE (VEX_W_XOP_09_81) },
   5848     { VEX_W_TABLE (VEX_W_XOP_09_82) },
   5849     { VEX_W_TABLE (VEX_W_XOP_09_83) },
   5850     { Bad_Opcode },
   5851     { Bad_Opcode },
   5852     { Bad_Opcode },
   5853     { Bad_Opcode },
   5854     /* 88 */
   5855     { Bad_Opcode },
   5856     { Bad_Opcode },
   5857     { Bad_Opcode },
   5858     { Bad_Opcode },
   5859     { Bad_Opcode },
   5860     { Bad_Opcode },
   5861     { Bad_Opcode },
   5862     { Bad_Opcode },
   5863     /* 90 */
   5864     { VEX_LEN_TABLE (VEX_LEN_XOP_09_90) },
   5865     { VEX_LEN_TABLE (VEX_LEN_XOP_09_91) },
   5866     { VEX_LEN_TABLE (VEX_LEN_XOP_09_92) },
   5867     { VEX_LEN_TABLE (VEX_LEN_XOP_09_93) },
   5868     { VEX_LEN_TABLE (VEX_LEN_XOP_09_94) },
   5869     { VEX_LEN_TABLE (VEX_LEN_XOP_09_95) },
   5870     { VEX_LEN_TABLE (VEX_LEN_XOP_09_96) },
   5871     { VEX_LEN_TABLE (VEX_LEN_XOP_09_97) },
   5872     /* 98 */
   5873     { VEX_LEN_TABLE (VEX_LEN_XOP_09_98) },
   5874     { VEX_LEN_TABLE (VEX_LEN_XOP_09_99) },
   5875     { VEX_LEN_TABLE (VEX_LEN_XOP_09_9A) },
   5876     { VEX_LEN_TABLE (VEX_LEN_XOP_09_9B) },
   5877     { Bad_Opcode },
   5878     { Bad_Opcode },
   5879     { Bad_Opcode },
   5880     { Bad_Opcode },
   5881     /* a0 */
   5882     { Bad_Opcode },
   5883     { Bad_Opcode },
   5884     { Bad_Opcode },
   5885     { Bad_Opcode },
   5886     { Bad_Opcode },
   5887     { Bad_Opcode },
   5888     { Bad_Opcode },
   5889     { Bad_Opcode },
   5890     /* a8 */
   5891     { Bad_Opcode },
   5892     { Bad_Opcode },
   5893     { Bad_Opcode },
   5894     { Bad_Opcode },
   5895     { Bad_Opcode },
   5896     { Bad_Opcode },
   5897     { Bad_Opcode },
   5898     { Bad_Opcode },
   5899     /* b0 */
   5900     { Bad_Opcode },
   5901     { Bad_Opcode },
   5902     { Bad_Opcode },
   5903     { Bad_Opcode },
   5904     { Bad_Opcode },
   5905     { Bad_Opcode },
   5906     { Bad_Opcode },
   5907     { Bad_Opcode },
   5908     /* b8 */
   5909     { Bad_Opcode },
   5910     { Bad_Opcode },
   5911     { Bad_Opcode },
   5912     { Bad_Opcode },
   5913     { Bad_Opcode },
   5914     { Bad_Opcode },
   5915     { Bad_Opcode },
   5916     { Bad_Opcode },
   5917     /* c0 */
   5918     { Bad_Opcode },
   5919     { VEX_LEN_TABLE (VEX_LEN_XOP_09_C1) },
   5920     { VEX_LEN_TABLE (VEX_LEN_XOP_09_C2) },
   5921     { VEX_LEN_TABLE (VEX_LEN_XOP_09_C3) },
   5922     { Bad_Opcode },
   5923     { Bad_Opcode },
   5924     { VEX_LEN_TABLE (VEX_LEN_XOP_09_C6) },
   5925     { VEX_LEN_TABLE (VEX_LEN_XOP_09_C7) },
   5926     /* c8 */
   5927     { Bad_Opcode },
   5928     { Bad_Opcode },
   5929     { Bad_Opcode },
   5930     { VEX_LEN_TABLE (VEX_LEN_XOP_09_CB) },
   5931     { Bad_Opcode },
   5932     { Bad_Opcode },
   5933     { Bad_Opcode },
   5934     { Bad_Opcode },
   5935     /* d0 */
   5936     { Bad_Opcode },
   5937     { VEX_LEN_TABLE (VEX_LEN_XOP_09_D1) },
   5938     { VEX_LEN_TABLE (VEX_LEN_XOP_09_D2) },
   5939     { VEX_LEN_TABLE (VEX_LEN_XOP_09_D3) },
   5940     { Bad_Opcode },
   5941     { Bad_Opcode },
   5942     { VEX_LEN_TABLE (VEX_LEN_XOP_09_D6) },
   5943     { VEX_LEN_TABLE (VEX_LEN_XOP_09_D7) },
   5944     /* d8 */
   5945     { Bad_Opcode },
   5946     { Bad_Opcode },
   5947     { Bad_Opcode },
   5948     { VEX_LEN_TABLE (VEX_LEN_XOP_09_DB) },
   5949     { Bad_Opcode },
   5950     { Bad_Opcode },
   5951     { Bad_Opcode },
   5952     { Bad_Opcode },
   5953     /* e0 */
   5954     { Bad_Opcode },
   5955     { VEX_LEN_TABLE (VEX_LEN_XOP_09_E1) },
   5956     { VEX_LEN_TABLE (VEX_LEN_XOP_09_E2) },
   5957     { VEX_LEN_TABLE (VEX_LEN_XOP_09_E3) },
   5958     { Bad_Opcode },
   5959     { Bad_Opcode },
   5960     { Bad_Opcode },
   5961     { Bad_Opcode },
   5962     /* e8 */
   5963     { Bad_Opcode },
   5964     { Bad_Opcode },
   5965     { Bad_Opcode },
   5966     { Bad_Opcode },
   5967     { Bad_Opcode },
   5968     { Bad_Opcode },
   5969     { Bad_Opcode },
   5970     { Bad_Opcode },
   5971     /* f0 */
   5972     { Bad_Opcode },
   5973     { Bad_Opcode },
   5974     { Bad_Opcode },
   5975     { Bad_Opcode },
   5976     { Bad_Opcode },
   5977     { Bad_Opcode },
   5978     { Bad_Opcode },
   5979     { Bad_Opcode },
   5980     /* f8 */
   5981     { Bad_Opcode },
   5982     { Bad_Opcode },
   5983     { Bad_Opcode },
   5984     { Bad_Opcode },
   5985     { Bad_Opcode },
   5986     { Bad_Opcode },
   5987     { Bad_Opcode },
   5988     { Bad_Opcode },
   5989   },
   5990   /* XOP_0A */
   5991   {
   5992     /* 00 */
   5993     { Bad_Opcode },
   5994     { Bad_Opcode },
   5995     { Bad_Opcode },
   5996     { Bad_Opcode },
   5997     { Bad_Opcode },
   5998     { Bad_Opcode },
   5999     { Bad_Opcode },
   6000     { Bad_Opcode },
   6001     /* 08 */
   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     /* 10 */
   6011     { "bextrS",	{ Gdq, Edq, Id }, 0 },
   6012     { Bad_Opcode },
   6013     { VEX_LEN_TABLE (VEX_LEN_XOP_0A_12) },
   6014     { Bad_Opcode },
   6015     { Bad_Opcode },
   6016     { Bad_Opcode },
   6017     { Bad_Opcode },
   6018     { Bad_Opcode },
   6019     /* 18 */
   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     /* 20 */
   6029     { Bad_Opcode },
   6030     { Bad_Opcode },
   6031     { Bad_Opcode },
   6032     { Bad_Opcode },
   6033     { Bad_Opcode },
   6034     { Bad_Opcode },
   6035     { Bad_Opcode },
   6036     { Bad_Opcode },
   6037     /* 28 */
   6038     { Bad_Opcode },
   6039     { Bad_Opcode },
   6040     { Bad_Opcode },
   6041     { Bad_Opcode },
   6042     { Bad_Opcode },
   6043     { Bad_Opcode },
   6044     { Bad_Opcode },
   6045     { Bad_Opcode },
   6046     /* 30 */
   6047     { Bad_Opcode },
   6048     { Bad_Opcode },
   6049     { Bad_Opcode },
   6050     { Bad_Opcode },
   6051     { Bad_Opcode },
   6052     { Bad_Opcode },
   6053     { Bad_Opcode },
   6054     { Bad_Opcode },
   6055     /* 38 */
   6056     { Bad_Opcode },
   6057     { Bad_Opcode },
   6058     { Bad_Opcode },
   6059     { Bad_Opcode },
   6060     { Bad_Opcode },
   6061     { Bad_Opcode },
   6062     { Bad_Opcode },
   6063     { Bad_Opcode },
   6064     /* 40 */
   6065     { Bad_Opcode },
   6066     { Bad_Opcode },
   6067     { Bad_Opcode },
   6068     { Bad_Opcode },
   6069     { Bad_Opcode },
   6070     { Bad_Opcode },
   6071     { Bad_Opcode },
   6072     { Bad_Opcode },
   6073     /* 48 */
   6074     { Bad_Opcode },
   6075     { Bad_Opcode },
   6076     { Bad_Opcode },
   6077     { Bad_Opcode },
   6078     { Bad_Opcode },
   6079     { Bad_Opcode },
   6080     { Bad_Opcode },
   6081     { Bad_Opcode },
   6082     /* 50 */
   6083     { Bad_Opcode },
   6084     { Bad_Opcode },
   6085     { Bad_Opcode },
   6086     { Bad_Opcode },
   6087     { Bad_Opcode },
   6088     { Bad_Opcode },
   6089     { Bad_Opcode },
   6090     { Bad_Opcode },
   6091     /* 58 */
   6092     { Bad_Opcode },
   6093     { Bad_Opcode },
   6094     { Bad_Opcode },
   6095     { Bad_Opcode },
   6096     { Bad_Opcode },
   6097     { Bad_Opcode },
   6098     { Bad_Opcode },
   6099     { Bad_Opcode },
   6100     /* 60 */
   6101     { Bad_Opcode },
   6102     { Bad_Opcode },
   6103     { Bad_Opcode },
   6104     { Bad_Opcode },
   6105     { Bad_Opcode },
   6106     { Bad_Opcode },
   6107     { Bad_Opcode },
   6108     { Bad_Opcode },
   6109     /* 68 */
   6110     { Bad_Opcode },
   6111     { Bad_Opcode },
   6112     { Bad_Opcode },
   6113     { Bad_Opcode },
   6114     { Bad_Opcode },
   6115     { Bad_Opcode },
   6116     { Bad_Opcode },
   6117     { Bad_Opcode },
   6118     /* 70 */
   6119     { Bad_Opcode },
   6120     { Bad_Opcode },
   6121     { Bad_Opcode },
   6122     { Bad_Opcode },
   6123     { Bad_Opcode },
   6124     { Bad_Opcode },
   6125     { Bad_Opcode },
   6126     { Bad_Opcode },
   6127     /* 78 */
   6128     { Bad_Opcode },
   6129     { Bad_Opcode },
   6130     { Bad_Opcode },
   6131     { Bad_Opcode },
   6132     { Bad_Opcode },
   6133     { Bad_Opcode },
   6134     { Bad_Opcode },
   6135     { Bad_Opcode },
   6136     /* 80 */
   6137     { Bad_Opcode },
   6138     { Bad_Opcode },
   6139     { Bad_Opcode },
   6140     { Bad_Opcode },
   6141     { Bad_Opcode },
   6142     { Bad_Opcode },
   6143     { Bad_Opcode },
   6144     { Bad_Opcode },
   6145     /* 88 */
   6146     { Bad_Opcode },
   6147     { Bad_Opcode },
   6148     { Bad_Opcode },
   6149     { Bad_Opcode },
   6150     { Bad_Opcode },
   6151     { Bad_Opcode },
   6152     { Bad_Opcode },
   6153     { Bad_Opcode },
   6154     /* 90 */
   6155     { Bad_Opcode },
   6156     { Bad_Opcode },
   6157     { Bad_Opcode },
   6158     { Bad_Opcode },
   6159     { Bad_Opcode },
   6160     { Bad_Opcode },
   6161     { Bad_Opcode },
   6162     { Bad_Opcode },
   6163     /* 98 */
   6164     { Bad_Opcode },
   6165     { Bad_Opcode },
   6166     { Bad_Opcode },
   6167     { Bad_Opcode },
   6168     { Bad_Opcode },
   6169     { Bad_Opcode },
   6170     { Bad_Opcode },
   6171     { Bad_Opcode },
   6172     /* a0 */
   6173     { Bad_Opcode },
   6174     { Bad_Opcode },
   6175     { Bad_Opcode },
   6176     { Bad_Opcode },
   6177     { Bad_Opcode },
   6178     { Bad_Opcode },
   6179     { Bad_Opcode },
   6180     { Bad_Opcode },
   6181     /* a8 */
   6182     { Bad_Opcode },
   6183     { Bad_Opcode },
   6184     { Bad_Opcode },
   6185     { Bad_Opcode },
   6186     { Bad_Opcode },
   6187     { Bad_Opcode },
   6188     { Bad_Opcode },
   6189     { Bad_Opcode },
   6190     /* b0 */
   6191     { Bad_Opcode },
   6192     { Bad_Opcode },
   6193     { Bad_Opcode },
   6194     { Bad_Opcode },
   6195     { Bad_Opcode },
   6196     { Bad_Opcode },
   6197     { Bad_Opcode },
   6198     { Bad_Opcode },
   6199     /* b8 */
   6200     { Bad_Opcode },
   6201     { Bad_Opcode },
   6202     { Bad_Opcode },
   6203     { Bad_Opcode },
   6204     { Bad_Opcode },
   6205     { Bad_Opcode },
   6206     { Bad_Opcode },
   6207     { Bad_Opcode },
   6208     /* c0 */
   6209     { Bad_Opcode },
   6210     { Bad_Opcode },
   6211     { Bad_Opcode },
   6212     { Bad_Opcode },
   6213     { Bad_Opcode },
   6214     { Bad_Opcode },
   6215     { Bad_Opcode },
   6216     { Bad_Opcode },
   6217     /* c8 */
   6218     { Bad_Opcode },
   6219     { Bad_Opcode },
   6220     { Bad_Opcode },
   6221     { Bad_Opcode },
   6222     { Bad_Opcode },
   6223     { Bad_Opcode },
   6224     { Bad_Opcode },
   6225     { Bad_Opcode },
   6226     /* d0 */
   6227     { Bad_Opcode },
   6228     { Bad_Opcode },
   6229     { Bad_Opcode },
   6230     { Bad_Opcode },
   6231     { Bad_Opcode },
   6232     { Bad_Opcode },
   6233     { Bad_Opcode },
   6234     { Bad_Opcode },
   6235     /* d8 */
   6236     { Bad_Opcode },
   6237     { Bad_Opcode },
   6238     { Bad_Opcode },
   6239     { Bad_Opcode },
   6240     { Bad_Opcode },
   6241     { Bad_Opcode },
   6242     { Bad_Opcode },
   6243     { Bad_Opcode },
   6244     /* e0 */
   6245     { Bad_Opcode },
   6246     { Bad_Opcode },
   6247     { Bad_Opcode },
   6248     { Bad_Opcode },
   6249     { Bad_Opcode },
   6250     { Bad_Opcode },
   6251     { Bad_Opcode },
   6252     { Bad_Opcode },
   6253     /* e8 */
   6254     { Bad_Opcode },
   6255     { Bad_Opcode },
   6256     { Bad_Opcode },
   6257     { Bad_Opcode },
   6258     { Bad_Opcode },
   6259     { Bad_Opcode },
   6260     { Bad_Opcode },
   6261     { Bad_Opcode },
   6262     /* f0 */
   6263     { Bad_Opcode },
   6264     { Bad_Opcode },
   6265     { Bad_Opcode },
   6266     { Bad_Opcode },
   6267     { Bad_Opcode },
   6268     { Bad_Opcode },
   6269     { Bad_Opcode },
   6270     { Bad_Opcode },
   6271     /* f8 */
   6272     { Bad_Opcode },
   6273     { Bad_Opcode },
   6274     { Bad_Opcode },
   6275     { Bad_Opcode },
   6276     { Bad_Opcode },
   6277     { Bad_Opcode },
   6278     { Bad_Opcode },
   6279     { Bad_Opcode },
   6280   },
   6281 };
   6282 
   6283 static const struct dis386 vex_table[][256] = {
   6284   /* VEX_0F */
   6285   {
   6286     /* 00 */
   6287     { Bad_Opcode },
   6288     { Bad_Opcode },
   6289     { Bad_Opcode },
   6290     { Bad_Opcode },
   6291     { Bad_Opcode },
   6292     { Bad_Opcode },
   6293     { Bad_Opcode },
   6294     { Bad_Opcode },
   6295     /* 08 */
   6296     { Bad_Opcode },
   6297     { Bad_Opcode },
   6298     { Bad_Opcode },
   6299     { Bad_Opcode },
   6300     { Bad_Opcode },
   6301     { Bad_Opcode },
   6302     { Bad_Opcode },
   6303     { Bad_Opcode },
   6304     /* 10 */
   6305     { PREFIX_TABLE (PREFIX_0F10) },
   6306     { PREFIX_TABLE (PREFIX_0F11) },
   6307     { PREFIX_TABLE (PREFIX_VEX_0F12) },
   6308     { VEX_LEN_TABLE (VEX_LEN_0F13) },
   6309     { "vunpcklpX",	{ XM, Vex, EXx }, PREFIX_OPCODE },
   6310     { "vunpckhpX",	{ XM, Vex, EXx }, PREFIX_OPCODE },
   6311     { PREFIX_TABLE (PREFIX_VEX_0F16) },
   6312     { VEX_LEN_TABLE (VEX_LEN_0F17) },
   6313     /* 18 */
   6314     { Bad_Opcode },
   6315     { Bad_Opcode },
   6316     { Bad_Opcode },
   6317     { Bad_Opcode },
   6318     { Bad_Opcode },
   6319     { Bad_Opcode },
   6320     { Bad_Opcode },
   6321     { Bad_Opcode },
   6322     /* 20 */
   6323     { Bad_Opcode },
   6324     { Bad_Opcode },
   6325     { Bad_Opcode },
   6326     { Bad_Opcode },
   6327     { Bad_Opcode },
   6328     { Bad_Opcode },
   6329     { Bad_Opcode },
   6330     { Bad_Opcode },
   6331     /* 28 */
   6332     { "vmovapX",	{ XM, EXx }, PREFIX_OPCODE },
   6333     { "vmovapX",	{ EXxS, XM }, PREFIX_OPCODE },
   6334     { PREFIX_TABLE (PREFIX_VEX_0F2A) },
   6335     { "vmovntpX",	{ Mx, XM }, PREFIX_OPCODE },
   6336     { PREFIX_TABLE (PREFIX_VEX_0F2C) },
   6337     { PREFIX_TABLE (PREFIX_VEX_0F2D) },
   6338     { PREFIX_TABLE (PREFIX_0F2E) },
   6339     { PREFIX_TABLE (PREFIX_0F2F) },
   6340     /* 30 */
   6341     { Bad_Opcode },
   6342     { Bad_Opcode },
   6343     { Bad_Opcode },
   6344     { Bad_Opcode },
   6345     { Bad_Opcode },
   6346     { Bad_Opcode },
   6347     { Bad_Opcode },
   6348     { Bad_Opcode },
   6349     /* 38 */
   6350     { Bad_Opcode },
   6351     { Bad_Opcode },
   6352     { Bad_Opcode },
   6353     { Bad_Opcode },
   6354     { Bad_Opcode },
   6355     { Bad_Opcode },
   6356     { Bad_Opcode },
   6357     { Bad_Opcode },
   6358     /* 40 */
   6359     { Bad_Opcode },
   6360     { VEX_LEN_TABLE (VEX_LEN_0F41) },
   6361     { VEX_LEN_TABLE (VEX_LEN_0F42) },
   6362     { Bad_Opcode },
   6363     { VEX_LEN_TABLE (VEX_LEN_0F44) },
   6364     { VEX_LEN_TABLE (VEX_LEN_0F45) },
   6365     { VEX_LEN_TABLE (VEX_LEN_0F46) },
   6366     { VEX_LEN_TABLE (VEX_LEN_0F47) },
   6367     /* 48 */
   6368     { Bad_Opcode },
   6369     { Bad_Opcode },
   6370     { VEX_LEN_TABLE (VEX_LEN_0F4A) },
   6371     { VEX_LEN_TABLE (VEX_LEN_0F4B) },
   6372     { Bad_Opcode },
   6373     { Bad_Opcode },
   6374     { Bad_Opcode },
   6375     { Bad_Opcode },
   6376     /* 50 */
   6377     { "vmovmskpX",	{ Gdq, Ux }, PREFIX_OPCODE },
   6378     { PREFIX_TABLE (PREFIX_0F51) },
   6379     { PREFIX_TABLE (PREFIX_0F52) },
   6380     { PREFIX_TABLE (PREFIX_0F53) },
   6381     { "vandpX",		{ XM, Vex, EXx }, PREFIX_OPCODE },
   6382     { "vandnpX",	{ XM, Vex, EXx }, PREFIX_OPCODE },
   6383     { "vorpX",		{ XM, Vex, EXx }, PREFIX_OPCODE },
   6384     { "vxorpX",		{ XM, Vex, EXx }, PREFIX_OPCODE },
   6385     /* 58 */
   6386     { PREFIX_TABLE (PREFIX_0F58) },
   6387     { PREFIX_TABLE (PREFIX_0F59) },
   6388     { PREFIX_TABLE (PREFIX_0F5A) },
   6389     { PREFIX_TABLE (PREFIX_0F5B) },
   6390     { PREFIX_TABLE (PREFIX_0F5C) },
   6391     { PREFIX_TABLE (PREFIX_0F5D) },
   6392     { PREFIX_TABLE (PREFIX_0F5E) },
   6393     { PREFIX_TABLE (PREFIX_0F5F) },
   6394     /* 60 */
   6395     { "vpunpcklbw",	{ XM, Vex, EXx }, PREFIX_DATA },
   6396     { "vpunpcklwd",	{ XM, Vex, EXx }, PREFIX_DATA },
   6397     { "vpunpckldq",	{ XM, Vex, EXx }, PREFIX_DATA },
   6398     { "vpacksswb",	{ XM, Vex, EXx }, PREFIX_DATA },
   6399     { "vpcmpgtb",	{ XM, Vex, EXx }, PREFIX_DATA },
   6400     { "vpcmpgtw",	{ XM, Vex, EXx }, PREFIX_DATA },
   6401     { "vpcmpgtd",	{ XM, Vex, EXx }, PREFIX_DATA },
   6402     { "vpackuswb",	{ XM, Vex, EXx }, PREFIX_DATA },
   6403     /* 68 */
   6404     { "vpunpckhbw",	{ XM, Vex, EXx }, PREFIX_DATA },
   6405     { "vpunpckhwd",	{ XM, Vex, EXx }, PREFIX_DATA },
   6406     { "vpunpckhdq",	{ XM, Vex, EXx }, PREFIX_DATA },
   6407     { "vpackssdw",	{ XM, Vex, EXx }, PREFIX_DATA },
   6408     { "vpunpcklqdq",	{ XM, Vex, EXx }, PREFIX_DATA },
   6409     { "vpunpckhqdq",	{ XM, Vex, EXx }, PREFIX_DATA },
   6410     { VEX_LEN_TABLE (VEX_LEN_0F6E) },
   6411     { PREFIX_TABLE (PREFIX_VEX_0F6F) },
   6412     /* 70 */
   6413     { PREFIX_TABLE (PREFIX_VEX_0F70) },
   6414     { REG_TABLE (REG_VEX_0F71) },
   6415     { REG_TABLE (REG_VEX_0F72) },
   6416     { REG_TABLE (REG_VEX_0F73) },
   6417     { "vpcmpeqb",	{ XM, Vex, EXx }, PREFIX_DATA },
   6418     { "vpcmpeqw",	{ XM, Vex, EXx }, PREFIX_DATA },
   6419     { "vpcmpeqd",	{ XM, Vex, EXx }, PREFIX_DATA },
   6420     { VEX_LEN_TABLE (VEX_LEN_0F77) },
   6421     /* 78 */
   6422     { Bad_Opcode },
   6423     { Bad_Opcode },
   6424     { Bad_Opcode },
   6425     { Bad_Opcode },
   6426     { PREFIX_TABLE (PREFIX_0F7C) },
   6427     { PREFIX_TABLE (PREFIX_0F7D) },
   6428     { PREFIX_TABLE (PREFIX_VEX_0F7E) },
   6429     { PREFIX_TABLE (PREFIX_VEX_0F7F) },
   6430     /* 80 */
   6431     { Bad_Opcode },
   6432     { Bad_Opcode },
   6433     { Bad_Opcode },
   6434     { Bad_Opcode },
   6435     { Bad_Opcode },
   6436     { Bad_Opcode },
   6437     { Bad_Opcode },
   6438     { Bad_Opcode },
   6439     /* 88 */
   6440     { Bad_Opcode },
   6441     { Bad_Opcode },
   6442     { Bad_Opcode },
   6443     { Bad_Opcode },
   6444     { Bad_Opcode },
   6445     { Bad_Opcode },
   6446     { Bad_Opcode },
   6447     { Bad_Opcode },
   6448     /* 90 */
   6449     { VEX_LEN_TABLE (VEX_LEN_0F90) },
   6450     { VEX_LEN_TABLE (VEX_LEN_0F91) },
   6451     { VEX_LEN_TABLE (VEX_LEN_0F92) },
   6452     { VEX_LEN_TABLE (VEX_LEN_0F93) },
   6453     { Bad_Opcode },
   6454     { Bad_Opcode },
   6455     { Bad_Opcode },
   6456     { Bad_Opcode },
   6457     /* 98 */
   6458     { VEX_LEN_TABLE (VEX_LEN_0F98) },
   6459     { VEX_LEN_TABLE (VEX_LEN_0F99) },
   6460     { Bad_Opcode },
   6461     { Bad_Opcode },
   6462     { Bad_Opcode },
   6463     { Bad_Opcode },
   6464     { Bad_Opcode },
   6465     { Bad_Opcode },
   6466     /* a0 */
   6467     { Bad_Opcode },
   6468     { Bad_Opcode },
   6469     { Bad_Opcode },
   6470     { Bad_Opcode },
   6471     { Bad_Opcode },
   6472     { Bad_Opcode },
   6473     { Bad_Opcode },
   6474     { Bad_Opcode },
   6475     /* a8 */
   6476     { Bad_Opcode },
   6477     { Bad_Opcode },
   6478     { Bad_Opcode },
   6479     { Bad_Opcode },
   6480     { Bad_Opcode },
   6481     { Bad_Opcode },
   6482     { REG_TABLE (REG_VEX_0FAE) },
   6483     { Bad_Opcode },
   6484     /* b0 */
   6485     { Bad_Opcode },
   6486     { Bad_Opcode },
   6487     { Bad_Opcode },
   6488     { Bad_Opcode },
   6489     { Bad_Opcode },
   6490     { Bad_Opcode },
   6491     { Bad_Opcode },
   6492     { Bad_Opcode },
   6493     /* b8 */
   6494     { Bad_Opcode },
   6495     { Bad_Opcode },
   6496     { Bad_Opcode },
   6497     { Bad_Opcode },
   6498     { Bad_Opcode },
   6499     { Bad_Opcode },
   6500     { Bad_Opcode },
   6501     { Bad_Opcode },
   6502     /* c0 */
   6503     { Bad_Opcode },
   6504     { Bad_Opcode },
   6505     { PREFIX_TABLE (PREFIX_0FC2) },
   6506     { Bad_Opcode },
   6507     { VEX_LEN_TABLE (VEX_LEN_0FC4) },
   6508     { "vpextrw",	{ Gd, Uxmm, Ib }, PREFIX_DATA },
   6509     { "vshufpX",	{ XM, Vex, EXx, Ib }, PREFIX_OPCODE },
   6510     { Bad_Opcode },
   6511     /* c8 */
   6512     { Bad_Opcode },
   6513     { Bad_Opcode },
   6514     { Bad_Opcode },
   6515     { Bad_Opcode },
   6516     { Bad_Opcode },
   6517     { Bad_Opcode },
   6518     { Bad_Opcode },
   6519     { Bad_Opcode },
   6520     /* d0 */
   6521     { PREFIX_TABLE (PREFIX_0FD0) },
   6522     { "vpsrlw",		{ XM, Vex, EXxmm }, PREFIX_DATA },
   6523     { "vpsrld",		{ XM, Vex, EXxmm }, PREFIX_DATA },
   6524     { "vpsrlq",		{ XM, Vex, EXxmm }, PREFIX_DATA },
   6525     { "vpaddq",		{ XM, Vex, EXx }, PREFIX_DATA },
   6526     { "vpmullw",	{ XM, Vex, EXx }, PREFIX_DATA },
   6527     { VEX_LEN_TABLE (VEX_LEN_0FD6) },
   6528     { "vpmovmskb",	{ Gdq, Ux }, PREFIX_DATA },
   6529     /* d8 */
   6530     { "vpsubusb",	{ XM, Vex, EXx }, PREFIX_DATA },
   6531     { "vpsubusw",	{ XM, Vex, EXx }, PREFIX_DATA },
   6532     { "vpminub",	{ XM, Vex, EXx }, PREFIX_DATA },
   6533     { "vpand",		{ XM, Vex, EXx }, PREFIX_DATA },
   6534     { "vpaddusb",	{ XM, Vex, EXx }, PREFIX_DATA },
   6535     { "vpaddusw",	{ XM, Vex, EXx }, PREFIX_DATA },
   6536     { "vpmaxub",	{ XM, Vex, EXx }, PREFIX_DATA },
   6537     { "vpandn",		{ XM, Vex, EXx }, PREFIX_DATA },
   6538     /* e0 */
   6539     { "vpavgb",		{ XM, Vex, EXx }, PREFIX_DATA },
   6540     { "vpsraw",		{ XM, Vex, EXxmm }, PREFIX_DATA },
   6541     { "vpsrad",		{ XM, Vex, EXxmm }, PREFIX_DATA },
   6542     { "vpavgw",		{ XM, Vex, EXx }, PREFIX_DATA },
   6543     { "vpmulhuw",	{ XM, Vex, EXx }, PREFIX_DATA },
   6544     { "vpmulhw",	{ XM, Vex, EXx }, PREFIX_DATA },
   6545     { PREFIX_TABLE (PREFIX_0FE6) },
   6546     { "vmovntdq",	{ Mx, XM }, PREFIX_DATA },
   6547     /* e8 */
   6548     { "vpsubsb",	{ XM, Vex, EXx }, PREFIX_DATA },
   6549     { "vpsubsw",	{ XM, Vex, EXx }, PREFIX_DATA },
   6550     { "vpminsw",	{ XM, Vex, EXx }, PREFIX_DATA },
   6551     { "vpor",		{ XM, Vex, EXx }, PREFIX_DATA },
   6552     { "vpaddsb",	{ XM, Vex, EXx }, PREFIX_DATA },
   6553     { "vpaddsw",	{ XM, Vex, EXx }, PREFIX_DATA },
   6554     { "vpmaxsw",	{ XM, Vex, EXx }, PREFIX_DATA },
   6555     { "vpxor",		{ XM, Vex, EXx }, PREFIX_DATA },
   6556     /* f0 */
   6557     { PREFIX_TABLE (PREFIX_0FF0) },
   6558     { "vpsllw",		{ XM, Vex, EXxmm }, PREFIX_DATA },
   6559     { "vpslld",		{ XM, Vex, EXxmm }, PREFIX_DATA },
   6560     { "vpsllq",		{ XM, Vex, EXxmm }, PREFIX_DATA },
   6561     { "vpmuludq",	{ XM, Vex, EXx }, PREFIX_DATA },
   6562     { "vpmaddwd",	{ XM, Vex, EXx }, PREFIX_DATA },
   6563     { "vpsadbw",	{ XM, Vex, EXx }, PREFIX_DATA },
   6564     { "vmaskmovdqu",	{ XM, Uxmm }, PREFIX_DATA },
   6565     /* f8 */
   6566     { "vpsubb",		{ XM, Vex, EXx }, PREFIX_DATA },
   6567     { "vpsubw",		{ XM, Vex, EXx }, PREFIX_DATA },
   6568     { "vpsubd",		{ XM, Vex, EXx }, PREFIX_DATA },
   6569     { "vpsubq",		{ XM, Vex, EXx }, PREFIX_DATA },
   6570     { "vpaddb",		{ XM, Vex, EXx }, PREFIX_DATA },
   6571     { "vpaddw",		{ XM, Vex, EXx }, PREFIX_DATA },
   6572     { "vpaddd",		{ XM, Vex, EXx }, PREFIX_DATA },
   6573     { Bad_Opcode },
   6574   },
   6575   /* VEX_0F38 */
   6576   {
   6577     /* 00 */
   6578     { "vpshufb",	{ XM, Vex, EXx }, PREFIX_DATA },
   6579     { "vphaddw",	{ XM, Vex, EXx }, PREFIX_DATA },
   6580     { "vphaddd",	{ XM, Vex, EXx }, PREFIX_DATA },
   6581     { "vphaddsw",	{ XM, Vex, EXx }, PREFIX_DATA },
   6582     { "vpmaddubsw",	{ XM, Vex, EXx }, PREFIX_DATA },
   6583     { "vphsubw",	{ XM, Vex, EXx }, PREFIX_DATA },
   6584     { "vphsubd",	{ XM, Vex, EXx }, PREFIX_DATA },
   6585     { "vphsubsw",	{ XM, Vex, EXx }, PREFIX_DATA },
   6586     /* 08 */
   6587     { "vpsignb",	{ XM, Vex, EXx }, PREFIX_DATA },
   6588     { "vpsignw",	{ XM, Vex, EXx }, PREFIX_DATA },
   6589     { "vpsignd",	{ XM, Vex, EXx }, PREFIX_DATA },
   6590     { "vpmulhrsw",	{ XM, Vex, EXx }, PREFIX_DATA },
   6591     { VEX_W_TABLE (VEX_W_0F380C) },
   6592     { VEX_W_TABLE (VEX_W_0F380D) },
   6593     { VEX_W_TABLE (VEX_W_0F380E) },
   6594     { VEX_W_TABLE (VEX_W_0F380F) },
   6595     /* 10 */
   6596     { Bad_Opcode },
   6597     { Bad_Opcode },
   6598     { Bad_Opcode },
   6599     { VEX_W_TABLE (VEX_W_0F3813) },
   6600     { Bad_Opcode },
   6601     { Bad_Opcode },
   6602     { VEX_LEN_TABLE (VEX_LEN_0F3816) },
   6603     { "vptest",		{ XM, EXx }, PREFIX_DATA },
   6604     /* 18 */
   6605     { VEX_W_TABLE (VEX_W_0F3818) },
   6606     { VEX_LEN_TABLE (VEX_LEN_0F3819) },
   6607     { VEX_LEN_TABLE (VEX_LEN_0F381A) },
   6608     { Bad_Opcode },
   6609     { "vpabsb",		{ XM, EXx }, PREFIX_DATA },
   6610     { "vpabsw",		{ XM, EXx }, PREFIX_DATA },
   6611     { "vpabsd",		{ XM, EXx }, PREFIX_DATA },
   6612     { Bad_Opcode },
   6613     /* 20 */
   6614     { "vpmovsxbw",	{ XM, EXxmmq }, PREFIX_DATA },
   6615     { "vpmovsxbd",	{ XM, EXxmmqd }, PREFIX_DATA },
   6616     { "vpmovsxbq",	{ XM, EXxmmdw }, PREFIX_DATA },
   6617     { "vpmovsxwd",	{ XM, EXxmmq }, PREFIX_DATA },
   6618     { "vpmovsxwq",	{ XM, EXxmmqd }, PREFIX_DATA },
   6619     { "vpmovsxdq",	{ XM, EXxmmq }, PREFIX_DATA },
   6620     { Bad_Opcode },
   6621     { Bad_Opcode },
   6622     /* 28 */
   6623     { "vpmuldq",	{ XM, Vex, EXx }, PREFIX_DATA },
   6624     { "vpcmpeqq",	{ XM, Vex, EXx }, PREFIX_DATA },
   6625     { "vmovntdqa",	{ XM, Mx }, PREFIX_DATA },
   6626     { "vpackusdw",	{ XM, Vex, EXx }, PREFIX_DATA },
   6627     { VEX_W_TABLE (VEX_W_0F382C) },
   6628     { VEX_W_TABLE (VEX_W_0F382D) },
   6629     { VEX_W_TABLE (VEX_W_0F382E) },
   6630     { VEX_W_TABLE (VEX_W_0F382F) },
   6631     /* 30 */
   6632     { "vpmovzxbw",	{ XM, EXxmmq }, PREFIX_DATA },
   6633     { "vpmovzxbd",	{ XM, EXxmmqd }, PREFIX_DATA },
   6634     { "vpmovzxbq",	{ XM, EXxmmdw }, PREFIX_DATA },
   6635     { "vpmovzxwd",	{ XM, EXxmmq }, PREFIX_DATA },
   6636     { "vpmovzxwq",	{ XM, EXxmmqd }, PREFIX_DATA },
   6637     { "vpmovzxdq",	{ XM, EXxmmq }, PREFIX_DATA },
   6638     { VEX_LEN_TABLE (VEX_LEN_0F3836) },
   6639     { "vpcmpgtq",	{ XM, Vex, EXx }, PREFIX_DATA },
   6640     /* 38 */
   6641     { "vpminsb",	{ XM, Vex, EXx }, PREFIX_DATA },
   6642     { "vpminsd",	{ XM, Vex, EXx }, PREFIX_DATA },
   6643     { "vpminuw",	{ XM, Vex, EXx }, PREFIX_DATA },
   6644     { "vpminud",	{ XM, Vex, EXx }, PREFIX_DATA },
   6645     { "vpmaxsb",	{ XM, Vex, EXx }, PREFIX_DATA },
   6646     { "vpmaxsd",	{ XM, Vex, EXx }, PREFIX_DATA },
   6647     { "vpmaxuw",	{ XM, Vex, EXx }, PREFIX_DATA },
   6648     { "vpmaxud",	{ XM, Vex, EXx }, PREFIX_DATA },
   6649     /* 40 */
   6650     { "vpmulld",	{ XM, Vex, EXx }, PREFIX_DATA },
   6651     { VEX_LEN_TABLE (VEX_LEN_0F3841) },
   6652     { Bad_Opcode },
   6653     { Bad_Opcode },
   6654     { Bad_Opcode },
   6655     { "vpsrlv%DQ", { XM, Vex, EXx }, PREFIX_DATA },
   6656     { VEX_W_TABLE (VEX_W_0F3846) },
   6657     { "vpsllv%DQ", { XM, Vex, EXx }, PREFIX_DATA },
   6658     /* 48 */
   6659     { X86_64_TABLE (X86_64_VEX_0F3848) },
   6660     { X86_64_TABLE (X86_64_VEX_0F3849) },
   6661     { X86_64_TABLE (X86_64_VEX_0F384A) },
   6662     { X86_64_TABLE (X86_64_VEX_0F384B) },
   6663     { Bad_Opcode },
   6664     { Bad_Opcode },
   6665     { Bad_Opcode },
   6666     { Bad_Opcode },
   6667     /* 50 */
   6668     { VEX_W_TABLE (VEX_W_0F3850) },
   6669     { VEX_W_TABLE (VEX_W_0F3851) },
   6670     { VEX_W_TABLE (VEX_W_0F3852) },
   6671     { VEX_W_TABLE (VEX_W_0F3853) },
   6672     { Bad_Opcode },
   6673     { Bad_Opcode },
   6674     { Bad_Opcode },
   6675     { Bad_Opcode },
   6676     /* 58 */
   6677     { VEX_W_TABLE (VEX_W_0F3858) },
   6678     { VEX_W_TABLE (VEX_W_0F3859) },
   6679     { VEX_LEN_TABLE (VEX_LEN_0F385A) },
   6680     { Bad_Opcode },
   6681     { X86_64_TABLE (X86_64_VEX_0F385C) },
   6682     { Bad_Opcode },
   6683     { X86_64_TABLE (X86_64_VEX_0F385E) },
   6684     { X86_64_TABLE (X86_64_VEX_0F385F) },
   6685     /* 60 */
   6686     { Bad_Opcode },
   6687     { Bad_Opcode },
   6688     { Bad_Opcode },
   6689     { Bad_Opcode },
   6690     { Bad_Opcode },
   6691     { Bad_Opcode },
   6692     { Bad_Opcode },
   6693     { Bad_Opcode },
   6694     /* 68 */
   6695     { Bad_Opcode },
   6696     { Bad_Opcode },
   6697     { Bad_Opcode },
   6698     { X86_64_TABLE (X86_64_VEX_0F386B) },
   6699     { X86_64_TABLE (X86_64_VEX_0F386C) },
   6700     { Bad_Opcode },
   6701     { X86_64_TABLE (X86_64_VEX_0F386E) },
   6702     { X86_64_TABLE (X86_64_VEX_0F386F) },
   6703     /* 70 */
   6704     { Bad_Opcode },
   6705     { Bad_Opcode },
   6706     { PREFIX_TABLE (PREFIX_VEX_0F3872) },
   6707     { Bad_Opcode },
   6708     { Bad_Opcode },
   6709     { Bad_Opcode },
   6710     { Bad_Opcode },
   6711     { Bad_Opcode },
   6712     /* 78 */
   6713     { VEX_W_TABLE (VEX_W_0F3878) },
   6714     { VEX_W_TABLE (VEX_W_0F3879) },
   6715     { Bad_Opcode },
   6716     { Bad_Opcode },
   6717     { Bad_Opcode },
   6718     { Bad_Opcode },
   6719     { Bad_Opcode },
   6720     { Bad_Opcode },
   6721     /* 80 */
   6722     { Bad_Opcode },
   6723     { Bad_Opcode },
   6724     { Bad_Opcode },
   6725     { Bad_Opcode },
   6726     { Bad_Opcode },
   6727     { Bad_Opcode },
   6728     { Bad_Opcode },
   6729     { Bad_Opcode },
   6730     /* 88 */
   6731     { Bad_Opcode },
   6732     { Bad_Opcode },
   6733     { Bad_Opcode },
   6734     { Bad_Opcode },
   6735     { "vpmaskmov%DQ",	{ XM, Vex, Mx }, PREFIX_DATA },
   6736     { Bad_Opcode },
   6737     { "vpmaskmov%DQ",	{ Mx, Vex, XM }, PREFIX_DATA },
   6738     { Bad_Opcode },
   6739     /* 90 */
   6740     { "vpgatherd%DQ", { XM, MVexVSIBDWpX, VexGatherD }, PREFIX_DATA },
   6741     { "vpgatherq%DQ", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, PREFIX_DATA },
   6742     { "vgatherdp%XW", { XM, MVexVSIBDWpX, VexGatherD }, PREFIX_DATA },
   6743     { "vgatherqp%XW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, PREFIX_DATA },
   6744     { Bad_Opcode },
   6745     { Bad_Opcode },
   6746     { "vfmaddsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
   6747     { "vfmsubadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
   6748     /* 98 */
   6749     { "vfmadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
   6750     { "vfmadd132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
   6751     { "vfmsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
   6752     { "vfmsub132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
   6753     { "vfnmadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
   6754     { "vfnmadd132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
   6755     { "vfnmsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
   6756     { "vfnmsub132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
   6757     /* a0 */
   6758     { Bad_Opcode },
   6759     { Bad_Opcode },
   6760     { Bad_Opcode },
   6761     { Bad_Opcode },
   6762     { Bad_Opcode },
   6763     { Bad_Opcode },
   6764     { "vfmaddsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
   6765     { "vfmsubadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
   6766     /* a8 */
   6767     { "vfmadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
   6768     { "vfmadd213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
   6769     { "vfmsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
   6770     { "vfmsub213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
   6771     { "vfnmadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
   6772     { "vfnmadd213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
   6773     { "vfnmsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
   6774     { "vfnmsub213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
   6775     /* b0 */
   6776     { VEX_W_TABLE (VEX_W_0F38B0) },
   6777     { VEX_W_TABLE (VEX_W_0F38B1) },
   6778     { Bad_Opcode },
   6779     { Bad_Opcode },
   6780     { VEX_W_TABLE (VEX_W_0F38B4) },
   6781     { VEX_W_TABLE (VEX_W_0F38B5) },
   6782     { "vfmaddsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
   6783     { "vfmsubadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
   6784     /* b8 */
   6785     { "vfmadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
   6786     { "vfmadd231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
   6787     { "vfmsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
   6788     { "vfmsub231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
   6789     { "vfnmadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
   6790     { "vfnmadd231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
   6791     { "vfnmsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
   6792     { "vfnmsub231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
   6793     /* c0 */
   6794     { Bad_Opcode },
   6795     { Bad_Opcode },
   6796     { Bad_Opcode },
   6797     { Bad_Opcode },
   6798     { Bad_Opcode },
   6799     { Bad_Opcode },
   6800     { Bad_Opcode },
   6801     { Bad_Opcode },
   6802     /* c8 */
   6803     { Bad_Opcode },
   6804     { Bad_Opcode },
   6805     { Bad_Opcode },
   6806     { PREFIX_TABLE (PREFIX_VEX_0F38CB) },
   6807     { PREFIX_TABLE (PREFIX_VEX_0F38CC) },
   6808     { PREFIX_TABLE (PREFIX_VEX_0F38CD) },
   6809     { Bad_Opcode },
   6810     { VEX_W_TABLE (VEX_W_0F38CF) },
   6811     /* d0 */
   6812     { Bad_Opcode },
   6813     { Bad_Opcode },
   6814     { VEX_W_TABLE (VEX_W_0F38D2) },
   6815     { VEX_W_TABLE (VEX_W_0F38D3) },
   6816     { Bad_Opcode },
   6817     { Bad_Opcode },
   6818     { Bad_Opcode },
   6819     { Bad_Opcode },
   6820     /* d8 */
   6821     { Bad_Opcode },
   6822     { Bad_Opcode },
   6823     { VEX_W_TABLE (VEX_W_0F38DA) },
   6824     { VEX_LEN_TABLE (VEX_LEN_0F38DB) },
   6825     { "vaesenc",	{ XM, Vex, EXx }, PREFIX_DATA },
   6826     { "vaesenclast",	{ XM, Vex, EXx }, PREFIX_DATA },
   6827     { "vaesdec",	{ XM, Vex, EXx }, PREFIX_DATA },
   6828     { "vaesdeclast",	{ XM, Vex, EXx }, PREFIX_DATA },
   6829     /* e0 */
   6830     { X86_64_TABLE (X86_64_VEX_0F38Ex) },
   6831     { X86_64_TABLE (X86_64_VEX_0F38Ex) },
   6832     { X86_64_TABLE (X86_64_VEX_0F38Ex) },
   6833     { X86_64_TABLE (X86_64_VEX_0F38Ex) },
   6834     { X86_64_TABLE (X86_64_VEX_0F38Ex) },
   6835     { X86_64_TABLE (X86_64_VEX_0F38Ex) },
   6836     { X86_64_TABLE (X86_64_VEX_0F38Ex) },
   6837     { X86_64_TABLE (X86_64_VEX_0F38Ex) },
   6838     /* e8 */
   6839     { X86_64_TABLE (X86_64_VEX_0F38Ex) },
   6840     { X86_64_TABLE (X86_64_VEX_0F38Ex) },
   6841     { X86_64_TABLE (X86_64_VEX_0F38Ex) },
   6842     { X86_64_TABLE (X86_64_VEX_0F38Ex) },
   6843     { X86_64_TABLE (X86_64_VEX_0F38Ex) },
   6844     { X86_64_TABLE (X86_64_VEX_0F38Ex) },
   6845     { X86_64_TABLE (X86_64_VEX_0F38Ex) },
   6846     { X86_64_TABLE (X86_64_VEX_0F38Ex) },
   6847     /* f0 */
   6848     { Bad_Opcode },
   6849     { Bad_Opcode },
   6850     { VEX_LEN_TABLE (VEX_LEN_0F38F2) },
   6851     { VEX_LEN_TABLE (VEX_LEN_0F38F3) },
   6852     { Bad_Opcode },
   6853     { VEX_LEN_TABLE (VEX_LEN_0F38F5) },
   6854     { VEX_LEN_TABLE (VEX_LEN_0F38F6) },
   6855     { VEX_LEN_TABLE (VEX_LEN_0F38F7) },
   6856     /* f8 */
   6857     { Bad_Opcode },
   6858     { Bad_Opcode },
   6859     { Bad_Opcode },
   6860     { Bad_Opcode },
   6861     { Bad_Opcode },
   6862     { Bad_Opcode },
   6863     { Bad_Opcode },
   6864     { Bad_Opcode },
   6865   },
   6866   /* VEX_0F3A */
   6867   {
   6868     /* 00 */
   6869     { VEX_LEN_TABLE (VEX_LEN_0F3A00) },
   6870     { VEX_LEN_TABLE (VEX_LEN_0F3A01) },
   6871     { VEX_W_TABLE (VEX_W_0F3A02) },
   6872     { Bad_Opcode },
   6873     { VEX_W_TABLE (VEX_W_0F3A04) },
   6874     { VEX_W_TABLE (VEX_W_0F3A05) },
   6875     { VEX_LEN_TABLE (VEX_LEN_0F3A06) },
   6876     { Bad_Opcode },
   6877     /* 08 */
   6878     { "vroundps",	{ XM, EXx, Ib }, PREFIX_DATA },
   6879     { "vroundpd",	{ XM, EXx, Ib }, PREFIX_DATA },
   6880     { "vroundss",	{ XMScalar, VexScalar, EXd, Ib }, PREFIX_DATA },
   6881     { "vroundsd",	{ XMScalar, VexScalar, EXq, Ib }, PREFIX_DATA },
   6882     { "vblendps",	{ XM, Vex, EXx, Ib }, PREFIX_DATA },
   6883     { "vblendpd",	{ XM, Vex, EXx, Ib }, PREFIX_DATA },
   6884     { "vpblendw",	{ XM, Vex, EXx, Ib }, PREFIX_DATA },
   6885     { "vpalignr",	{ XM, Vex, EXx, Ib }, PREFIX_DATA },
   6886     /* 10 */
   6887     { Bad_Opcode },
   6888     { Bad_Opcode },
   6889     { Bad_Opcode },
   6890     { Bad_Opcode },
   6891     { VEX_LEN_TABLE (VEX_LEN_0F3A14) },
   6892     { VEX_LEN_TABLE (VEX_LEN_0F3A15) },
   6893     { VEX_LEN_TABLE (VEX_LEN_0F3A16) },
   6894     { VEX_LEN_TABLE (VEX_LEN_0F3A17) },
   6895     /* 18 */
   6896     { VEX_LEN_TABLE (VEX_LEN_0F3A18) },
   6897     { VEX_LEN_TABLE (VEX_LEN_0F3A19) },
   6898     { Bad_Opcode },
   6899     { Bad_Opcode },
   6900     { Bad_Opcode },
   6901     { VEX_W_TABLE (VEX_W_0F3A1D) },
   6902     { Bad_Opcode },
   6903     { Bad_Opcode },
   6904     /* 20 */
   6905     { VEX_LEN_TABLE (VEX_LEN_0F3A20) },
   6906     { VEX_LEN_TABLE (VEX_LEN_0F3A21) },
   6907     { VEX_LEN_TABLE (VEX_LEN_0F3A22) },
   6908     { Bad_Opcode },
   6909     { Bad_Opcode },
   6910     { Bad_Opcode },
   6911     { Bad_Opcode },
   6912     { Bad_Opcode },
   6913     /* 28 */
   6914     { Bad_Opcode },
   6915     { Bad_Opcode },
   6916     { Bad_Opcode },
   6917     { Bad_Opcode },
   6918     { Bad_Opcode },
   6919     { Bad_Opcode },
   6920     { Bad_Opcode },
   6921     { Bad_Opcode },
   6922     /* 30 */
   6923     { VEX_LEN_TABLE (VEX_LEN_0F3A30) },
   6924     { VEX_LEN_TABLE (VEX_LEN_0F3A31) },
   6925     { VEX_LEN_TABLE (VEX_LEN_0F3A32) },
   6926     { VEX_LEN_TABLE (VEX_LEN_0F3A33) },
   6927     { Bad_Opcode },
   6928     { Bad_Opcode },
   6929     { Bad_Opcode },
   6930     { Bad_Opcode },
   6931     /* 38 */
   6932     { VEX_LEN_TABLE (VEX_LEN_0F3A38) },
   6933     { VEX_LEN_TABLE (VEX_LEN_0F3A39) },
   6934     { Bad_Opcode },
   6935     { Bad_Opcode },
   6936     { Bad_Opcode },
   6937     { Bad_Opcode },
   6938     { Bad_Opcode },
   6939     { Bad_Opcode },
   6940     /* 40 */
   6941     { "vdpps",		{ XM, Vex, EXx, Ib }, PREFIX_DATA },
   6942     { VEX_LEN_TABLE (VEX_LEN_0F3A41) },
   6943     { "vmpsadbw",	{ XM, Vex, EXx, Ib }, PREFIX_DATA },
   6944     { Bad_Opcode },
   6945     { "vpclmulqdq",	{ XM, Vex, EXx, PCLMUL }, PREFIX_DATA },
   6946     { Bad_Opcode },
   6947     { VEX_LEN_TABLE (VEX_LEN_0F3A46) },
   6948     { Bad_Opcode },
   6949     /* 48 */
   6950     { "vpermil2ps",	{ XM, Vex, EXx, XMVexI4, VexI4 }, PREFIX_DATA },
   6951     { "vpermil2pd",	{ XM, Vex, EXx, XMVexI4, VexI4 }, PREFIX_DATA },
   6952     { VEX_W_TABLE (VEX_W_0F3A4A) },
   6953     { VEX_W_TABLE (VEX_W_0F3A4B) },
   6954     { VEX_W_TABLE (VEX_W_0F3A4C) },
   6955     { Bad_Opcode },
   6956     { Bad_Opcode },
   6957     { Bad_Opcode },
   6958     /* 50 */
   6959     { Bad_Opcode },
   6960     { Bad_Opcode },
   6961     { Bad_Opcode },
   6962     { Bad_Opcode },
   6963     { Bad_Opcode },
   6964     { Bad_Opcode },
   6965     { Bad_Opcode },
   6966     { Bad_Opcode },
   6967     /* 58 */
   6968     { Bad_Opcode },
   6969     { Bad_Opcode },
   6970     { Bad_Opcode },
   6971     { Bad_Opcode },
   6972     { "vfmaddsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
   6973     { "vfmaddsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
   6974     { "vfmsubaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
   6975     { "vfmsubaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
   6976     /* 60 */
   6977     { VEX_LEN_TABLE (VEX_LEN_0F3A60) },
   6978     { VEX_LEN_TABLE (VEX_LEN_0F3A61) },
   6979     { VEX_LEN_TABLE (VEX_LEN_0F3A62) },
   6980     { VEX_LEN_TABLE (VEX_LEN_0F3A63) },
   6981     { Bad_Opcode },
   6982     { Bad_Opcode },
   6983     { Bad_Opcode },
   6984     { Bad_Opcode },
   6985     /* 68 */
   6986     { "vfmaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
   6987     { "vfmaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
   6988     { "vfmaddss",	{ XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA },
   6989     { "vfmaddsd",	{ XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA },
   6990     { "vfmsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
   6991     { "vfmsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
   6992     { "vfmsubss",	{ XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA },
   6993     { "vfmsubsd",	{ XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA },
   6994     /* 70 */
   6995     { Bad_Opcode },
   6996     { Bad_Opcode },
   6997     { Bad_Opcode },
   6998     { Bad_Opcode },
   6999     { Bad_Opcode },
   7000     { Bad_Opcode },
   7001     { Bad_Opcode },
   7002     { Bad_Opcode },
   7003     /* 78 */
   7004     { "vfnmaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
   7005     { "vfnmaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
   7006     { "vfnmaddss",	{ XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA },
   7007     { "vfnmaddsd",	{ XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA },
   7008     { "vfnmsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
   7009     { "vfnmsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
   7010     { "vfnmsubss",	{ XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA },
   7011     { "vfnmsubsd",	{ XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA },
   7012     /* 80 */
   7013     { Bad_Opcode },
   7014     { Bad_Opcode },
   7015     { Bad_Opcode },
   7016     { Bad_Opcode },
   7017     { Bad_Opcode },
   7018     { Bad_Opcode },
   7019     { Bad_Opcode },
   7020     { Bad_Opcode },
   7021     /* 88 */
   7022     { Bad_Opcode },
   7023     { Bad_Opcode },
   7024     { Bad_Opcode },
   7025     { Bad_Opcode },
   7026     { Bad_Opcode },
   7027     { Bad_Opcode },
   7028     { Bad_Opcode },
   7029     { Bad_Opcode },
   7030     /* 90 */
   7031     { Bad_Opcode },
   7032     { Bad_Opcode },
   7033     { Bad_Opcode },
   7034     { Bad_Opcode },
   7035     { Bad_Opcode },
   7036     { Bad_Opcode },
   7037     { Bad_Opcode },
   7038     { Bad_Opcode },
   7039     /* 98 */
   7040     { Bad_Opcode },
   7041     { Bad_Opcode },
   7042     { Bad_Opcode },
   7043     { Bad_Opcode },
   7044     { Bad_Opcode },
   7045     { Bad_Opcode },
   7046     { Bad_Opcode },
   7047     { Bad_Opcode },
   7048     /* a0 */
   7049     { Bad_Opcode },
   7050     { Bad_Opcode },
   7051     { Bad_Opcode },
   7052     { Bad_Opcode },
   7053     { Bad_Opcode },
   7054     { Bad_Opcode },
   7055     { Bad_Opcode },
   7056     { Bad_Opcode },
   7057     /* a8 */
   7058     { Bad_Opcode },
   7059     { Bad_Opcode },
   7060     { Bad_Opcode },
   7061     { Bad_Opcode },
   7062     { Bad_Opcode },
   7063     { Bad_Opcode },
   7064     { Bad_Opcode },
   7065     { Bad_Opcode },
   7066     /* b0 */
   7067     { Bad_Opcode },
   7068     { Bad_Opcode },
   7069     { Bad_Opcode },
   7070     { Bad_Opcode },
   7071     { Bad_Opcode },
   7072     { Bad_Opcode },
   7073     { Bad_Opcode },
   7074     { Bad_Opcode },
   7075     /* b8 */
   7076     { Bad_Opcode },
   7077     { Bad_Opcode },
   7078     { Bad_Opcode },
   7079     { Bad_Opcode },
   7080     { Bad_Opcode },
   7081     { Bad_Opcode },
   7082     { Bad_Opcode },
   7083     { Bad_Opcode },
   7084     /* c0 */
   7085     { Bad_Opcode },
   7086     { Bad_Opcode },
   7087     { Bad_Opcode },
   7088     { Bad_Opcode },
   7089     { Bad_Opcode },
   7090     { Bad_Opcode },
   7091     { Bad_Opcode },
   7092     { Bad_Opcode },
   7093     /* c8 */
   7094     { Bad_Opcode },
   7095     { Bad_Opcode },
   7096     { Bad_Opcode },
   7097     { Bad_Opcode },
   7098     { Bad_Opcode },
   7099     { Bad_Opcode },
   7100     { VEX_W_TABLE (VEX_W_0F3ACE) },
   7101     { VEX_W_TABLE (VEX_W_0F3ACF) },
   7102     /* d0 */
   7103     { Bad_Opcode },
   7104     { Bad_Opcode },
   7105     { Bad_Opcode },
   7106     { Bad_Opcode },
   7107     { Bad_Opcode },
   7108     { Bad_Opcode },
   7109     { Bad_Opcode },
   7110     { Bad_Opcode },
   7111     /* d8 */
   7112     { Bad_Opcode },
   7113     { Bad_Opcode },
   7114     { Bad_Opcode },
   7115     { Bad_Opcode },
   7116     { Bad_Opcode },
   7117     { Bad_Opcode },
   7118     { VEX_W_TABLE (VEX_W_0F3ADE) },
   7119     { VEX_LEN_TABLE (VEX_LEN_0F3ADF) },
   7120     /* e0 */
   7121     { Bad_Opcode },
   7122     { Bad_Opcode },
   7123     { Bad_Opcode },
   7124     { Bad_Opcode },
   7125     { Bad_Opcode },
   7126     { Bad_Opcode },
   7127     { Bad_Opcode },
   7128     { Bad_Opcode },
   7129     /* e8 */
   7130     { Bad_Opcode },
   7131     { Bad_Opcode },
   7132     { Bad_Opcode },
   7133     { Bad_Opcode },
   7134     { Bad_Opcode },
   7135     { Bad_Opcode },
   7136     { Bad_Opcode },
   7137     { Bad_Opcode },
   7138     /* f0 */
   7139     { VEX_LEN_TABLE (VEX_LEN_0F3AF0) },
   7140     { Bad_Opcode },
   7141     { Bad_Opcode },
   7142     { Bad_Opcode },
   7143     { Bad_Opcode },
   7144     { Bad_Opcode },
   7145     { Bad_Opcode },
   7146     { Bad_Opcode },
   7147     /* f8 */
   7148     { Bad_Opcode },
   7149     { Bad_Opcode },
   7150     { Bad_Opcode },
   7151     { Bad_Opcode },
   7152     { Bad_Opcode },
   7153     { Bad_Opcode },
   7154     { Bad_Opcode },
   7155     { Bad_Opcode },
   7156   },
   7157 };
   7158 
   7159 #include "i386-dis-evex.h"
   7160 
   7161 static const struct dis386 vex_len_table[][2] = {
   7162   /* VEX_LEN_0F12_P_0 */
   7163   {
   7164     { MOD_TABLE (MOD_0F12_PREFIX_0) },
   7165   },
   7166 
   7167   /* VEX_LEN_0F12_P_2 */
   7168   {
   7169     { "%XEVmovlpYX",	{ XM, Vex, Mq }, 0 },
   7170   },
   7171 
   7172   /* VEX_LEN_0F13 */
   7173   {
   7174     { "%XEVmovlpYX",	{ Mq, XM }, PREFIX_OPCODE },
   7175   },
   7176 
   7177   /* VEX_LEN_0F16_P_0 */
   7178   {
   7179     { MOD_TABLE (MOD_0F16_PREFIX_0) },
   7180   },
   7181 
   7182   /* VEX_LEN_0F16_P_2 */
   7183   {
   7184     { "%XEVmovhpYX",	{ XM, Vex, Mq }, 0 },
   7185   },
   7186 
   7187   /* VEX_LEN_0F17 */
   7188   {
   7189     { "%XEVmovhpYX",	{ Mq, XM }, PREFIX_OPCODE },
   7190   },
   7191 
   7192   /* VEX_LEN_0F41 */
   7193   {
   7194     { Bad_Opcode },
   7195     { VEX_W_TABLE (VEX_W_0F41_L_1) },
   7196   },
   7197 
   7198   /* VEX_LEN_0F42 */
   7199   {
   7200     { Bad_Opcode },
   7201     { VEX_W_TABLE (VEX_W_0F42_L_1) },
   7202   },
   7203 
   7204   /* VEX_LEN_0F44 */
   7205   {
   7206     { VEX_W_TABLE (VEX_W_0F44_L_0) },
   7207   },
   7208 
   7209   /* VEX_LEN_0F45 */
   7210   {
   7211     { Bad_Opcode },
   7212     { VEX_W_TABLE (VEX_W_0F45_L_1) },
   7213   },
   7214 
   7215   /* VEX_LEN_0F46 */
   7216   {
   7217     { Bad_Opcode },
   7218     { VEX_W_TABLE (VEX_W_0F46_L_1) },
   7219   },
   7220 
   7221   /* VEX_LEN_0F47 */
   7222   {
   7223     { Bad_Opcode },
   7224     { VEX_W_TABLE (VEX_W_0F47_L_1) },
   7225   },
   7226 
   7227   /* VEX_LEN_0F4A */
   7228   {
   7229     { Bad_Opcode },
   7230     { VEX_W_TABLE (VEX_W_0F4A_L_1) },
   7231   },
   7232 
   7233   /* VEX_LEN_0F4B */
   7234   {
   7235     { Bad_Opcode },
   7236     { VEX_W_TABLE (VEX_W_0F4B_L_1) },
   7237   },
   7238 
   7239   /* VEX_LEN_0F6E */
   7240   {
   7241     { "%XEvmovYK",	{ XMScalar, Edq }, PREFIX_DATA },
   7242   },
   7243 
   7244   /* VEX_LEN_0F77 */
   7245   {
   7246     { "vzeroupper",	{ XX }, 0 },
   7247     { "vzeroall",	{ XX }, 0 },
   7248   },
   7249 
   7250   /* VEX_LEN_0F7E_P_1 */
   7251   {
   7252     { "%XEvmovqY",	{ XMScalar, EXq }, 0 },
   7253   },
   7254 
   7255   /* VEX_LEN_0F7E_P_2 */
   7256   {
   7257     { "%XEvmovK",	{ Edq, XMScalar }, 0 },
   7258   },
   7259 
   7260   /* VEX_LEN_0F90 */
   7261   {
   7262     { VEX_W_TABLE (VEX_W_0F90_L_0) },
   7263   },
   7264 
   7265   /* VEX_LEN_0F91 */
   7266   {
   7267     { VEX_W_TABLE (VEX_W_0F91_L_0) },
   7268   },
   7269 
   7270   /* VEX_LEN_0F92 */
   7271   {
   7272     { VEX_W_TABLE (VEX_W_0F92_L_0) },
   7273   },
   7274 
   7275   /* VEX_LEN_0F93 */
   7276   {
   7277     { VEX_W_TABLE (VEX_W_0F93_L_0) },
   7278   },
   7279 
   7280   /* VEX_LEN_0F98 */
   7281   {
   7282     { VEX_W_TABLE (VEX_W_0F98_L_0) },
   7283   },
   7284 
   7285   /* VEX_LEN_0F99 */
   7286   {
   7287     { VEX_W_TABLE (VEX_W_0F99_L_0) },
   7288   },
   7289 
   7290   /* VEX_LEN_0FAE_R_2 */
   7291   {
   7292     { "vldmxcsr",	{ Md }, 0 },
   7293   },
   7294 
   7295   /* VEX_LEN_0FAE_R_3 */
   7296   {
   7297     { "vstmxcsr",	{ Md }, 0 },
   7298   },
   7299 
   7300   /* VEX_LEN_0FC4 */
   7301   {
   7302     { "%XEvpinsrwY",	{ XM, Vex, Edw, Ib }, PREFIX_DATA },
   7303   },
   7304 
   7305   /* VEX_LEN_0FD6 */
   7306   {
   7307     { "%XEvmovqY",	{ EXqS, XMScalar }, PREFIX_DATA },
   7308   },
   7309 
   7310   /* VEX_LEN_0F3816 */
   7311   {
   7312     { Bad_Opcode },
   7313     { VEX_W_TABLE (VEX_W_0F3816_L_1) },
   7314   },
   7315 
   7316   /* VEX_LEN_0F3819 */
   7317   {
   7318     { Bad_Opcode },
   7319     { VEX_W_TABLE (VEX_W_0F3819_L_1) },
   7320   },
   7321 
   7322   /* VEX_LEN_0F381A */
   7323   {
   7324     { Bad_Opcode },
   7325     { VEX_W_TABLE (VEX_W_0F381A_L_1) },
   7326   },
   7327 
   7328   /* VEX_LEN_0F3836 */
   7329   {
   7330     { Bad_Opcode },
   7331     { VEX_W_TABLE (VEX_W_0F3836) },
   7332   },
   7333 
   7334   /* VEX_LEN_0F3841 */
   7335   {
   7336     { "vphminposuw",	{ XM, EXx }, PREFIX_DATA },
   7337   },
   7338 
   7339   /* VEX_LEN_0F3848_X86_64 */
   7340   {
   7341     { VEX_W_TABLE (VEX_W_0F3848_X86_64_L_0) },
   7342   },
   7343 
   7344   /* VEX_LEN_0F3849_X86_64 */
   7345   {
   7346     { VEX_W_TABLE (VEX_W_0F3849_X86_64_L_0) },
   7347   },
   7348 
   7349   /* VEX_LEN_0F384A_X86_64_W_0 */
   7350   {
   7351     { PREFIX_TABLE (PREFIX_VEX_0F384A_X86_64_W_0_L_0) },
   7352   },
   7353 
   7354   /* VEX_LEN_0F384B_X86_64 */
   7355   {
   7356     { VEX_W_TABLE (VEX_W_0F384B_X86_64_L_0) },
   7357   },
   7358 
   7359   /* VEX_LEN_0F385A */
   7360   {
   7361     { Bad_Opcode },
   7362     { VEX_W_TABLE (VEX_W_0F385A_L_0) },
   7363   },
   7364 
   7365   /* VEX_LEN_0F385C_X86_64 */
   7366   {
   7367     { VEX_W_TABLE (VEX_W_0F385C_X86_64_L_0) },
   7368   },
   7369 
   7370   /* VEX_LEN_0F385E_X86_64 */
   7371   {
   7372     { VEX_W_TABLE (VEX_W_0F385E_X86_64_L_0) },
   7373   },
   7374 
   7375   /* VEX_LEN_0F385F_X86_64 */
   7376   {
   7377     { VEX_W_TABLE (VEX_W_0F385F_X86_64_L_0) },
   7378   },
   7379 
   7380   /* VEX_LEN_0F386B_X86_64 */
   7381   {
   7382     { VEX_W_TABLE (VEX_W_0F386B_X86_64_L_0) },
   7383   },
   7384 
   7385   /* VEX_LEN_0F386C_X86_64 */
   7386   {
   7387     { VEX_W_TABLE (VEX_W_0F386C_X86_64_L_0) },
   7388   },
   7389 
   7390   /* VEX_LEN_0F386E_X86_64 */
   7391   {
   7392     { VEX_W_TABLE (VEX_W_0F386E_X86_64_L_0) },
   7393   },
   7394 
   7395   /* VEX_LEN_0F386F_X86_64 */
   7396   {
   7397     { VEX_W_TABLE (VEX_W_0F386F_X86_64_L_0) },
   7398   },
   7399 
   7400   /* VEX_LEN_0F38CB_P_3_W_0 */
   7401   {
   7402     { Bad_Opcode },
   7403     { "vsha512rnds2", { XM, Vex, Rxmmq }, 0 },
   7404   },
   7405 
   7406   /* VEX_LEN_0F38CC_P_3_W_0 */
   7407   {
   7408     { Bad_Opcode },
   7409     { "vsha512msg1", { XM, Rxmmq }, 0 },
   7410   },
   7411 
   7412   /* VEX_LEN_0F38CD_P_3_W_0 */
   7413   {
   7414     { Bad_Opcode },
   7415     { "vsha512msg2", { XM, Rymm }, 0 },
   7416   },
   7417 
   7418   /* VEX_LEN_0F38DA_W_0_P_0 */
   7419   {
   7420     { "vsm3msg1", { XM, Vex, EXxmm }, 0 },
   7421   },
   7422 
   7423   /* VEX_LEN_0F38DA_W_0_P_2 */
   7424   {
   7425     { "vsm3msg2", { XM, Vex, EXxmm }, 0 },
   7426   },
   7427 
   7428   /* VEX_LEN_0F38DB */
   7429   {
   7430     { "vaesimc",	{ XM, EXx }, PREFIX_DATA },
   7431   },
   7432 
   7433   /* VEX_LEN_0F38F2 */
   7434   {
   7435     { PREFIX_TABLE (PREFIX_VEX_0F38F2_L_0) },
   7436   },
   7437 
   7438   /* VEX_LEN_0F38F3 */
   7439   {
   7440     { PREFIX_TABLE (PREFIX_VEX_0F38F3_L_0) },
   7441   },
   7442 
   7443   /* VEX_LEN_0F38F5 */
   7444   {
   7445     { PREFIX_TABLE(PREFIX_VEX_0F38F5_L_0) },
   7446   },
   7447 
   7448   /* VEX_LEN_0F38F6 */
   7449   {
   7450     { PREFIX_TABLE(PREFIX_VEX_0F38F6_L_0) },
   7451   },
   7452 
   7453   /* VEX_LEN_0F38F7 */
   7454   {
   7455     { PREFIX_TABLE(PREFIX_VEX_0F38F7_L_0) },
   7456   },
   7457 
   7458   /* VEX_LEN_0F3A00 */
   7459   {
   7460     { Bad_Opcode },
   7461     { VEX_W_TABLE (VEX_W_0F3A00_L_1) },
   7462   },
   7463 
   7464   /* VEX_LEN_0F3A01 */
   7465   {
   7466     { Bad_Opcode },
   7467     { VEX_W_TABLE (VEX_W_0F3A01_L_1) },
   7468   },
   7469 
   7470   /* VEX_LEN_0F3A06 */
   7471   {
   7472     { Bad_Opcode },
   7473     { VEX_W_TABLE (VEX_W_0F3A06_L_1) },
   7474   },
   7475 
   7476   /* VEX_LEN_0F3A14 */
   7477   {
   7478     { "%XEvpextrb",	{ Edb, XM, Ib }, PREFIX_DATA },
   7479   },
   7480 
   7481   /* VEX_LEN_0F3A15 */
   7482   {
   7483     { "%XEvpextrw",	{ Edw, XM, Ib }, PREFIX_DATA },
   7484   },
   7485 
   7486   /* VEX_LEN_0F3A16  */
   7487   {
   7488     { "%XEvpextrK",	{ Edq, XM, Ib }, PREFIX_DATA },
   7489   },
   7490 
   7491   /* VEX_LEN_0F3A17 */
   7492   {
   7493     { "%XEvextractps",	{ Ed, XM, Ib }, PREFIX_DATA },
   7494   },
   7495 
   7496   /* VEX_LEN_0F3A18 */
   7497   {
   7498     { Bad_Opcode },
   7499     { VEX_W_TABLE (VEX_W_0F3A18_L_1) },
   7500   },
   7501 
   7502   /* VEX_LEN_0F3A19 */
   7503   {
   7504     { Bad_Opcode },
   7505     { VEX_W_TABLE (VEX_W_0F3A19_L_1) },
   7506   },
   7507 
   7508   /* VEX_LEN_0F3A20 */
   7509   {
   7510     { "%XEvpinsrbY",	{ XM, Vex, Edb, Ib }, PREFIX_DATA },
   7511   },
   7512 
   7513   /* VEX_LEN_0F3A21 */
   7514   {
   7515     { "%XEvinsertpsY",	{ XM, Vex, EXd, Ib }, PREFIX_DATA },
   7516   },
   7517 
   7518   /* VEX_LEN_0F3A22 */
   7519   {
   7520     { "%XEvpinsrYK",	{ XM, Vex, Edq, Ib }, PREFIX_DATA },
   7521   },
   7522 
   7523   /* VEX_LEN_0F3A30 */
   7524   {
   7525     { "kshiftr%BW",	{ MaskG, MaskR, Ib }, PREFIX_DATA },
   7526   },
   7527 
   7528   /* VEX_LEN_0F3A31 */
   7529   {
   7530     { "kshiftr%DQ",	{ MaskG, MaskR, Ib }, PREFIX_DATA },
   7531   },
   7532 
   7533   /* VEX_LEN_0F3A32 */
   7534   {
   7535     { "kshiftl%BW",	{ MaskG, MaskR, Ib }, PREFIX_DATA },
   7536   },
   7537 
   7538   /* VEX_LEN_0F3A33 */
   7539   {
   7540     { "kshiftl%DQ",	{ MaskG, MaskR, Ib }, PREFIX_DATA },
   7541   },
   7542 
   7543   /* VEX_LEN_0F3A38 */
   7544   {
   7545     { Bad_Opcode },
   7546     { VEX_W_TABLE (VEX_W_0F3A38_L_1) },
   7547   },
   7548 
   7549   /* VEX_LEN_0F3A39 */
   7550   {
   7551     { Bad_Opcode },
   7552     { VEX_W_TABLE (VEX_W_0F3A39_L_1) },
   7553   },
   7554 
   7555   /* VEX_LEN_0F3A41 */
   7556   {
   7557     { "vdppd",		{ XM, Vex, EXx, Ib }, PREFIX_DATA },
   7558   },
   7559 
   7560   /* VEX_LEN_0F3A46 */
   7561   {
   7562     { Bad_Opcode },
   7563     { VEX_W_TABLE (VEX_W_0F3A46_L_1) },
   7564   },
   7565 
   7566   /* VEX_LEN_0F3A60 */
   7567   {
   7568     { "vpcmpestrm!%LQ",	{ XM, EXx, Ib }, PREFIX_DATA },
   7569   },
   7570 
   7571   /* VEX_LEN_0F3A61 */
   7572   {
   7573     { "vpcmpestri!%LQ",	{ XM, EXx, Ib }, PREFIX_DATA },
   7574   },
   7575 
   7576   /* VEX_LEN_0F3A62 */
   7577   {
   7578     { "vpcmpistrm",	{ XM, EXx, Ib }, PREFIX_DATA },
   7579   },
   7580 
   7581   /* VEX_LEN_0F3A63 */
   7582   {
   7583     { "vpcmpistri",	{ XM, EXx, Ib }, PREFIX_DATA },
   7584   },
   7585 
   7586   /* VEX_LEN_0F3ADE_W_0 */
   7587   {
   7588     { "vsm3rnds2", { XM, Vex, EXxmm, Ib }, PREFIX_DATA },
   7589   },
   7590 
   7591   /* VEX_LEN_0F3ADF */
   7592   {
   7593     { "vaeskeygenassist", { XM, EXx, Ib }, PREFIX_DATA },
   7594   },
   7595 
   7596   /* VEX_LEN_0F3AF0 */
   7597   {
   7598     { PREFIX_TABLE (PREFIX_VEX_0F3AF0_L_0) },
   7599   },
   7600 
   7601   /* VEX_LEN_MAP5_F8_X86_64 */
   7602   {
   7603     { VEX_W_TABLE (VEX_W_MAP5_F8_X86_64_L_0) },
   7604   },
   7605 
   7606   /* VEX_LEN_MAP5_F9_X86_64 */
   7607   {
   7608     { VEX_W_TABLE (VEX_W_MAP5_F9_X86_64_L_0) },
   7609   },
   7610 
   7611   /* VEX_LEN_MAP5_FD_X86_64 */
   7612   {
   7613     { VEX_W_TABLE (VEX_W_MAP5_FD_X86_64_L_0) },
   7614   },
   7615 
   7616   /* VEX_LEN_MAP7_F6 */
   7617   {
   7618     { VEX_W_TABLE (VEX_W_MAP7_F6_L_0) },
   7619   },
   7620 
   7621   /* VEX_LEN_MAP7_F8 */
   7622   {
   7623     { VEX_W_TABLE (VEX_W_MAP7_F8_L_0) },
   7624   },
   7625 
   7626   /* VEX_LEN_XOP_08_85 */
   7627   {
   7628     { VEX_W_TABLE (VEX_W_XOP_08_85_L_0) },
   7629   },
   7630 
   7631   /* VEX_LEN_XOP_08_86 */
   7632   {
   7633     { VEX_W_TABLE (VEX_W_XOP_08_86_L_0) },
   7634   },
   7635 
   7636   /* VEX_LEN_XOP_08_87 */
   7637   {
   7638     { VEX_W_TABLE (VEX_W_XOP_08_87_L_0) },
   7639   },
   7640 
   7641   /* VEX_LEN_XOP_08_8E */
   7642   {
   7643     { VEX_W_TABLE (VEX_W_XOP_08_8E_L_0) },
   7644   },
   7645 
   7646   /* VEX_LEN_XOP_08_8F */
   7647   {
   7648     { VEX_W_TABLE (VEX_W_XOP_08_8F_L_0) },
   7649   },
   7650 
   7651   /* VEX_LEN_XOP_08_95 */
   7652   {
   7653     { VEX_W_TABLE (VEX_W_XOP_08_95_L_0) },
   7654   },
   7655 
   7656   /* VEX_LEN_XOP_08_96 */
   7657   {
   7658     { VEX_W_TABLE (VEX_W_XOP_08_96_L_0) },
   7659   },
   7660 
   7661   /* VEX_LEN_XOP_08_97 */
   7662   {
   7663     { VEX_W_TABLE (VEX_W_XOP_08_97_L_0) },
   7664   },
   7665 
   7666   /* VEX_LEN_XOP_08_9E */
   7667   {
   7668     { VEX_W_TABLE (VEX_W_XOP_08_9E_L_0) },
   7669   },
   7670 
   7671   /* VEX_LEN_XOP_08_9F */
   7672   {
   7673     { VEX_W_TABLE (VEX_W_XOP_08_9F_L_0) },
   7674   },
   7675 
   7676   /* VEX_LEN_XOP_08_A3 */
   7677   {
   7678     { "vpperm", 	{ XM, Vex, EXx, XMVexI4 }, 0 },
   7679   },
   7680 
   7681   /* VEX_LEN_XOP_08_A6 */
   7682   {
   7683     { VEX_W_TABLE (VEX_W_XOP_08_A6_L_0) },
   7684   },
   7685 
   7686   /* VEX_LEN_XOP_08_B6 */
   7687   {
   7688     { VEX_W_TABLE (VEX_W_XOP_08_B6_L_0) },
   7689   },
   7690 
   7691   /* VEX_LEN_XOP_08_C0 */
   7692   {
   7693     { VEX_W_TABLE (VEX_W_XOP_08_C0_L_0) },
   7694   },
   7695 
   7696   /* VEX_LEN_XOP_08_C1 */
   7697   {
   7698     { VEX_W_TABLE (VEX_W_XOP_08_C1_L_0) },
   7699   },
   7700 
   7701   /* VEX_LEN_XOP_08_C2 */
   7702   {
   7703     { VEX_W_TABLE (VEX_W_XOP_08_C2_L_0) },
   7704   },
   7705 
   7706   /* VEX_LEN_XOP_08_C3 */
   7707   {
   7708     { VEX_W_TABLE (VEX_W_XOP_08_C3_L_0) },
   7709   },
   7710 
   7711   /* VEX_LEN_XOP_08_CC */
   7712   {
   7713     { VEX_W_TABLE (VEX_W_XOP_08_CC_L_0) },
   7714   },
   7715 
   7716   /* VEX_LEN_XOP_08_CD */
   7717   {
   7718     { VEX_W_TABLE (VEX_W_XOP_08_CD_L_0) },
   7719   },
   7720 
   7721   /* VEX_LEN_XOP_08_CE */
   7722   {
   7723     { VEX_W_TABLE (VEX_W_XOP_08_CE_L_0) },
   7724   },
   7725 
   7726   /* VEX_LEN_XOP_08_CF */
   7727   {
   7728     { VEX_W_TABLE (VEX_W_XOP_08_CF_L_0) },
   7729   },
   7730 
   7731   /* VEX_LEN_XOP_08_EC */
   7732   {
   7733     { VEX_W_TABLE (VEX_W_XOP_08_EC_L_0) },
   7734   },
   7735 
   7736   /* VEX_LEN_XOP_08_ED */
   7737   {
   7738     { VEX_W_TABLE (VEX_W_XOP_08_ED_L_0) },
   7739   },
   7740 
   7741   /* VEX_LEN_XOP_08_EE */
   7742   {
   7743     { VEX_W_TABLE (VEX_W_XOP_08_EE_L_0) },
   7744   },
   7745 
   7746   /* VEX_LEN_XOP_08_EF */
   7747   {
   7748     { VEX_W_TABLE (VEX_W_XOP_08_EF_L_0) },
   7749   },
   7750 
   7751   /* VEX_LEN_XOP_09_01 */
   7752   {
   7753     { REG_TABLE (REG_XOP_09_01_L_0) },
   7754   },
   7755 
   7756   /* VEX_LEN_XOP_09_02 */
   7757   {
   7758     { REG_TABLE (REG_XOP_09_02_L_0) },
   7759   },
   7760 
   7761   /* VEX_LEN_XOP_09_12 */
   7762   {
   7763     { REG_TABLE (REG_XOP_09_12_L_0) },
   7764   },
   7765 
   7766   /* VEX_LEN_XOP_09_82_W_0 */
   7767   {
   7768     { "vfrczss", 	{ XM, EXd }, 0 },
   7769   },
   7770 
   7771   /* VEX_LEN_XOP_09_83_W_0 */
   7772   {
   7773     { "vfrczsd", 	{ XM, EXq }, 0 },
   7774   },
   7775 
   7776   /* VEX_LEN_XOP_09_90 */
   7777   {
   7778     { "vprotb",		{ XM, EXx, VexW }, 0 },
   7779   },
   7780 
   7781   /* VEX_LEN_XOP_09_91 */
   7782   {
   7783     { "vprotw",		{ XM, EXx, VexW }, 0 },
   7784   },
   7785 
   7786   /* VEX_LEN_XOP_09_92 */
   7787   {
   7788     { "vprotd",		{ XM, EXx, VexW }, 0 },
   7789   },
   7790 
   7791   /* VEX_LEN_XOP_09_93 */
   7792   {
   7793     { "vprotq",		{ XM, EXx, VexW }, 0 },
   7794   },
   7795 
   7796   /* VEX_LEN_XOP_09_94 */
   7797   {
   7798     { "vpshlb",		{ XM, EXx, VexW }, 0 },
   7799   },
   7800 
   7801   /* VEX_LEN_XOP_09_95 */
   7802   {
   7803     { "vpshlw",		{ XM, EXx, VexW }, 0 },
   7804   },
   7805 
   7806   /* VEX_LEN_XOP_09_96 */
   7807   {
   7808     { "vpshld",		{ XM, EXx, VexW }, 0 },
   7809   },
   7810 
   7811   /* VEX_LEN_XOP_09_97 */
   7812   {
   7813     { "vpshlq",		{ XM, EXx, VexW }, 0 },
   7814   },
   7815 
   7816   /* VEX_LEN_XOP_09_98 */
   7817   {
   7818     { "vpshab",		{ XM, EXx, VexW }, 0 },
   7819   },
   7820 
   7821   /* VEX_LEN_XOP_09_99 */
   7822   {
   7823     { "vpshaw",		{ XM, EXx, VexW }, 0 },
   7824   },
   7825 
   7826   /* VEX_LEN_XOP_09_9A */
   7827   {
   7828     { "vpshad",		{ XM, EXx, VexW }, 0 },
   7829   },
   7830 
   7831   /* VEX_LEN_XOP_09_9B */
   7832   {
   7833     { "vpshaq",		{ XM, EXx, VexW }, 0 },
   7834   },
   7835 
   7836   /* VEX_LEN_XOP_09_C1 */
   7837   {
   7838     { VEX_W_TABLE (VEX_W_XOP_09_C1_L_0) },
   7839   },
   7840 
   7841   /* VEX_LEN_XOP_09_C2 */
   7842   {
   7843     { VEX_W_TABLE (VEX_W_XOP_09_C2_L_0) },
   7844   },
   7845 
   7846   /* VEX_LEN_XOP_09_C3 */
   7847   {
   7848     { VEX_W_TABLE (VEX_W_XOP_09_C3_L_0) },
   7849   },
   7850 
   7851   /* VEX_LEN_XOP_09_C6 */
   7852   {
   7853     { VEX_W_TABLE (VEX_W_XOP_09_C6_L_0) },
   7854   },
   7855 
   7856   /* VEX_LEN_XOP_09_C7 */
   7857   {
   7858     { VEX_W_TABLE (VEX_W_XOP_09_C7_L_0) },
   7859   },
   7860 
   7861   /* VEX_LEN_XOP_09_CB */
   7862   {
   7863     { VEX_W_TABLE (VEX_W_XOP_09_CB_L_0) },
   7864   },
   7865 
   7866   /* VEX_LEN_XOP_09_D1 */
   7867   {
   7868     { VEX_W_TABLE (VEX_W_XOP_09_D1_L_0) },
   7869   },
   7870 
   7871   /* VEX_LEN_XOP_09_D2 */
   7872   {
   7873     { VEX_W_TABLE (VEX_W_XOP_09_D2_L_0) },
   7874   },
   7875 
   7876   /* VEX_LEN_XOP_09_D3 */
   7877   {
   7878     { VEX_W_TABLE (VEX_W_XOP_09_D3_L_0) },
   7879   },
   7880 
   7881   /* VEX_LEN_XOP_09_D6 */
   7882   {
   7883     { VEX_W_TABLE (VEX_W_XOP_09_D6_L_0) },
   7884   },
   7885 
   7886   /* VEX_LEN_XOP_09_D7 */
   7887   {
   7888     { VEX_W_TABLE (VEX_W_XOP_09_D7_L_0) },
   7889   },
   7890 
   7891   /* VEX_LEN_XOP_09_DB */
   7892   {
   7893     { VEX_W_TABLE (VEX_W_XOP_09_DB_L_0) },
   7894   },
   7895 
   7896   /* VEX_LEN_XOP_09_E1 */
   7897   {
   7898     { VEX_W_TABLE (VEX_W_XOP_09_E1_L_0) },
   7899   },
   7900 
   7901   /* VEX_LEN_XOP_09_E2 */
   7902   {
   7903     { VEX_W_TABLE (VEX_W_XOP_09_E2_L_0) },
   7904   },
   7905 
   7906   /* VEX_LEN_XOP_09_E3 */
   7907   {
   7908     { VEX_W_TABLE (VEX_W_XOP_09_E3_L_0) },
   7909   },
   7910 
   7911   /* VEX_LEN_XOP_0A_12 */
   7912   {
   7913     { REG_TABLE (REG_XOP_0A_12_L_0) },
   7914   },
   7915 };
   7916 
   7917 #include "i386-dis-evex-len.h"
   7918 
   7919 static const struct dis386 vex_w_table[][2] = {
   7920   {
   7921     /* VEX_W_0F41_L_1_M_1 */
   7922     { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_W_0) },
   7923     { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_W_1) },
   7924   },
   7925   {
   7926     /* VEX_W_0F42_L_1_M_1 */
   7927     { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_W_0) },
   7928     { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_W_1) },
   7929   },
   7930   {
   7931     /* VEX_W_0F44_L_0_M_1 */
   7932     { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_W_0) },
   7933     { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_W_1) },
   7934   },
   7935   {
   7936     /* VEX_W_0F45_L_1_M_1 */
   7937     { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_W_0) },
   7938     { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_W_1) },
   7939   },
   7940   {
   7941     /* VEX_W_0F46_L_1_M_1 */
   7942     { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_W_0) },
   7943     { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_W_1) },
   7944   },
   7945   {
   7946     /* VEX_W_0F47_L_1_M_1 */
   7947     { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_W_0) },
   7948     { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_W_1) },
   7949   },
   7950   {
   7951     /* VEX_W_0F4A_L_1_M_1 */
   7952     { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_W_0) },
   7953     { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_W_1) },
   7954   },
   7955   {
   7956     /* VEX_W_0F4B_L_1_M_1 */
   7957     { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_W_0) },
   7958     { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_W_1) },
   7959   },
   7960   {
   7961     /* VEX_W_0F90_L_0 */
   7962     { PREFIX_TABLE (PREFIX_VEX_0F90_L_0_W_0) },
   7963     { PREFIX_TABLE (PREFIX_VEX_0F90_L_0_W_1) },
   7964   },
   7965   {
   7966     /* VEX_W_0F91_L_0_M_0 */
   7967     { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_W_0) },
   7968     { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_W_1) },
   7969   },
   7970   {
   7971     /* VEX_W_0F92_L_0_M_1 */
   7972     { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_W_0) },
   7973     { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_W_1) },
   7974   },
   7975   {
   7976     /* VEX_W_0F93_L_0_M_1 */
   7977     { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_W_0) },
   7978     { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_W_1) },
   7979   },
   7980   {
   7981     /* VEX_W_0F98_L_0_M_1 */
   7982     { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_W_0) },
   7983     { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_W_1) },
   7984   },
   7985   {
   7986     /* VEX_W_0F99_L_0_M_1 */
   7987     { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_W_0) },
   7988     { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_W_1) },
   7989   },
   7990   {
   7991     /* VEX_W_0F380C  */
   7992     { "%XEvpermilps",	{ XM, Vex, EXx }, PREFIX_DATA },
   7993   },
   7994   {
   7995     /* VEX_W_0F380D  */
   7996     { "vpermilpd",	{ XM, Vex, EXx }, PREFIX_DATA },
   7997   },
   7998   {
   7999     /* VEX_W_0F380E  */
   8000     { "vtestps",	{ XM, EXx }, PREFIX_DATA },
   8001   },
   8002   {
   8003     /* VEX_W_0F380F  */
   8004     { "vtestpd",	{ XM, EXx }, PREFIX_DATA },
   8005   },
   8006   {
   8007     /* VEX_W_0F3813 */
   8008     { "vcvtph2ps", { XM, EXxmmq }, PREFIX_DATA },
   8009   },
   8010   {
   8011     /* VEX_W_0F3816_L_1  */
   8012     { "vpermps",	{ XM, Vex, EXx }, PREFIX_DATA },
   8013   },
   8014   {
   8015     /* VEX_W_0F3818 */
   8016     { "%XEvbroadcastss",	{ XM, EXd }, PREFIX_DATA },
   8017   },
   8018   {
   8019     /* VEX_W_0F3819_L_1 */
   8020     { "vbroadcastsd",	{ XM, EXq }, PREFIX_DATA },
   8021   },
   8022   {
   8023     /* VEX_W_0F381A_L_1 */
   8024     { "vbroadcastf128",	{ XM, Mxmm }, PREFIX_DATA },
   8025   },
   8026   {
   8027     /* VEX_W_0F382C */
   8028     { "vmaskmovps",	{ XM, Vex, Mx }, PREFIX_DATA },
   8029   },
   8030   {
   8031     /* VEX_W_0F382D */
   8032     { "vmaskmovpd",	{ XM, Vex, Mx }, PREFIX_DATA },
   8033   },
   8034   {
   8035     /* VEX_W_0F382E */
   8036     { "vmaskmovps",	{ Mx, Vex, XM }, PREFIX_DATA },
   8037   },
   8038   {
   8039     /* VEX_W_0F382F */
   8040     { "vmaskmovpd",	{ Mx, Vex, XM }, PREFIX_DATA },
   8041   },
   8042   {
   8043     /* VEX_W_0F3836  */
   8044     { "vpermd",		{ XM, Vex, EXx }, PREFIX_DATA },
   8045   },
   8046   {
   8047     /* VEX_W_0F3846 */
   8048     { "vpsravd",	{ XM, Vex, EXx }, PREFIX_DATA },
   8049   },
   8050   {
   8051     /* VEX_W_0F3848_X86_64_L_0 */
   8052     { PREFIX_TABLE (PREFIX_VEX_0F3848_X86_64_L_0_W_0) },
   8053   },
   8054   {
   8055     /* VEX_W_0F3849_X86_64_L_0 */
   8056     { MOD_TABLE (MOD_VEX_0F3849_X86_64_L_0_W_0) },
   8057   },
   8058   {
   8059     /* VEX_W_0F384A_X86_64 */
   8060     { VEX_LEN_TABLE (VEX_LEN_0F384A_X86_64_W_0) },
   8061   },
   8062   {
   8063     /* VEX_W_0F384B_X86_64_L_0 */
   8064     { PREFIX_TABLE (PREFIX_VEX_0F384B_X86_64_L_0_W_0) },
   8065   },
   8066   {
   8067     /* VEX_W_0F3850 */
   8068     { PREFIX_TABLE (PREFIX_VEX_0F3850_W_0) },
   8069   },
   8070   {
   8071     /* VEX_W_0F3851 */
   8072     { PREFIX_TABLE (PREFIX_VEX_0F3851_W_0) },
   8073   },
   8074   {
   8075     /* VEX_W_0F3852 */
   8076     { "%XVvpdpwssd",	{ XM, Vex, EXx }, PREFIX_DATA },
   8077   },
   8078   {
   8079     /* VEX_W_0F3853 */
   8080     { "%XVvpdpwssds",	{ XM, Vex, EXx }, PREFIX_DATA },
   8081   },
   8082   {
   8083     /* VEX_W_0F3858 */
   8084     { "%XEvpbroadcastd", { XM, EXd }, PREFIX_DATA },
   8085   },
   8086   {
   8087     /* VEX_W_0F3859 */
   8088     { "vpbroadcastq", { XM, EXq }, PREFIX_DATA },
   8089   },
   8090   {
   8091     /* VEX_W_0F385A_L_0 */
   8092     { "vbroadcasti128", { XM, Mxmm }, PREFIX_DATA },
   8093   },
   8094   {
   8095     /* VEX_W_0F385C_X86_64_L_0 */
   8096     { PREFIX_TABLE (PREFIX_VEX_0F385C_X86_64_L_0_W_0) },
   8097   },
   8098   {
   8099     /* VEX_W_0F385E_X86_64_L_0 */
   8100     { PREFIX_TABLE (PREFIX_VEX_0F385E_X86_64_L_0_W_0) },
   8101   },
   8102   {
   8103     /* VEX_W_0F385F_X86_64_L_0 */
   8104     { PREFIX_TABLE (PREFIX_VEX_0F385F_X86_64_L_0_W_0) },
   8105   },
   8106   {
   8107     /* VEX_W_0F386B_X86_64_L_0 */
   8108     { PREFIX_TABLE (PREFIX_VEX_0F386B_X86_64_L_0_W_0) },
   8109   },
   8110   {
   8111     /* VEX_W_0F386C_X86_64_L_0 */
   8112     { PREFIX_TABLE (PREFIX_VEX_0F386C_X86_64_L_0_W_0) },
   8113   },
   8114   {
   8115     /* VEX_W_0F386E_X86_64_L_0 */
   8116     { PREFIX_TABLE (PREFIX_VEX_0F386E_X86_64_L_0_W_0) },
   8117   },
   8118   {
   8119     /* VEX_W_0F386F_X86_64_L_0 */
   8120     { PREFIX_TABLE (PREFIX_VEX_0F386F_X86_64_L_0_W_0) },
   8121   },
   8122   {
   8123     /* VEX_W_0F3872_P_1 */
   8124     { "%XVvcvtneps2bf16%XY", { XMM, EXx }, 0 },
   8125   },
   8126   {
   8127     /* VEX_W_0F3878 */
   8128     { "%XEvpbroadcastb",	{ XM, EXb }, PREFIX_DATA },
   8129   },
   8130   {
   8131     /* VEX_W_0F3879 */
   8132     { "%XEvpbroadcastw",	{ XM, EXw }, PREFIX_DATA },
   8133   },
   8134   {
   8135     /* VEX_W_0F38B0 */
   8136     { PREFIX_TABLE (PREFIX_VEX_0F38B0_W_0) },
   8137   },
   8138   {
   8139     /* VEX_W_0F38B1 */
   8140     { PREFIX_TABLE (PREFIX_VEX_0F38B1_W_0) },
   8141   },
   8142   {
   8143     /* VEX_W_0F38B4 */
   8144     { Bad_Opcode },
   8145     { "%XVvpmadd52luq",	{ XM, Vex, EXx }, PREFIX_DATA },
   8146   },
   8147   {
   8148     /* VEX_W_0F38B5 */
   8149     { Bad_Opcode },
   8150     { "%XVvpmadd52huq",	{ XM, Vex, EXx }, PREFIX_DATA },
   8151   },
   8152   {
   8153     /* VEX_W_0F38CB_P_3 */
   8154     { VEX_LEN_TABLE (VEX_LEN_0F38CB_P_3_W_0) },
   8155   },
   8156   {
   8157     /* VEX_W_0F38CC_P_3 */
   8158     { VEX_LEN_TABLE (VEX_LEN_0F38CC_P_3_W_0) },
   8159   },
   8160   {
   8161     /* VEX_W_0F38CD_P_3 */
   8162     { VEX_LEN_TABLE (VEX_LEN_0F38CD_P_3_W_0) },
   8163   },
   8164   {
   8165     /* VEX_W_0F38CF */
   8166     { "%XEvgf2p8mulb", { XM, Vex, EXx }, PREFIX_DATA },
   8167   },
   8168   {
   8169     /* VEX_W_0F38D2 */
   8170     { PREFIX_TABLE (PREFIX_VEX_0F38D2_W_0) },
   8171   },
   8172   {
   8173     /* VEX_W_0F38D3 */
   8174     { PREFIX_TABLE (PREFIX_VEX_0F38D3_W_0) },
   8175   },
   8176   {
   8177     /* VEX_W_0F38DA */
   8178     { PREFIX_TABLE (PREFIX_VEX_0F38DA_W_0) },
   8179   },
   8180   {
   8181     /* VEX_W_0F3A00_L_1 */
   8182     { Bad_Opcode },
   8183     { "%XEvpermq",		{ XM, EXx, Ib }, PREFIX_DATA },
   8184   },
   8185   {
   8186     /* VEX_W_0F3A01_L_1 */
   8187     { Bad_Opcode },
   8188     { "%XEvpermpd",	{ XM, EXx, Ib }, PREFIX_DATA },
   8189   },
   8190   {
   8191     /* VEX_W_0F3A02 */
   8192     { "vpblendd",	{ XM, Vex, EXx, Ib }, PREFIX_DATA },
   8193   },
   8194   {
   8195     /* VEX_W_0F3A04 */
   8196     { "%XEvpermilps",	{ XM, EXx, Ib }, PREFIX_DATA },
   8197   },
   8198   {
   8199     /* VEX_W_0F3A05 */
   8200     { "vpermilpd",	{ XM, EXx, Ib }, PREFIX_DATA },
   8201   },
   8202   {
   8203     /* VEX_W_0F3A06_L_1 */
   8204     { "vperm2f128",	{ XM, Vex, EXx, Ib }, PREFIX_DATA },
   8205   },
   8206   {
   8207     /* VEX_W_0F3A18_L_1 */
   8208     { "vinsertf128",	{ XM, Vex, EXxmm, Ib }, PREFIX_DATA },
   8209   },
   8210   {
   8211     /* VEX_W_0F3A19_L_1 */
   8212     { "vextractf128",	{ EXxmm, XM, Ib }, PREFIX_DATA },
   8213   },
   8214   {
   8215     /* VEX_W_0F3A1D */
   8216     { "%XEvcvtps2ph", { EXxmmq, XM, EXxEVexS, Ib }, PREFIX_DATA },
   8217   },
   8218   {
   8219     /* VEX_W_0F3A38_L_1 */
   8220     { "vinserti128",	{ XM, Vex, EXxmm, Ib }, PREFIX_DATA },
   8221   },
   8222   {
   8223     /* VEX_W_0F3A39_L_1 */
   8224     { "vextracti128",	{ EXxmm, XM, Ib }, PREFIX_DATA },
   8225   },
   8226   {
   8227     /* VEX_W_0F3A46_L_1 */
   8228     { "vperm2i128",	{ XM, Vex, EXx, Ib }, PREFIX_DATA },
   8229   },
   8230   {
   8231     /* VEX_W_0F3A4A */
   8232     { "vblendvps",	{ XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
   8233   },
   8234   {
   8235     /* VEX_W_0F3A4B */
   8236     { "vblendvpd",	{ XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
   8237   },
   8238   {
   8239     /* VEX_W_0F3A4C */
   8240     { "vpblendvb",	{ XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
   8241   },
   8242   {
   8243     /* VEX_W_0F3ACE */
   8244     { Bad_Opcode },
   8245     { "%XEvgf2p8affineqb", { XM, Vex, EXx, Ib }, PREFIX_DATA },
   8246   },
   8247   {
   8248     /* VEX_W_0F3ACF */
   8249     { Bad_Opcode },
   8250     { "%XEvgf2p8affineinvqb",  { XM, Vex, EXx, Ib }, PREFIX_DATA },
   8251   },
   8252   {
   8253     /* VEX_W_0F3ADE */
   8254     { VEX_LEN_TABLE (VEX_LEN_0F3ADE_W_0) },
   8255   },
   8256   {
   8257     /* VEX_W_MAP5_F8_X86_64 */
   8258     { PREFIX_TABLE (PREFIX_VEX_MAP5_F8_X86_64_L_0_W_0) },
   8259   },
   8260   {
   8261     /* VEX_W_MAP5_F9_X86_64 */
   8262     { PREFIX_TABLE (PREFIX_VEX_MAP5_F9_X86_64_L_0_W_0) },
   8263   },
   8264   {
   8265     /* VEX_W_MAP5_FD_X86_64 */
   8266     { PREFIX_TABLE (PREFIX_VEX_MAP5_FD_X86_64_L_0_W_0) },
   8267   },
   8268   {
   8269     /* VEX_W_MAP7_F6_L_0 */
   8270     { REG_TABLE (REG_VEX_MAP7_F6_L_0_W_0) },
   8271   },
   8272   {
   8273     /* VEX_W_MAP7_F8_L_0 */
   8274     { REG_TABLE (REG_VEX_MAP7_F8_L_0_W_0) },
   8275   },
   8276   /* VEX_W_XOP_08_85_L_0 */
   8277   {
   8278     { "vpmacssww", 	{ XM, Vex, EXx, XMVexI4 }, 0 },
   8279   },
   8280   /* VEX_W_XOP_08_86_L_0 */
   8281   {
   8282     { "vpmacsswd", 	{ XM, Vex, EXx, XMVexI4 }, 0 },
   8283   },
   8284   /* VEX_W_XOP_08_87_L_0 */
   8285   {
   8286     { "vpmacssdql", 	{ XM, Vex, EXx, XMVexI4 }, 0 },
   8287   },
   8288   /* VEX_W_XOP_08_8E_L_0 */
   8289   {
   8290     { "vpmacssdd", 	{ XM, Vex, EXx, XMVexI4 }, 0 },
   8291   },
   8292   /* VEX_W_XOP_08_8F_L_0 */
   8293   {
   8294     { "vpmacssdqh", 	{ XM, Vex, EXx, XMVexI4 }, 0 },
   8295   },
   8296   /* VEX_W_XOP_08_95_L_0 */
   8297   {
   8298     { "vpmacsww", 	{ XM, Vex, EXx, XMVexI4 }, 0 },
   8299   },
   8300   /* VEX_W_XOP_08_96_L_0 */
   8301   {
   8302     { "vpmacswd", 	{ XM, Vex, EXx, XMVexI4 }, 0 },
   8303   },
   8304   /* VEX_W_XOP_08_97_L_0 */
   8305   {
   8306     { "vpmacsdql", 	{ XM, Vex, EXx, XMVexI4 }, 0 },
   8307   },
   8308   /* VEX_W_XOP_08_9E_L_0 */
   8309   {
   8310     { "vpmacsdd", 	{ XM, Vex, EXx, XMVexI4 }, 0 },
   8311   },
   8312   /* VEX_W_XOP_08_9F_L_0 */
   8313   {
   8314     { "vpmacsdqh", 	{ XM, Vex, EXx, XMVexI4 }, 0 },
   8315   },
   8316   /* VEX_W_XOP_08_A6_L_0 */
   8317   {
   8318     { "vpmadcsswd", 	{ XM, Vex, EXx, XMVexI4 }, 0 },
   8319   },
   8320   /* VEX_W_XOP_08_B6_L_0 */
   8321   {
   8322     { "vpmadcswd", 	{ XM, Vex, EXx, XMVexI4 }, 0 },
   8323   },
   8324   /* VEX_W_XOP_08_C0_L_0 */
   8325   {
   8326     { "vprotb", 	{ XM, EXx, Ib }, 0 },
   8327   },
   8328   /* VEX_W_XOP_08_C1_L_0 */
   8329   {
   8330     { "vprotw", 	{ XM, EXx, Ib }, 0 },
   8331   },
   8332   /* VEX_W_XOP_08_C2_L_0 */
   8333   {
   8334     { "vprotd", 	{ XM, EXx, Ib }, 0 },
   8335   },
   8336   /* VEX_W_XOP_08_C3_L_0 */
   8337   {
   8338     { "vprotq", 	{ XM, EXx, Ib }, 0 },
   8339   },
   8340   /* VEX_W_XOP_08_CC_L_0 */
   8341   {
   8342      { "vpcomb",	{ XM, Vex, EXx, VPCOM }, 0 },
   8343   },
   8344   /* VEX_W_XOP_08_CD_L_0 */
   8345   {
   8346      { "vpcomw",	{ XM, Vex, EXx, VPCOM }, 0 },
   8347   },
   8348   /* VEX_W_XOP_08_CE_L_0 */
   8349   {
   8350      { "vpcomd",	{ XM, Vex, EXx, VPCOM }, 0 },
   8351   },
   8352   /* VEX_W_XOP_08_CF_L_0 */
   8353   {
   8354      { "vpcomq",	{ XM, Vex, EXx, VPCOM }, 0 },
   8355   },
   8356   /* VEX_W_XOP_08_EC_L_0 */
   8357   {
   8358      { "vpcomub",	{ XM, Vex, EXx, VPCOM }, 0 },
   8359   },
   8360   /* VEX_W_XOP_08_ED_L_0 */
   8361   {
   8362      { "vpcomuw",	{ XM, Vex, EXx, VPCOM }, 0 },
   8363   },
   8364   /* VEX_W_XOP_08_EE_L_0 */
   8365   {
   8366      { "vpcomud",	{ XM, Vex, EXx, VPCOM }, 0 },
   8367   },
   8368   /* VEX_W_XOP_08_EF_L_0 */
   8369   {
   8370      { "vpcomuq",	{ XM, Vex, EXx, VPCOM }, 0 },
   8371   },
   8372   /* VEX_W_XOP_09_80 */
   8373   {
   8374     { "vfrczps",	{ XM, EXx }, 0 },
   8375   },
   8376   /* VEX_W_XOP_09_81 */
   8377   {
   8378     { "vfrczpd",	{ XM, EXx }, 0 },
   8379   },
   8380   /* VEX_W_XOP_09_82 */
   8381   {
   8382     { VEX_LEN_TABLE (VEX_LEN_XOP_09_82_W_0) },
   8383   },
   8384   /* VEX_W_XOP_09_83 */
   8385   {
   8386     { VEX_LEN_TABLE (VEX_LEN_XOP_09_83_W_0) },
   8387   },
   8388   /* VEX_W_XOP_09_C1_L_0 */
   8389   {
   8390     { "vphaddbw",	{ XM, EXxmm }, 0 },
   8391   },
   8392   /* VEX_W_XOP_09_C2_L_0 */
   8393   {
   8394     { "vphaddbd",	{ XM, EXxmm }, 0 },
   8395   },
   8396   /* VEX_W_XOP_09_C3_L_0 */
   8397   {
   8398     { "vphaddbq",	{ XM, EXxmm }, 0 },
   8399   },
   8400   /* VEX_W_XOP_09_C6_L_0 */
   8401   {
   8402     { "vphaddwd",	{ XM, EXxmm }, 0 },
   8403   },
   8404   /* VEX_W_XOP_09_C7_L_0 */
   8405   {
   8406     { "vphaddwq",	{ XM, EXxmm }, 0 },
   8407   },
   8408   /* VEX_W_XOP_09_CB_L_0 */
   8409   {
   8410     { "vphadddq",	{ XM, EXxmm }, 0 },
   8411   },
   8412   /* VEX_W_XOP_09_D1_L_0 */
   8413   {
   8414     { "vphaddubw",	{ XM, EXxmm }, 0 },
   8415   },
   8416   /* VEX_W_XOP_09_D2_L_0 */
   8417   {
   8418     { "vphaddubd",	{ XM, EXxmm }, 0 },
   8419   },
   8420   /* VEX_W_XOP_09_D3_L_0 */
   8421   {
   8422     { "vphaddubq",	{ XM, EXxmm }, 0 },
   8423   },
   8424   /* VEX_W_XOP_09_D6_L_0 */
   8425   {
   8426     { "vphadduwd",	{ XM, EXxmm }, 0 },
   8427   },
   8428   /* VEX_W_XOP_09_D7_L_0 */
   8429   {
   8430     { "vphadduwq",	{ XM, EXxmm }, 0 },
   8431   },
   8432   /* VEX_W_XOP_09_DB_L_0 */
   8433   {
   8434     { "vphaddudq",	{ XM, EXxmm }, 0 },
   8435   },
   8436   /* VEX_W_XOP_09_E1_L_0 */
   8437   {
   8438     { "vphsubbw",	{ XM, EXxmm }, 0 },
   8439   },
   8440   /* VEX_W_XOP_09_E2_L_0 */
   8441   {
   8442     { "vphsubwd",	{ XM, EXxmm }, 0 },
   8443   },
   8444   /* VEX_W_XOP_09_E3_L_0 */
   8445   {
   8446     { "vphsubdq",	{ XM, EXxmm }, 0 },
   8447   },
   8448 
   8449 #include "i386-dis-evex-w.h"
   8450 };
   8451 
   8452 static const struct dis386 mod_table[][2] = {
   8453   {
   8454     /* MOD_62_32BIT */
   8455     { "bound{S|}",	{ Gv, Ma }, 0 },
   8456     { EVEX_TABLE () },
   8457   },
   8458   {
   8459     /* MOD_C4_32BIT */
   8460     { "lesS",		{ Gv, Mp }, 0 },
   8461     { VEX_C4_TABLE () },
   8462   },
   8463   {
   8464     /* MOD_C5_32BIT */
   8465     { "ldsS",		{ Gv, Mp }, 0 },
   8466     { VEX_C5_TABLE () },
   8467   },
   8468   {
   8469     /* MOD_0F01_REG_0 */
   8470     { X86_64_TABLE (X86_64_0F01_REG_0) },
   8471     { RM_TABLE (RM_0F01_REG_0) },
   8472   },
   8473   {
   8474     /* MOD_0F01_REG_1 */
   8475     { X86_64_TABLE (X86_64_0F01_REG_1) },
   8476     { RM_TABLE (RM_0F01_REG_1) },
   8477   },
   8478   {
   8479     /* MOD_0F01_REG_2 */
   8480     { X86_64_TABLE (X86_64_0F01_REG_2) },
   8481     { RM_TABLE (RM_0F01_REG_2) },
   8482   },
   8483   {
   8484     /* MOD_0F01_REG_3 */
   8485     { X86_64_TABLE (X86_64_0F01_REG_3) },
   8486     { RM_TABLE (RM_0F01_REG_3) },
   8487   },
   8488   {
   8489     /* MOD_0F01_REG_5 */
   8490     { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_0) },
   8491     { RM_TABLE (RM_0F01_REG_5_MOD_3) },
   8492   },
   8493   {
   8494     /* MOD_0F01_REG_7 */
   8495     { "invlpg",		{ Mb }, 0 },
   8496     { RM_TABLE (RM_0F01_REG_7_MOD_3) },
   8497   },
   8498   {
   8499     /* MOD_0F12_PREFIX_0 */
   8500     { "%XEVmovlpYX",	{ XM, Vex, EXq }, 0 },
   8501     { "%XEVmovhlpY%XS",	{ XM, Vex, EXq }, 0 },
   8502   },
   8503   {
   8504     /* MOD_0F16_PREFIX_0 */
   8505     { "%XEVmovhpYX",	{ XM, Vex, EXq }, 0 },
   8506     { "%XEVmovlhpY%XS",	{ XM, Vex, EXq }, 0 },
   8507   },
   8508   {
   8509     /* MOD_0F18_REG_0 */
   8510     { "prefetchnta",	{ Mb }, 0 },
   8511     { "nopQ",		{ Ev }, 0 },
   8512   },
   8513   {
   8514     /* MOD_0F18_REG_1 */
   8515     { "prefetcht0",	{ Mb }, 0 },
   8516     { "nopQ",		{ Ev }, 0 },
   8517   },
   8518   {
   8519     /* MOD_0F18_REG_2 */
   8520     { "prefetcht1",	{ Mb }, 0 },
   8521     { "nopQ",		{ Ev }, 0 },
   8522   },
   8523   {
   8524     /* MOD_0F18_REG_3 */
   8525     { "prefetcht2",	{ Mb }, 0 },
   8526     { "nopQ",		{ Ev }, 0 },
   8527   },
   8528   {
   8529     /* MOD_0F18_REG_4 */
   8530     { "prefetchrst2",	{ Mb }, 0 },
   8531     { "nopQ",		{ Ev }, 0 },
   8532   },
   8533   {
   8534     /* MOD_0F18_REG_6 */
   8535     { X86_64_TABLE (X86_64_0F18_REG_6_MOD_0) },
   8536     { "nopQ",		{ Ev }, 0 },
   8537   },
   8538   {
   8539     /* MOD_0F18_REG_7 */
   8540     { X86_64_TABLE (X86_64_0F18_REG_7_MOD_0) },
   8541     { "nopQ",		{ Ev }, 0 },
   8542   },
   8543   {
   8544     /* MOD_0F1A_PREFIX_0 */
   8545     { "bndldx",		{ Gbnd, Mv_bnd }, 0 },
   8546     { "nopQ",		{ Ev }, 0 },
   8547   },
   8548   {
   8549     /* MOD_0F1B_PREFIX_0 */
   8550     { "bndstx",		{ Mv_bnd, Gbnd }, 0 },
   8551     { "nopQ",		{ Ev }, 0 },
   8552   },
   8553   {
   8554     /* MOD_0F1B_PREFIX_1 */
   8555     { "bndmk",		{ Gbnd, Mv_bnd }, 0 },
   8556     { "nopQ",		{ Ev }, PREFIX_IGNORED },
   8557   },
   8558   {
   8559     /* MOD_0F1C_PREFIX_0 */
   8560     { REG_TABLE (REG_0F1C_P_0_MOD_0) },
   8561     { "nopQ",		{ Ev }, 0 },
   8562   },
   8563   {
   8564     /* MOD_0F1E_PREFIX_1 */
   8565     { "nopQ",		{ Ev }, PREFIX_IGNORED },
   8566     { REG_TABLE (REG_0F1E_P_1_MOD_3) },
   8567   },
   8568   {
   8569     /* MOD_0FAE_REG_0 */
   8570     { "fxsave",		{ FXSAVE }, 0 },
   8571     { PREFIX_TABLE (PREFIX_0FAE_REG_0_MOD_3) },
   8572   },
   8573   {
   8574     /* MOD_0FAE_REG_1 */
   8575     { "fxrstor",	{ FXSAVE }, 0 },
   8576     { PREFIX_TABLE (PREFIX_0FAE_REG_1_MOD_3) },
   8577   },
   8578   {
   8579     /* MOD_0FAE_REG_2 */
   8580     { "ldmxcsr",	{ Md }, 0 },
   8581     { PREFIX_TABLE (PREFIX_0FAE_REG_2_MOD_3) },
   8582   },
   8583   {
   8584     /* MOD_0FAE_REG_3 */
   8585     { "stmxcsr",	{ Md }, 0 },
   8586     { PREFIX_TABLE (PREFIX_0FAE_REG_3_MOD_3) },
   8587   },
   8588   {
   8589     /* MOD_0FAE_REG_4 */
   8590     { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_0) },
   8591     { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_3) },
   8592   },
   8593   {
   8594     /* MOD_0FAE_REG_5 */
   8595     { "xrstor",		{ FXSAVE }, PREFIX_OPCODE | PREFIX_REX2_ILLEGAL },
   8596     { PREFIX_TABLE (PREFIX_0FAE_REG_5_MOD_3) },
   8597   },
   8598   {
   8599     /* MOD_0FAE_REG_6 */
   8600     { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_0) },
   8601     { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_3) },
   8602   },
   8603   {
   8604     /* MOD_0FAE_REG_7 */
   8605     { PREFIX_TABLE (PREFIX_0FAE_REG_7_MOD_0) },
   8606     { RM_TABLE (RM_0FAE_REG_7_MOD_3) },
   8607   },
   8608   {
   8609     /* MOD_0FC7_REG_6 */
   8610     { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_0) },
   8611     { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_3) }
   8612   },
   8613   {
   8614     /* MOD_0FC7_REG_7 */
   8615     { "vmptrst",	{ Mq }, 0 },
   8616     { PREFIX_TABLE (PREFIX_0FC7_REG_7_MOD_3) }
   8617   },
   8618   {
   8619     /* MOD_0F38DC_PREFIX_1 */
   8620     { "aesenc128kl",    { XM, M }, 0 },
   8621     { "loadiwkey",      { XM, EXx }, 0 },
   8622   },
   8623   /* MOD_0F38F8 */
   8624   {
   8625     { PREFIX_TABLE (PREFIX_0F38F8_M_0) },
   8626     { X86_64_TABLE (X86_64_0F38F8_M_1) },
   8627   },
   8628   {
   8629     /* MOD_VEX_0F3849_X86_64_L_0_W_0 */
   8630     { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_0) },
   8631     { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_1) },
   8632   },
   8633 
   8634 #include "i386-dis-evex-mod.h"
   8635 };
   8636 
   8637 static const struct dis386 rm_table[][8] = {
   8638   {
   8639     /* RM_C6_REG_7 */
   8640     { "xabort",		{ Skip_MODRM, Ib }, 0 },
   8641   },
   8642   {
   8643     /* RM_C7_REG_7 */
   8644     { "xbeginT",	{ Skip_MODRM, Jdqw }, 0 },
   8645   },
   8646   {
   8647     /* RM_0F01_REG_0 */
   8648     { "enclv",		{ Skip_MODRM }, 0 },
   8649     { "vmcall",		{ Skip_MODRM }, 0 },
   8650     { "vmlaunch",	{ Skip_MODRM }, 0 },
   8651     { "vmresume",	{ Skip_MODRM }, 0 },
   8652     { "vmxoff",		{ Skip_MODRM }, 0 },
   8653     { "pconfig",	{ Skip_MODRM }, 0 },
   8654     { PREFIX_TABLE (PREFIX_0F01_REG_0_MOD_3_RM_6) },
   8655     { PREFIX_TABLE (PREFIX_0F01_REG_0_MOD_3_RM_7) },
   8656   },
   8657   {
   8658     /* RM_0F01_REG_1 */
   8659     { "monitor",	{ { OP_Monitor, 0 } }, 0 },
   8660     { "mwait",		{ { OP_Mwait, 0 } }, 0 },
   8661     { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_2) },
   8662     { "stac",		{ Skip_MODRM }, 0 },
   8663     { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_4) },
   8664     { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_5) },
   8665     { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_6) },
   8666     { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_7) },
   8667   },
   8668   {
   8669     /* RM_0F01_REG_2 */
   8670     { "xgetbv",		{ Skip_MODRM }, 0 },
   8671     { "xsetbv",		{ Skip_MODRM }, 0 },
   8672     { Bad_Opcode },
   8673     { Bad_Opcode },
   8674     { "vmfunc",		{ Skip_MODRM }, 0 },
   8675     { "xend",		{ Skip_MODRM }, 0 },
   8676     { "xtest",		{ Skip_MODRM }, 0 },
   8677     { "enclu",		{ Skip_MODRM }, 0 },
   8678   },
   8679   {
   8680     /* RM_0F01_REG_3 */
   8681     { "vmrun",		{ Skip_MODRM }, 0 },
   8682     { PREFIX_TABLE (PREFIX_0F01_REG_3_RM_1) },
   8683     { "vmload",		{ Skip_MODRM }, 0 },
   8684     { "vmsave",		{ Skip_MODRM }, 0 },
   8685     { "stgi",		{ Skip_MODRM }, 0 },
   8686     { "clgi",		{ Skip_MODRM }, 0 },
   8687     { "skinit",		{ Skip_MODRM }, 0 },
   8688     { "invlpga",	{ Skip_MODRM }, 0 },
   8689   },
   8690   {
   8691     /* RM_0F01_REG_5_MOD_3 */
   8692     { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_0) },
   8693     { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_1) },
   8694     { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_2) },
   8695     { Bad_Opcode },
   8696     { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_4) },
   8697     { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_5) },
   8698     { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_6) },
   8699     { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_7) },
   8700   },
   8701   {
   8702     /* RM_0F01_REG_7_MOD_3 */
   8703     { "swapgs",		{ Skip_MODRM }, 0  },
   8704     { "rdtscp",		{ Skip_MODRM }, 0  },
   8705     { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_2) },
   8706     { "mwaitx",		{ { OP_Mwait, eBX_reg } }, PREFIX_OPCODE },
   8707     { "clzero",		{ Skip_MODRM }, 0  },
   8708     { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_5) },
   8709     { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_6) },
   8710     { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_7) },
   8711   },
   8712   {
   8713     /* RM_0F1E_P_1_MOD_3_REG_7 */
   8714     { "nopQ",		{ Ev }, PREFIX_IGNORED },
   8715     { "nopQ",		{ Ev }, PREFIX_IGNORED },
   8716     { "endbr64",	{ Skip_MODRM }, 0 },
   8717     { "endbr32",	{ Skip_MODRM }, 0 },
   8718     { "nopQ",		{ Ev }, PREFIX_IGNORED },
   8719     { "nopQ",		{ Ev }, PREFIX_IGNORED },
   8720     { "nopQ",		{ Ev }, PREFIX_IGNORED },
   8721     { "nopQ",		{ Ev }, PREFIX_IGNORED },
   8722   },
   8723   {
   8724     /* RM_0FAE_REG_6_MOD_3 */
   8725     { "mfence",		{ Skip_MODRM }, 0 },
   8726   },
   8727   {
   8728     /* RM_0FAE_REG_7_MOD_3 */
   8729     { "sfence",		{ Skip_MODRM }, 0 },
   8730   },
   8731   {
   8732     /* RM_0F3A0F_P_1_R_0 */
   8733     { "hreset",		{ Skip_MODRM, Ib }, 0 },
   8734   },
   8735   {
   8736     /* RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0_R_0 */
   8737     { "tilerelease",	{ Skip_MODRM }, 0 },
   8738   },
   8739   {
   8740     /* RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_3 */
   8741     { "tilezero",	{ TMM, Skip_MODRM }, 0 },
   8742   },
   8743 };
   8744 
   8745 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
   8746 
   8747 /* The values used here must be non-zero, fit in 'unsigned char', and not be
   8748    in conflict with actual prefix opcodes.  */
   8749 #define REP_PREFIX	0x01
   8750 #define XACQUIRE_PREFIX	0x02
   8751 #define XRELEASE_PREFIX	0x03
   8752 #define BND_PREFIX	0x04
   8753 #define NOTRACK_PREFIX	0x05
   8754 
   8755 static enum {
   8756   ckp_okay,
   8757   ckp_bogus,
   8758   ckp_fetch_error,
   8759 }
   8760 ckprefix (instr_info *ins)
   8761 {
   8762   int i, length;
   8763   uint8_t newrex;
   8764 
   8765   i = 0;
   8766   length = 0;
   8767   /* The maximum instruction length is 15bytes.  */
   8768   while (length < MAX_CODE_LENGTH - 1)
   8769     {
   8770       if (!fetch_code (ins->info, ins->codep + 1))
   8771 	return ckp_fetch_error;
   8772       newrex = 0;
   8773       switch (*ins->codep)
   8774 	{
   8775 	/* REX prefixes family.  */
   8776 	case 0x40:
   8777 	case 0x41:
   8778 	case 0x42:
   8779 	case 0x43:
   8780 	case 0x44:
   8781 	case 0x45:
   8782 	case 0x46:
   8783 	case 0x47:
   8784 	case 0x48:
   8785 	case 0x49:
   8786 	case 0x4a:
   8787 	case 0x4b:
   8788 	case 0x4c:
   8789 	case 0x4d:
   8790 	case 0x4e:
   8791 	case 0x4f:
   8792 	  if (ins->address_mode == mode_64bit)
   8793 	    newrex = *ins->codep;
   8794 	  else
   8795 	    return ckp_okay;
   8796 	  ins->last_rex_prefix = i;
   8797 	  break;
   8798 	/* REX2 must be the last prefix. */
   8799 	case REX2_OPCODE:
   8800 	  if (ins->address_mode == mode_64bit)
   8801 	    {
   8802 	      if (ins->last_rex_prefix >= 0)
   8803 		return ckp_bogus;
   8804 
   8805 	      ins->codep++;
   8806 	      if (!fetch_code (ins->info, ins->codep + 1))
   8807 		return ckp_fetch_error;
   8808 	      ins->rex2_payload = *ins->codep;
   8809 	      ins->rex2 = ins->rex2_payload >> 4;
   8810 	      ins->rex = (ins->rex2_payload & 0xf) | REX_OPCODE;
   8811 	      ins->codep++;
   8812 	      ins->last_rex2_prefix = i;
   8813 	      ins->all_prefixes[i] = REX2_OPCODE;
   8814 	    }
   8815 	  return ckp_okay;
   8816 	case 0xf3:
   8817 	  ins->prefixes |= PREFIX_REPZ;
   8818 	  ins->last_repz_prefix = i;
   8819 	  break;
   8820 	case 0xf2:
   8821 	  ins->prefixes |= PREFIX_REPNZ;
   8822 	  ins->last_repnz_prefix = i;
   8823 	  break;
   8824 	case 0xf0:
   8825 	  ins->prefixes |= PREFIX_LOCK;
   8826 	  ins->last_lock_prefix = i;
   8827 	  break;
   8828 	case 0x2e:
   8829 	  ins->prefixes |= PREFIX_CS;
   8830 	  ins->last_seg_prefix = i;
   8831 	  if (ins->address_mode != mode_64bit)
   8832 	    ins->active_seg_prefix = PREFIX_CS;
   8833 	  break;
   8834 	case 0x36:
   8835 	  ins->prefixes |= PREFIX_SS;
   8836 	  ins->last_seg_prefix = i;
   8837 	  if (ins->address_mode != mode_64bit)
   8838 	    ins->active_seg_prefix = PREFIX_SS;
   8839 	  break;
   8840 	case 0x3e:
   8841 	  ins->prefixes |= PREFIX_DS;
   8842 	  ins->last_seg_prefix = i;
   8843 	  if (ins->address_mode != mode_64bit)
   8844 	    ins->active_seg_prefix = PREFIX_DS;
   8845 	  break;
   8846 	case 0x26:
   8847 	  ins->prefixes |= PREFIX_ES;
   8848 	  ins->last_seg_prefix = i;
   8849 	  if (ins->address_mode != mode_64bit)
   8850 	    ins->active_seg_prefix = PREFIX_ES;
   8851 	  break;
   8852 	case 0x64:
   8853 	  ins->prefixes |= PREFIX_FS;
   8854 	  ins->last_seg_prefix = i;
   8855 	  ins->active_seg_prefix = PREFIX_FS;
   8856 	  break;
   8857 	case 0x65:
   8858 	  ins->prefixes |= PREFIX_GS;
   8859 	  ins->last_seg_prefix = i;
   8860 	  ins->active_seg_prefix = PREFIX_GS;
   8861 	  break;
   8862 	case 0x66:
   8863 	  ins->prefixes |= PREFIX_DATA;
   8864 	  ins->last_data_prefix = i;
   8865 	  break;
   8866 	case 0x67:
   8867 	  ins->prefixes |= PREFIX_ADDR;
   8868 	  ins->last_addr_prefix = i;
   8869 	  break;
   8870 	case FWAIT_OPCODE:
   8871 	  /* fwait is really an instruction.  If there are prefixes
   8872 	     before the fwait, they belong to the fwait, *not* to the
   8873 	     following instruction.  */
   8874 	  ins->fwait_prefix = i;
   8875 	  if (ins->prefixes || ins->rex)
   8876 	    {
   8877 	      ins->prefixes |= PREFIX_FWAIT;
   8878 	      ins->codep++;
   8879 	      /* This ensures that the previous REX prefixes are noticed
   8880 		 as unused prefixes, as in the return case below.  */
   8881 	      return ins->rex ? ckp_bogus : ckp_okay;
   8882 	    }
   8883 	  ins->prefixes = PREFIX_FWAIT;
   8884 	  break;
   8885 	default:
   8886 	  return ckp_okay;
   8887 	}
   8888       /* Rex is ignored when followed by another prefix.  */
   8889       if (ins->rex)
   8890 	return ckp_bogus;
   8891       if (*ins->codep != FWAIT_OPCODE)
   8892 	ins->all_prefixes[i++] = *ins->codep;
   8893       ins->rex = newrex;
   8894       ins->codep++;
   8895       length++;
   8896     }
   8897   return ckp_bogus;
   8898 }
   8899 
   8900 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
   8901    prefix byte.  */
   8902 
   8903 static const char *
   8904 prefix_name (enum address_mode mode, uint8_t pref, int sizeflag)
   8905 {
   8906   static const char *rexes [16] =
   8907     {
   8908       "rex",		/* 0x40 */
   8909       "rex.B",		/* 0x41 */
   8910       "rex.X",		/* 0x42 */
   8911       "rex.XB",		/* 0x43 */
   8912       "rex.R",		/* 0x44 */
   8913       "rex.RB",		/* 0x45 */
   8914       "rex.RX",		/* 0x46 */
   8915       "rex.RXB",	/* 0x47 */
   8916       "rex.W",		/* 0x48 */
   8917       "rex.WB",		/* 0x49 */
   8918       "rex.WX",		/* 0x4a */
   8919       "rex.WXB",	/* 0x4b */
   8920       "rex.WR",		/* 0x4c */
   8921       "rex.WRB",	/* 0x4d */
   8922       "rex.WRX",	/* 0x4e */
   8923       "rex.WRXB",	/* 0x4f */
   8924     };
   8925 
   8926   switch (pref)
   8927     {
   8928     /* REX prefixes family.  */
   8929     case 0x40:
   8930     case 0x41:
   8931     case 0x42:
   8932     case 0x43:
   8933     case 0x44:
   8934     case 0x45:
   8935     case 0x46:
   8936     case 0x47:
   8937     case 0x48:
   8938     case 0x49:
   8939     case 0x4a:
   8940     case 0x4b:
   8941     case 0x4c:
   8942     case 0x4d:
   8943     case 0x4e:
   8944     case 0x4f:
   8945       return rexes [pref - 0x40];
   8946     case 0xf3:
   8947       return "repz";
   8948     case 0xf2:
   8949       return "repnz";
   8950     case 0xf0:
   8951       return "lock";
   8952     case 0x2e:
   8953       return "cs";
   8954     case 0x36:
   8955       return "ss";
   8956     case 0x3e:
   8957       return "ds";
   8958     case 0x26:
   8959       return "es";
   8960     case 0x64:
   8961       return "fs";
   8962     case 0x65:
   8963       return "gs";
   8964     case 0x66:
   8965       return (sizeflag & DFLAG) ? "data16" : "data32";
   8966     case 0x67:
   8967       if (mode == mode_64bit)
   8968 	return (sizeflag & AFLAG) ? "addr32" : "addr64";
   8969       else
   8970 	return (sizeflag & AFLAG) ? "addr16" : "addr32";
   8971     case FWAIT_OPCODE:
   8972       return "fwait";
   8973     case REP_PREFIX:
   8974       return "rep";
   8975     case XACQUIRE_PREFIX:
   8976       return "xacquire";
   8977     case XRELEASE_PREFIX:
   8978       return "xrelease";
   8979     case BND_PREFIX:
   8980       return "bnd";
   8981     case NOTRACK_PREFIX:
   8982       return "notrack";
   8983     case REX2_OPCODE:
   8984       return "rex2";
   8985     default:
   8986       return NULL;
   8987     }
   8988 }
   8989 
   8990 void
   8991 print_i386_disassembler_options (FILE *stream)
   8992 {
   8993   fprintf (stream, _("\n\
   8994 The following i386/x86-64 specific disassembler options are supported for use\n\
   8995 with the -M switch (multiple options should be separated by commas):\n"));
   8996 
   8997   fprintf (stream, _("  x86-64      Disassemble in 64bit mode\n"));
   8998   fprintf (stream, _("  i386        Disassemble in 32bit mode\n"));
   8999   fprintf (stream, _("  i8086       Disassemble in 16bit mode\n"));
   9000   fprintf (stream, _("  att         Display instruction in AT&T syntax\n"));
   9001   fprintf (stream, _("  intel       Display instruction in Intel syntax\n"));
   9002   fprintf (stream, _("  att-mnemonic  (AT&T syntax only)\n"
   9003 		     "              Display instruction with AT&T mnemonic\n"));
   9004   fprintf (stream, _("  intel-mnemonic  (AT&T syntax only)\n"
   9005 		     "              Display instruction with Intel mnemonic\n"));
   9006   fprintf (stream, _("  addr64      Assume 64bit address size\n"));
   9007   fprintf (stream, _("  addr32      Assume 32bit address size\n"));
   9008   fprintf (stream, _("  addr16      Assume 16bit address size\n"));
   9009   fprintf (stream, _("  data32      Assume 32bit data size\n"));
   9010   fprintf (stream, _("  data16      Assume 16bit data size\n"));
   9011   fprintf (stream, _("  suffix      Always display instruction suffix in AT&T syntax\n"));
   9012   fprintf (stream, _("  amd64       Display instruction in AMD64 ISA\n"));
   9013   fprintf (stream, _("  intel64     Display instruction in Intel64 ISA\n"));
   9014 }
   9015 
   9016 /* Bad opcode.  */
   9017 static const struct dis386 bad_opcode = { "(bad)", { XX }, 0 };
   9018 
   9019 /* Fetch error indicator.  */
   9020 static const struct dis386 err_opcode = { NULL, { XX }, 0 };
   9021 
   9022 static const struct dis386 map5_f8_opcode = { X86_64_TABLE (X86_64_VEX_MAP5_F8) };
   9023 static const struct dis386 map5_f9_opcode = { X86_64_TABLE (X86_64_VEX_MAP5_F9) };
   9024 static const struct dis386 map5_fd_opcode = { X86_64_TABLE (X86_64_VEX_MAP5_FD) };
   9025 static const struct dis386 map7_f6_opcode = { VEX_LEN_TABLE (VEX_LEN_MAP7_F6) };
   9026 static const struct dis386 map7_f8_opcode = { VEX_LEN_TABLE (VEX_LEN_MAP7_F8) };
   9027 
   9028 /* Get a pointer to struct dis386 with a valid name.  */
   9029 
   9030 static const struct dis386 *
   9031 get_valid_dis386 (const struct dis386 *dp, instr_info *ins)
   9032 {
   9033   int vindex, vex_table_index;
   9034 
   9035   if (dp->name != NULL)
   9036     return dp;
   9037 
   9038   switch (dp->op[0].bytemode)
   9039     {
   9040     case USE_REG_TABLE:
   9041       dp = &reg_table[dp->op[1].bytemode][ins->modrm.reg];
   9042       break;
   9043 
   9044     case USE_MOD_TABLE:
   9045       vindex = ins->modrm.mod == 0x3 ? 1 : 0;
   9046       dp = &mod_table[dp->op[1].bytemode][vindex];
   9047       break;
   9048 
   9049     case USE_RM_TABLE:
   9050       dp = &rm_table[dp->op[1].bytemode][ins->modrm.rm];
   9051       break;
   9052 
   9053     case USE_PREFIX_TABLE:
   9054     use_prefix_table:
   9055       if (ins->need_vex)
   9056 	{
   9057 	  /* The prefix in VEX is implicit.  */
   9058 	  switch (ins->vex.prefix)
   9059 	    {
   9060 	    case 0:
   9061 	      vindex = 0;
   9062 	      break;
   9063 	    case REPE_PREFIX_OPCODE:
   9064 	      vindex = 1;
   9065 	      break;
   9066 	    case DATA_PREFIX_OPCODE:
   9067 	      vindex = 2;
   9068 	      break;
   9069 	    case REPNE_PREFIX_OPCODE:
   9070 	      vindex = 3;
   9071 	      break;
   9072 	    default:
   9073 	      abort ();
   9074 	      break;
   9075 	    }
   9076 	}
   9077       else
   9078 	{
   9079 	  int last_prefix = -1;
   9080 	  int prefix = 0;
   9081 	  vindex = 0;
   9082 	  /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
   9083 	     When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
   9084 	     last one wins.  */
   9085 	  if ((ins->prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
   9086 	    {
   9087 	      if (ins->last_repz_prefix > ins->last_repnz_prefix)
   9088 		{
   9089 		  vindex = 1;
   9090 		  prefix = PREFIX_REPZ;
   9091 		  last_prefix = ins->last_repz_prefix;
   9092 		}
   9093 	      else
   9094 		{
   9095 		  vindex = 3;
   9096 		  prefix = PREFIX_REPNZ;
   9097 		  last_prefix = ins->last_repnz_prefix;
   9098 		}
   9099 
   9100 	      /* Check if prefix should be ignored.  */
   9101 	      if ((((prefix_table[dp->op[1].bytemode][vindex].prefix_requirement
   9102 		     & PREFIX_IGNORED) >> PREFIX_IGNORED_SHIFT)
   9103 		   & prefix) != 0
   9104 		  && !prefix_table[dp->op[1].bytemode][vindex].name)
   9105 		vindex = 0;
   9106 	    }
   9107 
   9108 	  if (vindex == 0 && (ins->prefixes & PREFIX_DATA) != 0)
   9109 	    {
   9110 	      vindex = 2;
   9111 	      prefix = PREFIX_DATA;
   9112 	      last_prefix = ins->last_data_prefix;
   9113 	    }
   9114 
   9115 	  if (vindex != 0)
   9116 	    {
   9117 	      ins->used_prefixes |= prefix;
   9118 	      ins->all_prefixes[last_prefix] = 0;
   9119 	    }
   9120 	}
   9121       dp = &prefix_table[dp->op[1].bytemode][vindex];
   9122       break;
   9123 
   9124     case USE_X86_64_EVEX_FROM_VEX_TABLE:
   9125     case USE_X86_64_EVEX_PFX_TABLE:
   9126     case USE_X86_64_EVEX_W_TABLE:
   9127     case USE_X86_64_EVEX_MEM_W_TABLE:
   9128       ins->evex_type = evex_from_vex;
   9129       /* EVEX from VEX instructions are 64-bit only and require that EVEX.z,
   9130 	 EVEX.L'L, EVEX.b, and the lower 2 bits of EVEX.aaa must be 0.  */
   9131       if (ins->address_mode != mode_64bit
   9132 	  || (ins->vex.mask_register_specifier & 0x3) != 0
   9133 	  || ins->vex.ll != 0
   9134 	  || ins->vex.zeroing != 0
   9135 	  || ins->vex.b)
   9136 	return &bad_opcode;
   9137 
   9138       if (dp->op[0].bytemode == USE_X86_64_EVEX_PFX_TABLE)
   9139 	goto use_prefix_table;
   9140       if (dp->op[0].bytemode == USE_X86_64_EVEX_W_TABLE)
   9141 	goto use_vex_w_table;
   9142       if (dp->op[0].bytemode == USE_X86_64_EVEX_MEM_W_TABLE)
   9143 	{
   9144 	  if (ins->modrm.mod == 3)
   9145 	    return &bad_opcode;
   9146 	  goto use_vex_w_table;
   9147 	}
   9148 
   9149       /* Fall through.  */
   9150     case USE_X86_64_TABLE:
   9151       vindex = ins->address_mode == mode_64bit ? 1 : 0;
   9152       dp = &x86_64_table[dp->op[1].bytemode][vindex];
   9153       break;
   9154 
   9155     case USE_3BYTE_TABLE:
   9156       if (ins->last_rex2_prefix >= 0)
   9157 	return &err_opcode;
   9158       if (!fetch_code (ins->info, ins->codep + 2))
   9159 	return &err_opcode;
   9160       vindex = *ins->codep++;
   9161       dp = &three_byte_table[dp->op[1].bytemode][vindex];
   9162       ins->end_codep = ins->codep;
   9163       if (!fetch_modrm (ins))
   9164 	return &err_opcode;
   9165       break;
   9166 
   9167     case USE_VEX_LEN_TABLE:
   9168       if (!ins->need_vex)
   9169 	abort ();
   9170 
   9171       switch (ins->vex.length)
   9172 	{
   9173 	case 128:
   9174 	  vindex = 0;
   9175 	  break;
   9176 	case 512:
   9177 	  /* This allows re-using in particular table entries where only
   9178 	     128-bit operand size (VEX.L=0 / EVEX.L'L=0) are valid.  */
   9179 	  if (ins->vex.evex)
   9180 	    {
   9181 	case 256:
   9182 	      vindex = 1;
   9183 	      break;
   9184 	    }
   9185 	/* Fall through.  */
   9186 	default:
   9187 	  abort ();
   9188 	  break;
   9189 	}
   9190 
   9191       dp = &vex_len_table[dp->op[1].bytemode][vindex];
   9192       break;
   9193 
   9194     case USE_EVEX_LEN_TABLE:
   9195       if (!ins->vex.evex)
   9196 	abort ();
   9197 
   9198       switch (ins->vex.length)
   9199 	{
   9200 	case 128:
   9201 	  vindex = 0;
   9202 	  break;
   9203 	case 256:
   9204 	  vindex = 1;
   9205 	  break;
   9206 	case 512:
   9207 	  vindex = 2;
   9208 	  break;
   9209 	default:
   9210 	  abort ();
   9211 	  break;
   9212 	}
   9213 
   9214       dp = &evex_len_table[dp->op[1].bytemode][vindex];
   9215       break;
   9216 
   9217     case USE_XOP_8F_TABLE:
   9218       if (!fetch_code (ins->info, ins->codep + 3))
   9219 	return &err_opcode;
   9220       ins->rex = ~(*ins->codep >> 5) & 0x7;
   9221 
   9222       /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm".  */
   9223       switch ((*ins->codep & 0x1f))
   9224 	{
   9225 	default:
   9226 	  dp = &bad_opcode;
   9227 	  return dp;
   9228 	case 0x8:
   9229 	  vex_table_index = XOP_08;
   9230 	  break;
   9231 	case 0x9:
   9232 	  vex_table_index = XOP_09;
   9233 	  break;
   9234 	case 0xa:
   9235 	  vex_table_index = XOP_0A;
   9236 	  break;
   9237 	}
   9238       ins->codep++;
   9239       ins->vex.w = *ins->codep & 0x80;
   9240       if (ins->vex.w && ins->address_mode == mode_64bit)
   9241 	ins->rex |= REX_W;
   9242 
   9243       ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf;
   9244       if (ins->address_mode != mode_64bit)
   9245 	{
   9246 	  /* In 16/32-bit mode REX_B is silently ignored.  */
   9247 	  ins->rex &= ~REX_B;
   9248 	}
   9249 
   9250       ins->vex.length = (*ins->codep & 0x4) ? 256 : 128;
   9251       switch ((*ins->codep & 0x3))
   9252 	{
   9253 	case 0:
   9254 	  break;
   9255 	case 1:
   9256 	  ins->vex.prefix = DATA_PREFIX_OPCODE;
   9257 	  break;
   9258 	case 2:
   9259 	  ins->vex.prefix = REPE_PREFIX_OPCODE;
   9260 	  break;
   9261 	case 3:
   9262 	  ins->vex.prefix = REPNE_PREFIX_OPCODE;
   9263 	  break;
   9264 	}
   9265       ins->need_vex = 3;
   9266       ins->codep++;
   9267       vindex = *ins->codep++;
   9268       dp = &xop_table[vex_table_index][vindex];
   9269 
   9270       ins->end_codep = ins->codep;
   9271       if (!fetch_modrm (ins))
   9272 	return &err_opcode;
   9273 
   9274       /* No XOP encoding so far allows for a non-zero embedded prefix. Avoid
   9275 	 having to decode the bits for every otherwise valid encoding.  */
   9276       if (ins->vex.prefix)
   9277 	return &bad_opcode;
   9278       break;
   9279 
   9280     case USE_VEX_C4_TABLE:
   9281       /* VEX prefix.  */
   9282       if (!fetch_code (ins->info, ins->codep + 3))
   9283 	return &err_opcode;
   9284       ins->rex = ~(*ins->codep >> 5) & 0x7;
   9285       switch ((*ins->codep & 0x1f))
   9286 	{
   9287 	default:
   9288 	  dp = &bad_opcode;
   9289 	  return dp;
   9290 	case 0x1:
   9291 	  vex_table_index = VEX_0F;
   9292 	  break;
   9293 	case 0x2:
   9294 	  vex_table_index = VEX_0F38;
   9295 	  break;
   9296 	case 0x3:
   9297 	  vex_table_index = VEX_0F3A;
   9298 	  break;
   9299 	case 0x5:
   9300 	  vex_table_index = VEX_MAP5;
   9301 	  break;
   9302 	case 0x7:
   9303 	  vex_table_index = VEX_MAP7;
   9304 	  break;
   9305 	}
   9306       ins->codep++;
   9307       ins->vex.w = *ins->codep & 0x80;
   9308       if (ins->address_mode == mode_64bit)
   9309 	{
   9310 	  if (ins->vex.w)
   9311 	    ins->rex |= REX_W;
   9312 	}
   9313       else
   9314 	{
   9315 	  /* For the 3-byte VEX prefix in 32-bit mode, the REX_B bit
   9316 	     is ignored, other REX bits are 0 and the highest bit in
   9317 	     VEX.vvvv is also ignored (but we mustn't clear it here).  */
   9318 	  ins->rex = 0;
   9319 	}
   9320       ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf;
   9321       ins->vex.length = (*ins->codep & 0x4) ? 256 : 128;
   9322       switch ((*ins->codep & 0x3))
   9323 	{
   9324 	case 0:
   9325 	  break;
   9326 	case 1:
   9327 	  ins->vex.prefix = DATA_PREFIX_OPCODE;
   9328 	  break;
   9329 	case 2:
   9330 	  ins->vex.prefix = REPE_PREFIX_OPCODE;
   9331 	  break;
   9332 	case 3:
   9333 	  ins->vex.prefix = REPNE_PREFIX_OPCODE;
   9334 	  break;
   9335 	}
   9336       ins->need_vex = 3;
   9337       ins->codep++;
   9338       vindex = *ins->codep++;
   9339       ins->condition_code = vindex & 0xf;
   9340       if (vex_table_index != VEX_MAP7 && vex_table_index != VEX_MAP5)
   9341 	dp = &vex_table[vex_table_index][vindex];
   9342       else if (vindex == 0xf6)
   9343 	dp = &map7_f6_opcode;
   9344       else if (vindex == 0xf8)
   9345 	{
   9346 	  if (vex_table_index == VEX_MAP5)
   9347 	    dp = &map5_f8_opcode;
   9348 	  else
   9349 	    dp = &map7_f8_opcode;
   9350 	}
   9351       else if (vindex == 0xf9)
   9352 	dp = &map5_f9_opcode;
   9353       else if (vindex == 0xfd)
   9354 	dp = &map5_fd_opcode;
   9355       else
   9356 	dp = &bad_opcode;
   9357       ins->end_codep = ins->codep;
   9358       /* There is no MODRM byte for VEX0F 77.  */
   9359       if ((vex_table_index != VEX_0F || vindex != 0x77)
   9360 	  && !fetch_modrm (ins))
   9361 	return &err_opcode;
   9362       break;
   9363 
   9364     case USE_VEX_C5_TABLE:
   9365       /* VEX prefix.  */
   9366       if (!fetch_code (ins->info, ins->codep + 2))
   9367 	return &err_opcode;
   9368       ins->rex = (*ins->codep & 0x80) ? 0 : REX_R;
   9369 
   9370       /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in
   9371 	 VEX.vvvv is 1.  */
   9372       ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf;
   9373       ins->vex.length = (*ins->codep & 0x4) ? 256 : 128;
   9374       switch ((*ins->codep & 0x3))
   9375 	{
   9376 	case 0:
   9377 	  break;
   9378 	case 1:
   9379 	  ins->vex.prefix = DATA_PREFIX_OPCODE;
   9380 	  break;
   9381 	case 2:
   9382 	  ins->vex.prefix = REPE_PREFIX_OPCODE;
   9383 	  break;
   9384 	case 3:
   9385 	  ins->vex.prefix = REPNE_PREFIX_OPCODE;
   9386 	  break;
   9387 	}
   9388       ins->need_vex = 2;
   9389       ins->codep++;
   9390       vindex = *ins->codep++;
   9391       dp = &vex_table[VEX_0F][vindex];
   9392       ins->end_codep = ins->codep;
   9393       /* There is no MODRM byte for VEX 77.  */
   9394       if (vindex != 0x77 && !fetch_modrm (ins))
   9395 	return &err_opcode;
   9396       break;
   9397 
   9398     case USE_VEX_W_TABLE:
   9399     use_vex_w_table:
   9400       if (!ins->need_vex)
   9401 	abort ();
   9402 
   9403       dp = &vex_w_table[dp->op[1].bytemode][ins->vex.w];
   9404       break;
   9405 
   9406     case USE_EVEX_TABLE:
   9407       ins->two_source_ops = false;
   9408       /* EVEX prefix.  */
   9409       ins->vex.evex = true;
   9410       if (!fetch_code (ins->info, ins->codep + 4))
   9411 	return &err_opcode;
   9412       /* The first byte after 0x62.  */
   9413       if (*ins->codep & 0x8)
   9414 	ins->rex2 |= REX_B;
   9415       if (!(*ins->codep & 0x10))
   9416 	ins->rex2 |= REX_R;
   9417 
   9418       ins->rex = ~(*ins->codep >> 5) & 0x7;
   9419       switch (*ins->codep & 0x7)
   9420 	{
   9421 	default:
   9422 	  return &bad_opcode;
   9423 	case 0x1:
   9424 	  vex_table_index = EVEX_0F;
   9425 	  break;
   9426 	case 0x2:
   9427 	  vex_table_index = EVEX_0F38;
   9428 	  break;
   9429 	case 0x3:
   9430 	  vex_table_index = EVEX_0F3A;
   9431 	  break;
   9432 	case 0x4:
   9433 	  vex_table_index = EVEX_MAP4;
   9434 	  ins->evex_type = evex_from_legacy;
   9435 	  if (ins->address_mode != mode_64bit)
   9436 	    return &bad_opcode;
   9437 	  ins->rex |= REX_OPCODE;
   9438 	  break;
   9439 	case 0x5:
   9440 	  vex_table_index = EVEX_MAP5;
   9441 	  break;
   9442 	case 0x6:
   9443 	  vex_table_index = EVEX_MAP6;
   9444 	  break;
   9445 	case 0x7:
   9446 	  vex_table_index = EVEX_MAP7;
   9447 	  break;
   9448 	}
   9449 
   9450       /* The second byte after 0x62.  */
   9451       ins->codep++;
   9452       ins->vex.w = *ins->codep & 0x80;
   9453       if (ins->vex.w && ins->address_mode == mode_64bit)
   9454 	ins->rex |= REX_W;
   9455 
   9456       ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf;
   9457 
   9458       if (!(*ins->codep & 0x4))
   9459 	ins->rex2 |= REX_X;
   9460 
   9461       switch ((*ins->codep & 0x3))
   9462 	{
   9463 	case 0:
   9464 	  break;
   9465 	case 1:
   9466 	  ins->vex.prefix = DATA_PREFIX_OPCODE;
   9467 	  break;
   9468 	case 2:
   9469 	  ins->vex.prefix = REPE_PREFIX_OPCODE;
   9470 	  break;
   9471 	case 3:
   9472 	  ins->vex.prefix = REPNE_PREFIX_OPCODE;
   9473 	  break;
   9474 	}
   9475 
   9476       /* The third byte after 0x62.  */
   9477       ins->codep++;
   9478 
   9479       /* Remember the static rounding bits.  */
   9480       ins->vex.ll = (*ins->codep >> 5) & 3;
   9481       ins->vex.b = *ins->codep & 0x10;
   9482 
   9483       ins->vex.v = *ins->codep & 0x8;
   9484       ins->vex.mask_register_specifier = *ins->codep & 0x7;
   9485       ins->vex.scc = *ins->codep & 0xf;
   9486       ins->vex.zeroing = *ins->codep & 0x80;
   9487       /* Set the NF bit for EVEX-Promoted instructions, this bit will be cleared
   9488 	 when it's an evex_default one.  */
   9489       ins->vex.nf = *ins->codep & 0x4;
   9490 
   9491       if (ins->address_mode != mode_64bit)
   9492 	{
   9493 	  /* Report bad for !evex_default and when two fixed values of evex
   9494 	     change.  */
   9495 	  if (ins->evex_type != evex_default
   9496 	      || (ins->rex2 & (REX_B | REX_X)))
   9497 	    return &bad_opcode;
   9498 	  /* In 16/32-bit mode silently ignore following bits.  */
   9499 	  ins->rex &= ~REX_B;
   9500 	  ins->rex2 &= ~REX_R;
   9501 	}
   9502 
   9503       ins->need_vex = 4;
   9504 
   9505       ins->codep++;
   9506       vindex = *ins->codep++;
   9507       ins->condition_code = vindex & 0xf;
   9508       if (vex_table_index != EVEX_MAP7)
   9509 	dp = &evex_table[vex_table_index][vindex];
   9510       else if (vindex == 0xf8)
   9511 	dp = &map7_f8_opcode;
   9512       else if (vindex == 0xf6)
   9513 	dp = &map7_f6_opcode;
   9514       else
   9515 	dp = &bad_opcode;
   9516       ins->end_codep = ins->codep;
   9517       if (!fetch_modrm (ins))
   9518 	return &err_opcode;
   9519 
   9520       if (ins->modrm.mod == 3 && (ins->rex2 & REX_X))
   9521 	return &bad_opcode;
   9522 
   9523       /* Set vector length. For EVEX-promoted instructions, evex.ll == 0b00,
   9524 	 which has the same encoding as vex.length == 128 and they can share
   9525 	 the same processing with vex.length in OP_VEX.  */
   9526       if (ins->modrm.mod == 3 && ins->vex.b && ins->evex_type != evex_from_legacy)
   9527 	ins->vex.length = 512;
   9528       else
   9529 	{
   9530 	  switch (ins->vex.ll)
   9531 	    {
   9532 	    case 0x0:
   9533 	      ins->vex.length = 128;
   9534 	      break;
   9535 	    case 0x1:
   9536 	      ins->vex.length = 256;
   9537 	      break;
   9538 	    case 0x2:
   9539 	      ins->vex.length = 512;
   9540 	      break;
   9541 	    default:
   9542 	      return &bad_opcode;
   9543 	    }
   9544 	}
   9545       break;
   9546 
   9547     case 0:
   9548       dp = &bad_opcode;
   9549       break;
   9550 
   9551     default:
   9552       abort ();
   9553     }
   9554 
   9555   if (dp->name != NULL)
   9556     return dp;
   9557   else
   9558     return get_valid_dis386 (dp, ins);
   9559 }
   9560 
   9561 static bool
   9562 get_sib (instr_info *ins, int sizeflag)
   9563 {
   9564   /* If modrm.mod == 3, operand must be register.  */
   9565   if (ins->need_modrm
   9566       && ((sizeflag & AFLAG) || ins->address_mode == mode_64bit)
   9567       && ins->modrm.mod != 3
   9568       && ins->modrm.rm == 4)
   9569     {
   9570       if (!fetch_code (ins->info, ins->codep + 2))
   9571 	return false;
   9572       ins->sib.index = (ins->codep[1] >> 3) & 7;
   9573       ins->sib.scale = (ins->codep[1] >> 6) & 3;
   9574       ins->sib.base = ins->codep[1] & 7;
   9575       ins->has_sib = true;
   9576     }
   9577   else
   9578     ins->has_sib = false;
   9579 
   9580   return true;
   9581 }
   9582 
   9583 /* Like oappend_with_style (below) but always with text style.  */
   9584 
   9585 static void
   9586 oappend (instr_info *ins, const char *s)
   9587 {
   9588   oappend_with_style (ins, s, dis_style_text);
   9589 }
   9590 
   9591 /* Like oappend (above), but S is a string starting with '%'.  In
   9592    Intel syntax, the '%' is elided.  */
   9593 
   9594 static void
   9595 oappend_register (instr_info *ins, const char *s)
   9596 {
   9597   oappend_with_style (ins, s + ins->intel_syntax, dis_style_register);
   9598 }
   9599 
   9600 /* Wrap around a call to INS->info->fprintf_styled_func, printing FMT.
   9601    STYLE is the default style to use in the fprintf_styled_func calls,
   9602    however, FMT might include embedded style markers (see oappend_style),
   9603    these embedded markers are not printed, but instead change the style
   9604    used in the next fprintf_styled_func call.  */
   9605 
   9606 static void ATTRIBUTE_PRINTF_3
   9607 i386_dis_printf (const disassemble_info *info, enum disassembler_style style,
   9608 		 const char *fmt, ...)
   9609 {
   9610   va_list ap;
   9611   enum disassembler_style curr_style = style;
   9612   const char *start, *curr;
   9613   char staging_area[50];
   9614 
   9615   va_start (ap, fmt);
   9616   /* In particular print_insn()'s processing of op_txt[] can hand rather long
   9617      strings here.  Bypass vsnprintf() in such cases to avoid capacity issues
   9618      with the staging area.  */
   9619   if (strcmp (fmt, "%s"))
   9620     {
   9621       int res = vsnprintf (staging_area, sizeof (staging_area), fmt, ap);
   9622 
   9623       va_end (ap);
   9624 
   9625       if (res < 0)
   9626 	return;
   9627 
   9628       if ((size_t) res >= sizeof (staging_area))
   9629 	abort ();
   9630 
   9631       start = curr = staging_area;
   9632     }
   9633   else
   9634     {
   9635       start = curr = va_arg (ap, const char *);
   9636       va_end (ap);
   9637     }
   9638 
   9639   do
   9640     {
   9641       if (*curr == '\0'
   9642 	  || (*curr == STYLE_MARKER_CHAR
   9643 	      && ISXDIGIT (*(curr + 1))
   9644 	      && *(curr + 2) == STYLE_MARKER_CHAR))
   9645 	{
   9646 	  /* Output content between our START position and CURR.  */
   9647 	  int len = curr - start;
   9648 	  int n = (*info->fprintf_styled_func) (info->stream, curr_style,
   9649 						"%.*s", len, start);
   9650 	  if (n < 0)
   9651 	    break;
   9652 
   9653 	  if (*curr == '\0')
   9654 	    break;
   9655 
   9656 	  /* Skip over the initial STYLE_MARKER_CHAR.  */
   9657 	  ++curr;
   9658 
   9659 	  /* Update the CURR_STYLE.  As there are less than 16 styles, it
   9660 	     is possible, that if the input is corrupted in some way, that
   9661 	     we might set CURR_STYLE to an invalid value.  Don't worry
   9662 	     though, we check for this situation.  */
   9663 	  if (*curr >= '0' && *curr <= '9')
   9664 	    curr_style = (enum disassembler_style) (*curr - '0');
   9665 	  else if (*curr >= 'a' && *curr <= 'f')
   9666 	    curr_style = (enum disassembler_style) (*curr - 'a' + 10);
   9667 	  else
   9668 	    curr_style = dis_style_text;
   9669 
   9670 	  /* Check for an invalid style having been selected.  This should
   9671 	     never happen, but it doesn't hurt to be a little paranoid.  */
   9672 	  if (curr_style > dis_style_comment_start)
   9673 	    curr_style = dis_style_text;
   9674 
   9675 	  /* Skip the hex character, and the closing STYLE_MARKER_CHAR.  */
   9676 	  curr += 2;
   9677 
   9678 	  /* Reset the START to after the style marker.  */
   9679 	  start = curr;
   9680 	}
   9681       else
   9682 	++curr;
   9683     }
   9684   while (true);
   9685 }
   9686 
   9687 static int
   9688 print_insn (bfd_vma pc, disassemble_info *info, int intel_syntax)
   9689 {
   9690   const struct dis386 *dp;
   9691   int i;
   9692   int ret;
   9693   char *op_txt[MAX_OPERANDS];
   9694   int needcomma;
   9695   bool intel_swap_2_3;
   9696   int sizeflag, orig_sizeflag;
   9697   const char *p;
   9698   struct dis_private priv;
   9699   int prefix_length;
   9700   int op_count;
   9701   instr_info ins = {
   9702     .info = info,
   9703     .intel_syntax = intel_syntax >= 0
   9704 		    ? intel_syntax
   9705 		    : (info->mach & bfd_mach_i386_intel_syntax) != 0,
   9706     .intel_mnemonic = !SYSV386_COMPAT,
   9707     .op_index[0 ... MAX_OPERANDS - 1] = -1,
   9708     .start_pc = pc,
   9709     .start_codep = priv.the_buffer,
   9710     .codep = priv.the_buffer,
   9711     .obufp = ins.obuf,
   9712     .last_lock_prefix = -1,
   9713     .last_repz_prefix = -1,
   9714     .last_repnz_prefix = -1,
   9715     .last_data_prefix = -1,
   9716     .last_addr_prefix = -1,
   9717     .last_rex_prefix = -1,
   9718     .last_rex2_prefix = -1,
   9719     .last_seg_prefix = -1,
   9720     .fwait_prefix = -1,
   9721   };
   9722   char op_out[MAX_OPERANDS][MAX_OPERAND_BUFFER_SIZE];
   9723 
   9724   priv.orig_sizeflag = AFLAG | DFLAG;
   9725   if ((info->mach & bfd_mach_i386_i386) != 0)
   9726     ins.address_mode = mode_32bit;
   9727   else if (info->mach == bfd_mach_i386_i8086)
   9728     {
   9729       ins.address_mode = mode_16bit;
   9730       priv.orig_sizeflag = 0;
   9731     }
   9732   else
   9733     ins.address_mode = mode_64bit;
   9734 
   9735   for (p = info->disassembler_options; p != NULL;)
   9736     {
   9737       if (startswith (p, "amd64"))
   9738 	ins.isa64 = amd64;
   9739       else if (startswith (p, "intel64"))
   9740 	ins.isa64 = intel64;
   9741       else if (startswith (p, "x86-64"))
   9742 	{
   9743 	  ins.address_mode = mode_64bit;
   9744 	  priv.orig_sizeflag |= AFLAG | DFLAG;
   9745 	}
   9746       else if (startswith (p, "i386"))
   9747 	{
   9748 	  ins.address_mode = mode_32bit;
   9749 	  priv.orig_sizeflag |= AFLAG | DFLAG;
   9750 	}
   9751       else if (startswith (p, "i8086"))
   9752 	{
   9753 	  ins.address_mode = mode_16bit;
   9754 	  priv.orig_sizeflag &= ~(AFLAG | DFLAG);
   9755 	}
   9756       else if (startswith (p, "intel"))
   9757 	{
   9758 	  if (startswith (p + 5, "-mnemonic"))
   9759 	    ins.intel_mnemonic = true;
   9760 	  else
   9761 	    ins.intel_syntax = 1;
   9762 	}
   9763       else if (startswith (p, "att"))
   9764 	{
   9765 	  ins.intel_syntax = 0;
   9766 	  if (startswith (p + 3, "-mnemonic"))
   9767 	    ins.intel_mnemonic = false;
   9768 	}
   9769       else if (startswith (p, "addr"))
   9770 	{
   9771 	  if (ins.address_mode == mode_64bit)
   9772 	    {
   9773 	      if (p[4] == '3' && p[5] == '2')
   9774 		priv.orig_sizeflag &= ~AFLAG;
   9775 	      else if (p[4] == '6' && p[5] == '4')
   9776 		priv.orig_sizeflag |= AFLAG;
   9777 	    }
   9778 	  else
   9779 	    {
   9780 	      if (p[4] == '1' && p[5] == '6')
   9781 		priv.orig_sizeflag &= ~AFLAG;
   9782 	      else if (p[4] == '3' && p[5] == '2')
   9783 		priv.orig_sizeflag |= AFLAG;
   9784 	    }
   9785 	}
   9786       else if (startswith (p, "data"))
   9787 	{
   9788 	  if (p[4] == '1' && p[5] == '6')
   9789 	    priv.orig_sizeflag &= ~DFLAG;
   9790 	  else if (p[4] == '3' && p[5] == '2')
   9791 	    priv.orig_sizeflag |= DFLAG;
   9792 	}
   9793       else if (startswith (p, "suffix"))
   9794 	priv.orig_sizeflag |= SUFFIX_ALWAYS;
   9795 
   9796       p = strchr (p, ',');
   9797       if (p != NULL)
   9798 	p++;
   9799     }
   9800 
   9801   if (ins.address_mode == mode_64bit && sizeof (bfd_vma) < 8)
   9802     {
   9803       i386_dis_printf (info, dis_style_text, _("64-bit address is disabled"));
   9804       return -1;
   9805     }
   9806 
   9807   if (ins.intel_syntax)
   9808     {
   9809       ins.open_char = '[';
   9810       ins.close_char = ']';
   9811       ins.separator_char = '+';
   9812       ins.scale_char = '*';
   9813     }
   9814   else
   9815     {
   9816       ins.open_char = '(';
   9817       ins.close_char =  ')';
   9818       ins.separator_char = ',';
   9819       ins.scale_char = ',';
   9820     }
   9821 
   9822   /* The output looks better if we put 7 bytes on a line, since that
   9823      puts most long word instructions on a single line.  */
   9824   info->bytes_per_line = 7;
   9825 
   9826   info->private_data = &priv;
   9827   priv.fetched = 0;
   9828   priv.insn_start = pc;
   9829 
   9830   for (i = 0; i < MAX_OPERANDS; ++i)
   9831     {
   9832       op_out[i][0] = 0;
   9833       ins.op_out[i] = op_out[i];
   9834     }
   9835 
   9836   sizeflag = priv.orig_sizeflag;
   9837 
   9838   switch (ckprefix (&ins))
   9839     {
   9840     case ckp_okay:
   9841       break;
   9842 
   9843     case ckp_bogus:
   9844       /* Too many prefixes or unused REX prefixes.  */
   9845       for (i = 0;
   9846 	   i < (int) ARRAY_SIZE (ins.all_prefixes) && ins.all_prefixes[i];
   9847 	   i++)
   9848 	i386_dis_printf (info, dis_style_mnemonic, "%s%s",
   9849 			 (i == 0 ? "" : " "),
   9850 			 prefix_name (ins.address_mode, ins.all_prefixes[i],
   9851 				      sizeflag));
   9852       ret = i;
   9853       goto out;
   9854 
   9855     case ckp_fetch_error:
   9856       goto fetch_error_out;
   9857     }
   9858 
   9859   ins.nr_prefixes = ins.codep - ins.start_codep;
   9860 
   9861   if (!fetch_code (info, ins.codep + 1))
   9862     {
   9863     fetch_error_out:
   9864       ret = fetch_error (&ins);
   9865       goto out;
   9866     }
   9867 
   9868   ins.two_source_ops = (*ins.codep == 0x62 || *ins.codep == 0xc8);
   9869 
   9870   if ((ins.prefixes & PREFIX_FWAIT)
   9871       && (*ins.codep < 0xd8 || *ins.codep > 0xdf))
   9872     {
   9873       /* Handle ins.prefixes before fwait.  */
   9874       for (i = 0; i < ins.fwait_prefix && ins.all_prefixes[i];
   9875 	   i++)
   9876 	i386_dis_printf (info, dis_style_mnemonic, "%s ",
   9877 			 prefix_name (ins.address_mode, ins.all_prefixes[i],
   9878 				      sizeflag));
   9879       i386_dis_printf (info, dis_style_mnemonic, "fwait");
   9880       ret = i + 1;
   9881       goto out;
   9882     }
   9883 
   9884   /* REX2.M in rex2 prefix represents map0 or map1.  */
   9885   if (ins.last_rex2_prefix < 0 ? *ins.codep == 0x0f : (ins.rex2 & REX2_M))
   9886     {
   9887       if (!ins.rex2)
   9888 	{
   9889 	  ins.codep++;
   9890 	  if (!fetch_code (info, ins.codep + 1))
   9891 	    goto fetch_error_out;
   9892 	}
   9893 
   9894       dp = &dis386_twobyte[*ins.codep];
   9895       ins.need_modrm = twobyte_has_modrm[*ins.codep];
   9896     }
   9897   else
   9898     {
   9899       dp = &dis386[*ins.codep];
   9900       ins.need_modrm = onebyte_has_modrm[*ins.codep];
   9901     }
   9902   ins.condition_code = *ins.codep & 0xf;
   9903   ins.codep++;
   9904 
   9905   /* Save sizeflag for printing the extra ins.prefixes later before updating
   9906      it for mnemonic and operand processing.  The prefix names depend
   9907      only on the address mode.  */
   9908   orig_sizeflag = sizeflag;
   9909   if (ins.prefixes & PREFIX_ADDR)
   9910     sizeflag ^= AFLAG;
   9911   if ((ins.prefixes & PREFIX_DATA))
   9912     sizeflag ^= DFLAG;
   9913 
   9914   ins.end_codep = ins.codep;
   9915   if (ins.need_modrm && !fetch_modrm (&ins))
   9916     goto fetch_error_out;
   9917 
   9918   if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
   9919     {
   9920       if (!get_sib (&ins, sizeflag)
   9921 	  || !dofloat (&ins, sizeflag))
   9922 	goto fetch_error_out;
   9923     }
   9924   else
   9925     {
   9926       dp = get_valid_dis386 (dp, &ins);
   9927       if (dp == &err_opcode)
   9928 	goto fetch_error_out;
   9929 
   9930       /* For APX instructions promoted from legacy maps 0/1, embedded prefix
   9931 	 is interpreted as the operand size override.  */
   9932       if (ins.evex_type == evex_from_legacy
   9933 	  && ins.vex.prefix == DATA_PREFIX_OPCODE)
   9934 	sizeflag ^= DFLAG;
   9935 
   9936       if(ins.evex_type == evex_default)
   9937 	ins.vex.nf = false;
   9938       else
   9939 	/* For EVEX-promoted formats, we need to clear EVEX.NF (ccmp and ctest
   9940 	   are cleared separately.) in mask_register_specifier and keep the low
   9941 	   2 bits of mask_register_specifier to report errors for invalid cases
   9942 	   .  */
   9943 	ins.vex.mask_register_specifier &= 0x3;
   9944 
   9945       if (dp != NULL && putop (&ins, dp->name, sizeflag) == 0)
   9946 	{
   9947 	  if (!get_sib (&ins, sizeflag))
   9948 	    goto fetch_error_out;
   9949 	  for (i = 0; i < MAX_OPERANDS; ++i)
   9950 	    {
   9951 	      ins.obufp = ins.op_out[i];
   9952 	      ins.op_ad = MAX_OPERANDS - 1 - i;
   9953 	      if (dp->op[i].rtn
   9954 		  && !dp->op[i].rtn (&ins, dp->op[i].bytemode, sizeflag))
   9955 		goto fetch_error_out;
   9956 	      /* For EVEX instruction after the last operand masking
   9957 		 should be printed.  */
   9958 	      if (i == 0 && ins.vex.evex)
   9959 		{
   9960 		  /* Don't print {%k0}.  */
   9961 		  if (ins.vex.mask_register_specifier)
   9962 		    {
   9963 		      const char *reg_name
   9964 			= att_names_mask[ins.vex.mask_register_specifier];
   9965 
   9966 		      oappend (&ins, "{");
   9967 		      oappend_register (&ins, reg_name);
   9968 		      oappend (&ins, "}");
   9969 
   9970 		      if (ins.vex.zeroing)
   9971 			oappend (&ins, "{z}");
   9972 		    }
   9973 		  else if (ins.vex.zeroing)
   9974 		    {
   9975 		      oappend (&ins, "{bad}");
   9976 		      continue;
   9977 		    }
   9978 
   9979 		  /* Instructions with a mask register destination allow for
   9980 		     zeroing-masking only (if any masking at all), which is
   9981 		     _not_ expressed by EVEX.z.  */
   9982 		  if (ins.vex.zeroing && dp->op[0].bytemode == mask_mode)
   9983 		    ins.illegal_masking = true;
   9984 
   9985 		  /* S/G insns require a mask and don't allow
   9986 		     zeroing-masking.  */
   9987 		  if ((dp->op[0].bytemode == vex_vsib_d_w_dq_mode
   9988 		       || dp->op[0].bytemode == vex_vsib_q_w_dq_mode)
   9989 		      && (ins.vex.mask_register_specifier == 0
   9990 			  || ins.vex.zeroing))
   9991 		    ins.illegal_masking = true;
   9992 
   9993 		  if (ins.illegal_masking)
   9994 		    oappend (&ins, "/(bad)");
   9995 		}
   9996 	    }
   9997 	  /* vex.nf is cleared after being consumed.  */
   9998 	  if (ins.vex.nf)
   9999 	    oappend (&ins, "{bad-nf}");
   10000 
   10001 	  /* Check whether rounding control was enabled for an insn not
   10002 	     supporting it, when evex.b is not treated as evex.nd.  */
   10003 	  if (ins.modrm.mod == 3 && ins.vex.b && ins.evex_type == evex_default
   10004 	      && !(ins.evex_used & EVEX_b_used))
   10005 	    {
   10006 	      for (i = 0; i < MAX_OPERANDS; ++i)
   10007 		{
   10008 		  ins.obufp = ins.op_out[i];
   10009 		  if (*ins.obufp)
   10010 		    continue;
   10011 		  oappend (&ins, names_rounding[ins.vex.ll]);
   10012 		  oappend (&ins, "bad}");
   10013 		  break;
   10014 		}
   10015 	    }
   10016 	}
   10017     }
   10018 
   10019   /* Clear instruction information.  */
   10020   info->insn_info_valid = 0;
   10021   info->branch_delay_insns = 0;
   10022   info->data_size = 0;
   10023   info->insn_type = dis_noninsn;
   10024   info->target = 0;
   10025   info->target2 = 0;
   10026 
   10027   /* Reset jump operation indicator.  */
   10028   ins.op_is_jump = false;
   10029   {
   10030     int jump_detection = 0;
   10031 
   10032     /* Extract flags.  */
   10033     for (i = 0; i < MAX_OPERANDS; ++i)
   10034       {
   10035 	if ((dp->op[i].rtn == OP_J)
   10036 	    || (dp->op[i].rtn == OP_indirE))
   10037 	  jump_detection |= 1;
   10038 	else if ((dp->op[i].rtn == BND_Fixup)
   10039 		 || (!dp->op[i].rtn && !dp->op[i].bytemode))
   10040 	  jump_detection |= 2;
   10041 	else if ((dp->op[i].bytemode == cond_jump_mode)
   10042 		 || (dp->op[i].bytemode == loop_jcxz_mode))
   10043 	  jump_detection |= 4;
   10044       }
   10045 
   10046     /* Determine if this is a jump or branch.  */
   10047     if ((jump_detection & 0x3) == 0x3)
   10048       {
   10049 	ins.op_is_jump = true;
   10050 	if (jump_detection & 0x4)
   10051 	  info->insn_type = dis_condbranch;
   10052 	else
   10053 	  info->insn_type = (dp->name && !strncmp (dp->name, "call", 4))
   10054 	    ? dis_jsr : dis_branch;
   10055       }
   10056   }
   10057   /* The purpose of placing the check here is to wait for the EVEX prefix for
   10058      conditional CMP and TEST to be consumed and cleared, and then make a
   10059      unified judgment. Because they are both in map4, we can not distinguish
   10060      EVEX prefix for conditional CMP and TEST from others during the
   10061      EVEX prefix stage of parsing.  */
   10062   if (ins.evex_type == evex_from_legacy)
   10063     {
   10064       /* EVEX from legacy instructions, when the EVEX.ND bit is 0,
   10065 	 all bits of EVEX.vvvv and EVEX.V' must be 1.  */
   10066       if (!ins.vex.nd && (ins.vex.register_specifier || !ins.vex.v))
   10067 	{
   10068 	  i386_dis_printf (info, dis_style_text, "(bad)");
   10069 	  ret = ins.end_codep - priv.the_buffer;
   10070 	  goto out;
   10071 	}
   10072 
   10073       /* EVEX from legacy instructions require that EVEX.z, EVEX.LL and the
   10074 	 lower 2 bits of EVEX.aaa must be 0.  */
   10075       if ((ins.vex.mask_register_specifier & 0x3) != 0
   10076 	  || ins.vex.ll != 0 || ins.vex.zeroing != 0)
   10077 	{
   10078 	  i386_dis_printf (info, dis_style_text, "(bad)");
   10079 	  ret = ins.end_codep - priv.the_buffer;
   10080 	  goto out;
   10081 	}
   10082     }
   10083   /* If VEX.vvvv and EVEX.vvvv are unused, they must be all 1s, which
   10084      are all 0s in inverted form.  */
   10085   if (ins.need_vex && ins.vex.register_specifier != 0)
   10086     {
   10087       i386_dis_printf (info, dis_style_text, "(bad)");
   10088       ret = ins.end_codep - priv.the_buffer;
   10089       goto out;
   10090     }
   10091 
   10092   if ((dp->prefix_requirement & PREFIX_REX2_ILLEGAL)
   10093       && ins.last_rex2_prefix >= 0 && (ins.rex2 & REX2_SPECIAL) == 0)
   10094     {
   10095       i386_dis_printf (info, dis_style_text, "(bad)");
   10096       ret = ins.end_codep - priv.the_buffer;
   10097       goto out;
   10098     }
   10099 
   10100   switch (dp->prefix_requirement & ~PREFIX_REX2_ILLEGAL)
   10101     {
   10102     case PREFIX_DATA:
   10103       /* If only the data prefix is marked as mandatory, its absence renders
   10104 	 the encoding invalid.  Most other PREFIX_OPCODE rules still apply.  */
   10105       if (ins.need_vex ? !ins.vex.prefix : !(ins.prefixes & PREFIX_DATA))
   10106 	{
   10107 	  i386_dis_printf (info, dis_style_text, "(bad)");
   10108 	  ret = ins.end_codep - priv.the_buffer;
   10109 	  goto out;
   10110 	}
   10111       ins.used_prefixes |= PREFIX_DATA;
   10112       /* Fall through.  */
   10113     case PREFIX_OPCODE:
   10114       /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
   10115 	 unused, opcode is invalid.  Since the PREFIX_DATA prefix may be
   10116 	 used by putop and MMX/SSE operand and may be overridden by the
   10117 	 PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
   10118 	 separately.  */
   10119       if (((ins.need_vex
   10120 	    ? ins.vex.prefix == REPE_PREFIX_OPCODE
   10121 	      || ins.vex.prefix == REPNE_PREFIX_OPCODE
   10122 	    : (ins.prefixes
   10123 	       & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
   10124 	   && (ins.used_prefixes
   10125 	       & (PREFIX_REPZ | PREFIX_REPNZ)) == 0)
   10126 	  || (((ins.need_vex
   10127 		? ins.vex.prefix == DATA_PREFIX_OPCODE
   10128 		: ((ins.prefixes
   10129 		    & (PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA))
   10130 		   == PREFIX_DATA))
   10131 	       && (ins.used_prefixes & PREFIX_DATA) == 0))
   10132 	  || (ins.vex.evex && dp->prefix_requirement != PREFIX_DATA
   10133 	      && !ins.vex.w != !(ins.used_prefixes & PREFIX_DATA)))
   10134 	{
   10135 	  i386_dis_printf (info, dis_style_text, "(bad)");
   10136 	  ret = ins.end_codep - priv.the_buffer;
   10137 	  goto out;
   10138 	}
   10139       break;
   10140 
   10141     case PREFIX_IGNORED:
   10142       /* Zap data size and rep prefixes from used_prefixes and reinstate their
   10143 	 origins in all_prefixes.  */
   10144       ins.used_prefixes &= ~PREFIX_OPCODE;
   10145       if (ins.last_data_prefix >= 0)
   10146 	ins.all_prefixes[ins.last_data_prefix] = 0x66;
   10147       if (ins.last_repz_prefix >= 0)
   10148 	ins.all_prefixes[ins.last_repz_prefix] = 0xf3;
   10149       if (ins.last_repnz_prefix >= 0)
   10150 	ins.all_prefixes[ins.last_repnz_prefix] = 0xf2;
   10151       break;
   10152 
   10153     case PREFIX_NP_OR_DATA:
   10154       if (ins.vex.prefix == REPE_PREFIX_OPCODE
   10155 	  || ins.vex.prefix == REPNE_PREFIX_OPCODE)
   10156 	{
   10157 	  i386_dis_printf (info, dis_style_text, "(bad)");
   10158 	  ret = ins.end_codep - priv.the_buffer;
   10159 	  goto out;
   10160 	}
   10161       break;
   10162 
   10163     case NO_PREFIX:
   10164       if (ins.vex.prefix)
   10165 	{
   10166 	  i386_dis_printf (info, dis_style_text, "(bad)");
   10167 	  ret = ins.end_codep - priv.the_buffer;
   10168 	  goto out;
   10169 	}
   10170       break;
   10171     }
   10172 
   10173   /* Check if the REX prefix is used.  */
   10174   if ((ins.rex ^ ins.rex_used) == 0
   10175       && !ins.need_vex && ins.last_rex_prefix >= 0)
   10176     ins.all_prefixes[ins.last_rex_prefix] = 0;
   10177 
   10178   /* Check if the REX2 prefix is used.  */
   10179   if (ins.last_rex2_prefix >= 0
   10180       && ((ins.rex2 & REX2_SPECIAL)
   10181 	  || (((ins.rex2 & 7) ^ (ins.rex2_used & 7)) == 0
   10182 	      && (ins.rex ^ ins.rex_used) == 0
   10183 	      && (ins.rex2 & 7))))
   10184     ins.all_prefixes[ins.last_rex2_prefix] = 0;
   10185 
   10186   /* Check if the SEG prefix is used.  */
   10187   if ((ins.prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
   10188 		       | PREFIX_FS | PREFIX_GS)) != 0
   10189       && (ins.used_prefixes & ins.active_seg_prefix) != 0)
   10190     ins.all_prefixes[ins.last_seg_prefix] = 0;
   10191 
   10192   /* Check if the ADDR prefix is used.  */
   10193   if ((ins.prefixes & PREFIX_ADDR) != 0
   10194       && (ins.used_prefixes & PREFIX_ADDR) != 0)
   10195     ins.all_prefixes[ins.last_addr_prefix] = 0;
   10196 
   10197   /* Check if the DATA prefix is used.  */
   10198   if ((ins.prefixes & PREFIX_DATA) != 0
   10199       && (ins.used_prefixes & PREFIX_DATA) != 0
   10200       && !ins.need_vex)
   10201     ins.all_prefixes[ins.last_data_prefix] = 0;
   10202 
   10203   /* Print the extra ins.prefixes.  */
   10204   prefix_length = 0;
   10205   for (i = 0; i < (int) ARRAY_SIZE (ins.all_prefixes); i++)
   10206     if (ins.all_prefixes[i])
   10207       {
   10208 	const char *name = prefix_name (ins.address_mode, ins.all_prefixes[i],
   10209 					orig_sizeflag);
   10210 
   10211 	if (name == NULL)
   10212 	  abort ();
   10213 	prefix_length += strlen (name) + 1;
   10214 	if (ins.all_prefixes[i] == REX2_OPCODE)
   10215 	  i386_dis_printf (info, dis_style_mnemonic, "{%s 0x%x} ", name,
   10216 			   (unsigned int) ins.rex2_payload);
   10217 	else
   10218 	  i386_dis_printf (info, dis_style_mnemonic, "%s ", name);
   10219       }
   10220 
   10221   /* Check maximum code length.  */
   10222   if ((ins.codep - ins.start_codep) > MAX_CODE_LENGTH)
   10223     {
   10224       i386_dis_printf (info, dis_style_text, "(bad)");
   10225       ret = MAX_CODE_LENGTH;
   10226       goto out;
   10227     }
   10228 
   10229   /* Calculate the number of operands this instruction has.  */
   10230   op_count = 0;
   10231   for (i = 0; i < MAX_OPERANDS; ++i)
   10232     if (*ins.op_out[i] != '\0')
   10233       ++op_count;
   10234 
   10235   /* Calculate the number of spaces to print after the mnemonic.  */
   10236   ins.obufp = ins.mnemonicendp;
   10237   if (op_count > 0)
   10238     {
   10239       i = strlen (ins.obuf) + prefix_length;
   10240       if (i < 7)
   10241 	i = 7 - i;
   10242       else
   10243 	i = 1;
   10244     }
   10245   else
   10246     i = 0;
   10247 
   10248   /* Print the instruction mnemonic along with any trailing whitespace.  */
   10249   i386_dis_printf (info, dis_style_mnemonic, "%s%*s", ins.obuf, i, "");
   10250 
   10251   /* The enter and bound instructions are printed with operands in the same
   10252      order as the intel book; everything else is printed in reverse order.  */
   10253   intel_swap_2_3 = false;
   10254   if (ins.intel_syntax || ins.two_source_ops)
   10255     {
   10256       for (i = 0; i < MAX_OPERANDS; ++i)
   10257 	op_txt[i] = ins.op_out[i];
   10258 
   10259       if (ins.intel_syntax && dp && dp->op[2].rtn == OP_Rounding
   10260           && dp->op[3].rtn == OP_E && dp->op[4].rtn == NULL)
   10261 	{
   10262 	  op_txt[2] = ins.op_out[3];
   10263 	  op_txt[3] = ins.op_out[2];
   10264 	  intel_swap_2_3 = true;
   10265 	}
   10266 
   10267       for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
   10268 	{
   10269 	  bool riprel;
   10270 
   10271 	  ins.op_ad = ins.op_index[i];
   10272 	  ins.op_index[i] = ins.op_index[MAX_OPERANDS - 1 - i];
   10273 	  ins.op_index[MAX_OPERANDS - 1 - i] = ins.op_ad;
   10274 	  riprel = ins.op_riprel[i];
   10275 	  ins.op_riprel[i] = ins.op_riprel[MAX_OPERANDS - 1 - i];
   10276 	  ins.op_riprel[MAX_OPERANDS - 1 - i] = riprel;
   10277 	}
   10278     }
   10279   else
   10280     {
   10281       for (i = 0; i < MAX_OPERANDS; ++i)
   10282 	op_txt[MAX_OPERANDS - 1 - i] = ins.op_out[i];
   10283     }
   10284 
   10285   needcomma = 0;
   10286   for (i = 0; i < MAX_OPERANDS; ++i)
   10287     if (*op_txt[i])
   10288       {
   10289 	/* In Intel syntax embedded rounding / SAE are not separate operands.
   10290 	   Instead they're attached to the prior register operand.  Simply
   10291 	   suppress emission of the comma to achieve that effect.  */
   10292 	switch (i & -(ins.intel_syntax && dp))
   10293 	  {
   10294 	  case 2:
   10295 	    if (dp->op[2].rtn == OP_Rounding && !intel_swap_2_3)
   10296 	      needcomma = 0;
   10297 	    break;
   10298 	  case 3:
   10299 	    if (dp->op[3].rtn == OP_Rounding || intel_swap_2_3)
   10300 	      needcomma = 0;
   10301 	    break;
   10302 	  }
   10303 	if (needcomma)
   10304 	  i386_dis_printf (info, dis_style_text, ",");
   10305 	if (ins.op_index[i] != -1 && !ins.op_riprel[i])
   10306 	  {
   10307 	    bfd_vma target = (bfd_vma) ins.op_address[ins.op_index[i]];
   10308 
   10309 	    if (ins.op_is_jump)
   10310 	      {
   10311 		info->insn_info_valid = 1;
   10312 		info->branch_delay_insns = 0;
   10313 		info->data_size = 0;
   10314 		info->target = target;
   10315 		info->target2 = 0;
   10316 	      }
   10317 	    (*info->print_address_func) (target, info);
   10318 	  }
   10319 	else
   10320 	  i386_dis_printf (info, dis_style_text, "%s", op_txt[i]);
   10321 	needcomma = 1;
   10322       }
   10323 
   10324   for (i = 0; i < MAX_OPERANDS; i++)
   10325     if (ins.op_index[i] != -1 && ins.op_riprel[i])
   10326       {
   10327 	i386_dis_printf (info, dis_style_comment_start, "        # ");
   10328 	(*info->print_address_func)
   10329 	  ((bfd_vma)(ins.start_pc + (ins.codep - ins.start_codep)
   10330 		     + ins.op_address[ins.op_index[i]]),
   10331 	  info);
   10332 	break;
   10333       }
   10334   ret = ins.codep - priv.the_buffer;
   10335  out:
   10336   info->private_data = NULL;
   10337   return ret;
   10338 }
   10339 
   10340 /* Here for backwards compatibility.  When gdb stops using
   10341    print_insn_i386_att and print_insn_i386_intel these functions can
   10342    disappear, and print_insn_i386 be merged into print_insn.  */
   10343 int
   10344 print_insn_i386_att (bfd_vma pc, disassemble_info *info)
   10345 {
   10346   return print_insn (pc, info, 0);
   10347 }
   10348 
   10349 int
   10350 print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
   10351 {
   10352   return print_insn (pc, info, 1);
   10353 }
   10354 
   10355 int
   10356 print_insn_i386 (bfd_vma pc, disassemble_info *info)
   10357 {
   10358   return print_insn (pc, info, -1);
   10359 }
   10360 
   10361 static const char *float_mem[] = {
   10362   /* d8 */
   10363   "fadd{s|}",
   10364   "fmul{s|}",
   10365   "fcom{s|}",
   10366   "fcomp{s|}",
   10367   "fsub{s|}",
   10368   "fsubr{s|}",
   10369   "fdiv{s|}",
   10370   "fdivr{s|}",
   10371   /* d9 */
   10372   "fld{s|}",
   10373   "(bad)",
   10374   "fst{s|}",
   10375   "fstp{s|}",
   10376   "fldenv{C|C}",
   10377   "fldcw",
   10378   "fNstenv{C|C}",
   10379   "fNstcw",
   10380   /* da */
   10381   "fiadd{l|}",
   10382   "fimul{l|}",
   10383   "ficom{l|}",
   10384   "ficomp{l|}",
   10385   "fisub{l|}",
   10386   "fisubr{l|}",
   10387   "fidiv{l|}",
   10388   "fidivr{l|}",
   10389   /* db */
   10390   "fild{l|}",
   10391   "fisttp{l|}",
   10392   "fist{l|}",
   10393   "fistp{l|}",
   10394   "(bad)",
   10395   "fld{t|}",
   10396   "(bad)",
   10397   "fstp{t|}",
   10398   /* dc */
   10399   "fadd{l|}",
   10400   "fmul{l|}",
   10401   "fcom{l|}",
   10402   "fcomp{l|}",
   10403   "fsub{l|}",
   10404   "fsubr{l|}",
   10405   "fdiv{l|}",
   10406   "fdivr{l|}",
   10407   /* dd */
   10408   "fld{l|}",
   10409   "fisttp{ll|}",
   10410   "fst{l||}",
   10411   "fstp{l|}",
   10412   "frstor{C|C}",
   10413   "(bad)",
   10414   "fNsave{C|C}",
   10415   "fNstsw",
   10416   /* de */
   10417   "fiadd{s|}",
   10418   "fimul{s|}",
   10419   "ficom{s|}",
   10420   "ficomp{s|}",
   10421   "fisub{s|}",
   10422   "fisubr{s|}",
   10423   "fidiv{s|}",
   10424   "fidivr{s|}",
   10425   /* df */
   10426   "fild{s|}",
   10427   "fisttp{s|}",
   10428   "fist{s|}",
   10429   "fistp{s|}",
   10430   "fbld",
   10431   "fild{ll|}",
   10432   "fbstp",
   10433   "fistp{ll|}",
   10434 };
   10435 
   10436 static const unsigned char float_mem_mode[] = {
   10437   /* d8 */
   10438   d_mode,
   10439   d_mode,
   10440   d_mode,
   10441   d_mode,
   10442   d_mode,
   10443   d_mode,
   10444   d_mode,
   10445   d_mode,
   10446   /* d9 */
   10447   d_mode,
   10448   0,
   10449   d_mode,
   10450   d_mode,
   10451   0,
   10452   w_mode,
   10453   0,
   10454   w_mode,
   10455   /* da */
   10456   d_mode,
   10457   d_mode,
   10458   d_mode,
   10459   d_mode,
   10460   d_mode,
   10461   d_mode,
   10462   d_mode,
   10463   d_mode,
   10464   /* db */
   10465   d_mode,
   10466   d_mode,
   10467   d_mode,
   10468   d_mode,
   10469   0,
   10470   t_mode,
   10471   0,
   10472   t_mode,
   10473   /* dc */
   10474   q_mode,
   10475   q_mode,
   10476   q_mode,
   10477   q_mode,
   10478   q_mode,
   10479   q_mode,
   10480   q_mode,
   10481   q_mode,
   10482   /* dd */
   10483   q_mode,
   10484   q_mode,
   10485   q_mode,
   10486   q_mode,
   10487   0,
   10488   0,
   10489   0,
   10490   w_mode,
   10491   /* de */
   10492   w_mode,
   10493   w_mode,
   10494   w_mode,
   10495   w_mode,
   10496   w_mode,
   10497   w_mode,
   10498   w_mode,
   10499   w_mode,
   10500   /* df */
   10501   w_mode,
   10502   w_mode,
   10503   w_mode,
   10504   w_mode,
   10505   t_mode,
   10506   q_mode,
   10507   t_mode,
   10508   q_mode
   10509 };
   10510 
   10511 #define ST { OP_ST, 0 }
   10512 #define STi { OP_STi, 0 }
   10513 
   10514 #define FGRPd9_2 NULL, { { NULL, 1 } }, 0
   10515 #define FGRPd9_4 NULL, { { NULL, 2 } }, 0
   10516 #define FGRPd9_5 NULL, { { NULL, 3 } }, 0
   10517 #define FGRPd9_6 NULL, { { NULL, 4 } }, 0
   10518 #define FGRPd9_7 NULL, { { NULL, 5 } }, 0
   10519 #define FGRPda_5 NULL, { { NULL, 6 } }, 0
   10520 #define FGRPdb_4 NULL, { { NULL, 7 } }, 0
   10521 #define FGRPde_3 NULL, { { NULL, 8 } }, 0
   10522 #define FGRPdf_4 NULL, { { NULL, 9 } }, 0
   10523 
   10524 static const struct dis386 float_reg[][8] = {
   10525   /* d8 */
   10526   {
   10527     { "fadd",	{ ST, STi }, 0 },
   10528     { "fmul",	{ ST, STi }, 0 },
   10529     { "fcom",	{ STi }, 0 },
   10530     { "fcomp",	{ STi }, 0 },
   10531     { "fsub",	{ ST, STi }, 0 },
   10532     { "fsubr",	{ ST, STi }, 0 },
   10533     { "fdiv",	{ ST, STi }, 0 },
   10534     { "fdivr",	{ ST, STi }, 0 },
   10535   },
   10536   /* d9 */
   10537   {
   10538     { "fld",	{ STi }, 0 },
   10539     { "fxch",	{ STi }, 0 },
   10540     { FGRPd9_2 },
   10541     { Bad_Opcode },
   10542     { FGRPd9_4 },
   10543     { FGRPd9_5 },
   10544     { FGRPd9_6 },
   10545     { FGRPd9_7 },
   10546   },
   10547   /* da */
   10548   {
   10549     { "fcmovb",	{ ST, STi }, 0 },
   10550     { "fcmove",	{ ST, STi }, 0 },
   10551     { "fcmovbe",{ ST, STi }, 0 },
   10552     { "fcmovu",	{ ST, STi }, 0 },
   10553     { Bad_Opcode },
   10554     { FGRPda_5 },
   10555     { Bad_Opcode },
   10556     { Bad_Opcode },
   10557   },
   10558   /* db */
   10559   {
   10560     { "fcmovnb",{ ST, STi }, 0 },
   10561     { "fcmovne",{ ST, STi }, 0 },
   10562     { "fcmovnbe",{ ST, STi }, 0 },
   10563     { "fcmovnu",{ ST, STi }, 0 },
   10564     { FGRPdb_4 },
   10565     { "fucomi",	{ ST, STi }, 0 },
   10566     { "fcomi",	{ ST, STi }, 0 },
   10567     { Bad_Opcode },
   10568   },
   10569   /* dc */
   10570   {
   10571     { "fadd",	{ STi, ST }, 0 },
   10572     { "fmul",	{ STi, ST }, 0 },
   10573     { Bad_Opcode },
   10574     { Bad_Opcode },
   10575     { "fsub{!M|r}",	{ STi, ST }, 0 },
   10576     { "fsub{M|}",	{ STi, ST }, 0 },
   10577     { "fdiv{!M|r}",	{ STi, ST }, 0 },
   10578     { "fdiv{M|}",	{ STi, ST }, 0 },
   10579   },
   10580   /* dd */
   10581   {
   10582     { "ffree",	{ STi }, 0 },
   10583     { Bad_Opcode },
   10584     { "fst",	{ STi }, 0 },
   10585     { "fstp",	{ STi }, 0 },
   10586     { "fucom",	{ STi }, 0 },
   10587     { "fucomp",	{ STi }, 0 },
   10588     { Bad_Opcode },
   10589     { Bad_Opcode },
   10590   },
   10591   /* de */
   10592   {
   10593     { "faddp",	{ STi, ST }, 0 },
   10594     { "fmulp",	{ STi, ST }, 0 },
   10595     { Bad_Opcode },
   10596     { FGRPde_3 },
   10597     { "fsub{!M|r}p",	{ STi, ST }, 0 },
   10598     { "fsub{M|}p",	{ STi, ST }, 0 },
   10599     { "fdiv{!M|r}p",	{ STi, ST }, 0 },
   10600     { "fdiv{M|}p",	{ STi, ST }, 0 },
   10601   },
   10602   /* df */
   10603   {
   10604     { "ffreep",	{ STi }, 0 },
   10605     { Bad_Opcode },
   10606     { Bad_Opcode },
   10607     { Bad_Opcode },
   10608     { FGRPdf_4 },
   10609     { "fucomip", { ST, STi }, 0 },
   10610     { "fcomip", { ST, STi }, 0 },
   10611     { Bad_Opcode },
   10612   },
   10613 };
   10614 
   10615 static const char *const fgrps[][8] = {
   10616   /* Bad opcode 0 */
   10617   {
   10618     "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
   10619   },
   10620 
   10621   /* d9_2  1 */
   10622   {
   10623     "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
   10624   },
   10625 
   10626   /* d9_4  2 */
   10627   {
   10628     "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
   10629   },
   10630 
   10631   /* d9_5  3 */
   10632   {
   10633     "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
   10634   },
   10635 
   10636   /* d9_6  4 */
   10637   {
   10638     "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
   10639   },
   10640 
   10641   /* d9_7  5 */
   10642   {
   10643     "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
   10644   },
   10645 
   10646   /* da_5  6 */
   10647   {
   10648     "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
   10649   },
   10650 
   10651   /* db_4  7 */
   10652   {
   10653     "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
   10654     "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
   10655   },
   10656 
   10657   /* de_3  8 */
   10658   {
   10659     "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
   10660   },
   10661 
   10662   /* df_4  9 */
   10663   {
   10664     "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
   10665   },
   10666 };
   10667 
   10668 static const char *const oszc_flags[16] = {
   10669   " {dfv=}", " {dfv=cf}", " {dfv=zf}", " {dfv=zf, cf}", " {dfv=sf}",
   10670   " {dfv=sf, cf}", " {dfv=sf, zf}", " {dfv=sf, zf, cf}", " {dfv=of}",
   10671   " {dfv=of, cf}", " {dfv=of, zf}", " {dfv=of, zf, cf}", " {dfv=of, sf}",
   10672   " {dfv=of, sf, cf}", " {dfv=of, sf, zf}", " {dfv=of, sf, zf, cf}"
   10673 };
   10674 
   10675 static const char *const scc_suffix[16] = {
   10676   "o", "no", "b", "ae", "e", "ne", "be", "a", "s", "ns", "t", "f",
   10677   "l", "ge", "le", "g"
   10678 };
   10679 
   10680 static void
   10681 swap_operand (instr_info *ins)
   10682 {
   10683   char *p = ins->mnemonicendp;
   10684 
   10685   if (p[-1] == '}')
   10686     {
   10687       while (*--p != '{')
   10688 	{
   10689 	  if (p <= ins->obuf + 2)
   10690 	    abort ();
   10691 	}
   10692       if (p[-1] == ' ')
   10693 	--p;
   10694     }
   10695   memmove (p + 2, p, ins->mnemonicendp - p + 1);
   10696   p[0] = '.';
   10697   p[1] = 's';
   10698   ins->mnemonicendp += 2;
   10699 }
   10700 
   10701 static bool
   10702 dofloat (instr_info *ins, int sizeflag)
   10703 {
   10704   const struct dis386 *dp;
   10705   unsigned char floatop = ins->codep[-1];
   10706 
   10707   if (ins->modrm.mod != 3)
   10708     {
   10709       int fp_indx = (floatop - 0xd8) * 8 + ins->modrm.reg;
   10710 
   10711       putop (ins, float_mem[fp_indx], sizeflag);
   10712       ins->obufp = ins->op_out[0];
   10713       ins->op_ad = 2;
   10714       return OP_E (ins, float_mem_mode[fp_indx], sizeflag);
   10715     }
   10716   /* Skip mod/rm byte.  */
   10717   MODRM_CHECK;
   10718   ins->codep++;
   10719 
   10720   dp = &float_reg[floatop - 0xd8][ins->modrm.reg];
   10721   if (dp->name == NULL)
   10722     {
   10723       putop (ins, fgrps[dp->op[0].bytemode][ins->modrm.rm], sizeflag);
   10724 
   10725       /* Instruction fnstsw is only one with strange arg.  */
   10726       if (floatop == 0xdf && ins->codep[-1] == 0xe0)
   10727 	strcpy (ins->op_out[0], att_names16[0] + ins->intel_syntax);
   10728     }
   10729   else
   10730     {
   10731       putop (ins, dp->name, sizeflag);
   10732 
   10733       ins->obufp = ins->op_out[0];
   10734       ins->op_ad = 2;
   10735       if (dp->op[0].rtn
   10736 	  && !dp->op[0].rtn (ins, dp->op[0].bytemode, sizeflag))
   10737 	return false;
   10738 
   10739       ins->obufp = ins->op_out[1];
   10740       ins->op_ad = 1;
   10741       if (dp->op[1].rtn
   10742 	  && !dp->op[1].rtn (ins, dp->op[1].bytemode, sizeflag))
   10743 	return false;
   10744     }
   10745   return true;
   10746 }
   10747 
   10748 static bool
   10749 OP_ST (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
   10750        int sizeflag ATTRIBUTE_UNUSED)
   10751 {
   10752   oappend_register (ins, "%st");
   10753   return true;
   10754 }
   10755 
   10756 static bool
   10757 OP_STi (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
   10758 	int sizeflag ATTRIBUTE_UNUSED)
   10759 {
   10760   char scratch[8];
   10761   int res = snprintf (scratch, ARRAY_SIZE (scratch), "%%st(%d)", ins->modrm.rm);
   10762 
   10763   if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
   10764     abort ();
   10765   oappend_register (ins, scratch);
   10766   return true;
   10767 }
   10768 
   10769 /* Capital letters in template are macros.  */
   10770 static int
   10771 putop (instr_info *ins, const char *in_template, int sizeflag)
   10772 {
   10773   const char *p;
   10774   int alt = 0;
   10775   int cond = 1;
   10776   unsigned int l = 0, len = 0;
   10777   char last[4];
   10778   bool evex_printed = false;
   10779 
   10780   /* We don't want to add any prefix or suffix to (bad), so return early.  */
   10781   if (!strncmp (in_template, "(bad)", 5))
   10782     {
   10783       oappend (ins, "(bad)");
   10784       *ins->obufp = 0;
   10785       ins->mnemonicendp = ins->obufp;
   10786       return 0;
   10787     }
   10788 
   10789   for (p = in_template; *p; p++)
   10790     {
   10791       if (len > l)
   10792 	{
   10793 	  if (l >= sizeof (last) || !ISUPPER (*p))
   10794 	    abort ();
   10795 	  last[l++] = *p;
   10796 	  continue;
   10797 	}
   10798       switch (*p)
   10799 	{
   10800 	default:
   10801 	  if (ins->evex_type == evex_from_legacy && !ins->vex.nd
   10802 	      && !(ins->rex2 & 7) && !evex_printed)
   10803 	    {
   10804 	      oappend (ins, "{evex} ");
   10805 	      evex_printed = true;
   10806 	    }
   10807 	  *ins->obufp++ = *p;
   10808 	  break;
   10809 	case '%':
   10810 	  len++;
   10811 	  break;
   10812 	case '!':
   10813 	  cond = 0;
   10814 	  break;
   10815 	case '{':
   10816 	  if (ins->intel_syntax)
   10817 	    {
   10818 	      while (*++p != '|')
   10819 		if (*p == '}' || *p == '\0')
   10820 		  abort ();
   10821 	      alt = 1;
   10822 	    }
   10823 	  break;
   10824 	case '|':
   10825 	  while (*++p != '}')
   10826 	    {
   10827 	      if (*p == '\0')
   10828 		abort ();
   10829 	    }
   10830 	  break;
   10831 	case '}':
   10832 	  alt = 0;
   10833 	  break;
   10834 	case 'A':
   10835 	  if (ins->intel_syntax)
   10836 	    break;
   10837 	  if ((ins->need_modrm && ins->modrm.mod != 3 && !ins->vex.nd)
   10838 	      || (sizeflag & SUFFIX_ALWAYS))
   10839 	    *ins->obufp++ = 'b';
   10840 	  break;
   10841 	case 'B':
   10842 	  if (l == 0)
   10843 	    {
   10844 	    case_B:
   10845 	      if (ins->intel_syntax)
   10846 		break;
   10847 	      if (sizeflag & SUFFIX_ALWAYS)
   10848 		*ins->obufp++ = 'b';
   10849 	    }
   10850 	  else if (l == 1 && last[0] == 'L')
   10851 	    {
   10852 	      if (ins->address_mode == mode_64bit
   10853 		  && !(ins->prefixes & PREFIX_ADDR))
   10854 		{
   10855 		  *ins->obufp++ = 'a';
   10856 		  *ins->obufp++ = 'b';
   10857 		  *ins->obufp++ = 's';
   10858 		}
   10859 
   10860 	      goto case_B;
   10861 	    }
   10862 	  else if (l && last[0] == 'X')
   10863 	    {
   10864 	      if (!ins->vex.w)
   10865 		oappend (ins, "bf16");
   10866 	      else
   10867 		oappend (ins, "{bad}");
   10868 	    }
   10869 	  else
   10870 	    abort ();
   10871 	  break;
   10872 	case 'C':
   10873 	  if (l == 1 && last[0] == 'C')
   10874 	    {
   10875 	      /* Condition code (taken from the map-0 Jcc entries).  */
   10876 	      for (const char *q = dis386[0x70 | ins->condition_code].name + 1;
   10877 		   ISLOWER(*q); ++q)
   10878 		*ins->obufp++ = *q;
   10879 	      break;
   10880 	    }
   10881 	  else if (l == 1 && last[0] == 'S')
   10882 	    {
   10883 	      /* Add scc suffix.  */
   10884 	      oappend (ins, scc_suffix[ins->vex.scc]);
   10885 
   10886 	      /* For SCC insns, the ND bit is required to be set to 0.  */
   10887 	      if (ins->vex.nd)
   10888 		oappend (ins, "(bad)");
   10889 
   10890 	      /* These bits have been consumed and should be cleared or restored
   10891 		 to default values.  */
   10892 	      ins->vex.v = 1;
   10893 	      ins->vex.nf = false;
   10894 	      ins->vex.mask_register_specifier = 0;
   10895 	      break;
   10896 	    }
   10897 
   10898 	  if (l)
   10899 	    abort ();
   10900 	  if (ins->intel_syntax && !alt)
   10901 	    break;
   10902 	  if ((ins->prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
   10903 	    {
   10904 	      if (sizeflag & DFLAG)
   10905 		*ins->obufp++ = ins->intel_syntax ? 'd' : 'l';
   10906 	      else
   10907 		*ins->obufp++ = ins->intel_syntax ? 'w' : 's';
   10908 	      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
   10909 	    }
   10910 	  break;
   10911 	case 'D':
   10912 	  if (l == 1)
   10913 	    {
   10914 	      switch (last[0])
   10915 	      {
   10916 	      case 'X':
   10917 		if (!ins->vex.evex || ins->vex.w)
   10918 		  *ins->obufp++ = 'd';
   10919 		else
   10920 		  oappend (ins, "{bad}");
   10921 		break;
   10922 	      default:
   10923 		abort ();
   10924 	      }
   10925 	      break;
   10926 	    }
   10927 	  if (l)
   10928 	    abort ();
   10929 	  if (ins->intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
   10930 	    break;
   10931 	  USED_REX (REX_W);
   10932 	  if (ins->modrm.mod == 3)
   10933 	    {
   10934 	      if (ins->rex & REX_W)
   10935 		*ins->obufp++ = 'q';
   10936 	      else
   10937 		{
   10938 		  if (sizeflag & DFLAG)
   10939 		    *ins->obufp++ = ins->intel_syntax ? 'd' : 'l';
   10940 		  else
   10941 		    *ins->obufp++ = 'w';
   10942 		  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
   10943 		}
   10944 	    }
   10945 	  else
   10946 	    *ins->obufp++ = 'w';
   10947 	  break;
   10948 	case 'E':
   10949 	  if (l == 1)
   10950 	    {
   10951 	      switch (last[0])
   10952 		{
   10953 		case 'M':
   10954 		  if (ins->modrm.mod != 3)
   10955 		    break;
   10956 		/* Fall through.  */
   10957 		case 'X':
   10958 		  if (!ins->vex.evex || ins->vex.b || ins->vex.ll >= 2
   10959 		      || (ins->rex2 & 7)
   10960 		      || (ins->modrm.mod == 3 && (ins->rex & REX_X))
   10961 		      || !ins->vex.v || ins->vex.mask_register_specifier)
   10962 		    break;
   10963 		  /* AVX512 extends a number of V*D insns to also have V*Q variants,
   10964 		     merely distinguished by EVEX.W.  Look for a use of the
   10965 		     respective macro.  */
   10966 		  if (ins->vex.w)
   10967 		    {
   10968 		      const char *pct = strchr (p + 1, '%');
   10969 
   10970 		      if (pct != NULL && pct[1] == 'D' && pct[2] == 'Q')
   10971 			break;
   10972 		    }
   10973 		  *ins->obufp++ = '{';
   10974 		  *ins->obufp++ = 'e';
   10975 		  *ins->obufp++ = 'v';
   10976 		  *ins->obufp++ = 'e';
   10977 		  *ins->obufp++ = 'x';
   10978 		  *ins->obufp++ = '}';
   10979 		  *ins->obufp++ = ' ';
   10980 		  break;
   10981 		case 'N':
   10982 		  /* Skip printing {evex} for some special instructions in MAP4.  */
   10983 		  evex_printed = true;
   10984 		  break;
   10985 		default:
   10986 		  abort ();
   10987 		}
   10988 		break;
   10989 	    }
   10990 	  /* For jcxz/jecxz */
   10991 	  if (ins->address_mode == mode_64bit)
   10992 	    {
   10993 	      if (sizeflag & AFLAG)
   10994 		*ins->obufp++ = 'r';
   10995 	      else
   10996 		*ins->obufp++ = 'e';
   10997 	    }
   10998 	  else
   10999 	    if (sizeflag & AFLAG)
   11000 	      *ins->obufp++ = 'e';
   11001 	  ins->used_prefixes |= (ins->prefixes & PREFIX_ADDR);
   11002 	  break;
   11003 	case 'F':
   11004 	  if (l == 0)
   11005 	    {
   11006 	      if (ins->intel_syntax)
   11007 		break;
   11008 	      if ((ins->prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
   11009 		{
   11010 		  if (sizeflag & AFLAG)
   11011 		    *ins->obufp++ = ins->address_mode == mode_64bit ? 'q' : 'l';
   11012 		  else
   11013 		    *ins->obufp++ = ins->address_mode == mode_64bit ? 'l' : 'w';
   11014 		  ins->used_prefixes |= (ins->prefixes & PREFIX_ADDR);
   11015 		}
   11016 	    }
   11017 	  else if (l == 1 && last[0] == 'C')
   11018 	    {
   11019 	      if (ins->vex.nd && !ins->vex.nf)
   11020 		break;
   11021 	      *ins->obufp++ = 'c';
   11022 	      *ins->obufp++ = 'f';
   11023 	      /* Skip printing {evex} */
   11024 	      evex_printed = true;
   11025 	    }
   11026 	  else if (l == 1 && last[0] == 'N')
   11027 	    {
   11028 	      if (ins->vex.nf)
   11029 		{
   11030 		  oappend (ins, "{nf} ");
   11031 		  /* This bit needs to be cleared after it is consumed.  */
   11032 		  ins->vex.nf = false;
   11033 		  evex_printed = true;
   11034 		}
   11035 	      else if (ins->evex_type == evex_from_vex && !(ins->rex2 & 7)
   11036 		       && ins->vex.v)
   11037 		{
   11038 		  oappend (ins, "{evex} ");
   11039 		  evex_printed = true;
   11040 		}
   11041 	    }
   11042 	  else if (l == 1 && last[0] == 'D')
   11043 	    {
   11044 	      /* Get oszc flags value from register_specifier.  */
   11045 	      int oszc_value = ~ins->vex.register_specifier & 0xf;
   11046 
   11047 	      /* Add {dfv=of, sf, zf, cf} flags.  */
   11048 	      oappend (ins, oszc_flags[oszc_value]);
   11049 
   11050 	      /* These bits have been consumed and should be cleared.  */
   11051 	      ins->vex.register_specifier = 0;
   11052 	    }
   11053 	  else
   11054 	    abort ();
   11055 	  break;
   11056 	case 'G':
   11057 	  if (ins->intel_syntax || (ins->obufp[-1] != 's'
   11058 				    && !(sizeflag & SUFFIX_ALWAYS)))
   11059 	    break;
   11060 	  if ((ins->rex & REX_W) || (sizeflag & DFLAG))
   11061 	    *ins->obufp++ = 'l';
   11062 	  else
   11063 	    *ins->obufp++ = 'w';
   11064 	  if (!(ins->rex & REX_W))
   11065 	    ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
   11066 	  break;
   11067 	case 'H':
   11068 	  if (l == 0)
   11069 	    {
   11070 	      if (ins->intel_syntax)
   11071 	        break;
   11072 	      if ((ins->prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
   11073 		  || (ins->prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
   11074 		{
   11075 		  ins->used_prefixes |= ins->prefixes & (PREFIX_CS | PREFIX_DS);
   11076 		  *ins->obufp++ = ',';
   11077 		  *ins->obufp++ = 'p';
   11078 
   11079 		  /* Set active_seg_prefix even if not set in 64-bit mode
   11080 		     because here it is a valid branch hint. */
   11081 		  if (ins->prefixes & PREFIX_DS)
   11082 		    {
   11083 		      ins->active_seg_prefix = PREFIX_DS;
   11084 		      *ins->obufp++ = 't';
   11085 		    }
   11086 		  else
   11087 		    {
   11088 		      ins->active_seg_prefix = PREFIX_CS;
   11089 		      *ins->obufp++ = 'n';
   11090 		    }
   11091 		}
   11092 	    }
   11093 	  else if (l == 1 && last[0] == 'X')
   11094 	    {
   11095 	      if (!ins->vex.w)
   11096 		*ins->obufp++ = 'h';
   11097 	      else
   11098 		oappend (ins, "{bad}");
   11099 	    }
   11100 	  else
   11101 	    abort ();
   11102 	  break;
   11103 	case 'K':
   11104 	  USED_REX (REX_W);
   11105 	  if (ins->rex & REX_W)
   11106 	    *ins->obufp++ = 'q';
   11107 	  else
   11108 	    *ins->obufp++ = 'd';
   11109 	  break;
   11110 	case 'L':
   11111 	  if (ins->intel_syntax)
   11112 	    break;
   11113 	  if (sizeflag & SUFFIX_ALWAYS)
   11114 	    {
   11115 	      if (ins->rex & REX_W)
   11116 		*ins->obufp++ = 'q';
   11117 	      else
   11118 		*ins->obufp++ = 'l';
   11119 	    }
   11120 	  break;
   11121 	case 'M':
   11122 	  if (ins->intel_mnemonic != cond)
   11123 	    *ins->obufp++ = 'r';
   11124 	  break;
   11125 	case 'N':
   11126 	  if ((ins->prefixes & PREFIX_FWAIT) == 0)
   11127 	    *ins->obufp++ = 'n';
   11128 	  else
   11129 	    ins->used_prefixes |= PREFIX_FWAIT;
   11130 	  break;
   11131 	case 'O':
   11132 	  USED_REX (REX_W);
   11133 	  if (ins->rex & REX_W)
   11134 	    *ins->obufp++ = 'o';
   11135 	  else if (ins->intel_syntax && (sizeflag & DFLAG))
   11136 	    *ins->obufp++ = 'q';
   11137 	  else
   11138 	    *ins->obufp++ = 'd';
   11139 	  if (!(ins->rex & REX_W))
   11140 	    ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
   11141 	  break;
   11142 	case '@':
   11143 	  if (ins->address_mode == mode_64bit
   11144 	      && (ins->isa64 == intel64 || (ins->rex & REX_W)
   11145 		  || !(ins->prefixes & PREFIX_DATA)))
   11146 	    {
   11147 	      if (sizeflag & SUFFIX_ALWAYS)
   11148 		*ins->obufp++ = 'q';
   11149 	      break;
   11150 	    }
   11151 	  /* Fall through.  */
   11152 	case 'P':
   11153 	  if (l == 0)
   11154 	    {
   11155 	      if (!cond && ins->last_rex2_prefix >= 0 && (ins->rex & REX_W))
   11156 		{
   11157 		  /* For pushp and popp, p is printed and do not print {rex2}
   11158 		     for them.  */
   11159 		  *ins->obufp++ = 'p';
   11160 		  ins->rex2 |= REX2_SPECIAL;
   11161 		  break;
   11162 		}
   11163 
   11164 	      /* For "!P" print nothing else in Intel syntax.  */
   11165 	      if (!cond && ins->intel_syntax)
   11166 		break;
   11167 
   11168 	      if ((ins->modrm.mod == 3 || !cond)
   11169 		  && !(sizeflag & SUFFIX_ALWAYS))
   11170 		break;
   11171 	  /* Fall through.  */
   11172 	case 'T':
   11173 	      if ((!(ins->rex & REX_W) && (ins->prefixes & PREFIX_DATA))
   11174 		  || ((sizeflag & SUFFIX_ALWAYS)
   11175 		      && ins->address_mode != mode_64bit))
   11176 		{
   11177 		  *ins->obufp++ = (sizeflag & DFLAG)
   11178 				  ? ins->intel_syntax ? 'd' : 'l' : 'w';
   11179 		  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
   11180 		}
   11181 	      else if (sizeflag & SUFFIX_ALWAYS)
   11182 		*ins->obufp++ = 'q';
   11183 	    }
   11184 	  else if (l == 1 && last[0] == 'L')
   11185 	    {
   11186 	      if ((ins->prefixes & PREFIX_DATA)
   11187 		  || (ins->rex & REX_W)
   11188 		  || (sizeflag & SUFFIX_ALWAYS))
   11189 		{
   11190 		  USED_REX (REX_W);
   11191 		  if (ins->rex & REX_W)
   11192 		    *ins->obufp++ = 'q';
   11193 		  else
   11194 		    {
   11195 		      if (sizeflag & DFLAG)
   11196 			*ins->obufp++ = ins->intel_syntax ? 'd' : 'l';
   11197 		      else
   11198 			*ins->obufp++ = 'w';
   11199 		      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
   11200 		    }
   11201 		}
   11202 	    }
   11203 	  else
   11204 	    abort ();
   11205 	  break;
   11206 	case 'Q':
   11207 	  if (l == 0)
   11208 	    {
   11209 	      if (ins->intel_syntax && !alt)
   11210 		break;
   11211 	      USED_REX (REX_W);
   11212 	      if ((ins->need_modrm && ins->modrm.mod != 3 && !ins->vex.nd)
   11213 		  || (sizeflag & SUFFIX_ALWAYS))
   11214 		{
   11215 		  if (ins->rex & REX_W)
   11216 		    *ins->obufp++ = 'q';
   11217 		  else
   11218 		    {
   11219 		      if (sizeflag & DFLAG)
   11220 			*ins->obufp++ = ins->intel_syntax ? 'd' : 'l';
   11221 		      else
   11222 			*ins->obufp++ = 'w';
   11223 		      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
   11224 		    }
   11225 		}
   11226 	    }
   11227 	  else if (l == 1 && last[0] == 'D')
   11228 	    *ins->obufp++ = ins->vex.w ? 'q' : 'd';
   11229 	  else if (l == 1 && last[0] == 'L')
   11230 	    {
   11231 	      if (cond ? ins->modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)
   11232 		       : ins->address_mode != mode_64bit)
   11233 		break;
   11234 	      if ((ins->rex & REX_W))
   11235 		{
   11236 		  USED_REX (REX_W);
   11237 		  *ins->obufp++ = 'q';
   11238 		}
   11239 	      else if ((ins->address_mode == mode_64bit && cond)
   11240 		      || (sizeflag & SUFFIX_ALWAYS))
   11241 		*ins->obufp++ = ins->intel_syntax? 'd' : 'l';
   11242 	    }
   11243 	  else
   11244 	    abort ();
   11245 	  break;
   11246 	case 'R':
   11247 	  USED_REX (REX_W);
   11248 	  if (ins->rex & REX_W)
   11249 	    *ins->obufp++ = 'q';
   11250 	  else if (sizeflag & DFLAG)
   11251 	    {
   11252 	      if (ins->intel_syntax)
   11253 		  *ins->obufp++ = 'd';
   11254 	      else
   11255 		  *ins->obufp++ = 'l';
   11256 	    }
   11257 	  else
   11258 	    *ins->obufp++ = 'w';
   11259 	  if (ins->intel_syntax && !p[1]
   11260 	      && ((ins->rex & REX_W) || (sizeflag & DFLAG)))
   11261 	    *ins->obufp++ = 'e';
   11262 	  if (!(ins->rex & REX_W))
   11263 	    ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
   11264 	  break;
   11265 	case 'S':
   11266 	  if (l == 0)
   11267 	    {
   11268 	    case_S:
   11269 	      if (ins->intel_syntax)
   11270 		break;
   11271 	      if (sizeflag & SUFFIX_ALWAYS)
   11272 		{
   11273 		  if (ins->rex & REX_W)
   11274 		    *ins->obufp++ = 'q';
   11275 		  else
   11276 		    {
   11277 		      if (sizeflag & DFLAG)
   11278 			*ins->obufp++ = 'l';
   11279 		      else
   11280 			*ins->obufp++ = 'w';
   11281 		      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
   11282 		    }
   11283 		}
   11284 	      break;
   11285 	    }
   11286 	  if (l != 1)
   11287 	    abort ();
   11288 	  switch (last[0])
   11289 	    {
   11290 	    case 'L':
   11291 	      if (ins->address_mode == mode_64bit
   11292 		  && !(ins->prefixes & PREFIX_ADDR))
   11293 		{
   11294 		  *ins->obufp++ = 'a';
   11295 		  *ins->obufp++ = 'b';
   11296 		  *ins->obufp++ = 's';
   11297 		}
   11298 
   11299 	      goto case_S;
   11300 	    case 'X':
   11301 	      if (!ins->vex.evex || !ins->vex.w)
   11302 		*ins->obufp++ = 's';
   11303 	      else
   11304 		oappend (ins, "{bad}");
   11305 	      break;
   11306 	    default:
   11307 	      abort ();
   11308 	    }
   11309 	  break;
   11310 	case 'U':
   11311 	  if (l == 1 && (last[0] == 'Z'))
   11312 	    {
   11313 	      /* Although IMUL/SETcc does not support NDD, the EVEX.ND bit is
   11314 		 used to control whether its destination register has its upper
   11315 		 bits zeroed.  */
   11316 	      if (ins->vex.nd)
   11317 		oappend (ins, "zu");
   11318 	    }
   11319 	  else
   11320 	    abort ();
   11321 	  break;
   11322 	case 'V':
   11323 	  if (l == 0)
   11324 	    {
   11325 	      if (ins->need_vex)
   11326 		*ins->obufp++ = 'v';
   11327 	    }
   11328 	  else if (l == 1)
   11329 	    {
   11330 	      switch (last[0])
   11331 		{
   11332 		case 'X':
   11333 		  if (ins->vex.evex)
   11334 		    break;
   11335 		  *ins->obufp++ = '{';
   11336 		  *ins->obufp++ = 'v';
   11337 		  *ins->obufp++ = 'e';
   11338 		  *ins->obufp++ = 'x';
   11339 		  *ins->obufp++ = '}';
   11340 		  *ins->obufp++ = ' ';
   11341 		  break;
   11342 		case 'L':
   11343 		  if (ins->rex & REX_W)
   11344 		    {
   11345 		      *ins->obufp++ = 'a';
   11346 		      *ins->obufp++ = 'b';
   11347 		      *ins->obufp++ = 's';
   11348 		    }
   11349 		  goto case_S;
   11350 		default:
   11351 		  abort ();
   11352 		}
   11353 	    }
   11354 	  else
   11355 	    abort ();
   11356 	  break;
   11357 	case 'W':
   11358 	  if (l == 0)
   11359 	    {
   11360 	      /* operand size flag for cwtl, cbtw */
   11361 	      USED_REX (REX_W);
   11362 	      if (ins->rex & REX_W)
   11363 		{
   11364 		  if (ins->intel_syntax)
   11365 		    *ins->obufp++ = 'd';
   11366 		  else
   11367 		    *ins->obufp++ = 'l';
   11368 		}
   11369 	      else if (sizeflag & DFLAG)
   11370 		*ins->obufp++ = 'w';
   11371 	      else
   11372 		*ins->obufp++ = 'b';
   11373 	      if (!(ins->rex & REX_W))
   11374 		ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
   11375 	    }
   11376 	  else if (l == 1)
   11377 	    {
   11378 	      if (!ins->need_vex)
   11379 		abort ();
   11380 	      if (last[0] == 'X')
   11381 		*ins->obufp++ = ins->vex.w ? 'd': 's';
   11382 	      else if (last[0] == 'B')
   11383 		*ins->obufp++ = ins->vex.w ? 'w': 'b';
   11384 	      else
   11385 		abort ();
   11386 	    }
   11387 	  else
   11388 	    abort ();
   11389 	  break;
   11390 	case 'X':
   11391 	  if (l != 0)
   11392 	    abort ();
   11393 	  if (ins->need_vex
   11394 	      ? ins->vex.prefix == DATA_PREFIX_OPCODE
   11395 	      : ins->prefixes & PREFIX_DATA)
   11396 	    {
   11397 	      *ins->obufp++ = 'd';
   11398 	      ins->used_prefixes |= PREFIX_DATA;
   11399 	    }
   11400 	  else
   11401 	    *ins->obufp++ = 's';
   11402 	  break;
   11403 	case 'Y':
   11404 	  if (l == 0)
   11405 	    {
   11406 	      if (ins->vex.mask_register_specifier)
   11407 		ins->illegal_masking = true;
   11408 	    }
   11409 	  else if (l == 1 && last[0] == 'X')
   11410 	    {
   11411 	      if (!ins->need_vex)
   11412 		break;
   11413 	      if (ins->intel_syntax
   11414 		  || ((ins->modrm.mod == 3 || ins->vex.b)
   11415 		      && !(sizeflag & SUFFIX_ALWAYS)))
   11416 		break;
   11417 	      switch (ins->vex.length)
   11418 		{
   11419 		case 128:
   11420 		  *ins->obufp++ = 'x';
   11421 		  break;
   11422 		case 256:
   11423 		  *ins->obufp++ = 'y';
   11424 		  break;
   11425 		case 512:
   11426 		  if (!ins->vex.evex)
   11427 		default:
   11428 		    abort ();
   11429 		}
   11430 	    }
   11431 	  else
   11432 	    abort ();
   11433 	  break;
   11434 	case 'Z':
   11435 	  if (l == 0)
   11436 	    {
   11437 	      /* These insns ignore ModR/M.mod: Force it to 3 for OP_E().  */
   11438 	      ins->modrm.mod = 3;
   11439 	      if (!ins->intel_syntax && (sizeflag & SUFFIX_ALWAYS))
   11440 		*ins->obufp++ = ins->address_mode == mode_64bit ? 'q' : 'l';
   11441 	    }
   11442 	  else if (l == 1 && last[0] == 'X')
   11443 	    {
   11444 	      if (!ins->vex.evex)
   11445 		abort ();
   11446 	      if (ins->intel_syntax
   11447 		  || ((ins->modrm.mod == 3 || ins->vex.b)
   11448 		      && !(sizeflag & SUFFIX_ALWAYS)))
   11449 		break;
   11450 	      switch (ins->vex.length)
   11451 		{
   11452 		case 128:
   11453 		  *ins->obufp++ = 'x';
   11454 		  break;
   11455 		case 256:
   11456 		  *ins->obufp++ = 'y';
   11457 		  break;
   11458 		case 512:
   11459 		  *ins->obufp++ = 'z';
   11460 		  break;
   11461 		default:
   11462 		  abort ();
   11463 		}
   11464 	    }
   11465 	  else
   11466 	    abort ();
   11467 	  break;
   11468 	case '^':
   11469 	  if (ins->intel_syntax)
   11470 	    break;
   11471 	  if (ins->isa64 == intel64 && (ins->rex & REX_W))
   11472 	    {
   11473 	      USED_REX (REX_W);
   11474 	      *ins->obufp++ = 'q';
   11475 	      break;
   11476 	    }
   11477 	  if ((ins->prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
   11478 	    {
   11479 	      if (sizeflag & DFLAG)
   11480 		*ins->obufp++ = 'l';
   11481 	      else
   11482 		*ins->obufp++ = 'w';
   11483 	      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
   11484 	    }
   11485 	  break;
   11486 	}
   11487 
   11488       if (len == l)
   11489 	len = l = 0;
   11490     }
   11491   *ins->obufp = 0;
   11492   ins->mnemonicendp = ins->obufp;
   11493   return 0;
   11494 }
   11495 
   11496 /* Add a style marker to *INS->obufp that encodes STYLE.  This assumes that
   11497    the buffer pointed to by INS->obufp has space.  A style marker is made
   11498    from the STYLE_MARKER_CHAR followed by STYLE converted to a single hex
   11499    digit, followed by another STYLE_MARKER_CHAR.  This function assumes
   11500    that the number of styles is not greater than 16.  */
   11501 
   11502 static void
   11503 oappend_insert_style (instr_info *ins, enum disassembler_style style)
   11504 {
   11505   unsigned num = (unsigned) style;
   11506 
   11507   /* We currently assume that STYLE can be encoded as a single hex
   11508      character.  If more styles are added then this might start to fail,
   11509      and we'll need to expand this code.  */
   11510   if (num > 0xf)
   11511     abort ();
   11512 
   11513   *ins->obufp++ = STYLE_MARKER_CHAR;
   11514   *ins->obufp++ = (num < 10 ? ('0' + num)
   11515 		   : ((num < 16) ? ('a' + (num - 10)) : '0'));
   11516   *ins->obufp++ = STYLE_MARKER_CHAR;
   11517 
   11518   /* This final null character is not strictly necessary, after inserting a
   11519      style marker we should always be inserting some additional content.
   11520      However, having the buffer null terminated doesn't cost much, and make
   11521      it easier to debug what's going on.  Also, if we do ever forget to add
   11522      any additional content after this style marker, then the buffer will
   11523      still be well formed.  */
   11524   *ins->obufp = '\0';
   11525 }
   11526 
   11527 static void
   11528 oappend_with_style (instr_info *ins, const char *s,
   11529 		    enum disassembler_style style)
   11530 {
   11531   oappend_insert_style (ins, style);
   11532   ins->obufp = stpcpy (ins->obufp, s);
   11533 }
   11534 
   11535 /* Add a single character C to the buffer pointer to by INS->obufp, marking
   11536    the style for the character as STYLE.  */
   11537 
   11538 static void
   11539 oappend_char_with_style (instr_info *ins, const char c,
   11540 			 enum disassembler_style style)
   11541 {
   11542   oappend_insert_style (ins, style);
   11543   *ins->obufp++ = c;
   11544   *ins->obufp = '\0';
   11545 }
   11546 
   11547 /* Like oappend_char_with_style, but always uses dis_style_text.  */
   11548 
   11549 static void
   11550 oappend_char (instr_info *ins, const char c)
   11551 {
   11552   oappend_char_with_style (ins, c, dis_style_text);
   11553 }
   11554 
   11555 static void
   11556 append_seg (instr_info *ins)
   11557 {
   11558   /* Only print the active segment register.  */
   11559   if (!ins->active_seg_prefix)
   11560     return;
   11561 
   11562   ins->used_prefixes |= ins->active_seg_prefix;
   11563   switch (ins->active_seg_prefix)
   11564     {
   11565     case PREFIX_CS:
   11566       oappend_register (ins, att_names_seg[1]);
   11567       break;
   11568     case PREFIX_DS:
   11569       oappend_register (ins, att_names_seg[3]);
   11570       break;
   11571     case PREFIX_SS:
   11572       oappend_register (ins, att_names_seg[2]);
   11573       break;
   11574     case PREFIX_ES:
   11575       oappend_register (ins, att_names_seg[0]);
   11576       break;
   11577     case PREFIX_FS:
   11578       oappend_register (ins, att_names_seg[4]);
   11579       break;
   11580     case PREFIX_GS:
   11581       oappend_register (ins, att_names_seg[5]);
   11582       break;
   11583     default:
   11584       break;
   11585     }
   11586   oappend_char (ins, ':');
   11587 }
   11588 
   11589 static void
   11590 print_operand_value (instr_info *ins, bfd_vma disp,
   11591 		     enum disassembler_style style)
   11592 {
   11593   char tmp[30];
   11594 
   11595   if (ins->address_mode != mode_64bit)
   11596     disp &= 0xffffffff;
   11597   sprintf (tmp, "0x%" PRIx64, (uint64_t) disp);
   11598   oappend_with_style (ins, tmp, style);
   11599 }
   11600 
   11601 /* Like oappend, but called for immediate operands.  */
   11602 
   11603 static void
   11604 oappend_immediate (instr_info *ins, bfd_vma imm)
   11605 {
   11606   if (!ins->intel_syntax)
   11607     oappend_char_with_style (ins, '$', dis_style_immediate);
   11608   print_operand_value (ins, imm, dis_style_immediate);
   11609 }
   11610 
   11611 /* Put DISP in BUF as signed hex number.  */
   11612 
   11613 static void
   11614 print_displacement (instr_info *ins, bfd_signed_vma val)
   11615 {
   11616   char tmp[30];
   11617 
   11618   if (val < 0)
   11619     {
   11620       oappend_char_with_style (ins, '-', dis_style_address_offset);
   11621       val = (bfd_vma) 0 - val;
   11622 
   11623       /* Check for possible overflow.  */
   11624       if (val < 0)
   11625 	{
   11626 	  switch (ins->address_mode)
   11627 	    {
   11628 	    case mode_64bit:
   11629 	      oappend_with_style (ins, "0x8000000000000000",
   11630 				  dis_style_address_offset);
   11631 	      break;
   11632 	    case mode_32bit:
   11633 	      oappend_with_style (ins, "0x80000000",
   11634 				  dis_style_address_offset);
   11635 	      break;
   11636 	    case mode_16bit:
   11637 	      oappend_with_style (ins, "0x8000",
   11638 				  dis_style_address_offset);
   11639 	      break;
   11640 	    }
   11641 	  return;
   11642 	}
   11643     }
   11644 
   11645   sprintf (tmp, "0x%" PRIx64, (int64_t) val);
   11646   oappend_with_style (ins, tmp, dis_style_address_offset);
   11647 }
   11648 
   11649 static void
   11650 intel_operand_size (instr_info *ins, int bytemode, int sizeflag)
   11651 {
   11652   /* Check if there is a broadcast, when evex.b is not treated as evex.nd.  */
   11653   if (ins->vex.b && ins->evex_type == evex_default)
   11654     {
   11655       if (!ins->vex.no_broadcast)
   11656 	switch (bytemode)
   11657 	  {
   11658 	  case x_mode:
   11659 	  case evex_half_bcst_xmmq_mode:
   11660 	    if (ins->vex.w)
   11661 	      oappend (ins, "QWORD BCST ");
   11662 	    else
   11663 	      oappend (ins, "DWORD BCST ");
   11664 	    break;
   11665 	  case xh_mode:
   11666 	  case evex_half_bcst_xmmqh_mode:
   11667 	  case evex_half_bcst_xmmqdh_mode:
   11668 	    oappend (ins, "WORD BCST ");
   11669 	    break;
   11670 	  default:
   11671 	    ins->vex.no_broadcast = true;
   11672 	    break;
   11673 	  }
   11674       return;
   11675     }
   11676   switch (bytemode)
   11677     {
   11678     case b_mode:
   11679     case b_swap_mode:
   11680     case db_mode:
   11681       oappend (ins, "BYTE PTR ");
   11682       break;
   11683     case w_mode:
   11684     case w_swap_mode:
   11685     case dw_mode:
   11686       oappend (ins, "WORD PTR ");
   11687       break;
   11688     case indir_v_mode:
   11689       if (ins->address_mode == mode_64bit && ins->isa64 == intel64)
   11690 	{
   11691 	  oappend (ins, "QWORD PTR ");
   11692 	  break;
   11693 	}
   11694       /* Fall through.  */
   11695     case stack_v_mode:
   11696       if (ins->address_mode == mode_64bit && ((sizeflag & DFLAG)
   11697 					      || (ins->rex & REX_W)))
   11698 	{
   11699 	  oappend (ins, "QWORD PTR ");
   11700 	  break;
   11701 	}
   11702       /* Fall through.  */
   11703     case v_mode:
   11704     case v_swap_mode:
   11705     case dq_mode:
   11706       USED_REX (REX_W);
   11707       if (ins->rex & REX_W)
   11708 	oappend (ins, "QWORD PTR ");
   11709       else if (bytemode == dq_mode)
   11710 	oappend (ins, "DWORD PTR ");
   11711       else
   11712 	{
   11713 	  if (sizeflag & DFLAG)
   11714 	    oappend (ins, "DWORD PTR ");
   11715 	  else
   11716 	    oappend (ins, "WORD PTR ");
   11717 	  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
   11718 	}
   11719       break;
   11720     case z_mode:
   11721       if ((ins->rex & REX_W) || (sizeflag & DFLAG))
   11722 	*ins->obufp++ = 'D';
   11723       oappend (ins, "WORD PTR ");
   11724       if (!(ins->rex & REX_W))
   11725 	ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
   11726       break;
   11727     case a_mode:
   11728       if (sizeflag & DFLAG)
   11729 	oappend (ins, "QWORD PTR ");
   11730       else
   11731 	oappend (ins, "DWORD PTR ");
   11732       ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
   11733       break;
   11734     case movsxd_mode:
   11735       if (!(sizeflag & DFLAG) && ins->isa64 == intel64)
   11736 	oappend (ins, "WORD PTR ");
   11737       else
   11738 	oappend (ins, "DWORD PTR ");
   11739       ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
   11740       break;
   11741     case d_mode:
   11742     case d_swap_mode:
   11743       oappend (ins, "DWORD PTR ");
   11744       break;
   11745     case q_mode:
   11746     case q_swap_mode:
   11747       oappend (ins, "QWORD PTR ");
   11748       break;
   11749     case m_mode:
   11750       if (ins->address_mode == mode_64bit)
   11751 	oappend (ins, "QWORD PTR ");
   11752       else
   11753 	oappend (ins, "DWORD PTR ");
   11754       break;
   11755     case f_mode:
   11756       if (sizeflag & DFLAG)
   11757 	oappend (ins, "FWORD PTR ");
   11758       else
   11759 	oappend (ins, "DWORD PTR ");
   11760       ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
   11761       break;
   11762     case t_mode:
   11763       oappend (ins, "TBYTE PTR ");
   11764       break;
   11765     case x_mode:
   11766     case xh_mode:
   11767     case x_swap_mode:
   11768     case evex_x_gscat_mode:
   11769     case evex_x_nobcst_mode:
   11770     case bw_unit_mode:
   11771       if (ins->need_vex)
   11772 	{
   11773 	  switch (ins->vex.length)
   11774 	    {
   11775 	    case 128:
   11776 	      oappend (ins, "XMMWORD PTR ");
   11777 	      break;
   11778 	    case 256:
   11779 	      oappend (ins, "YMMWORD PTR ");
   11780 	      break;
   11781 	    case 512:
   11782 	      oappend (ins, "ZMMWORD PTR ");
   11783 	      break;
   11784 	    default:
   11785 	      abort ();
   11786 	    }
   11787 	}
   11788       else
   11789 	oappend (ins, "XMMWORD PTR ");
   11790       break;
   11791     case xmm_mode:
   11792       oappend (ins, "XMMWORD PTR ");
   11793       break;
   11794     case ymm_mode:
   11795       oappend (ins, "YMMWORD PTR ");
   11796       break;
   11797     case xmmq_mode:
   11798     case evex_half_bcst_xmmqh_mode:
   11799     case evex_half_bcst_xmmq_mode:
   11800       switch (ins->vex.length)
   11801 	{
   11802 	case 0:
   11803 	case 128:
   11804 	  oappend (ins, "QWORD PTR ");
   11805 	  break;
   11806 	case 256:
   11807 	  oappend (ins, "XMMWORD PTR ");
   11808 	  break;
   11809 	case 512:
   11810 	  oappend (ins, "YMMWORD PTR ");
   11811 	  break;
   11812 	default:
   11813 	  abort ();
   11814 	}
   11815       break;
   11816     case xmmdw_mode:
   11817       if (!ins->need_vex)
   11818 	abort ();
   11819 
   11820       switch (ins->vex.length)
   11821 	{
   11822 	case 128:
   11823 	  oappend (ins, "WORD PTR ");
   11824 	  break;
   11825 	case 256:
   11826 	  oappend (ins, "DWORD PTR ");
   11827 	  break;
   11828 	case 512:
   11829 	  oappend (ins, "QWORD PTR ");
   11830 	  break;
   11831 	default:
   11832 	  abort ();
   11833 	}
   11834       break;
   11835     case xmmqd_mode:
   11836     case evex_half_bcst_xmmqdh_mode:
   11837       if (!ins->need_vex)
   11838 	abort ();
   11839 
   11840       switch (ins->vex.length)
   11841 	{
   11842 	case 128:
   11843 	  oappend (ins, "DWORD PTR ");
   11844 	  break;
   11845 	case 256:
   11846 	  oappend (ins, "QWORD PTR ");
   11847 	  break;
   11848 	case 512:
   11849 	  oappend (ins, "XMMWORD PTR ");
   11850 	  break;
   11851 	default:
   11852 	  abort ();
   11853 	}
   11854       break;
   11855     case ymmq_mode:
   11856       if (!ins->need_vex)
   11857 	abort ();
   11858 
   11859       switch (ins->vex.length)
   11860 	{
   11861 	case 128:
   11862 	  oappend (ins, "QWORD PTR ");
   11863 	  break;
   11864 	case 256:
   11865 	  oappend (ins, "YMMWORD PTR ");
   11866 	  break;
   11867 	case 512:
   11868 	  oappend (ins, "ZMMWORD PTR ");
   11869 	  break;
   11870 	default:
   11871 	  abort ();
   11872 	}
   11873       break;
   11874     case o_mode:
   11875       oappend (ins, "OWORD PTR ");
   11876       break;
   11877     case vex_vsib_d_w_dq_mode:
   11878     case vex_vsib_q_w_dq_mode:
   11879       if (!ins->need_vex)
   11880 	abort ();
   11881       if (ins->vex.w)
   11882 	oappend (ins, "QWORD PTR ");
   11883       else
   11884 	oappend (ins, "DWORD PTR ");
   11885       break;
   11886     case mask_bd_mode:
   11887       if (!ins->need_vex || ins->vex.length != 128)
   11888 	abort ();
   11889       if (ins->vex.w)
   11890 	oappend (ins, "DWORD PTR ");
   11891       else
   11892 	oappend (ins, "BYTE PTR ");
   11893       break;
   11894     case mask_mode:
   11895       if (!ins->need_vex)
   11896 	abort ();
   11897       if (ins->vex.w)
   11898 	oappend (ins, "QWORD PTR ");
   11899       else
   11900 	oappend (ins, "WORD PTR ");
   11901       break;
   11902     case v_bnd_mode:
   11903     case v_bndmk_mode:
   11904     default:
   11905       break;
   11906     }
   11907 }
   11908 
   11909 static void
   11910 print_register (instr_info *ins, unsigned int reg, unsigned int rexmask,
   11911 		int bytemode, int sizeflag)
   11912 {
   11913   const char (*names)[8];
   11914 
   11915   /* Masking is invalid for insns with GPR destination. Set the flag uniformly,
   11916      as the consumer will inspect it only for the destination operand.  */
   11917   if (bytemode != mask_mode && ins->vex.mask_register_specifier)
   11918     ins->illegal_masking = true;
   11919 
   11920   USED_REX (rexmask);
   11921   if (ins->rex & rexmask)
   11922     reg += 8;
   11923   if (ins->rex2 & rexmask)
   11924     reg += 16;
   11925 
   11926   switch (bytemode)
   11927     {
   11928     case b_mode:
   11929     case b_swap_mode:
   11930       if (reg & 4)
   11931 	USED_REX (0);
   11932       if (ins->rex || ins->rex2)
   11933 	names = att_names8rex;
   11934       else
   11935 	names = att_names8;
   11936       break;
   11937     case w_mode:
   11938       names = att_names16;
   11939       break;
   11940     case d_mode:
   11941     case dw_mode:
   11942     case db_mode:
   11943       names = att_names32;
   11944       break;
   11945     case q_mode:
   11946       names = att_names64;
   11947       break;
   11948     case m_mode:
   11949     case v_bnd_mode:
   11950       names = ins->address_mode == mode_64bit ? att_names64 : att_names32;
   11951       break;
   11952     case bnd_mode:
   11953     case bnd_swap_mode:
   11954       if (reg > 0x3)
   11955 	{
   11956 	  oappend (ins, "(bad)");
   11957 	  return;
   11958 	}
   11959       names = att_names_bnd;
   11960       break;
   11961     case indir_v_mode:
   11962       if (ins->address_mode == mode_64bit && ins->isa64 == intel64)
   11963 	{
   11964 	  names = att_names64;
   11965 	  break;
   11966 	}
   11967       /* Fall through.  */
   11968     case stack_v_mode:
   11969       if (ins->address_mode == mode_64bit && ((sizeflag & DFLAG)
   11970 					      || (ins->rex & REX_W)))
   11971 	{
   11972 	  names = att_names64;
   11973 	  break;
   11974 	}
   11975       bytemode = v_mode;
   11976       /* Fall through.  */
   11977     case v_mode:
   11978     case v_swap_mode:
   11979     case dq_mode:
   11980       USED_REX (REX_W);
   11981       if (ins->rex & REX_W)
   11982 	names = att_names64;
   11983       else if (bytemode != v_mode && bytemode != v_swap_mode)
   11984 	names = att_names32;
   11985       else
   11986 	{
   11987 	  if (sizeflag & DFLAG)
   11988 	    names = att_names32;
   11989 	  else
   11990 	    names = att_names16;
   11991 	  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
   11992 	}
   11993       break;
   11994     case movsxd_mode:
   11995       if (!(sizeflag & DFLAG) && ins->isa64 == intel64)
   11996 	names = att_names16;
   11997       else
   11998 	names = att_names32;
   11999       ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
   12000       break;
   12001     case va_mode:
   12002       names = (ins->address_mode == mode_64bit
   12003 	       ? att_names64 : att_names32);
   12004       if (!(ins->prefixes & PREFIX_ADDR))
   12005 	names = (ins->address_mode == mode_16bit
   12006 		     ? att_names16 : names);
   12007       else
   12008 	{
   12009 	  /* Remove "addr16/addr32".  */
   12010 	  ins->all_prefixes[ins->last_addr_prefix] = 0;
   12011 	  names = (ins->address_mode != mode_32bit
   12012 		       ? att_names32 : att_names16);
   12013 	  ins->used_prefixes |= PREFIX_ADDR;
   12014 	}
   12015       break;
   12016     case mask_bd_mode:
   12017     case mask_mode:
   12018       if (reg > 0x7)
   12019 	{
   12020 	  oappend (ins, "(bad)");
   12021 	  return;
   12022 	}
   12023       names = att_names_mask;
   12024       break;
   12025     case 0:
   12026       return;
   12027     default:
   12028       oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
   12029       return;
   12030     }
   12031   oappend_register (ins, names[reg]);
   12032 }
   12033 
   12034 static bool
   12035 get8s (instr_info *ins, bfd_vma *res)
   12036 {
   12037   if (!fetch_code (ins->info, ins->codep + 1))
   12038     return false;
   12039   *res = ((bfd_vma) *ins->codep++ ^ 0x80) - 0x80;
   12040   return true;
   12041 }
   12042 
   12043 static bool
   12044 get16 (instr_info *ins, bfd_vma *res)
   12045 {
   12046   if (!fetch_code (ins->info, ins->codep + 2))
   12047     return false;
   12048   *res = *ins->codep++;
   12049   *res |= (bfd_vma) *ins->codep++ << 8;
   12050   return true;
   12051 }
   12052 
   12053 static bool
   12054 get16s (instr_info *ins, bfd_vma *res)
   12055 {
   12056   if (!get16 (ins, res))
   12057     return false;
   12058   *res = (*res ^ 0x8000) - 0x8000;
   12059   return true;
   12060 }
   12061 
   12062 static bool
   12063 get32 (instr_info *ins, bfd_vma *res)
   12064 {
   12065   if (!fetch_code (ins->info, ins->codep + 4))
   12066     return false;
   12067   *res = *ins->codep++;
   12068   *res |= (bfd_vma) *ins->codep++ << 8;
   12069   *res |= (bfd_vma) *ins->codep++ << 16;
   12070   *res |= (bfd_vma) *ins->codep++ << 24;
   12071   return true;
   12072 }
   12073 
   12074 static bool
   12075 get32s (instr_info *ins, bfd_vma *res)
   12076 {
   12077   if (!get32 (ins, res))
   12078     return false;
   12079 
   12080   *res = (*res ^ ((bfd_vma) 1 << 31)) - ((bfd_vma) 1 << 31);
   12081 
   12082   return true;
   12083 }
   12084 
   12085 static bool
   12086 get64 (instr_info *ins, uint64_t *res)
   12087 {
   12088   unsigned int a;
   12089   unsigned int b;
   12090 
   12091   if (!fetch_code (ins->info, ins->codep + 8))
   12092     return false;
   12093   a = *ins->codep++;
   12094   a |= (unsigned int) *ins->codep++ << 8;
   12095   a |= (unsigned int) *ins->codep++ << 16;
   12096   a |= (unsigned int) *ins->codep++ << 24;
   12097   b = *ins->codep++;
   12098   b |= (unsigned int) *ins->codep++ << 8;
   12099   b |= (unsigned int) *ins->codep++ << 16;
   12100   b |= (unsigned int) *ins->codep++ << 24;
   12101   *res = a + ((uint64_t) b << 32);
   12102   return true;
   12103 }
   12104 
   12105 static void
   12106 set_op (instr_info *ins, bfd_vma op, bool riprel)
   12107 {
   12108   ins->op_index[ins->op_ad] = ins->op_ad;
   12109   if (ins->address_mode == mode_64bit)
   12110     ins->op_address[ins->op_ad] = op;
   12111   else /* Mask to get a 32-bit address.  */
   12112     ins->op_address[ins->op_ad] = op & 0xffffffff;
   12113   ins->op_riprel[ins->op_ad] = riprel;
   12114 }
   12115 
   12116 static bool
   12117 BadOp (instr_info *ins)
   12118 {
   12119   /* Throw away prefixes and 1st. opcode byte.  */
   12120   struct dis_private *priv = ins->info->private_data;
   12121 
   12122   ins->codep = priv->the_buffer + ins->nr_prefixes + ins->need_vex + 1;
   12123   ins->obufp = stpcpy (ins->obufp, "(bad)");
   12124   return true;
   12125 }
   12126 
   12127 static bool
   12128 OP_Skip_MODRM (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
   12129 	       int sizeflag ATTRIBUTE_UNUSED)
   12130 {
   12131   if (ins->modrm.mod != 3)
   12132     return BadOp (ins);
   12133 
   12134   /* Skip mod/rm byte.  */
   12135   MODRM_CHECK;
   12136   ins->codep++;
   12137   ins->has_skipped_modrm = true;
   12138   return true;
   12139 }
   12140 
   12141 static bool
   12142 OP_E_memory (instr_info *ins, int bytemode, int sizeflag)
   12143 {
   12144   int add = (ins->rex & REX_B) ? 8 : 0;
   12145   int riprel = 0;
   12146   int shift;
   12147 
   12148   add += (ins->rex2 & REX_B) ? 16 : 0;
   12149 
   12150   /* Handles EVEX other than APX EVEX-promoted instructions.  */
   12151   if (ins->vex.evex && ins->evex_type == evex_default)
   12152     {
   12153 
   12154       /* Zeroing-masking is invalid for memory destinations. Set the flag
   12155 	 uniformly, as the consumer will inspect it only for the destination
   12156 	 operand.  */
   12157       if (ins->vex.zeroing)
   12158 	ins->illegal_masking = true;
   12159 
   12160       switch (bytemode)
   12161 	{
   12162 	case dw_mode:
   12163 	case w_mode:
   12164 	case w_swap_mode:
   12165 	  shift = 1;
   12166 	  break;
   12167 	case db_mode:
   12168 	case b_mode:
   12169 	  shift = 0;
   12170 	  break;
   12171 	case dq_mode:
   12172 	  if (ins->address_mode != mode_64bit)
   12173 	    {
   12174 	case d_mode:
   12175 	case d_swap_mode:
   12176 	      shift = 2;
   12177 	      break;
   12178 	    }
   12179 	    /* fall through */
   12180 	case vex_vsib_d_w_dq_mode:
   12181 	case vex_vsib_q_w_dq_mode:
   12182 	case evex_x_gscat_mode:
   12183 	  shift = ins->vex.w ? 3 : 2;
   12184 	  break;
   12185 	case xh_mode:
   12186 	case evex_half_bcst_xmmqh_mode:
   12187 	case evex_half_bcst_xmmqdh_mode:
   12188 	  if (ins->vex.b)
   12189 	    {
   12190 	      shift = ins->vex.w ? 2 : 1;
   12191 	      break;
   12192 	    }
   12193 	  /* Fall through.  */
   12194 	case x_mode:
   12195 	case evex_half_bcst_xmmq_mode:
   12196 	  if (ins->vex.b)
   12197 	    {
   12198 	      shift = ins->vex.w ? 3 : 2;
   12199 	      break;
   12200 	    }
   12201 	  /* Fall through.  */
   12202 	case xmmqd_mode:
   12203 	case xmmdw_mode:
   12204 	case xmmq_mode:
   12205 	case ymmq_mode:
   12206 	case evex_x_nobcst_mode:
   12207 	case x_swap_mode:
   12208 	  switch (ins->vex.length)
   12209 	    {
   12210 	    case 128:
   12211 	      shift = 4;
   12212 	      break;
   12213 	    case 256:
   12214 	      shift = 5;
   12215 	      break;
   12216 	    case 512:
   12217 	      shift = 6;
   12218 	      break;
   12219 	    default:
   12220 	      abort ();
   12221 	    }
   12222 	  /* Make necessary corrections to shift for modes that need it.  */
   12223 	  if (bytemode == xmmq_mode
   12224 	      || bytemode == evex_half_bcst_xmmqh_mode
   12225 	      || bytemode == evex_half_bcst_xmmq_mode
   12226 	      || (bytemode == ymmq_mode && ins->vex.length == 128))
   12227 	    shift -= 1;
   12228 	  else if (bytemode == xmmqd_mode
   12229 	           || bytemode == evex_half_bcst_xmmqdh_mode)
   12230 	    shift -= 2;
   12231 	  else if (bytemode == xmmdw_mode)
   12232 	    shift -= 3;
   12233 	  break;
   12234 	case ymm_mode:
   12235 	  shift = 5;
   12236 	  break;
   12237 	case xmm_mode:
   12238 	  shift = 4;
   12239 	  break;
   12240 	case q_mode:
   12241 	case q_swap_mode:
   12242 	  shift = 3;
   12243 	  break;
   12244 	case bw_unit_mode:
   12245 	  shift = ins->vex.w ? 1 : 0;
   12246 	  break;
   12247 	default:
   12248 	  abort ();
   12249 	}
   12250     }
   12251   else
   12252     shift = 0;
   12253 
   12254   USED_REX (REX_B);
   12255   if (ins->intel_syntax)
   12256     intel_operand_size (ins, bytemode, sizeflag);
   12257   append_seg (ins);
   12258 
   12259   if ((sizeflag & AFLAG) || ins->address_mode == mode_64bit)
   12260     {
   12261       /* 32/64 bit address mode */
   12262       bfd_vma disp = 0;
   12263       int havedisp;
   12264       int havebase;
   12265       int needindex;
   12266       int needaddr32;
   12267       int base, rbase;
   12268       int vindex = 0;
   12269       int scale = 0;
   12270       int addr32flag = !((sizeflag & AFLAG)
   12271 			 || bytemode == v_bnd_mode
   12272 			 || bytemode == v_bndmk_mode
   12273 			 || bytemode == bnd_mode
   12274 			 || bytemode == bnd_swap_mode);
   12275       bool check_gather = false;
   12276       const char (*indexes)[8] = NULL;
   12277 
   12278       havebase = 1;
   12279       base = ins->modrm.rm;
   12280 
   12281       if (base == 4)
   12282 	{
   12283 	  vindex = ins->sib.index;
   12284 	  USED_REX (REX_X);
   12285 	  if (ins->rex & REX_X)
   12286 	    vindex += 8;
   12287 	  switch (bytemode)
   12288 	    {
   12289 	    case vex_vsib_d_w_dq_mode:
   12290 	    case vex_vsib_q_w_dq_mode:
   12291 	      if (!ins->need_vex)
   12292 		abort ();
   12293 	      if (ins->vex.evex)
   12294 		{
   12295 		  /* S/G EVEX insns require EVEX.X4 not to be set.  */
   12296 		  if (ins->rex2 & REX_X)
   12297 		    {
   12298 		      oappend (ins, "(bad)");
   12299 		      return true;
   12300 		    }
   12301 
   12302 		  if (!ins->vex.v)
   12303 		    vindex += 16;
   12304 		  check_gather = ins->obufp == ins->op_out[1];
   12305 		}
   12306 
   12307 	      switch (ins->vex.length)
   12308 		{
   12309 		case 128:
   12310 		  indexes = att_names_xmm;
   12311 		  break;
   12312 		case 256:
   12313 		  if (!ins->vex.w
   12314 		      || bytemode == vex_vsib_q_w_dq_mode)
   12315 		    indexes = att_names_ymm;
   12316 		  else
   12317 		    indexes = att_names_xmm;
   12318 		  break;
   12319 		case 512:
   12320 		  if (!ins->vex.w
   12321 		      || bytemode == vex_vsib_q_w_dq_mode)
   12322 		    indexes = att_names_zmm;
   12323 		  else
   12324 		    indexes = att_names_ymm;
   12325 		  break;
   12326 		default:
   12327 		  abort ();
   12328 		}
   12329 	      break;
   12330 	    default:
   12331 	      if (ins->rex2 & REX_X)
   12332 		vindex += 16;
   12333 
   12334 	      if (vindex != 4)
   12335 		indexes = ins->address_mode == mode_64bit && !addr32flag
   12336 			  ? att_names64 : att_names32;
   12337 	      break;
   12338 	    }
   12339 	  scale = ins->sib.scale;
   12340 	  base = ins->sib.base;
   12341 	  ins->codep++;
   12342 	}
   12343       else
   12344 	{
   12345 	  /* Check for mandatory SIB.  */
   12346 	  if (bytemode == vex_vsib_d_w_dq_mode
   12347 	      || bytemode == vex_vsib_q_w_dq_mode
   12348 	      || bytemode == vex_sibmem_mode)
   12349 	    {
   12350 	      oappend (ins, "(bad)");
   12351 	      return true;
   12352 	    }
   12353 	}
   12354       rbase = base + add;
   12355 
   12356       switch (ins->modrm.mod)
   12357 	{
   12358 	case 0:
   12359 	  if (base == 5)
   12360 	    {
   12361 	      havebase = 0;
   12362 	      if (ins->address_mode == mode_64bit && !ins->has_sib)
   12363 		riprel = 1;
   12364 	      if (!get32s (ins, &disp))
   12365 		return false;
   12366 	      if (riprel && bytemode == v_bndmk_mode)
   12367 		{
   12368 		  oappend (ins, "(bad)");
   12369 		  return true;
   12370 		}
   12371 	    }
   12372 	  break;
   12373 	case 1:
   12374 	  if (!get8s (ins, &disp))
   12375 	    return false;
   12376 	  if (ins->vex.evex && shift > 0)
   12377 	    disp <<= shift;
   12378 	  break;
   12379 	case 2:
   12380 	  if (!get32s (ins, &disp))
   12381 	    return false;
   12382 	  break;
   12383 	}
   12384 
   12385       needindex = 0;
   12386       needaddr32 = 0;
   12387       if (ins->has_sib
   12388 	  && !havebase
   12389 	  && !indexes
   12390 	  && ins->address_mode != mode_16bit)
   12391 	{
   12392 	  if (ins->address_mode == mode_64bit)
   12393 	    {
   12394 	      if (addr32flag)
   12395 		{
   12396 		  /* Without base nor index registers, zero-extend the
   12397 		     lower 32-bit displacement to 64 bits.  */
   12398 		  disp &= 0xffffffff;
   12399 		  needindex = 1;
   12400 		}
   12401 	      needaddr32 = 1;
   12402 	    }
   12403 	  else
   12404 	    {
   12405 	      /* In 32-bit mode, we need index register to tell [offset]
   12406 		 from [eiz*1 + offset].  */
   12407 	      needindex = 1;
   12408 	    }
   12409 	}
   12410 
   12411       havedisp = (havebase
   12412 		  || needindex
   12413 		  || (ins->has_sib && (indexes || scale != 0)));
   12414 
   12415       if (!ins->intel_syntax)
   12416 	if (ins->modrm.mod != 0 || base == 5)
   12417 	  {
   12418 	    if (havedisp || riprel)
   12419 	      print_displacement (ins, disp);
   12420 	    else
   12421 	      print_operand_value (ins, disp, dis_style_address_offset);
   12422 	    if (riprel)
   12423 	      {
   12424 		set_op (ins, disp, true);
   12425 		oappend_char (ins, '(');
   12426 		oappend_with_style (ins, !addr32flag ? "%rip" : "%eip",
   12427 				    dis_style_register);
   12428 		oappend_char (ins, ')');
   12429 	      }
   12430 	  }
   12431 
   12432       if ((havebase || indexes || needindex || needaddr32 || riprel)
   12433 	  && (ins->address_mode != mode_64bit
   12434 	      || ((bytemode != v_bnd_mode)
   12435 		  && (bytemode != v_bndmk_mode)
   12436 		  && (bytemode != bnd_mode)
   12437 		  && (bytemode != bnd_swap_mode))))
   12438 	ins->used_prefixes |= PREFIX_ADDR;
   12439 
   12440       if (havedisp || (ins->intel_syntax && riprel))
   12441 	{
   12442 	  oappend_char (ins, ins->open_char);
   12443 	  if (ins->intel_syntax && riprel)
   12444 	    {
   12445 	      set_op (ins, disp, true);
   12446 	      oappend_with_style (ins, !addr32flag ? "rip" : "eip",
   12447 				  dis_style_register);
   12448 	    }
   12449 	  if (havebase)
   12450 	    oappend_register
   12451 	      (ins,
   12452 	       (ins->address_mode == mode_64bit && !addr32flag
   12453 		? att_names64 : att_names32)[rbase]);
   12454 	  if (ins->has_sib)
   12455 	    {
   12456 	      /* ESP/RSP won't allow index.  If base isn't ESP/RSP,
   12457 		 print index to tell base + index from base.  */
   12458 	      if (scale != 0
   12459 		  || needindex
   12460 		  || indexes
   12461 		  || (havebase && base != ESP_REG_NUM))
   12462 		{
   12463 		  if (!ins->intel_syntax || havebase)
   12464 		    oappend_char (ins, ins->separator_char);
   12465 		  if (indexes)
   12466 		    {
   12467 		      if (ins->address_mode == mode_64bit || vindex < 16)
   12468 			oappend_register (ins, indexes[vindex]);
   12469 		      else
   12470 			oappend (ins, "(bad)");
   12471 		    }
   12472 		  else
   12473 		    oappend_register (ins,
   12474 				      ins->address_mode == mode_64bit
   12475 				      && !addr32flag
   12476 				      ? att_index64
   12477 				      : att_index32);
   12478 
   12479 		  oappend_char (ins, ins->scale_char);
   12480 		  oappend_char_with_style (ins, '0' + (1 << scale),
   12481 					   dis_style_immediate);
   12482 		}
   12483 	    }
   12484 	  if (ins->intel_syntax
   12485 	      && (disp || ins->modrm.mod != 0 || base == 5))
   12486 	    {
   12487 	      if (!havedisp || (bfd_signed_vma) disp >= 0)
   12488 		  oappend_char (ins, '+');
   12489 	      if (havedisp)
   12490 		print_displacement (ins, disp);
   12491 	      else
   12492 		print_operand_value (ins, disp, dis_style_address_offset);
   12493 	    }
   12494 
   12495 	  oappend_char (ins, ins->close_char);
   12496 
   12497 	  if (check_gather)
   12498 	    {
   12499 	      /* Both XMM/YMM/ZMM registers must be distinct.  */
   12500 	      int modrm_reg = ins->modrm.reg;
   12501 
   12502 	      if (ins->rex & REX_R)
   12503 	        modrm_reg += 8;
   12504 	      if (ins->rex2 & REX_R)
   12505 	        modrm_reg += 16;
   12506 	      if (vindex == modrm_reg)
   12507 		oappend (ins, "/(bad)");
   12508 	    }
   12509 	}
   12510       else if (ins->intel_syntax)
   12511 	{
   12512 	  if (ins->modrm.mod != 0 || base == 5)
   12513 	    {
   12514 	      if (!ins->active_seg_prefix)
   12515 		{
   12516 		  oappend_register (ins, att_names_seg[ds_reg - es_reg]);
   12517 		  oappend (ins, ":");
   12518 		}
   12519 	      print_operand_value (ins, disp, dis_style_text);
   12520 	    }
   12521 	}
   12522     }
   12523   else if (bytemode == v_bnd_mode
   12524 	   || bytemode == v_bndmk_mode
   12525 	   || bytemode == bnd_mode
   12526 	   || bytemode == bnd_swap_mode
   12527 	   || bytemode == vex_vsib_d_w_dq_mode
   12528 	   || bytemode == vex_vsib_q_w_dq_mode)
   12529     {
   12530       oappend (ins, "(bad)");
   12531       return true;
   12532     }
   12533   else
   12534     {
   12535       /* 16 bit address mode */
   12536       bfd_vma disp = 0;
   12537 
   12538       ins->used_prefixes |= ins->prefixes & PREFIX_ADDR;
   12539       switch (ins->modrm.mod)
   12540 	{
   12541 	case 0:
   12542 	  if (ins->modrm.rm == 6)
   12543 	    {
   12544 	case 2:
   12545 	      if (!get16s (ins, &disp))
   12546 		return false;
   12547 	    }
   12548 	  break;
   12549 	case 1:
   12550 	  if (!get8s (ins, &disp))
   12551 	    return false;
   12552 	  if (ins->vex.evex && shift > 0)
   12553 	    disp <<= shift;
   12554 	  break;
   12555 	}
   12556 
   12557       if (!ins->intel_syntax)
   12558 	if (ins->modrm.mod != 0 || ins->modrm.rm == 6)
   12559 	  print_displacement (ins, disp);
   12560 
   12561       if (ins->modrm.mod != 0 || ins->modrm.rm != 6)
   12562 	{
   12563 	  oappend_char (ins, ins->open_char);
   12564 	  oappend (ins, ins->intel_syntax ? intel_index16[ins->modrm.rm]
   12565 					  : att_index16[ins->modrm.rm]);
   12566 	  if (ins->intel_syntax
   12567 	      && (disp || ins->modrm.mod != 0 || ins->modrm.rm == 6))
   12568 	    {
   12569 	      if ((bfd_signed_vma) disp >= 0)
   12570 		oappend_char (ins, '+');
   12571 	      print_displacement (ins, disp);
   12572 	    }
   12573 
   12574 	  oappend_char (ins, ins->close_char);
   12575 	}
   12576       else if (ins->intel_syntax)
   12577 	{
   12578 	  if (!ins->active_seg_prefix)
   12579 	    {
   12580 	      oappend_register (ins, att_names_seg[ds_reg - es_reg]);
   12581 	      oappend (ins, ":");
   12582 	    }
   12583 	  print_operand_value (ins, disp & 0xffff, dis_style_text);
   12584 	}
   12585     }
   12586   if (ins->vex.b && ins->evex_type == evex_default)
   12587     {
   12588       ins->evex_used |= EVEX_b_used;
   12589 
   12590       /* Broadcast can only ever be valid for memory sources.  */
   12591       if (ins->obufp == ins->op_out[0])
   12592 	ins->vex.no_broadcast = true;
   12593 
   12594       if (!ins->vex.no_broadcast
   12595 	  && (!ins->intel_syntax || !(ins->evex_used & EVEX_len_used)))
   12596 	{
   12597 	  if (bytemode == xh_mode)
   12598 	    {
   12599 	      switch (ins->vex.length)
   12600 		{
   12601 		case 128:
   12602 		  oappend (ins, "{1to8}");
   12603 		  break;
   12604 		case 256:
   12605 		  oappend (ins, "{1to16}");
   12606 		  break;
   12607 		case 512:
   12608 		  oappend (ins, "{1to32}");
   12609 		  break;
   12610 		default:
   12611 		  abort ();
   12612 		}
   12613 	    }
   12614 	  else if (bytemode == q_mode
   12615 		   || bytemode == ymmq_mode)
   12616 	    ins->vex.no_broadcast = true;
   12617 	  else if (ins->vex.w
   12618 		   || bytemode == evex_half_bcst_xmmqdh_mode
   12619 		   || bytemode == evex_half_bcst_xmmq_mode)
   12620 	    {
   12621 	      switch (ins->vex.length)
   12622 		{
   12623 		case 128:
   12624 		  oappend (ins, "{1to2}");
   12625 		  break;
   12626 		case 256:
   12627 		  oappend (ins, "{1to4}");
   12628 		  break;
   12629 		case 512:
   12630 		  oappend (ins, "{1to8}");
   12631 		  break;
   12632 		default:
   12633 		  abort ();
   12634 		}
   12635 	    }
   12636 	  else if (bytemode == x_mode
   12637 		   || bytemode == evex_half_bcst_xmmqh_mode)
   12638 	    {
   12639 	      switch (ins->vex.length)
   12640 		{
   12641 		case 128:
   12642 		  oappend (ins, "{1to4}");
   12643 		  break;
   12644 		case 256:
   12645 		  oappend (ins, "{1to8}");
   12646 		  break;
   12647 		case 512:
   12648 		  oappend (ins, "{1to16}");
   12649 		  break;
   12650 		default:
   12651 		  abort ();
   12652 		}
   12653 	    }
   12654 	  else
   12655 	    ins->vex.no_broadcast = true;
   12656 	}
   12657       if (ins->vex.no_broadcast)
   12658 	oappend (ins, "{bad}");
   12659     }
   12660 
   12661   return true;
   12662 }
   12663 
   12664 static bool
   12665 OP_E (instr_info *ins, int bytemode, int sizeflag)
   12666 {
   12667   /* Skip mod/rm byte.  */
   12668   MODRM_CHECK;
   12669   if (!ins->has_skipped_modrm)
   12670     {
   12671       ins->codep++;
   12672       ins->has_skipped_modrm = true;
   12673     }
   12674 
   12675   if (ins->modrm.mod == 3)
   12676     {
   12677       if ((sizeflag & SUFFIX_ALWAYS)
   12678 	  && (bytemode == b_swap_mode
   12679 	      || bytemode == bnd_swap_mode
   12680 	      || bytemode == v_swap_mode))
   12681 	swap_operand (ins);
   12682 
   12683       print_register (ins, ins->modrm.rm, REX_B, bytemode, sizeflag);
   12684       return true;
   12685     }
   12686 
   12687   /* Masking is invalid for insns with GPR-like memory destination. Set the
   12688      flag uniformly, as the consumer will inspect it only for the destination
   12689      operand.  */
   12690   if (ins->vex.mask_register_specifier)
   12691     ins->illegal_masking = true;
   12692 
   12693   return OP_E_memory (ins, bytemode, sizeflag);
   12694 }
   12695 
   12696 static bool
   12697 OP_indirE (instr_info *ins, int bytemode, int sizeflag)
   12698 {
   12699   if (ins->modrm.mod == 3 && bytemode == f_mode)
   12700     /* bad lcall/ljmp */
   12701     return BadOp (ins);
   12702   if (!ins->intel_syntax)
   12703     oappend (ins, "*");
   12704   return OP_E (ins, bytemode, sizeflag);
   12705 }
   12706 
   12707 static bool
   12708 OP_G (instr_info *ins, int bytemode, int sizeflag)
   12709 {
   12710   print_register (ins, ins->modrm.reg, REX_R, bytemode, sizeflag);
   12711   return true;
   12712 }
   12713 
   12714 static bool
   12715 OP_REG (instr_info *ins, int code, int sizeflag)
   12716 {
   12717   const char *s;
   12718   int add = 0;
   12719 
   12720   switch (code)
   12721     {
   12722     case es_reg: case ss_reg: case cs_reg:
   12723     case ds_reg: case fs_reg: case gs_reg:
   12724       oappend_register (ins, att_names_seg[code - es_reg]);
   12725       return true;
   12726     }
   12727 
   12728   USED_REX (REX_B);
   12729   if (ins->rex & REX_B)
   12730     add = 8;
   12731   if (ins->rex2 & REX_B)
   12732     add += 16;
   12733 
   12734   switch (code)
   12735     {
   12736     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
   12737     case sp_reg: case bp_reg: case si_reg: case di_reg:
   12738       s = att_names16[code - ax_reg + add];
   12739       break;
   12740     case ah_reg: case ch_reg: case dh_reg: case bh_reg:
   12741       USED_REX (0);
   12742       /* Fall through.  */
   12743     case al_reg: case cl_reg: case dl_reg: case bl_reg:
   12744       if (ins->rex)
   12745 	s = att_names8rex[code - al_reg + add];
   12746       else
   12747 	s = att_names8[code - al_reg];
   12748       break;
   12749     case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
   12750     case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
   12751       if (ins->address_mode == mode_64bit
   12752 	  && ((sizeflag & DFLAG) || (ins->rex & REX_W)))
   12753 	{
   12754 	  s = att_names64[code - rAX_reg + add];
   12755 	  break;
   12756 	}
   12757       code += eAX_reg - rAX_reg;
   12758       /* Fall through.  */
   12759     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
   12760     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
   12761       USED_REX (REX_W);
   12762       if (ins->rex & REX_W)
   12763 	s = att_names64[code - eAX_reg + add];
   12764       else
   12765 	{
   12766 	  if (sizeflag & DFLAG)
   12767 	    s = att_names32[code - eAX_reg + add];
   12768 	  else
   12769 	    s = att_names16[code - eAX_reg + add];
   12770 	  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
   12771 	}
   12772       break;
   12773     default:
   12774       oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
   12775       return true;
   12776     }
   12777   oappend_register (ins, s);
   12778   return true;
   12779 }
   12780 
   12781 static bool
   12782 OP_IMREG (instr_info *ins, int code, int sizeflag)
   12783 {
   12784   const char *s;
   12785 
   12786   switch (code)
   12787     {
   12788     case indir_dx_reg:
   12789       if (!ins->intel_syntax)
   12790 	{
   12791 	  oappend (ins, "(%dx)");
   12792 	  return true;
   12793 	}
   12794       s = att_names16[dx_reg - ax_reg];
   12795       break;
   12796     case al_reg: case cl_reg:
   12797       s = att_names8[code - al_reg];
   12798       break;
   12799     case eAX_reg:
   12800       USED_REX (REX_W);
   12801       if (ins->rex & REX_W)
   12802 	{
   12803 	  s = *att_names64;
   12804 	  break;
   12805 	}
   12806       /* Fall through.  */
   12807     case z_mode_ax_reg:
   12808       if ((ins->rex & REX_W) || (sizeflag & DFLAG))
   12809 	s = *att_names32;
   12810       else
   12811 	s = *att_names16;
   12812       if (!(ins->rex & REX_W))
   12813 	ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
   12814       break;
   12815     default:
   12816       oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
   12817       return true;
   12818     }
   12819   oappend_register (ins, s);
   12820   return true;
   12821 }
   12822 
   12823 static bool
   12824 OP_I (instr_info *ins, int bytemode, int sizeflag)
   12825 {
   12826   bfd_vma op;
   12827 
   12828   switch (bytemode)
   12829     {
   12830     case b_mode:
   12831       if (!fetch_code (ins->info, ins->codep + 1))
   12832 	return false;
   12833       op = *ins->codep++;
   12834       break;
   12835     case v_mode:
   12836       USED_REX (REX_W);
   12837       if (ins->rex & REX_W)
   12838 	{
   12839 	  if (!get32s (ins, &op))
   12840 	    return false;
   12841 	}
   12842       else
   12843 	{
   12844 	  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
   12845 	  if (sizeflag & DFLAG)
   12846 	    {
   12847     case d_mode:
   12848 	      if (!get32 (ins, &op))
   12849 		return false;
   12850 	    }
   12851 	  else
   12852 	    {
   12853 	      /* Fall through.  */
   12854     case w_mode:
   12855 	      if (!get16 (ins, &op))
   12856 		return false;
   12857 	    }
   12858 	}
   12859       break;
   12860     case const_1_mode:
   12861       if (ins->intel_syntax)
   12862 	oappend_with_style (ins, "1", dis_style_immediate);
   12863       else
   12864 	oappend_with_style (ins, "$1", dis_style_immediate);
   12865       return true;
   12866     default:
   12867       oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
   12868       return true;
   12869     }
   12870 
   12871   oappend_immediate (ins, op);
   12872   return true;
   12873 }
   12874 
   12875 static bool
   12876 OP_I64 (instr_info *ins, int bytemode, int sizeflag)
   12877 {
   12878   uint64_t op;
   12879 
   12880   if (bytemode != v_mode || ins->address_mode != mode_64bit
   12881       || !(ins->rex & REX_W))
   12882     return OP_I (ins, bytemode, sizeflag);
   12883 
   12884   USED_REX (REX_W);
   12885 
   12886   if (!get64 (ins, &op))
   12887     return false;
   12888 
   12889   oappend_immediate (ins, op);
   12890   return true;
   12891 }
   12892 
   12893 static bool
   12894 OP_sI (instr_info *ins, int bytemode, int sizeflag)
   12895 {
   12896   bfd_vma op;
   12897 
   12898   switch (bytemode)
   12899     {
   12900     case b_mode:
   12901     case b_T_mode:
   12902       if (!get8s (ins, &op))
   12903 	return false;
   12904       if (bytemode == b_T_mode)
   12905 	{
   12906 	  if (ins->address_mode != mode_64bit
   12907 	      || !((sizeflag & DFLAG) || (ins->rex & REX_W)))
   12908 	    {
   12909 	      /* The operand-size prefix is overridden by a REX prefix.  */
   12910 	      if ((sizeflag & DFLAG) || (ins->rex & REX_W))
   12911 		op &= 0xffffffff;
   12912 	      else
   12913 		op &= 0xffff;
   12914 	  }
   12915 	}
   12916       else
   12917 	{
   12918 	  if (!(ins->rex & REX_W))
   12919 	    {
   12920 	      if (sizeflag & DFLAG)
   12921 		op &= 0xffffffff;
   12922 	      else
   12923 		op &= 0xffff;
   12924 	    }
   12925 	}
   12926       break;
   12927     case v_mode:
   12928       /* The operand-size prefix is overridden by a REX prefix.  */
   12929       if (!(sizeflag & DFLAG) && !(ins->rex & REX_W))
   12930 	{
   12931 	  if (!get16 (ins, &op))
   12932 	    return false;
   12933 	}
   12934       else if (!get32s (ins, &op))
   12935 	return false;
   12936       break;
   12937     default:
   12938       oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
   12939       return true;
   12940     }
   12941 
   12942   oappend_immediate (ins, op);
   12943   return true;
   12944 }
   12945 
   12946 static bool
   12947 OP_J (instr_info *ins, int bytemode, int sizeflag)
   12948 {
   12949   bfd_vma disp;
   12950   bfd_vma mask = -1;
   12951   bfd_vma segment = 0;
   12952 
   12953   switch (bytemode)
   12954     {
   12955     case b_mode:
   12956       if (!get8s (ins, &disp))
   12957 	return false;
   12958       break;
   12959     case v_mode:
   12960     case dqw_mode:
   12961       if ((sizeflag & DFLAG)
   12962 	  || (ins->address_mode == mode_64bit
   12963 	      && ((ins->isa64 == intel64 && bytemode != dqw_mode)
   12964 		  || (ins->rex & REX_W))))
   12965 	{
   12966 	  if (!get32s (ins, &disp))
   12967 	    return false;
   12968 	}
   12969       else
   12970 	{
   12971 	  if (!get16s (ins, &disp))
   12972 	    return false;
   12973 	  /* In 16bit mode, address is wrapped around at 64k within
   12974 	     the same segment.  Otherwise, a data16 prefix on a jump
   12975 	     instruction means that the pc is masked to 16 bits after
   12976 	     the displacement is added!  */
   12977 	  mask = 0xffff;
   12978 	  if ((ins->prefixes & PREFIX_DATA) == 0)
   12979 	    segment = ((ins->start_pc + (ins->codep - ins->start_codep))
   12980 		       & ~((bfd_vma) 0xffff));
   12981 	}
   12982       if (ins->address_mode != mode_64bit
   12983 	  || (ins->isa64 != intel64 && !(ins->rex & REX_W)))
   12984 	ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
   12985       break;
   12986     default:
   12987       oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
   12988       return true;
   12989     }
   12990   disp = ((ins->start_pc + (ins->codep - ins->start_codep) + disp) & mask)
   12991 	 | segment;
   12992   set_op (ins, disp, false);
   12993   print_operand_value (ins, disp, dis_style_text);
   12994   return true;
   12995 }
   12996 
   12997 static bool
   12998 OP_SEG (instr_info *ins, int bytemode, int sizeflag)
   12999 {
   13000   if (bytemode == w_mode)
   13001     {
   13002       oappend_register (ins, att_names_seg[ins->modrm.reg]);
   13003       return true;
   13004     }
   13005   return OP_E (ins, ins->modrm.mod == 3 ? bytemode : w_mode, sizeflag);
   13006 }
   13007 
   13008 static bool
   13009 OP_DIR (instr_info *ins, int dummy ATTRIBUTE_UNUSED, int sizeflag)
   13010 {
   13011   bfd_vma seg, offset;
   13012   int res;
   13013   char scratch[24];
   13014 
   13015   if (sizeflag & DFLAG)
   13016     {
   13017       if (!get32 (ins, &offset))
   13018 	return false;;
   13019     }
   13020   else if (!get16 (ins, &offset))
   13021     return false;
   13022   if (!get16 (ins, &seg))
   13023     return false;;
   13024   ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
   13025 
   13026   res = snprintf (scratch, ARRAY_SIZE (scratch),
   13027 		  ins->intel_syntax ? "0x%x:0x%x" : "$0x%x,$0x%x",
   13028 		  (unsigned) seg, (unsigned) offset);
   13029   if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
   13030     abort ();
   13031   oappend (ins, scratch);
   13032   return true;
   13033 }
   13034 
   13035 static bool
   13036 OP_OFF (instr_info *ins, int bytemode, int sizeflag)
   13037 {
   13038   bfd_vma off;
   13039 
   13040   if (ins->intel_syntax && (sizeflag & SUFFIX_ALWAYS))
   13041     intel_operand_size (ins, bytemode, sizeflag);
   13042   append_seg (ins);
   13043 
   13044   if ((sizeflag & AFLAG) || ins->address_mode == mode_64bit)
   13045     {
   13046       if (!get32 (ins, &off))
   13047 	return false;
   13048     }
   13049   else
   13050     {
   13051       if (!get16 (ins, &off))
   13052 	return false;
   13053     }
   13054 
   13055   if (ins->intel_syntax)
   13056     {
   13057       if (!ins->active_seg_prefix)
   13058 	{
   13059 	  oappend_register (ins, att_names_seg[ds_reg - es_reg]);
   13060 	  oappend (ins, ":");
   13061 	}
   13062     }
   13063   print_operand_value (ins, off, dis_style_address_offset);
   13064   return true;
   13065 }
   13066 
   13067 static bool
   13068 OP_OFF64 (instr_info *ins, int bytemode, int sizeflag)
   13069 {
   13070   uint64_t off;
   13071 
   13072   if (ins->address_mode != mode_64bit
   13073       || (ins->prefixes & PREFIX_ADDR))
   13074     return OP_OFF (ins, bytemode, sizeflag);
   13075 
   13076   if (ins->intel_syntax && (sizeflag & SUFFIX_ALWAYS))
   13077     intel_operand_size (ins, bytemode, sizeflag);
   13078   append_seg (ins);
   13079 
   13080   if (!get64 (ins, &off))
   13081     return false;
   13082 
   13083   if (ins->intel_syntax)
   13084     {
   13085       if (!ins->active_seg_prefix)
   13086 	{
   13087 	  oappend_register (ins, att_names_seg[ds_reg - es_reg]);
   13088 	  oappend (ins, ":");
   13089 	}
   13090     }
   13091   print_operand_value (ins, off, dis_style_address_offset);
   13092   return true;
   13093 }
   13094 
   13095 static void
   13096 ptr_reg (instr_info *ins, int code, int sizeflag)
   13097 {
   13098   const char *s;
   13099 
   13100   *ins->obufp++ = ins->open_char;
   13101   ins->used_prefixes |= (ins->prefixes & PREFIX_ADDR);
   13102   if (ins->address_mode == mode_64bit)
   13103     {
   13104       if (!(sizeflag & AFLAG))
   13105 	s = att_names32[code - eAX_reg];
   13106       else
   13107 	s = att_names64[code - eAX_reg];
   13108     }
   13109   else if (sizeflag & AFLAG)
   13110     s = att_names32[code - eAX_reg];
   13111   else
   13112     s = att_names16[code - eAX_reg];
   13113   oappend_register (ins, s);
   13114   oappend_char (ins, ins->close_char);
   13115 }
   13116 
   13117 static bool
   13118 OP_ESreg (instr_info *ins, int code, int sizeflag)
   13119 {
   13120   if (ins->intel_syntax)
   13121     {
   13122       switch (ins->codep[-1])
   13123 	{
   13124 	case 0x6d:	/* insw/insl */
   13125 	  intel_operand_size (ins, z_mode, sizeflag);
   13126 	  break;
   13127 	case 0xa5:	/* movsw/movsl/movsq */
   13128 	case 0xa7:	/* cmpsw/cmpsl/cmpsq */
   13129 	case 0xab:	/* stosw/stosl */
   13130 	case 0xaf:	/* scasw/scasl */
   13131 	  intel_operand_size (ins, v_mode, sizeflag);
   13132 	  break;
   13133 	default:
   13134 	  intel_operand_size (ins, b_mode, sizeflag);
   13135 	}
   13136     }
   13137   if (ins->address_mode != mode_64bit)
   13138     {
   13139       oappend_register (ins, att_names_seg[0]);
   13140       oappend_char (ins, ':');
   13141     }
   13142   ptr_reg (ins, code, sizeflag);
   13143   return true;
   13144 }
   13145 
   13146 static bool
   13147 OP_DSreg (instr_info *ins, int code, int sizeflag)
   13148 {
   13149   if (ins->intel_syntax)
   13150     {
   13151       switch (ins->codep[-1])
   13152 	{
   13153 	case 0x01:	/* rmpupdate/rmpread */
   13154 	  break;
   13155 	case 0x6f:	/* outsw/outsl */
   13156 	  intel_operand_size (ins, z_mode, sizeflag);
   13157 	  break;
   13158 	case 0xa5:	/* movsw/movsl/movsq */
   13159 	case 0xa7:	/* cmpsw/cmpsl/cmpsq */
   13160 	case 0xad:	/* lodsw/lodsl/lodsq */
   13161 	  intel_operand_size (ins, v_mode, sizeflag);
   13162 	  break;
   13163 	default:
   13164 	  intel_operand_size (ins, b_mode, sizeflag);
   13165 	}
   13166     }
   13167   /* Outside of 64-bit mode set ins->active_seg_prefix to PREFIX_DS if it
   13168      is unset, so that the default segment register DS is printed.  */
   13169   if (ins->address_mode != mode_64bit && !ins->active_seg_prefix)
   13170     ins->active_seg_prefix = PREFIX_DS;
   13171   append_seg (ins);
   13172   ptr_reg (ins, code, sizeflag);
   13173   return true;
   13174 }
   13175 
   13176 static bool
   13177 OP_C (instr_info *ins, int dummy ATTRIBUTE_UNUSED,
   13178       int sizeflag ATTRIBUTE_UNUSED)
   13179 {
   13180   int add, res;
   13181   char scratch[8];
   13182 
   13183   if (ins->rex & REX_R)
   13184     {
   13185       USED_REX (REX_R);
   13186       add = 8;
   13187     }
   13188   else if (ins->address_mode != mode_64bit && (ins->prefixes & PREFIX_LOCK))
   13189     {
   13190       ins->all_prefixes[ins->last_lock_prefix] = 0;
   13191       ins->used_prefixes |= PREFIX_LOCK;
   13192       add = 8;
   13193     }
   13194   else
   13195     add = 0;
   13196   res = snprintf (scratch, ARRAY_SIZE (scratch), "%%cr%d",
   13197 		  ins->modrm.reg + add);
   13198   if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
   13199     abort ();
   13200   oappend_register (ins, scratch);
   13201   return true;
   13202 }
   13203 
   13204 static bool
   13205 OP_D (instr_info *ins, int dummy ATTRIBUTE_UNUSED,
   13206       int sizeflag ATTRIBUTE_UNUSED)
   13207 {
   13208   int add, res;
   13209   char scratch[8];
   13210 
   13211   USED_REX (REX_R);
   13212   if (ins->rex & REX_R)
   13213     add = 8;
   13214   else
   13215     add = 0;
   13216   res = snprintf (scratch, ARRAY_SIZE (scratch),
   13217 		  ins->intel_syntax ? "dr%d" : "%%db%d",
   13218 		  ins->modrm.reg + add);
   13219   if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
   13220     abort ();
   13221   oappend (ins, scratch);
   13222   return true;
   13223 }
   13224 
   13225 static bool
   13226 OP_T (instr_info *ins, int dummy ATTRIBUTE_UNUSED,
   13227       int sizeflag ATTRIBUTE_UNUSED)
   13228 {
   13229   int res;
   13230   char scratch[8];
   13231 
   13232   res = snprintf (scratch, ARRAY_SIZE (scratch), "%%tr%d", ins->modrm.reg);
   13233   if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
   13234     abort ();
   13235   oappend_register (ins, scratch);
   13236   return true;
   13237 }
   13238 
   13239 static bool
   13240 OP_MMX (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
   13241 	int sizeflag ATTRIBUTE_UNUSED)
   13242 {
   13243   int reg = ins->modrm.reg;
   13244   const char (*names)[8];
   13245 
   13246   ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
   13247   if (ins->prefixes & PREFIX_DATA)
   13248     {
   13249       names = att_names_xmm;
   13250       USED_REX (REX_R);
   13251       if (ins->rex & REX_R)
   13252 	reg += 8;
   13253     }
   13254   else
   13255     names = att_names_mm;
   13256   oappend_register (ins, names[reg]);
   13257   return true;
   13258 }
   13259 
   13260 static void
   13261 print_vector_reg (instr_info *ins, unsigned int reg, int bytemode)
   13262 {
   13263   const char (*names)[8];
   13264 
   13265   if (bytemode == xmmq_mode
   13266       || bytemode == evex_half_bcst_xmmqh_mode
   13267       || bytemode == evex_half_bcst_xmmq_mode)
   13268     {
   13269       switch (ins->vex.length)
   13270 	{
   13271 	case 0:
   13272 	case 128:
   13273 	case 256:
   13274 	  names = att_names_xmm;
   13275 	  break;
   13276 	case 512:
   13277 	  names = att_names_ymm;
   13278 	  ins->evex_used |= EVEX_len_used;
   13279 	  break;
   13280 	default:
   13281 	  abort ();
   13282 	}
   13283     }
   13284   else if (bytemode == ymm_mode)
   13285     names = att_names_ymm;
   13286   else if (bytemode == tmm_mode)
   13287     {
   13288       if (reg >= 8)
   13289 	{
   13290 	  oappend (ins, "(bad)");
   13291 	  return;
   13292 	}
   13293       names = att_names_tmm;
   13294     }
   13295   else if (ins->need_vex
   13296 	   && bytemode != xmm_mode
   13297 	   && bytemode != scalar_mode
   13298 	   && bytemode != xmmdw_mode
   13299 	   && bytemode != xmmqd_mode
   13300 	   && bytemode != evex_half_bcst_xmmqdh_mode
   13301 	   && bytemode != w_swap_mode
   13302 	   && bytemode != b_mode
   13303 	   && bytemode != w_mode
   13304 	   && bytemode != d_mode
   13305 	   && bytemode != q_mode)
   13306     {
   13307       ins->evex_used |= EVEX_len_used;
   13308       switch (ins->vex.length)
   13309 	{
   13310 	case 128:
   13311 	  names = att_names_xmm;
   13312 	  break;
   13313 	case 256:
   13314 	  if (ins->vex.w
   13315 	      || bytemode != vex_vsib_q_w_dq_mode)
   13316 	    names = att_names_ymm;
   13317 	  else
   13318 	    names = att_names_xmm;
   13319 	  break;
   13320 	case 512:
   13321 	  if (ins->vex.w
   13322 	      || bytemode != vex_vsib_q_w_dq_mode)
   13323 	    names = att_names_zmm;
   13324 	  else
   13325 	    names = att_names_ymm;
   13326 	  break;
   13327 	default:
   13328 	  abort ();
   13329 	}
   13330     }
   13331   else
   13332     names = att_names_xmm;
   13333   oappend_register (ins, names[reg]);
   13334 }
   13335 
   13336 static bool
   13337 OP_XMM (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
   13338 {
   13339   unsigned int reg = ins->modrm.reg;
   13340 
   13341   USED_REX (REX_R);
   13342   if (ins->rex & REX_R)
   13343     reg += 8;
   13344   if (ins->vex.evex)
   13345     {
   13346       if (ins->rex2 & REX_R)
   13347 	reg += 16;
   13348     }
   13349 
   13350   if (bytemode == tmm_mode)
   13351     ins->modrm.reg = reg;
   13352   else if (bytemode == scalar_mode)
   13353     ins->vex.no_broadcast = true;
   13354 
   13355   print_vector_reg (ins, reg, bytemode);
   13356   return true;
   13357 }
   13358 
   13359 static bool
   13360 OP_EM (instr_info *ins, int bytemode, int sizeflag)
   13361 {
   13362   int reg;
   13363   const char (*names)[8];
   13364 
   13365   if (ins->modrm.mod != 3)
   13366     {
   13367       if (ins->intel_syntax
   13368 	  && (bytemode == v_mode || bytemode == v_swap_mode))
   13369 	{
   13370 	  bytemode = (ins->prefixes & PREFIX_DATA) ? x_mode : q_mode;
   13371 	  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
   13372 	}
   13373       return OP_E (ins, bytemode, sizeflag);
   13374     }
   13375 
   13376   if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
   13377     swap_operand (ins);
   13378 
   13379   /* Skip mod/rm byte.  */
   13380   MODRM_CHECK;
   13381   ins->codep++;
   13382   ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
   13383   reg = ins->modrm.rm;
   13384   if (ins->prefixes & PREFIX_DATA)
   13385     {
   13386       names = att_names_xmm;
   13387       USED_REX (REX_B);
   13388       if (ins->rex & REX_B)
   13389 	reg += 8;
   13390     }
   13391   else
   13392     names = att_names_mm;
   13393   oappend_register (ins, names[reg]);
   13394   return true;
   13395 }
   13396 
   13397 /* cvt* are the only instructions in sse2 which have
   13398    both SSE and MMX operands and also have 0x66 prefix
   13399    in their opcode. 0x66 was originally used to differentiate
   13400    between SSE and MMX instruction(operands). So we have to handle the
   13401    cvt* separately using OP_EMC and OP_MXC */
   13402 static bool
   13403 OP_EMC (instr_info *ins, int bytemode, int sizeflag)
   13404 {
   13405   if (ins->modrm.mod != 3)
   13406     {
   13407       if (ins->intel_syntax && bytemode == v_mode)
   13408 	{
   13409 	  bytemode = (ins->prefixes & PREFIX_DATA) ? x_mode : q_mode;
   13410 	  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
   13411 	}
   13412       return OP_E (ins, bytemode, sizeflag);
   13413     }
   13414 
   13415   /* Skip mod/rm byte.  */
   13416   MODRM_CHECK;
   13417   ins->codep++;
   13418   ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
   13419   oappend_register (ins, att_names_mm[ins->modrm.rm]);
   13420   return true;
   13421 }
   13422 
   13423 static bool
   13424 OP_MXC (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
   13425 	int sizeflag ATTRIBUTE_UNUSED)
   13426 {
   13427   ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
   13428   oappend_register (ins, att_names_mm[ins->modrm.reg]);
   13429   return true;
   13430 }
   13431 
   13432 static bool
   13433 OP_EX (instr_info *ins, int bytemode, int sizeflag)
   13434 {
   13435   int reg;
   13436 
   13437   /* Skip mod/rm byte.  */
   13438   MODRM_CHECK;
   13439   ins->codep++;
   13440 
   13441   if (bytemode == dq_mode)
   13442     bytemode = ins->vex.w ? q_mode : d_mode;
   13443 
   13444   if (ins->modrm.mod != 3)
   13445     return OP_E_memory (ins, bytemode, sizeflag);
   13446 
   13447   reg = ins->modrm.rm;
   13448   USED_REX (REX_B);
   13449   if (ins->rex & REX_B)
   13450     reg += 8;
   13451   if (ins->vex.evex)
   13452     {
   13453       USED_REX (REX_X);
   13454       if ((ins->rex & REX_X))
   13455 	reg += 16;
   13456       ins->rex2_used &= ~REX_B;
   13457     }
   13458   else if (ins->rex2 & REX_B)
   13459     reg += 16;
   13460 
   13461   if ((sizeflag & SUFFIX_ALWAYS)
   13462       && (bytemode == x_swap_mode
   13463 	  || bytemode == w_swap_mode
   13464 	  || bytemode == d_swap_mode
   13465 	  || bytemode == q_swap_mode))
   13466     swap_operand (ins);
   13467 
   13468   if (bytemode == tmm_mode)
   13469     ins->modrm.rm = reg;
   13470 
   13471   print_vector_reg (ins, reg, bytemode);
   13472   return true;
   13473 }
   13474 
   13475 static bool
   13476 OP_R (instr_info *ins, int bytemode, int sizeflag)
   13477 {
   13478   if (ins->modrm.mod != 3)
   13479     return BadOp (ins);
   13480 
   13481   switch (bytemode)
   13482     {
   13483     case d_mode:
   13484     case dq_mode:
   13485     case q_mode:
   13486     case mask_mode:
   13487       return OP_E (ins, bytemode, sizeflag);
   13488     case q_mm_mode:
   13489       return OP_EM (ins, x_mode, sizeflag);
   13490     case xmm_mode:
   13491       if (ins->vex.length <= 128)
   13492 	break;
   13493       return BadOp (ins);
   13494     }
   13495 
   13496   return OP_EX (ins, bytemode, sizeflag);
   13497 }
   13498 
   13499 static bool
   13500 OP_M (instr_info *ins, int bytemode, int sizeflag)
   13501 {
   13502   /* Skip mod/rm byte.  */
   13503   MODRM_CHECK;
   13504   ins->codep++;
   13505 
   13506   if (ins->modrm.mod == 3)
   13507     /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
   13508     return BadOp (ins);
   13509 
   13510   if (bytemode == x_mode)
   13511     ins->vex.no_broadcast = true;
   13512 
   13513   return OP_E_memory (ins, bytemode, sizeflag);
   13514 }
   13515 
   13516 static bool
   13517 OP_0f07 (instr_info *ins, int bytemode, int sizeflag)
   13518 {
   13519   if (ins->modrm.mod != 3 || ins->modrm.rm != 0)
   13520     return BadOp (ins);
   13521   return OP_E (ins, bytemode, sizeflag);
   13522 }
   13523 
   13524 /* montmul instruction need display repz and skip modrm */
   13525 
   13526 static bool
   13527 MONTMUL_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
   13528 {
   13529   if (ins->modrm.mod != 3 || ins->modrm.rm != 0)
   13530     return BadOp (ins);
   13531 
   13532   /* The 0xf3 prefix should be displayed as "repz" for montmul. */
   13533   if (ins->prefixes & PREFIX_REPZ)
   13534     ins->all_prefixes[ins->last_repz_prefix] = 0xf3;
   13535 
   13536   /* Skip mod/rm byte.  */
   13537   MODRM_CHECK;
   13538   ins->codep++;
   13539   return true;
   13540 }
   13541 
   13542 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
   13543    32bit mode and "xchg %rax,%rax" in 64bit mode.  */
   13544 
   13545 static bool
   13546 NOP_Fixup (instr_info *ins, int opnd, int sizeflag)
   13547 {
   13548   if ((ins->prefixes & PREFIX_DATA) == 0 && (ins->rex & REX_B) == 0)
   13549     {
   13550       ins->mnemonicendp = stpcpy (ins->obuf, "nop");
   13551       return true;
   13552     }
   13553   if (opnd == 0)
   13554     return OP_REG (ins, eAX_reg, sizeflag);
   13555   return OP_IMREG (ins, eAX_reg, sizeflag);
   13556 }
   13557 
   13558 static const char *const Suffix3DNow[] = {
   13559 /* 00 */	NULL,		NULL,		NULL,		NULL,
   13560 /* 04 */	NULL,		NULL,		NULL,		NULL,
   13561 /* 08 */	NULL,		NULL,		NULL,		NULL,
   13562 /* 0C */	"pi2fw",	"pi2fd",	NULL,		NULL,
   13563 /* 10 */	NULL,		NULL,		NULL,		NULL,
   13564 /* 14 */	NULL,		NULL,		NULL,		NULL,
   13565 /* 18 */	NULL,		NULL,		NULL,		NULL,
   13566 /* 1C */	"pf2iw",	"pf2id",	NULL,		NULL,
   13567 /* 20 */	NULL,		NULL,		NULL,		NULL,
   13568 /* 24 */	NULL,		NULL,		NULL,		NULL,
   13569 /* 28 */	NULL,		NULL,		NULL,		NULL,
   13570 /* 2C */	NULL,		NULL,		NULL,		NULL,
   13571 /* 30 */	NULL,		NULL,		NULL,		NULL,
   13572 /* 34 */	NULL,		NULL,		NULL,		NULL,
   13573 /* 38 */	NULL,		NULL,		NULL,		NULL,
   13574 /* 3C */	NULL,		NULL,		NULL,		NULL,
   13575 /* 40 */	NULL,		NULL,		NULL,		NULL,
   13576 /* 44 */	NULL,		NULL,		NULL,		NULL,
   13577 /* 48 */	NULL,		NULL,		NULL,		NULL,
   13578 /* 4C */	NULL,		NULL,		NULL,		NULL,
   13579 /* 50 */	NULL,		NULL,		NULL,		NULL,
   13580 /* 54 */	NULL,		NULL,		NULL,		NULL,
   13581 /* 58 */	NULL,		NULL,		NULL,		NULL,
   13582 /* 5C */	NULL,		NULL,		NULL,		NULL,
   13583 /* 60 */	NULL,		NULL,		NULL,		NULL,
   13584 /* 64 */	NULL,		NULL,		NULL,		NULL,
   13585 /* 68 */	NULL,		NULL,		NULL,		NULL,
   13586 /* 6C */	NULL,		NULL,		NULL,		NULL,
   13587 /* 70 */	NULL,		NULL,		NULL,		NULL,
   13588 /* 74 */	NULL,		NULL,		NULL,		NULL,
   13589 /* 78 */	NULL,		NULL,		NULL,		NULL,
   13590 /* 7C */	NULL,		NULL,		NULL,		NULL,
   13591 /* 80 */	NULL,		NULL,		NULL,		NULL,
   13592 /* 84 */	NULL,		NULL,		NULL,		NULL,
   13593 /* 88 */	NULL,		NULL,		"pfnacc",	NULL,
   13594 /* 8C */	NULL,		NULL,		"pfpnacc",	NULL,
   13595 /* 90 */	"pfcmpge",	NULL,		NULL,		NULL,
   13596 /* 94 */	"pfmin",	NULL,		"pfrcp",	"pfrsqrt",
   13597 /* 98 */	NULL,		NULL,		"pfsub",	NULL,
   13598 /* 9C */	NULL,		NULL,		"pfadd",	NULL,
   13599 /* A0 */	"pfcmpgt",	NULL,		NULL,		NULL,
   13600 /* A4 */	"pfmax",	NULL,		"pfrcpit1",	"pfrsqit1",
   13601 /* A8 */	NULL,		NULL,		"pfsubr",	NULL,
   13602 /* AC */	NULL,		NULL,		"pfacc",	NULL,
   13603 /* B0 */	"pfcmpeq",	NULL,		NULL,		NULL,
   13604 /* B4 */	"pfmul",	NULL,		"pfrcpit2",	"pmulhrw",
   13605 /* B8 */	NULL,		NULL,		NULL,		"pswapd",
   13606 /* BC */	NULL,		NULL,		NULL,		"pavgusb",
   13607 /* C0 */	NULL,		NULL,		NULL,		NULL,
   13608 /* C4 */	NULL,		NULL,		NULL,		NULL,
   13609 /* C8 */	NULL,		NULL,		NULL,		NULL,
   13610 /* CC */	NULL,		NULL,		NULL,		NULL,
   13611 /* D0 */	NULL,		NULL,		NULL,		NULL,
   13612 /* D4 */	NULL,		NULL,		NULL,		NULL,
   13613 /* D8 */	NULL,		NULL,		NULL,		NULL,
   13614 /* DC */	NULL,		NULL,		NULL,		NULL,
   13615 /* E0 */	NULL,		NULL,		NULL,		NULL,
   13616 /* E4 */	NULL,		NULL,		NULL,		NULL,
   13617 /* E8 */	NULL,		NULL,		NULL,		NULL,
   13618 /* EC */	NULL,		NULL,		NULL,		NULL,
   13619 /* F0 */	NULL,		NULL,		NULL,		NULL,
   13620 /* F4 */	NULL,		NULL,		NULL,		NULL,
   13621 /* F8 */	NULL,		NULL,		NULL,		NULL,
   13622 /* FC */	NULL,		NULL,		NULL,		NULL,
   13623 };
   13624 
   13625 static bool
   13626 OP_3DNowSuffix (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
   13627 		int sizeflag ATTRIBUTE_UNUSED)
   13628 {
   13629   const char *mnemonic;
   13630 
   13631   if (!fetch_code (ins->info, ins->codep + 1))
   13632     return false;
   13633   /* AMD 3DNow! instructions are specified by an opcode suffix in the
   13634      place where an 8-bit immediate would normally go.  ie. the last
   13635      byte of the instruction.  */
   13636   ins->obufp = ins->mnemonicendp;
   13637   mnemonic = Suffix3DNow[*ins->codep++];
   13638   if (mnemonic)
   13639     ins->obufp = stpcpy (ins->obufp, mnemonic);
   13640   else
   13641     {
   13642       /* Since a variable sized ins->modrm/ins->sib chunk is between the start
   13643 	 of the opcode (0x0f0f) and the opcode suffix, we need to do
   13644 	 all the ins->modrm processing first, and don't know until now that
   13645 	 we have a bad opcode.  This necessitates some cleaning up.  */
   13646       ins->op_out[0][0] = '\0';
   13647       ins->op_out[1][0] = '\0';
   13648       BadOp (ins);
   13649     }
   13650   ins->mnemonicendp = ins->obufp;
   13651   return true;
   13652 }
   13653 
   13654 static const struct op simd_cmp_op[] =
   13655 {
   13656   { STRING_COMMA_LEN ("eq") },
   13657   { STRING_COMMA_LEN ("lt") },
   13658   { STRING_COMMA_LEN ("le") },
   13659   { STRING_COMMA_LEN ("unord") },
   13660   { STRING_COMMA_LEN ("neq") },
   13661   { STRING_COMMA_LEN ("nlt") },
   13662   { STRING_COMMA_LEN ("nle") },
   13663   { STRING_COMMA_LEN ("ord") }
   13664 };
   13665 
   13666 static const struct op vex_cmp_op[] =
   13667 {
   13668   { STRING_COMMA_LEN ("eq_uq") },
   13669   { STRING_COMMA_LEN ("nge") },
   13670   { STRING_COMMA_LEN ("ngt") },
   13671   { STRING_COMMA_LEN ("false") },
   13672   { STRING_COMMA_LEN ("neq_oq") },
   13673   { STRING_COMMA_LEN ("ge") },
   13674   { STRING_COMMA_LEN ("gt") },
   13675   { STRING_COMMA_LEN ("true") },
   13676   { STRING_COMMA_LEN ("eq_os") },
   13677   { STRING_COMMA_LEN ("lt_oq") },
   13678   { STRING_COMMA_LEN ("le_oq") },
   13679   { STRING_COMMA_LEN ("unord_s") },
   13680   { STRING_COMMA_LEN ("neq_us") },
   13681   { STRING_COMMA_LEN ("nlt_uq") },
   13682   { STRING_COMMA_LEN ("nle_uq") },
   13683   { STRING_COMMA_LEN ("ord_s") },
   13684   { STRING_COMMA_LEN ("eq_us") },
   13685   { STRING_COMMA_LEN ("nge_uq") },
   13686   { STRING_COMMA_LEN ("ngt_uq") },
   13687   { STRING_COMMA_LEN ("false_os") },
   13688   { STRING_COMMA_LEN ("neq_os") },
   13689   { STRING_COMMA_LEN ("ge_oq") },
   13690   { STRING_COMMA_LEN ("gt_oq") },
   13691   { STRING_COMMA_LEN ("true_us") },
   13692 };
   13693 
   13694 static bool
   13695 CMP_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
   13696 	   int sizeflag ATTRIBUTE_UNUSED)
   13697 {
   13698   unsigned int cmp_type;
   13699 
   13700   if (!fetch_code (ins->info, ins->codep + 1))
   13701     return false;
   13702   cmp_type = *ins->codep++;
   13703   if (cmp_type < ARRAY_SIZE (simd_cmp_op))
   13704     {
   13705       char suffix[3];
   13706       char *p = ins->mnemonicendp - 2;
   13707       suffix[0] = p[0];
   13708       suffix[1] = p[1];
   13709       suffix[2] = '\0';
   13710       sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
   13711       ins->mnemonicendp += simd_cmp_op[cmp_type].len;
   13712     }
   13713   else if (ins->need_vex
   13714 	   && cmp_type < ARRAY_SIZE (simd_cmp_op) + ARRAY_SIZE (vex_cmp_op))
   13715     {
   13716       char suffix[3];
   13717       char *p = ins->mnemonicendp - 2;
   13718       suffix[0] = p[0];
   13719       suffix[1] = p[1];
   13720       suffix[2] = '\0';
   13721       cmp_type -= ARRAY_SIZE (simd_cmp_op);
   13722       sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
   13723       ins->mnemonicendp += vex_cmp_op[cmp_type].len;
   13724     }
   13725   else
   13726     {
   13727       /* We have a reserved extension byte.  Output it directly.  */
   13728       oappend_immediate (ins, cmp_type);
   13729     }
   13730   return true;
   13731 }
   13732 
   13733 static bool
   13734 OP_Mwait (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
   13735 {
   13736   /* mwait %eax,%ecx / mwaitx %eax,%ecx,%ebx  */
   13737   if (!ins->intel_syntax)
   13738     {
   13739       strcpy (ins->op_out[0], att_names32[0] + ins->intel_syntax);
   13740       strcpy (ins->op_out[1], att_names32[1] + ins->intel_syntax);
   13741       if (bytemode == eBX_reg)
   13742 	strcpy (ins->op_out[2], att_names32[3] + ins->intel_syntax);
   13743       ins->two_source_ops = true;
   13744     }
   13745   /* Skip mod/rm byte.  */
   13746   MODRM_CHECK;
   13747   ins->codep++;
   13748   return true;
   13749 }
   13750 
   13751 static bool
   13752 OP_Monitor (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
   13753 	    int sizeflag ATTRIBUTE_UNUSED)
   13754 {
   13755   /* monitor %{e,r,}ax,%ecx,%edx"  */
   13756   if (!ins->intel_syntax)
   13757     {
   13758       const char (*names)[8] = (ins->address_mode == mode_64bit
   13759 				? att_names64 : att_names32);
   13760 
   13761       if (ins->prefixes & PREFIX_ADDR)
   13762 	{
   13763 	  /* Remove "addr16/addr32".  */
   13764 	  ins->all_prefixes[ins->last_addr_prefix] = 0;
   13765 	  names = (ins->address_mode != mode_32bit
   13766 		   ? att_names32 : att_names16);
   13767 	  ins->used_prefixes |= PREFIX_ADDR;
   13768 	}
   13769       else if (ins->address_mode == mode_16bit)
   13770 	names = att_names16;
   13771       strcpy (ins->op_out[0], names[0] + ins->intel_syntax);
   13772       strcpy (ins->op_out[1], att_names32[1] + ins->intel_syntax);
   13773       strcpy (ins->op_out[2], att_names32[2] + ins->intel_syntax);
   13774       ins->two_source_ops = true;
   13775     }
   13776   /* Skip mod/rm byte.  */
   13777   MODRM_CHECK;
   13778   ins->codep++;
   13779   return true;
   13780 }
   13781 
   13782 static bool
   13783 REP_Fixup (instr_info *ins, int bytemode, int sizeflag)
   13784 {
   13785   /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
   13786      lods and stos.  */
   13787   if (ins->prefixes & PREFIX_REPZ)
   13788     ins->all_prefixes[ins->last_repz_prefix] = REP_PREFIX;
   13789 
   13790   switch (bytemode)
   13791     {
   13792     case al_reg:
   13793     case eAX_reg:
   13794     case indir_dx_reg:
   13795       return OP_IMREG (ins, bytemode, sizeflag);
   13796     case eDI_reg:
   13797       return OP_ESreg (ins, bytemode, sizeflag);
   13798     case eSI_reg:
   13799       return OP_DSreg (ins, bytemode, sizeflag);
   13800     default:
   13801       abort ();
   13802       break;
   13803     }
   13804   return true;
   13805 }
   13806 
   13807 static bool
   13808 SEP_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
   13809 	   int sizeflag ATTRIBUTE_UNUSED)
   13810 {
   13811   if (ins->isa64 != amd64)
   13812     return true;
   13813 
   13814   ins->obufp = ins->obuf;
   13815   BadOp (ins);
   13816   ins->mnemonicendp = ins->obufp;
   13817   ++ins->codep;
   13818   return true;
   13819 }
   13820 
   13821 /* For BND-prefixed instructions 0xF2 prefix should be displayed as
   13822    "bnd".  */
   13823 
   13824 static bool
   13825 BND_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
   13826 	   int sizeflag ATTRIBUTE_UNUSED)
   13827 {
   13828   if (ins->prefixes & PREFIX_REPNZ)
   13829     ins->all_prefixes[ins->last_repnz_prefix] = BND_PREFIX;
   13830   return true;
   13831 }
   13832 
   13833 /* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as
   13834    "notrack".  */
   13835 
   13836 static bool
   13837 NOTRACK_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
   13838 	       int sizeflag ATTRIBUTE_UNUSED)
   13839 {
   13840   /* Since active_seg_prefix is not set in 64-bit mode, check whether
   13841      we've seen a PREFIX_DS.  */
   13842   if ((ins->prefixes & PREFIX_DS) != 0
   13843       && (ins->address_mode != mode_64bit || ins->last_data_prefix < 0))
   13844     {
   13845       /* NOTRACK prefix is only valid on indirect branch instructions.
   13846 	 NB: DATA prefix is unsupported for Intel64.  */
   13847       ins->active_seg_prefix = 0;
   13848       ins->all_prefixes[ins->last_seg_prefix] = NOTRACK_PREFIX;
   13849     }
   13850   return true;
   13851 }
   13852 
   13853 /* Similar to OP_E.  But the 0xf2/0xf3 ins->prefixes should be displayed as
   13854    "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
   13855  */
   13856 
   13857 static bool
   13858 HLE_Fixup1 (instr_info *ins, int bytemode, int sizeflag)
   13859 {
   13860   if (ins->modrm.mod != 3
   13861       && (ins->prefixes & PREFIX_LOCK) != 0)
   13862     {
   13863       if (ins->prefixes & PREFIX_REPZ)
   13864 	ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX;
   13865       if (ins->prefixes & PREFIX_REPNZ)
   13866 	ins->all_prefixes[ins->last_repnz_prefix] = XACQUIRE_PREFIX;
   13867     }
   13868 
   13869   return OP_E (ins, bytemode, sizeflag);
   13870 }
   13871 
   13872 /* Similar to OP_E.  But the 0xf2/0xf3 ins->prefixes should be displayed as
   13873    "xacquire"/"xrelease" for memory operand.  No check for LOCK prefix.
   13874  */
   13875 
   13876 static bool
   13877 HLE_Fixup2 (instr_info *ins, int bytemode, int sizeflag)
   13878 {
   13879   if (ins->modrm.mod != 3)
   13880     {
   13881       if (ins->prefixes & PREFIX_REPZ)
   13882 	ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX;
   13883       if (ins->prefixes & PREFIX_REPNZ)
   13884 	ins->all_prefixes[ins->last_repnz_prefix] = XACQUIRE_PREFIX;
   13885     }
   13886 
   13887   return OP_E (ins, bytemode, sizeflag);
   13888 }
   13889 
   13890 /* Similar to OP_E.  But the 0xf3 prefixes should be displayed as
   13891    "xrelease" for memory operand.  No check for LOCK prefix.   */
   13892 
   13893 static bool
   13894 HLE_Fixup3 (instr_info *ins, int bytemode, int sizeflag)
   13895 {
   13896   if (ins->modrm.mod != 3
   13897       && ins->last_repz_prefix > ins->last_repnz_prefix
   13898       && (ins->prefixes & PREFIX_REPZ) != 0)
   13899     ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX;
   13900 
   13901   return OP_E (ins, bytemode, sizeflag);
   13902 }
   13903 
   13904 static bool
   13905 CMPXCHG8B_Fixup (instr_info *ins, int bytemode, int sizeflag)
   13906 {
   13907   USED_REX (REX_W);
   13908   if (ins->rex & REX_W)
   13909     {
   13910       /* Change cmpxchg8b to cmpxchg16b.  */
   13911       char *p = ins->mnemonicendp - 2;
   13912       ins->mnemonicendp = stpcpy (p, "16b");
   13913       bytemode = o_mode;
   13914     }
   13915   else if ((ins->prefixes & PREFIX_LOCK) != 0)
   13916     {
   13917       if (ins->prefixes & PREFIX_REPZ)
   13918 	ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX;
   13919       if (ins->prefixes & PREFIX_REPNZ)
   13920 	ins->all_prefixes[ins->last_repnz_prefix] = XACQUIRE_PREFIX;
   13921     }
   13922 
   13923   return OP_M (ins, bytemode, sizeflag);
   13924 }
   13925 
   13926 static bool
   13927 XMM_Fixup (instr_info *ins, int reg, int sizeflag ATTRIBUTE_UNUSED)
   13928 {
   13929   const char (*names)[8] = att_names_xmm;
   13930 
   13931   if (ins->need_vex)
   13932     {
   13933       switch (ins->vex.length)
   13934 	{
   13935 	case 128:
   13936 	  break;
   13937 	case 256:
   13938 	  names = att_names_ymm;
   13939 	  break;
   13940 	default:
   13941 	  abort ();
   13942 	}
   13943     }
   13944   oappend_register (ins, names[reg]);
   13945   return true;
   13946 }
   13947 
   13948 static bool
   13949 FXSAVE_Fixup (instr_info *ins, int bytemode, int sizeflag)
   13950 {
   13951   /* Add proper suffix to "fxsave" and "fxrstor".  */
   13952   USED_REX (REX_W);
   13953   if (ins->rex & REX_W)
   13954     {
   13955       char *p = ins->mnemonicendp;
   13956       *p++ = '6';
   13957       *p++ = '4';
   13958       *p = '\0';
   13959       ins->mnemonicendp = p;
   13960     }
   13961   return OP_M (ins, bytemode, sizeflag);
   13962 }
   13963 
   13964 /* Display the destination register operand for instructions with
   13965    VEX. */
   13966 
   13967 static bool
   13968 OP_VEX (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
   13969 {
   13970   int reg, modrm_reg, sib_index = -1;
   13971   const char (*names)[8];
   13972 
   13973   if (!ins->need_vex)
   13974     return true;
   13975 
   13976   if (ins->evex_type == evex_from_legacy)
   13977     {
   13978       ins->evex_used |= EVEX_b_used;
   13979       if (!ins->vex.nd)
   13980 	return true;
   13981     }
   13982 
   13983   reg = ins->vex.register_specifier;
   13984   ins->vex.register_specifier = 0;
   13985   if (ins->address_mode != mode_64bit)
   13986     {
   13987       if (ins->vex.evex && !ins->vex.v)
   13988 	{
   13989 	  oappend (ins, "(bad)");
   13990 	  return true;
   13991 	}
   13992 
   13993       reg &= 7;
   13994     }
   13995   else if (ins->vex.evex && !ins->vex.v)
   13996     reg += 16;
   13997 
   13998   switch (bytemode)
   13999     {
   14000     case scalar_mode:
   14001       oappend_register (ins, att_names_xmm[reg]);
   14002       return true;
   14003 
   14004     case vex_vsib_d_w_dq_mode:
   14005     case vex_vsib_q_w_dq_mode:
   14006       /* This must be the 3rd operand.  */
   14007       if (ins->obufp != ins->op_out[2])
   14008 	abort ();
   14009       if (ins->vex.length == 128
   14010 	  || (bytemode != vex_vsib_d_w_dq_mode
   14011 	      && !ins->vex.w))
   14012 	oappend_register (ins, att_names_xmm[reg]);
   14013       else
   14014 	oappend_register (ins, att_names_ymm[reg]);
   14015 
   14016       /* All 3 XMM/YMM registers must be distinct.  */
   14017       modrm_reg = ins->modrm.reg;
   14018       if (ins->rex & REX_R)
   14019 	modrm_reg += 8;
   14020 
   14021       if (ins->has_sib && ins->modrm.rm == 4)
   14022 	{
   14023 	  sib_index = ins->sib.index;
   14024 	  if (ins->rex & REX_X)
   14025 	    sib_index += 8;
   14026 	}
   14027 
   14028       if (reg == modrm_reg || reg == sib_index)
   14029 	strcpy (ins->obufp, "/(bad)");
   14030       if (modrm_reg == sib_index || modrm_reg == reg)
   14031 	strcat (ins->op_out[0], "/(bad)");
   14032       if (sib_index == modrm_reg || sib_index == reg)
   14033 	strcat (ins->op_out[1], "/(bad)");
   14034 
   14035       return true;
   14036 
   14037     case tmm_mode:
   14038       /* All 3 TMM registers must be distinct.  */
   14039       if (reg >= 8)
   14040 	oappend (ins, "(bad)");
   14041       else
   14042 	{
   14043 	  /* This must be the 3rd operand.  */
   14044 	  if (ins->obufp != ins->op_out[2])
   14045 	    abort ();
   14046 	  oappend_register (ins, att_names_tmm[reg]);
   14047 	  if (reg == ins->modrm.reg || reg == ins->modrm.rm)
   14048 	    strcpy (ins->obufp, "/(bad)");
   14049 	}
   14050 
   14051       if (ins->modrm.reg == ins->modrm.rm || ins->modrm.reg == reg
   14052 	  || ins->modrm.rm == reg)
   14053 	{
   14054 	  if (ins->modrm.reg <= 8
   14055 	      && (ins->modrm.reg == ins->modrm.rm || ins->modrm.reg == reg))
   14056 	    strcat (ins->op_out[0], "/(bad)");
   14057 	  if (ins->modrm.rm <= 8
   14058 	      && (ins->modrm.rm == ins->modrm.reg || ins->modrm.rm == reg))
   14059 	    strcat (ins->op_out[1], "/(bad)");
   14060 	}
   14061 
   14062       return true;
   14063 
   14064     case v_mode:
   14065     case dq_mode:
   14066       if (ins->rex & REX_W)
   14067 	oappend_register (ins, att_names64[reg]);
   14068       else if (bytemode == v_mode
   14069 	       && !(sizeflag & DFLAG))
   14070 	oappend_register (ins, att_names16[reg]);
   14071       else
   14072 	oappend_register (ins, att_names32[reg]);
   14073       return true;
   14074 
   14075     case b_mode:
   14076       oappend_register (ins, att_names8rex[reg]);
   14077       return true;
   14078 
   14079     case q_mode:
   14080       oappend_register (ins, att_names64[reg]);
   14081       return true;
   14082     }
   14083 
   14084   switch (ins->vex.length)
   14085     {
   14086     case 128:
   14087       switch (bytemode)
   14088 	{
   14089 	case x_mode:
   14090 	  names = att_names_xmm;
   14091 	  ins->evex_used |= EVEX_len_used;
   14092 	  break;
   14093 	case mask_bd_mode:
   14094 	case mask_mode:
   14095 	  if (reg > 0x7)
   14096 	    {
   14097 	      oappend (ins, "(bad)");
   14098 	      return true;
   14099 	    }
   14100 	  names = att_names_mask;
   14101 	  break;
   14102 	default:
   14103 	  abort ();
   14104 	  return true;
   14105 	}
   14106       break;
   14107     case 256:
   14108       switch (bytemode)
   14109 	{
   14110 	case x_mode:
   14111 	  names = att_names_ymm;
   14112 	  ins->evex_used |= EVEX_len_used;
   14113 	  break;
   14114 	case mask_bd_mode:
   14115 	case mask_mode:
   14116 	  if (reg <= 0x7)
   14117 	    {
   14118 	      names = att_names_mask;
   14119 	      break;
   14120 	    }
   14121 	  /* Fall through.  */
   14122 	default:
   14123 	  /* See PR binutils/20893 for a reproducer.  */
   14124 	  oappend (ins, "(bad)");
   14125 	  return true;
   14126 	}
   14127       break;
   14128     case 512:
   14129       names = att_names_zmm;
   14130       ins->evex_used |= EVEX_len_used;
   14131       break;
   14132     default:
   14133       abort ();
   14134       break;
   14135     }
   14136   oappend_register (ins, names[reg]);
   14137   return true;
   14138 }
   14139 
   14140 static bool
   14141 OP_VexR (instr_info *ins, int bytemode, int sizeflag)
   14142 {
   14143   if (ins->modrm.mod == 3)
   14144     return OP_VEX (ins, bytemode, sizeflag);
   14145   return true;
   14146 }
   14147 
   14148 static bool
   14149 OP_VexW (instr_info *ins, int bytemode, int sizeflag)
   14150 {
   14151   OP_VEX (ins, bytemode, sizeflag);
   14152 
   14153   if (ins->vex.w)
   14154     {
   14155       /* Swap 2nd and 3rd operands.  */
   14156       char *tmp = ins->op_out[2];
   14157 
   14158       ins->op_out[2] = ins->op_out[1];
   14159       ins->op_out[1] = tmp;
   14160     }
   14161   return true;
   14162 }
   14163 
   14164 static bool
   14165 OP_REG_VexI4 (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
   14166 {
   14167   int reg;
   14168   const char (*names)[8] = att_names_xmm;
   14169 
   14170   if (!fetch_code (ins->info, ins->codep + 1))
   14171     return false;
   14172   reg = *ins->codep++;
   14173 
   14174   if (bytemode != x_mode && bytemode != scalar_mode)
   14175     abort ();
   14176 
   14177   reg >>= 4;
   14178   if (ins->address_mode != mode_64bit)
   14179     reg &= 7;
   14180 
   14181   if (bytemode == x_mode && ins->vex.length == 256)
   14182     names = att_names_ymm;
   14183 
   14184   oappend_register (ins, names[reg]);
   14185 
   14186   if (ins->vex.w)
   14187     {
   14188       /* Swap 3rd and 4th operands.  */
   14189       char *tmp = ins->op_out[3];
   14190 
   14191       ins->op_out[3] = ins->op_out[2];
   14192       ins->op_out[2] = tmp;
   14193     }
   14194   return true;
   14195 }
   14196 
   14197 static bool
   14198 OP_VexI4 (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
   14199 	  int sizeflag ATTRIBUTE_UNUSED)
   14200 {
   14201   oappend_immediate (ins, ins->codep[-1] & 0xf);
   14202   return true;
   14203 }
   14204 
   14205 static bool
   14206 VPCMP_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
   14207 	     int sizeflag ATTRIBUTE_UNUSED)
   14208 {
   14209   unsigned int cmp_type;
   14210 
   14211   if (!ins->vex.evex)
   14212     abort ();
   14213 
   14214   if (!fetch_code (ins->info, ins->codep + 1))
   14215     return false;
   14216   cmp_type = *ins->codep++;
   14217   /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
   14218      If it's the case, print suffix, otherwise - print the immediate.  */
   14219   if (cmp_type < ARRAY_SIZE (simd_cmp_op)
   14220       && cmp_type != 3
   14221       && cmp_type != 7)
   14222     {
   14223       char suffix[3];
   14224       char *p = ins->mnemonicendp - 2;
   14225 
   14226       /* vpcmp* can have both one- and two-lettered suffix.  */
   14227       if (p[0] == 'p')
   14228 	{
   14229 	  p++;
   14230 	  suffix[0] = p[0];
   14231 	  suffix[1] = '\0';
   14232 	}
   14233       else
   14234 	{
   14235 	  suffix[0] = p[0];
   14236 	  suffix[1] = p[1];
   14237 	  suffix[2] = '\0';
   14238 	}
   14239 
   14240       sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
   14241       ins->mnemonicendp += simd_cmp_op[cmp_type].len;
   14242     }
   14243   else
   14244     {
   14245       /* We have a reserved extension byte.  Output it directly.  */
   14246       oappend_immediate (ins, cmp_type);
   14247     }
   14248   return true;
   14249 }
   14250 
   14251 static const struct op xop_cmp_op[] =
   14252 {
   14253   { STRING_COMMA_LEN ("lt") },
   14254   { STRING_COMMA_LEN ("le") },
   14255   { STRING_COMMA_LEN ("gt") },
   14256   { STRING_COMMA_LEN ("ge") },
   14257   { STRING_COMMA_LEN ("eq") },
   14258   { STRING_COMMA_LEN ("neq") },
   14259   { STRING_COMMA_LEN ("false") },
   14260   { STRING_COMMA_LEN ("true") }
   14261 };
   14262 
   14263 static bool
   14264 VPCOM_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
   14265 	     int sizeflag ATTRIBUTE_UNUSED)
   14266 {
   14267   unsigned int cmp_type;
   14268 
   14269   if (!fetch_code (ins->info, ins->codep + 1))
   14270     return false;
   14271   cmp_type = *ins->codep++;
   14272   if (cmp_type < ARRAY_SIZE (xop_cmp_op))
   14273     {
   14274       char suffix[3];
   14275       char *p = ins->mnemonicendp - 2;
   14276 
   14277       /* vpcom* can have both one- and two-lettered suffix.  */
   14278       if (p[0] == 'm')
   14279 	{
   14280 	  p++;
   14281 	  suffix[0] = p[0];
   14282 	  suffix[1] = '\0';
   14283 	}
   14284       else
   14285 	{
   14286 	  suffix[0] = p[0];
   14287 	  suffix[1] = p[1];
   14288 	  suffix[2] = '\0';
   14289 	}
   14290 
   14291       sprintf (p, "%s%s", xop_cmp_op[cmp_type].name, suffix);
   14292       ins->mnemonicendp += xop_cmp_op[cmp_type].len;
   14293     }
   14294   else
   14295     {
   14296       /* We have a reserved extension byte.  Output it directly.  */
   14297       oappend_immediate (ins, cmp_type);
   14298     }
   14299   return true;
   14300 }
   14301 
   14302 static const struct op pclmul_op[] =
   14303 {
   14304   { STRING_COMMA_LEN ("lql") },
   14305   { STRING_COMMA_LEN ("hql") },
   14306   { STRING_COMMA_LEN ("lqh") },
   14307   { STRING_COMMA_LEN ("hqh") }
   14308 };
   14309 
   14310 static bool
   14311 PCLMUL_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
   14312 	      int sizeflag ATTRIBUTE_UNUSED)
   14313 {
   14314   unsigned int pclmul_type;
   14315 
   14316   if (!fetch_code (ins->info, ins->codep + 1))
   14317     return false;
   14318   pclmul_type = *ins->codep++;
   14319   switch (pclmul_type)
   14320     {
   14321     case 0x10:
   14322       pclmul_type = 2;
   14323       break;
   14324     case 0x11:
   14325       pclmul_type = 3;
   14326       break;
   14327     default:
   14328       break;
   14329     }
   14330   if (pclmul_type < ARRAY_SIZE (pclmul_op))
   14331     {
   14332       char suffix[4];
   14333       char *p = ins->mnemonicendp - 3;
   14334       suffix[0] = p[0];
   14335       suffix[1] = p[1];
   14336       suffix[2] = p[2];
   14337       suffix[3] = '\0';
   14338       sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
   14339       ins->mnemonicendp += pclmul_op[pclmul_type].len;
   14340     }
   14341   else
   14342     {
   14343       /* We have a reserved extension byte.  Output it directly.  */
   14344       oappend_immediate (ins, pclmul_type);
   14345     }
   14346   return true;
   14347 }
   14348 
   14349 static bool
   14350 MOVSXD_Fixup (instr_info *ins, int bytemode, int sizeflag)
   14351 {
   14352   /* Add proper suffix to "movsxd".  */
   14353   char *p = ins->mnemonicendp;
   14354 
   14355   switch (bytemode)
   14356     {
   14357     case movsxd_mode:
   14358       if (!ins->intel_syntax)
   14359 	{
   14360 	  USED_REX (REX_W);
   14361 	  if (ins->rex & REX_W)
   14362 	    {
   14363 	      *p++ = 'l';
   14364 	      *p++ = 'q';
   14365 	      break;
   14366 	    }
   14367 	}
   14368 
   14369       *p++ = 'x';
   14370       *p++ = 'd';
   14371       break;
   14372     default:
   14373       oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
   14374       break;
   14375     }
   14376 
   14377   ins->mnemonicendp = p;
   14378   *p = '\0';
   14379   return OP_E (ins, bytemode, sizeflag);
   14380 }
   14381 
   14382 static bool
   14383 DistinctDest_Fixup (instr_info *ins, int bytemode, int sizeflag)
   14384 {
   14385   unsigned int reg = ins->vex.register_specifier;
   14386   unsigned int modrm_reg = ins->modrm.reg;
   14387   unsigned int modrm_rm = ins->modrm.rm;
   14388 
   14389   /* Calc destination register number.  */
   14390   if (ins->rex & REX_R)
   14391     modrm_reg += 8;
   14392   if (ins->rex2 & REX_R)
   14393     modrm_reg += 16;
   14394 
   14395   /* Calc src1 register number.  */
   14396   if (ins->address_mode != mode_64bit)
   14397     reg &= 7;
   14398   else if (ins->vex.evex && !ins->vex.v)
   14399     reg += 16;
   14400 
   14401   /* Calc src2 register number.  */
   14402   if (ins->modrm.mod == 3)
   14403     {
   14404       if (ins->rex & REX_B)
   14405         modrm_rm += 8;
   14406       if (ins->rex & REX_X)
   14407         modrm_rm += 16;
   14408     }
   14409 
   14410   /* Destination and source registers must be distinct, output bad if
   14411      dest == src1 or dest == src2.  */
   14412   if (modrm_reg == reg
   14413       || (ins->modrm.mod == 3
   14414 	  && modrm_reg == modrm_rm))
   14415     {
   14416       oappend (ins, "(bad)");
   14417       return true;
   14418     }
   14419   return OP_XMM (ins, bytemode, sizeflag);
   14420 }
   14421 
   14422 static bool
   14423 OP_Rounding (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
   14424 {
   14425   if (ins->modrm.mod != 3 || !ins->vex.b)
   14426     return true;
   14427 
   14428   ins->evex_used |= EVEX_b_used;
   14429   switch (bytemode)
   14430     {
   14431     case evex_rounding_64_mode:
   14432       if (ins->address_mode != mode_64bit || !ins->vex.w)
   14433         return true;
   14434       /* Fall through.  */
   14435     case evex_rounding_mode:
   14436       oappend (ins, names_rounding[ins->vex.ll]);
   14437       break;
   14438     case evex_sae_mode:
   14439       oappend (ins, "{");
   14440       break;
   14441     default:
   14442       abort ();
   14443     }
   14444   oappend (ins, "sae}");
   14445   return true;
   14446 }
   14447 
   14448 static bool
   14449 PREFETCHI_Fixup (instr_info *ins, int bytemode, int sizeflag)
   14450 {
   14451   if (ins->modrm.mod != 0 || ins->modrm.rm != 5)
   14452     {
   14453       if (ins->intel_syntax)
   14454 	{
   14455 	  ins->mnemonicendp = stpcpy (ins->obuf, "nop   ");
   14456 	}
   14457       else
   14458 	{
   14459 	  USED_REX (REX_W);
   14460 	  if (ins->rex & REX_W)
   14461 	    ins->mnemonicendp = stpcpy (ins->obuf, "nopq  ");
   14462 	  else
   14463 	    {
   14464 	      if (sizeflag & DFLAG)
   14465 		ins->mnemonicendp = stpcpy (ins->obuf, "nopl  ");
   14466 	      else
   14467 		ins->mnemonicendp = stpcpy (ins->obuf, "nopw  ");
   14468 	      ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
   14469 	    }
   14470 	}
   14471       bytemode = v_mode;
   14472     }
   14473 
   14474   return OP_M (ins, bytemode, sizeflag);
   14475 }
   14476 
   14477 static bool
   14478 PUSH2_POP2_Fixup (instr_info *ins, int bytemode, int sizeflag)
   14479 {
   14480   if (ins->modrm.mod != 3)
   14481     return true;
   14482 
   14483   unsigned int vvvv_reg = ins->vex.register_specifier
   14484     | (!ins->vex.v << 4);
   14485   unsigned int rm_reg = ins->modrm.rm + (ins->rex & REX_B ? 8 : 0)
   14486     + (ins->rex2 & REX_B ? 16 : 0);
   14487 
   14488   /* Push2/Pop2 cannot use RSP and Pop2 cannot pop two same registers.  */
   14489   if (!ins->vex.nd || vvvv_reg == 0x4 || rm_reg == 0x4
   14490       || (!ins->modrm.reg
   14491 	  && vvvv_reg == rm_reg))
   14492     {
   14493       oappend (ins, "(bad)");
   14494       return true;
   14495     }
   14496 
   14497   return OP_VEX (ins, bytemode, sizeflag);
   14498 }
   14499 
   14500 static bool
   14501 JMPABS_Fixup (instr_info *ins, int bytemode, int sizeflag)
   14502 {
   14503   if (ins->last_rex2_prefix >= 0)
   14504     {
   14505       uint64_t op;
   14506 
   14507       if ((ins->prefixes & (PREFIX_OPCODE | PREFIX_ADDR | PREFIX_LOCK)) != 0x0
   14508 	  || (ins->rex & REX_W) != 0x0)
   14509 	{
   14510 	  oappend (ins, "(bad)");
   14511 	  return true;
   14512 	}
   14513 
   14514       if (bytemode == eAX_reg)
   14515 	return true;
   14516 
   14517       if (!get64 (ins, &op))
   14518 	return false;
   14519 
   14520       ins->mnemonicendp = stpcpy (ins->obuf, "jmpabs");
   14521       ins->rex2 |= REX2_SPECIAL;
   14522       oappend_immediate (ins, op);
   14523 
   14524       return true;
   14525     }
   14526 
   14527   if (bytemode == eAX_reg)
   14528     return OP_IMREG (ins, bytemode, sizeflag);
   14529   return OP_OFF64 (ins, bytemode, sizeflag);
   14530 }
   14531 
   14532 static bool
   14533 CFCMOV_Fixup (instr_info *ins, int opnd, int sizeflag)
   14534 {
   14535   /* EVEX.NF is used as a direction bit in the 2-operand case to reverse the
   14536      source and destination operands.  */
   14537   bool dstmem = !ins->vex.nd && ins->vex.nf;
   14538 
   14539   if (opnd == 0)
   14540     {
   14541       if (dstmem)
   14542 	return OP_E (ins, v_swap_mode, sizeflag);
   14543       return OP_G (ins, v_mode, sizeflag);
   14544     }
   14545 
   14546   /* These bits have been consumed and should be cleared.  */
   14547   ins->vex.nf = false;
   14548   ins->vex.mask_register_specifier = 0;
   14549 
   14550   if (dstmem)
   14551     return OP_G (ins, v_mode, sizeflag);
   14552   return OP_E (ins, v_mode, sizeflag);
   14553 }
   14554