1 /* Print i386 instructions for GDB, the GNU debugger. 2 Copyright (C) 1988-2024 Free Software Foundation, Inc. 3 4 This file is part of the GNU opcodes library. 5 6 This library is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 3, or (at your option) 9 any later version. 10 11 It is distributed in the hope that it will be useful, but WITHOUT 12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 13 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public 14 License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with this program; if not, write to the Free Software 18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 19 MA 02110-1301, USA. */ 20 21 22 /* 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu) 23 July 1988 24 modified by John Hassey (hassey@dg-rtp.dg.com) 25 x86-64 support added by Jan Hubicka (jh@suse.cz) 26 VIA PadLock support by Michal Ludvig (mludvig@suse.cz). */ 27 28 /* The main tables describing the instructions is essentially a copy 29 of the "Opcode Map" chapter (Appendix A) of the Intel 80386 30 Programmers Manual. Usually, there is a capital letter, followed 31 by a small letter. The capital letter tell the addressing mode, 32 and the small letter tells about the operand size. Refer to 33 the Intel manual for details. */ 34 35 #include "sysdep.h" 36 #include "disassemble.h" 37 #include "opintl.h" 38 #include "opcode/i386.h" 39 #include "libiberty.h" 40 #include "safe-ctype.h" 41 42 typedef struct instr_info instr_info; 43 44 static bool dofloat (instr_info *, int); 45 static int putop (instr_info *, const char *, int); 46 static void oappend_with_style (instr_info *, const char *, 47 enum disassembler_style); 48 49 static bool OP_E (instr_info *, int, int); 50 static bool OP_E_memory (instr_info *, int, int); 51 static bool OP_indirE (instr_info *, int, int); 52 static bool OP_G (instr_info *, int, int); 53 static bool OP_ST (instr_info *, int, int); 54 static bool OP_STi (instr_info *, int, int); 55 static bool OP_Skip_MODRM (instr_info *, int, int); 56 static bool OP_REG (instr_info *, int, int); 57 static bool OP_IMREG (instr_info *, int, int); 58 static bool OP_I (instr_info *, int, int); 59 static bool OP_I64 (instr_info *, int, int); 60 static bool OP_sI (instr_info *, int, int); 61 static bool OP_J (instr_info *, int, int); 62 static bool OP_SEG (instr_info *, int, int); 63 static bool OP_DIR (instr_info *, int, int); 64 static bool OP_OFF (instr_info *, int, int); 65 static bool OP_OFF64 (instr_info *, int, int); 66 static bool OP_ESreg (instr_info *, int, int); 67 static bool OP_DSreg (instr_info *, int, int); 68 static bool OP_C (instr_info *, int, int); 69 static bool OP_D (instr_info *, int, int); 70 static bool OP_T (instr_info *, int, int); 71 static bool OP_MMX (instr_info *, int, int); 72 static bool OP_XMM (instr_info *, int, int); 73 static bool OP_EM (instr_info *, int, int); 74 static bool OP_EX (instr_info *, int, int); 75 static bool OP_EMC (instr_info *, int,int); 76 static bool OP_MXC (instr_info *, int,int); 77 static bool OP_R (instr_info *, int, int); 78 static bool OP_M (instr_info *, int, int); 79 static bool OP_VEX (instr_info *, int, int); 80 static bool OP_VexR (instr_info *, int, int); 81 static bool OP_VexW (instr_info *, int, int); 82 static bool OP_Rounding (instr_info *, int, int); 83 static bool OP_REG_VexI4 (instr_info *, int, int); 84 static bool OP_VexI4 (instr_info *, int, int); 85 static bool OP_0f07 (instr_info *, int, int); 86 static bool OP_Monitor (instr_info *, int, int); 87 static bool OP_Mwait (instr_info *, int, int); 88 89 static bool PCLMUL_Fixup (instr_info *, int, int); 90 static bool VPCMP_Fixup (instr_info *, int, int); 91 static bool VPCOM_Fixup (instr_info *, int, int); 92 static bool NOP_Fixup (instr_info *, int, int); 93 static bool OP_3DNowSuffix (instr_info *, int, int); 94 static bool CMP_Fixup (instr_info *, int, int); 95 static bool REP_Fixup (instr_info *, int, int); 96 static bool SEP_Fixup (instr_info *, int, int); 97 static bool BND_Fixup (instr_info *, int, int); 98 static bool NOTRACK_Fixup (instr_info *, int, int); 99 static bool HLE_Fixup1 (instr_info *, int, int); 100 static bool HLE_Fixup2 (instr_info *, int, int); 101 static bool HLE_Fixup3 (instr_info *, int, int); 102 static bool CMPXCHG8B_Fixup (instr_info *, int, int); 103 static bool XMM_Fixup (instr_info *, int, int); 104 static bool FXSAVE_Fixup (instr_info *, int, int); 105 static bool MOVSXD_Fixup (instr_info *, int, int); 106 static bool DistinctDest_Fixup (instr_info *, int, int); 107 static bool PREFETCHI_Fixup (instr_info *, int, int); 108 static bool PUSH2_POP2_Fixup (instr_info *, int, int); 109 static bool JMPABS_Fixup (instr_info *, int, int); 110 111 static void ATTRIBUTE_PRINTF_3 i386_dis_printf (const disassemble_info *, 112 enum disassembler_style, 113 const char *, ...); 114 115 /* This character is used to encode style information within the output 116 buffers. See oappend_insert_style for more details. */ 117 #define STYLE_MARKER_CHAR '\002' 118 119 /* The maximum operand buffer size. */ 120 #define MAX_OPERAND_BUFFER_SIZE 128 121 122 enum address_mode 123 { 124 mode_16bit, 125 mode_32bit, 126 mode_64bit 127 }; 128 129 static const char *prefix_name (enum address_mode, uint8_t, int); 130 131 enum x86_64_isa 132 { 133 amd64 = 1, 134 intel64 135 }; 136 137 enum evex_type 138 { 139 evex_default = 0, 140 evex_from_legacy, 141 evex_from_vex, 142 }; 143 144 struct instr_info 145 { 146 enum address_mode address_mode; 147 148 /* Flags for the prefixes for the current instruction. See below. */ 149 int prefixes; 150 151 /* REX prefix the current instruction. See below. */ 152 uint8_t rex; 153 /* Bits of REX we've already used. */ 154 uint8_t rex_used; 155 156 /* Record W R4 X4 B4 bits for rex2. */ 157 unsigned char rex2; 158 /* Bits of rex2 we've already used. */ 159 unsigned char rex2_used; 160 unsigned char rex2_payload; 161 162 bool need_modrm; 163 unsigned char need_vex; 164 bool has_sib; 165 166 /* Flags for ins->prefixes which we somehow handled when printing the 167 current instruction. */ 168 int used_prefixes; 169 170 /* Flags for EVEX bits which we somehow handled when printing the 171 current instruction. */ 172 int evex_used; 173 174 char obuf[MAX_OPERAND_BUFFER_SIZE]; 175 char *obufp; 176 char *mnemonicendp; 177 const uint8_t *start_codep; 178 uint8_t *codep; 179 const uint8_t *end_codep; 180 unsigned char nr_prefixes; 181 signed char last_lock_prefix; 182 signed char last_repz_prefix; 183 signed char last_repnz_prefix; 184 signed char last_data_prefix; 185 signed char last_addr_prefix; 186 signed char last_rex_prefix; 187 signed char last_rex2_prefix; 188 signed char last_seg_prefix; 189 signed char fwait_prefix; 190 /* The active segment register prefix. */ 191 unsigned char active_seg_prefix; 192 193 #define MAX_CODE_LENGTH 15 194 /* We can up to 14 ins->prefixes since the maximum instruction length is 195 15bytes. */ 196 uint8_t all_prefixes[MAX_CODE_LENGTH - 1]; 197 disassemble_info *info; 198 199 struct 200 { 201 int mod; 202 int reg; 203 int rm; 204 } 205 modrm; 206 207 struct 208 { 209 int scale; 210 int index; 211 int base; 212 } 213 sib; 214 215 struct 216 { 217 int register_specifier; 218 int length; 219 int prefix; 220 int mask_register_specifier; 221 int ll; 222 bool w; 223 bool evex; 224 bool v; 225 bool zeroing; 226 bool b; 227 bool no_broadcast; 228 bool nf; 229 } 230 vex; 231 232 /* For APX EVEX-promoted prefix, EVEX.ND shares the same bit as vex.b. */ 233 #define nd b 234 235 enum evex_type evex_type; 236 237 /* Remember if the current op is a jump instruction. */ 238 bool op_is_jump; 239 240 bool two_source_ops; 241 242 /* Record whether EVEX masking is used incorrectly. */ 243 bool illegal_masking; 244 245 /* Record whether the modrm byte has been skipped. */ 246 bool has_skipped_modrm; 247 248 unsigned char op_ad; 249 signed char op_index[MAX_OPERANDS]; 250 bool op_riprel[MAX_OPERANDS]; 251 char *op_out[MAX_OPERANDS]; 252 bfd_vma op_address[MAX_OPERANDS]; 253 bfd_vma start_pc; 254 255 /* On the 386's of 1988, the maximum length of an instruction is 15 bytes. 256 * (see topic "Redundant ins->prefixes" in the "Differences from 8086" 257 * section of the "Virtual 8086 Mode" chapter.) 258 * 'pc' should be the address of this instruction, it will 259 * be used to print the target address if this is a relative jump or call 260 * The function returns the length of this instruction in bytes. 261 */ 262 char intel_syntax; 263 bool intel_mnemonic; 264 char open_char; 265 char close_char; 266 char separator_char; 267 char scale_char; 268 269 enum x86_64_isa isa64; 270 }; 271 272 struct dis_private { 273 bfd_vma insn_start; 274 int orig_sizeflag; 275 276 /* Indexes first byte not fetched. */ 277 unsigned int fetched; 278 uint8_t the_buffer[2 * MAX_CODE_LENGTH - 1]; 279 }; 280 281 /* Mark parts used in the REX prefix. When we are testing for 282 empty prefix (for 8bit register REX extension), just mask it 283 out. Otherwise test for REX bit is excuse for existence of REX 284 only in case value is nonzero. */ 285 #define USED_REX(value) \ 286 { \ 287 if (value) \ 288 { \ 289 if (ins->rex & value) \ 290 ins->rex_used |= (value) | REX_OPCODE; \ 291 if (ins->rex2 & value) \ 292 { \ 293 ins->rex2_used |= (value); \ 294 ins->rex_used |= REX_OPCODE; \ 295 } \ 296 } \ 297 else \ 298 ins->rex_used |= REX_OPCODE; \ 299 } 300 301 302 #define EVEX_b_used 1 303 #define EVEX_len_used 2 304 305 306 /* {rex2} is not printed when the REX2_SPECIAL is set. */ 307 #define REX2_SPECIAL 16 308 309 /* Flags stored in PREFIXES. */ 310 #define PREFIX_REPZ 1 311 #define PREFIX_REPNZ 2 312 #define PREFIX_CS 4 313 #define PREFIX_SS 8 314 #define PREFIX_DS 0x10 315 #define PREFIX_ES 0x20 316 #define PREFIX_FS 0x40 317 #define PREFIX_GS 0x80 318 #define PREFIX_LOCK 0x100 319 #define PREFIX_DATA 0x200 320 #define PREFIX_ADDR 0x400 321 #define PREFIX_FWAIT 0x800 322 #define PREFIX_REX2 0x1000 323 #define PREFIX_NP_OR_DATA 0x2000 324 #define NO_PREFIX 0x4000 325 326 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive) 327 to ADDR (exclusive) are valid. Returns true for success, false 328 on error. */ 329 static bool 330 fetch_code (struct disassemble_info *info, const uint8_t *until) 331 { 332 int status = -1; 333 struct dis_private *priv = info->private_data; 334 bfd_vma start = priv->insn_start + priv->fetched; 335 uint8_t *fetch_end = priv->the_buffer + priv->fetched; 336 ptrdiff_t needed = until - fetch_end; 337 338 if (needed <= 0) 339 return true; 340 341 if (priv->fetched + (size_t) needed <= ARRAY_SIZE (priv->the_buffer)) 342 status = (*info->read_memory_func) (start, fetch_end, needed, info); 343 if (status != 0) 344 { 345 /* If we did manage to read at least one byte, then 346 print_insn_i386 will do something sensible. Otherwise, print 347 an error. We do that here because this is where we know 348 STATUS. */ 349 if (!priv->fetched) 350 (*info->memory_error_func) (status, start, info); 351 return false; 352 } 353 354 priv->fetched += needed; 355 return true; 356 } 357 358 static bool 359 fetch_modrm (instr_info *ins) 360 { 361 if (!fetch_code (ins->info, ins->codep + 1)) 362 return false; 363 364 ins->modrm.mod = (*ins->codep >> 6) & 3; 365 ins->modrm.reg = (*ins->codep >> 3) & 7; 366 ins->modrm.rm = *ins->codep & 7; 367 368 return true; 369 } 370 371 static int 372 fetch_error (const instr_info *ins) 373 { 374 /* Getting here means we tried for data but didn't get it. That 375 means we have an incomplete instruction of some sort. Just 376 print the first byte as a prefix or a .byte pseudo-op. */ 377 const struct dis_private *priv = ins->info->private_data; 378 const char *name = NULL; 379 380 if (ins->codep <= priv->the_buffer) 381 return -1; 382 383 if (ins->prefixes || ins->fwait_prefix >= 0 || (ins->rex & REX_OPCODE)) 384 name = prefix_name (ins->address_mode, priv->the_buffer[0], 385 priv->orig_sizeflag); 386 if (name != NULL) 387 i386_dis_printf (ins->info, dis_style_mnemonic, "%s", name); 388 else 389 { 390 /* Just print the first byte as a .byte instruction. */ 391 i386_dis_printf (ins->info, dis_style_assembler_directive, ".byte "); 392 i386_dis_printf (ins->info, dis_style_immediate, "%#x", 393 (unsigned int) priv->the_buffer[0]); 394 } 395 396 return 1; 397 } 398 399 /* Possible values for prefix requirement. */ 400 #define PREFIX_IGNORED_SHIFT 16 401 #define PREFIX_IGNORED_REPZ (PREFIX_REPZ << PREFIX_IGNORED_SHIFT) 402 #define PREFIX_IGNORED_REPNZ (PREFIX_REPNZ << PREFIX_IGNORED_SHIFT) 403 #define PREFIX_IGNORED_DATA (PREFIX_DATA << PREFIX_IGNORED_SHIFT) 404 #define PREFIX_IGNORED_ADDR (PREFIX_ADDR << PREFIX_IGNORED_SHIFT) 405 #define PREFIX_IGNORED_LOCK (PREFIX_LOCK << PREFIX_IGNORED_SHIFT) 406 #define PREFIX_REX2_ILLEGAL (PREFIX_REX2 << PREFIX_IGNORED_SHIFT) 407 408 /* Opcode prefixes. */ 409 #define PREFIX_OPCODE (PREFIX_REPZ \ 410 | PREFIX_REPNZ \ 411 | PREFIX_DATA) 412 413 /* Prefixes ignored. */ 414 #define PREFIX_IGNORED (PREFIX_IGNORED_REPZ \ 415 | PREFIX_IGNORED_REPNZ \ 416 | PREFIX_IGNORED_DATA) 417 418 #define XX { NULL, 0 } 419 #define Bad_Opcode NULL, { { NULL, 0 } }, 0 420 421 #define Eb { OP_E, b_mode } 422 #define Ebnd { OP_E, bnd_mode } 423 #define EbS { OP_E, b_swap_mode } 424 #define EbndS { OP_E, bnd_swap_mode } 425 #define Ev { OP_E, v_mode } 426 #define Eva { OP_E, va_mode } 427 #define Ev_bnd { OP_E, v_bnd_mode } 428 #define EvS { OP_E, v_swap_mode } 429 #define Ed { OP_E, d_mode } 430 #define Edq { OP_E, dq_mode } 431 #define Edb { OP_E, db_mode } 432 #define Edw { OP_E, dw_mode } 433 #define Eq { OP_E, q_mode } 434 #define indirEv { OP_indirE, indir_v_mode } 435 #define indirEp { OP_indirE, f_mode } 436 #define stackEv { OP_E, stack_v_mode } 437 #define Em { OP_E, m_mode } 438 #define Ew { OP_E, w_mode } 439 #define M { OP_M, 0 } /* lea, lgdt, etc. */ 440 #define Ma { OP_M, a_mode } 441 #define Mb { OP_M, b_mode } 442 #define Md { OP_M, d_mode } 443 #define Mdq { OP_M, dq_mode } 444 #define Mo { OP_M, o_mode } 445 #define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */ 446 #define Mq { OP_M, q_mode } 447 #define Mv { OP_M, v_mode } 448 #define Mv_bnd { OP_M, v_bndmk_mode } 449 #define Mw { OP_M, w_mode } 450 #define Mx { OP_M, x_mode } 451 #define Mxmm { OP_M, xmm_mode } 452 #define Mymm { OP_M, ymm_mode } 453 #define Gb { OP_G, b_mode } 454 #define Gbnd { OP_G, bnd_mode } 455 #define Gv { OP_G, v_mode } 456 #define Gd { OP_G, d_mode } 457 #define Gdq { OP_G, dq_mode } 458 #define Gq { OP_G, q_mode } 459 #define Gm { OP_G, m_mode } 460 #define Gva { OP_G, va_mode } 461 #define Gw { OP_G, w_mode } 462 #define Ib { OP_I, b_mode } 463 #define sIb { OP_sI, b_mode } /* sign extened byte */ 464 #define sIbT { OP_sI, b_T_mode } /* sign extened byte like 'T' */ 465 #define Iv { OP_I, v_mode } 466 #define sIv { OP_sI, v_mode } 467 #define Iv64 { OP_I64, v_mode } 468 #define Id { OP_I, d_mode } 469 #define Iw { OP_I, w_mode } 470 #define I1 { OP_I, const_1_mode } 471 #define Jb { OP_J, b_mode } 472 #define Jv { OP_J, v_mode } 473 #define Jdqw { OP_J, dqw_mode } 474 #define Cm { OP_C, m_mode } 475 #define Dm { OP_D, m_mode } 476 #define Td { OP_T, d_mode } 477 #define Skip_MODRM { OP_Skip_MODRM, 0 } 478 479 #define RMeAX { OP_REG, eAX_reg } 480 #define RMeBX { OP_REG, eBX_reg } 481 #define RMeCX { OP_REG, eCX_reg } 482 #define RMeDX { OP_REG, eDX_reg } 483 #define RMeSP { OP_REG, eSP_reg } 484 #define RMeBP { OP_REG, eBP_reg } 485 #define RMeSI { OP_REG, eSI_reg } 486 #define RMeDI { OP_REG, eDI_reg } 487 #define RMrAX { OP_REG, rAX_reg } 488 #define RMrBX { OP_REG, rBX_reg } 489 #define RMrCX { OP_REG, rCX_reg } 490 #define RMrDX { OP_REG, rDX_reg } 491 #define RMrSP { OP_REG, rSP_reg } 492 #define RMrBP { OP_REG, rBP_reg } 493 #define RMrSI { OP_REG, rSI_reg } 494 #define RMrDI { OP_REG, rDI_reg } 495 #define RMAL { OP_REG, al_reg } 496 #define RMCL { OP_REG, cl_reg } 497 #define RMDL { OP_REG, dl_reg } 498 #define RMBL { OP_REG, bl_reg } 499 #define RMAH { OP_REG, ah_reg } 500 #define RMCH { OP_REG, ch_reg } 501 #define RMDH { OP_REG, dh_reg } 502 #define RMBH { OP_REG, bh_reg } 503 #define RMAX { OP_REG, ax_reg } 504 #define RMDX { OP_REG, dx_reg } 505 506 #define eAX { OP_IMREG, eAX_reg } 507 #define AL { OP_IMREG, al_reg } 508 #define CL { OP_IMREG, cl_reg } 509 #define zAX { OP_IMREG, z_mode_ax_reg } 510 #define indirDX { OP_IMREG, indir_dx_reg } 511 512 #define Sw { OP_SEG, w_mode } 513 #define Sv { OP_SEG, v_mode } 514 #define Ap { OP_DIR, 0 } 515 #define Ob { OP_OFF64, b_mode } 516 #define Ov { OP_OFF64, v_mode } 517 #define Xb { OP_DSreg, eSI_reg } 518 #define Xv { OP_DSreg, eSI_reg } 519 #define Xz { OP_DSreg, eSI_reg } 520 #define Yb { OP_ESreg, eDI_reg } 521 #define Yv { OP_ESreg, eDI_reg } 522 #define DSBX { OP_DSreg, eBX_reg } 523 524 #define es { OP_REG, es_reg } 525 #define ss { OP_REG, ss_reg } 526 #define cs { OP_REG, cs_reg } 527 #define ds { OP_REG, ds_reg } 528 #define fs { OP_REG, fs_reg } 529 #define gs { OP_REG, gs_reg } 530 531 #define MX { OP_MMX, 0 } 532 #define XM { OP_XMM, 0 } 533 #define XMScalar { OP_XMM, scalar_mode } 534 #define XMGatherD { OP_XMM, vex_vsib_d_w_dq_mode } 535 #define XMGatherQ { OP_XMM, vex_vsib_q_w_dq_mode } 536 #define XMM { OP_XMM, xmm_mode } 537 #define TMM { OP_XMM, tmm_mode } 538 #define XMxmmq { OP_XMM, xmmq_mode } 539 #define EM { OP_EM, v_mode } 540 #define EMS { OP_EM, v_swap_mode } 541 #define EMd { OP_EM, d_mode } 542 #define EMx { OP_EM, x_mode } 543 #define EXbwUnit { OP_EX, bw_unit_mode } 544 #define EXb { OP_EX, b_mode } 545 #define EXw { OP_EX, w_mode } 546 #define EXd { OP_EX, d_mode } 547 #define EXdS { OP_EX, d_swap_mode } 548 #define EXwS { OP_EX, w_swap_mode } 549 #define EXq { OP_EX, q_mode } 550 #define EXqS { OP_EX, q_swap_mode } 551 #define EXdq { OP_EX, dq_mode } 552 #define EXx { OP_EX, x_mode } 553 #define EXxh { OP_EX, xh_mode } 554 #define EXxS { OP_EX, x_swap_mode } 555 #define EXxmm { OP_EX, xmm_mode } 556 #define EXymm { OP_EX, ymm_mode } 557 #define EXxmmq { OP_EX, xmmq_mode } 558 #define EXxmmqh { OP_EX, evex_half_bcst_xmmqh_mode } 559 #define EXEvexHalfBcstXmmq { OP_EX, evex_half_bcst_xmmq_mode } 560 #define EXxmmdw { OP_EX, xmmdw_mode } 561 #define EXxmmqd { OP_EX, xmmqd_mode } 562 #define EXxmmqdh { OP_EX, evex_half_bcst_xmmqdh_mode } 563 #define EXymmq { OP_EX, ymmq_mode } 564 #define EXEvexXGscat { OP_EX, evex_x_gscat_mode } 565 #define EXEvexXNoBcst { OP_EX, evex_x_nobcst_mode } 566 #define Rd { OP_R, d_mode } 567 #define Rdq { OP_R, dq_mode } 568 #define Rq { OP_R, q_mode } 569 #define Nq { OP_R, q_mm_mode } 570 #define Ux { OP_R, x_mode } 571 #define Uxmm { OP_R, xmm_mode } 572 #define Rxmmq { OP_R, xmmq_mode } 573 #define Rymm { OP_R, ymm_mode } 574 #define Rtmm { OP_R, tmm_mode } 575 #define EMCq { OP_EMC, q_mode } 576 #define MXC { OP_MXC, 0 } 577 #define OPSUF { OP_3DNowSuffix, 0 } 578 #define SEP { SEP_Fixup, 0 } 579 #define CMP { CMP_Fixup, 0 } 580 #define XMM0 { XMM_Fixup, 0 } 581 #define FXSAVE { FXSAVE_Fixup, 0 } 582 583 #define Vex { OP_VEX, x_mode } 584 #define VexW { OP_VexW, x_mode } 585 #define VexScalar { OP_VEX, scalar_mode } 586 #define VexScalarR { OP_VexR, scalar_mode } 587 #define VexGatherD { OP_VEX, vex_vsib_d_w_dq_mode } 588 #define VexGatherQ { OP_VEX, vex_vsib_q_w_dq_mode } 589 #define VexGdq { OP_VEX, dq_mode } 590 #define VexGb { OP_VEX, b_mode } 591 #define VexGv { OP_VEX, v_mode } 592 #define VexTmm { OP_VEX, tmm_mode } 593 #define XMVexI4 { OP_REG_VexI4, x_mode } 594 #define XMVexScalarI4 { OP_REG_VexI4, scalar_mode } 595 #define VexI4 { OP_VexI4, 0 } 596 #define PCLMUL { PCLMUL_Fixup, 0 } 597 #define VPCMP { VPCMP_Fixup, 0 } 598 #define VPCOM { VPCOM_Fixup, 0 } 599 600 #define EXxEVexR { OP_Rounding, evex_rounding_mode } 601 #define EXxEVexR64 { OP_Rounding, evex_rounding_64_mode } 602 #define EXxEVexS { OP_Rounding, evex_sae_mode } 603 604 #define MaskG { OP_G, mask_mode } 605 #define MaskE { OP_E, mask_mode } 606 #define MaskR { OP_R, mask_mode } 607 #define MaskBDE { OP_E, mask_bd_mode } 608 #define MaskVex { OP_VEX, mask_mode } 609 610 #define MVexVSIBDWpX { OP_M, vex_vsib_d_w_dq_mode } 611 #define MVexVSIBQWpX { OP_M, vex_vsib_q_w_dq_mode } 612 613 #define MVexSIBMEM { OP_M, vex_sibmem_mode } 614 615 /* Used handle "rep" prefix for string instructions. */ 616 #define Xbr { REP_Fixup, eSI_reg } 617 #define Xvr { REP_Fixup, eSI_reg } 618 #define Ybr { REP_Fixup, eDI_reg } 619 #define Yvr { REP_Fixup, eDI_reg } 620 #define Yzr { REP_Fixup, eDI_reg } 621 #define indirDXr { REP_Fixup, indir_dx_reg } 622 #define ALr { REP_Fixup, al_reg } 623 #define eAXr { REP_Fixup, eAX_reg } 624 625 /* Used handle HLE prefix for lockable instructions. */ 626 #define Ebh1 { HLE_Fixup1, b_mode } 627 #define Evh1 { HLE_Fixup1, v_mode } 628 #define Ebh2 { HLE_Fixup2, b_mode } 629 #define Evh2 { HLE_Fixup2, v_mode } 630 #define Ebh3 { HLE_Fixup3, b_mode } 631 #define Evh3 { HLE_Fixup3, v_mode } 632 633 #define BND { BND_Fixup, 0 } 634 #define NOTRACK { NOTRACK_Fixup, 0 } 635 636 #define cond_jump_flag { NULL, cond_jump_mode } 637 #define loop_jcxz_flag { NULL, loop_jcxz_mode } 638 639 /* bits in sizeflag */ 640 #define SUFFIX_ALWAYS 4 641 #define AFLAG 2 642 #define DFLAG 1 643 644 enum 645 { 646 /* byte operand */ 647 b_mode = 1, 648 /* byte operand with operand swapped */ 649 b_swap_mode, 650 /* byte operand, sign extend like 'T' suffix */ 651 b_T_mode, 652 /* operand size depends on prefixes */ 653 v_mode, 654 /* operand size depends on prefixes with operand swapped */ 655 v_swap_mode, 656 /* operand size depends on address prefix */ 657 va_mode, 658 /* word operand */ 659 w_mode, 660 /* double word operand */ 661 d_mode, 662 /* word operand with operand swapped */ 663 w_swap_mode, 664 /* double word operand with operand swapped */ 665 d_swap_mode, 666 /* quad word operand */ 667 q_mode, 668 /* 8-byte MM operand */ 669 q_mm_mode, 670 /* quad word operand with operand swapped */ 671 q_swap_mode, 672 /* ten-byte operand */ 673 t_mode, 674 /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand. In EVEX with 675 broadcast enabled. */ 676 x_mode, 677 /* Similar to x_mode, but with different EVEX mem shifts. */ 678 evex_x_gscat_mode, 679 /* Similar to x_mode, but with yet different EVEX mem shifts. */ 680 bw_unit_mode, 681 /* Similar to x_mode, but with disabled broadcast. */ 682 evex_x_nobcst_mode, 683 /* Similar to x_mode, but with operands swapped and disabled broadcast 684 in EVEX. */ 685 x_swap_mode, 686 /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand. In EVEX with 687 broadcast of 16bit enabled. */ 688 xh_mode, 689 /* 16-byte XMM operand */ 690 xmm_mode, 691 /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword 692 memory operand (depending on vector length). Broadcast isn't 693 allowed. */ 694 xmmq_mode, 695 /* Same as xmmq_mode, but broadcast is allowed. */ 696 evex_half_bcst_xmmq_mode, 697 /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword 698 memory operand (depending on vector length). 16bit broadcast. */ 699 evex_half_bcst_xmmqh_mode, 700 /* 16-byte XMM, word, double word or quad word operand. */ 701 xmmdw_mode, 702 /* 16-byte XMM, double word, quad word operand or xmm word operand. */ 703 xmmqd_mode, 704 /* 16-byte XMM, double word, quad word operand or xmm word operand. 705 16bit broadcast. */ 706 evex_half_bcst_xmmqdh_mode, 707 /* 32-byte YMM operand */ 708 ymm_mode, 709 /* quad word, ymmword or zmmword memory operand. */ 710 ymmq_mode, 711 /* TMM operand */ 712 tmm_mode, 713 /* d_mode in 32bit, q_mode in 64bit mode. */ 714 m_mode, 715 /* pair of v_mode operands */ 716 a_mode, 717 cond_jump_mode, 718 loop_jcxz_mode, 719 movsxd_mode, 720 v_bnd_mode, 721 /* like v_bnd_mode in 32bit, no RIP-rel in 64bit mode. */ 722 v_bndmk_mode, 723 /* operand size depends on REX.W / VEX.W. */ 724 dq_mode, 725 /* Displacements like v_mode without considering Intel64 ISA. */ 726 dqw_mode, 727 /* bounds operand */ 728 bnd_mode, 729 /* bounds operand with operand swapped */ 730 bnd_swap_mode, 731 /* 4- or 6-byte pointer operand */ 732 f_mode, 733 const_1_mode, 734 /* v_mode for indirect branch opcodes. */ 735 indir_v_mode, 736 /* v_mode for stack-related opcodes. */ 737 stack_v_mode, 738 /* non-quad operand size depends on prefixes */ 739 z_mode, 740 /* 16-byte operand */ 741 o_mode, 742 /* registers like d_mode, memory like b_mode. */ 743 db_mode, 744 /* registers like d_mode, memory like w_mode. */ 745 dw_mode, 746 747 /* Operand size depends on the VEX.W bit, with VSIB dword indices. */ 748 vex_vsib_d_w_dq_mode, 749 /* Operand size depends on the VEX.W bit, with VSIB qword indices. */ 750 vex_vsib_q_w_dq_mode, 751 /* mandatory non-vector SIB. */ 752 vex_sibmem_mode, 753 754 /* scalar, ignore vector length. */ 755 scalar_mode, 756 757 /* Static rounding. */ 758 evex_rounding_mode, 759 /* Static rounding, 64-bit mode only. */ 760 evex_rounding_64_mode, 761 /* Supress all exceptions. */ 762 evex_sae_mode, 763 764 /* Mask register operand. */ 765 mask_mode, 766 /* Mask register operand. */ 767 mask_bd_mode, 768 769 es_reg, 770 cs_reg, 771 ss_reg, 772 ds_reg, 773 fs_reg, 774 gs_reg, 775 776 eAX_reg, 777 eCX_reg, 778 eDX_reg, 779 eBX_reg, 780 eSP_reg, 781 eBP_reg, 782 eSI_reg, 783 eDI_reg, 784 785 al_reg, 786 cl_reg, 787 dl_reg, 788 bl_reg, 789 ah_reg, 790 ch_reg, 791 dh_reg, 792 bh_reg, 793 794 ax_reg, 795 cx_reg, 796 dx_reg, 797 bx_reg, 798 sp_reg, 799 bp_reg, 800 si_reg, 801 di_reg, 802 803 rAX_reg, 804 rCX_reg, 805 rDX_reg, 806 rBX_reg, 807 rSP_reg, 808 rBP_reg, 809 rSI_reg, 810 rDI_reg, 811 812 z_mode_ax_reg, 813 indir_dx_reg 814 }; 815 816 enum 817 { 818 FLOATCODE = 1, 819 USE_REG_TABLE, 820 USE_MOD_TABLE, 821 USE_RM_TABLE, 822 USE_PREFIX_TABLE, 823 USE_X86_64_TABLE, 824 USE_X86_64_EVEX_FROM_VEX_TABLE, 825 USE_X86_64_EVEX_PFX_TABLE, 826 USE_X86_64_EVEX_W_TABLE, 827 USE_X86_64_EVEX_MEM_W_TABLE, 828 USE_3BYTE_TABLE, 829 USE_XOP_8F_TABLE, 830 USE_VEX_C4_TABLE, 831 USE_VEX_C5_TABLE, 832 USE_VEX_LEN_TABLE, 833 USE_VEX_W_TABLE, 834 USE_EVEX_TABLE, 835 USE_EVEX_LEN_TABLE 836 }; 837 838 #define FLOAT NULL, { { NULL, FLOATCODE } }, 0 839 840 #define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } }, 0 841 #define REG_TABLE(I) DIS386 (USE_REG_TABLE, (I)) 842 #define MOD_TABLE(I) DIS386 (USE_MOD_TABLE, (I)) 843 #define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I)) 844 #define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I)) 845 #define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I)) 846 #define X86_64_EVEX_FROM_VEX_TABLE(I) \ 847 DIS386 (USE_X86_64_EVEX_FROM_VEX_TABLE, (I)) 848 #define X86_64_EVEX_PFX_TABLE(I) DIS386 (USE_X86_64_EVEX_PFX_TABLE, (I)) 849 #define X86_64_EVEX_W_TABLE(I) DIS386 (USE_X86_64_EVEX_W_TABLE, (I)) 850 #define X86_64_EVEX_MEM_W_TABLE(I) DIS386 (USE_X86_64_EVEX_MEM_W_TABLE, (I)) 851 #define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I)) 852 #define XOP_8F_TABLE() DIS386 (USE_XOP_8F_TABLE, 0) 853 #define VEX_C4_TABLE() DIS386 (USE_VEX_C4_TABLE, 0) 854 #define VEX_C5_TABLE() DIS386 (USE_VEX_C5_TABLE, 0) 855 #define VEX_LEN_TABLE(I) DIS386 (USE_VEX_LEN_TABLE, (I)) 856 #define VEX_W_TABLE(I) DIS386 (USE_VEX_W_TABLE, (I)) 857 #define EVEX_TABLE() DIS386 (USE_EVEX_TABLE, 0) 858 #define EVEX_LEN_TABLE(I) DIS386 (USE_EVEX_LEN_TABLE, (I)) 859 860 enum 861 { 862 REG_80 = 0, 863 REG_81, 864 REG_83, 865 REG_8F, 866 REG_C0, 867 REG_C1, 868 REG_C6, 869 REG_C7, 870 REG_D0, 871 REG_D1, 872 REG_D2, 873 REG_D3, 874 REG_F6, 875 REG_F7, 876 REG_FE, 877 REG_FF, 878 REG_0F00, 879 REG_0F01, 880 REG_0F0D, 881 REG_0F18, 882 REG_0F1C_P_0_MOD_0, 883 REG_0F1E_P_1_MOD_3, 884 REG_0F38D8_PREFIX_1, 885 REG_0F3A0F_P_1, 886 REG_0F71, 887 REG_0F72, 888 REG_0F73, 889 REG_0FA6, 890 REG_0FA7, 891 REG_0FAE, 892 REG_0FBA, 893 REG_0FC7, 894 REG_VEX_0F71, 895 REG_VEX_0F72, 896 REG_VEX_0F73, 897 REG_VEX_0FAE, 898 REG_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0, 899 REG_VEX_0F38F3_L_0_P_0, 900 REG_VEX_MAP7_F8_L_0_W_0, 901 902 REG_XOP_09_01_L_0, 903 REG_XOP_09_02_L_0, 904 REG_XOP_09_12_L_0, 905 REG_XOP_0A_12_L_0, 906 907 REG_EVEX_0F71, 908 REG_EVEX_0F72, 909 REG_EVEX_0F73, 910 REG_EVEX_0F38C6_L_2, 911 REG_EVEX_0F38C7_L_2, 912 REG_EVEX_MAP4_80, 913 REG_EVEX_MAP4_81, 914 REG_EVEX_MAP4_83, 915 REG_EVEX_MAP4_8F, 916 REG_EVEX_MAP4_F6, 917 REG_EVEX_MAP4_F7, 918 REG_EVEX_MAP4_FE, 919 REG_EVEX_MAP4_FF, 920 }; 921 922 enum 923 { 924 MOD_62_32BIT = 0, 925 MOD_C4_32BIT, 926 MOD_C5_32BIT, 927 MOD_0F01_REG_0, 928 MOD_0F01_REG_1, 929 MOD_0F01_REG_2, 930 MOD_0F01_REG_3, 931 MOD_0F01_REG_5, 932 MOD_0F01_REG_7, 933 MOD_0F12_PREFIX_0, 934 MOD_0F16_PREFIX_0, 935 MOD_0F18_REG_0, 936 MOD_0F18_REG_1, 937 MOD_0F18_REG_2, 938 MOD_0F18_REG_3, 939 MOD_0F18_REG_6, 940 MOD_0F18_REG_7, 941 MOD_0F1A_PREFIX_0, 942 MOD_0F1B_PREFIX_0, 943 MOD_0F1B_PREFIX_1, 944 MOD_0F1C_PREFIX_0, 945 MOD_0F1E_PREFIX_1, 946 MOD_0FAE_REG_0, 947 MOD_0FAE_REG_1, 948 MOD_0FAE_REG_2, 949 MOD_0FAE_REG_3, 950 MOD_0FAE_REG_4, 951 MOD_0FAE_REG_5, 952 MOD_0FAE_REG_6, 953 MOD_0FAE_REG_7, 954 MOD_0FC7_REG_6, 955 MOD_0FC7_REG_7, 956 MOD_0F38DC_PREFIX_1, 957 MOD_0F38F8, 958 959 MOD_VEX_0F3849_X86_64_L_0_W_0, 960 961 MOD_EVEX_MAP4_F8_P_1, 962 MOD_EVEX_MAP4_F8_P_3, 963 }; 964 965 enum 966 { 967 RM_C6_REG_7 = 0, 968 RM_C7_REG_7, 969 RM_0F01_REG_0, 970 RM_0F01_REG_1, 971 RM_0F01_REG_2, 972 RM_0F01_REG_3, 973 RM_0F01_REG_5_MOD_3, 974 RM_0F01_REG_7_MOD_3, 975 RM_0F1E_P_1_MOD_3_REG_7, 976 RM_0FAE_REG_6_MOD_3_P_0, 977 RM_0FAE_REG_7_MOD_3, 978 RM_0F3A0F_P_1_R_0, 979 980 RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0_R_0, 981 RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_3, 982 }; 983 984 enum 985 { 986 PREFIX_90 = 0, 987 PREFIX_0F00_REG_6_X86_64, 988 PREFIX_0F01_REG_0_MOD_3_RM_6, 989 PREFIX_0F01_REG_0_MOD_3_RM_7, 990 PREFIX_0F01_REG_1_RM_2, 991 PREFIX_0F01_REG_1_RM_4, 992 PREFIX_0F01_REG_1_RM_5, 993 PREFIX_0F01_REG_1_RM_6, 994 PREFIX_0F01_REG_1_RM_7, 995 PREFIX_0F01_REG_3_RM_1, 996 PREFIX_0F01_REG_5_MOD_0, 997 PREFIX_0F01_REG_5_MOD_3_RM_0, 998 PREFIX_0F01_REG_5_MOD_3_RM_1, 999 PREFIX_0F01_REG_5_MOD_3_RM_2, 1000 PREFIX_0F01_REG_5_MOD_3_RM_4, 1001 PREFIX_0F01_REG_5_MOD_3_RM_5, 1002 PREFIX_0F01_REG_5_MOD_3_RM_6, 1003 PREFIX_0F01_REG_5_MOD_3_RM_7, 1004 PREFIX_0F01_REG_7_MOD_3_RM_2, 1005 PREFIX_0F01_REG_7_MOD_3_RM_5, 1006 PREFIX_0F01_REG_7_MOD_3_RM_6, 1007 PREFIX_0F01_REG_7_MOD_3_RM_7, 1008 PREFIX_0F09, 1009 PREFIX_0F10, 1010 PREFIX_0F11, 1011 PREFIX_0F12, 1012 PREFIX_0F16, 1013 PREFIX_0F18_REG_6_MOD_0_X86_64, 1014 PREFIX_0F18_REG_7_MOD_0_X86_64, 1015 PREFIX_0F1A, 1016 PREFIX_0F1B, 1017 PREFIX_0F1C, 1018 PREFIX_0F1E, 1019 PREFIX_0F2A, 1020 PREFIX_0F2B, 1021 PREFIX_0F2C, 1022 PREFIX_0F2D, 1023 PREFIX_0F2E, 1024 PREFIX_0F2F, 1025 PREFIX_0F51, 1026 PREFIX_0F52, 1027 PREFIX_0F53, 1028 PREFIX_0F58, 1029 PREFIX_0F59, 1030 PREFIX_0F5A, 1031 PREFIX_0F5B, 1032 PREFIX_0F5C, 1033 PREFIX_0F5D, 1034 PREFIX_0F5E, 1035 PREFIX_0F5F, 1036 PREFIX_0F60, 1037 PREFIX_0F61, 1038 PREFIX_0F62, 1039 PREFIX_0F6F, 1040 PREFIX_0F70, 1041 PREFIX_0F78, 1042 PREFIX_0F79, 1043 PREFIX_0F7C, 1044 PREFIX_0F7D, 1045 PREFIX_0F7E, 1046 PREFIX_0F7F, 1047 PREFIX_0FAE_REG_0_MOD_3, 1048 PREFIX_0FAE_REG_1_MOD_3, 1049 PREFIX_0FAE_REG_2_MOD_3, 1050 PREFIX_0FAE_REG_3_MOD_3, 1051 PREFIX_0FAE_REG_4_MOD_0, 1052 PREFIX_0FAE_REG_4_MOD_3, 1053 PREFIX_0FAE_REG_5_MOD_3, 1054 PREFIX_0FAE_REG_6_MOD_0, 1055 PREFIX_0FAE_REG_6_MOD_3, 1056 PREFIX_0FAE_REG_7_MOD_0, 1057 PREFIX_0FB8, 1058 PREFIX_0FBC, 1059 PREFIX_0FBD, 1060 PREFIX_0FC2, 1061 PREFIX_0FC7_REG_6_MOD_0, 1062 PREFIX_0FC7_REG_6_MOD_3, 1063 PREFIX_0FC7_REG_7_MOD_3, 1064 PREFIX_0FD0, 1065 PREFIX_0FD6, 1066 PREFIX_0FE6, 1067 PREFIX_0FE7, 1068 PREFIX_0FF0, 1069 PREFIX_0FF7, 1070 PREFIX_0F38D8, 1071 PREFIX_0F38DC, 1072 PREFIX_0F38DD, 1073 PREFIX_0F38DE, 1074 PREFIX_0F38DF, 1075 PREFIX_0F38F0, 1076 PREFIX_0F38F1, 1077 PREFIX_0F38F6, 1078 PREFIX_0F38F8_M_0, 1079 PREFIX_0F38F8_M_1_X86_64, 1080 PREFIX_0F38FA, 1081 PREFIX_0F38FB, 1082 PREFIX_0F38FC, 1083 PREFIX_0F3A0F, 1084 PREFIX_VEX_0F12, 1085 PREFIX_VEX_0F16, 1086 PREFIX_VEX_0F2A, 1087 PREFIX_VEX_0F2C, 1088 PREFIX_VEX_0F2D, 1089 PREFIX_VEX_0F41_L_1_W_0, 1090 PREFIX_VEX_0F41_L_1_W_1, 1091 PREFIX_VEX_0F42_L_1_W_0, 1092 PREFIX_VEX_0F42_L_1_W_1, 1093 PREFIX_VEX_0F44_L_0_W_0, 1094 PREFIX_VEX_0F44_L_0_W_1, 1095 PREFIX_VEX_0F45_L_1_W_0, 1096 PREFIX_VEX_0F45_L_1_W_1, 1097 PREFIX_VEX_0F46_L_1_W_0, 1098 PREFIX_VEX_0F46_L_1_W_1, 1099 PREFIX_VEX_0F47_L_1_W_0, 1100 PREFIX_VEX_0F47_L_1_W_1, 1101 PREFIX_VEX_0F4A_L_1_W_0, 1102 PREFIX_VEX_0F4A_L_1_W_1, 1103 PREFIX_VEX_0F4B_L_1_W_0, 1104 PREFIX_VEX_0F4B_L_1_W_1, 1105 PREFIX_VEX_0F6F, 1106 PREFIX_VEX_0F70, 1107 PREFIX_VEX_0F7E, 1108 PREFIX_VEX_0F7F, 1109 PREFIX_VEX_0F90_L_0_W_0, 1110 PREFIX_VEX_0F90_L_0_W_1, 1111 PREFIX_VEX_0F91_L_0_W_0, 1112 PREFIX_VEX_0F91_L_0_W_1, 1113 PREFIX_VEX_0F92_L_0_W_0, 1114 PREFIX_VEX_0F92_L_0_W_1, 1115 PREFIX_VEX_0F93_L_0_W_0, 1116 PREFIX_VEX_0F93_L_0_W_1, 1117 PREFIX_VEX_0F98_L_0_W_0, 1118 PREFIX_VEX_0F98_L_0_W_1, 1119 PREFIX_VEX_0F99_L_0_W_0, 1120 PREFIX_VEX_0F99_L_0_W_1, 1121 PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_0, 1122 PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_1, 1123 PREFIX_VEX_0F384B_X86_64_L_0_W_0, 1124 PREFIX_VEX_0F3850_W_0, 1125 PREFIX_VEX_0F3851_W_0, 1126 PREFIX_VEX_0F385C_X86_64_L_0_W_0, 1127 PREFIX_VEX_0F385E_X86_64_L_0_W_0, 1128 PREFIX_VEX_0F386C_X86_64_L_0_W_0, 1129 PREFIX_VEX_0F3872, 1130 PREFIX_VEX_0F38B0_W_0, 1131 PREFIX_VEX_0F38B1_W_0, 1132 PREFIX_VEX_0F38D2_W_0, 1133 PREFIX_VEX_0F38D3_W_0, 1134 PREFIX_VEX_0F38CB, 1135 PREFIX_VEX_0F38CC, 1136 PREFIX_VEX_0F38CD, 1137 PREFIX_VEX_0F38DA_W_0, 1138 PREFIX_VEX_0F38F2_L_0, 1139 PREFIX_VEX_0F38F3_L_0, 1140 PREFIX_VEX_0F38F5_L_0, 1141 PREFIX_VEX_0F38F6_L_0, 1142 PREFIX_VEX_0F38F7_L_0, 1143 PREFIX_VEX_0F3AF0_L_0, 1144 PREFIX_VEX_MAP7_F8_L_0_W_0_R_0_X86_64, 1145 1146 PREFIX_EVEX_0F5B, 1147 PREFIX_EVEX_0F6F, 1148 PREFIX_EVEX_0F70, 1149 PREFIX_EVEX_0F78, 1150 PREFIX_EVEX_0F79, 1151 PREFIX_EVEX_0F7A, 1152 PREFIX_EVEX_0F7B, 1153 PREFIX_EVEX_0F7E, 1154 PREFIX_EVEX_0F7F, 1155 PREFIX_EVEX_0FC2, 1156 PREFIX_EVEX_0FE6, 1157 PREFIX_EVEX_0F3810, 1158 PREFIX_EVEX_0F3811, 1159 PREFIX_EVEX_0F3812, 1160 PREFIX_EVEX_0F3813, 1161 PREFIX_EVEX_0F3814, 1162 PREFIX_EVEX_0F3815, 1163 PREFIX_EVEX_0F3820, 1164 PREFIX_EVEX_0F3821, 1165 PREFIX_EVEX_0F3822, 1166 PREFIX_EVEX_0F3823, 1167 PREFIX_EVEX_0F3824, 1168 PREFIX_EVEX_0F3825, 1169 PREFIX_EVEX_0F3826, 1170 PREFIX_EVEX_0F3827, 1171 PREFIX_EVEX_0F3828, 1172 PREFIX_EVEX_0F3829, 1173 PREFIX_EVEX_0F382A, 1174 PREFIX_EVEX_0F3830, 1175 PREFIX_EVEX_0F3831, 1176 PREFIX_EVEX_0F3832, 1177 PREFIX_EVEX_0F3833, 1178 PREFIX_EVEX_0F3834, 1179 PREFIX_EVEX_0F3835, 1180 PREFIX_EVEX_0F3838, 1181 PREFIX_EVEX_0F3839, 1182 PREFIX_EVEX_0F383A, 1183 PREFIX_EVEX_0F3852, 1184 PREFIX_EVEX_0F3853, 1185 PREFIX_EVEX_0F3868, 1186 PREFIX_EVEX_0F3872, 1187 PREFIX_EVEX_0F389A, 1188 PREFIX_EVEX_0F389B, 1189 PREFIX_EVEX_0F38AA, 1190 PREFIX_EVEX_0F38AB, 1191 1192 PREFIX_EVEX_0F3A08, 1193 PREFIX_EVEX_0F3A0A, 1194 PREFIX_EVEX_0F3A26, 1195 PREFIX_EVEX_0F3A27, 1196 PREFIX_EVEX_0F3A56, 1197 PREFIX_EVEX_0F3A57, 1198 PREFIX_EVEX_0F3A66, 1199 PREFIX_EVEX_0F3A67, 1200 PREFIX_EVEX_0F3AC2, 1201 1202 PREFIX_EVEX_MAP4_40, 1203 PREFIX_EVEX_MAP4_41, 1204 PREFIX_EVEX_MAP4_42, 1205 PREFIX_EVEX_MAP4_43, 1206 PREFIX_EVEX_MAP4_44, 1207 PREFIX_EVEX_MAP4_45, 1208 PREFIX_EVEX_MAP4_46, 1209 PREFIX_EVEX_MAP4_47, 1210 PREFIX_EVEX_MAP4_48, 1211 PREFIX_EVEX_MAP4_49, 1212 PREFIX_EVEX_MAP4_4A, 1213 PREFIX_EVEX_MAP4_4B, 1214 PREFIX_EVEX_MAP4_4C, 1215 PREFIX_EVEX_MAP4_4D, 1216 PREFIX_EVEX_MAP4_4E, 1217 PREFIX_EVEX_MAP4_4F, 1218 PREFIX_EVEX_MAP4_F0, 1219 PREFIX_EVEX_MAP4_F1, 1220 PREFIX_EVEX_MAP4_F2, 1221 PREFIX_EVEX_MAP4_F8, 1222 1223 PREFIX_EVEX_MAP5_10, 1224 PREFIX_EVEX_MAP5_11, 1225 PREFIX_EVEX_MAP5_1D, 1226 PREFIX_EVEX_MAP5_2A, 1227 PREFIX_EVEX_MAP5_2C, 1228 PREFIX_EVEX_MAP5_2D, 1229 PREFIX_EVEX_MAP5_2E, 1230 PREFIX_EVEX_MAP5_2F, 1231 PREFIX_EVEX_MAP5_51, 1232 PREFIX_EVEX_MAP5_58, 1233 PREFIX_EVEX_MAP5_59, 1234 PREFIX_EVEX_MAP5_5A, 1235 PREFIX_EVEX_MAP5_5B, 1236 PREFIX_EVEX_MAP5_5C, 1237 PREFIX_EVEX_MAP5_5D, 1238 PREFIX_EVEX_MAP5_5E, 1239 PREFIX_EVEX_MAP5_5F, 1240 PREFIX_EVEX_MAP5_78, 1241 PREFIX_EVEX_MAP5_79, 1242 PREFIX_EVEX_MAP5_7A, 1243 PREFIX_EVEX_MAP5_7B, 1244 PREFIX_EVEX_MAP5_7C, 1245 PREFIX_EVEX_MAP5_7D, 1246 1247 PREFIX_EVEX_MAP6_13, 1248 PREFIX_EVEX_MAP6_56, 1249 PREFIX_EVEX_MAP6_57, 1250 PREFIX_EVEX_MAP6_D6, 1251 PREFIX_EVEX_MAP6_D7, 1252 }; 1253 1254 enum 1255 { 1256 X86_64_06 = 0, 1257 X86_64_07, 1258 X86_64_0E, 1259 X86_64_16, 1260 X86_64_17, 1261 X86_64_1E, 1262 X86_64_1F, 1263 X86_64_27, 1264 X86_64_2F, 1265 X86_64_37, 1266 X86_64_3F, 1267 X86_64_60, 1268 X86_64_61, 1269 X86_64_62, 1270 X86_64_63, 1271 X86_64_6D, 1272 X86_64_6F, 1273 X86_64_82, 1274 X86_64_9A, 1275 X86_64_C2, 1276 X86_64_C3, 1277 X86_64_C4, 1278 X86_64_C5, 1279 X86_64_CE, 1280 X86_64_D4, 1281 X86_64_D5, 1282 X86_64_E8, 1283 X86_64_E9, 1284 X86_64_EA, 1285 X86_64_0F00_REG_6, 1286 X86_64_0F01_REG_0, 1287 X86_64_0F01_REG_0_MOD_3_RM_6_P_1, 1288 X86_64_0F01_REG_0_MOD_3_RM_6_P_3, 1289 X86_64_0F01_REG_0_MOD_3_RM_7_P_0, 1290 X86_64_0F01_REG_1, 1291 X86_64_0F01_REG_1_RM_2_PREFIX_1, 1292 X86_64_0F01_REG_1_RM_2_PREFIX_3, 1293 X86_64_0F01_REG_1_RM_5_PREFIX_2, 1294 X86_64_0F01_REG_1_RM_6_PREFIX_2, 1295 X86_64_0F01_REG_1_RM_7_PREFIX_2, 1296 X86_64_0F01_REG_2, 1297 X86_64_0F01_REG_3, 1298 X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1, 1299 X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1, 1300 X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1, 1301 X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1, 1302 X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_1, 1303 X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1, 1304 X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3, 1305 X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1, 1306 X86_64_0F18_REG_6_MOD_0, 1307 X86_64_0F18_REG_7_MOD_0, 1308 X86_64_0F24, 1309 X86_64_0F26, 1310 X86_64_0F38F8_M_1, 1311 X86_64_0FC7_REG_6_MOD_3_PREFIX_1, 1312 1313 X86_64_VEX_0F3849, 1314 X86_64_VEX_0F384B, 1315 X86_64_VEX_0F385C, 1316 X86_64_VEX_0F385E, 1317 X86_64_VEX_0F386C, 1318 X86_64_VEX_0F38E0, 1319 X86_64_VEX_0F38E1, 1320 X86_64_VEX_0F38E2, 1321 X86_64_VEX_0F38E3, 1322 X86_64_VEX_0F38E4, 1323 X86_64_VEX_0F38E5, 1324 X86_64_VEX_0F38E6, 1325 X86_64_VEX_0F38E7, 1326 X86_64_VEX_0F38E8, 1327 X86_64_VEX_0F38E9, 1328 X86_64_VEX_0F38EA, 1329 X86_64_VEX_0F38EB, 1330 X86_64_VEX_0F38EC, 1331 X86_64_VEX_0F38ED, 1332 X86_64_VEX_0F38EE, 1333 X86_64_VEX_0F38EF, 1334 1335 X86_64_VEX_MAP7_F8_L_0_W_0_R_0, 1336 }; 1337 1338 enum 1339 { 1340 THREE_BYTE_0F38 = 0, 1341 THREE_BYTE_0F3A 1342 }; 1343 1344 enum 1345 { 1346 XOP_08 = 0, 1347 XOP_09, 1348 XOP_0A 1349 }; 1350 1351 enum 1352 { 1353 VEX_0F = 0, 1354 VEX_0F38, 1355 VEX_0F3A, 1356 VEX_MAP7, 1357 }; 1358 1359 enum 1360 { 1361 EVEX_0F = 0, 1362 EVEX_0F38, 1363 EVEX_0F3A, 1364 EVEX_MAP4, 1365 EVEX_MAP5, 1366 EVEX_MAP6, 1367 EVEX_MAP7, 1368 }; 1369 1370 enum 1371 { 1372 VEX_LEN_0F12_P_0 = 0, 1373 VEX_LEN_0F12_P_2, 1374 VEX_LEN_0F13, 1375 VEX_LEN_0F16_P_0, 1376 VEX_LEN_0F16_P_2, 1377 VEX_LEN_0F17, 1378 VEX_LEN_0F41, 1379 VEX_LEN_0F42, 1380 VEX_LEN_0F44, 1381 VEX_LEN_0F45, 1382 VEX_LEN_0F46, 1383 VEX_LEN_0F47, 1384 VEX_LEN_0F4A, 1385 VEX_LEN_0F4B, 1386 VEX_LEN_0F6E, 1387 VEX_LEN_0F77, 1388 VEX_LEN_0F7E_P_1, 1389 VEX_LEN_0F7E_P_2, 1390 VEX_LEN_0F90, 1391 VEX_LEN_0F91, 1392 VEX_LEN_0F92, 1393 VEX_LEN_0F93, 1394 VEX_LEN_0F98, 1395 VEX_LEN_0F99, 1396 VEX_LEN_0FAE_R_2, 1397 VEX_LEN_0FAE_R_3, 1398 VEX_LEN_0FC4, 1399 VEX_LEN_0FD6, 1400 VEX_LEN_0F3816, 1401 VEX_LEN_0F3819, 1402 VEX_LEN_0F381A, 1403 VEX_LEN_0F3836, 1404 VEX_LEN_0F3841, 1405 VEX_LEN_0F3849_X86_64, 1406 VEX_LEN_0F384B_X86_64, 1407 VEX_LEN_0F385A, 1408 VEX_LEN_0F385C_X86_64, 1409 VEX_LEN_0F385E_X86_64, 1410 VEX_LEN_0F386C_X86_64, 1411 VEX_LEN_0F38CB_P_3_W_0, 1412 VEX_LEN_0F38CC_P_3_W_0, 1413 VEX_LEN_0F38CD_P_3_W_0, 1414 VEX_LEN_0F38DA_W_0_P_0, 1415 VEX_LEN_0F38DA_W_0_P_2, 1416 VEX_LEN_0F38DB, 1417 VEX_LEN_0F38F2, 1418 VEX_LEN_0F38F3, 1419 VEX_LEN_0F38F5, 1420 VEX_LEN_0F38F6, 1421 VEX_LEN_0F38F7, 1422 VEX_LEN_0F3A00, 1423 VEX_LEN_0F3A01, 1424 VEX_LEN_0F3A06, 1425 VEX_LEN_0F3A14, 1426 VEX_LEN_0F3A15, 1427 VEX_LEN_0F3A16, 1428 VEX_LEN_0F3A17, 1429 VEX_LEN_0F3A18, 1430 VEX_LEN_0F3A19, 1431 VEX_LEN_0F3A20, 1432 VEX_LEN_0F3A21, 1433 VEX_LEN_0F3A22, 1434 VEX_LEN_0F3A30, 1435 VEX_LEN_0F3A31, 1436 VEX_LEN_0F3A32, 1437 VEX_LEN_0F3A33, 1438 VEX_LEN_0F3A38, 1439 VEX_LEN_0F3A39, 1440 VEX_LEN_0F3A41, 1441 VEX_LEN_0F3A46, 1442 VEX_LEN_0F3A60, 1443 VEX_LEN_0F3A61, 1444 VEX_LEN_0F3A62, 1445 VEX_LEN_0F3A63, 1446 VEX_LEN_0F3ADE_W_0, 1447 VEX_LEN_0F3ADF, 1448 VEX_LEN_0F3AF0, 1449 VEX_LEN_MAP7_F8, 1450 VEX_LEN_XOP_08_85, 1451 VEX_LEN_XOP_08_86, 1452 VEX_LEN_XOP_08_87, 1453 VEX_LEN_XOP_08_8E, 1454 VEX_LEN_XOP_08_8F, 1455 VEX_LEN_XOP_08_95, 1456 VEX_LEN_XOP_08_96, 1457 VEX_LEN_XOP_08_97, 1458 VEX_LEN_XOP_08_9E, 1459 VEX_LEN_XOP_08_9F, 1460 VEX_LEN_XOP_08_A3, 1461 VEX_LEN_XOP_08_A6, 1462 VEX_LEN_XOP_08_B6, 1463 VEX_LEN_XOP_08_C0, 1464 VEX_LEN_XOP_08_C1, 1465 VEX_LEN_XOP_08_C2, 1466 VEX_LEN_XOP_08_C3, 1467 VEX_LEN_XOP_08_CC, 1468 VEX_LEN_XOP_08_CD, 1469 VEX_LEN_XOP_08_CE, 1470 VEX_LEN_XOP_08_CF, 1471 VEX_LEN_XOP_08_EC, 1472 VEX_LEN_XOP_08_ED, 1473 VEX_LEN_XOP_08_EE, 1474 VEX_LEN_XOP_08_EF, 1475 VEX_LEN_XOP_09_01, 1476 VEX_LEN_XOP_09_02, 1477 VEX_LEN_XOP_09_12, 1478 VEX_LEN_XOP_09_82_W_0, 1479 VEX_LEN_XOP_09_83_W_0, 1480 VEX_LEN_XOP_09_90, 1481 VEX_LEN_XOP_09_91, 1482 VEX_LEN_XOP_09_92, 1483 VEX_LEN_XOP_09_93, 1484 VEX_LEN_XOP_09_94, 1485 VEX_LEN_XOP_09_95, 1486 VEX_LEN_XOP_09_96, 1487 VEX_LEN_XOP_09_97, 1488 VEX_LEN_XOP_09_98, 1489 VEX_LEN_XOP_09_99, 1490 VEX_LEN_XOP_09_9A, 1491 VEX_LEN_XOP_09_9B, 1492 VEX_LEN_XOP_09_C1, 1493 VEX_LEN_XOP_09_C2, 1494 VEX_LEN_XOP_09_C3, 1495 VEX_LEN_XOP_09_C6, 1496 VEX_LEN_XOP_09_C7, 1497 VEX_LEN_XOP_09_CB, 1498 VEX_LEN_XOP_09_D1, 1499 VEX_LEN_XOP_09_D2, 1500 VEX_LEN_XOP_09_D3, 1501 VEX_LEN_XOP_09_D6, 1502 VEX_LEN_XOP_09_D7, 1503 VEX_LEN_XOP_09_DB, 1504 VEX_LEN_XOP_09_E1, 1505 VEX_LEN_XOP_09_E2, 1506 VEX_LEN_XOP_09_E3, 1507 VEX_LEN_XOP_0A_12, 1508 }; 1509 1510 enum 1511 { 1512 EVEX_LEN_0F3816 = 0, 1513 EVEX_LEN_0F3819, 1514 EVEX_LEN_0F381A, 1515 EVEX_LEN_0F381B, 1516 EVEX_LEN_0F3836, 1517 EVEX_LEN_0F385A, 1518 EVEX_LEN_0F385B, 1519 EVEX_LEN_0F38C6, 1520 EVEX_LEN_0F38C7, 1521 EVEX_LEN_0F3A00, 1522 EVEX_LEN_0F3A01, 1523 EVEX_LEN_0F3A18, 1524 EVEX_LEN_0F3A19, 1525 EVEX_LEN_0F3A1A, 1526 EVEX_LEN_0F3A1B, 1527 EVEX_LEN_0F3A23, 1528 EVEX_LEN_0F3A38, 1529 EVEX_LEN_0F3A39, 1530 EVEX_LEN_0F3A3A, 1531 EVEX_LEN_0F3A3B, 1532 EVEX_LEN_0F3A43 1533 }; 1534 1535 enum 1536 { 1537 VEX_W_0F41_L_1 = 0, 1538 VEX_W_0F42_L_1, 1539 VEX_W_0F44_L_0, 1540 VEX_W_0F45_L_1, 1541 VEX_W_0F46_L_1, 1542 VEX_W_0F47_L_1, 1543 VEX_W_0F4A_L_1, 1544 VEX_W_0F4B_L_1, 1545 VEX_W_0F90_L_0, 1546 VEX_W_0F91_L_0, 1547 VEX_W_0F92_L_0, 1548 VEX_W_0F93_L_0, 1549 VEX_W_0F98_L_0, 1550 VEX_W_0F99_L_0, 1551 VEX_W_0F380C, 1552 VEX_W_0F380D, 1553 VEX_W_0F380E, 1554 VEX_W_0F380F, 1555 VEX_W_0F3813, 1556 VEX_W_0F3816_L_1, 1557 VEX_W_0F3818, 1558 VEX_W_0F3819_L_1, 1559 VEX_W_0F381A_L_1, 1560 VEX_W_0F382C, 1561 VEX_W_0F382D, 1562 VEX_W_0F382E, 1563 VEX_W_0F382F, 1564 VEX_W_0F3836, 1565 VEX_W_0F3846, 1566 VEX_W_0F3849_X86_64_L_0, 1567 VEX_W_0F384B_X86_64_L_0, 1568 VEX_W_0F3850, 1569 VEX_W_0F3851, 1570 VEX_W_0F3852, 1571 VEX_W_0F3853, 1572 VEX_W_0F3858, 1573 VEX_W_0F3859, 1574 VEX_W_0F385A_L_0, 1575 VEX_W_0F385C_X86_64_L_0, 1576 VEX_W_0F385E_X86_64_L_0, 1577 VEX_W_0F386C_X86_64_L_0, 1578 VEX_W_0F3872_P_1, 1579 VEX_W_0F3878, 1580 VEX_W_0F3879, 1581 VEX_W_0F38B0, 1582 VEX_W_0F38B1, 1583 VEX_W_0F38B4, 1584 VEX_W_0F38B5, 1585 VEX_W_0F38CB_P_3, 1586 VEX_W_0F38CC_P_3, 1587 VEX_W_0F38CD_P_3, 1588 VEX_W_0F38CF, 1589 VEX_W_0F38D2, 1590 VEX_W_0F38D3, 1591 VEX_W_0F38DA, 1592 VEX_W_0F3A00_L_1, 1593 VEX_W_0F3A01_L_1, 1594 VEX_W_0F3A02, 1595 VEX_W_0F3A04, 1596 VEX_W_0F3A05, 1597 VEX_W_0F3A06_L_1, 1598 VEX_W_0F3A18_L_1, 1599 VEX_W_0F3A19_L_1, 1600 VEX_W_0F3A1D, 1601 VEX_W_0F3A38_L_1, 1602 VEX_W_0F3A39_L_1, 1603 VEX_W_0F3A46_L_1, 1604 VEX_W_0F3A4A, 1605 VEX_W_0F3A4B, 1606 VEX_W_0F3A4C, 1607 VEX_W_0F3ACE, 1608 VEX_W_0F3ACF, 1609 VEX_W_0F3ADE, 1610 VEX_W_MAP7_F8_L_0, 1611 1612 VEX_W_XOP_08_85_L_0, 1613 VEX_W_XOP_08_86_L_0, 1614 VEX_W_XOP_08_87_L_0, 1615 VEX_W_XOP_08_8E_L_0, 1616 VEX_W_XOP_08_8F_L_0, 1617 VEX_W_XOP_08_95_L_0, 1618 VEX_W_XOP_08_96_L_0, 1619 VEX_W_XOP_08_97_L_0, 1620 VEX_W_XOP_08_9E_L_0, 1621 VEX_W_XOP_08_9F_L_0, 1622 VEX_W_XOP_08_A6_L_0, 1623 VEX_W_XOP_08_B6_L_0, 1624 VEX_W_XOP_08_C0_L_0, 1625 VEX_W_XOP_08_C1_L_0, 1626 VEX_W_XOP_08_C2_L_0, 1627 VEX_W_XOP_08_C3_L_0, 1628 VEX_W_XOP_08_CC_L_0, 1629 VEX_W_XOP_08_CD_L_0, 1630 VEX_W_XOP_08_CE_L_0, 1631 VEX_W_XOP_08_CF_L_0, 1632 VEX_W_XOP_08_EC_L_0, 1633 VEX_W_XOP_08_ED_L_0, 1634 VEX_W_XOP_08_EE_L_0, 1635 VEX_W_XOP_08_EF_L_0, 1636 1637 VEX_W_XOP_09_80, 1638 VEX_W_XOP_09_81, 1639 VEX_W_XOP_09_82, 1640 VEX_W_XOP_09_83, 1641 VEX_W_XOP_09_C1_L_0, 1642 VEX_W_XOP_09_C2_L_0, 1643 VEX_W_XOP_09_C3_L_0, 1644 VEX_W_XOP_09_C6_L_0, 1645 VEX_W_XOP_09_C7_L_0, 1646 VEX_W_XOP_09_CB_L_0, 1647 VEX_W_XOP_09_D1_L_0, 1648 VEX_W_XOP_09_D2_L_0, 1649 VEX_W_XOP_09_D3_L_0, 1650 VEX_W_XOP_09_D6_L_0, 1651 VEX_W_XOP_09_D7_L_0, 1652 VEX_W_XOP_09_DB_L_0, 1653 VEX_W_XOP_09_E1_L_0, 1654 VEX_W_XOP_09_E2_L_0, 1655 VEX_W_XOP_09_E3_L_0, 1656 1657 EVEX_W_0F5B_P_0, 1658 EVEX_W_0F62, 1659 EVEX_W_0F66, 1660 EVEX_W_0F6A, 1661 EVEX_W_0F6B, 1662 EVEX_W_0F6C, 1663 EVEX_W_0F6D, 1664 EVEX_W_0F6F_P_1, 1665 EVEX_W_0F6F_P_2, 1666 EVEX_W_0F6F_P_3, 1667 EVEX_W_0F70_P_2, 1668 EVEX_W_0F72_R_2, 1669 EVEX_W_0F72_R_6, 1670 EVEX_W_0F73_R_2, 1671 EVEX_W_0F73_R_6, 1672 EVEX_W_0F76, 1673 EVEX_W_0F78_P_0, 1674 EVEX_W_0F78_P_2, 1675 EVEX_W_0F79_P_0, 1676 EVEX_W_0F79_P_2, 1677 EVEX_W_0F7A_P_1, 1678 EVEX_W_0F7A_P_2, 1679 EVEX_W_0F7A_P_3, 1680 EVEX_W_0F7B_P_2, 1681 EVEX_W_0F7E_P_1, 1682 EVEX_W_0F7F_P_1, 1683 EVEX_W_0F7F_P_2, 1684 EVEX_W_0F7F_P_3, 1685 EVEX_W_0FD2, 1686 EVEX_W_0FD3, 1687 EVEX_W_0FD4, 1688 EVEX_W_0FD6, 1689 EVEX_W_0FE6_P_1, 1690 EVEX_W_0FE7, 1691 EVEX_W_0FF2, 1692 EVEX_W_0FF3, 1693 EVEX_W_0FF4, 1694 EVEX_W_0FFA, 1695 EVEX_W_0FFB, 1696 EVEX_W_0FFE, 1697 1698 EVEX_W_0F3810_P_1, 1699 EVEX_W_0F3810_P_2, 1700 EVEX_W_0F3811_P_1, 1701 EVEX_W_0F3811_P_2, 1702 EVEX_W_0F3812_P_1, 1703 EVEX_W_0F3812_P_2, 1704 EVEX_W_0F3813_P_1, 1705 EVEX_W_0F3814_P_1, 1706 EVEX_W_0F3815_P_1, 1707 EVEX_W_0F3819_L_n, 1708 EVEX_W_0F381A_L_n, 1709 EVEX_W_0F381B_L_2, 1710 EVEX_W_0F381E, 1711 EVEX_W_0F381F, 1712 EVEX_W_0F3820_P_1, 1713 EVEX_W_0F3821_P_1, 1714 EVEX_W_0F3822_P_1, 1715 EVEX_W_0F3823_P_1, 1716 EVEX_W_0F3824_P_1, 1717 EVEX_W_0F3825_P_1, 1718 EVEX_W_0F3825_P_2, 1719 EVEX_W_0F3828_P_2, 1720 EVEX_W_0F3829_P_2, 1721 EVEX_W_0F382A_P_1, 1722 EVEX_W_0F382A_P_2, 1723 EVEX_W_0F382B, 1724 EVEX_W_0F3830_P_1, 1725 EVEX_W_0F3831_P_1, 1726 EVEX_W_0F3832_P_1, 1727 EVEX_W_0F3833_P_1, 1728 EVEX_W_0F3834_P_1, 1729 EVEX_W_0F3835_P_1, 1730 EVEX_W_0F3835_P_2, 1731 EVEX_W_0F3837, 1732 EVEX_W_0F383A_P_1, 1733 EVEX_W_0F3859, 1734 EVEX_W_0F385A_L_n, 1735 EVEX_W_0F385B_L_2, 1736 EVEX_W_0F3870, 1737 EVEX_W_0F3872_P_2, 1738 EVEX_W_0F387A, 1739 EVEX_W_0F387B, 1740 EVEX_W_0F3883, 1741 1742 EVEX_W_0F3A18_L_n, 1743 EVEX_W_0F3A19_L_n, 1744 EVEX_W_0F3A1A_L_2, 1745 EVEX_W_0F3A1B_L_2, 1746 EVEX_W_0F3A21, 1747 EVEX_W_0F3A23_L_n, 1748 EVEX_W_0F3A38_L_n, 1749 EVEX_W_0F3A39_L_n, 1750 EVEX_W_0F3A3A_L_2, 1751 EVEX_W_0F3A3B_L_2, 1752 EVEX_W_0F3A42, 1753 EVEX_W_0F3A43_L_n, 1754 EVEX_W_0F3A70, 1755 EVEX_W_0F3A72, 1756 1757 EVEX_W_MAP4_8F_R_0, 1758 EVEX_W_MAP4_F8_P1_M_1, 1759 EVEX_W_MAP4_F8_P3_M_1, 1760 EVEX_W_MAP4_FF_R_6, 1761 1762 EVEX_W_MAP5_5B_P_0, 1763 EVEX_W_MAP5_7A_P_3, 1764 }; 1765 1766 typedef bool (*op_rtn) (instr_info *ins, int bytemode, int sizeflag); 1767 1768 struct dis386 { 1769 const char *name; 1770 struct 1771 { 1772 op_rtn rtn; 1773 int bytemode; 1774 } op[MAX_OPERANDS]; 1775 unsigned int prefix_requirement; 1776 }; 1777 1778 /* Upper case letters in the instruction names here are macros. 1779 'A' => print 'b' if no (suitable) register operand or suffix_always is true 1780 'B' => print 'b' if suffix_always is true 1781 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand 1782 size prefix 1783 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if 1784 suffix_always is true 1785 'E' => print 'e' if 32-bit form of jcxz 1786 'F' => print 'w' or 'l' depending on address size prefix (loop insns) 1787 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns) 1788 'H' => print ",pt" or ",pn" branch hint 1789 'I' unused. 1790 'J' unused. 1791 'K' => print 'd' or 'q' if rex prefix is present. 1792 'L' => print 'l' or 'q' if suffix_always is true 1793 'M' => print 'r' if intel_mnemonic is false. 1794 'N' => print 'n' if instruction has no wait "prefix" 1795 'O' => print 'd' or 'o' (or 'q' in Intel mode) 1796 'P' => behave as 'T' except with register operand outside of suffix_always 1797 mode 1798 'Q' => print 'w', 'l' or 'q' if no (suitable) register operand or 1799 suffix_always is true 1800 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode) 1801 'S' => print 'w', 'l' or 'q' if suffix_always is true 1802 'T' => print 'w', 'l'/'d', or 'q' if instruction has an operand size 1803 prefix or if suffix_always is true. 1804 'U' unused. 1805 'V' => print 'v' for VEX/EVEX and nothing for legacy encodings. 1806 'W' => print 'b', 'w' or 'l' ('d' in Intel mode) 1807 'X' => print 's', 'd' depending on data16 prefix (for XMM) 1808 'Y' => no output, mark EVEX.aaa != 0 as bad. 1809 'Z' => print 'q' in 64bit mode and 'l' otherwise, if suffix_always is true. 1810 '!' => change condition from true to false or from false to true. 1811 '%' => add 1 upper case letter to the macro. 1812 '^' => print 'w', 'l', or 'q' (Intel64 ISA only) depending on operand size 1813 prefix or suffix_always is true (lcall/ljmp). 1814 '@' => in 64bit mode for Intel64 ISA or if instruction 1815 has no operand sizing prefix, print 'q' if suffix_always is true or 1816 nothing otherwise; behave as 'P' in all other cases 1817 1818 2 upper case letter macros: 1819 "XY" => print 'x' or 'y' if suffix_always is true or no register 1820 operands and no broadcast. 1821 "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no 1822 register operands and no broadcast. 1823 "XW" => print 's', 'd' depending on the VEX.W bit (for FMA) 1824 "XD" => print 'd' if !EVEX or EVEX.W=1, EVEX.W=0 is not a valid encoding 1825 "XH" => print 'h' if EVEX.W=0, EVEX.W=1 is not a valid encoding (for FP16) 1826 "XS" => print 's' if !EVEX or EVEX.W=0, EVEX.W=1 is not a valid encoding 1827 "XV" => print "{vex} " pseudo prefix 1828 "XE" => print "{evex} " pseudo prefix if no EVEX-specific functionality is 1829 is used by an EVEX-encoded (AVX512VL) instruction. 1830 "ME" => print "{evex} " pseudo prefix for ins->modrm.mod != 3,if no 1831 EVEX-specific functionality is used by an EVEX-encoded (AVX512VL) 1832 instruction. 1833 "NF" => print "{nf} " pseudo prefix when EVEX.NF = 1 and print "{evex} " 1834 pseudo prefix when instructions without NF, EGPR and VVVV, 1835 "ZU" => print 'zu' if EVEX.ZU=1. 1836 "YK" keep unused, to avoid ambiguity with the combined use of Y and K. 1837 "YX" keep unused, to avoid ambiguity with the combined use of Y and X. 1838 "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand, cond 1839 being false, or no operand at all in 64bit mode, or if suffix_always 1840 is true. 1841 "LB" => print "abs" in 64bit mode and behave as 'B' otherwise 1842 "LS" => print "abs" in 64bit mode and behave as 'S' otherwise 1843 "LV" => print "abs" for 64bit operand and behave as 'S' otherwise 1844 "DQ" => print 'd' or 'q' depending on the VEX.W bit 1845 "BW" => print 'b' or 'w' depending on the VEX.W bit 1846 "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has 1847 an operand size prefix, or suffix_always is true. print 1848 'q' if rex prefix is present. 1849 1850 Many of the above letters print nothing in Intel mode. See "putop" 1851 for the details. 1852 1853 Braces '{' and '}', and vertical bars '|', indicate alternative 1854 mnemonic strings for AT&T and Intel. */ 1855 1856 static const struct dis386 dis386[] = { 1857 /* 00 */ 1858 { "addB", { Ebh1, Gb }, 0 }, 1859 { "addS", { Evh1, Gv }, 0 }, 1860 { "addB", { Gb, EbS }, 0 }, 1861 { "addS", { Gv, EvS }, 0 }, 1862 { "addB", { AL, Ib }, 0 }, 1863 { "addS", { eAX, Iv }, 0 }, 1864 { X86_64_TABLE (X86_64_06) }, 1865 { X86_64_TABLE (X86_64_07) }, 1866 /* 08 */ 1867 { "orB", { Ebh1, Gb }, 0 }, 1868 { "orS", { Evh1, Gv }, 0 }, 1869 { "orB", { Gb, EbS }, 0 }, 1870 { "orS", { Gv, EvS }, 0 }, 1871 { "orB", { AL, Ib }, 0 }, 1872 { "orS", { eAX, Iv }, 0 }, 1873 { X86_64_TABLE (X86_64_0E) }, 1874 { Bad_Opcode }, /* 0x0f extended opcode escape */ 1875 /* 10 */ 1876 { "adcB", { Ebh1, Gb }, 0 }, 1877 { "adcS", { Evh1, Gv }, 0 }, 1878 { "adcB", { Gb, EbS }, 0 }, 1879 { "adcS", { Gv, EvS }, 0 }, 1880 { "adcB", { AL, Ib }, 0 }, 1881 { "adcS", { eAX, Iv }, 0 }, 1882 { X86_64_TABLE (X86_64_16) }, 1883 { X86_64_TABLE (X86_64_17) }, 1884 /* 18 */ 1885 { "sbbB", { Ebh1, Gb }, 0 }, 1886 { "sbbS", { Evh1, Gv }, 0 }, 1887 { "sbbB", { Gb, EbS }, 0 }, 1888 { "sbbS", { Gv, EvS }, 0 }, 1889 { "sbbB", { AL, Ib }, 0 }, 1890 { "sbbS", { eAX, Iv }, 0 }, 1891 { X86_64_TABLE (X86_64_1E) }, 1892 { X86_64_TABLE (X86_64_1F) }, 1893 /* 20 */ 1894 { "andB", { Ebh1, Gb }, 0 }, 1895 { "andS", { Evh1, Gv }, 0 }, 1896 { "andB", { Gb, EbS }, 0 }, 1897 { "andS", { Gv, EvS }, 0 }, 1898 { "andB", { AL, Ib }, 0 }, 1899 { "andS", { eAX, Iv }, 0 }, 1900 { Bad_Opcode }, /* SEG ES prefix */ 1901 { X86_64_TABLE (X86_64_27) }, 1902 /* 28 */ 1903 { "subB", { Ebh1, Gb }, 0 }, 1904 { "subS", { Evh1, Gv }, 0 }, 1905 { "subB", { Gb, EbS }, 0 }, 1906 { "subS", { Gv, EvS }, 0 }, 1907 { "subB", { AL, Ib }, 0 }, 1908 { "subS", { eAX, Iv }, 0 }, 1909 { Bad_Opcode }, /* SEG CS prefix */ 1910 { X86_64_TABLE (X86_64_2F) }, 1911 /* 30 */ 1912 { "xorB", { Ebh1, Gb }, 0 }, 1913 { "xorS", { Evh1, Gv }, 0 }, 1914 { "xorB", { Gb, EbS }, 0 }, 1915 { "xorS", { Gv, EvS }, 0 }, 1916 { "xorB", { AL, Ib }, 0 }, 1917 { "xorS", { eAX, Iv }, 0 }, 1918 { Bad_Opcode }, /* SEG SS prefix */ 1919 { X86_64_TABLE (X86_64_37) }, 1920 /* 38 */ 1921 { "cmpB", { Eb, Gb }, 0 }, 1922 { "cmpS", { Ev, Gv }, 0 }, 1923 { "cmpB", { Gb, EbS }, 0 }, 1924 { "cmpS", { Gv, EvS }, 0 }, 1925 { "cmpB", { AL, Ib }, 0 }, 1926 { "cmpS", { eAX, Iv }, 0 }, 1927 { Bad_Opcode }, /* SEG DS prefix */ 1928 { X86_64_TABLE (X86_64_3F) }, 1929 /* 40 */ 1930 { "inc{S|}", { RMeAX }, 0 }, 1931 { "inc{S|}", { RMeCX }, 0 }, 1932 { "inc{S|}", { RMeDX }, 0 }, 1933 { "inc{S|}", { RMeBX }, 0 }, 1934 { "inc{S|}", { RMeSP }, 0 }, 1935 { "inc{S|}", { RMeBP }, 0 }, 1936 { "inc{S|}", { RMeSI }, 0 }, 1937 { "inc{S|}", { RMeDI }, 0 }, 1938 /* 48 */ 1939 { "dec{S|}", { RMeAX }, 0 }, 1940 { "dec{S|}", { RMeCX }, 0 }, 1941 { "dec{S|}", { RMeDX }, 0 }, 1942 { "dec{S|}", { RMeBX }, 0 }, 1943 { "dec{S|}", { RMeSP }, 0 }, 1944 { "dec{S|}", { RMeBP }, 0 }, 1945 { "dec{S|}", { RMeSI }, 0 }, 1946 { "dec{S|}", { RMeDI }, 0 }, 1947 /* 50 */ 1948 { "push!P", { RMrAX }, 0 }, 1949 { "push!P", { RMrCX }, 0 }, 1950 { "push!P", { RMrDX }, 0 }, 1951 { "push!P", { RMrBX }, 0 }, 1952 { "push!P", { RMrSP }, 0 }, 1953 { "push!P", { RMrBP }, 0 }, 1954 { "push!P", { RMrSI }, 0 }, 1955 { "push!P", { RMrDI }, 0 }, 1956 /* 58 */ 1957 { "pop!P", { RMrAX }, 0 }, 1958 { "pop!P", { RMrCX }, 0 }, 1959 { "pop!P", { RMrDX }, 0 }, 1960 { "pop!P", { RMrBX }, 0 }, 1961 { "pop!P", { RMrSP }, 0 }, 1962 { "pop!P", { RMrBP }, 0 }, 1963 { "pop!P", { RMrSI }, 0 }, 1964 { "pop!P", { RMrDI }, 0 }, 1965 /* 60 */ 1966 { X86_64_TABLE (X86_64_60) }, 1967 { X86_64_TABLE (X86_64_61) }, 1968 { X86_64_TABLE (X86_64_62) }, 1969 { X86_64_TABLE (X86_64_63) }, 1970 { Bad_Opcode }, /* seg fs */ 1971 { Bad_Opcode }, /* seg gs */ 1972 { Bad_Opcode }, /* op size prefix */ 1973 { Bad_Opcode }, /* adr size prefix */ 1974 /* 68 */ 1975 { "pushP", { sIv }, 0 }, 1976 { "imulS", { Gv, Ev, Iv }, 0 }, 1977 { "pushP", { sIbT }, 0 }, 1978 { "imulS", { Gv, Ev, sIb }, 0 }, 1979 { "ins{b|}", { Ybr, indirDX }, 0 }, 1980 { X86_64_TABLE (X86_64_6D) }, 1981 { "outs{b|}", { indirDXr, Xb }, 0 }, 1982 { X86_64_TABLE (X86_64_6F) }, 1983 /* 70 */ 1984 { "joH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, 1985 { "jnoH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, 1986 { "jbH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, 1987 { "jaeH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, 1988 { "jeH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, 1989 { "jneH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, 1990 { "jbeH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, 1991 { "jaH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, 1992 /* 78 */ 1993 { "jsH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, 1994 { "jnsH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, 1995 { "jpH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, 1996 { "jnpH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, 1997 { "jlH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, 1998 { "jgeH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, 1999 { "jleH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, 2000 { "jgH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, 2001 /* 80 */ 2002 { REG_TABLE (REG_80) }, 2003 { REG_TABLE (REG_81) }, 2004 { X86_64_TABLE (X86_64_82) }, 2005 { REG_TABLE (REG_83) }, 2006 { "testB", { Eb, Gb }, 0 }, 2007 { "testS", { Ev, Gv }, 0 }, 2008 { "xchgB", { Ebh2, Gb }, 0 }, 2009 { "xchgS", { Evh2, Gv }, 0 }, 2010 /* 88 */ 2011 { "movB", { Ebh3, Gb }, 0 }, 2012 { "movS", { Evh3, Gv }, 0 }, 2013 { "movB", { Gb, EbS }, 0 }, 2014 { "movS", { Gv, EvS }, 0 }, 2015 { "movD", { Sv, Sw }, 0 }, 2016 { "leaS", { Gv, M }, 0 }, 2017 { "movD", { Sw, Sv }, 0 }, 2018 { REG_TABLE (REG_8F) }, 2019 /* 90 */ 2020 { PREFIX_TABLE (PREFIX_90) }, 2021 { "xchgS", { RMeCX, eAX }, 0 }, 2022 { "xchgS", { RMeDX, eAX }, 0 }, 2023 { "xchgS", { RMeBX, eAX }, 0 }, 2024 { "xchgS", { RMeSP, eAX }, 0 }, 2025 { "xchgS", { RMeBP, eAX }, 0 }, 2026 { "xchgS", { RMeSI, eAX }, 0 }, 2027 { "xchgS", { RMeDI, eAX }, 0 }, 2028 /* 98 */ 2029 { "cW{t|}R", { XX }, 0 }, 2030 { "cR{t|}O", { XX }, 0 }, 2031 { X86_64_TABLE (X86_64_9A) }, 2032 { Bad_Opcode }, /* fwait */ 2033 { "pushfP", { XX }, 0 }, 2034 { "popfP", { XX }, 0 }, 2035 { "sahf", { XX }, 0 }, 2036 { "lahf", { XX }, 0 }, 2037 /* a0 */ 2038 { "mov%LB", { AL, Ob }, PREFIX_REX2_ILLEGAL }, 2039 { "mov%LS", { { JMPABS_Fixup, eAX_reg }, { JMPABS_Fixup, v_mode } }, PREFIX_REX2_ILLEGAL }, 2040 { "mov%LB", { Ob, AL }, PREFIX_REX2_ILLEGAL }, 2041 { "mov%LS", { Ov, eAX }, PREFIX_REX2_ILLEGAL }, 2042 { "movs{b|}", { Ybr, Xb }, PREFIX_REX2_ILLEGAL }, 2043 { "movs{R|}", { Yvr, Xv }, PREFIX_REX2_ILLEGAL }, 2044 { "cmps{b|}", { Xb, Yb }, PREFIX_REX2_ILLEGAL }, 2045 { "cmps{R|}", { Xv, Yv }, PREFIX_REX2_ILLEGAL }, 2046 /* a8 */ 2047 { "testB", { AL, Ib }, PREFIX_REX2_ILLEGAL }, 2048 { "testS", { eAX, Iv }, PREFIX_REX2_ILLEGAL }, 2049 { "stosB", { Ybr, AL }, PREFIX_REX2_ILLEGAL }, 2050 { "stosS", { Yvr, eAX }, PREFIX_REX2_ILLEGAL }, 2051 { "lodsB", { ALr, Xb }, PREFIX_REX2_ILLEGAL }, 2052 { "lodsS", { eAXr, Xv }, PREFIX_REX2_ILLEGAL }, 2053 { "scasB", { AL, Yb }, PREFIX_REX2_ILLEGAL }, 2054 { "scasS", { eAX, Yv }, PREFIX_REX2_ILLEGAL }, 2055 /* b0 */ 2056 { "movB", { RMAL, Ib }, 0 }, 2057 { "movB", { RMCL, Ib }, 0 }, 2058 { "movB", { RMDL, Ib }, 0 }, 2059 { "movB", { RMBL, Ib }, 0 }, 2060 { "movB", { RMAH, Ib }, 0 }, 2061 { "movB", { RMCH, Ib }, 0 }, 2062 { "movB", { RMDH, Ib }, 0 }, 2063 { "movB", { RMBH, Ib }, 0 }, 2064 /* b8 */ 2065 { "mov%LV", { RMeAX, Iv64 }, 0 }, 2066 { "mov%LV", { RMeCX, Iv64 }, 0 }, 2067 { "mov%LV", { RMeDX, Iv64 }, 0 }, 2068 { "mov%LV", { RMeBX, Iv64 }, 0 }, 2069 { "mov%LV", { RMeSP, Iv64 }, 0 }, 2070 { "mov%LV", { RMeBP, Iv64 }, 0 }, 2071 { "mov%LV", { RMeSI, Iv64 }, 0 }, 2072 { "mov%LV", { RMeDI, Iv64 }, 0 }, 2073 /* c0 */ 2074 { REG_TABLE (REG_C0) }, 2075 { REG_TABLE (REG_C1) }, 2076 { X86_64_TABLE (X86_64_C2) }, 2077 { X86_64_TABLE (X86_64_C3) }, 2078 { X86_64_TABLE (X86_64_C4) }, 2079 { X86_64_TABLE (X86_64_C5) }, 2080 { REG_TABLE (REG_C6) }, 2081 { REG_TABLE (REG_C7) }, 2082 /* c8 */ 2083 { "enterP", { Iw, Ib }, 0 }, 2084 { "leaveP", { XX }, 0 }, 2085 { "{l|}ret{|f}%LP", { Iw }, 0 }, 2086 { "{l|}ret{|f}%LP", { XX }, 0 }, 2087 { "int3", { XX }, 0 }, 2088 { "int", { Ib }, 0 }, 2089 { X86_64_TABLE (X86_64_CE) }, 2090 { "iret%LP", { XX }, 0 }, 2091 /* d0 */ 2092 { REG_TABLE (REG_D0) }, 2093 { REG_TABLE (REG_D1) }, 2094 { REG_TABLE (REG_D2) }, 2095 { REG_TABLE (REG_D3) }, 2096 { X86_64_TABLE (X86_64_D4) }, 2097 { X86_64_TABLE (X86_64_D5) }, 2098 { Bad_Opcode }, 2099 { "xlat", { DSBX }, 0 }, 2100 /* d8 */ 2101 { FLOAT }, 2102 { FLOAT }, 2103 { FLOAT }, 2104 { FLOAT }, 2105 { FLOAT }, 2106 { FLOAT }, 2107 { FLOAT }, 2108 { FLOAT }, 2109 /* e0 */ 2110 { "loopneFH", { Jb, XX, loop_jcxz_flag }, PREFIX_REX2_ILLEGAL }, 2111 { "loopeFH", { Jb, XX, loop_jcxz_flag }, PREFIX_REX2_ILLEGAL }, 2112 { "loopFH", { Jb, XX, loop_jcxz_flag }, PREFIX_REX2_ILLEGAL }, 2113 { "jEcxzH", { Jb, XX, loop_jcxz_flag }, PREFIX_REX2_ILLEGAL }, 2114 { "inB", { AL, Ib }, PREFIX_REX2_ILLEGAL }, 2115 { "inG", { zAX, Ib }, PREFIX_REX2_ILLEGAL }, 2116 { "outB", { Ib, AL }, PREFIX_REX2_ILLEGAL }, 2117 { "outG", { Ib, zAX }, PREFIX_REX2_ILLEGAL }, 2118 /* e8 */ 2119 { X86_64_TABLE (X86_64_E8) }, 2120 { X86_64_TABLE (X86_64_E9) }, 2121 { X86_64_TABLE (X86_64_EA) }, 2122 { "jmp", { Jb, BND }, PREFIX_REX2_ILLEGAL }, 2123 { "inB", { AL, indirDX }, PREFIX_REX2_ILLEGAL }, 2124 { "inG", { zAX, indirDX }, PREFIX_REX2_ILLEGAL }, 2125 { "outB", { indirDX, AL }, PREFIX_REX2_ILLEGAL }, 2126 { "outG", { indirDX, zAX }, PREFIX_REX2_ILLEGAL }, 2127 /* f0 */ 2128 { Bad_Opcode }, /* lock prefix */ 2129 { "int1", { XX }, 0 }, 2130 { Bad_Opcode }, /* repne */ 2131 { Bad_Opcode }, /* repz */ 2132 { "hlt", { XX }, 0 }, 2133 { "cmc", { XX }, 0 }, 2134 { REG_TABLE (REG_F6) }, 2135 { REG_TABLE (REG_F7) }, 2136 /* f8 */ 2137 { "clc", { XX }, 0 }, 2138 { "stc", { XX }, 0 }, 2139 { "cli", { XX }, 0 }, 2140 { "sti", { XX }, 0 }, 2141 { "cld", { XX }, 0 }, 2142 { "std", { XX }, 0 }, 2143 { REG_TABLE (REG_FE) }, 2144 { REG_TABLE (REG_FF) }, 2145 }; 2146 2147 static const struct dis386 dis386_twobyte[] = { 2148 /* 00 */ 2149 { REG_TABLE (REG_0F00 ) }, 2150 { REG_TABLE (REG_0F01 ) }, 2151 { "larS", { Gv, Sv }, 0 }, 2152 { "lslS", { Gv, Sv }, 0 }, 2153 { Bad_Opcode }, 2154 { "syscall", { XX }, 0 }, 2155 { "clts", { XX }, 0 }, 2156 { "sysret%LQ", { XX }, 0 }, 2157 /* 08 */ 2158 { "invd", { XX }, 0 }, 2159 { PREFIX_TABLE (PREFIX_0F09) }, 2160 { Bad_Opcode }, 2161 { "ud2", { XX }, 0 }, 2162 { Bad_Opcode }, 2163 { REG_TABLE (REG_0F0D) }, 2164 { "femms", { XX }, 0 }, 2165 { "", { MX, EM, OPSUF }, 0 }, /* See OP_3DNowSuffix. */ 2166 /* 10 */ 2167 { PREFIX_TABLE (PREFIX_0F10) }, 2168 { PREFIX_TABLE (PREFIX_0F11) }, 2169 { PREFIX_TABLE (PREFIX_0F12) }, 2170 { "movlpX", { Mq, XM }, PREFIX_OPCODE }, 2171 { "unpcklpX", { XM, EXx }, PREFIX_OPCODE }, 2172 { "unpckhpX", { XM, EXx }, PREFIX_OPCODE }, 2173 { PREFIX_TABLE (PREFIX_0F16) }, 2174 { "movhpX", { Mq, XM }, PREFIX_OPCODE }, 2175 /* 18 */ 2176 { REG_TABLE (REG_0F18) }, 2177 { "nopQ", { Ev }, 0 }, 2178 { PREFIX_TABLE (PREFIX_0F1A) }, 2179 { PREFIX_TABLE (PREFIX_0F1B) }, 2180 { PREFIX_TABLE (PREFIX_0F1C) }, 2181 { "nopQ", { Ev }, 0 }, 2182 { PREFIX_TABLE (PREFIX_0F1E) }, 2183 { "nopQ", { Ev }, 0 }, 2184 /* 20 */ 2185 { "movZ", { Em, Cm }, 0 }, 2186 { "movZ", { Em, Dm }, 0 }, 2187 { "movZ", { Cm, Em }, 0 }, 2188 { "movZ", { Dm, Em }, 0 }, 2189 { X86_64_TABLE (X86_64_0F24) }, 2190 { Bad_Opcode }, 2191 { X86_64_TABLE (X86_64_0F26) }, 2192 { Bad_Opcode }, 2193 /* 28 */ 2194 { "movapX", { XM, EXx }, PREFIX_OPCODE }, 2195 { "movapX", { EXxS, XM }, PREFIX_OPCODE }, 2196 { PREFIX_TABLE (PREFIX_0F2A) }, 2197 { PREFIX_TABLE (PREFIX_0F2B) }, 2198 { PREFIX_TABLE (PREFIX_0F2C) }, 2199 { PREFIX_TABLE (PREFIX_0F2D) }, 2200 { PREFIX_TABLE (PREFIX_0F2E) }, 2201 { PREFIX_TABLE (PREFIX_0F2F) }, 2202 /* 30 */ 2203 { "wrmsr", { XX }, PREFIX_REX2_ILLEGAL }, 2204 { "rdtsc", { XX }, PREFIX_REX2_ILLEGAL }, 2205 { "rdmsr", { XX }, PREFIX_REX2_ILLEGAL }, 2206 { "rdpmc", { XX }, PREFIX_REX2_ILLEGAL }, 2207 { "sysenter", { SEP }, PREFIX_REX2_ILLEGAL }, 2208 { "sysexit%LQ", { SEP }, PREFIX_REX2_ILLEGAL }, 2209 { Bad_Opcode }, 2210 { "getsec", { XX }, 0 }, 2211 /* 38 */ 2212 { THREE_BYTE_TABLE (THREE_BYTE_0F38) }, 2213 { Bad_Opcode }, 2214 { THREE_BYTE_TABLE (THREE_BYTE_0F3A) }, 2215 { Bad_Opcode }, 2216 { Bad_Opcode }, 2217 { Bad_Opcode }, 2218 { Bad_Opcode }, 2219 { Bad_Opcode }, 2220 /* 40 */ 2221 { "cmovoS", { Gv, Ev }, 0 }, 2222 { "cmovnoS", { Gv, Ev }, 0 }, 2223 { "cmovbS", { Gv, Ev }, 0 }, 2224 { "cmovaeS", { Gv, Ev }, 0 }, 2225 { "cmoveS", { Gv, Ev }, 0 }, 2226 { "cmovneS", { Gv, Ev }, 0 }, 2227 { "cmovbeS", { Gv, Ev }, 0 }, 2228 { "cmovaS", { Gv, Ev }, 0 }, 2229 /* 48 */ 2230 { "cmovsS", { Gv, Ev }, 0 }, 2231 { "cmovnsS", { Gv, Ev }, 0 }, 2232 { "cmovpS", { Gv, Ev }, 0 }, 2233 { "cmovnpS", { Gv, Ev }, 0 }, 2234 { "cmovlS", { Gv, Ev }, 0 }, 2235 { "cmovgeS", { Gv, Ev }, 0 }, 2236 { "cmovleS", { Gv, Ev }, 0 }, 2237 { "cmovgS", { Gv, Ev }, 0 }, 2238 /* 50 */ 2239 { "movmskpX", { Gdq, Ux }, PREFIX_OPCODE }, 2240 { PREFIX_TABLE (PREFIX_0F51) }, 2241 { PREFIX_TABLE (PREFIX_0F52) }, 2242 { PREFIX_TABLE (PREFIX_0F53) }, 2243 { "andpX", { XM, EXx }, PREFIX_OPCODE }, 2244 { "andnpX", { XM, EXx }, PREFIX_OPCODE }, 2245 { "orpX", { XM, EXx }, PREFIX_OPCODE }, 2246 { "xorpX", { XM, EXx }, PREFIX_OPCODE }, 2247 /* 58 */ 2248 { PREFIX_TABLE (PREFIX_0F58) }, 2249 { PREFIX_TABLE (PREFIX_0F59) }, 2250 { PREFIX_TABLE (PREFIX_0F5A) }, 2251 { PREFIX_TABLE (PREFIX_0F5B) }, 2252 { PREFIX_TABLE (PREFIX_0F5C) }, 2253 { PREFIX_TABLE (PREFIX_0F5D) }, 2254 { PREFIX_TABLE (PREFIX_0F5E) }, 2255 { PREFIX_TABLE (PREFIX_0F5F) }, 2256 /* 60 */ 2257 { PREFIX_TABLE (PREFIX_0F60) }, 2258 { PREFIX_TABLE (PREFIX_0F61) }, 2259 { PREFIX_TABLE (PREFIX_0F62) }, 2260 { "packsswb", { MX, EM }, PREFIX_OPCODE }, 2261 { "pcmpgtb", { MX, EM }, PREFIX_OPCODE }, 2262 { "pcmpgtw", { MX, EM }, PREFIX_OPCODE }, 2263 { "pcmpgtd", { MX, EM }, PREFIX_OPCODE }, 2264 { "packuswb", { MX, EM }, PREFIX_OPCODE }, 2265 /* 68 */ 2266 { "punpckhbw", { MX, EM }, PREFIX_OPCODE }, 2267 { "punpckhwd", { MX, EM }, PREFIX_OPCODE }, 2268 { "punpckhdq", { MX, EM }, PREFIX_OPCODE }, 2269 { "packssdw", { MX, EM }, PREFIX_OPCODE }, 2270 { "punpcklqdq", { XM, EXx }, PREFIX_DATA }, 2271 { "punpckhqdq", { XM, EXx }, PREFIX_DATA }, 2272 { "movK", { MX, Edq }, PREFIX_OPCODE }, 2273 { PREFIX_TABLE (PREFIX_0F6F) }, 2274 /* 70 */ 2275 { PREFIX_TABLE (PREFIX_0F70) }, 2276 { REG_TABLE (REG_0F71) }, 2277 { REG_TABLE (REG_0F72) }, 2278 { REG_TABLE (REG_0F73) }, 2279 { "pcmpeqb", { MX, EM }, PREFIX_OPCODE }, 2280 { "pcmpeqw", { MX, EM }, PREFIX_OPCODE }, 2281 { "pcmpeqd", { MX, EM }, PREFIX_OPCODE }, 2282 { "emms", { XX }, PREFIX_OPCODE }, 2283 /* 78 */ 2284 { PREFIX_TABLE (PREFIX_0F78) }, 2285 { PREFIX_TABLE (PREFIX_0F79) }, 2286 { Bad_Opcode }, 2287 { Bad_Opcode }, 2288 { PREFIX_TABLE (PREFIX_0F7C) }, 2289 { PREFIX_TABLE (PREFIX_0F7D) }, 2290 { PREFIX_TABLE (PREFIX_0F7E) }, 2291 { PREFIX_TABLE (PREFIX_0F7F) }, 2292 /* 80 */ 2293 { "joH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, 2294 { "jnoH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, 2295 { "jbH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, 2296 { "jaeH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, 2297 { "jeH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, 2298 { "jneH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, 2299 { "jbeH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, 2300 { "jaH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, 2301 /* 88 */ 2302 { "jsH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, 2303 { "jnsH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, 2304 { "jpH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, 2305 { "jnpH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, 2306 { "jlH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, 2307 { "jgeH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, 2308 { "jleH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, 2309 { "jgH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, 2310 /* 90 */ 2311 { "seto", { Eb }, 0 }, 2312 { "setno", { Eb }, 0 }, 2313 { "setb", { Eb }, 0 }, 2314 { "setae", { Eb }, 0 }, 2315 { "sete", { Eb }, 0 }, 2316 { "setne", { Eb }, 0 }, 2317 { "setbe", { Eb }, 0 }, 2318 { "seta", { Eb }, 0 }, 2319 /* 98 */ 2320 { "sets", { Eb }, 0 }, 2321 { "setns", { Eb }, 0 }, 2322 { "setp", { Eb }, 0 }, 2323 { "setnp", { Eb }, 0 }, 2324 { "setl", { Eb }, 0 }, 2325 { "setge", { Eb }, 0 }, 2326 { "setle", { Eb }, 0 }, 2327 { "setg", { Eb }, 0 }, 2328 /* a0 */ 2329 { "pushP", { fs }, 0 }, 2330 { "popP", { fs }, 0 }, 2331 { "cpuid", { XX }, 0 }, 2332 { "btS", { Ev, Gv }, 0 }, 2333 { "shldS", { Ev, Gv, Ib }, 0 }, 2334 { "shldS", { Ev, Gv, CL }, 0 }, 2335 { REG_TABLE (REG_0FA6) }, 2336 { REG_TABLE (REG_0FA7) }, 2337 /* a8 */ 2338 { "pushP", { gs }, 0 }, 2339 { "popP", { gs }, 0 }, 2340 { "rsm", { XX }, 0 }, 2341 { "btsS", { Evh1, Gv }, 0 }, 2342 { "shrdS", { Ev, Gv, Ib }, 0 }, 2343 { "shrdS", { Ev, Gv, CL }, 0 }, 2344 { REG_TABLE (REG_0FAE) }, 2345 { "imulS", { Gv, Ev }, 0 }, 2346 /* b0 */ 2347 { "cmpxchgB", { Ebh1, Gb }, 0 }, 2348 { "cmpxchgS", { Evh1, Gv }, 0 }, 2349 { "lssS", { Gv, Mp }, 0 }, 2350 { "btrS", { Evh1, Gv }, 0 }, 2351 { "lfsS", { Gv, Mp }, 0 }, 2352 { "lgsS", { Gv, Mp }, 0 }, 2353 { "movz{bR|x}", { Gv, Eb }, 0 }, 2354 { "movz{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movzww ! */ 2355 /* b8 */ 2356 { PREFIX_TABLE (PREFIX_0FB8) }, 2357 { "ud1S", { Gv, Ev }, 0 }, 2358 { REG_TABLE (REG_0FBA) }, 2359 { "btcS", { Evh1, Gv }, 0 }, 2360 { PREFIX_TABLE (PREFIX_0FBC) }, 2361 { PREFIX_TABLE (PREFIX_0FBD) }, 2362 { "movs{bR|x}", { Gv, Eb }, 0 }, 2363 { "movs{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movsww ! */ 2364 /* c0 */ 2365 { "xaddB", { Ebh1, Gb }, 0 }, 2366 { "xaddS", { Evh1, Gv }, 0 }, 2367 { PREFIX_TABLE (PREFIX_0FC2) }, 2368 { "movntiS", { Mdq, Gdq }, PREFIX_OPCODE }, 2369 { "pinsrw", { MX, Edw, Ib }, PREFIX_OPCODE }, 2370 { "pextrw", { Gd, Nq, Ib }, PREFIX_OPCODE }, 2371 { "shufpX", { XM, EXx, Ib }, PREFIX_OPCODE }, 2372 { REG_TABLE (REG_0FC7) }, 2373 /* c8 */ 2374 { "bswap", { RMeAX }, 0 }, 2375 { "bswap", { RMeCX }, 0 }, 2376 { "bswap", { RMeDX }, 0 }, 2377 { "bswap", { RMeBX }, 0 }, 2378 { "bswap", { RMeSP }, 0 }, 2379 { "bswap", { RMeBP }, 0 }, 2380 { "bswap", { RMeSI }, 0 }, 2381 { "bswap", { RMeDI }, 0 }, 2382 /* d0 */ 2383 { PREFIX_TABLE (PREFIX_0FD0) }, 2384 { "psrlw", { MX, EM }, PREFIX_OPCODE }, 2385 { "psrld", { MX, EM }, PREFIX_OPCODE }, 2386 { "psrlq", { MX, EM }, PREFIX_OPCODE }, 2387 { "paddq", { MX, EM }, PREFIX_OPCODE }, 2388 { "pmullw", { MX, EM }, PREFIX_OPCODE }, 2389 { PREFIX_TABLE (PREFIX_0FD6) }, 2390 { "pmovmskb", { Gdq, Nq }, PREFIX_OPCODE }, 2391 /* d8 */ 2392 { "psubusb", { MX, EM }, PREFIX_OPCODE }, 2393 { "psubusw", { MX, EM }, PREFIX_OPCODE }, 2394 { "pminub", { MX, EM }, PREFIX_OPCODE }, 2395 { "pand", { MX, EM }, PREFIX_OPCODE }, 2396 { "paddusb", { MX, EM }, PREFIX_OPCODE }, 2397 { "paddusw", { MX, EM }, PREFIX_OPCODE }, 2398 { "pmaxub", { MX, EM }, PREFIX_OPCODE }, 2399 { "pandn", { MX, EM }, PREFIX_OPCODE }, 2400 /* e0 */ 2401 { "pavgb", { MX, EM }, PREFIX_OPCODE }, 2402 { "psraw", { MX, EM }, PREFIX_OPCODE }, 2403 { "psrad", { MX, EM }, PREFIX_OPCODE }, 2404 { "pavgw", { MX, EM }, PREFIX_OPCODE }, 2405 { "pmulhuw", { MX, EM }, PREFIX_OPCODE }, 2406 { "pmulhw", { MX, EM }, PREFIX_OPCODE }, 2407 { PREFIX_TABLE (PREFIX_0FE6) }, 2408 { PREFIX_TABLE (PREFIX_0FE7) }, 2409 /* e8 */ 2410 { "psubsb", { MX, EM }, PREFIX_OPCODE }, 2411 { "psubsw", { MX, EM }, PREFIX_OPCODE }, 2412 { "pminsw", { MX, EM }, PREFIX_OPCODE }, 2413 { "por", { MX, EM }, PREFIX_OPCODE }, 2414 { "paddsb", { MX, EM }, PREFIX_OPCODE }, 2415 { "paddsw", { MX, EM }, PREFIX_OPCODE }, 2416 { "pmaxsw", { MX, EM }, PREFIX_OPCODE }, 2417 { "pxor", { MX, EM }, PREFIX_OPCODE }, 2418 /* f0 */ 2419 { PREFIX_TABLE (PREFIX_0FF0) }, 2420 { "psllw", { MX, EM }, PREFIX_OPCODE }, 2421 { "pslld", { MX, EM }, PREFIX_OPCODE }, 2422 { "psllq", { MX, EM }, PREFIX_OPCODE }, 2423 { "pmuludq", { MX, EM }, PREFIX_OPCODE }, 2424 { "pmaddwd", { MX, EM }, PREFIX_OPCODE }, 2425 { "psadbw", { MX, EM }, PREFIX_OPCODE }, 2426 { PREFIX_TABLE (PREFIX_0FF7) }, 2427 /* f8 */ 2428 { "psubb", { MX, EM }, PREFIX_OPCODE }, 2429 { "psubw", { MX, EM }, PREFIX_OPCODE }, 2430 { "psubd", { MX, EM }, PREFIX_OPCODE }, 2431 { "psubq", { MX, EM }, PREFIX_OPCODE }, 2432 { "paddb", { MX, EM }, PREFIX_OPCODE }, 2433 { "paddw", { MX, EM }, PREFIX_OPCODE }, 2434 { "paddd", { MX, EM }, PREFIX_OPCODE }, 2435 { "ud0S", { Gv, Ev }, 0 }, 2436 }; 2437 2438 static const bool onebyte_has_modrm[256] = { 2439 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ 2440 /* ------------------------------- */ 2441 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */ 2442 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */ 2443 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */ 2444 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */ 2445 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */ 2446 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */ 2447 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */ 2448 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */ 2449 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */ 2450 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */ 2451 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */ 2452 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */ 2453 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */ 2454 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */ 2455 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */ 2456 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */ 2457 /* ------------------------------- */ 2458 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ 2459 }; 2460 2461 static const bool twobyte_has_modrm[256] = { 2462 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ 2463 /* ------------------------------- */ 2464 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */ 2465 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */ 2466 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */ 2467 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */ 2468 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */ 2469 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */ 2470 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */ 2471 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */ 2472 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */ 2473 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */ 2474 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */ 2475 /* b0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bf */ 2476 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */ 2477 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */ 2478 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */ 2479 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 /* ff */ 2480 /* ------------------------------- */ 2481 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ 2482 }; 2483 2484 2485 struct op 2486 { 2487 const char *name; 2488 unsigned int len; 2489 }; 2490 2491 /* If we are accessing mod/rm/reg without need_modrm set, then the 2492 values are stale. Hitting this abort likely indicates that you 2493 need to update onebyte_has_modrm or twobyte_has_modrm. */ 2494 #define MODRM_CHECK if (!ins->need_modrm) abort () 2495 2496 static const char intel_index16[][6] = { 2497 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx" 2498 }; 2499 2500 static const char att_names64[][8] = { 2501 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi", 2502 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15", 2503 "%r16", "%r17", "%r18", "%r19", "%r20", "%r21", "%r22", "%r23", 2504 "%r24", "%r25", "%r26", "%r27", "%r28", "%r29", "%r30", "%r31", 2505 }; 2506 static const char att_names32[][8] = { 2507 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi", 2508 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d", 2509 "%r16d", "%r17d", "%r18d", "%r19d", "%r20d", "%r21d", "%r22d", "%r23d", 2510 "%r24d", "%r25d", "%r26d", "%r27d", "%r28d", "%r29d", "%r30d", "%r31d", 2511 }; 2512 static const char att_names16[][8] = { 2513 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di", 2514 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w", 2515 "%r16w", "%r17w", "%r18w", "%r19w", "%r20w", "%r21w", "%r22w", "%r23w", 2516 "%r24w", "%r25w", "%r26w", "%r27w", "%r28w", "%r29w", "%r30w", "%r31w", 2517 }; 2518 static const char att_names8[][8] = { 2519 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh", 2520 }; 2521 static const char att_names8rex[][8] = { 2522 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil", 2523 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b", 2524 "%r16b", "%r17b", "%r18b", "%r19b", "%r20b", "%r21b", "%r22b", "%r23b", 2525 "%r24b", "%r25b", "%r26b", "%r27b", "%r28b", "%r29b", "%r30b", "%r31b", 2526 }; 2527 static const char att_names_seg[][4] = { 2528 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?", 2529 }; 2530 static const char att_index64[] = "%riz"; 2531 static const char att_index32[] = "%eiz"; 2532 static const char att_index16[][8] = { 2533 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx" 2534 }; 2535 2536 static const char att_names_mm[][8] = { 2537 "%mm0", "%mm1", "%mm2", "%mm3", 2538 "%mm4", "%mm5", "%mm6", "%mm7" 2539 }; 2540 2541 static const char att_names_bnd[][8] = { 2542 "%bnd0", "%bnd1", "%bnd2", "%bnd3" 2543 }; 2544 2545 static const char att_names_xmm[][8] = { 2546 "%xmm0", "%xmm1", "%xmm2", "%xmm3", 2547 "%xmm4", "%xmm5", "%xmm6", "%xmm7", 2548 "%xmm8", "%xmm9", "%xmm10", "%xmm11", 2549 "%xmm12", "%xmm13", "%xmm14", "%xmm15", 2550 "%xmm16", "%xmm17", "%xmm18", "%xmm19", 2551 "%xmm20", "%xmm21", "%xmm22", "%xmm23", 2552 "%xmm24", "%xmm25", "%xmm26", "%xmm27", 2553 "%xmm28", "%xmm29", "%xmm30", "%xmm31" 2554 }; 2555 2556 static const char att_names_ymm[][8] = { 2557 "%ymm0", "%ymm1", "%ymm2", "%ymm3", 2558 "%ymm4", "%ymm5", "%ymm6", "%ymm7", 2559 "%ymm8", "%ymm9", "%ymm10", "%ymm11", 2560 "%ymm12", "%ymm13", "%ymm14", "%ymm15", 2561 "%ymm16", "%ymm17", "%ymm18", "%ymm19", 2562 "%ymm20", "%ymm21", "%ymm22", "%ymm23", 2563 "%ymm24", "%ymm25", "%ymm26", "%ymm27", 2564 "%ymm28", "%ymm29", "%ymm30", "%ymm31" 2565 }; 2566 2567 static const char att_names_zmm[][8] = { 2568 "%zmm0", "%zmm1", "%zmm2", "%zmm3", 2569 "%zmm4", "%zmm5", "%zmm6", "%zmm7", 2570 "%zmm8", "%zmm9", "%zmm10", "%zmm11", 2571 "%zmm12", "%zmm13", "%zmm14", "%zmm15", 2572 "%zmm16", "%zmm17", "%zmm18", "%zmm19", 2573 "%zmm20", "%zmm21", "%zmm22", "%zmm23", 2574 "%zmm24", "%zmm25", "%zmm26", "%zmm27", 2575 "%zmm28", "%zmm29", "%zmm30", "%zmm31" 2576 }; 2577 2578 static const char att_names_tmm[][8] = { 2579 "%tmm0", "%tmm1", "%tmm2", "%tmm3", 2580 "%tmm4", "%tmm5", "%tmm6", "%tmm7" 2581 }; 2582 2583 static const char att_names_mask[][8] = { 2584 "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7" 2585 }; 2586 2587 static const char *const names_rounding[] = 2588 { 2589 "{rn-", 2590 "{rd-", 2591 "{ru-", 2592 "{rz-" 2593 }; 2594 2595 static const struct dis386 reg_table[][8] = { 2596 /* REG_80 */ 2597 { 2598 { "addA", { Ebh1, Ib }, 0 }, 2599 { "orA", { Ebh1, Ib }, 0 }, 2600 { "adcA", { Ebh1, Ib }, 0 }, 2601 { "sbbA", { Ebh1, Ib }, 0 }, 2602 { "andA", { Ebh1, Ib }, 0 }, 2603 { "subA", { Ebh1, Ib }, 0 }, 2604 { "xorA", { Ebh1, Ib }, 0 }, 2605 { "cmpA", { Eb, Ib }, 0 }, 2606 }, 2607 /* REG_81 */ 2608 { 2609 { "addQ", { Evh1, Iv }, 0 }, 2610 { "orQ", { Evh1, Iv }, 0 }, 2611 { "adcQ", { Evh1, Iv }, 0 }, 2612 { "sbbQ", { Evh1, Iv }, 0 }, 2613 { "andQ", { Evh1, Iv }, 0 }, 2614 { "subQ", { Evh1, Iv }, 0 }, 2615 { "xorQ", { Evh1, Iv }, 0 }, 2616 { "cmpQ", { Ev, Iv }, 0 }, 2617 }, 2618 /* REG_83 */ 2619 { 2620 { "addQ", { Evh1, sIb }, 0 }, 2621 { "orQ", { Evh1, sIb }, 0 }, 2622 { "adcQ", { Evh1, sIb }, 0 }, 2623 { "sbbQ", { Evh1, sIb }, 0 }, 2624 { "andQ", { Evh1, sIb }, 0 }, 2625 { "subQ", { Evh1, sIb }, 0 }, 2626 { "xorQ", { Evh1, sIb }, 0 }, 2627 { "cmpQ", { Ev, sIb }, 0 }, 2628 }, 2629 /* REG_8F */ 2630 { 2631 { "pop{P|}", { stackEv }, 0 }, 2632 { XOP_8F_TABLE () }, 2633 { Bad_Opcode }, 2634 { Bad_Opcode }, 2635 { Bad_Opcode }, 2636 { XOP_8F_TABLE () }, 2637 }, 2638 /* REG_C0 */ 2639 { 2640 { "%NFrolA", { VexGb, Eb, Ib }, NO_PREFIX }, 2641 { "%NFrorA", { VexGb, Eb, Ib }, NO_PREFIX }, 2642 { "rclA", { VexGb, Eb, Ib }, NO_PREFIX }, 2643 { "rcrA", { VexGb, Eb, Ib }, NO_PREFIX }, 2644 { "%NFshlA", { VexGb, Eb, Ib }, NO_PREFIX }, 2645 { "%NFshrA", { VexGb, Eb, Ib }, NO_PREFIX }, 2646 { "%NFshlA", { VexGb, Eb, Ib }, NO_PREFIX }, 2647 { "%NFsarA", { VexGb, Eb, Ib }, NO_PREFIX }, 2648 }, 2649 /* REG_C1 */ 2650 { 2651 { "%NFrolQ", { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA }, 2652 { "%NFrorQ", { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA }, 2653 { "rclQ", { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA }, 2654 { "rcrQ", { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA }, 2655 { "%NFshlQ", { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA }, 2656 { "%NFshrQ", { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA }, 2657 { "%NFshlQ", { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA }, 2658 { "%NFsarQ", { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA }, 2659 }, 2660 /* REG_C6 */ 2661 { 2662 { "movA", { Ebh3, Ib }, 0 }, 2663 { Bad_Opcode }, 2664 { Bad_Opcode }, 2665 { Bad_Opcode }, 2666 { Bad_Opcode }, 2667 { Bad_Opcode }, 2668 { Bad_Opcode }, 2669 { RM_TABLE (RM_C6_REG_7) }, 2670 }, 2671 /* REG_C7 */ 2672 { 2673 { "movQ", { Evh3, Iv }, 0 }, 2674 { Bad_Opcode }, 2675 { Bad_Opcode }, 2676 { Bad_Opcode }, 2677 { Bad_Opcode }, 2678 { Bad_Opcode }, 2679 { Bad_Opcode }, 2680 { RM_TABLE (RM_C7_REG_7) }, 2681 }, 2682 /* REG_D0 */ 2683 { 2684 { "%NFrolA", { VexGb, Eb, I1 }, NO_PREFIX }, 2685 { "%NFrorA", { VexGb, Eb, I1 }, NO_PREFIX }, 2686 { "rclA", { VexGb, Eb, I1 }, NO_PREFIX }, 2687 { "rcrA", { VexGb, Eb, I1 }, NO_PREFIX }, 2688 { "%NFshlA", { VexGb, Eb, I1 }, NO_PREFIX }, 2689 { "%NFshrA", { VexGb, Eb, I1 }, NO_PREFIX }, 2690 { "%NFshlA", { VexGb, Eb, I1 }, NO_PREFIX }, 2691 { "%NFsarA", { VexGb, Eb, I1 }, NO_PREFIX }, 2692 }, 2693 /* REG_D1 */ 2694 { 2695 { "%NFrolQ", { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA }, 2696 { "%NFrorQ", { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA }, 2697 { "rclQ", { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA }, 2698 { "rcrQ", { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA }, 2699 { "%NFshlQ", { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA }, 2700 { "%NFshrQ", { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA }, 2701 { "%NFshlQ", { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA }, 2702 { "%NFsarQ", { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA }, 2703 }, 2704 /* REG_D2 */ 2705 { 2706 { "%NFrolA", { VexGb, Eb, CL }, NO_PREFIX }, 2707 { "%NFrorA", { VexGb, Eb, CL }, NO_PREFIX }, 2708 { "rclA", { VexGb, Eb, CL }, NO_PREFIX }, 2709 { "rcrA", { VexGb, Eb, CL }, NO_PREFIX }, 2710 { "%NFshlA", { VexGb, Eb, CL }, NO_PREFIX }, 2711 { "%NFshrA", { VexGb, Eb, CL }, NO_PREFIX }, 2712 { "%NFshlA", { VexGb, Eb, CL }, NO_PREFIX }, 2713 { "%NFsarA", { VexGb, Eb, CL }, NO_PREFIX }, 2714 }, 2715 /* REG_D3 */ 2716 { 2717 { "%NFrolQ", { VexGv, Ev, CL }, PREFIX_NP_OR_DATA }, 2718 { "%NFrorQ", { VexGv, Ev, CL }, PREFIX_NP_OR_DATA }, 2719 { "rclQ", { VexGv, Ev, CL }, PREFIX_NP_OR_DATA }, 2720 { "rcrQ", { VexGv, Ev, CL }, PREFIX_NP_OR_DATA }, 2721 { "%NFshlQ", { VexGv, Ev, CL }, PREFIX_NP_OR_DATA }, 2722 { "%NFshrQ", { VexGv, Ev, CL }, PREFIX_NP_OR_DATA }, 2723 { "%NFshlQ", { VexGv, Ev, CL }, PREFIX_NP_OR_DATA }, 2724 { "%NFsarQ", { VexGv, Ev, CL }, PREFIX_NP_OR_DATA }, 2725 }, 2726 /* REG_F6 */ 2727 { 2728 { "testA", { Eb, Ib }, 0 }, 2729 { "testA", { Eb, Ib }, 0 }, 2730 { "notA", { Ebh1 }, 0 }, 2731 { "negA", { Ebh1 }, 0 }, 2732 { "mulA", { Eb }, 0 }, /* Don't print the implicit %al register, */ 2733 { "imulA", { Eb }, 0 }, /* to distinguish these opcodes from other */ 2734 { "divA", { Eb }, 0 }, /* mul/imul opcodes. Do the same for div */ 2735 { "idivA", { Eb }, 0 }, /* and idiv for consistency. */ 2736 }, 2737 /* REG_F7 */ 2738 { 2739 { "testQ", { Ev, Iv }, 0 }, 2740 { "testQ", { Ev, Iv }, 0 }, 2741 { "notQ", { Evh1 }, 0 }, 2742 { "negQ", { Evh1 }, 0 }, 2743 { "mulQ", { Ev }, 0 }, /* Don't print the implicit register. */ 2744 { "imulQ", { Ev }, 0 }, 2745 { "divQ", { Ev }, 0 }, 2746 { "idivQ", { Ev }, 0 }, 2747 }, 2748 /* REG_FE */ 2749 { 2750 { "incA", { Ebh1 }, 0 }, 2751 { "decA", { Ebh1 }, 0 }, 2752 }, 2753 /* REG_FF */ 2754 { 2755 { "incQ", { Evh1 }, 0 }, 2756 { "decQ", { Evh1 }, 0 }, 2757 { "call{@|}", { NOTRACK, indirEv, BND }, 0 }, 2758 { "{l|}call^", { indirEp }, 0 }, 2759 { "jmp{@|}", { NOTRACK, indirEv, BND }, 0 }, 2760 { "{l|}jmp^", { indirEp }, 0 }, 2761 { "push{P|}", { stackEv }, 0 }, 2762 { Bad_Opcode }, 2763 }, 2764 /* REG_0F00 */ 2765 { 2766 { "sldtD", { Sv }, 0 }, 2767 { "strD", { Sv }, 0 }, 2768 { "lldtD", { Sv }, 0 }, 2769 { "ltrD", { Sv }, 0 }, 2770 { "verrD", { Sv }, 0 }, 2771 { "verwD", { Sv }, 0 }, 2772 { X86_64_TABLE (X86_64_0F00_REG_6) }, 2773 { Bad_Opcode }, 2774 }, 2775 /* REG_0F01 */ 2776 { 2777 { MOD_TABLE (MOD_0F01_REG_0) }, 2778 { MOD_TABLE (MOD_0F01_REG_1) }, 2779 { MOD_TABLE (MOD_0F01_REG_2) }, 2780 { MOD_TABLE (MOD_0F01_REG_3) }, 2781 { "smswD", { Sv }, 0 }, 2782 { MOD_TABLE (MOD_0F01_REG_5) }, 2783 { "lmsw", { Ew }, 0 }, 2784 { MOD_TABLE (MOD_0F01_REG_7) }, 2785 }, 2786 /* REG_0F0D */ 2787 { 2788 { "prefetch", { Mb }, 0 }, 2789 { "prefetchw", { Mb }, 0 }, 2790 { "prefetchwt1", { Mb }, 0 }, 2791 { "prefetch", { Mb }, 0 }, 2792 { "prefetch", { Mb }, 0 }, 2793 { "prefetch", { Mb }, 0 }, 2794 { "prefetch", { Mb }, 0 }, 2795 { "prefetch", { Mb }, 0 }, 2796 }, 2797 /* REG_0F18 */ 2798 { 2799 { MOD_TABLE (MOD_0F18_REG_0) }, 2800 { MOD_TABLE (MOD_0F18_REG_1) }, 2801 { MOD_TABLE (MOD_0F18_REG_2) }, 2802 { MOD_TABLE (MOD_0F18_REG_3) }, 2803 { "nopQ", { Ev }, 0 }, 2804 { "nopQ", { Ev }, 0 }, 2805 { MOD_TABLE (MOD_0F18_REG_6) }, 2806 { MOD_TABLE (MOD_0F18_REG_7) }, 2807 }, 2808 /* REG_0F1C_P_0_MOD_0 */ 2809 { 2810 { "cldemote", { Mb }, 0 }, 2811 { "nopQ", { Ev }, 0 }, 2812 { "nopQ", { Ev }, 0 }, 2813 { "nopQ", { Ev }, 0 }, 2814 { "nopQ", { Ev }, 0 }, 2815 { "nopQ", { Ev }, 0 }, 2816 { "nopQ", { Ev }, 0 }, 2817 { "nopQ", { Ev }, 0 }, 2818 }, 2819 /* REG_0F1E_P_1_MOD_3 */ 2820 { 2821 { "nopQ", { Ev }, PREFIX_IGNORED }, 2822 { "rdsspK", { Edq }, 0 }, 2823 { "nopQ", { Ev }, PREFIX_IGNORED }, 2824 { "nopQ", { Ev }, PREFIX_IGNORED }, 2825 { "nopQ", { Ev }, PREFIX_IGNORED }, 2826 { "nopQ", { Ev }, PREFIX_IGNORED }, 2827 { "nopQ", { Ev }, PREFIX_IGNORED }, 2828 { RM_TABLE (RM_0F1E_P_1_MOD_3_REG_7) }, 2829 }, 2830 /* REG_0F38D8_PREFIX_1 */ 2831 { 2832 { "aesencwide128kl", { M }, 0 }, 2833 { "aesdecwide128kl", { M }, 0 }, 2834 { "aesencwide256kl", { M }, 0 }, 2835 { "aesdecwide256kl", { M }, 0 }, 2836 }, 2837 /* REG_0F3A0F_P_1 */ 2838 { 2839 { RM_TABLE (RM_0F3A0F_P_1_R_0) }, 2840 }, 2841 /* REG_0F71 */ 2842 { 2843 { Bad_Opcode }, 2844 { Bad_Opcode }, 2845 { "psrlw", { Nq, Ib }, PREFIX_OPCODE }, 2846 { Bad_Opcode }, 2847 { "psraw", { Nq, Ib }, PREFIX_OPCODE }, 2848 { Bad_Opcode }, 2849 { "psllw", { Nq, Ib }, PREFIX_OPCODE }, 2850 }, 2851 /* REG_0F72 */ 2852 { 2853 { Bad_Opcode }, 2854 { Bad_Opcode }, 2855 { "psrld", { Nq, Ib }, PREFIX_OPCODE }, 2856 { Bad_Opcode }, 2857 { "psrad", { Nq, Ib }, PREFIX_OPCODE }, 2858 { Bad_Opcode }, 2859 { "pslld", { Nq, Ib }, PREFIX_OPCODE }, 2860 }, 2861 /* REG_0F73 */ 2862 { 2863 { Bad_Opcode }, 2864 { Bad_Opcode }, 2865 { "psrlq", { Nq, Ib }, PREFIX_OPCODE }, 2866 { "psrldq", { Ux, Ib }, PREFIX_DATA }, 2867 { Bad_Opcode }, 2868 { Bad_Opcode }, 2869 { "psllq", { Nq, Ib }, PREFIX_OPCODE }, 2870 { "pslldq", { Ux, Ib }, PREFIX_DATA }, 2871 }, 2872 /* REG_0FA6 */ 2873 { 2874 { "montmul", { { OP_0f07, 0 } }, 0 }, 2875 { "xsha1", { { OP_0f07, 0 } }, 0 }, 2876 { "xsha256", { { OP_0f07, 0 } }, 0 }, 2877 }, 2878 /* REG_0FA7 */ 2879 { 2880 { "xstore-rng", { { OP_0f07, 0 } }, 0 }, 2881 { "xcrypt-ecb", { { OP_0f07, 0 } }, 0 }, 2882 { "xcrypt-cbc", { { OP_0f07, 0 } }, 0 }, 2883 { "xcrypt-ctr", { { OP_0f07, 0 } }, 0 }, 2884 { "xcrypt-cfb", { { OP_0f07, 0 } }, 0 }, 2885 { "xcrypt-ofb", { { OP_0f07, 0 } }, 0 }, 2886 }, 2887 /* REG_0FAE */ 2888 { 2889 { MOD_TABLE (MOD_0FAE_REG_0) }, 2890 { MOD_TABLE (MOD_0FAE_REG_1) }, 2891 { MOD_TABLE (MOD_0FAE_REG_2) }, 2892 { MOD_TABLE (MOD_0FAE_REG_3) }, 2893 { MOD_TABLE (MOD_0FAE_REG_4) }, 2894 { MOD_TABLE (MOD_0FAE_REG_5) }, 2895 { MOD_TABLE (MOD_0FAE_REG_6) }, 2896 { MOD_TABLE (MOD_0FAE_REG_7) }, 2897 }, 2898 /* REG_0FBA */ 2899 { 2900 { Bad_Opcode }, 2901 { Bad_Opcode }, 2902 { Bad_Opcode }, 2903 { Bad_Opcode }, 2904 { "btQ", { Ev, Ib }, 0 }, 2905 { "btsQ", { Evh1, Ib }, 0 }, 2906 { "btrQ", { Evh1, Ib }, 0 }, 2907 { "btcQ", { Evh1, Ib }, 0 }, 2908 }, 2909 /* REG_0FC7 */ 2910 { 2911 { Bad_Opcode }, 2912 { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } }, 0 }, 2913 { Bad_Opcode }, 2914 { "xrstors", { FXSAVE }, PREFIX_REX2_ILLEGAL }, 2915 { "xsavec", { FXSAVE }, PREFIX_REX2_ILLEGAL }, 2916 { "xsaves", { FXSAVE }, PREFIX_REX2_ILLEGAL }, 2917 { MOD_TABLE (MOD_0FC7_REG_6) }, 2918 { MOD_TABLE (MOD_0FC7_REG_7) }, 2919 }, 2920 /* REG_VEX_0F71 */ 2921 { 2922 { Bad_Opcode }, 2923 { Bad_Opcode }, 2924 { "vpsrlw", { Vex, Ux, Ib }, PREFIX_DATA }, 2925 { Bad_Opcode }, 2926 { "vpsraw", { Vex, Ux, Ib }, PREFIX_DATA }, 2927 { Bad_Opcode }, 2928 { "vpsllw", { Vex, Ux, Ib }, PREFIX_DATA }, 2929 }, 2930 /* REG_VEX_0F72 */ 2931 { 2932 { Bad_Opcode }, 2933 { Bad_Opcode }, 2934 { "vpsrld", { Vex, Ux, Ib }, PREFIX_DATA }, 2935 { Bad_Opcode }, 2936 { "vpsrad", { Vex, Ux, Ib }, PREFIX_DATA }, 2937 { Bad_Opcode }, 2938 { "vpslld", { Vex, Ux, Ib }, PREFIX_DATA }, 2939 }, 2940 /* REG_VEX_0F73 */ 2941 { 2942 { Bad_Opcode }, 2943 { Bad_Opcode }, 2944 { "vpsrlq", { Vex, Ux, Ib }, PREFIX_DATA }, 2945 { "vpsrldq", { Vex, Ux, Ib }, PREFIX_DATA }, 2946 { Bad_Opcode }, 2947 { Bad_Opcode }, 2948 { "vpsllq", { Vex, Ux, Ib }, PREFIX_DATA }, 2949 { "vpslldq", { Vex, Ux, Ib }, PREFIX_DATA }, 2950 }, 2951 /* REG_VEX_0FAE */ 2952 { 2953 { Bad_Opcode }, 2954 { Bad_Opcode }, 2955 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2) }, 2956 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3) }, 2957 }, 2958 /* REG_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0 */ 2959 { 2960 { RM_TABLE (RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0_R_0) }, 2961 }, 2962 /* REG_VEX_0F38F3_L_0_P_0 */ 2963 { 2964 { Bad_Opcode }, 2965 { "%NFblsrS", { VexGdq, Edq }, 0 }, 2966 { "%NFblsmskS", { VexGdq, Edq }, 0 }, 2967 { "%NFblsiS", { VexGdq, Edq }, 0 }, 2968 }, 2969 /* REG_VEX_MAP7_F8_L_0_W_0 */ 2970 { 2971 { X86_64_TABLE (X86_64_VEX_MAP7_F8_L_0_W_0_R_0) }, 2972 }, 2973 /* REG_XOP_09_01_L_0 */ 2974 { 2975 { Bad_Opcode }, 2976 { "blcfill", { VexGdq, Edq }, 0 }, 2977 { "blsfill", { VexGdq, Edq }, 0 }, 2978 { "blcs", { VexGdq, Edq }, 0 }, 2979 { "tzmsk", { VexGdq, Edq }, 0 }, 2980 { "blcic", { VexGdq, Edq }, 0 }, 2981 { "blsic", { VexGdq, Edq }, 0 }, 2982 { "t1mskc", { VexGdq, Edq }, 0 }, 2983 }, 2984 /* REG_XOP_09_02_L_0 */ 2985 { 2986 { Bad_Opcode }, 2987 { "blcmsk", { VexGdq, Edq }, 0 }, 2988 { Bad_Opcode }, 2989 { Bad_Opcode }, 2990 { Bad_Opcode }, 2991 { Bad_Opcode }, 2992 { "blci", { VexGdq, Edq }, 0 }, 2993 }, 2994 /* REG_XOP_09_12_L_0 */ 2995 { 2996 { "llwpcb", { Rdq }, 0 }, 2997 { "slwpcb", { Rdq }, 0 }, 2998 }, 2999 /* REG_XOP_0A_12_L_0 */ 3000 { 3001 { "lwpins", { VexGdq, Ed, Id }, 0 }, 3002 { "lwpval", { VexGdq, Ed, Id }, 0 }, 3003 }, 3004 3005 #include "i386-dis-evex-reg.h" 3006 }; 3007 3008 static const struct dis386 prefix_table[][4] = { 3009 /* PREFIX_90 */ 3010 { 3011 { "xchgS", { { NOP_Fixup, 0 }, { NOP_Fixup, 1 } }, 0 }, 3012 { "pause", { XX }, 0 }, 3013 { "xchgS", { { NOP_Fixup, 0 }, { NOP_Fixup, 1 } }, 0 }, 3014 { NULL, { { NULL, 0 } }, PREFIX_IGNORED } 3015 }, 3016 3017 /* PREFIX_0F00_REG_6_X86_64 */ 3018 { 3019 { Bad_Opcode }, 3020 { Bad_Opcode }, 3021 { Bad_Opcode }, 3022 { "lkgsD", { Sv }, 0 }, 3023 }, 3024 3025 /* PREFIX_0F01_REG_0_MOD_3_RM_6 */ 3026 { 3027 { "wrmsrns", { Skip_MODRM }, 0 }, 3028 { X86_64_TABLE (X86_64_0F01_REG_0_MOD_3_RM_6_P_1) }, 3029 { Bad_Opcode }, 3030 { X86_64_TABLE (X86_64_0F01_REG_0_MOD_3_RM_6_P_3) }, 3031 }, 3032 3033 /* PREFIX_0F01_REG_0_MOD_3_RM_7 */ 3034 { 3035 { X86_64_TABLE (X86_64_0F01_REG_0_MOD_3_RM_7_P_0) }, 3036 }, 3037 3038 /* PREFIX_0F01_REG_1_RM_2 */ 3039 { 3040 { "clac", { Skip_MODRM }, 0 }, 3041 { X86_64_TABLE (X86_64_0F01_REG_1_RM_2_PREFIX_1) }, 3042 { Bad_Opcode }, 3043 { X86_64_TABLE (X86_64_0F01_REG_1_RM_2_PREFIX_3)}, 3044 }, 3045 3046 /* PREFIX_0F01_REG_1_RM_4 */ 3047 { 3048 { Bad_Opcode }, 3049 { Bad_Opcode }, 3050 { "tdcall", { Skip_MODRM }, 0 }, 3051 { Bad_Opcode }, 3052 }, 3053 3054 /* PREFIX_0F01_REG_1_RM_5 */ 3055 { 3056 { Bad_Opcode }, 3057 { Bad_Opcode }, 3058 { X86_64_TABLE (X86_64_0F01_REG_1_RM_5_PREFIX_2) }, 3059 { Bad_Opcode }, 3060 }, 3061 3062 /* PREFIX_0F01_REG_1_RM_6 */ 3063 { 3064 { Bad_Opcode }, 3065 { Bad_Opcode }, 3066 { X86_64_TABLE (X86_64_0F01_REG_1_RM_6_PREFIX_2) }, 3067 { Bad_Opcode }, 3068 }, 3069 3070 /* PREFIX_0F01_REG_1_RM_7 */ 3071 { 3072 { "encls", { Skip_MODRM }, 0 }, 3073 { Bad_Opcode }, 3074 { X86_64_TABLE (X86_64_0F01_REG_1_RM_7_PREFIX_2) }, 3075 { Bad_Opcode }, 3076 }, 3077 3078 /* PREFIX_0F01_REG_3_RM_1 */ 3079 { 3080 { "vmmcall", { Skip_MODRM }, 0 }, 3081 { "vmgexit", { Skip_MODRM }, 0 }, 3082 { Bad_Opcode }, 3083 { "vmgexit", { Skip_MODRM }, 0 }, 3084 }, 3085 3086 /* PREFIX_0F01_REG_5_MOD_0 */ 3087 { 3088 { Bad_Opcode }, 3089 { "rstorssp", { Mq }, PREFIX_OPCODE }, 3090 }, 3091 3092 /* PREFIX_0F01_REG_5_MOD_3_RM_0 */ 3093 { 3094 { "serialize", { Skip_MODRM }, PREFIX_OPCODE }, 3095 { "setssbsy", { Skip_MODRM }, PREFIX_OPCODE }, 3096 { Bad_Opcode }, 3097 { "xsusldtrk", { Skip_MODRM }, PREFIX_OPCODE }, 3098 }, 3099 3100 /* PREFIX_0F01_REG_5_MOD_3_RM_1 */ 3101 { 3102 { Bad_Opcode }, 3103 { Bad_Opcode }, 3104 { Bad_Opcode }, 3105 { "xresldtrk", { Skip_MODRM }, PREFIX_OPCODE }, 3106 }, 3107 3108 /* PREFIX_0F01_REG_5_MOD_3_RM_2 */ 3109 { 3110 { Bad_Opcode }, 3111 { "saveprevssp", { Skip_MODRM }, PREFIX_OPCODE }, 3112 }, 3113 3114 /* PREFIX_0F01_REG_5_MOD_3_RM_4 */ 3115 { 3116 { Bad_Opcode }, 3117 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1) }, 3118 }, 3119 3120 /* PREFIX_0F01_REG_5_MOD_3_RM_5 */ 3121 { 3122 { Bad_Opcode }, 3123 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1) }, 3124 }, 3125 3126 /* PREFIX_0F01_REG_5_MOD_3_RM_6 */ 3127 { 3128 { "rdpkru", { Skip_MODRM }, 0 }, 3129 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1) }, 3130 }, 3131 3132 /* PREFIX_0F01_REG_5_MOD_3_RM_7 */ 3133 { 3134 { "wrpkru", { Skip_MODRM }, 0 }, 3135 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1) }, 3136 }, 3137 3138 /* PREFIX_0F01_REG_7_MOD_3_RM_2 */ 3139 { 3140 { "monitorx", { { OP_Monitor, 0 } }, 0 }, 3141 { "mcommit", { Skip_MODRM }, 0 }, 3142 }, 3143 3144 /* PREFIX_0F01_REG_7_MOD_3_RM_5 */ 3145 { 3146 { "rdpru", { Skip_MODRM }, 0 }, 3147 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_1) }, 3148 }, 3149 3150 /* PREFIX_0F01_REG_7_MOD_3_RM_6 */ 3151 { 3152 { "invlpgb", { Skip_MODRM }, 0 }, 3153 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1) }, 3154 { Bad_Opcode }, 3155 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3) }, 3156 }, 3157 3158 /* PREFIX_0F01_REG_7_MOD_3_RM_7 */ 3159 { 3160 { "tlbsync", { Skip_MODRM }, 0 }, 3161 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1) }, 3162 { Bad_Opcode }, 3163 { "pvalidate", { Skip_MODRM }, 0 }, 3164 }, 3165 3166 /* PREFIX_0F09 */ 3167 { 3168 { "wbinvd", { XX }, 0 }, 3169 { "wbnoinvd", { XX }, 0 }, 3170 }, 3171 3172 /* PREFIX_0F10 */ 3173 { 3174 { "%XEVmovupX", { XM, EXEvexXNoBcst }, 0 }, 3175 { "%XEVmovs%XS", { XMScalar, VexScalarR, EXd }, 0 }, 3176 { "%XEVmovupX", { XM, EXEvexXNoBcst }, 0 }, 3177 { "%XEVmovs%XD", { XMScalar, VexScalarR, EXq }, 0 }, 3178 }, 3179 3180 /* PREFIX_0F11 */ 3181 { 3182 { "%XEVmovupX", { EXxS, XM }, 0 }, 3183 { "%XEVmovs%XS", { EXdS, VexScalarR, XMScalar }, 0 }, 3184 { "%XEVmovupX", { EXxS, XM }, 0 }, 3185 { "%XEVmovs%XD", { EXqS, VexScalarR, XMScalar }, 0 }, 3186 }, 3187 3188 /* PREFIX_0F12 */ 3189 { 3190 { MOD_TABLE (MOD_0F12_PREFIX_0) }, 3191 { "movsldup", { XM, EXx }, 0 }, 3192 { "%XEVmovlpYX", { XM, Vex, Mq }, 0 }, 3193 { "movddup", { XM, EXq }, 0 }, 3194 }, 3195 3196 /* PREFIX_0F16 */ 3197 { 3198 { MOD_TABLE (MOD_0F16_PREFIX_0) }, 3199 { "movshdup", { XM, EXx }, 0 }, 3200 { "%XEVmovhpYX", { XM, Vex, Mq }, 0 }, 3201 }, 3202 3203 /* PREFIX_0F18_REG_6_MOD_0_X86_64 */ 3204 { 3205 { "prefetchit1", { { PREFETCHI_Fixup, b_mode } }, 0 }, 3206 { "nopQ", { Ev }, 0 }, 3207 { "nopQ", { Ev }, 0 }, 3208 { "nopQ", { Ev }, 0 }, 3209 }, 3210 3211 /* PREFIX_0F18_REG_7_MOD_0_X86_64 */ 3212 { 3213 { "prefetchit0", { { PREFETCHI_Fixup, b_mode } }, 0 }, 3214 { "nopQ", { Ev }, 0 }, 3215 { "nopQ", { Ev }, 0 }, 3216 { "nopQ", { Ev }, 0 }, 3217 }, 3218 3219 /* PREFIX_0F1A */ 3220 { 3221 { MOD_TABLE (MOD_0F1A_PREFIX_0) }, 3222 { "bndcl", { Gbnd, Ev_bnd }, 0 }, 3223 { "bndmov", { Gbnd, Ebnd }, 0 }, 3224 { "bndcu", { Gbnd, Ev_bnd }, 0 }, 3225 }, 3226 3227 /* PREFIX_0F1B */ 3228 { 3229 { MOD_TABLE (MOD_0F1B_PREFIX_0) }, 3230 { MOD_TABLE (MOD_0F1B_PREFIX_1) }, 3231 { "bndmov", { EbndS, Gbnd }, 0 }, 3232 { "bndcn", { Gbnd, Ev_bnd }, 0 }, 3233 }, 3234 3235 /* PREFIX_0F1C */ 3236 { 3237 { MOD_TABLE (MOD_0F1C_PREFIX_0) }, 3238 { "nopQ", { Ev }, PREFIX_IGNORED }, 3239 { "nopQ", { Ev }, 0 }, 3240 { "nopQ", { Ev }, PREFIX_IGNORED }, 3241 }, 3242 3243 /* PREFIX_0F1E */ 3244 { 3245 { "nopQ", { Ev }, 0 }, 3246 { MOD_TABLE (MOD_0F1E_PREFIX_1) }, 3247 { "nopQ", { Ev }, 0 }, 3248 { NULL, { XX }, PREFIX_IGNORED }, 3249 }, 3250 3251 /* PREFIX_0F2A */ 3252 { 3253 { "cvtpi2ps", { XM, EMCq }, PREFIX_OPCODE }, 3254 { "cvtsi2ss{%LQ|}", { XM, Edq }, PREFIX_OPCODE }, 3255 { "cvtpi2pd", { XM, EMCq }, PREFIX_OPCODE }, 3256 { "cvtsi2sd{%LQ|}", { XM, Edq }, 0 }, 3257 }, 3258 3259 /* PREFIX_0F2B */ 3260 { 3261 { "movntps", { Mx, XM }, 0 }, 3262 { "movntss", { Md, XM }, 0 }, 3263 { "movntpd", { Mx, XM }, 0 }, 3264 { "movntsd", { Mq, XM }, 0 }, 3265 }, 3266 3267 /* PREFIX_0F2C */ 3268 { 3269 { "cvttps2pi", { MXC, EXq }, PREFIX_OPCODE }, 3270 { "cvttss2si", { Gdq, EXd }, PREFIX_OPCODE }, 3271 { "cvttpd2pi", { MXC, EXx }, PREFIX_OPCODE }, 3272 { "cvttsd2si", { Gdq, EXq }, PREFIX_OPCODE }, 3273 }, 3274 3275 /* PREFIX_0F2D */ 3276 { 3277 { "cvtps2pi", { MXC, EXq }, PREFIX_OPCODE }, 3278 { "cvtss2si", { Gdq, EXd }, PREFIX_OPCODE }, 3279 { "cvtpd2pi", { MXC, EXx }, PREFIX_OPCODE }, 3280 { "cvtsd2si", { Gdq, EXq }, PREFIX_OPCODE }, 3281 }, 3282 3283 /* PREFIX_0F2E */ 3284 { 3285 { "%XEVucomisYX", { XMScalar, EXd, EXxEVexS }, 0 }, 3286 { Bad_Opcode }, 3287 { "%XEVucomisYX", { XMScalar, EXq, EXxEVexS }, 0 }, 3288 }, 3289 3290 /* PREFIX_0F2F */ 3291 { 3292 { "%XEVcomisYX", { XMScalar, EXd, EXxEVexS }, 0 }, 3293 { Bad_Opcode }, 3294 { "%XEVcomisYX", { XMScalar, EXq, EXxEVexS }, 0 }, 3295 }, 3296 3297 /* PREFIX_0F51 */ 3298 { 3299 { "%XEVsqrtpX", { XM, EXx, EXxEVexR }, 0 }, 3300 { "%XEVsqrts%XS", { XMScalar, VexScalar, EXd, EXxEVexR }, 0 }, 3301 { "%XEVsqrtpX", { XM, EXx, EXxEVexR }, 0 }, 3302 { "%XEVsqrts%XD", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 }, 3303 }, 3304 3305 /* PREFIX_0F52 */ 3306 { 3307 { "Vrsqrtps", { XM, EXx }, 0 }, 3308 { "Vrsqrtss", { XMScalar, VexScalar, EXd }, 0 }, 3309 }, 3310 3311 /* PREFIX_0F53 */ 3312 { 3313 { "Vrcpps", { XM, EXx }, 0 }, 3314 { "Vrcpss", { XMScalar, VexScalar, EXd }, 0 }, 3315 }, 3316 3317 /* PREFIX_0F58 */ 3318 { 3319 { "%XEVaddpX", { XM, Vex, EXx, EXxEVexR }, 0 }, 3320 { "%XEVadds%XS", { XMScalar, VexScalar, EXd, EXxEVexR }, 0 }, 3321 { "%XEVaddpX", { XM, Vex, EXx, EXxEVexR }, 0 }, 3322 { "%XEVadds%XD", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 }, 3323 }, 3324 3325 /* PREFIX_0F59 */ 3326 { 3327 { "%XEVmulpX", { XM, Vex, EXx, EXxEVexR }, 0 }, 3328 { "%XEVmuls%XS", { XMScalar, VexScalar, EXd, EXxEVexR }, 0 }, 3329 { "%XEVmulpX", { XM, Vex, EXx, EXxEVexR }, 0 }, 3330 { "%XEVmuls%XD", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 }, 3331 }, 3332 3333 /* PREFIX_0F5A */ 3334 { 3335 { "%XEVcvtp%XS2pd", { XM, EXEvexHalfBcstXmmq, EXxEVexS }, 0 }, 3336 { "%XEVcvts%XS2sd", { XMScalar, VexScalar, EXd, EXxEVexS }, 0 }, 3337 { "%XEVcvtp%XD2ps%XY", { XMxmmq, EXx, EXxEVexR }, 0 }, 3338 { "%XEVcvts%XD2ss", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 }, 3339 }, 3340 3341 /* PREFIX_0F5B */ 3342 { 3343 { "Vcvtdq2ps", { XM, EXx }, 0 }, 3344 { "Vcvttps2dq", { XM, EXx }, 0 }, 3345 { "Vcvtps2dq", { XM, EXx }, 0 }, 3346 }, 3347 3348 /* PREFIX_0F5C */ 3349 { 3350 { "%XEVsubpX", { XM, Vex, EXx, EXxEVexR }, 0 }, 3351 { "%XEVsubs%XS", { XMScalar, VexScalar, EXd, EXxEVexR }, 0 }, 3352 { "%XEVsubpX", { XM, Vex, EXx, EXxEVexR }, 0 }, 3353 { "%XEVsubs%XD", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 }, 3354 }, 3355 3356 /* PREFIX_0F5D */ 3357 { 3358 { "%XEVminpX", { XM, Vex, EXx, EXxEVexS }, 0 }, 3359 { "%XEVmins%XS", { XMScalar, VexScalar, EXd, EXxEVexS }, 0 }, 3360 { "%XEVminpX", { XM, Vex, EXx, EXxEVexS }, 0 }, 3361 { "%XEVmins%XD", { XMScalar, VexScalar, EXq, EXxEVexS }, 0 }, 3362 }, 3363 3364 /* PREFIX_0F5E */ 3365 { 3366 { "%XEVdivpX", { XM, Vex, EXx, EXxEVexR }, 0 }, 3367 { "%XEVdivs%XS", { XMScalar, VexScalar, EXd, EXxEVexR }, 0 }, 3368 { "%XEVdivpX", { XM, Vex, EXx, EXxEVexR }, 0 }, 3369 { "%XEVdivs%XD", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 }, 3370 }, 3371 3372 /* PREFIX_0F5F */ 3373 { 3374 { "%XEVmaxpX", { XM, Vex, EXx, EXxEVexS }, 0 }, 3375 { "%XEVmaxs%XS", { XMScalar, VexScalar, EXd, EXxEVexS }, 0 }, 3376 { "%XEVmaxpX", { XM, Vex, EXx, EXxEVexS }, 0 }, 3377 { "%XEVmaxs%XD", { XMScalar, VexScalar, EXq, EXxEVexS }, 0 }, 3378 }, 3379 3380 /* PREFIX_0F60 */ 3381 { 3382 { "punpcklbw",{ MX, EMd }, PREFIX_OPCODE }, 3383 { Bad_Opcode }, 3384 { "punpcklbw",{ MX, EMx }, PREFIX_OPCODE }, 3385 }, 3386 3387 /* PREFIX_0F61 */ 3388 { 3389 { "punpcklwd",{ MX, EMd }, PREFIX_OPCODE }, 3390 { Bad_Opcode }, 3391 { "punpcklwd",{ MX, EMx }, PREFIX_OPCODE }, 3392 }, 3393 3394 /* PREFIX_0F62 */ 3395 { 3396 { "punpckldq",{ MX, EMd }, PREFIX_OPCODE }, 3397 { Bad_Opcode }, 3398 { "punpckldq",{ MX, EMx }, PREFIX_OPCODE }, 3399 }, 3400 3401 /* PREFIX_0F6F */ 3402 { 3403 { "movq", { MX, EM }, PREFIX_OPCODE }, 3404 { "movdqu", { XM, EXx }, PREFIX_OPCODE }, 3405 { "movdqa", { XM, EXx }, PREFIX_OPCODE }, 3406 }, 3407 3408 /* PREFIX_0F70 */ 3409 { 3410 { "pshufw", { MX, EM, Ib }, PREFIX_OPCODE }, 3411 { "pshufhw",{ XM, EXx, Ib }, PREFIX_OPCODE }, 3412 { "pshufd", { XM, EXx, Ib }, PREFIX_OPCODE }, 3413 { "pshuflw",{ XM, EXx, Ib }, PREFIX_OPCODE }, 3414 }, 3415 3416 /* PREFIX_0F78 */ 3417 { 3418 {"vmread", { Em, Gm }, 0 }, 3419 { Bad_Opcode }, 3420 {"extrq", { Uxmm, Ib, Ib }, 0 }, 3421 {"insertq", { XM, Uxmm, Ib, Ib }, 0 }, 3422 }, 3423 3424 /* PREFIX_0F79 */ 3425 { 3426 {"vmwrite", { Gm, Em }, 0 }, 3427 { Bad_Opcode }, 3428 {"extrq", { XM, Uxmm }, 0 }, 3429 {"insertq", { XM, Uxmm }, 0 }, 3430 }, 3431 3432 /* PREFIX_0F7C */ 3433 { 3434 { Bad_Opcode }, 3435 { Bad_Opcode }, 3436 { "Vhaddpd", { XM, Vex, EXx }, 0 }, 3437 { "Vhaddps", { XM, Vex, EXx }, 0 }, 3438 }, 3439 3440 /* PREFIX_0F7D */ 3441 { 3442 { Bad_Opcode }, 3443 { Bad_Opcode }, 3444 { "Vhsubpd", { XM, Vex, EXx }, 0 }, 3445 { "Vhsubps", { XM, Vex, EXx }, 0 }, 3446 }, 3447 3448 /* PREFIX_0F7E */ 3449 { 3450 { "movK", { Edq, MX }, PREFIX_OPCODE }, 3451 { "movq", { XM, EXq }, PREFIX_OPCODE }, 3452 { "movK", { Edq, XM }, PREFIX_OPCODE }, 3453 }, 3454 3455 /* PREFIX_0F7F */ 3456 { 3457 { "movq", { EMS, MX }, PREFIX_OPCODE }, 3458 { "movdqu", { EXxS, XM }, PREFIX_OPCODE }, 3459 { "movdqa", { EXxS, XM }, PREFIX_OPCODE }, 3460 }, 3461 3462 /* PREFIX_0FAE_REG_0_MOD_3 */ 3463 { 3464 { Bad_Opcode }, 3465 { "rdfsbase", { Ev }, 0 }, 3466 }, 3467 3468 /* PREFIX_0FAE_REG_1_MOD_3 */ 3469 { 3470 { Bad_Opcode }, 3471 { "rdgsbase", { Ev }, 0 }, 3472 }, 3473 3474 /* PREFIX_0FAE_REG_2_MOD_3 */ 3475 { 3476 { Bad_Opcode }, 3477 { "wrfsbase", { Ev }, 0 }, 3478 }, 3479 3480 /* PREFIX_0FAE_REG_3_MOD_3 */ 3481 { 3482 { Bad_Opcode }, 3483 { "wrgsbase", { Ev }, 0 }, 3484 }, 3485 3486 /* PREFIX_0FAE_REG_4_MOD_0 */ 3487 { 3488 { "xsave", { FXSAVE }, PREFIX_REX2_ILLEGAL }, 3489 { "ptwrite{%LQ|}", { Edq }, 0 }, 3490 }, 3491 3492 /* PREFIX_0FAE_REG_4_MOD_3 */ 3493 { 3494 { Bad_Opcode }, 3495 { "ptwrite{%LQ|}", { Edq }, 0 }, 3496 }, 3497 3498 /* PREFIX_0FAE_REG_5_MOD_3 */ 3499 { 3500 { "lfence", { Skip_MODRM }, 0 }, 3501 { "incsspK", { Edq }, PREFIX_OPCODE }, 3502 }, 3503 3504 /* PREFIX_0FAE_REG_6_MOD_0 */ 3505 { 3506 { "xsaveopt", { FXSAVE }, PREFIX_OPCODE | PREFIX_REX2_ILLEGAL }, 3507 { "clrssbsy", { Mq }, PREFIX_OPCODE }, 3508 { "clwb", { Mb }, PREFIX_OPCODE }, 3509 }, 3510 3511 /* PREFIX_0FAE_REG_6_MOD_3 */ 3512 { 3513 { RM_TABLE (RM_0FAE_REG_6_MOD_3_P_0) }, 3514 { "umonitor", { Eva }, PREFIX_OPCODE }, 3515 { "tpause", { Edq }, PREFIX_OPCODE }, 3516 { "umwait", { Edq }, PREFIX_OPCODE }, 3517 }, 3518 3519 /* PREFIX_0FAE_REG_7_MOD_0 */ 3520 { 3521 { "clflush", { Mb }, 0 }, 3522 { Bad_Opcode }, 3523 { "clflushopt", { Mb }, 0 }, 3524 }, 3525 3526 /* PREFIX_0FB8 */ 3527 { 3528 { Bad_Opcode }, 3529 { "popcntS", { Gv, Ev }, 0 }, 3530 }, 3531 3532 /* PREFIX_0FBC */ 3533 { 3534 { "bsfS", { Gv, Ev }, 0 }, 3535 { "tzcntS", { Gv, Ev }, 0 }, 3536 { "bsfS", { Gv, Ev }, 0 }, 3537 }, 3538 3539 /* PREFIX_0FBD */ 3540 { 3541 { "bsrS", { Gv, Ev }, 0 }, 3542 { "lzcntS", { Gv, Ev }, 0 }, 3543 { "bsrS", { Gv, Ev }, 0 }, 3544 }, 3545 3546 /* PREFIX_0FC2 */ 3547 { 3548 { "VcmppX", { XM, Vex, EXx, CMP }, 0 }, 3549 { "Vcmpss", { XMScalar, VexScalar, EXd, CMP }, 0 }, 3550 { "VcmppX", { XM, Vex, EXx, CMP }, 0 }, 3551 { "Vcmpsd", { XMScalar, VexScalar, EXq, CMP }, 0 }, 3552 }, 3553 3554 /* PREFIX_0FC7_REG_6_MOD_0 */ 3555 { 3556 { "vmptrld",{ Mq }, 0 }, 3557 { "vmxon", { Mq }, 0 }, 3558 { "vmclear",{ Mq }, 0 }, 3559 }, 3560 3561 /* PREFIX_0FC7_REG_6_MOD_3 */ 3562 { 3563 { "rdrand", { Ev }, 0 }, 3564 { X86_64_TABLE (X86_64_0FC7_REG_6_MOD_3_PREFIX_1) }, 3565 { "rdrand", { Ev }, 0 } 3566 }, 3567 3568 /* PREFIX_0FC7_REG_7_MOD_3 */ 3569 { 3570 { "rdseed", { Ev }, 0 }, 3571 { "rdpid", { Em }, 0 }, 3572 { "rdseed", { Ev }, 0 }, 3573 }, 3574 3575 /* PREFIX_0FD0 */ 3576 { 3577 { Bad_Opcode }, 3578 { Bad_Opcode }, 3579 { "VaddsubpX", { XM, Vex, EXx }, 0 }, 3580 { "VaddsubpX", { XM, Vex, EXx }, 0 }, 3581 }, 3582 3583 /* PREFIX_0FD6 */ 3584 { 3585 { Bad_Opcode }, 3586 { "movq2dq",{ XM, Nq }, 0 }, 3587 { "movq", { EXqS, XM }, 0 }, 3588 { "movdq2q",{ MX, Ux }, 0 }, 3589 }, 3590 3591 /* PREFIX_0FE6 */ 3592 { 3593 { Bad_Opcode }, 3594 { "Vcvtdq2pd", { XM, EXxmmq }, 0 }, 3595 { "Vcvttpd2dq%XY", { XMM, EXx }, 0 }, 3596 { "Vcvtpd2dq%XY", { XMM, EXx }, 0 }, 3597 }, 3598 3599 /* PREFIX_0FE7 */ 3600 { 3601 { "movntq", { Mq, MX }, 0 }, 3602 { Bad_Opcode }, 3603 { "movntdq", { Mx, XM }, 0 }, 3604 }, 3605 3606 /* PREFIX_0FF0 */ 3607 { 3608 { Bad_Opcode }, 3609 { Bad_Opcode }, 3610 { Bad_Opcode }, 3611 { "Vlddqu", { XM, M }, 0 }, 3612 }, 3613 3614 /* PREFIX_0FF7 */ 3615 { 3616 { "maskmovq", { MX, Nq }, PREFIX_OPCODE }, 3617 { Bad_Opcode }, 3618 { "maskmovdqu", { XM, Ux }, PREFIX_OPCODE }, 3619 }, 3620 3621 /* PREFIX_0F38D8 */ 3622 { 3623 { Bad_Opcode }, 3624 { REG_TABLE (REG_0F38D8_PREFIX_1) }, 3625 }, 3626 3627 /* PREFIX_0F38DC */ 3628 { 3629 { Bad_Opcode }, 3630 { MOD_TABLE (MOD_0F38DC_PREFIX_1) }, 3631 { "aesenc", { XM, EXx }, 0 }, 3632 }, 3633 3634 /* PREFIX_0F38DD */ 3635 { 3636 { Bad_Opcode }, 3637 { "aesdec128kl", { XM, M }, 0 }, 3638 { "aesenclast", { XM, EXx }, 0 }, 3639 }, 3640 3641 /* PREFIX_0F38DE */ 3642 { 3643 { Bad_Opcode }, 3644 { "aesenc256kl", { XM, M }, 0 }, 3645 { "aesdec", { XM, EXx }, 0 }, 3646 }, 3647 3648 /* PREFIX_0F38DF */ 3649 { 3650 { Bad_Opcode }, 3651 { "aesdec256kl", { XM, M }, 0 }, 3652 { "aesdeclast", { XM, EXx }, 0 }, 3653 }, 3654 3655 /* PREFIX_0F38F0 */ 3656 { 3657 { "movbeS", { Gv, Mv }, PREFIX_OPCODE }, 3658 { Bad_Opcode }, 3659 { "movbeS", { Gv, Mv }, PREFIX_OPCODE }, 3660 { "crc32A", { Gdq, Eb }, PREFIX_OPCODE }, 3661 }, 3662 3663 /* PREFIX_0F38F1 */ 3664 { 3665 { "movbeS", { Mv, Gv }, PREFIX_OPCODE }, 3666 { Bad_Opcode }, 3667 { "movbeS", { Mv, Gv }, PREFIX_OPCODE }, 3668 { "crc32Q", { Gdq, Ev }, PREFIX_OPCODE }, 3669 }, 3670 3671 /* PREFIX_0F38F6 */ 3672 { 3673 { "wrssK", { M, Gdq }, 0 }, 3674 { "adoxL", { VexGdq, Gdq, Edq }, 0 }, 3675 { "adcxL", { VexGdq, Gdq, Edq }, 0 }, 3676 { Bad_Opcode }, 3677 }, 3678 3679 /* PREFIX_0F38F8_M_0 */ 3680 { 3681 { Bad_Opcode }, 3682 { "enqcmds", { Gva, M }, 0 }, 3683 { "movdir64b", { Gva, M }, 0 }, 3684 { "enqcmd", { Gva, M }, 0 }, 3685 }, 3686 3687 /* PREFIX_0F38F8_M_1_X86_64 */ 3688 { 3689 { Bad_Opcode }, 3690 { "uwrmsr", { Gq, Rq }, 0 }, 3691 { Bad_Opcode }, 3692 { "urdmsr", { Rq, Gq }, 0 }, 3693 }, 3694 3695 /* PREFIX_0F38FA */ 3696 { 3697 { Bad_Opcode }, 3698 { "encodekey128", { Gd, Rd }, 0 }, 3699 }, 3700 3701 /* PREFIX_0F38FB */ 3702 { 3703 { Bad_Opcode }, 3704 { "encodekey256", { Gd, Rd }, 0 }, 3705 }, 3706 3707 /* PREFIX_0F38FC */ 3708 { 3709 { "aadd", { Mdq, Gdq }, 0 }, 3710 { "axor", { Mdq, Gdq }, 0 }, 3711 { "aand", { Mdq, Gdq }, 0 }, 3712 { "aor", { Mdq, Gdq }, 0 }, 3713 }, 3714 3715 /* PREFIX_0F3A0F */ 3716 { 3717 { Bad_Opcode }, 3718 { REG_TABLE (REG_0F3A0F_P_1) }, 3719 }, 3720 3721 /* PREFIX_VEX_0F12 */ 3722 { 3723 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0) }, 3724 { "%XEvmov%XSldup", { XM, EXEvexXNoBcst }, 0 }, 3725 { VEX_LEN_TABLE (VEX_LEN_0F12_P_2) }, 3726 { "%XEvmov%XDdup", { XM, EXymmq }, 0 }, 3727 }, 3728 3729 /* PREFIX_VEX_0F16 */ 3730 { 3731 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0) }, 3732 { "%XEvmov%XShdup", { XM, EXEvexXNoBcst }, 0 }, 3733 { VEX_LEN_TABLE (VEX_LEN_0F16_P_2) }, 3734 }, 3735 3736 /* PREFIX_VEX_0F2A */ 3737 { 3738 { Bad_Opcode }, 3739 { "%XEvcvtsi2ssY{%LQ|}", { XMScalar, VexScalar, EXxEVexR, Edq }, 0 }, 3740 { Bad_Opcode }, 3741 { "%XEvcvtsi2sdY{%LQ|}", { XMScalar, VexScalar, EXxEVexR64, Edq }, 0 }, 3742 }, 3743 3744 /* PREFIX_VEX_0F2C */ 3745 { 3746 { Bad_Opcode }, 3747 { "%XEvcvttss2si", { Gdq, EXd, EXxEVexS }, 0 }, 3748 { Bad_Opcode }, 3749 { "%XEvcvttsd2si", { Gdq, EXq, EXxEVexS }, 0 }, 3750 }, 3751 3752 /* PREFIX_VEX_0F2D */ 3753 { 3754 { Bad_Opcode }, 3755 { "%XEvcvtss2si", { Gdq, EXd, EXxEVexR }, 0 }, 3756 { Bad_Opcode }, 3757 { "%XEvcvtsd2si", { Gdq, EXq, EXxEVexR }, 0 }, 3758 }, 3759 3760 /* PREFIX_VEX_0F41_L_1_W_0 */ 3761 { 3762 { "kandw", { MaskG, MaskVex, MaskR }, 0 }, 3763 { Bad_Opcode }, 3764 { "kandb", { MaskG, MaskVex, MaskR }, 0 }, 3765 }, 3766 3767 /* PREFIX_VEX_0F41_L_1_W_1 */ 3768 { 3769 { "kandq", { MaskG, MaskVex, MaskR }, 0 }, 3770 { Bad_Opcode }, 3771 { "kandd", { MaskG, MaskVex, MaskR }, 0 }, 3772 }, 3773 3774 /* PREFIX_VEX_0F42_L_1_W_0 */ 3775 { 3776 { "kandnw", { MaskG, MaskVex, MaskR }, 0 }, 3777 { Bad_Opcode }, 3778 { "kandnb", { MaskG, MaskVex, MaskR }, 0 }, 3779 }, 3780 3781 /* PREFIX_VEX_0F42_L_1_W_1 */ 3782 { 3783 { "kandnq", { MaskG, MaskVex, MaskR }, 0 }, 3784 { Bad_Opcode }, 3785 { "kandnd", { MaskG, MaskVex, MaskR }, 0 }, 3786 }, 3787 3788 /* PREFIX_VEX_0F44_L_0_W_0 */ 3789 { 3790 { "knotw", { MaskG, MaskR }, 0 }, 3791 { Bad_Opcode }, 3792 { "knotb", { MaskG, MaskR }, 0 }, 3793 }, 3794 3795 /* PREFIX_VEX_0F44_L_0_W_1 */ 3796 { 3797 { "knotq", { MaskG, MaskR }, 0 }, 3798 { Bad_Opcode }, 3799 { "knotd", { MaskG, MaskR }, 0 }, 3800 }, 3801 3802 /* PREFIX_VEX_0F45_L_1_W_0 */ 3803 { 3804 { "korw", { MaskG, MaskVex, MaskR }, 0 }, 3805 { Bad_Opcode }, 3806 { "korb", { MaskG, MaskVex, MaskR }, 0 }, 3807 }, 3808 3809 /* PREFIX_VEX_0F45_L_1_W_1 */ 3810 { 3811 { "korq", { MaskG, MaskVex, MaskR }, 0 }, 3812 { Bad_Opcode }, 3813 { "kord", { MaskG, MaskVex, MaskR }, 0 }, 3814 }, 3815 3816 /* PREFIX_VEX_0F46_L_1_W_0 */ 3817 { 3818 { "kxnorw", { MaskG, MaskVex, MaskR }, 0 }, 3819 { Bad_Opcode }, 3820 { "kxnorb", { MaskG, MaskVex, MaskR }, 0 }, 3821 }, 3822 3823 /* PREFIX_VEX_0F46_L_1_W_1 */ 3824 { 3825 { "kxnorq", { MaskG, MaskVex, MaskR }, 0 }, 3826 { Bad_Opcode }, 3827 { "kxnord", { MaskG, MaskVex, MaskR }, 0 }, 3828 }, 3829 3830 /* PREFIX_VEX_0F47_L_1_W_0 */ 3831 { 3832 { "kxorw", { MaskG, MaskVex, MaskR }, 0 }, 3833 { Bad_Opcode }, 3834 { "kxorb", { MaskG, MaskVex, MaskR }, 0 }, 3835 }, 3836 3837 /* PREFIX_VEX_0F47_L_1_W_1 */ 3838 { 3839 { "kxorq", { MaskG, MaskVex, MaskR }, 0 }, 3840 { Bad_Opcode }, 3841 { "kxord", { MaskG, MaskVex, MaskR }, 0 }, 3842 }, 3843 3844 /* PREFIX_VEX_0F4A_L_1_W_0 */ 3845 { 3846 { "kaddw", { MaskG, MaskVex, MaskR }, 0 }, 3847 { Bad_Opcode }, 3848 { "kaddb", { MaskG, MaskVex, MaskR }, 0 }, 3849 }, 3850 3851 /* PREFIX_VEX_0F4A_L_1_W_1 */ 3852 { 3853 { "kaddq", { MaskG, MaskVex, MaskR }, 0 }, 3854 { Bad_Opcode }, 3855 { "kaddd", { MaskG, MaskVex, MaskR }, 0 }, 3856 }, 3857 3858 /* PREFIX_VEX_0F4B_L_1_W_0 */ 3859 { 3860 { "kunpckwd", { MaskG, MaskVex, MaskR }, 0 }, 3861 { Bad_Opcode }, 3862 { "kunpckbw", { MaskG, MaskVex, MaskR }, 0 }, 3863 }, 3864 3865 /* PREFIX_VEX_0F4B_L_1_W_1 */ 3866 { 3867 { "kunpckdq", { MaskG, MaskVex, MaskR }, 0 }, 3868 }, 3869 3870 /* PREFIX_VEX_0F6F */ 3871 { 3872 { Bad_Opcode }, 3873 { "vmovdqu", { XM, EXx }, 0 }, 3874 { "vmovdqa", { XM, EXx }, 0 }, 3875 }, 3876 3877 /* PREFIX_VEX_0F70 */ 3878 { 3879 { Bad_Opcode }, 3880 { "vpshufhw", { XM, EXx, Ib }, 0 }, 3881 { "vpshufd", { XM, EXx, Ib }, 0 }, 3882 { "vpshuflw", { XM, EXx, Ib }, 0 }, 3883 }, 3884 3885 /* PREFIX_VEX_0F7E */ 3886 { 3887 { Bad_Opcode }, 3888 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1) }, 3889 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2) }, 3890 }, 3891 3892 /* PREFIX_VEX_0F7F */ 3893 { 3894 { Bad_Opcode }, 3895 { "vmovdqu", { EXxS, XM }, 0 }, 3896 { "vmovdqa", { EXxS, XM }, 0 }, 3897 }, 3898 3899 /* PREFIX_VEX_0F90_L_0_W_0 */ 3900 { 3901 { "%XEkmovw", { MaskG, MaskE }, 0 }, 3902 { Bad_Opcode }, 3903 { "%XEkmovb", { MaskG, MaskBDE }, 0 }, 3904 }, 3905 3906 /* PREFIX_VEX_0F90_L_0_W_1 */ 3907 { 3908 { "%XEkmovq", { MaskG, MaskE }, 0 }, 3909 { Bad_Opcode }, 3910 { "%XEkmovd", { MaskG, MaskBDE }, 0 }, 3911 }, 3912 3913 /* PREFIX_VEX_0F91_L_0_W_0 */ 3914 { 3915 { "%XEkmovw", { Mw, MaskG }, 0 }, 3916 { Bad_Opcode }, 3917 { "%XEkmovb", { Mb, MaskG }, 0 }, 3918 }, 3919 3920 /* PREFIX_VEX_0F91_L_0_W_1 */ 3921 { 3922 { "%XEkmovq", { Mq, MaskG }, 0 }, 3923 { Bad_Opcode }, 3924 { "%XEkmovd", { Md, MaskG }, 0 }, 3925 }, 3926 3927 /* PREFIX_VEX_0F92_L_0_W_0 */ 3928 { 3929 { "%XEkmovw", { MaskG, Rdq }, 0 }, 3930 { Bad_Opcode }, 3931 { "%XEkmovb", { MaskG, Rdq }, 0 }, 3932 { "%XEkmovd", { MaskG, Rdq }, 0 }, 3933 }, 3934 3935 /* PREFIX_VEX_0F92_L_0_W_1 */ 3936 { 3937 { Bad_Opcode }, 3938 { Bad_Opcode }, 3939 { Bad_Opcode }, 3940 { "%XEkmovK", { MaskG, Rdq }, 0 }, 3941 }, 3942 3943 /* PREFIX_VEX_0F93_L_0_W_0 */ 3944 { 3945 { "%XEkmovw", { Gdq, MaskR }, 0 }, 3946 { Bad_Opcode }, 3947 { "%XEkmovb", { Gdq, MaskR }, 0 }, 3948 { "%XEkmovd", { Gdq, MaskR }, 0 }, 3949 }, 3950 3951 /* PREFIX_VEX_0F93_L_0_W_1 */ 3952 { 3953 { Bad_Opcode }, 3954 { Bad_Opcode }, 3955 { Bad_Opcode }, 3956 { "%XEkmovK", { Gdq, MaskR }, 0 }, 3957 }, 3958 3959 /* PREFIX_VEX_0F98_L_0_W_0 */ 3960 { 3961 { "kortestw", { MaskG, MaskR }, 0 }, 3962 { Bad_Opcode }, 3963 { "kortestb", { MaskG, MaskR }, 0 }, 3964 }, 3965 3966 /* PREFIX_VEX_0F98_L_0_W_1 */ 3967 { 3968 { "kortestq", { MaskG, MaskR }, 0 }, 3969 { Bad_Opcode }, 3970 { "kortestd", { MaskG, MaskR }, 0 }, 3971 }, 3972 3973 /* PREFIX_VEX_0F99_L_0_W_0 */ 3974 { 3975 { "ktestw", { MaskG, MaskR }, 0 }, 3976 { Bad_Opcode }, 3977 { "ktestb", { MaskG, MaskR }, 0 }, 3978 }, 3979 3980 /* PREFIX_VEX_0F99_L_0_W_1 */ 3981 { 3982 { "ktestq", { MaskG, MaskR }, 0 }, 3983 { Bad_Opcode }, 3984 { "ktestd", { MaskG, MaskR }, 0 }, 3985 }, 3986 3987 /* PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_0 */ 3988 { 3989 { "ldtilecfg", { M }, 0 }, 3990 { Bad_Opcode }, 3991 { "sttilecfg", { M }, 0 }, 3992 }, 3993 3994 /* PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_1 */ 3995 { 3996 { REG_TABLE (REG_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0) }, 3997 { Bad_Opcode }, 3998 { Bad_Opcode }, 3999 { RM_TABLE (RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_3) }, 4000 }, 4001 4002 /* PREFIX_VEX_0F384B_X86_64_L_0_W_0 */ 4003 { 4004 { Bad_Opcode }, 4005 { "tilestored", { MVexSIBMEM, TMM }, 0 }, 4006 { "tileloaddt1", { TMM, MVexSIBMEM }, 0 }, 4007 { "tileloadd", { TMM, MVexSIBMEM }, 0 }, 4008 }, 4009 4010 /* PREFIX_VEX_0F3850_W_0 */ 4011 { 4012 { "vpdpbuud", { XM, Vex, EXx }, 0 }, 4013 { "vpdpbsud", { XM, Vex, EXx }, 0 }, 4014 { "%XVvpdpbusd", { XM, Vex, EXx }, 0 }, 4015 { "vpdpbssd", { XM, Vex, EXx }, 0 }, 4016 }, 4017 4018 /* PREFIX_VEX_0F3851_W_0 */ 4019 { 4020 { "vpdpbuuds", { XM, Vex, EXx }, 0 }, 4021 { "vpdpbsuds", { XM, Vex, EXx }, 0 }, 4022 { "%XVvpdpbusds", { XM, Vex, EXx }, 0 }, 4023 { "vpdpbssds", { XM, Vex, EXx }, 0 }, 4024 }, 4025 /* PREFIX_VEX_0F385C_X86_64_L_0_W_0 */ 4026 { 4027 { Bad_Opcode }, 4028 { "tdpbf16ps", { TMM, Rtmm, VexTmm }, 0 }, 4029 { Bad_Opcode }, 4030 { "tdpfp16ps", { TMM, Rtmm, VexTmm }, 0 }, 4031 }, 4032 4033 /* PREFIX_VEX_0F385E_X86_64_L_0_W_0 */ 4034 { 4035 { "tdpbuud", {TMM, Rtmm, VexTmm }, 0 }, 4036 { "tdpbsud", {TMM, Rtmm, VexTmm }, 0 }, 4037 { "tdpbusd", {TMM, Rtmm, VexTmm }, 0 }, 4038 { "tdpbssd", {TMM, Rtmm, VexTmm }, 0 }, 4039 }, 4040 4041 /* PREFIX_VEX_0F386C_X86_64_L_0_W_0 */ 4042 { 4043 { "tcmmrlfp16ps", { TMM, Rtmm, VexTmm }, 0 }, 4044 { Bad_Opcode }, 4045 { "tcmmimfp16ps", { TMM, Rtmm, VexTmm }, 0 }, 4046 }, 4047 4048 /* PREFIX_VEX_0F3872 */ 4049 { 4050 { Bad_Opcode }, 4051 { VEX_W_TABLE (VEX_W_0F3872_P_1) }, 4052 }, 4053 4054 /* PREFIX_VEX_0F38B0_W_0 */ 4055 { 4056 { "vcvtneoph2ps", { XM, Mx }, 0 }, 4057 { "vcvtneebf162ps", { XM, Mx }, 0 }, 4058 { "vcvtneeph2ps", { XM, Mx }, 0 }, 4059 { "vcvtneobf162ps", { XM, Mx }, 0 }, 4060 }, 4061 4062 /* PREFIX_VEX_0F38B1_W_0 */ 4063 { 4064 { Bad_Opcode }, 4065 { "vbcstnebf162ps", { XM, Mw }, 0 }, 4066 { "vbcstnesh2ps", { XM, Mw }, 0 }, 4067 }, 4068 4069 /* PREFIX_VEX_0F38D2_W_0 */ 4070 { 4071 { "vpdpwuud", { XM, Vex, EXx }, 0 }, 4072 { "vpdpwsud", { XM, Vex, EXx }, 0 }, 4073 { "vpdpwusd", { XM, Vex, EXx }, 0 }, 4074 }, 4075 4076 /* PREFIX_VEX_0F38D3_W_0 */ 4077 { 4078 { "vpdpwuuds", { XM, Vex, EXx }, 0 }, 4079 { "vpdpwsuds", { XM, Vex, EXx }, 0 }, 4080 { "vpdpwusds", { XM, Vex, EXx }, 0 }, 4081 }, 4082 4083 /* PREFIX_VEX_0F38CB */ 4084 { 4085 { Bad_Opcode }, 4086 { Bad_Opcode }, 4087 { Bad_Opcode }, 4088 { VEX_W_TABLE (VEX_W_0F38CB_P_3) }, 4089 }, 4090 4091 /* PREFIX_VEX_0F38CC */ 4092 { 4093 { Bad_Opcode }, 4094 { Bad_Opcode }, 4095 { Bad_Opcode }, 4096 { VEX_W_TABLE (VEX_W_0F38CC_P_3) }, 4097 }, 4098 4099 /* PREFIX_VEX_0F38CD */ 4100 { 4101 { Bad_Opcode }, 4102 { Bad_Opcode }, 4103 { Bad_Opcode }, 4104 { VEX_W_TABLE (VEX_W_0F38CD_P_3) }, 4105 }, 4106 4107 /* PREFIX_VEX_0F38DA_W_0 */ 4108 { 4109 { VEX_LEN_TABLE (VEX_LEN_0F38DA_W_0_P_0) }, 4110 { "vsm4key4", { XM, Vex, EXx }, 0 }, 4111 { VEX_LEN_TABLE (VEX_LEN_0F38DA_W_0_P_2) }, 4112 { "vsm4rnds4", { XM, Vex, EXx }, 0 }, 4113 }, 4114 4115 /* PREFIX_VEX_0F38F2_L_0 */ 4116 { 4117 { "%NFandnS", { Gdq, VexGdq, Edq }, 0 }, 4118 }, 4119 4120 /* PREFIX_VEX_0F38F3_L_0 */ 4121 { 4122 { REG_TABLE (REG_VEX_0F38F3_L_0_P_0) }, 4123 }, 4124 4125 /* PREFIX_VEX_0F38F5_L_0 */ 4126 { 4127 { "%NFbzhiS", { Gdq, Edq, VexGdq }, 0 }, 4128 { "%XEpextS", { Gdq, VexGdq, Edq }, 0 }, 4129 { Bad_Opcode }, 4130 { "%XEpdepS", { Gdq, VexGdq, Edq }, 0 }, 4131 }, 4132 4133 /* PREFIX_VEX_0F38F6_L_0 */ 4134 { 4135 { Bad_Opcode }, 4136 { Bad_Opcode }, 4137 { Bad_Opcode }, 4138 { "%XEmulxS", { Gdq, VexGdq, Edq }, 0 }, 4139 }, 4140 4141 /* PREFIX_VEX_0F38F7_L_0 */ 4142 { 4143 { "%NFbextrS", { Gdq, Edq, VexGdq }, 0 }, 4144 { "%XEsarxS", { Gdq, Edq, VexGdq }, 0 }, 4145 { "%XEshlxS", { Gdq, Edq, VexGdq }, 0 }, 4146 { "%XEshrxS", { Gdq, Edq, VexGdq }, 0 }, 4147 }, 4148 4149 /* PREFIX_VEX_0F3AF0_L_0 */ 4150 { 4151 { Bad_Opcode }, 4152 { Bad_Opcode }, 4153 { Bad_Opcode }, 4154 { "%XErorxS", { Gdq, Edq, Ib }, 0 }, 4155 }, 4156 4157 /* PREFIX_VEX_MAP7_F8_L_0_W_0_R_0_X86_64 */ 4158 { 4159 { Bad_Opcode }, 4160 { "uwrmsr", { Skip_MODRM, Id, Rq }, 0 }, 4161 { Bad_Opcode }, 4162 { "urdmsr", { Rq, Id }, 0 }, 4163 }, 4164 4165 #include "i386-dis-evex-prefix.h" 4166 }; 4167 4168 static const struct dis386 x86_64_table[][2] = { 4169 /* X86_64_06 */ 4170 { 4171 { "pushP", { es }, 0 }, 4172 }, 4173 4174 /* X86_64_07 */ 4175 { 4176 { "popP", { es }, 0 }, 4177 }, 4178 4179 /* X86_64_0E */ 4180 { 4181 { "pushP", { cs }, 0 }, 4182 }, 4183 4184 /* X86_64_16 */ 4185 { 4186 { "pushP", { ss }, 0 }, 4187 }, 4188 4189 /* X86_64_17 */ 4190 { 4191 { "popP", { ss }, 0 }, 4192 }, 4193 4194 /* X86_64_1E */ 4195 { 4196 { "pushP", { ds }, 0 }, 4197 }, 4198 4199 /* X86_64_1F */ 4200 { 4201 { "popP", { ds }, 0 }, 4202 }, 4203 4204 /* X86_64_27 */ 4205 { 4206 { "daa", { XX }, 0 }, 4207 }, 4208 4209 /* X86_64_2F */ 4210 { 4211 { "das", { XX }, 0 }, 4212 }, 4213 4214 /* X86_64_37 */ 4215 { 4216 { "aaa", { XX }, 0 }, 4217 }, 4218 4219 /* X86_64_3F */ 4220 { 4221 { "aas", { XX }, 0 }, 4222 }, 4223 4224 /* X86_64_60 */ 4225 { 4226 { "pushaP", { XX }, 0 }, 4227 }, 4228 4229 /* X86_64_61 */ 4230 { 4231 { "popaP", { XX }, 0 }, 4232 }, 4233 4234 /* X86_64_62 */ 4235 { 4236 { MOD_TABLE (MOD_62_32BIT) }, 4237 { EVEX_TABLE () }, 4238 }, 4239 4240 /* X86_64_63 */ 4241 { 4242 { "arplS", { Sv, Gv }, 0 }, 4243 { "movs", { Gv, { MOVSXD_Fixup, movsxd_mode } }, 0 }, 4244 }, 4245 4246 /* X86_64_6D */ 4247 { 4248 { "ins{R|}", { Yzr, indirDX }, 0 }, 4249 { "ins{G|}", { Yzr, indirDX }, 0 }, 4250 }, 4251 4252 /* X86_64_6F */ 4253 { 4254 { "outs{R|}", { indirDXr, Xz }, 0 }, 4255 { "outs{G|}", { indirDXr, Xz }, 0 }, 4256 }, 4257 4258 /* X86_64_82 */ 4259 { 4260 /* Opcode 0x82 is an alias of opcode 0x80 in 32-bit mode. */ 4261 { REG_TABLE (REG_80) }, 4262 }, 4263 4264 /* X86_64_9A */ 4265 { 4266 { "{l|}call{P|}", { Ap }, 0 }, 4267 }, 4268 4269 /* X86_64_C2 */ 4270 { 4271 { "retP", { Iw, BND }, 0 }, 4272 { "ret@", { Iw, BND }, 0 }, 4273 }, 4274 4275 /* X86_64_C3 */ 4276 { 4277 { "retP", { BND }, 0 }, 4278 { "ret@", { BND }, 0 }, 4279 }, 4280 4281 /* X86_64_C4 */ 4282 { 4283 { MOD_TABLE (MOD_C4_32BIT) }, 4284 { VEX_C4_TABLE () }, 4285 }, 4286 4287 /* X86_64_C5 */ 4288 { 4289 { MOD_TABLE (MOD_C5_32BIT) }, 4290 { VEX_C5_TABLE () }, 4291 }, 4292 4293 /* X86_64_CE */ 4294 { 4295 { "into", { XX }, 0 }, 4296 }, 4297 4298 /* X86_64_D4 */ 4299 { 4300 { "aam", { Ib }, 0 }, 4301 }, 4302 4303 /* X86_64_D5 */ 4304 { 4305 { "aad", { Ib }, 0 }, 4306 }, 4307 4308 /* X86_64_E8 */ 4309 { 4310 { "callP", { Jv, BND }, 0 }, 4311 { "call@", { Jv, BND }, PREFIX_REX2_ILLEGAL } 4312 }, 4313 4314 /* X86_64_E9 */ 4315 { 4316 { "jmpP", { Jv, BND }, 0 }, 4317 { "jmp@", { Jv, BND }, PREFIX_REX2_ILLEGAL } 4318 }, 4319 4320 /* X86_64_EA */ 4321 { 4322 { "{l|}jmp{P|}", { Ap }, 0 }, 4323 }, 4324 4325 /* X86_64_0F00_REG_6 */ 4326 { 4327 { Bad_Opcode }, 4328 { PREFIX_TABLE (PREFIX_0F00_REG_6_X86_64) }, 4329 }, 4330 4331 /* X86_64_0F01_REG_0 */ 4332 { 4333 { "sgdt{Q|Q}", { M }, 0 }, 4334 { "sgdt", { M }, 0 }, 4335 }, 4336 4337 /* X86_64_0F01_REG_0_MOD_3_RM_6_P_1 */ 4338 { 4339 { Bad_Opcode }, 4340 { "wrmsrlist", { Skip_MODRM }, 0 }, 4341 }, 4342 4343 /* X86_64_0F01_REG_0_MOD_3_RM_6_P_3 */ 4344 { 4345 { Bad_Opcode }, 4346 { "rdmsrlist", { Skip_MODRM }, 0 }, 4347 }, 4348 4349 /* X86_64_0F01_REG_0_MOD_3_RM_7_P_0 */ 4350 { 4351 { Bad_Opcode }, 4352 { "pbndkb", { Skip_MODRM }, 0 }, 4353 }, 4354 4355 /* X86_64_0F01_REG_1 */ 4356 { 4357 { "sidt{Q|Q}", { M }, 0 }, 4358 { "sidt", { M }, 0 }, 4359 }, 4360 4361 /* X86_64_0F01_REG_1_RM_2_PREFIX_1 */ 4362 { 4363 { Bad_Opcode }, 4364 { "eretu", { Skip_MODRM }, 0 }, 4365 }, 4366 4367 /* X86_64_0F01_REG_1_RM_2_PREFIX_3 */ 4368 { 4369 { Bad_Opcode }, 4370 { "erets", { Skip_MODRM }, 0 }, 4371 }, 4372 4373 /* X86_64_0F01_REG_1_RM_5_PREFIX_2 */ 4374 { 4375 { Bad_Opcode }, 4376 { "seamret", { Skip_MODRM }, 0 }, 4377 }, 4378 4379 /* X86_64_0F01_REG_1_RM_6_PREFIX_2 */ 4380 { 4381 { Bad_Opcode }, 4382 { "seamops", { Skip_MODRM }, 0 }, 4383 }, 4384 4385 /* X86_64_0F01_REG_1_RM_7_PREFIX_2 */ 4386 { 4387 { Bad_Opcode }, 4388 { "seamcall", { Skip_MODRM }, 0 }, 4389 }, 4390 4391 /* X86_64_0F01_REG_2 */ 4392 { 4393 { "lgdt{Q|Q}", { M }, 0 }, 4394 { "lgdt", { M }, 0 }, 4395 }, 4396 4397 /* X86_64_0F01_REG_3 */ 4398 { 4399 { "lidt{Q|Q}", { M }, 0 }, 4400 { "lidt", { M }, 0 }, 4401 }, 4402 4403 /* X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1 */ 4404 { 4405 { Bad_Opcode }, 4406 { "uiret", { Skip_MODRM }, 0 }, 4407 }, 4408 4409 /* X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1 */ 4410 { 4411 { Bad_Opcode }, 4412 { "testui", { Skip_MODRM }, 0 }, 4413 }, 4414 4415 /* X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1 */ 4416 { 4417 { Bad_Opcode }, 4418 { "clui", { Skip_MODRM }, 0 }, 4419 }, 4420 4421 /* X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1 */ 4422 { 4423 { Bad_Opcode }, 4424 { "stui", { Skip_MODRM }, 0 }, 4425 }, 4426 4427 /* X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_1 */ 4428 { 4429 { Bad_Opcode }, 4430 { "rmpquery", { Skip_MODRM }, 0 }, 4431 }, 4432 4433 /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1 */ 4434 { 4435 { Bad_Opcode }, 4436 { "rmpadjust", { Skip_MODRM }, 0 }, 4437 }, 4438 4439 /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3 */ 4440 { 4441 { Bad_Opcode }, 4442 { "rmpupdate", { Skip_MODRM }, 0 }, 4443 }, 4444 4445 /* X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1 */ 4446 { 4447 { Bad_Opcode }, 4448 { "psmash", { Skip_MODRM }, 0 }, 4449 }, 4450 4451 /* X86_64_0F18_REG_6_MOD_0 */ 4452 { 4453 { "nopQ", { Ev }, 0 }, 4454 { PREFIX_TABLE (PREFIX_0F18_REG_6_MOD_0_X86_64) }, 4455 }, 4456 4457 /* X86_64_0F18_REG_7_MOD_0 */ 4458 { 4459 { "nopQ", { Ev }, 0 }, 4460 { PREFIX_TABLE (PREFIX_0F18_REG_7_MOD_0_X86_64) }, 4461 }, 4462 4463 { 4464 /* X86_64_0F24 */ 4465 { "movZ", { Em, Td }, 0 }, 4466 }, 4467 4468 { 4469 /* X86_64_0F26 */ 4470 { "movZ", { Td, Em }, 0 }, 4471 }, 4472 4473 { 4474 /* X86_64_0F38F8_M_1 */ 4475 { Bad_Opcode }, 4476 { PREFIX_TABLE (PREFIX_0F38F8_M_1_X86_64) }, 4477 }, 4478 4479 /* X86_64_0FC7_REG_6_MOD_3_PREFIX_1 */ 4480 { 4481 { Bad_Opcode }, 4482 { "senduipi", { Eq }, 0 }, 4483 }, 4484 4485 /* X86_64_VEX_0F3849 */ 4486 { 4487 { Bad_Opcode }, 4488 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64) }, 4489 }, 4490 4491 /* X86_64_VEX_0F384B */ 4492 { 4493 { Bad_Opcode }, 4494 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64) }, 4495 }, 4496 4497 /* X86_64_VEX_0F385C */ 4498 { 4499 { Bad_Opcode }, 4500 { VEX_LEN_TABLE (VEX_LEN_0F385C_X86_64) }, 4501 }, 4502 4503 /* X86_64_VEX_0F385E */ 4504 { 4505 { Bad_Opcode }, 4506 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64) }, 4507 }, 4508 4509 /* X86_64_VEX_0F386C */ 4510 { 4511 { Bad_Opcode }, 4512 { VEX_LEN_TABLE (VEX_LEN_0F386C_X86_64) }, 4513 }, 4514 4515 /* X86_64_VEX_0F38E0 */ 4516 { 4517 { Bad_Opcode }, 4518 { "%XEcmpoxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, 4519 }, 4520 4521 /* X86_64_VEX_0F38E1 */ 4522 { 4523 { Bad_Opcode }, 4524 { "%XEcmpnoxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, 4525 }, 4526 4527 /* X86_64_VEX_0F38E2 */ 4528 { 4529 { Bad_Opcode }, 4530 { "%XEcmpbxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, 4531 }, 4532 4533 /* X86_64_VEX_0F38E3 */ 4534 { 4535 { Bad_Opcode }, 4536 { "%XEcmpnbxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, 4537 }, 4538 4539 /* X86_64_VEX_0F38E4 */ 4540 { 4541 { Bad_Opcode }, 4542 { "%XEcmpzxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, 4543 }, 4544 4545 /* X86_64_VEX_0F38E5 */ 4546 { 4547 { Bad_Opcode }, 4548 { "%XEcmpnzxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, 4549 }, 4550 4551 /* X86_64_VEX_0F38E6 */ 4552 { 4553 { Bad_Opcode }, 4554 { "%XEcmpbexadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, 4555 }, 4556 4557 /* X86_64_VEX_0F38E7 */ 4558 { 4559 { Bad_Opcode }, 4560 { "%XEcmpnbexadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, 4561 }, 4562 4563 /* X86_64_VEX_0F38E8 */ 4564 { 4565 { Bad_Opcode }, 4566 { "%XEcmpsxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, 4567 }, 4568 4569 /* X86_64_VEX_0F38E9 */ 4570 { 4571 { Bad_Opcode }, 4572 { "%XEcmpnsxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, 4573 }, 4574 4575 /* X86_64_VEX_0F38EA */ 4576 { 4577 { Bad_Opcode }, 4578 { "%XEcmppxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, 4579 }, 4580 4581 /* X86_64_VEX_0F38EB */ 4582 { 4583 { Bad_Opcode }, 4584 { "%XEcmpnpxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, 4585 }, 4586 4587 /* X86_64_VEX_0F38EC */ 4588 { 4589 { Bad_Opcode }, 4590 { "%XEcmplxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, 4591 }, 4592 4593 /* X86_64_VEX_0F38ED */ 4594 { 4595 { Bad_Opcode }, 4596 { "%XEcmpnlxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, 4597 }, 4598 4599 /* X86_64_VEX_0F38EE */ 4600 { 4601 { Bad_Opcode }, 4602 { "%XEcmplexadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, 4603 }, 4604 4605 /* X86_64_VEX_0F38EF */ 4606 { 4607 { Bad_Opcode }, 4608 { "%XEcmpnlexadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, 4609 }, 4610 4611 /* X86_64_VEX_MAP7_F8_L_0_W_0_R_0 */ 4612 { 4613 { Bad_Opcode }, 4614 { PREFIX_TABLE (PREFIX_VEX_MAP7_F8_L_0_W_0_R_0_X86_64) }, 4615 }, 4616 }; 4617 4618 static const struct dis386 three_byte_table[][256] = { 4619 4620 /* THREE_BYTE_0F38 */ 4621 { 4622 /* 00 */ 4623 { "pshufb", { MX, EM }, PREFIX_OPCODE }, 4624 { "phaddw", { MX, EM }, PREFIX_OPCODE }, 4625 { "phaddd", { MX, EM }, PREFIX_OPCODE }, 4626 { "phaddsw", { MX, EM }, PREFIX_OPCODE }, 4627 { "pmaddubsw", { MX, EM }, PREFIX_OPCODE }, 4628 { "phsubw", { MX, EM }, PREFIX_OPCODE }, 4629 { "phsubd", { MX, EM }, PREFIX_OPCODE }, 4630 { "phsubsw", { MX, EM }, PREFIX_OPCODE }, 4631 /* 08 */ 4632 { "psignb", { MX, EM }, PREFIX_OPCODE }, 4633 { "psignw", { MX, EM }, PREFIX_OPCODE }, 4634 { "psignd", { MX, EM }, PREFIX_OPCODE }, 4635 { "pmulhrsw", { MX, EM }, PREFIX_OPCODE }, 4636 { Bad_Opcode }, 4637 { Bad_Opcode }, 4638 { Bad_Opcode }, 4639 { Bad_Opcode }, 4640 /* 10 */ 4641 { "pblendvb", { XM, EXx, XMM0 }, PREFIX_DATA }, 4642 { Bad_Opcode }, 4643 { Bad_Opcode }, 4644 { Bad_Opcode }, 4645 { "blendvps", { XM, EXx, XMM0 }, PREFIX_DATA }, 4646 { "blendvpd", { XM, EXx, XMM0 }, PREFIX_DATA }, 4647 { Bad_Opcode }, 4648 { "ptest", { XM, EXx }, PREFIX_DATA }, 4649 /* 18 */ 4650 { Bad_Opcode }, 4651 { Bad_Opcode }, 4652 { Bad_Opcode }, 4653 { Bad_Opcode }, 4654 { "pabsb", { MX, EM }, PREFIX_OPCODE }, 4655 { "pabsw", { MX, EM }, PREFIX_OPCODE }, 4656 { "pabsd", { MX, EM }, PREFIX_OPCODE }, 4657 { Bad_Opcode }, 4658 /* 20 */ 4659 { "pmovsxbw", { XM, EXq }, PREFIX_DATA }, 4660 { "pmovsxbd", { XM, EXd }, PREFIX_DATA }, 4661 { "pmovsxbq", { XM, EXw }, PREFIX_DATA }, 4662 { "pmovsxwd", { XM, EXq }, PREFIX_DATA }, 4663 { "pmovsxwq", { XM, EXd }, PREFIX_DATA }, 4664 { "pmovsxdq", { XM, EXq }, PREFIX_DATA }, 4665 { Bad_Opcode }, 4666 { Bad_Opcode }, 4667 /* 28 */ 4668 { "pmuldq", { XM, EXx }, PREFIX_DATA }, 4669 { "pcmpeqq", { XM, EXx }, PREFIX_DATA }, 4670 { "movntdqa", { XM, Mx }, PREFIX_DATA }, 4671 { "packusdw", { XM, EXx }, PREFIX_DATA }, 4672 { Bad_Opcode }, 4673 { Bad_Opcode }, 4674 { Bad_Opcode }, 4675 { Bad_Opcode }, 4676 /* 30 */ 4677 { "pmovzxbw", { XM, EXq }, PREFIX_DATA }, 4678 { "pmovzxbd", { XM, EXd }, PREFIX_DATA }, 4679 { "pmovzxbq", { XM, EXw }, PREFIX_DATA }, 4680 { "pmovzxwd", { XM, EXq }, PREFIX_DATA }, 4681 { "pmovzxwq", { XM, EXd }, PREFIX_DATA }, 4682 { "pmovzxdq", { XM, EXq }, PREFIX_DATA }, 4683 { Bad_Opcode }, 4684 { "pcmpgtq", { XM, EXx }, PREFIX_DATA }, 4685 /* 38 */ 4686 { "pminsb", { XM, EXx }, PREFIX_DATA }, 4687 { "pminsd", { XM, EXx }, PREFIX_DATA }, 4688 { "pminuw", { XM, EXx }, PREFIX_DATA }, 4689 { "pminud", { XM, EXx }, PREFIX_DATA }, 4690 { "pmaxsb", { XM, EXx }, PREFIX_DATA }, 4691 { "pmaxsd", { XM, EXx }, PREFIX_DATA }, 4692 { "pmaxuw", { XM, EXx }, PREFIX_DATA }, 4693 { "pmaxud", { XM, EXx }, PREFIX_DATA }, 4694 /* 40 */ 4695 { "pmulld", { XM, EXx }, PREFIX_DATA }, 4696 { "phminposuw", { XM, EXx }, PREFIX_DATA }, 4697 { Bad_Opcode }, 4698 { Bad_Opcode }, 4699 { Bad_Opcode }, 4700 { Bad_Opcode }, 4701 { Bad_Opcode }, 4702 { Bad_Opcode }, 4703 /* 48 */ 4704 { Bad_Opcode }, 4705 { Bad_Opcode }, 4706 { Bad_Opcode }, 4707 { Bad_Opcode }, 4708 { Bad_Opcode }, 4709 { Bad_Opcode }, 4710 { Bad_Opcode }, 4711 { Bad_Opcode }, 4712 /* 50 */ 4713 { Bad_Opcode }, 4714 { Bad_Opcode }, 4715 { Bad_Opcode }, 4716 { Bad_Opcode }, 4717 { Bad_Opcode }, 4718 { Bad_Opcode }, 4719 { Bad_Opcode }, 4720 { Bad_Opcode }, 4721 /* 58 */ 4722 { Bad_Opcode }, 4723 { Bad_Opcode }, 4724 { Bad_Opcode }, 4725 { Bad_Opcode }, 4726 { Bad_Opcode }, 4727 { Bad_Opcode }, 4728 { Bad_Opcode }, 4729 { Bad_Opcode }, 4730 /* 60 */ 4731 { Bad_Opcode }, 4732 { Bad_Opcode }, 4733 { Bad_Opcode }, 4734 { Bad_Opcode }, 4735 { Bad_Opcode }, 4736 { Bad_Opcode }, 4737 { Bad_Opcode }, 4738 { Bad_Opcode }, 4739 /* 68 */ 4740 { Bad_Opcode }, 4741 { Bad_Opcode }, 4742 { Bad_Opcode }, 4743 { Bad_Opcode }, 4744 { Bad_Opcode }, 4745 { Bad_Opcode }, 4746 { Bad_Opcode }, 4747 { Bad_Opcode }, 4748 /* 70 */ 4749 { Bad_Opcode }, 4750 { Bad_Opcode }, 4751 { Bad_Opcode }, 4752 { Bad_Opcode }, 4753 { Bad_Opcode }, 4754 { Bad_Opcode }, 4755 { Bad_Opcode }, 4756 { Bad_Opcode }, 4757 /* 78 */ 4758 { Bad_Opcode }, 4759 { Bad_Opcode }, 4760 { Bad_Opcode }, 4761 { Bad_Opcode }, 4762 { Bad_Opcode }, 4763 { Bad_Opcode }, 4764 { Bad_Opcode }, 4765 { Bad_Opcode }, 4766 /* 80 */ 4767 { "invept", { Gm, Mo }, PREFIX_DATA }, 4768 { "invvpid", { Gm, Mo }, PREFIX_DATA }, 4769 { "invpcid", { Gm, M }, PREFIX_DATA }, 4770 { Bad_Opcode }, 4771 { Bad_Opcode }, 4772 { Bad_Opcode }, 4773 { Bad_Opcode }, 4774 { Bad_Opcode }, 4775 /* 88 */ 4776 { Bad_Opcode }, 4777 { Bad_Opcode }, 4778 { Bad_Opcode }, 4779 { Bad_Opcode }, 4780 { Bad_Opcode }, 4781 { Bad_Opcode }, 4782 { Bad_Opcode }, 4783 { Bad_Opcode }, 4784 /* 90 */ 4785 { Bad_Opcode }, 4786 { Bad_Opcode }, 4787 { Bad_Opcode }, 4788 { Bad_Opcode }, 4789 { Bad_Opcode }, 4790 { Bad_Opcode }, 4791 { Bad_Opcode }, 4792 { Bad_Opcode }, 4793 /* 98 */ 4794 { Bad_Opcode }, 4795 { Bad_Opcode }, 4796 { Bad_Opcode }, 4797 { Bad_Opcode }, 4798 { Bad_Opcode }, 4799 { Bad_Opcode }, 4800 { Bad_Opcode }, 4801 { Bad_Opcode }, 4802 /* a0 */ 4803 { Bad_Opcode }, 4804 { Bad_Opcode }, 4805 { Bad_Opcode }, 4806 { Bad_Opcode }, 4807 { Bad_Opcode }, 4808 { Bad_Opcode }, 4809 { Bad_Opcode }, 4810 { Bad_Opcode }, 4811 /* a8 */ 4812 { Bad_Opcode }, 4813 { Bad_Opcode }, 4814 { Bad_Opcode }, 4815 { Bad_Opcode }, 4816 { Bad_Opcode }, 4817 { Bad_Opcode }, 4818 { Bad_Opcode }, 4819 { Bad_Opcode }, 4820 /* b0 */ 4821 { Bad_Opcode }, 4822 { Bad_Opcode }, 4823 { Bad_Opcode }, 4824 { Bad_Opcode }, 4825 { Bad_Opcode }, 4826 { Bad_Opcode }, 4827 { Bad_Opcode }, 4828 { Bad_Opcode }, 4829 /* b8 */ 4830 { Bad_Opcode }, 4831 { Bad_Opcode }, 4832 { Bad_Opcode }, 4833 { Bad_Opcode }, 4834 { Bad_Opcode }, 4835 { Bad_Opcode }, 4836 { Bad_Opcode }, 4837 { Bad_Opcode }, 4838 /* c0 */ 4839 { Bad_Opcode }, 4840 { Bad_Opcode }, 4841 { Bad_Opcode }, 4842 { Bad_Opcode }, 4843 { Bad_Opcode }, 4844 { Bad_Opcode }, 4845 { Bad_Opcode }, 4846 { Bad_Opcode }, 4847 /* c8 */ 4848 { "sha1nexte", { XM, EXxmm }, PREFIX_OPCODE }, 4849 { "sha1msg1", { XM, EXxmm }, PREFIX_OPCODE }, 4850 { "sha1msg2", { XM, EXxmm }, PREFIX_OPCODE }, 4851 { "sha256rnds2", { XM, EXxmm, XMM0 }, PREFIX_OPCODE }, 4852 { "sha256msg1", { XM, EXxmm }, PREFIX_OPCODE }, 4853 { "sha256msg2", { XM, EXxmm }, PREFIX_OPCODE }, 4854 { Bad_Opcode }, 4855 { "gf2p8mulb", { XM, EXxmm }, PREFIX_DATA }, 4856 /* d0 */ 4857 { Bad_Opcode }, 4858 { Bad_Opcode }, 4859 { Bad_Opcode }, 4860 { Bad_Opcode }, 4861 { Bad_Opcode }, 4862 { Bad_Opcode }, 4863 { Bad_Opcode }, 4864 { Bad_Opcode }, 4865 /* d8 */ 4866 { PREFIX_TABLE (PREFIX_0F38D8) }, 4867 { Bad_Opcode }, 4868 { Bad_Opcode }, 4869 { "aesimc", { XM, EXx }, PREFIX_DATA }, 4870 { PREFIX_TABLE (PREFIX_0F38DC) }, 4871 { PREFIX_TABLE (PREFIX_0F38DD) }, 4872 { PREFIX_TABLE (PREFIX_0F38DE) }, 4873 { PREFIX_TABLE (PREFIX_0F38DF) }, 4874 /* e0 */ 4875 { Bad_Opcode }, 4876 { Bad_Opcode }, 4877 { Bad_Opcode }, 4878 { Bad_Opcode }, 4879 { Bad_Opcode }, 4880 { Bad_Opcode }, 4881 { Bad_Opcode }, 4882 { Bad_Opcode }, 4883 /* e8 */ 4884 { Bad_Opcode }, 4885 { Bad_Opcode }, 4886 { Bad_Opcode }, 4887 { Bad_Opcode }, 4888 { Bad_Opcode }, 4889 { Bad_Opcode }, 4890 { Bad_Opcode }, 4891 { Bad_Opcode }, 4892 /* f0 */ 4893 { PREFIX_TABLE (PREFIX_0F38F0) }, 4894 { PREFIX_TABLE (PREFIX_0F38F1) }, 4895 { Bad_Opcode }, 4896 { Bad_Opcode }, 4897 { Bad_Opcode }, 4898 { "wrussK", { M, Gdq }, PREFIX_DATA }, 4899 { PREFIX_TABLE (PREFIX_0F38F6) }, 4900 { Bad_Opcode }, 4901 /* f8 */ 4902 { MOD_TABLE (MOD_0F38F8) }, 4903 { "movdiri", { Mdq, Gdq }, PREFIX_OPCODE }, 4904 { PREFIX_TABLE (PREFIX_0F38FA) }, 4905 { PREFIX_TABLE (PREFIX_0F38FB) }, 4906 { PREFIX_TABLE (PREFIX_0F38FC) }, 4907 { Bad_Opcode }, 4908 { Bad_Opcode }, 4909 { Bad_Opcode }, 4910 }, 4911 /* THREE_BYTE_0F3A */ 4912 { 4913 /* 00 */ 4914 { Bad_Opcode }, 4915 { Bad_Opcode }, 4916 { Bad_Opcode }, 4917 { Bad_Opcode }, 4918 { Bad_Opcode }, 4919 { Bad_Opcode }, 4920 { Bad_Opcode }, 4921 { Bad_Opcode }, 4922 /* 08 */ 4923 { "roundps", { XM, EXx, Ib }, PREFIX_DATA }, 4924 { "roundpd", { XM, EXx, Ib }, PREFIX_DATA }, 4925 { "roundss", { XM, EXd, Ib }, PREFIX_DATA }, 4926 { "roundsd", { XM, EXq, Ib }, PREFIX_DATA }, 4927 { "blendps", { XM, EXx, Ib }, PREFIX_DATA }, 4928 { "blendpd", { XM, EXx, Ib }, PREFIX_DATA }, 4929 { "pblendw", { XM, EXx, Ib }, PREFIX_DATA }, 4930 { "palignr", { MX, EM, Ib }, PREFIX_OPCODE }, 4931 /* 10 */ 4932 { Bad_Opcode }, 4933 { Bad_Opcode }, 4934 { Bad_Opcode }, 4935 { Bad_Opcode }, 4936 { "pextrb", { Edb, XM, Ib }, PREFIX_DATA }, 4937 { "pextrw", { Edw, XM, Ib }, PREFIX_DATA }, 4938 { "pextrK", { Edq, XM, Ib }, PREFIX_DATA }, 4939 { "extractps", { Ed, XM, Ib }, PREFIX_DATA }, 4940 /* 18 */ 4941 { Bad_Opcode }, 4942 { Bad_Opcode }, 4943 { Bad_Opcode }, 4944 { Bad_Opcode }, 4945 { Bad_Opcode }, 4946 { Bad_Opcode }, 4947 { Bad_Opcode }, 4948 { Bad_Opcode }, 4949 /* 20 */ 4950 { "pinsrb", { XM, Edb, Ib }, PREFIX_DATA }, 4951 { "insertps", { XM, EXd, Ib }, PREFIX_DATA }, 4952 { "pinsrK", { XM, Edq, Ib }, PREFIX_DATA }, 4953 { Bad_Opcode }, 4954 { Bad_Opcode }, 4955 { Bad_Opcode }, 4956 { Bad_Opcode }, 4957 { Bad_Opcode }, 4958 /* 28 */ 4959 { Bad_Opcode }, 4960 { Bad_Opcode }, 4961 { Bad_Opcode }, 4962 { Bad_Opcode }, 4963 { Bad_Opcode }, 4964 { Bad_Opcode }, 4965 { Bad_Opcode }, 4966 { Bad_Opcode }, 4967 /* 30 */ 4968 { Bad_Opcode }, 4969 { Bad_Opcode }, 4970 { Bad_Opcode }, 4971 { Bad_Opcode }, 4972 { Bad_Opcode }, 4973 { Bad_Opcode }, 4974 { Bad_Opcode }, 4975 { Bad_Opcode }, 4976 /* 38 */ 4977 { Bad_Opcode }, 4978 { Bad_Opcode }, 4979 { Bad_Opcode }, 4980 { Bad_Opcode }, 4981 { Bad_Opcode }, 4982 { Bad_Opcode }, 4983 { Bad_Opcode }, 4984 { Bad_Opcode }, 4985 /* 40 */ 4986 { "dpps", { XM, EXx, Ib }, PREFIX_DATA }, 4987 { "dppd", { XM, EXx, Ib }, PREFIX_DATA }, 4988 { "mpsadbw", { XM, EXx, Ib }, PREFIX_DATA }, 4989 { Bad_Opcode }, 4990 { "pclmulqdq", { XM, EXx, PCLMUL }, PREFIX_DATA }, 4991 { Bad_Opcode }, 4992 { Bad_Opcode }, 4993 { Bad_Opcode }, 4994 /* 48 */ 4995 { Bad_Opcode }, 4996 { Bad_Opcode }, 4997 { Bad_Opcode }, 4998 { Bad_Opcode }, 4999 { Bad_Opcode }, 5000 { Bad_Opcode }, 5001 { Bad_Opcode }, 5002 { Bad_Opcode }, 5003 /* 50 */ 5004 { Bad_Opcode }, 5005 { Bad_Opcode }, 5006 { Bad_Opcode }, 5007 { Bad_Opcode }, 5008 { Bad_Opcode }, 5009 { Bad_Opcode }, 5010 { Bad_Opcode }, 5011 { Bad_Opcode }, 5012 /* 58 */ 5013 { Bad_Opcode }, 5014 { Bad_Opcode }, 5015 { Bad_Opcode }, 5016 { Bad_Opcode }, 5017 { Bad_Opcode }, 5018 { Bad_Opcode }, 5019 { Bad_Opcode }, 5020 { Bad_Opcode }, 5021 /* 60 */ 5022 { "pcmpestrm!%LQ", { XM, EXx, Ib }, PREFIX_DATA }, 5023 { "pcmpestri!%LQ", { XM, EXx, Ib }, PREFIX_DATA }, 5024 { "pcmpistrm", { XM, EXx, Ib }, PREFIX_DATA }, 5025 { "pcmpistri", { XM, EXx, Ib }, PREFIX_DATA }, 5026 { Bad_Opcode }, 5027 { Bad_Opcode }, 5028 { Bad_Opcode }, 5029 { Bad_Opcode }, 5030 /* 68 */ 5031 { Bad_Opcode }, 5032 { Bad_Opcode }, 5033 { Bad_Opcode }, 5034 { Bad_Opcode }, 5035 { Bad_Opcode }, 5036 { Bad_Opcode }, 5037 { Bad_Opcode }, 5038 { Bad_Opcode }, 5039 /* 70 */ 5040 { Bad_Opcode }, 5041 { Bad_Opcode }, 5042 { Bad_Opcode }, 5043 { Bad_Opcode }, 5044 { Bad_Opcode }, 5045 { Bad_Opcode }, 5046 { Bad_Opcode }, 5047 { Bad_Opcode }, 5048 /* 78 */ 5049 { Bad_Opcode }, 5050 { Bad_Opcode }, 5051 { Bad_Opcode }, 5052 { Bad_Opcode }, 5053 { Bad_Opcode }, 5054 { Bad_Opcode }, 5055 { Bad_Opcode }, 5056 { Bad_Opcode }, 5057 /* 80 */ 5058 { Bad_Opcode }, 5059 { Bad_Opcode }, 5060 { Bad_Opcode }, 5061 { Bad_Opcode }, 5062 { Bad_Opcode }, 5063 { Bad_Opcode }, 5064 { Bad_Opcode }, 5065 { Bad_Opcode }, 5066 /* 88 */ 5067 { Bad_Opcode }, 5068 { Bad_Opcode }, 5069 { Bad_Opcode }, 5070 { Bad_Opcode }, 5071 { Bad_Opcode }, 5072 { Bad_Opcode }, 5073 { Bad_Opcode }, 5074 { Bad_Opcode }, 5075 /* 90 */ 5076 { Bad_Opcode }, 5077 { Bad_Opcode }, 5078 { Bad_Opcode }, 5079 { Bad_Opcode }, 5080 { Bad_Opcode }, 5081 { Bad_Opcode }, 5082 { Bad_Opcode }, 5083 { Bad_Opcode }, 5084 /* 98 */ 5085 { Bad_Opcode }, 5086 { Bad_Opcode }, 5087 { Bad_Opcode }, 5088 { Bad_Opcode }, 5089 { Bad_Opcode }, 5090 { Bad_Opcode }, 5091 { Bad_Opcode }, 5092 { Bad_Opcode }, 5093 /* a0 */ 5094 { Bad_Opcode }, 5095 { Bad_Opcode }, 5096 { Bad_Opcode }, 5097 { Bad_Opcode }, 5098 { Bad_Opcode }, 5099 { Bad_Opcode }, 5100 { Bad_Opcode }, 5101 { Bad_Opcode }, 5102 /* a8 */ 5103 { Bad_Opcode }, 5104 { Bad_Opcode }, 5105 { Bad_Opcode }, 5106 { Bad_Opcode }, 5107 { Bad_Opcode }, 5108 { Bad_Opcode }, 5109 { Bad_Opcode }, 5110 { Bad_Opcode }, 5111 /* b0 */ 5112 { Bad_Opcode }, 5113 { Bad_Opcode }, 5114 { Bad_Opcode }, 5115 { Bad_Opcode }, 5116 { Bad_Opcode }, 5117 { Bad_Opcode }, 5118 { Bad_Opcode }, 5119 { Bad_Opcode }, 5120 /* b8 */ 5121 { Bad_Opcode }, 5122 { Bad_Opcode }, 5123 { Bad_Opcode }, 5124 { Bad_Opcode }, 5125 { Bad_Opcode }, 5126 { Bad_Opcode }, 5127 { Bad_Opcode }, 5128 { Bad_Opcode }, 5129 /* c0 */ 5130 { Bad_Opcode }, 5131 { Bad_Opcode }, 5132 { Bad_Opcode }, 5133 { Bad_Opcode }, 5134 { Bad_Opcode }, 5135 { Bad_Opcode }, 5136 { Bad_Opcode }, 5137 { Bad_Opcode }, 5138 /* c8 */ 5139 { Bad_Opcode }, 5140 { Bad_Opcode }, 5141 { Bad_Opcode }, 5142 { Bad_Opcode }, 5143 { "sha1rnds4", { XM, EXxmm, Ib }, PREFIX_OPCODE }, 5144 { Bad_Opcode }, 5145 { "gf2p8affineqb", { XM, EXxmm, Ib }, PREFIX_DATA }, 5146 { "gf2p8affineinvqb", { XM, EXxmm, Ib }, PREFIX_DATA }, 5147 /* d0 */ 5148 { Bad_Opcode }, 5149 { Bad_Opcode }, 5150 { Bad_Opcode }, 5151 { Bad_Opcode }, 5152 { Bad_Opcode }, 5153 { Bad_Opcode }, 5154 { Bad_Opcode }, 5155 { Bad_Opcode }, 5156 /* d8 */ 5157 { Bad_Opcode }, 5158 { Bad_Opcode }, 5159 { Bad_Opcode }, 5160 { Bad_Opcode }, 5161 { Bad_Opcode }, 5162 { Bad_Opcode }, 5163 { Bad_Opcode }, 5164 { "aeskeygenassist", { XM, EXx, Ib }, PREFIX_DATA }, 5165 /* e0 */ 5166 { Bad_Opcode }, 5167 { Bad_Opcode }, 5168 { Bad_Opcode }, 5169 { Bad_Opcode }, 5170 { Bad_Opcode }, 5171 { Bad_Opcode }, 5172 { Bad_Opcode }, 5173 { Bad_Opcode }, 5174 /* e8 */ 5175 { Bad_Opcode }, 5176 { Bad_Opcode }, 5177 { Bad_Opcode }, 5178 { Bad_Opcode }, 5179 { Bad_Opcode }, 5180 { Bad_Opcode }, 5181 { Bad_Opcode }, 5182 { Bad_Opcode }, 5183 /* f0 */ 5184 { PREFIX_TABLE (PREFIX_0F3A0F) }, 5185 { Bad_Opcode }, 5186 { Bad_Opcode }, 5187 { Bad_Opcode }, 5188 { Bad_Opcode }, 5189 { Bad_Opcode }, 5190 { Bad_Opcode }, 5191 { Bad_Opcode }, 5192 /* f8 */ 5193 { Bad_Opcode }, 5194 { Bad_Opcode }, 5195 { Bad_Opcode }, 5196 { Bad_Opcode }, 5197 { Bad_Opcode }, 5198 { Bad_Opcode }, 5199 { Bad_Opcode }, 5200 { Bad_Opcode }, 5201 }, 5202 }; 5203 5204 static const struct dis386 xop_table[][256] = { 5205 /* XOP_08 */ 5206 { 5207 /* 00 */ 5208 { Bad_Opcode }, 5209 { Bad_Opcode }, 5210 { Bad_Opcode }, 5211 { Bad_Opcode }, 5212 { Bad_Opcode }, 5213 { Bad_Opcode }, 5214 { Bad_Opcode }, 5215 { Bad_Opcode }, 5216 /* 08 */ 5217 { Bad_Opcode }, 5218 { Bad_Opcode }, 5219 { Bad_Opcode }, 5220 { Bad_Opcode }, 5221 { Bad_Opcode }, 5222 { Bad_Opcode }, 5223 { Bad_Opcode }, 5224 { Bad_Opcode }, 5225 /* 10 */ 5226 { Bad_Opcode }, 5227 { Bad_Opcode }, 5228 { Bad_Opcode }, 5229 { Bad_Opcode }, 5230 { Bad_Opcode }, 5231 { Bad_Opcode }, 5232 { Bad_Opcode }, 5233 { Bad_Opcode }, 5234 /* 18 */ 5235 { Bad_Opcode }, 5236 { Bad_Opcode }, 5237 { Bad_Opcode }, 5238 { Bad_Opcode }, 5239 { Bad_Opcode }, 5240 { Bad_Opcode }, 5241 { Bad_Opcode }, 5242 { Bad_Opcode }, 5243 /* 20 */ 5244 { Bad_Opcode }, 5245 { Bad_Opcode }, 5246 { Bad_Opcode }, 5247 { Bad_Opcode }, 5248 { Bad_Opcode }, 5249 { Bad_Opcode }, 5250 { Bad_Opcode }, 5251 { Bad_Opcode }, 5252 /* 28 */ 5253 { Bad_Opcode }, 5254 { Bad_Opcode }, 5255 { Bad_Opcode }, 5256 { Bad_Opcode }, 5257 { Bad_Opcode }, 5258 { Bad_Opcode }, 5259 { Bad_Opcode }, 5260 { Bad_Opcode }, 5261 /* 30 */ 5262 { Bad_Opcode }, 5263 { Bad_Opcode }, 5264 { Bad_Opcode }, 5265 { Bad_Opcode }, 5266 { Bad_Opcode }, 5267 { Bad_Opcode }, 5268 { Bad_Opcode }, 5269 { Bad_Opcode }, 5270 /* 38 */ 5271 { Bad_Opcode }, 5272 { Bad_Opcode }, 5273 { Bad_Opcode }, 5274 { Bad_Opcode }, 5275 { Bad_Opcode }, 5276 { Bad_Opcode }, 5277 { Bad_Opcode }, 5278 { Bad_Opcode }, 5279 /* 40 */ 5280 { Bad_Opcode }, 5281 { Bad_Opcode }, 5282 { Bad_Opcode }, 5283 { Bad_Opcode }, 5284 { Bad_Opcode }, 5285 { Bad_Opcode }, 5286 { Bad_Opcode }, 5287 { Bad_Opcode }, 5288 /* 48 */ 5289 { Bad_Opcode }, 5290 { Bad_Opcode }, 5291 { Bad_Opcode }, 5292 { Bad_Opcode }, 5293 { Bad_Opcode }, 5294 { Bad_Opcode }, 5295 { Bad_Opcode }, 5296 { Bad_Opcode }, 5297 /* 50 */ 5298 { Bad_Opcode }, 5299 { Bad_Opcode }, 5300 { Bad_Opcode }, 5301 { Bad_Opcode }, 5302 { Bad_Opcode }, 5303 { Bad_Opcode }, 5304 { Bad_Opcode }, 5305 { Bad_Opcode }, 5306 /* 58 */ 5307 { Bad_Opcode }, 5308 { Bad_Opcode }, 5309 { Bad_Opcode }, 5310 { Bad_Opcode }, 5311 { Bad_Opcode }, 5312 { Bad_Opcode }, 5313 { Bad_Opcode }, 5314 { Bad_Opcode }, 5315 /* 60 */ 5316 { Bad_Opcode }, 5317 { Bad_Opcode }, 5318 { Bad_Opcode }, 5319 { Bad_Opcode }, 5320 { Bad_Opcode }, 5321 { Bad_Opcode }, 5322 { Bad_Opcode }, 5323 { Bad_Opcode }, 5324 /* 68 */ 5325 { Bad_Opcode }, 5326 { Bad_Opcode }, 5327 { Bad_Opcode }, 5328 { Bad_Opcode }, 5329 { Bad_Opcode }, 5330 { Bad_Opcode }, 5331 { Bad_Opcode }, 5332 { Bad_Opcode }, 5333 /* 70 */ 5334 { Bad_Opcode }, 5335 { Bad_Opcode }, 5336 { Bad_Opcode }, 5337 { Bad_Opcode }, 5338 { Bad_Opcode }, 5339 { Bad_Opcode }, 5340 { Bad_Opcode }, 5341 { Bad_Opcode }, 5342 /* 78 */ 5343 { Bad_Opcode }, 5344 { Bad_Opcode }, 5345 { Bad_Opcode }, 5346 { Bad_Opcode }, 5347 { Bad_Opcode }, 5348 { Bad_Opcode }, 5349 { Bad_Opcode }, 5350 { Bad_Opcode }, 5351 /* 80 */ 5352 { Bad_Opcode }, 5353 { Bad_Opcode }, 5354 { Bad_Opcode }, 5355 { Bad_Opcode }, 5356 { Bad_Opcode }, 5357 { VEX_LEN_TABLE (VEX_LEN_XOP_08_85) }, 5358 { VEX_LEN_TABLE (VEX_LEN_XOP_08_86) }, 5359 { VEX_LEN_TABLE (VEX_LEN_XOP_08_87) }, 5360 /* 88 */ 5361 { Bad_Opcode }, 5362 { Bad_Opcode }, 5363 { Bad_Opcode }, 5364 { Bad_Opcode }, 5365 { Bad_Opcode }, 5366 { Bad_Opcode }, 5367 { VEX_LEN_TABLE (VEX_LEN_XOP_08_8E) }, 5368 { VEX_LEN_TABLE (VEX_LEN_XOP_08_8F) }, 5369 /* 90 */ 5370 { Bad_Opcode }, 5371 { Bad_Opcode }, 5372 { Bad_Opcode }, 5373 { Bad_Opcode }, 5374 { Bad_Opcode }, 5375 { VEX_LEN_TABLE (VEX_LEN_XOP_08_95) }, 5376 { VEX_LEN_TABLE (VEX_LEN_XOP_08_96) }, 5377 { VEX_LEN_TABLE (VEX_LEN_XOP_08_97) }, 5378 /* 98 */ 5379 { Bad_Opcode }, 5380 { Bad_Opcode }, 5381 { Bad_Opcode }, 5382 { Bad_Opcode }, 5383 { Bad_Opcode }, 5384 { Bad_Opcode }, 5385 { VEX_LEN_TABLE (VEX_LEN_XOP_08_9E) }, 5386 { VEX_LEN_TABLE (VEX_LEN_XOP_08_9F) }, 5387 /* a0 */ 5388 { Bad_Opcode }, 5389 { Bad_Opcode }, 5390 { "vpcmov", { XM, Vex, EXx, XMVexI4 }, 0 }, 5391 { VEX_LEN_TABLE (VEX_LEN_XOP_08_A3) }, 5392 { Bad_Opcode }, 5393 { Bad_Opcode }, 5394 { VEX_LEN_TABLE (VEX_LEN_XOP_08_A6) }, 5395 { Bad_Opcode }, 5396 /* a8 */ 5397 { Bad_Opcode }, 5398 { Bad_Opcode }, 5399 { Bad_Opcode }, 5400 { Bad_Opcode }, 5401 { Bad_Opcode }, 5402 { Bad_Opcode }, 5403 { Bad_Opcode }, 5404 { Bad_Opcode }, 5405 /* b0 */ 5406 { Bad_Opcode }, 5407 { Bad_Opcode }, 5408 { Bad_Opcode }, 5409 { Bad_Opcode }, 5410 { Bad_Opcode }, 5411 { Bad_Opcode }, 5412 { VEX_LEN_TABLE (VEX_LEN_XOP_08_B6) }, 5413 { Bad_Opcode }, 5414 /* b8 */ 5415 { Bad_Opcode }, 5416 { Bad_Opcode }, 5417 { Bad_Opcode }, 5418 { Bad_Opcode }, 5419 { Bad_Opcode }, 5420 { Bad_Opcode }, 5421 { Bad_Opcode }, 5422 { Bad_Opcode }, 5423 /* c0 */ 5424 { VEX_LEN_TABLE (VEX_LEN_XOP_08_C0) }, 5425 { VEX_LEN_TABLE (VEX_LEN_XOP_08_C1) }, 5426 { VEX_LEN_TABLE (VEX_LEN_XOP_08_C2) }, 5427 { VEX_LEN_TABLE (VEX_LEN_XOP_08_C3) }, 5428 { Bad_Opcode }, 5429 { Bad_Opcode }, 5430 { Bad_Opcode }, 5431 { Bad_Opcode }, 5432 /* c8 */ 5433 { Bad_Opcode }, 5434 { Bad_Opcode }, 5435 { Bad_Opcode }, 5436 { Bad_Opcode }, 5437 { VEX_LEN_TABLE (VEX_LEN_XOP_08_CC) }, 5438 { VEX_LEN_TABLE (VEX_LEN_XOP_08_CD) }, 5439 { VEX_LEN_TABLE (VEX_LEN_XOP_08_CE) }, 5440 { VEX_LEN_TABLE (VEX_LEN_XOP_08_CF) }, 5441 /* d0 */ 5442 { Bad_Opcode }, 5443 { Bad_Opcode }, 5444 { Bad_Opcode }, 5445 { Bad_Opcode }, 5446 { Bad_Opcode }, 5447 { Bad_Opcode }, 5448 { Bad_Opcode }, 5449 { Bad_Opcode }, 5450 /* d8 */ 5451 { Bad_Opcode }, 5452 { Bad_Opcode }, 5453 { Bad_Opcode }, 5454 { Bad_Opcode }, 5455 { Bad_Opcode }, 5456 { Bad_Opcode }, 5457 { Bad_Opcode }, 5458 { Bad_Opcode }, 5459 /* e0 */ 5460 { Bad_Opcode }, 5461 { Bad_Opcode }, 5462 { Bad_Opcode }, 5463 { Bad_Opcode }, 5464 { Bad_Opcode }, 5465 { Bad_Opcode }, 5466 { Bad_Opcode }, 5467 { Bad_Opcode }, 5468 /* e8 */ 5469 { Bad_Opcode }, 5470 { Bad_Opcode }, 5471 { Bad_Opcode }, 5472 { Bad_Opcode }, 5473 { VEX_LEN_TABLE (VEX_LEN_XOP_08_EC) }, 5474 { VEX_LEN_TABLE (VEX_LEN_XOP_08_ED) }, 5475 { VEX_LEN_TABLE (VEX_LEN_XOP_08_EE) }, 5476 { VEX_LEN_TABLE (VEX_LEN_XOP_08_EF) }, 5477 /* f0 */ 5478 { Bad_Opcode }, 5479 { Bad_Opcode }, 5480 { Bad_Opcode }, 5481 { Bad_Opcode }, 5482 { Bad_Opcode }, 5483 { Bad_Opcode }, 5484 { Bad_Opcode }, 5485 { Bad_Opcode }, 5486 /* f8 */ 5487 { Bad_Opcode }, 5488 { Bad_Opcode }, 5489 { Bad_Opcode }, 5490 { Bad_Opcode }, 5491 { Bad_Opcode }, 5492 { Bad_Opcode }, 5493 { Bad_Opcode }, 5494 { Bad_Opcode }, 5495 }, 5496 /* XOP_09 */ 5497 { 5498 /* 00 */ 5499 { Bad_Opcode }, 5500 { VEX_LEN_TABLE (VEX_LEN_XOP_09_01) }, 5501 { VEX_LEN_TABLE (VEX_LEN_XOP_09_02) }, 5502 { Bad_Opcode }, 5503 { Bad_Opcode }, 5504 { Bad_Opcode }, 5505 { Bad_Opcode }, 5506 { Bad_Opcode }, 5507 /* 08 */ 5508 { Bad_Opcode }, 5509 { Bad_Opcode }, 5510 { Bad_Opcode }, 5511 { Bad_Opcode }, 5512 { Bad_Opcode }, 5513 { Bad_Opcode }, 5514 { Bad_Opcode }, 5515 { Bad_Opcode }, 5516 /* 10 */ 5517 { Bad_Opcode }, 5518 { Bad_Opcode }, 5519 { VEX_LEN_TABLE (VEX_LEN_XOP_09_12) }, 5520 { Bad_Opcode }, 5521 { Bad_Opcode }, 5522 { Bad_Opcode }, 5523 { Bad_Opcode }, 5524 { Bad_Opcode }, 5525 /* 18 */ 5526 { Bad_Opcode }, 5527 { Bad_Opcode }, 5528 { Bad_Opcode }, 5529 { Bad_Opcode }, 5530 { Bad_Opcode }, 5531 { Bad_Opcode }, 5532 { Bad_Opcode }, 5533 { Bad_Opcode }, 5534 /* 20 */ 5535 { Bad_Opcode }, 5536 { Bad_Opcode }, 5537 { Bad_Opcode }, 5538 { Bad_Opcode }, 5539 { Bad_Opcode }, 5540 { Bad_Opcode }, 5541 { Bad_Opcode }, 5542 { Bad_Opcode }, 5543 /* 28 */ 5544 { Bad_Opcode }, 5545 { Bad_Opcode }, 5546 { Bad_Opcode }, 5547 { Bad_Opcode }, 5548 { Bad_Opcode }, 5549 { Bad_Opcode }, 5550 { Bad_Opcode }, 5551 { Bad_Opcode }, 5552 /* 30 */ 5553 { Bad_Opcode }, 5554 { Bad_Opcode }, 5555 { Bad_Opcode }, 5556 { Bad_Opcode }, 5557 { Bad_Opcode }, 5558 { Bad_Opcode }, 5559 { Bad_Opcode }, 5560 { Bad_Opcode }, 5561 /* 38 */ 5562 { Bad_Opcode }, 5563 { Bad_Opcode }, 5564 { Bad_Opcode }, 5565 { Bad_Opcode }, 5566 { Bad_Opcode }, 5567 { Bad_Opcode }, 5568 { Bad_Opcode }, 5569 { Bad_Opcode }, 5570 /* 40 */ 5571 { Bad_Opcode }, 5572 { Bad_Opcode }, 5573 { Bad_Opcode }, 5574 { Bad_Opcode }, 5575 { Bad_Opcode }, 5576 { Bad_Opcode }, 5577 { Bad_Opcode }, 5578 { Bad_Opcode }, 5579 /* 48 */ 5580 { Bad_Opcode }, 5581 { Bad_Opcode }, 5582 { Bad_Opcode }, 5583 { Bad_Opcode }, 5584 { Bad_Opcode }, 5585 { Bad_Opcode }, 5586 { Bad_Opcode }, 5587 { Bad_Opcode }, 5588 /* 50 */ 5589 { Bad_Opcode }, 5590 { Bad_Opcode }, 5591 { Bad_Opcode }, 5592 { Bad_Opcode }, 5593 { Bad_Opcode }, 5594 { Bad_Opcode }, 5595 { Bad_Opcode }, 5596 { Bad_Opcode }, 5597 /* 58 */ 5598 { Bad_Opcode }, 5599 { Bad_Opcode }, 5600 { Bad_Opcode }, 5601 { Bad_Opcode }, 5602 { Bad_Opcode }, 5603 { Bad_Opcode }, 5604 { Bad_Opcode }, 5605 { Bad_Opcode }, 5606 /* 60 */ 5607 { Bad_Opcode }, 5608 { Bad_Opcode }, 5609 { Bad_Opcode }, 5610 { Bad_Opcode }, 5611 { Bad_Opcode }, 5612 { Bad_Opcode }, 5613 { Bad_Opcode }, 5614 { Bad_Opcode }, 5615 /* 68 */ 5616 { Bad_Opcode }, 5617 { Bad_Opcode }, 5618 { Bad_Opcode }, 5619 { Bad_Opcode }, 5620 { Bad_Opcode }, 5621 { Bad_Opcode }, 5622 { Bad_Opcode }, 5623 { Bad_Opcode }, 5624 /* 70 */ 5625 { Bad_Opcode }, 5626 { Bad_Opcode }, 5627 { Bad_Opcode }, 5628 { Bad_Opcode }, 5629 { Bad_Opcode }, 5630 { Bad_Opcode }, 5631 { Bad_Opcode }, 5632 { Bad_Opcode }, 5633 /* 78 */ 5634 { Bad_Opcode }, 5635 { Bad_Opcode }, 5636 { Bad_Opcode }, 5637 { Bad_Opcode }, 5638 { Bad_Opcode }, 5639 { Bad_Opcode }, 5640 { Bad_Opcode }, 5641 { Bad_Opcode }, 5642 /* 80 */ 5643 { VEX_W_TABLE (VEX_W_XOP_09_80) }, 5644 { VEX_W_TABLE (VEX_W_XOP_09_81) }, 5645 { VEX_W_TABLE (VEX_W_XOP_09_82) }, 5646 { VEX_W_TABLE (VEX_W_XOP_09_83) }, 5647 { Bad_Opcode }, 5648 { Bad_Opcode }, 5649 { Bad_Opcode }, 5650 { Bad_Opcode }, 5651 /* 88 */ 5652 { Bad_Opcode }, 5653 { Bad_Opcode }, 5654 { Bad_Opcode }, 5655 { Bad_Opcode }, 5656 { Bad_Opcode }, 5657 { Bad_Opcode }, 5658 { Bad_Opcode }, 5659 { Bad_Opcode }, 5660 /* 90 */ 5661 { VEX_LEN_TABLE (VEX_LEN_XOP_09_90) }, 5662 { VEX_LEN_TABLE (VEX_LEN_XOP_09_91) }, 5663 { VEX_LEN_TABLE (VEX_LEN_XOP_09_92) }, 5664 { VEX_LEN_TABLE (VEX_LEN_XOP_09_93) }, 5665 { VEX_LEN_TABLE (VEX_LEN_XOP_09_94) }, 5666 { VEX_LEN_TABLE (VEX_LEN_XOP_09_95) }, 5667 { VEX_LEN_TABLE (VEX_LEN_XOP_09_96) }, 5668 { VEX_LEN_TABLE (VEX_LEN_XOP_09_97) }, 5669 /* 98 */ 5670 { VEX_LEN_TABLE (VEX_LEN_XOP_09_98) }, 5671 { VEX_LEN_TABLE (VEX_LEN_XOP_09_99) }, 5672 { VEX_LEN_TABLE (VEX_LEN_XOP_09_9A) }, 5673 { VEX_LEN_TABLE (VEX_LEN_XOP_09_9B) }, 5674 { Bad_Opcode }, 5675 { Bad_Opcode }, 5676 { Bad_Opcode }, 5677 { Bad_Opcode }, 5678 /* a0 */ 5679 { Bad_Opcode }, 5680 { Bad_Opcode }, 5681 { Bad_Opcode }, 5682 { Bad_Opcode }, 5683 { Bad_Opcode }, 5684 { Bad_Opcode }, 5685 { Bad_Opcode }, 5686 { Bad_Opcode }, 5687 /* a8 */ 5688 { Bad_Opcode }, 5689 { Bad_Opcode }, 5690 { Bad_Opcode }, 5691 { Bad_Opcode }, 5692 { Bad_Opcode }, 5693 { Bad_Opcode }, 5694 { Bad_Opcode }, 5695 { Bad_Opcode }, 5696 /* b0 */ 5697 { Bad_Opcode }, 5698 { Bad_Opcode }, 5699 { Bad_Opcode }, 5700 { Bad_Opcode }, 5701 { Bad_Opcode }, 5702 { Bad_Opcode }, 5703 { Bad_Opcode }, 5704 { Bad_Opcode }, 5705 /* b8 */ 5706 { Bad_Opcode }, 5707 { Bad_Opcode }, 5708 { Bad_Opcode }, 5709 { Bad_Opcode }, 5710 { Bad_Opcode }, 5711 { Bad_Opcode }, 5712 { Bad_Opcode }, 5713 { Bad_Opcode }, 5714 /* c0 */ 5715 { Bad_Opcode }, 5716 { VEX_LEN_TABLE (VEX_LEN_XOP_09_C1) }, 5717 { VEX_LEN_TABLE (VEX_LEN_XOP_09_C2) }, 5718 { VEX_LEN_TABLE (VEX_LEN_XOP_09_C3) }, 5719 { Bad_Opcode }, 5720 { Bad_Opcode }, 5721 { VEX_LEN_TABLE (VEX_LEN_XOP_09_C6) }, 5722 { VEX_LEN_TABLE (VEX_LEN_XOP_09_C7) }, 5723 /* c8 */ 5724 { Bad_Opcode }, 5725 { Bad_Opcode }, 5726 { Bad_Opcode }, 5727 { VEX_LEN_TABLE (VEX_LEN_XOP_09_CB) }, 5728 { Bad_Opcode }, 5729 { Bad_Opcode }, 5730 { Bad_Opcode }, 5731 { Bad_Opcode }, 5732 /* d0 */ 5733 { Bad_Opcode }, 5734 { VEX_LEN_TABLE (VEX_LEN_XOP_09_D1) }, 5735 { VEX_LEN_TABLE (VEX_LEN_XOP_09_D2) }, 5736 { VEX_LEN_TABLE (VEX_LEN_XOP_09_D3) }, 5737 { Bad_Opcode }, 5738 { Bad_Opcode }, 5739 { VEX_LEN_TABLE (VEX_LEN_XOP_09_D6) }, 5740 { VEX_LEN_TABLE (VEX_LEN_XOP_09_D7) }, 5741 /* d8 */ 5742 { Bad_Opcode }, 5743 { Bad_Opcode }, 5744 { Bad_Opcode }, 5745 { VEX_LEN_TABLE (VEX_LEN_XOP_09_DB) }, 5746 { Bad_Opcode }, 5747 { Bad_Opcode }, 5748 { Bad_Opcode }, 5749 { Bad_Opcode }, 5750 /* e0 */ 5751 { Bad_Opcode }, 5752 { VEX_LEN_TABLE (VEX_LEN_XOP_09_E1) }, 5753 { VEX_LEN_TABLE (VEX_LEN_XOP_09_E2) }, 5754 { VEX_LEN_TABLE (VEX_LEN_XOP_09_E3) }, 5755 { Bad_Opcode }, 5756 { Bad_Opcode }, 5757 { Bad_Opcode }, 5758 { Bad_Opcode }, 5759 /* e8 */ 5760 { Bad_Opcode }, 5761 { Bad_Opcode }, 5762 { Bad_Opcode }, 5763 { Bad_Opcode }, 5764 { Bad_Opcode }, 5765 { Bad_Opcode }, 5766 { Bad_Opcode }, 5767 { Bad_Opcode }, 5768 /* f0 */ 5769 { Bad_Opcode }, 5770 { Bad_Opcode }, 5771 { Bad_Opcode }, 5772 { Bad_Opcode }, 5773 { Bad_Opcode }, 5774 { Bad_Opcode }, 5775 { Bad_Opcode }, 5776 { Bad_Opcode }, 5777 /* f8 */ 5778 { Bad_Opcode }, 5779 { Bad_Opcode }, 5780 { Bad_Opcode }, 5781 { Bad_Opcode }, 5782 { Bad_Opcode }, 5783 { Bad_Opcode }, 5784 { Bad_Opcode }, 5785 { Bad_Opcode }, 5786 }, 5787 /* XOP_0A */ 5788 { 5789 /* 00 */ 5790 { Bad_Opcode }, 5791 { Bad_Opcode }, 5792 { Bad_Opcode }, 5793 { Bad_Opcode }, 5794 { Bad_Opcode }, 5795 { Bad_Opcode }, 5796 { Bad_Opcode }, 5797 { Bad_Opcode }, 5798 /* 08 */ 5799 { Bad_Opcode }, 5800 { Bad_Opcode }, 5801 { Bad_Opcode }, 5802 { Bad_Opcode }, 5803 { Bad_Opcode }, 5804 { Bad_Opcode }, 5805 { Bad_Opcode }, 5806 { Bad_Opcode }, 5807 /* 10 */ 5808 { "bextrS", { Gdq, Edq, Id }, 0 }, 5809 { Bad_Opcode }, 5810 { VEX_LEN_TABLE (VEX_LEN_XOP_0A_12) }, 5811 { Bad_Opcode }, 5812 { Bad_Opcode }, 5813 { Bad_Opcode }, 5814 { Bad_Opcode }, 5815 { Bad_Opcode }, 5816 /* 18 */ 5817 { Bad_Opcode }, 5818 { Bad_Opcode }, 5819 { Bad_Opcode }, 5820 { Bad_Opcode }, 5821 { Bad_Opcode }, 5822 { Bad_Opcode }, 5823 { Bad_Opcode }, 5824 { Bad_Opcode }, 5825 /* 20 */ 5826 { Bad_Opcode }, 5827 { Bad_Opcode }, 5828 { Bad_Opcode }, 5829 { Bad_Opcode }, 5830 { Bad_Opcode }, 5831 { Bad_Opcode }, 5832 { Bad_Opcode }, 5833 { Bad_Opcode }, 5834 /* 28 */ 5835 { Bad_Opcode }, 5836 { Bad_Opcode }, 5837 { Bad_Opcode }, 5838 { Bad_Opcode }, 5839 { Bad_Opcode }, 5840 { Bad_Opcode }, 5841 { Bad_Opcode }, 5842 { Bad_Opcode }, 5843 /* 30 */ 5844 { Bad_Opcode }, 5845 { Bad_Opcode }, 5846 { Bad_Opcode }, 5847 { Bad_Opcode }, 5848 { Bad_Opcode }, 5849 { Bad_Opcode }, 5850 { Bad_Opcode }, 5851 { Bad_Opcode }, 5852 /* 38 */ 5853 { Bad_Opcode }, 5854 { Bad_Opcode }, 5855 { Bad_Opcode }, 5856 { Bad_Opcode }, 5857 { Bad_Opcode }, 5858 { Bad_Opcode }, 5859 { Bad_Opcode }, 5860 { Bad_Opcode }, 5861 /* 40 */ 5862 { Bad_Opcode }, 5863 { Bad_Opcode }, 5864 { Bad_Opcode }, 5865 { Bad_Opcode }, 5866 { Bad_Opcode }, 5867 { Bad_Opcode }, 5868 { Bad_Opcode }, 5869 { Bad_Opcode }, 5870 /* 48 */ 5871 { Bad_Opcode }, 5872 { Bad_Opcode }, 5873 { Bad_Opcode }, 5874 { Bad_Opcode }, 5875 { Bad_Opcode }, 5876 { Bad_Opcode }, 5877 { Bad_Opcode }, 5878 { Bad_Opcode }, 5879 /* 50 */ 5880 { Bad_Opcode }, 5881 { Bad_Opcode }, 5882 { Bad_Opcode }, 5883 { Bad_Opcode }, 5884 { Bad_Opcode }, 5885 { Bad_Opcode }, 5886 { Bad_Opcode }, 5887 { Bad_Opcode }, 5888 /* 58 */ 5889 { Bad_Opcode }, 5890 { Bad_Opcode }, 5891 { Bad_Opcode }, 5892 { Bad_Opcode }, 5893 { Bad_Opcode }, 5894 { Bad_Opcode }, 5895 { Bad_Opcode }, 5896 { Bad_Opcode }, 5897 /* 60 */ 5898 { Bad_Opcode }, 5899 { Bad_Opcode }, 5900 { Bad_Opcode }, 5901 { Bad_Opcode }, 5902 { Bad_Opcode }, 5903 { Bad_Opcode }, 5904 { Bad_Opcode }, 5905 { Bad_Opcode }, 5906 /* 68 */ 5907 { Bad_Opcode }, 5908 { Bad_Opcode }, 5909 { Bad_Opcode }, 5910 { Bad_Opcode }, 5911 { Bad_Opcode }, 5912 { Bad_Opcode }, 5913 { Bad_Opcode }, 5914 { Bad_Opcode }, 5915 /* 70 */ 5916 { Bad_Opcode }, 5917 { Bad_Opcode }, 5918 { Bad_Opcode }, 5919 { Bad_Opcode }, 5920 { Bad_Opcode }, 5921 { Bad_Opcode }, 5922 { Bad_Opcode }, 5923 { Bad_Opcode }, 5924 /* 78 */ 5925 { Bad_Opcode }, 5926 { Bad_Opcode }, 5927 { Bad_Opcode }, 5928 { Bad_Opcode }, 5929 { Bad_Opcode }, 5930 { Bad_Opcode }, 5931 { Bad_Opcode }, 5932 { Bad_Opcode }, 5933 /* 80 */ 5934 { Bad_Opcode }, 5935 { Bad_Opcode }, 5936 { Bad_Opcode }, 5937 { Bad_Opcode }, 5938 { Bad_Opcode }, 5939 { Bad_Opcode }, 5940 { Bad_Opcode }, 5941 { Bad_Opcode }, 5942 /* 88 */ 5943 { Bad_Opcode }, 5944 { Bad_Opcode }, 5945 { Bad_Opcode }, 5946 { Bad_Opcode }, 5947 { Bad_Opcode }, 5948 { Bad_Opcode }, 5949 { Bad_Opcode }, 5950 { Bad_Opcode }, 5951 /* 90 */ 5952 { Bad_Opcode }, 5953 { Bad_Opcode }, 5954 { Bad_Opcode }, 5955 { Bad_Opcode }, 5956 { Bad_Opcode }, 5957 { Bad_Opcode }, 5958 { Bad_Opcode }, 5959 { Bad_Opcode }, 5960 /* 98 */ 5961 { Bad_Opcode }, 5962 { Bad_Opcode }, 5963 { Bad_Opcode }, 5964 { Bad_Opcode }, 5965 { Bad_Opcode }, 5966 { Bad_Opcode }, 5967 { Bad_Opcode }, 5968 { Bad_Opcode }, 5969 /* a0 */ 5970 { Bad_Opcode }, 5971 { Bad_Opcode }, 5972 { Bad_Opcode }, 5973 { Bad_Opcode }, 5974 { Bad_Opcode }, 5975 { Bad_Opcode }, 5976 { Bad_Opcode }, 5977 { Bad_Opcode }, 5978 /* a8 */ 5979 { Bad_Opcode }, 5980 { Bad_Opcode }, 5981 { Bad_Opcode }, 5982 { Bad_Opcode }, 5983 { Bad_Opcode }, 5984 { Bad_Opcode }, 5985 { Bad_Opcode }, 5986 { Bad_Opcode }, 5987 /* b0 */ 5988 { Bad_Opcode }, 5989 { Bad_Opcode }, 5990 { Bad_Opcode }, 5991 { Bad_Opcode }, 5992 { Bad_Opcode }, 5993 { Bad_Opcode }, 5994 { Bad_Opcode }, 5995 { Bad_Opcode }, 5996 /* b8 */ 5997 { Bad_Opcode }, 5998 { Bad_Opcode }, 5999 { Bad_Opcode }, 6000 { Bad_Opcode }, 6001 { Bad_Opcode }, 6002 { Bad_Opcode }, 6003 { Bad_Opcode }, 6004 { Bad_Opcode }, 6005 /* c0 */ 6006 { Bad_Opcode }, 6007 { Bad_Opcode }, 6008 { Bad_Opcode }, 6009 { Bad_Opcode }, 6010 { Bad_Opcode }, 6011 { Bad_Opcode }, 6012 { Bad_Opcode }, 6013 { Bad_Opcode }, 6014 /* c8 */ 6015 { Bad_Opcode }, 6016 { Bad_Opcode }, 6017 { Bad_Opcode }, 6018 { Bad_Opcode }, 6019 { Bad_Opcode }, 6020 { Bad_Opcode }, 6021 { Bad_Opcode }, 6022 { Bad_Opcode }, 6023 /* d0 */ 6024 { Bad_Opcode }, 6025 { Bad_Opcode }, 6026 { Bad_Opcode }, 6027 { Bad_Opcode }, 6028 { Bad_Opcode }, 6029 { Bad_Opcode }, 6030 { Bad_Opcode }, 6031 { Bad_Opcode }, 6032 /* d8 */ 6033 { Bad_Opcode }, 6034 { Bad_Opcode }, 6035 { Bad_Opcode }, 6036 { Bad_Opcode }, 6037 { Bad_Opcode }, 6038 { Bad_Opcode }, 6039 { Bad_Opcode }, 6040 { Bad_Opcode }, 6041 /* e0 */ 6042 { Bad_Opcode }, 6043 { Bad_Opcode }, 6044 { Bad_Opcode }, 6045 { Bad_Opcode }, 6046 { Bad_Opcode }, 6047 { Bad_Opcode }, 6048 { Bad_Opcode }, 6049 { Bad_Opcode }, 6050 /* e8 */ 6051 { Bad_Opcode }, 6052 { Bad_Opcode }, 6053 { Bad_Opcode }, 6054 { Bad_Opcode }, 6055 { Bad_Opcode }, 6056 { Bad_Opcode }, 6057 { Bad_Opcode }, 6058 { Bad_Opcode }, 6059 /* f0 */ 6060 { Bad_Opcode }, 6061 { Bad_Opcode }, 6062 { Bad_Opcode }, 6063 { Bad_Opcode }, 6064 { Bad_Opcode }, 6065 { Bad_Opcode }, 6066 { Bad_Opcode }, 6067 { Bad_Opcode }, 6068 /* f8 */ 6069 { Bad_Opcode }, 6070 { Bad_Opcode }, 6071 { Bad_Opcode }, 6072 { Bad_Opcode }, 6073 { Bad_Opcode }, 6074 { Bad_Opcode }, 6075 { Bad_Opcode }, 6076 { Bad_Opcode }, 6077 }, 6078 }; 6079 6080 static const struct dis386 vex_table[][256] = { 6081 /* VEX_0F */ 6082 { 6083 /* 00 */ 6084 { Bad_Opcode }, 6085 { Bad_Opcode }, 6086 { Bad_Opcode }, 6087 { Bad_Opcode }, 6088 { Bad_Opcode }, 6089 { Bad_Opcode }, 6090 { Bad_Opcode }, 6091 { Bad_Opcode }, 6092 /* 08 */ 6093 { Bad_Opcode }, 6094 { Bad_Opcode }, 6095 { Bad_Opcode }, 6096 { Bad_Opcode }, 6097 { Bad_Opcode }, 6098 { Bad_Opcode }, 6099 { Bad_Opcode }, 6100 { Bad_Opcode }, 6101 /* 10 */ 6102 { PREFIX_TABLE (PREFIX_0F10) }, 6103 { PREFIX_TABLE (PREFIX_0F11) }, 6104 { PREFIX_TABLE (PREFIX_VEX_0F12) }, 6105 { VEX_LEN_TABLE (VEX_LEN_0F13) }, 6106 { "vunpcklpX", { XM, Vex, EXx }, PREFIX_OPCODE }, 6107 { "vunpckhpX", { XM, Vex, EXx }, PREFIX_OPCODE }, 6108 { PREFIX_TABLE (PREFIX_VEX_0F16) }, 6109 { VEX_LEN_TABLE (VEX_LEN_0F17) }, 6110 /* 18 */ 6111 { Bad_Opcode }, 6112 { Bad_Opcode }, 6113 { Bad_Opcode }, 6114 { Bad_Opcode }, 6115 { Bad_Opcode }, 6116 { Bad_Opcode }, 6117 { Bad_Opcode }, 6118 { Bad_Opcode }, 6119 /* 20 */ 6120 { Bad_Opcode }, 6121 { Bad_Opcode }, 6122 { Bad_Opcode }, 6123 { Bad_Opcode }, 6124 { Bad_Opcode }, 6125 { Bad_Opcode }, 6126 { Bad_Opcode }, 6127 { Bad_Opcode }, 6128 /* 28 */ 6129 { "vmovapX", { XM, EXx }, PREFIX_OPCODE }, 6130 { "vmovapX", { EXxS, XM }, PREFIX_OPCODE }, 6131 { PREFIX_TABLE (PREFIX_VEX_0F2A) }, 6132 { "vmovntpX", { Mx, XM }, PREFIX_OPCODE }, 6133 { PREFIX_TABLE (PREFIX_VEX_0F2C) }, 6134 { PREFIX_TABLE (PREFIX_VEX_0F2D) }, 6135 { PREFIX_TABLE (PREFIX_0F2E) }, 6136 { PREFIX_TABLE (PREFIX_0F2F) }, 6137 /* 30 */ 6138 { Bad_Opcode }, 6139 { Bad_Opcode }, 6140 { Bad_Opcode }, 6141 { Bad_Opcode }, 6142 { Bad_Opcode }, 6143 { Bad_Opcode }, 6144 { Bad_Opcode }, 6145 { Bad_Opcode }, 6146 /* 38 */ 6147 { Bad_Opcode }, 6148 { Bad_Opcode }, 6149 { Bad_Opcode }, 6150 { Bad_Opcode }, 6151 { Bad_Opcode }, 6152 { Bad_Opcode }, 6153 { Bad_Opcode }, 6154 { Bad_Opcode }, 6155 /* 40 */ 6156 { Bad_Opcode }, 6157 { VEX_LEN_TABLE (VEX_LEN_0F41) }, 6158 { VEX_LEN_TABLE (VEX_LEN_0F42) }, 6159 { Bad_Opcode }, 6160 { VEX_LEN_TABLE (VEX_LEN_0F44) }, 6161 { VEX_LEN_TABLE (VEX_LEN_0F45) }, 6162 { VEX_LEN_TABLE (VEX_LEN_0F46) }, 6163 { VEX_LEN_TABLE (VEX_LEN_0F47) }, 6164 /* 48 */ 6165 { Bad_Opcode }, 6166 { Bad_Opcode }, 6167 { VEX_LEN_TABLE (VEX_LEN_0F4A) }, 6168 { VEX_LEN_TABLE (VEX_LEN_0F4B) }, 6169 { Bad_Opcode }, 6170 { Bad_Opcode }, 6171 { Bad_Opcode }, 6172 { Bad_Opcode }, 6173 /* 50 */ 6174 { "vmovmskpX", { Gdq, Ux }, PREFIX_OPCODE }, 6175 { PREFIX_TABLE (PREFIX_0F51) }, 6176 { PREFIX_TABLE (PREFIX_0F52) }, 6177 { PREFIX_TABLE (PREFIX_0F53) }, 6178 { "vandpX", { XM, Vex, EXx }, PREFIX_OPCODE }, 6179 { "vandnpX", { XM, Vex, EXx }, PREFIX_OPCODE }, 6180 { "vorpX", { XM, Vex, EXx }, PREFIX_OPCODE }, 6181 { "vxorpX", { XM, Vex, EXx }, PREFIX_OPCODE }, 6182 /* 58 */ 6183 { PREFIX_TABLE (PREFIX_0F58) }, 6184 { PREFIX_TABLE (PREFIX_0F59) }, 6185 { PREFIX_TABLE (PREFIX_0F5A) }, 6186 { PREFIX_TABLE (PREFIX_0F5B) }, 6187 { PREFIX_TABLE (PREFIX_0F5C) }, 6188 { PREFIX_TABLE (PREFIX_0F5D) }, 6189 { PREFIX_TABLE (PREFIX_0F5E) }, 6190 { PREFIX_TABLE (PREFIX_0F5F) }, 6191 /* 60 */ 6192 { "vpunpcklbw", { XM, Vex, EXx }, PREFIX_DATA }, 6193 { "vpunpcklwd", { XM, Vex, EXx }, PREFIX_DATA }, 6194 { "vpunpckldq", { XM, Vex, EXx }, PREFIX_DATA }, 6195 { "vpacksswb", { XM, Vex, EXx }, PREFIX_DATA }, 6196 { "vpcmpgtb", { XM, Vex, EXx }, PREFIX_DATA }, 6197 { "vpcmpgtw", { XM, Vex, EXx }, PREFIX_DATA }, 6198 { "vpcmpgtd", { XM, Vex, EXx }, PREFIX_DATA }, 6199 { "vpackuswb", { XM, Vex, EXx }, PREFIX_DATA }, 6200 /* 68 */ 6201 { "vpunpckhbw", { XM, Vex, EXx }, PREFIX_DATA }, 6202 { "vpunpckhwd", { XM, Vex, EXx }, PREFIX_DATA }, 6203 { "vpunpckhdq", { XM, Vex, EXx }, PREFIX_DATA }, 6204 { "vpackssdw", { XM, Vex, EXx }, PREFIX_DATA }, 6205 { "vpunpcklqdq", { XM, Vex, EXx }, PREFIX_DATA }, 6206 { "vpunpckhqdq", { XM, Vex, EXx }, PREFIX_DATA }, 6207 { VEX_LEN_TABLE (VEX_LEN_0F6E) }, 6208 { PREFIX_TABLE (PREFIX_VEX_0F6F) }, 6209 /* 70 */ 6210 { PREFIX_TABLE (PREFIX_VEX_0F70) }, 6211 { REG_TABLE (REG_VEX_0F71) }, 6212 { REG_TABLE (REG_VEX_0F72) }, 6213 { REG_TABLE (REG_VEX_0F73) }, 6214 { "vpcmpeqb", { XM, Vex, EXx }, PREFIX_DATA }, 6215 { "vpcmpeqw", { XM, Vex, EXx }, PREFIX_DATA }, 6216 { "vpcmpeqd", { XM, Vex, EXx }, PREFIX_DATA }, 6217 { VEX_LEN_TABLE (VEX_LEN_0F77) }, 6218 /* 78 */ 6219 { Bad_Opcode }, 6220 { Bad_Opcode }, 6221 { Bad_Opcode }, 6222 { Bad_Opcode }, 6223 { PREFIX_TABLE (PREFIX_0F7C) }, 6224 { PREFIX_TABLE (PREFIX_0F7D) }, 6225 { PREFIX_TABLE (PREFIX_VEX_0F7E) }, 6226 { PREFIX_TABLE (PREFIX_VEX_0F7F) }, 6227 /* 80 */ 6228 { Bad_Opcode }, 6229 { Bad_Opcode }, 6230 { Bad_Opcode }, 6231 { Bad_Opcode }, 6232 { Bad_Opcode }, 6233 { Bad_Opcode }, 6234 { Bad_Opcode }, 6235 { Bad_Opcode }, 6236 /* 88 */ 6237 { Bad_Opcode }, 6238 { Bad_Opcode }, 6239 { Bad_Opcode }, 6240 { Bad_Opcode }, 6241 { Bad_Opcode }, 6242 { Bad_Opcode }, 6243 { Bad_Opcode }, 6244 { Bad_Opcode }, 6245 /* 90 */ 6246 { VEX_LEN_TABLE (VEX_LEN_0F90) }, 6247 { VEX_LEN_TABLE (VEX_LEN_0F91) }, 6248 { VEX_LEN_TABLE (VEX_LEN_0F92) }, 6249 { VEX_LEN_TABLE (VEX_LEN_0F93) }, 6250 { Bad_Opcode }, 6251 { Bad_Opcode }, 6252 { Bad_Opcode }, 6253 { Bad_Opcode }, 6254 /* 98 */ 6255 { VEX_LEN_TABLE (VEX_LEN_0F98) }, 6256 { VEX_LEN_TABLE (VEX_LEN_0F99) }, 6257 { Bad_Opcode }, 6258 { Bad_Opcode }, 6259 { Bad_Opcode }, 6260 { Bad_Opcode }, 6261 { Bad_Opcode }, 6262 { Bad_Opcode }, 6263 /* a0 */ 6264 { Bad_Opcode }, 6265 { Bad_Opcode }, 6266 { Bad_Opcode }, 6267 { Bad_Opcode }, 6268 { Bad_Opcode }, 6269 { Bad_Opcode }, 6270 { Bad_Opcode }, 6271 { Bad_Opcode }, 6272 /* a8 */ 6273 { Bad_Opcode }, 6274 { Bad_Opcode }, 6275 { Bad_Opcode }, 6276 { Bad_Opcode }, 6277 { Bad_Opcode }, 6278 { Bad_Opcode }, 6279 { REG_TABLE (REG_VEX_0FAE) }, 6280 { Bad_Opcode }, 6281 /* b0 */ 6282 { Bad_Opcode }, 6283 { Bad_Opcode }, 6284 { Bad_Opcode }, 6285 { Bad_Opcode }, 6286 { Bad_Opcode }, 6287 { Bad_Opcode }, 6288 { Bad_Opcode }, 6289 { Bad_Opcode }, 6290 /* b8 */ 6291 { Bad_Opcode }, 6292 { Bad_Opcode }, 6293 { Bad_Opcode }, 6294 { Bad_Opcode }, 6295 { Bad_Opcode }, 6296 { Bad_Opcode }, 6297 { Bad_Opcode }, 6298 { Bad_Opcode }, 6299 /* c0 */ 6300 { Bad_Opcode }, 6301 { Bad_Opcode }, 6302 { PREFIX_TABLE (PREFIX_0FC2) }, 6303 { Bad_Opcode }, 6304 { VEX_LEN_TABLE (VEX_LEN_0FC4) }, 6305 { "vpextrw", { Gd, Uxmm, Ib }, PREFIX_DATA }, 6306 { "vshufpX", { XM, Vex, EXx, Ib }, PREFIX_OPCODE }, 6307 { Bad_Opcode }, 6308 /* c8 */ 6309 { Bad_Opcode }, 6310 { Bad_Opcode }, 6311 { Bad_Opcode }, 6312 { Bad_Opcode }, 6313 { Bad_Opcode }, 6314 { Bad_Opcode }, 6315 { Bad_Opcode }, 6316 { Bad_Opcode }, 6317 /* d0 */ 6318 { PREFIX_TABLE (PREFIX_0FD0) }, 6319 { "vpsrlw", { XM, Vex, EXxmm }, PREFIX_DATA }, 6320 { "vpsrld", { XM, Vex, EXxmm }, PREFIX_DATA }, 6321 { "vpsrlq", { XM, Vex, EXxmm }, PREFIX_DATA }, 6322 { "vpaddq", { XM, Vex, EXx }, PREFIX_DATA }, 6323 { "vpmullw", { XM, Vex, EXx }, PREFIX_DATA }, 6324 { VEX_LEN_TABLE (VEX_LEN_0FD6) }, 6325 { "vpmovmskb", { Gdq, Ux }, PREFIX_DATA }, 6326 /* d8 */ 6327 { "vpsubusb", { XM, Vex, EXx }, PREFIX_DATA }, 6328 { "vpsubusw", { XM, Vex, EXx }, PREFIX_DATA }, 6329 { "vpminub", { XM, Vex, EXx }, PREFIX_DATA }, 6330 { "vpand", { XM, Vex, EXx }, PREFIX_DATA }, 6331 { "vpaddusb", { XM, Vex, EXx }, PREFIX_DATA }, 6332 { "vpaddusw", { XM, Vex, EXx }, PREFIX_DATA }, 6333 { "vpmaxub", { XM, Vex, EXx }, PREFIX_DATA }, 6334 { "vpandn", { XM, Vex, EXx }, PREFIX_DATA }, 6335 /* e0 */ 6336 { "vpavgb", { XM, Vex, EXx }, PREFIX_DATA }, 6337 { "vpsraw", { XM, Vex, EXxmm }, PREFIX_DATA }, 6338 { "vpsrad", { XM, Vex, EXxmm }, PREFIX_DATA }, 6339 { "vpavgw", { XM, Vex, EXx }, PREFIX_DATA }, 6340 { "vpmulhuw", { XM, Vex, EXx }, PREFIX_DATA }, 6341 { "vpmulhw", { XM, Vex, EXx }, PREFIX_DATA }, 6342 { PREFIX_TABLE (PREFIX_0FE6) }, 6343 { "vmovntdq", { Mx, XM }, PREFIX_DATA }, 6344 /* e8 */ 6345 { "vpsubsb", { XM, Vex, EXx }, PREFIX_DATA }, 6346 { "vpsubsw", { XM, Vex, EXx }, PREFIX_DATA }, 6347 { "vpminsw", { XM, Vex, EXx }, PREFIX_DATA }, 6348 { "vpor", { XM, Vex, EXx }, PREFIX_DATA }, 6349 { "vpaddsb", { XM, Vex, EXx }, PREFIX_DATA }, 6350 { "vpaddsw", { XM, Vex, EXx }, PREFIX_DATA }, 6351 { "vpmaxsw", { XM, Vex, EXx }, PREFIX_DATA }, 6352 { "vpxor", { XM, Vex, EXx }, PREFIX_DATA }, 6353 /* f0 */ 6354 { PREFIX_TABLE (PREFIX_0FF0) }, 6355 { "vpsllw", { XM, Vex, EXxmm }, PREFIX_DATA }, 6356 { "vpslld", { XM, Vex, EXxmm }, PREFIX_DATA }, 6357 { "vpsllq", { XM, Vex, EXxmm }, PREFIX_DATA }, 6358 { "vpmuludq", { XM, Vex, EXx }, PREFIX_DATA }, 6359 { "vpmaddwd", { XM, Vex, EXx }, PREFIX_DATA }, 6360 { "vpsadbw", { XM, Vex, EXx }, PREFIX_DATA }, 6361 { "vmaskmovdqu", { XM, Uxmm }, PREFIX_DATA }, 6362 /* f8 */ 6363 { "vpsubb", { XM, Vex, EXx }, PREFIX_DATA }, 6364 { "vpsubw", { XM, Vex, EXx }, PREFIX_DATA }, 6365 { "vpsubd", { XM, Vex, EXx }, PREFIX_DATA }, 6366 { "vpsubq", { XM, Vex, EXx }, PREFIX_DATA }, 6367 { "vpaddb", { XM, Vex, EXx }, PREFIX_DATA }, 6368 { "vpaddw", { XM, Vex, EXx }, PREFIX_DATA }, 6369 { "vpaddd", { XM, Vex, EXx }, PREFIX_DATA }, 6370 { Bad_Opcode }, 6371 }, 6372 /* VEX_0F38 */ 6373 { 6374 /* 00 */ 6375 { "vpshufb", { XM, Vex, EXx }, PREFIX_DATA }, 6376 { "vphaddw", { XM, Vex, EXx }, PREFIX_DATA }, 6377 { "vphaddd", { XM, Vex, EXx }, PREFIX_DATA }, 6378 { "vphaddsw", { XM, Vex, EXx }, PREFIX_DATA }, 6379 { "vpmaddubsw", { XM, Vex, EXx }, PREFIX_DATA }, 6380 { "vphsubw", { XM, Vex, EXx }, PREFIX_DATA }, 6381 { "vphsubd", { XM, Vex, EXx }, PREFIX_DATA }, 6382 { "vphsubsw", { XM, Vex, EXx }, PREFIX_DATA }, 6383 /* 08 */ 6384 { "vpsignb", { XM, Vex, EXx }, PREFIX_DATA }, 6385 { "vpsignw", { XM, Vex, EXx }, PREFIX_DATA }, 6386 { "vpsignd", { XM, Vex, EXx }, PREFIX_DATA }, 6387 { "vpmulhrsw", { XM, Vex, EXx }, PREFIX_DATA }, 6388 { VEX_W_TABLE (VEX_W_0F380C) }, 6389 { VEX_W_TABLE (VEX_W_0F380D) }, 6390 { VEX_W_TABLE (VEX_W_0F380E) }, 6391 { VEX_W_TABLE (VEX_W_0F380F) }, 6392 /* 10 */ 6393 { Bad_Opcode }, 6394 { Bad_Opcode }, 6395 { Bad_Opcode }, 6396 { VEX_W_TABLE (VEX_W_0F3813) }, 6397 { Bad_Opcode }, 6398 { Bad_Opcode }, 6399 { VEX_LEN_TABLE (VEX_LEN_0F3816) }, 6400 { "vptest", { XM, EXx }, PREFIX_DATA }, 6401 /* 18 */ 6402 { VEX_W_TABLE (VEX_W_0F3818) }, 6403 { VEX_LEN_TABLE (VEX_LEN_0F3819) }, 6404 { VEX_LEN_TABLE (VEX_LEN_0F381A) }, 6405 { Bad_Opcode }, 6406 { "vpabsb", { XM, EXx }, PREFIX_DATA }, 6407 { "vpabsw", { XM, EXx }, PREFIX_DATA }, 6408 { "vpabsd", { XM, EXx }, PREFIX_DATA }, 6409 { Bad_Opcode }, 6410 /* 20 */ 6411 { "vpmovsxbw", { XM, EXxmmq }, PREFIX_DATA }, 6412 { "vpmovsxbd", { XM, EXxmmqd }, PREFIX_DATA }, 6413 { "vpmovsxbq", { XM, EXxmmdw }, PREFIX_DATA }, 6414 { "vpmovsxwd", { XM, EXxmmq }, PREFIX_DATA }, 6415 { "vpmovsxwq", { XM, EXxmmqd }, PREFIX_DATA }, 6416 { "vpmovsxdq", { XM, EXxmmq }, PREFIX_DATA }, 6417 { Bad_Opcode }, 6418 { Bad_Opcode }, 6419 /* 28 */ 6420 { "vpmuldq", { XM, Vex, EXx }, PREFIX_DATA }, 6421 { "vpcmpeqq", { XM, Vex, EXx }, PREFIX_DATA }, 6422 { "vmovntdqa", { XM, Mx }, PREFIX_DATA }, 6423 { "vpackusdw", { XM, Vex, EXx }, PREFIX_DATA }, 6424 { VEX_W_TABLE (VEX_W_0F382C) }, 6425 { VEX_W_TABLE (VEX_W_0F382D) }, 6426 { VEX_W_TABLE (VEX_W_0F382E) }, 6427 { VEX_W_TABLE (VEX_W_0F382F) }, 6428 /* 30 */ 6429 { "vpmovzxbw", { XM, EXxmmq }, PREFIX_DATA }, 6430 { "vpmovzxbd", { XM, EXxmmqd }, PREFIX_DATA }, 6431 { "vpmovzxbq", { XM, EXxmmdw }, PREFIX_DATA }, 6432 { "vpmovzxwd", { XM, EXxmmq }, PREFIX_DATA }, 6433 { "vpmovzxwq", { XM, EXxmmqd }, PREFIX_DATA }, 6434 { "vpmovzxdq", { XM, EXxmmq }, PREFIX_DATA }, 6435 { VEX_LEN_TABLE (VEX_LEN_0F3836) }, 6436 { "vpcmpgtq", { XM, Vex, EXx }, PREFIX_DATA }, 6437 /* 38 */ 6438 { "vpminsb", { XM, Vex, EXx }, PREFIX_DATA }, 6439 { "vpminsd", { XM, Vex, EXx }, PREFIX_DATA }, 6440 { "vpminuw", { XM, Vex, EXx }, PREFIX_DATA }, 6441 { "vpminud", { XM, Vex, EXx }, PREFIX_DATA }, 6442 { "vpmaxsb", { XM, Vex, EXx }, PREFIX_DATA }, 6443 { "vpmaxsd", { XM, Vex, EXx }, PREFIX_DATA }, 6444 { "vpmaxuw", { XM, Vex, EXx }, PREFIX_DATA }, 6445 { "vpmaxud", { XM, Vex, EXx }, PREFIX_DATA }, 6446 /* 40 */ 6447 { "vpmulld", { XM, Vex, EXx }, PREFIX_DATA }, 6448 { VEX_LEN_TABLE (VEX_LEN_0F3841) }, 6449 { Bad_Opcode }, 6450 { Bad_Opcode }, 6451 { Bad_Opcode }, 6452 { "vpsrlv%DQ", { XM, Vex, EXx }, PREFIX_DATA }, 6453 { VEX_W_TABLE (VEX_W_0F3846) }, 6454 { "vpsllv%DQ", { XM, Vex, EXx }, PREFIX_DATA }, 6455 /* 48 */ 6456 { Bad_Opcode }, 6457 { X86_64_TABLE (X86_64_VEX_0F3849) }, 6458 { Bad_Opcode }, 6459 { X86_64_TABLE (X86_64_VEX_0F384B) }, 6460 { Bad_Opcode }, 6461 { Bad_Opcode }, 6462 { Bad_Opcode }, 6463 { Bad_Opcode }, 6464 /* 50 */ 6465 { VEX_W_TABLE (VEX_W_0F3850) }, 6466 { VEX_W_TABLE (VEX_W_0F3851) }, 6467 { VEX_W_TABLE (VEX_W_0F3852) }, 6468 { VEX_W_TABLE (VEX_W_0F3853) }, 6469 { Bad_Opcode }, 6470 { Bad_Opcode }, 6471 { Bad_Opcode }, 6472 { Bad_Opcode }, 6473 /* 58 */ 6474 { VEX_W_TABLE (VEX_W_0F3858) }, 6475 { VEX_W_TABLE (VEX_W_0F3859) }, 6476 { VEX_LEN_TABLE (VEX_LEN_0F385A) }, 6477 { Bad_Opcode }, 6478 { X86_64_TABLE (X86_64_VEX_0F385C) }, 6479 { Bad_Opcode }, 6480 { X86_64_TABLE (X86_64_VEX_0F385E) }, 6481 { Bad_Opcode }, 6482 /* 60 */ 6483 { Bad_Opcode }, 6484 { Bad_Opcode }, 6485 { Bad_Opcode }, 6486 { Bad_Opcode }, 6487 { Bad_Opcode }, 6488 { Bad_Opcode }, 6489 { Bad_Opcode }, 6490 { Bad_Opcode }, 6491 /* 68 */ 6492 { Bad_Opcode }, 6493 { Bad_Opcode }, 6494 { Bad_Opcode }, 6495 { Bad_Opcode }, 6496 { X86_64_TABLE (X86_64_VEX_0F386C) }, 6497 { Bad_Opcode }, 6498 { Bad_Opcode }, 6499 { Bad_Opcode }, 6500 /* 70 */ 6501 { Bad_Opcode }, 6502 { Bad_Opcode }, 6503 { PREFIX_TABLE (PREFIX_VEX_0F3872) }, 6504 { Bad_Opcode }, 6505 { Bad_Opcode }, 6506 { Bad_Opcode }, 6507 { Bad_Opcode }, 6508 { Bad_Opcode }, 6509 /* 78 */ 6510 { VEX_W_TABLE (VEX_W_0F3878) }, 6511 { VEX_W_TABLE (VEX_W_0F3879) }, 6512 { Bad_Opcode }, 6513 { Bad_Opcode }, 6514 { Bad_Opcode }, 6515 { Bad_Opcode }, 6516 { Bad_Opcode }, 6517 { Bad_Opcode }, 6518 /* 80 */ 6519 { Bad_Opcode }, 6520 { Bad_Opcode }, 6521 { Bad_Opcode }, 6522 { Bad_Opcode }, 6523 { Bad_Opcode }, 6524 { Bad_Opcode }, 6525 { Bad_Opcode }, 6526 { Bad_Opcode }, 6527 /* 88 */ 6528 { Bad_Opcode }, 6529 { Bad_Opcode }, 6530 { Bad_Opcode }, 6531 { Bad_Opcode }, 6532 { "vpmaskmov%DQ", { XM, Vex, Mx }, PREFIX_DATA }, 6533 { Bad_Opcode }, 6534 { "vpmaskmov%DQ", { Mx, Vex, XM }, PREFIX_DATA }, 6535 { Bad_Opcode }, 6536 /* 90 */ 6537 { "vpgatherd%DQ", { XM, MVexVSIBDWpX, VexGatherD }, PREFIX_DATA }, 6538 { "vpgatherq%DQ", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, PREFIX_DATA }, 6539 { "vgatherdp%XW", { XM, MVexVSIBDWpX, VexGatherD }, PREFIX_DATA }, 6540 { "vgatherqp%XW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, PREFIX_DATA }, 6541 { Bad_Opcode }, 6542 { Bad_Opcode }, 6543 { "vfmaddsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA }, 6544 { "vfmsubadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA }, 6545 /* 98 */ 6546 { "vfmadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA }, 6547 { "vfmadd132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA }, 6548 { "vfmsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA }, 6549 { "vfmsub132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA }, 6550 { "vfnmadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA }, 6551 { "vfnmadd132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA }, 6552 { "vfnmsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA }, 6553 { "vfnmsub132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA }, 6554 /* a0 */ 6555 { Bad_Opcode }, 6556 { Bad_Opcode }, 6557 { Bad_Opcode }, 6558 { Bad_Opcode }, 6559 { Bad_Opcode }, 6560 { Bad_Opcode }, 6561 { "vfmaddsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA }, 6562 { "vfmsubadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA }, 6563 /* a8 */ 6564 { "vfmadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA }, 6565 { "vfmadd213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA }, 6566 { "vfmsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA }, 6567 { "vfmsub213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA }, 6568 { "vfnmadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA }, 6569 { "vfnmadd213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA }, 6570 { "vfnmsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA }, 6571 { "vfnmsub213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA }, 6572 /* b0 */ 6573 { VEX_W_TABLE (VEX_W_0F38B0) }, 6574 { VEX_W_TABLE (VEX_W_0F38B1) }, 6575 { Bad_Opcode }, 6576 { Bad_Opcode }, 6577 { VEX_W_TABLE (VEX_W_0F38B4) }, 6578 { VEX_W_TABLE (VEX_W_0F38B5) }, 6579 { "vfmaddsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA }, 6580 { "vfmsubadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA }, 6581 /* b8 */ 6582 { "vfmadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA }, 6583 { "vfmadd231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA }, 6584 { "vfmsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA }, 6585 { "vfmsub231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA }, 6586 { "vfnmadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA }, 6587 { "vfnmadd231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA }, 6588 { "vfnmsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA }, 6589 { "vfnmsub231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA }, 6590 /* c0 */ 6591 { Bad_Opcode }, 6592 { Bad_Opcode }, 6593 { Bad_Opcode }, 6594 { Bad_Opcode }, 6595 { Bad_Opcode }, 6596 { Bad_Opcode }, 6597 { Bad_Opcode }, 6598 { Bad_Opcode }, 6599 /* c8 */ 6600 { Bad_Opcode }, 6601 { Bad_Opcode }, 6602 { Bad_Opcode }, 6603 { PREFIX_TABLE (PREFIX_VEX_0F38CB) }, 6604 { PREFIX_TABLE (PREFIX_VEX_0F38CC) }, 6605 { PREFIX_TABLE (PREFIX_VEX_0F38CD) }, 6606 { Bad_Opcode }, 6607 { VEX_W_TABLE (VEX_W_0F38CF) }, 6608 /* d0 */ 6609 { Bad_Opcode }, 6610 { Bad_Opcode }, 6611 { VEX_W_TABLE (VEX_W_0F38D2) }, 6612 { VEX_W_TABLE (VEX_W_0F38D3) }, 6613 { Bad_Opcode }, 6614 { Bad_Opcode }, 6615 { Bad_Opcode }, 6616 { Bad_Opcode }, 6617 /* d8 */ 6618 { Bad_Opcode }, 6619 { Bad_Opcode }, 6620 { VEX_W_TABLE (VEX_W_0F38DA) }, 6621 { VEX_LEN_TABLE (VEX_LEN_0F38DB) }, 6622 { "vaesenc", { XM, Vex, EXx }, PREFIX_DATA }, 6623 { "vaesenclast", { XM, Vex, EXx }, PREFIX_DATA }, 6624 { "vaesdec", { XM, Vex, EXx }, PREFIX_DATA }, 6625 { "vaesdeclast", { XM, Vex, EXx }, PREFIX_DATA }, 6626 /* e0 */ 6627 { X86_64_TABLE (X86_64_VEX_0F38E0) }, 6628 { X86_64_TABLE (X86_64_VEX_0F38E1) }, 6629 { X86_64_TABLE (X86_64_VEX_0F38E2) }, 6630 { X86_64_TABLE (X86_64_VEX_0F38E3) }, 6631 { X86_64_TABLE (X86_64_VEX_0F38E4) }, 6632 { X86_64_TABLE (X86_64_VEX_0F38E5) }, 6633 { X86_64_TABLE (X86_64_VEX_0F38E6) }, 6634 { X86_64_TABLE (X86_64_VEX_0F38E7) }, 6635 /* e8 */ 6636 { X86_64_TABLE (X86_64_VEX_0F38E8) }, 6637 { X86_64_TABLE (X86_64_VEX_0F38E9) }, 6638 { X86_64_TABLE (X86_64_VEX_0F38EA) }, 6639 { X86_64_TABLE (X86_64_VEX_0F38EB) }, 6640 { X86_64_TABLE (X86_64_VEX_0F38EC) }, 6641 { X86_64_TABLE (X86_64_VEX_0F38ED) }, 6642 { X86_64_TABLE (X86_64_VEX_0F38EE) }, 6643 { X86_64_TABLE (X86_64_VEX_0F38EF) }, 6644 /* f0 */ 6645 { Bad_Opcode }, 6646 { Bad_Opcode }, 6647 { VEX_LEN_TABLE (VEX_LEN_0F38F2) }, 6648 { VEX_LEN_TABLE (VEX_LEN_0F38F3) }, 6649 { Bad_Opcode }, 6650 { VEX_LEN_TABLE (VEX_LEN_0F38F5) }, 6651 { VEX_LEN_TABLE (VEX_LEN_0F38F6) }, 6652 { VEX_LEN_TABLE (VEX_LEN_0F38F7) }, 6653 /* f8 */ 6654 { Bad_Opcode }, 6655 { Bad_Opcode }, 6656 { Bad_Opcode }, 6657 { Bad_Opcode }, 6658 { Bad_Opcode }, 6659 { Bad_Opcode }, 6660 { Bad_Opcode }, 6661 { Bad_Opcode }, 6662 }, 6663 /* VEX_0F3A */ 6664 { 6665 /* 00 */ 6666 { VEX_LEN_TABLE (VEX_LEN_0F3A00) }, 6667 { VEX_LEN_TABLE (VEX_LEN_0F3A01) }, 6668 { VEX_W_TABLE (VEX_W_0F3A02) }, 6669 { Bad_Opcode }, 6670 { VEX_W_TABLE (VEX_W_0F3A04) }, 6671 { VEX_W_TABLE (VEX_W_0F3A05) }, 6672 { VEX_LEN_TABLE (VEX_LEN_0F3A06) }, 6673 { Bad_Opcode }, 6674 /* 08 */ 6675 { "vroundps", { XM, EXx, Ib }, PREFIX_DATA }, 6676 { "vroundpd", { XM, EXx, Ib }, PREFIX_DATA }, 6677 { "vroundss", { XMScalar, VexScalar, EXd, Ib }, PREFIX_DATA }, 6678 { "vroundsd", { XMScalar, VexScalar, EXq, Ib }, PREFIX_DATA }, 6679 { "vblendps", { XM, Vex, EXx, Ib }, PREFIX_DATA }, 6680 { "vblendpd", { XM, Vex, EXx, Ib }, PREFIX_DATA }, 6681 { "vpblendw", { XM, Vex, EXx, Ib }, PREFIX_DATA }, 6682 { "vpalignr", { XM, Vex, EXx, Ib }, PREFIX_DATA }, 6683 /* 10 */ 6684 { Bad_Opcode }, 6685 { Bad_Opcode }, 6686 { Bad_Opcode }, 6687 { Bad_Opcode }, 6688 { VEX_LEN_TABLE (VEX_LEN_0F3A14) }, 6689 { VEX_LEN_TABLE (VEX_LEN_0F3A15) }, 6690 { VEX_LEN_TABLE (VEX_LEN_0F3A16) }, 6691 { VEX_LEN_TABLE (VEX_LEN_0F3A17) }, 6692 /* 18 */ 6693 { VEX_LEN_TABLE (VEX_LEN_0F3A18) }, 6694 { VEX_LEN_TABLE (VEX_LEN_0F3A19) }, 6695 { Bad_Opcode }, 6696 { Bad_Opcode }, 6697 { Bad_Opcode }, 6698 { VEX_W_TABLE (VEX_W_0F3A1D) }, 6699 { Bad_Opcode }, 6700 { Bad_Opcode }, 6701 /* 20 */ 6702 { VEX_LEN_TABLE (VEX_LEN_0F3A20) }, 6703 { VEX_LEN_TABLE (VEX_LEN_0F3A21) }, 6704 { VEX_LEN_TABLE (VEX_LEN_0F3A22) }, 6705 { Bad_Opcode }, 6706 { Bad_Opcode }, 6707 { Bad_Opcode }, 6708 { Bad_Opcode }, 6709 { Bad_Opcode }, 6710 /* 28 */ 6711 { Bad_Opcode }, 6712 { Bad_Opcode }, 6713 { Bad_Opcode }, 6714 { Bad_Opcode }, 6715 { Bad_Opcode }, 6716 { Bad_Opcode }, 6717 { Bad_Opcode }, 6718 { Bad_Opcode }, 6719 /* 30 */ 6720 { VEX_LEN_TABLE (VEX_LEN_0F3A30) }, 6721 { VEX_LEN_TABLE (VEX_LEN_0F3A31) }, 6722 { VEX_LEN_TABLE (VEX_LEN_0F3A32) }, 6723 { VEX_LEN_TABLE (VEX_LEN_0F3A33) }, 6724 { Bad_Opcode }, 6725 { Bad_Opcode }, 6726 { Bad_Opcode }, 6727 { Bad_Opcode }, 6728 /* 38 */ 6729 { VEX_LEN_TABLE (VEX_LEN_0F3A38) }, 6730 { VEX_LEN_TABLE (VEX_LEN_0F3A39) }, 6731 { Bad_Opcode }, 6732 { Bad_Opcode }, 6733 { Bad_Opcode }, 6734 { Bad_Opcode }, 6735 { Bad_Opcode }, 6736 { Bad_Opcode }, 6737 /* 40 */ 6738 { "vdpps", { XM, Vex, EXx, Ib }, PREFIX_DATA }, 6739 { VEX_LEN_TABLE (VEX_LEN_0F3A41) }, 6740 { "vmpsadbw", { XM, Vex, EXx, Ib }, PREFIX_DATA }, 6741 { Bad_Opcode }, 6742 { "vpclmulqdq", { XM, Vex, EXx, PCLMUL }, PREFIX_DATA }, 6743 { Bad_Opcode }, 6744 { VEX_LEN_TABLE (VEX_LEN_0F3A46) }, 6745 { Bad_Opcode }, 6746 /* 48 */ 6747 { "vpermil2ps", { XM, Vex, EXx, XMVexI4, VexI4 }, PREFIX_DATA }, 6748 { "vpermil2pd", { XM, Vex, EXx, XMVexI4, VexI4 }, PREFIX_DATA }, 6749 { VEX_W_TABLE (VEX_W_0F3A4A) }, 6750 { VEX_W_TABLE (VEX_W_0F3A4B) }, 6751 { VEX_W_TABLE (VEX_W_0F3A4C) }, 6752 { Bad_Opcode }, 6753 { Bad_Opcode }, 6754 { Bad_Opcode }, 6755 /* 50 */ 6756 { Bad_Opcode }, 6757 { Bad_Opcode }, 6758 { Bad_Opcode }, 6759 { Bad_Opcode }, 6760 { Bad_Opcode }, 6761 { Bad_Opcode }, 6762 { Bad_Opcode }, 6763 { Bad_Opcode }, 6764 /* 58 */ 6765 { Bad_Opcode }, 6766 { Bad_Opcode }, 6767 { Bad_Opcode }, 6768 { Bad_Opcode }, 6769 { "vfmaddsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA }, 6770 { "vfmaddsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA }, 6771 { "vfmsubaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA }, 6772 { "vfmsubaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA }, 6773 /* 60 */ 6774 { VEX_LEN_TABLE (VEX_LEN_0F3A60) }, 6775 { VEX_LEN_TABLE (VEX_LEN_0F3A61) }, 6776 { VEX_LEN_TABLE (VEX_LEN_0F3A62) }, 6777 { VEX_LEN_TABLE (VEX_LEN_0F3A63) }, 6778 { Bad_Opcode }, 6779 { Bad_Opcode }, 6780 { Bad_Opcode }, 6781 { Bad_Opcode }, 6782 /* 68 */ 6783 { "vfmaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA }, 6784 { "vfmaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA }, 6785 { "vfmaddss", { XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA }, 6786 { "vfmaddsd", { XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA }, 6787 { "vfmsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA }, 6788 { "vfmsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA }, 6789 { "vfmsubss", { XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA }, 6790 { "vfmsubsd", { XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA }, 6791 /* 70 */ 6792 { Bad_Opcode }, 6793 { Bad_Opcode }, 6794 { Bad_Opcode }, 6795 { Bad_Opcode }, 6796 { Bad_Opcode }, 6797 { Bad_Opcode }, 6798 { Bad_Opcode }, 6799 { Bad_Opcode }, 6800 /* 78 */ 6801 { "vfnmaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA }, 6802 { "vfnmaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA }, 6803 { "vfnmaddss", { XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA }, 6804 { "vfnmaddsd", { XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA }, 6805 { "vfnmsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA }, 6806 { "vfnmsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA }, 6807 { "vfnmsubss", { XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA }, 6808 { "vfnmsubsd", { XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA }, 6809 /* 80 */ 6810 { Bad_Opcode }, 6811 { Bad_Opcode }, 6812 { Bad_Opcode }, 6813 { Bad_Opcode }, 6814 { Bad_Opcode }, 6815 { Bad_Opcode }, 6816 { Bad_Opcode }, 6817 { Bad_Opcode }, 6818 /* 88 */ 6819 { Bad_Opcode }, 6820 { Bad_Opcode }, 6821 { Bad_Opcode }, 6822 { Bad_Opcode }, 6823 { Bad_Opcode }, 6824 { Bad_Opcode }, 6825 { Bad_Opcode }, 6826 { Bad_Opcode }, 6827 /* 90 */ 6828 { Bad_Opcode }, 6829 { Bad_Opcode }, 6830 { Bad_Opcode }, 6831 { Bad_Opcode }, 6832 { Bad_Opcode }, 6833 { Bad_Opcode }, 6834 { Bad_Opcode }, 6835 { Bad_Opcode }, 6836 /* 98 */ 6837 { Bad_Opcode }, 6838 { Bad_Opcode }, 6839 { Bad_Opcode }, 6840 { Bad_Opcode }, 6841 { Bad_Opcode }, 6842 { Bad_Opcode }, 6843 { Bad_Opcode }, 6844 { Bad_Opcode }, 6845 /* a0 */ 6846 { Bad_Opcode }, 6847 { Bad_Opcode }, 6848 { Bad_Opcode }, 6849 { Bad_Opcode }, 6850 { Bad_Opcode }, 6851 { Bad_Opcode }, 6852 { Bad_Opcode }, 6853 { Bad_Opcode }, 6854 /* a8 */ 6855 { Bad_Opcode }, 6856 { Bad_Opcode }, 6857 { Bad_Opcode }, 6858 { Bad_Opcode }, 6859 { Bad_Opcode }, 6860 { Bad_Opcode }, 6861 { Bad_Opcode }, 6862 { Bad_Opcode }, 6863 /* b0 */ 6864 { Bad_Opcode }, 6865 { Bad_Opcode }, 6866 { Bad_Opcode }, 6867 { Bad_Opcode }, 6868 { Bad_Opcode }, 6869 { Bad_Opcode }, 6870 { Bad_Opcode }, 6871 { Bad_Opcode }, 6872 /* b8 */ 6873 { Bad_Opcode }, 6874 { Bad_Opcode }, 6875 { Bad_Opcode }, 6876 { Bad_Opcode }, 6877 { Bad_Opcode }, 6878 { Bad_Opcode }, 6879 { Bad_Opcode }, 6880 { Bad_Opcode }, 6881 /* c0 */ 6882 { Bad_Opcode }, 6883 { Bad_Opcode }, 6884 { Bad_Opcode }, 6885 { Bad_Opcode }, 6886 { Bad_Opcode }, 6887 { Bad_Opcode }, 6888 { Bad_Opcode }, 6889 { Bad_Opcode }, 6890 /* c8 */ 6891 { Bad_Opcode }, 6892 { Bad_Opcode }, 6893 { Bad_Opcode }, 6894 { Bad_Opcode }, 6895 { Bad_Opcode }, 6896 { Bad_Opcode }, 6897 { VEX_W_TABLE (VEX_W_0F3ACE) }, 6898 { VEX_W_TABLE (VEX_W_0F3ACF) }, 6899 /* d0 */ 6900 { Bad_Opcode }, 6901 { Bad_Opcode }, 6902 { Bad_Opcode }, 6903 { Bad_Opcode }, 6904 { Bad_Opcode }, 6905 { Bad_Opcode }, 6906 { Bad_Opcode }, 6907 { Bad_Opcode }, 6908 /* d8 */ 6909 { Bad_Opcode }, 6910 { Bad_Opcode }, 6911 { Bad_Opcode }, 6912 { Bad_Opcode }, 6913 { Bad_Opcode }, 6914 { Bad_Opcode }, 6915 { VEX_W_TABLE (VEX_W_0F3ADE) }, 6916 { VEX_LEN_TABLE (VEX_LEN_0F3ADF) }, 6917 /* e0 */ 6918 { Bad_Opcode }, 6919 { Bad_Opcode }, 6920 { Bad_Opcode }, 6921 { Bad_Opcode }, 6922 { Bad_Opcode }, 6923 { Bad_Opcode }, 6924 { Bad_Opcode }, 6925 { Bad_Opcode }, 6926 /* e8 */ 6927 { Bad_Opcode }, 6928 { Bad_Opcode }, 6929 { Bad_Opcode }, 6930 { Bad_Opcode }, 6931 { Bad_Opcode }, 6932 { Bad_Opcode }, 6933 { Bad_Opcode }, 6934 { Bad_Opcode }, 6935 /* f0 */ 6936 { VEX_LEN_TABLE (VEX_LEN_0F3AF0) }, 6937 { Bad_Opcode }, 6938 { Bad_Opcode }, 6939 { Bad_Opcode }, 6940 { Bad_Opcode }, 6941 { Bad_Opcode }, 6942 { Bad_Opcode }, 6943 { Bad_Opcode }, 6944 /* f8 */ 6945 { Bad_Opcode }, 6946 { Bad_Opcode }, 6947 { Bad_Opcode }, 6948 { Bad_Opcode }, 6949 { Bad_Opcode }, 6950 { Bad_Opcode }, 6951 { Bad_Opcode }, 6952 { Bad_Opcode }, 6953 }, 6954 }; 6955 6956 #include "i386-dis-evex.h" 6957 6958 static const struct dis386 vex_len_table[][2] = { 6959 /* VEX_LEN_0F12_P_0 */ 6960 { 6961 { MOD_TABLE (MOD_0F12_PREFIX_0) }, 6962 }, 6963 6964 /* VEX_LEN_0F12_P_2 */ 6965 { 6966 { "%XEVmovlpYX", { XM, Vex, Mq }, 0 }, 6967 }, 6968 6969 /* VEX_LEN_0F13 */ 6970 { 6971 { "%XEVmovlpYX", { Mq, XM }, PREFIX_OPCODE }, 6972 }, 6973 6974 /* VEX_LEN_0F16_P_0 */ 6975 { 6976 { MOD_TABLE (MOD_0F16_PREFIX_0) }, 6977 }, 6978 6979 /* VEX_LEN_0F16_P_2 */ 6980 { 6981 { "%XEVmovhpYX", { XM, Vex, Mq }, 0 }, 6982 }, 6983 6984 /* VEX_LEN_0F17 */ 6985 { 6986 { "%XEVmovhpYX", { Mq, XM }, PREFIX_OPCODE }, 6987 }, 6988 6989 /* VEX_LEN_0F41 */ 6990 { 6991 { Bad_Opcode }, 6992 { VEX_W_TABLE (VEX_W_0F41_L_1) }, 6993 }, 6994 6995 /* VEX_LEN_0F42 */ 6996 { 6997 { Bad_Opcode }, 6998 { VEX_W_TABLE (VEX_W_0F42_L_1) }, 6999 }, 7000 7001 /* VEX_LEN_0F44 */ 7002 { 7003 { VEX_W_TABLE (VEX_W_0F44_L_0) }, 7004 }, 7005 7006 /* VEX_LEN_0F45 */ 7007 { 7008 { Bad_Opcode }, 7009 { VEX_W_TABLE (VEX_W_0F45_L_1) }, 7010 }, 7011 7012 /* VEX_LEN_0F46 */ 7013 { 7014 { Bad_Opcode }, 7015 { VEX_W_TABLE (VEX_W_0F46_L_1) }, 7016 }, 7017 7018 /* VEX_LEN_0F47 */ 7019 { 7020 { Bad_Opcode }, 7021 { VEX_W_TABLE (VEX_W_0F47_L_1) }, 7022 }, 7023 7024 /* VEX_LEN_0F4A */ 7025 { 7026 { Bad_Opcode }, 7027 { VEX_W_TABLE (VEX_W_0F4A_L_1) }, 7028 }, 7029 7030 /* VEX_LEN_0F4B */ 7031 { 7032 { Bad_Opcode }, 7033 { VEX_W_TABLE (VEX_W_0F4B_L_1) }, 7034 }, 7035 7036 /* VEX_LEN_0F6E */ 7037 { 7038 { "%XEvmovYK", { XMScalar, Edq }, PREFIX_DATA }, 7039 }, 7040 7041 /* VEX_LEN_0F77 */ 7042 { 7043 { "vzeroupper", { XX }, 0 }, 7044 { "vzeroall", { XX }, 0 }, 7045 }, 7046 7047 /* VEX_LEN_0F7E_P_1 */ 7048 { 7049 { "%XEvmovqY", { XMScalar, EXq }, 0 }, 7050 }, 7051 7052 /* VEX_LEN_0F7E_P_2 */ 7053 { 7054 { "%XEvmovK", { Edq, XMScalar }, 0 }, 7055 }, 7056 7057 /* VEX_LEN_0F90 */ 7058 { 7059 { VEX_W_TABLE (VEX_W_0F90_L_0) }, 7060 }, 7061 7062 /* VEX_LEN_0F91 */ 7063 { 7064 { VEX_W_TABLE (VEX_W_0F91_L_0) }, 7065 }, 7066 7067 /* VEX_LEN_0F92 */ 7068 { 7069 { VEX_W_TABLE (VEX_W_0F92_L_0) }, 7070 }, 7071 7072 /* VEX_LEN_0F93 */ 7073 { 7074 { VEX_W_TABLE (VEX_W_0F93_L_0) }, 7075 }, 7076 7077 /* VEX_LEN_0F98 */ 7078 { 7079 { VEX_W_TABLE (VEX_W_0F98_L_0) }, 7080 }, 7081 7082 /* VEX_LEN_0F99 */ 7083 { 7084 { VEX_W_TABLE (VEX_W_0F99_L_0) }, 7085 }, 7086 7087 /* VEX_LEN_0FAE_R_2 */ 7088 { 7089 { "vldmxcsr", { Md }, 0 }, 7090 }, 7091 7092 /* VEX_LEN_0FAE_R_3 */ 7093 { 7094 { "vstmxcsr", { Md }, 0 }, 7095 }, 7096 7097 /* VEX_LEN_0FC4 */ 7098 { 7099 { "%XEvpinsrwY", { XM, Vex, Edw, Ib }, PREFIX_DATA }, 7100 }, 7101 7102 /* VEX_LEN_0FD6 */ 7103 { 7104 { "%XEvmovqY", { EXqS, XMScalar }, PREFIX_DATA }, 7105 }, 7106 7107 /* VEX_LEN_0F3816 */ 7108 { 7109 { Bad_Opcode }, 7110 { VEX_W_TABLE (VEX_W_0F3816_L_1) }, 7111 }, 7112 7113 /* VEX_LEN_0F3819 */ 7114 { 7115 { Bad_Opcode }, 7116 { VEX_W_TABLE (VEX_W_0F3819_L_1) }, 7117 }, 7118 7119 /* VEX_LEN_0F381A */ 7120 { 7121 { Bad_Opcode }, 7122 { VEX_W_TABLE (VEX_W_0F381A_L_1) }, 7123 }, 7124 7125 /* VEX_LEN_0F3836 */ 7126 { 7127 { Bad_Opcode }, 7128 { VEX_W_TABLE (VEX_W_0F3836) }, 7129 }, 7130 7131 /* VEX_LEN_0F3841 */ 7132 { 7133 { "vphminposuw", { XM, EXx }, PREFIX_DATA }, 7134 }, 7135 7136 /* VEX_LEN_0F3849_X86_64 */ 7137 { 7138 { VEX_W_TABLE (VEX_W_0F3849_X86_64_L_0) }, 7139 }, 7140 7141 /* VEX_LEN_0F384B_X86_64 */ 7142 { 7143 { VEX_W_TABLE (VEX_W_0F384B_X86_64_L_0) }, 7144 }, 7145 7146 /* VEX_LEN_0F385A */ 7147 { 7148 { Bad_Opcode }, 7149 { VEX_W_TABLE (VEX_W_0F385A_L_0) }, 7150 }, 7151 7152 /* VEX_LEN_0F385C_X86_64 */ 7153 { 7154 { VEX_W_TABLE (VEX_W_0F385C_X86_64_L_0) }, 7155 }, 7156 7157 /* VEX_LEN_0F385E_X86_64 */ 7158 { 7159 { VEX_W_TABLE (VEX_W_0F385E_X86_64_L_0) }, 7160 }, 7161 7162 /* VEX_LEN_0F386C_X86_64 */ 7163 { 7164 { VEX_W_TABLE (VEX_W_0F386C_X86_64_L_0) }, 7165 }, 7166 7167 /* VEX_LEN_0F38CB_P_3_W_0 */ 7168 { 7169 { Bad_Opcode }, 7170 { "vsha512rnds2", { XM, Vex, Rxmmq }, 0 }, 7171 }, 7172 7173 /* VEX_LEN_0F38CC_P_3_W_0 */ 7174 { 7175 { Bad_Opcode }, 7176 { "vsha512msg1", { XM, Rxmmq }, 0 }, 7177 }, 7178 7179 /* VEX_LEN_0F38CD_P_3_W_0 */ 7180 { 7181 { Bad_Opcode }, 7182 { "vsha512msg2", { XM, Rymm }, 0 }, 7183 }, 7184 7185 /* VEX_LEN_0F38DA_W_0_P_0 */ 7186 { 7187 { "vsm3msg1", { XM, Vex, EXxmm }, 0 }, 7188 }, 7189 7190 /* VEX_LEN_0F38DA_W_0_P_2 */ 7191 { 7192 { "vsm3msg2", { XM, Vex, EXxmm }, 0 }, 7193 }, 7194 7195 /* VEX_LEN_0F38DB */ 7196 { 7197 { "vaesimc", { XM, EXx }, PREFIX_DATA }, 7198 }, 7199 7200 /* VEX_LEN_0F38F2 */ 7201 { 7202 { PREFIX_TABLE (PREFIX_VEX_0F38F2_L_0) }, 7203 }, 7204 7205 /* VEX_LEN_0F38F3 */ 7206 { 7207 { PREFIX_TABLE (PREFIX_VEX_0F38F3_L_0) }, 7208 }, 7209 7210 /* VEX_LEN_0F38F5 */ 7211 { 7212 { PREFIX_TABLE(PREFIX_VEX_0F38F5_L_0) }, 7213 }, 7214 7215 /* VEX_LEN_0F38F6 */ 7216 { 7217 { PREFIX_TABLE(PREFIX_VEX_0F38F6_L_0) }, 7218 }, 7219 7220 /* VEX_LEN_0F38F7 */ 7221 { 7222 { PREFIX_TABLE(PREFIX_VEX_0F38F7_L_0) }, 7223 }, 7224 7225 /* VEX_LEN_0F3A00 */ 7226 { 7227 { Bad_Opcode }, 7228 { VEX_W_TABLE (VEX_W_0F3A00_L_1) }, 7229 }, 7230 7231 /* VEX_LEN_0F3A01 */ 7232 { 7233 { Bad_Opcode }, 7234 { VEX_W_TABLE (VEX_W_0F3A01_L_1) }, 7235 }, 7236 7237 /* VEX_LEN_0F3A06 */ 7238 { 7239 { Bad_Opcode }, 7240 { VEX_W_TABLE (VEX_W_0F3A06_L_1) }, 7241 }, 7242 7243 /* VEX_LEN_0F3A14 */ 7244 { 7245 { "%XEvpextrb", { Edb, XM, Ib }, PREFIX_DATA }, 7246 }, 7247 7248 /* VEX_LEN_0F3A15 */ 7249 { 7250 { "%XEvpextrw", { Edw, XM, Ib }, PREFIX_DATA }, 7251 }, 7252 7253 /* VEX_LEN_0F3A16 */ 7254 { 7255 { "%XEvpextrK", { Edq, XM, Ib }, PREFIX_DATA }, 7256 }, 7257 7258 /* VEX_LEN_0F3A17 */ 7259 { 7260 { "%XEvextractps", { Ed, XM, Ib }, PREFIX_DATA }, 7261 }, 7262 7263 /* VEX_LEN_0F3A18 */ 7264 { 7265 { Bad_Opcode }, 7266 { VEX_W_TABLE (VEX_W_0F3A18_L_1) }, 7267 }, 7268 7269 /* VEX_LEN_0F3A19 */ 7270 { 7271 { Bad_Opcode }, 7272 { VEX_W_TABLE (VEX_W_0F3A19_L_1) }, 7273 }, 7274 7275 /* VEX_LEN_0F3A20 */ 7276 { 7277 { "%XEvpinsrbY", { XM, Vex, Edb, Ib }, PREFIX_DATA }, 7278 }, 7279 7280 /* VEX_LEN_0F3A21 */ 7281 { 7282 { "%XEvinsertpsY", { XM, Vex, EXd, Ib }, PREFIX_DATA }, 7283 }, 7284 7285 /* VEX_LEN_0F3A22 */ 7286 { 7287 { "%XEvpinsrYK", { XM, Vex, Edq, Ib }, PREFIX_DATA }, 7288 }, 7289 7290 /* VEX_LEN_0F3A30 */ 7291 { 7292 { "kshiftr%BW", { MaskG, MaskR, Ib }, PREFIX_DATA }, 7293 }, 7294 7295 /* VEX_LEN_0F3A31 */ 7296 { 7297 { "kshiftr%DQ", { MaskG, MaskR, Ib }, PREFIX_DATA }, 7298 }, 7299 7300 /* VEX_LEN_0F3A32 */ 7301 { 7302 { "kshiftl%BW", { MaskG, MaskR, Ib }, PREFIX_DATA }, 7303 }, 7304 7305 /* VEX_LEN_0F3A33 */ 7306 { 7307 { "kshiftl%DQ", { MaskG, MaskR, Ib }, PREFIX_DATA }, 7308 }, 7309 7310 /* VEX_LEN_0F3A38 */ 7311 { 7312 { Bad_Opcode }, 7313 { VEX_W_TABLE (VEX_W_0F3A38_L_1) }, 7314 }, 7315 7316 /* VEX_LEN_0F3A39 */ 7317 { 7318 { Bad_Opcode }, 7319 { VEX_W_TABLE (VEX_W_0F3A39_L_1) }, 7320 }, 7321 7322 /* VEX_LEN_0F3A41 */ 7323 { 7324 { "vdppd", { XM, Vex, EXx, Ib }, PREFIX_DATA }, 7325 }, 7326 7327 /* VEX_LEN_0F3A46 */ 7328 { 7329 { Bad_Opcode }, 7330 { VEX_W_TABLE (VEX_W_0F3A46_L_1) }, 7331 }, 7332 7333 /* VEX_LEN_0F3A60 */ 7334 { 7335 { "vpcmpestrm!%LQ", { XM, EXx, Ib }, PREFIX_DATA }, 7336 }, 7337 7338 /* VEX_LEN_0F3A61 */ 7339 { 7340 { "vpcmpestri!%LQ", { XM, EXx, Ib }, PREFIX_DATA }, 7341 }, 7342 7343 /* VEX_LEN_0F3A62 */ 7344 { 7345 { "vpcmpistrm", { XM, EXx, Ib }, PREFIX_DATA }, 7346 }, 7347 7348 /* VEX_LEN_0F3A63 */ 7349 { 7350 { "vpcmpistri", { XM, EXx, Ib }, PREFIX_DATA }, 7351 }, 7352 7353 /* VEX_LEN_0F3ADE_W_0 */ 7354 { 7355 { "vsm3rnds2", { XM, Vex, EXxmm, Ib }, PREFIX_DATA }, 7356 }, 7357 7358 /* VEX_LEN_0F3ADF */ 7359 { 7360 { "vaeskeygenassist", { XM, EXx, Ib }, PREFIX_DATA }, 7361 }, 7362 7363 /* VEX_LEN_0F3AF0 */ 7364 { 7365 { PREFIX_TABLE (PREFIX_VEX_0F3AF0_L_0) }, 7366 }, 7367 7368 /* VEX_LEN_MAP7_F8 */ 7369 { 7370 { VEX_W_TABLE (VEX_W_MAP7_F8_L_0) }, 7371 }, 7372 7373 /* VEX_LEN_XOP_08_85 */ 7374 { 7375 { VEX_W_TABLE (VEX_W_XOP_08_85_L_0) }, 7376 }, 7377 7378 /* VEX_LEN_XOP_08_86 */ 7379 { 7380 { VEX_W_TABLE (VEX_W_XOP_08_86_L_0) }, 7381 }, 7382 7383 /* VEX_LEN_XOP_08_87 */ 7384 { 7385 { VEX_W_TABLE (VEX_W_XOP_08_87_L_0) }, 7386 }, 7387 7388 /* VEX_LEN_XOP_08_8E */ 7389 { 7390 { VEX_W_TABLE (VEX_W_XOP_08_8E_L_0) }, 7391 }, 7392 7393 /* VEX_LEN_XOP_08_8F */ 7394 { 7395 { VEX_W_TABLE (VEX_W_XOP_08_8F_L_0) }, 7396 }, 7397 7398 /* VEX_LEN_XOP_08_95 */ 7399 { 7400 { VEX_W_TABLE (VEX_W_XOP_08_95_L_0) }, 7401 }, 7402 7403 /* VEX_LEN_XOP_08_96 */ 7404 { 7405 { VEX_W_TABLE (VEX_W_XOP_08_96_L_0) }, 7406 }, 7407 7408 /* VEX_LEN_XOP_08_97 */ 7409 { 7410 { VEX_W_TABLE (VEX_W_XOP_08_97_L_0) }, 7411 }, 7412 7413 /* VEX_LEN_XOP_08_9E */ 7414 { 7415 { VEX_W_TABLE (VEX_W_XOP_08_9E_L_0) }, 7416 }, 7417 7418 /* VEX_LEN_XOP_08_9F */ 7419 { 7420 { VEX_W_TABLE (VEX_W_XOP_08_9F_L_0) }, 7421 }, 7422 7423 /* VEX_LEN_XOP_08_A3 */ 7424 { 7425 { "vpperm", { XM, Vex, EXx, XMVexI4 }, 0 }, 7426 }, 7427 7428 /* VEX_LEN_XOP_08_A6 */ 7429 { 7430 { VEX_W_TABLE (VEX_W_XOP_08_A6_L_0) }, 7431 }, 7432 7433 /* VEX_LEN_XOP_08_B6 */ 7434 { 7435 { VEX_W_TABLE (VEX_W_XOP_08_B6_L_0) }, 7436 }, 7437 7438 /* VEX_LEN_XOP_08_C0 */ 7439 { 7440 { VEX_W_TABLE (VEX_W_XOP_08_C0_L_0) }, 7441 }, 7442 7443 /* VEX_LEN_XOP_08_C1 */ 7444 { 7445 { VEX_W_TABLE (VEX_W_XOP_08_C1_L_0) }, 7446 }, 7447 7448 /* VEX_LEN_XOP_08_C2 */ 7449 { 7450 { VEX_W_TABLE (VEX_W_XOP_08_C2_L_0) }, 7451 }, 7452 7453 /* VEX_LEN_XOP_08_C3 */ 7454 { 7455 { VEX_W_TABLE (VEX_W_XOP_08_C3_L_0) }, 7456 }, 7457 7458 /* VEX_LEN_XOP_08_CC */ 7459 { 7460 { VEX_W_TABLE (VEX_W_XOP_08_CC_L_0) }, 7461 }, 7462 7463 /* VEX_LEN_XOP_08_CD */ 7464 { 7465 { VEX_W_TABLE (VEX_W_XOP_08_CD_L_0) }, 7466 }, 7467 7468 /* VEX_LEN_XOP_08_CE */ 7469 { 7470 { VEX_W_TABLE (VEX_W_XOP_08_CE_L_0) }, 7471 }, 7472 7473 /* VEX_LEN_XOP_08_CF */ 7474 { 7475 { VEX_W_TABLE (VEX_W_XOP_08_CF_L_0) }, 7476 }, 7477 7478 /* VEX_LEN_XOP_08_EC */ 7479 { 7480 { VEX_W_TABLE (VEX_W_XOP_08_EC_L_0) }, 7481 }, 7482 7483 /* VEX_LEN_XOP_08_ED */ 7484 { 7485 { VEX_W_TABLE (VEX_W_XOP_08_ED_L_0) }, 7486 }, 7487 7488 /* VEX_LEN_XOP_08_EE */ 7489 { 7490 { VEX_W_TABLE (VEX_W_XOP_08_EE_L_0) }, 7491 }, 7492 7493 /* VEX_LEN_XOP_08_EF */ 7494 { 7495 { VEX_W_TABLE (VEX_W_XOP_08_EF_L_0) }, 7496 }, 7497 7498 /* VEX_LEN_XOP_09_01 */ 7499 { 7500 { REG_TABLE (REG_XOP_09_01_L_0) }, 7501 }, 7502 7503 /* VEX_LEN_XOP_09_02 */ 7504 { 7505 { REG_TABLE (REG_XOP_09_02_L_0) }, 7506 }, 7507 7508 /* VEX_LEN_XOP_09_12 */ 7509 { 7510 { REG_TABLE (REG_XOP_09_12_L_0) }, 7511 }, 7512 7513 /* VEX_LEN_XOP_09_82_W_0 */ 7514 { 7515 { "vfrczss", { XM, EXd }, 0 }, 7516 }, 7517 7518 /* VEX_LEN_XOP_09_83_W_0 */ 7519 { 7520 { "vfrczsd", { XM, EXq }, 0 }, 7521 }, 7522 7523 /* VEX_LEN_XOP_09_90 */ 7524 { 7525 { "vprotb", { XM, EXx, VexW }, 0 }, 7526 }, 7527 7528 /* VEX_LEN_XOP_09_91 */ 7529 { 7530 { "vprotw", { XM, EXx, VexW }, 0 }, 7531 }, 7532 7533 /* VEX_LEN_XOP_09_92 */ 7534 { 7535 { "vprotd", { XM, EXx, VexW }, 0 }, 7536 }, 7537 7538 /* VEX_LEN_XOP_09_93 */ 7539 { 7540 { "vprotq", { XM, EXx, VexW }, 0 }, 7541 }, 7542 7543 /* VEX_LEN_XOP_09_94 */ 7544 { 7545 { "vpshlb", { XM, EXx, VexW }, 0 }, 7546 }, 7547 7548 /* VEX_LEN_XOP_09_95 */ 7549 { 7550 { "vpshlw", { XM, EXx, VexW }, 0 }, 7551 }, 7552 7553 /* VEX_LEN_XOP_09_96 */ 7554 { 7555 { "vpshld", { XM, EXx, VexW }, 0 }, 7556 }, 7557 7558 /* VEX_LEN_XOP_09_97 */ 7559 { 7560 { "vpshlq", { XM, EXx, VexW }, 0 }, 7561 }, 7562 7563 /* VEX_LEN_XOP_09_98 */ 7564 { 7565 { "vpshab", { XM, EXx, VexW }, 0 }, 7566 }, 7567 7568 /* VEX_LEN_XOP_09_99 */ 7569 { 7570 { "vpshaw", { XM, EXx, VexW }, 0 }, 7571 }, 7572 7573 /* VEX_LEN_XOP_09_9A */ 7574 { 7575 { "vpshad", { XM, EXx, VexW }, 0 }, 7576 }, 7577 7578 /* VEX_LEN_XOP_09_9B */ 7579 { 7580 { "vpshaq", { XM, EXx, VexW }, 0 }, 7581 }, 7582 7583 /* VEX_LEN_XOP_09_C1 */ 7584 { 7585 { VEX_W_TABLE (VEX_W_XOP_09_C1_L_0) }, 7586 }, 7587 7588 /* VEX_LEN_XOP_09_C2 */ 7589 { 7590 { VEX_W_TABLE (VEX_W_XOP_09_C2_L_0) }, 7591 }, 7592 7593 /* VEX_LEN_XOP_09_C3 */ 7594 { 7595 { VEX_W_TABLE (VEX_W_XOP_09_C3_L_0) }, 7596 }, 7597 7598 /* VEX_LEN_XOP_09_C6 */ 7599 { 7600 { VEX_W_TABLE (VEX_W_XOP_09_C6_L_0) }, 7601 }, 7602 7603 /* VEX_LEN_XOP_09_C7 */ 7604 { 7605 { VEX_W_TABLE (VEX_W_XOP_09_C7_L_0) }, 7606 }, 7607 7608 /* VEX_LEN_XOP_09_CB */ 7609 { 7610 { VEX_W_TABLE (VEX_W_XOP_09_CB_L_0) }, 7611 }, 7612 7613 /* VEX_LEN_XOP_09_D1 */ 7614 { 7615 { VEX_W_TABLE (VEX_W_XOP_09_D1_L_0) }, 7616 }, 7617 7618 /* VEX_LEN_XOP_09_D2 */ 7619 { 7620 { VEX_W_TABLE (VEX_W_XOP_09_D2_L_0) }, 7621 }, 7622 7623 /* VEX_LEN_XOP_09_D3 */ 7624 { 7625 { VEX_W_TABLE (VEX_W_XOP_09_D3_L_0) }, 7626 }, 7627 7628 /* VEX_LEN_XOP_09_D6 */ 7629 { 7630 { VEX_W_TABLE (VEX_W_XOP_09_D6_L_0) }, 7631 }, 7632 7633 /* VEX_LEN_XOP_09_D7 */ 7634 { 7635 { VEX_W_TABLE (VEX_W_XOP_09_D7_L_0) }, 7636 }, 7637 7638 /* VEX_LEN_XOP_09_DB */ 7639 { 7640 { VEX_W_TABLE (VEX_W_XOP_09_DB_L_0) }, 7641 }, 7642 7643 /* VEX_LEN_XOP_09_E1 */ 7644 { 7645 { VEX_W_TABLE (VEX_W_XOP_09_E1_L_0) }, 7646 }, 7647 7648 /* VEX_LEN_XOP_09_E2 */ 7649 { 7650 { VEX_W_TABLE (VEX_W_XOP_09_E2_L_0) }, 7651 }, 7652 7653 /* VEX_LEN_XOP_09_E3 */ 7654 { 7655 { VEX_W_TABLE (VEX_W_XOP_09_E3_L_0) }, 7656 }, 7657 7658 /* VEX_LEN_XOP_0A_12 */ 7659 { 7660 { REG_TABLE (REG_XOP_0A_12_L_0) }, 7661 }, 7662 }; 7663 7664 #include "i386-dis-evex-len.h" 7665 7666 static const struct dis386 vex_w_table[][2] = { 7667 { 7668 /* VEX_W_0F41_L_1_M_1 */ 7669 { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_W_0) }, 7670 { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_W_1) }, 7671 }, 7672 { 7673 /* VEX_W_0F42_L_1_M_1 */ 7674 { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_W_0) }, 7675 { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_W_1) }, 7676 }, 7677 { 7678 /* VEX_W_0F44_L_0_M_1 */ 7679 { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_W_0) }, 7680 { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_W_1) }, 7681 }, 7682 { 7683 /* VEX_W_0F45_L_1_M_1 */ 7684 { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_W_0) }, 7685 { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_W_1) }, 7686 }, 7687 { 7688 /* VEX_W_0F46_L_1_M_1 */ 7689 { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_W_0) }, 7690 { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_W_1) }, 7691 }, 7692 { 7693 /* VEX_W_0F47_L_1_M_1 */ 7694 { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_W_0) }, 7695 { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_W_1) }, 7696 }, 7697 { 7698 /* VEX_W_0F4A_L_1_M_1 */ 7699 { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_W_0) }, 7700 { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_W_1) }, 7701 }, 7702 { 7703 /* VEX_W_0F4B_L_1_M_1 */ 7704 { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_W_0) }, 7705 { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_W_1) }, 7706 }, 7707 { 7708 /* VEX_W_0F90_L_0 */ 7709 { PREFIX_TABLE (PREFIX_VEX_0F90_L_0_W_0) }, 7710 { PREFIX_TABLE (PREFIX_VEX_0F90_L_0_W_1) }, 7711 }, 7712 { 7713 /* VEX_W_0F91_L_0_M_0 */ 7714 { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_W_0) }, 7715 { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_W_1) }, 7716 }, 7717 { 7718 /* VEX_W_0F92_L_0_M_1 */ 7719 { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_W_0) }, 7720 { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_W_1) }, 7721 }, 7722 { 7723 /* VEX_W_0F93_L_0_M_1 */ 7724 { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_W_0) }, 7725 { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_W_1) }, 7726 }, 7727 { 7728 /* VEX_W_0F98_L_0_M_1 */ 7729 { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_W_0) }, 7730 { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_W_1) }, 7731 }, 7732 { 7733 /* VEX_W_0F99_L_0_M_1 */ 7734 { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_W_0) }, 7735 { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_W_1) }, 7736 }, 7737 { 7738 /* VEX_W_0F380C */ 7739 { "%XEvpermilps", { XM, Vex, EXx }, PREFIX_DATA }, 7740 }, 7741 { 7742 /* VEX_W_0F380D */ 7743 { "vpermilpd", { XM, Vex, EXx }, PREFIX_DATA }, 7744 }, 7745 { 7746 /* VEX_W_0F380E */ 7747 { "vtestps", { XM, EXx }, PREFIX_DATA }, 7748 }, 7749 { 7750 /* VEX_W_0F380F */ 7751 { "vtestpd", { XM, EXx }, PREFIX_DATA }, 7752 }, 7753 { 7754 /* VEX_W_0F3813 */ 7755 { "vcvtph2ps", { XM, EXxmmq }, PREFIX_DATA }, 7756 }, 7757 { 7758 /* VEX_W_0F3816_L_1 */ 7759 { "vpermps", { XM, Vex, EXx }, PREFIX_DATA }, 7760 }, 7761 { 7762 /* VEX_W_0F3818 */ 7763 { "%XEvbroadcastss", { XM, EXd }, PREFIX_DATA }, 7764 }, 7765 { 7766 /* VEX_W_0F3819_L_1 */ 7767 { "vbroadcastsd", { XM, EXq }, PREFIX_DATA }, 7768 }, 7769 { 7770 /* VEX_W_0F381A_L_1 */ 7771 { "vbroadcastf128", { XM, Mxmm }, PREFIX_DATA }, 7772 }, 7773 { 7774 /* VEX_W_0F382C */ 7775 { "vmaskmovps", { XM, Vex, Mx }, PREFIX_DATA }, 7776 }, 7777 { 7778 /* VEX_W_0F382D */ 7779 { "vmaskmovpd", { XM, Vex, Mx }, PREFIX_DATA }, 7780 }, 7781 { 7782 /* VEX_W_0F382E */ 7783 { "vmaskmovps", { Mx, Vex, XM }, PREFIX_DATA }, 7784 }, 7785 { 7786 /* VEX_W_0F382F */ 7787 { "vmaskmovpd", { Mx, Vex, XM }, PREFIX_DATA }, 7788 }, 7789 { 7790 /* VEX_W_0F3836 */ 7791 { "vpermd", { XM, Vex, EXx }, PREFIX_DATA }, 7792 }, 7793 { 7794 /* VEX_W_0F3846 */ 7795 { "vpsravd", { XM, Vex, EXx }, PREFIX_DATA }, 7796 }, 7797 { 7798 /* VEX_W_0F3849_X86_64_L_0 */ 7799 { MOD_TABLE (MOD_VEX_0F3849_X86_64_L_0_W_0) }, 7800 }, 7801 { 7802 /* VEX_W_0F384B_X86_64_L_0 */ 7803 { PREFIX_TABLE (PREFIX_VEX_0F384B_X86_64_L_0_W_0) }, 7804 }, 7805 { 7806 /* VEX_W_0F3850 */ 7807 { PREFIX_TABLE (PREFIX_VEX_0F3850_W_0) }, 7808 }, 7809 { 7810 /* VEX_W_0F3851 */ 7811 { PREFIX_TABLE (PREFIX_VEX_0F3851_W_0) }, 7812 }, 7813 { 7814 /* VEX_W_0F3852 */ 7815 { "%XVvpdpwssd", { XM, Vex, EXx }, PREFIX_DATA }, 7816 }, 7817 { 7818 /* VEX_W_0F3853 */ 7819 { "%XVvpdpwssds", { XM, Vex, EXx }, PREFIX_DATA }, 7820 }, 7821 { 7822 /* VEX_W_0F3858 */ 7823 { "%XEvpbroadcastd", { XM, EXd }, PREFIX_DATA }, 7824 }, 7825 { 7826 /* VEX_W_0F3859 */ 7827 { "vpbroadcastq", { XM, EXq }, PREFIX_DATA }, 7828 }, 7829 { 7830 /* VEX_W_0F385A_L_0 */ 7831 { "vbroadcasti128", { XM, Mxmm }, PREFIX_DATA }, 7832 }, 7833 { 7834 /* VEX_W_0F385C_X86_64_L_0 */ 7835 { PREFIX_TABLE (PREFIX_VEX_0F385C_X86_64_L_0_W_0) }, 7836 }, 7837 { 7838 /* VEX_W_0F385E_X86_64_L_0 */ 7839 { PREFIX_TABLE (PREFIX_VEX_0F385E_X86_64_L_0_W_0) }, 7840 }, 7841 { 7842 /* VEX_W_0F386C_X86_64_L_0 */ 7843 { PREFIX_TABLE (PREFIX_VEX_0F386C_X86_64_L_0_W_0) }, 7844 }, 7845 { 7846 /* VEX_W_0F3872_P_1 */ 7847 { "%XVvcvtneps2bf16%XY", { XMM, EXx }, 0 }, 7848 }, 7849 { 7850 /* VEX_W_0F3878 */ 7851 { "%XEvpbroadcastb", { XM, EXb }, PREFIX_DATA }, 7852 }, 7853 { 7854 /* VEX_W_0F3879 */ 7855 { "%XEvpbroadcastw", { XM, EXw }, PREFIX_DATA }, 7856 }, 7857 { 7858 /* VEX_W_0F38B0 */ 7859 { PREFIX_TABLE (PREFIX_VEX_0F38B0_W_0) }, 7860 }, 7861 { 7862 /* VEX_W_0F38B1 */ 7863 { PREFIX_TABLE (PREFIX_VEX_0F38B1_W_0) }, 7864 }, 7865 { 7866 /* VEX_W_0F38B4 */ 7867 { Bad_Opcode }, 7868 { "%XVvpmadd52luq", { XM, Vex, EXx }, PREFIX_DATA }, 7869 }, 7870 { 7871 /* VEX_W_0F38B5 */ 7872 { Bad_Opcode }, 7873 { "%XVvpmadd52huq", { XM, Vex, EXx }, PREFIX_DATA }, 7874 }, 7875 { 7876 /* VEX_W_0F38CB_P_3 */ 7877 { VEX_LEN_TABLE (VEX_LEN_0F38CB_P_3_W_0) }, 7878 }, 7879 { 7880 /* VEX_W_0F38CC_P_3 */ 7881 { VEX_LEN_TABLE (VEX_LEN_0F38CC_P_3_W_0) }, 7882 }, 7883 { 7884 /* VEX_W_0F38CD_P_3 */ 7885 { VEX_LEN_TABLE (VEX_LEN_0F38CD_P_3_W_0) }, 7886 }, 7887 { 7888 /* VEX_W_0F38CF */ 7889 { "%XEvgf2p8mulb", { XM, Vex, EXx }, PREFIX_DATA }, 7890 }, 7891 { 7892 /* VEX_W_0F38D2 */ 7893 { PREFIX_TABLE (PREFIX_VEX_0F38D2_W_0) }, 7894 }, 7895 { 7896 /* VEX_W_0F38D3 */ 7897 { PREFIX_TABLE (PREFIX_VEX_0F38D3_W_0) }, 7898 }, 7899 { 7900 /* VEX_W_0F38DA */ 7901 { PREFIX_TABLE (PREFIX_VEX_0F38DA_W_0) }, 7902 }, 7903 { 7904 /* VEX_W_0F3A00_L_1 */ 7905 { Bad_Opcode }, 7906 { "%XEvpermq", { XM, EXx, Ib }, PREFIX_DATA }, 7907 }, 7908 { 7909 /* VEX_W_0F3A01_L_1 */ 7910 { Bad_Opcode }, 7911 { "%XEvpermpd", { XM, EXx, Ib }, PREFIX_DATA }, 7912 }, 7913 { 7914 /* VEX_W_0F3A02 */ 7915 { "vpblendd", { XM, Vex, EXx, Ib }, PREFIX_DATA }, 7916 }, 7917 { 7918 /* VEX_W_0F3A04 */ 7919 { "%XEvpermilps", { XM, EXx, Ib }, PREFIX_DATA }, 7920 }, 7921 { 7922 /* VEX_W_0F3A05 */ 7923 { "vpermilpd", { XM, EXx, Ib }, PREFIX_DATA }, 7924 }, 7925 { 7926 /* VEX_W_0F3A06_L_1 */ 7927 { "vperm2f128", { XM, Vex, EXx, Ib }, PREFIX_DATA }, 7928 }, 7929 { 7930 /* VEX_W_0F3A18_L_1 */ 7931 { "vinsertf128", { XM, Vex, EXxmm, Ib }, PREFIX_DATA }, 7932 }, 7933 { 7934 /* VEX_W_0F3A19_L_1 */ 7935 { "vextractf128", { EXxmm, XM, Ib }, PREFIX_DATA }, 7936 }, 7937 { 7938 /* VEX_W_0F3A1D */ 7939 { "%XEvcvtps2ph", { EXxmmq, XM, EXxEVexS, Ib }, PREFIX_DATA }, 7940 }, 7941 { 7942 /* VEX_W_0F3A38_L_1 */ 7943 { "vinserti128", { XM, Vex, EXxmm, Ib }, PREFIX_DATA }, 7944 }, 7945 { 7946 /* VEX_W_0F3A39_L_1 */ 7947 { "vextracti128", { EXxmm, XM, Ib }, PREFIX_DATA }, 7948 }, 7949 { 7950 /* VEX_W_0F3A46_L_1 */ 7951 { "vperm2i128", { XM, Vex, EXx, Ib }, PREFIX_DATA }, 7952 }, 7953 { 7954 /* VEX_W_0F3A4A */ 7955 { "vblendvps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA }, 7956 }, 7957 { 7958 /* VEX_W_0F3A4B */ 7959 { "vblendvpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA }, 7960 }, 7961 { 7962 /* VEX_W_0F3A4C */ 7963 { "vpblendvb", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA }, 7964 }, 7965 { 7966 /* VEX_W_0F3ACE */ 7967 { Bad_Opcode }, 7968 { "%XEvgf2p8affineqb", { XM, Vex, EXx, Ib }, PREFIX_DATA }, 7969 }, 7970 { 7971 /* VEX_W_0F3ACF */ 7972 { Bad_Opcode }, 7973 { "%XEvgf2p8affineinvqb", { XM, Vex, EXx, Ib }, PREFIX_DATA }, 7974 }, 7975 { 7976 /* VEX_W_0F3ADE */ 7977 { VEX_LEN_TABLE (VEX_LEN_0F3ADE_W_0) }, 7978 }, 7979 { 7980 /* VEX_W_MAP7_F8_L_0 */ 7981 { REG_TABLE (REG_VEX_MAP7_F8_L_0_W_0) }, 7982 }, 7983 /* VEX_W_XOP_08_85_L_0 */ 7984 { 7985 { "vpmacssww", { XM, Vex, EXx, XMVexI4 }, 0 }, 7986 }, 7987 /* VEX_W_XOP_08_86_L_0 */ 7988 { 7989 { "vpmacsswd", { XM, Vex, EXx, XMVexI4 }, 0 }, 7990 }, 7991 /* VEX_W_XOP_08_87_L_0 */ 7992 { 7993 { "vpmacssdql", { XM, Vex, EXx, XMVexI4 }, 0 }, 7994 }, 7995 /* VEX_W_XOP_08_8E_L_0 */ 7996 { 7997 { "vpmacssdd", { XM, Vex, EXx, XMVexI4 }, 0 }, 7998 }, 7999 /* VEX_W_XOP_08_8F_L_0 */ 8000 { 8001 { "vpmacssdqh", { XM, Vex, EXx, XMVexI4 }, 0 }, 8002 }, 8003 /* VEX_W_XOP_08_95_L_0 */ 8004 { 8005 { "vpmacsww", { XM, Vex, EXx, XMVexI4 }, 0 }, 8006 }, 8007 /* VEX_W_XOP_08_96_L_0 */ 8008 { 8009 { "vpmacswd", { XM, Vex, EXx, XMVexI4 }, 0 }, 8010 }, 8011 /* VEX_W_XOP_08_97_L_0 */ 8012 { 8013 { "vpmacsdql", { XM, Vex, EXx, XMVexI4 }, 0 }, 8014 }, 8015 /* VEX_W_XOP_08_9E_L_0 */ 8016 { 8017 { "vpmacsdd", { XM, Vex, EXx, XMVexI4 }, 0 }, 8018 }, 8019 /* VEX_W_XOP_08_9F_L_0 */ 8020 { 8021 { "vpmacsdqh", { XM, Vex, EXx, XMVexI4 }, 0 }, 8022 }, 8023 /* VEX_W_XOP_08_A6_L_0 */ 8024 { 8025 { "vpmadcsswd", { XM, Vex, EXx, XMVexI4 }, 0 }, 8026 }, 8027 /* VEX_W_XOP_08_B6_L_0 */ 8028 { 8029 { "vpmadcswd", { XM, Vex, EXx, XMVexI4 }, 0 }, 8030 }, 8031 /* VEX_W_XOP_08_C0_L_0 */ 8032 { 8033 { "vprotb", { XM, EXx, Ib }, 0 }, 8034 }, 8035 /* VEX_W_XOP_08_C1_L_0 */ 8036 { 8037 { "vprotw", { XM, EXx, Ib }, 0 }, 8038 }, 8039 /* VEX_W_XOP_08_C2_L_0 */ 8040 { 8041 { "vprotd", { XM, EXx, Ib }, 0 }, 8042 }, 8043 /* VEX_W_XOP_08_C3_L_0 */ 8044 { 8045 { "vprotq", { XM, EXx, Ib }, 0 }, 8046 }, 8047 /* VEX_W_XOP_08_CC_L_0 */ 8048 { 8049 { "vpcomb", { XM, Vex, EXx, VPCOM }, 0 }, 8050 }, 8051 /* VEX_W_XOP_08_CD_L_0 */ 8052 { 8053 { "vpcomw", { XM, Vex, EXx, VPCOM }, 0 }, 8054 }, 8055 /* VEX_W_XOP_08_CE_L_0 */ 8056 { 8057 { "vpcomd", { XM, Vex, EXx, VPCOM }, 0 }, 8058 }, 8059 /* VEX_W_XOP_08_CF_L_0 */ 8060 { 8061 { "vpcomq", { XM, Vex, EXx, VPCOM }, 0 }, 8062 }, 8063 /* VEX_W_XOP_08_EC_L_0 */ 8064 { 8065 { "vpcomub", { XM, Vex, EXx, VPCOM }, 0 }, 8066 }, 8067 /* VEX_W_XOP_08_ED_L_0 */ 8068 { 8069 { "vpcomuw", { XM, Vex, EXx, VPCOM }, 0 }, 8070 }, 8071 /* VEX_W_XOP_08_EE_L_0 */ 8072 { 8073 { "vpcomud", { XM, Vex, EXx, VPCOM }, 0 }, 8074 }, 8075 /* VEX_W_XOP_08_EF_L_0 */ 8076 { 8077 { "vpcomuq", { XM, Vex, EXx, VPCOM }, 0 }, 8078 }, 8079 /* VEX_W_XOP_09_80 */ 8080 { 8081 { "vfrczps", { XM, EXx }, 0 }, 8082 }, 8083 /* VEX_W_XOP_09_81 */ 8084 { 8085 { "vfrczpd", { XM, EXx }, 0 }, 8086 }, 8087 /* VEX_W_XOP_09_82 */ 8088 { 8089 { VEX_LEN_TABLE (VEX_LEN_XOP_09_82_W_0) }, 8090 }, 8091 /* VEX_W_XOP_09_83 */ 8092 { 8093 { VEX_LEN_TABLE (VEX_LEN_XOP_09_83_W_0) }, 8094 }, 8095 /* VEX_W_XOP_09_C1_L_0 */ 8096 { 8097 { "vphaddbw", { XM, EXxmm }, 0 }, 8098 }, 8099 /* VEX_W_XOP_09_C2_L_0 */ 8100 { 8101 { "vphaddbd", { XM, EXxmm }, 0 }, 8102 }, 8103 /* VEX_W_XOP_09_C3_L_0 */ 8104 { 8105 { "vphaddbq", { XM, EXxmm }, 0 }, 8106 }, 8107 /* VEX_W_XOP_09_C6_L_0 */ 8108 { 8109 { "vphaddwd", { XM, EXxmm }, 0 }, 8110 }, 8111 /* VEX_W_XOP_09_C7_L_0 */ 8112 { 8113 { "vphaddwq", { XM, EXxmm }, 0 }, 8114 }, 8115 /* VEX_W_XOP_09_CB_L_0 */ 8116 { 8117 { "vphadddq", { XM, EXxmm }, 0 }, 8118 }, 8119 /* VEX_W_XOP_09_D1_L_0 */ 8120 { 8121 { "vphaddubw", { XM, EXxmm }, 0 }, 8122 }, 8123 /* VEX_W_XOP_09_D2_L_0 */ 8124 { 8125 { "vphaddubd", { XM, EXxmm }, 0 }, 8126 }, 8127 /* VEX_W_XOP_09_D3_L_0 */ 8128 { 8129 { "vphaddubq", { XM, EXxmm }, 0 }, 8130 }, 8131 /* VEX_W_XOP_09_D6_L_0 */ 8132 { 8133 { "vphadduwd", { XM, EXxmm }, 0 }, 8134 }, 8135 /* VEX_W_XOP_09_D7_L_0 */ 8136 { 8137 { "vphadduwq", { XM, EXxmm }, 0 }, 8138 }, 8139 /* VEX_W_XOP_09_DB_L_0 */ 8140 { 8141 { "vphaddudq", { XM, EXxmm }, 0 }, 8142 }, 8143 /* VEX_W_XOP_09_E1_L_0 */ 8144 { 8145 { "vphsubbw", { XM, EXxmm }, 0 }, 8146 }, 8147 /* VEX_W_XOP_09_E2_L_0 */ 8148 { 8149 { "vphsubwd", { XM, EXxmm }, 0 }, 8150 }, 8151 /* VEX_W_XOP_09_E3_L_0 */ 8152 { 8153 { "vphsubdq", { XM, EXxmm }, 0 }, 8154 }, 8155 8156 #include "i386-dis-evex-w.h" 8157 }; 8158 8159 static const struct dis386 mod_table[][2] = { 8160 { 8161 /* MOD_62_32BIT */ 8162 { "bound{S|}", { Gv, Ma }, 0 }, 8163 { EVEX_TABLE () }, 8164 }, 8165 { 8166 /* MOD_C4_32BIT */ 8167 { "lesS", { Gv, Mp }, 0 }, 8168 { VEX_C4_TABLE () }, 8169 }, 8170 { 8171 /* MOD_C5_32BIT */ 8172 { "ldsS", { Gv, Mp }, 0 }, 8173 { VEX_C5_TABLE () }, 8174 }, 8175 { 8176 /* MOD_0F01_REG_0 */ 8177 { X86_64_TABLE (X86_64_0F01_REG_0) }, 8178 { RM_TABLE (RM_0F01_REG_0) }, 8179 }, 8180 { 8181 /* MOD_0F01_REG_1 */ 8182 { X86_64_TABLE (X86_64_0F01_REG_1) }, 8183 { RM_TABLE (RM_0F01_REG_1) }, 8184 }, 8185 { 8186 /* MOD_0F01_REG_2 */ 8187 { X86_64_TABLE (X86_64_0F01_REG_2) }, 8188 { RM_TABLE (RM_0F01_REG_2) }, 8189 }, 8190 { 8191 /* MOD_0F01_REG_3 */ 8192 { X86_64_TABLE (X86_64_0F01_REG_3) }, 8193 { RM_TABLE (RM_0F01_REG_3) }, 8194 }, 8195 { 8196 /* MOD_0F01_REG_5 */ 8197 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_0) }, 8198 { RM_TABLE (RM_0F01_REG_5_MOD_3) }, 8199 }, 8200 { 8201 /* MOD_0F01_REG_7 */ 8202 { "invlpg", { Mb }, 0 }, 8203 { RM_TABLE (RM_0F01_REG_7_MOD_3) }, 8204 }, 8205 { 8206 /* MOD_0F12_PREFIX_0 */ 8207 { "%XEVmovlpYX", { XM, Vex, EXq }, 0 }, 8208 { "%XEVmovhlpY%XS", { XM, Vex, EXq }, 0 }, 8209 }, 8210 { 8211 /* MOD_0F16_PREFIX_0 */ 8212 { "%XEVmovhpYX", { XM, Vex, EXq }, 0 }, 8213 { "%XEVmovlhpY%XS", { XM, Vex, EXq }, 0 }, 8214 }, 8215 { 8216 /* MOD_0F18_REG_0 */ 8217 { "prefetchnta", { Mb }, 0 }, 8218 { "nopQ", { Ev }, 0 }, 8219 }, 8220 { 8221 /* MOD_0F18_REG_1 */ 8222 { "prefetcht0", { Mb }, 0 }, 8223 { "nopQ", { Ev }, 0 }, 8224 }, 8225 { 8226 /* MOD_0F18_REG_2 */ 8227 { "prefetcht1", { Mb }, 0 }, 8228 { "nopQ", { Ev }, 0 }, 8229 }, 8230 { 8231 /* MOD_0F18_REG_3 */ 8232 { "prefetcht2", { Mb }, 0 }, 8233 { "nopQ", { Ev }, 0 }, 8234 }, 8235 { 8236 /* MOD_0F18_REG_6 */ 8237 { X86_64_TABLE (X86_64_0F18_REG_6_MOD_0) }, 8238 { "nopQ", { Ev }, 0 }, 8239 }, 8240 { 8241 /* MOD_0F18_REG_7 */ 8242 { X86_64_TABLE (X86_64_0F18_REG_7_MOD_0) }, 8243 { "nopQ", { Ev }, 0 }, 8244 }, 8245 { 8246 /* MOD_0F1A_PREFIX_0 */ 8247 { "bndldx", { Gbnd, Mv_bnd }, 0 }, 8248 { "nopQ", { Ev }, 0 }, 8249 }, 8250 { 8251 /* MOD_0F1B_PREFIX_0 */ 8252 { "bndstx", { Mv_bnd, Gbnd }, 0 }, 8253 { "nopQ", { Ev }, 0 }, 8254 }, 8255 { 8256 /* MOD_0F1B_PREFIX_1 */ 8257 { "bndmk", { Gbnd, Mv_bnd }, 0 }, 8258 { "nopQ", { Ev }, PREFIX_IGNORED }, 8259 }, 8260 { 8261 /* MOD_0F1C_PREFIX_0 */ 8262 { REG_TABLE (REG_0F1C_P_0_MOD_0) }, 8263 { "nopQ", { Ev }, 0 }, 8264 }, 8265 { 8266 /* MOD_0F1E_PREFIX_1 */ 8267 { "nopQ", { Ev }, PREFIX_IGNORED }, 8268 { REG_TABLE (REG_0F1E_P_1_MOD_3) }, 8269 }, 8270 { 8271 /* MOD_0FAE_REG_0 */ 8272 { "fxsave", { FXSAVE }, 0 }, 8273 { PREFIX_TABLE (PREFIX_0FAE_REG_0_MOD_3) }, 8274 }, 8275 { 8276 /* MOD_0FAE_REG_1 */ 8277 { "fxrstor", { FXSAVE }, 0 }, 8278 { PREFIX_TABLE (PREFIX_0FAE_REG_1_MOD_3) }, 8279 }, 8280 { 8281 /* MOD_0FAE_REG_2 */ 8282 { "ldmxcsr", { Md }, 0 }, 8283 { PREFIX_TABLE (PREFIX_0FAE_REG_2_MOD_3) }, 8284 }, 8285 { 8286 /* MOD_0FAE_REG_3 */ 8287 { "stmxcsr", { Md }, 0 }, 8288 { PREFIX_TABLE (PREFIX_0FAE_REG_3_MOD_3) }, 8289 }, 8290 { 8291 /* MOD_0FAE_REG_4 */ 8292 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_0) }, 8293 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_3) }, 8294 }, 8295 { 8296 /* MOD_0FAE_REG_5 */ 8297 { "xrstor", { FXSAVE }, PREFIX_OPCODE | PREFIX_REX2_ILLEGAL }, 8298 { PREFIX_TABLE (PREFIX_0FAE_REG_5_MOD_3) }, 8299 }, 8300 { 8301 /* MOD_0FAE_REG_6 */ 8302 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_0) }, 8303 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_3) }, 8304 }, 8305 { 8306 /* MOD_0FAE_REG_7 */ 8307 { PREFIX_TABLE (PREFIX_0FAE_REG_7_MOD_0) }, 8308 { RM_TABLE (RM_0FAE_REG_7_MOD_3) }, 8309 }, 8310 { 8311 /* MOD_0FC7_REG_6 */ 8312 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_0) }, 8313 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_3) } 8314 }, 8315 { 8316 /* MOD_0FC7_REG_7 */ 8317 { "vmptrst", { Mq }, 0 }, 8318 { PREFIX_TABLE (PREFIX_0FC7_REG_7_MOD_3) } 8319 }, 8320 { 8321 /* MOD_0F38DC_PREFIX_1 */ 8322 { "aesenc128kl", { XM, M }, 0 }, 8323 { "loadiwkey", { XM, EXx }, 0 }, 8324 }, 8325 /* MOD_0F38F8 */ 8326 { 8327 { PREFIX_TABLE (PREFIX_0F38F8_M_0) }, 8328 { X86_64_TABLE (X86_64_0F38F8_M_1) }, 8329 }, 8330 { 8331 /* MOD_VEX_0F3849_X86_64_L_0_W_0 */ 8332 { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_0) }, 8333 { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_1) }, 8334 }, 8335 8336 #include "i386-dis-evex-mod.h" 8337 }; 8338 8339 static const struct dis386 rm_table[][8] = { 8340 { 8341 /* RM_C6_REG_7 */ 8342 { "xabort", { Skip_MODRM, Ib }, 0 }, 8343 }, 8344 { 8345 /* RM_C7_REG_7 */ 8346 { "xbeginT", { Skip_MODRM, Jdqw }, 0 }, 8347 }, 8348 { 8349 /* RM_0F01_REG_0 */ 8350 { "enclv", { Skip_MODRM }, 0 }, 8351 { "vmcall", { Skip_MODRM }, 0 }, 8352 { "vmlaunch", { Skip_MODRM }, 0 }, 8353 { "vmresume", { Skip_MODRM }, 0 }, 8354 { "vmxoff", { Skip_MODRM }, 0 }, 8355 { "pconfig", { Skip_MODRM }, 0 }, 8356 { PREFIX_TABLE (PREFIX_0F01_REG_0_MOD_3_RM_6) }, 8357 { PREFIX_TABLE (PREFIX_0F01_REG_0_MOD_3_RM_7) }, 8358 }, 8359 { 8360 /* RM_0F01_REG_1 */ 8361 { "monitor", { { OP_Monitor, 0 } }, 0 }, 8362 { "mwait", { { OP_Mwait, 0 } }, 0 }, 8363 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_2) }, 8364 { "stac", { Skip_MODRM }, 0 }, 8365 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_4) }, 8366 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_5) }, 8367 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_6) }, 8368 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_7) }, 8369 }, 8370 { 8371 /* RM_0F01_REG_2 */ 8372 { "xgetbv", { Skip_MODRM }, 0 }, 8373 { "xsetbv", { Skip_MODRM }, 0 }, 8374 { Bad_Opcode }, 8375 { Bad_Opcode }, 8376 { "vmfunc", { Skip_MODRM }, 0 }, 8377 { "xend", { Skip_MODRM }, 0 }, 8378 { "xtest", { Skip_MODRM }, 0 }, 8379 { "enclu", { Skip_MODRM }, 0 }, 8380 }, 8381 { 8382 /* RM_0F01_REG_3 */ 8383 { "vmrun", { Skip_MODRM }, 0 }, 8384 { PREFIX_TABLE (PREFIX_0F01_REG_3_RM_1) }, 8385 { "vmload", { Skip_MODRM }, 0 }, 8386 { "vmsave", { Skip_MODRM }, 0 }, 8387 { "stgi", { Skip_MODRM }, 0 }, 8388 { "clgi", { Skip_MODRM }, 0 }, 8389 { "skinit", { Skip_MODRM }, 0 }, 8390 { "invlpga", { Skip_MODRM }, 0 }, 8391 }, 8392 { 8393 /* RM_0F01_REG_5_MOD_3 */ 8394 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_0) }, 8395 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_1) }, 8396 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_2) }, 8397 { Bad_Opcode }, 8398 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_4) }, 8399 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_5) }, 8400 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_6) }, 8401 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_7) }, 8402 }, 8403 { 8404 /* RM_0F01_REG_7_MOD_3 */ 8405 { "swapgs", { Skip_MODRM }, 0 }, 8406 { "rdtscp", { Skip_MODRM }, 0 }, 8407 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_2) }, 8408 { "mwaitx", { { OP_Mwait, eBX_reg } }, PREFIX_OPCODE }, 8409 { "clzero", { Skip_MODRM }, 0 }, 8410 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_5) }, 8411 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_6) }, 8412 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_7) }, 8413 }, 8414 { 8415 /* RM_0F1E_P_1_MOD_3_REG_7 */ 8416 { "nopQ", { Ev }, PREFIX_IGNORED }, 8417 { "nopQ", { Ev }, PREFIX_IGNORED }, 8418 { "endbr64", { Skip_MODRM }, 0 }, 8419 { "endbr32", { Skip_MODRM }, 0 }, 8420 { "nopQ", { Ev }, PREFIX_IGNORED }, 8421 { "nopQ", { Ev }, PREFIX_IGNORED }, 8422 { "nopQ", { Ev }, PREFIX_IGNORED }, 8423 { "nopQ", { Ev }, PREFIX_IGNORED }, 8424 }, 8425 { 8426 /* RM_0FAE_REG_6_MOD_3 */ 8427 { "mfence", { Skip_MODRM }, 0 }, 8428 }, 8429 { 8430 /* RM_0FAE_REG_7_MOD_3 */ 8431 { "sfence", { Skip_MODRM }, 0 }, 8432 }, 8433 { 8434 /* RM_0F3A0F_P_1_R_0 */ 8435 { "hreset", { Skip_MODRM, Ib }, 0 }, 8436 }, 8437 { 8438 /* RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0_R_0 */ 8439 { "tilerelease", { Skip_MODRM }, 0 }, 8440 }, 8441 { 8442 /* RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_3 */ 8443 { "tilezero", { TMM, Skip_MODRM }, 0 }, 8444 }, 8445 }; 8446 8447 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>") 8448 8449 /* The values used here must be non-zero, fit in 'unsigned char', and not be 8450 in conflict with actual prefix opcodes. */ 8451 #define REP_PREFIX 0x01 8452 #define XACQUIRE_PREFIX 0x02 8453 #define XRELEASE_PREFIX 0x03 8454 #define BND_PREFIX 0x04 8455 #define NOTRACK_PREFIX 0x05 8456 8457 static enum { 8458 ckp_okay, 8459 ckp_bogus, 8460 ckp_fetch_error, 8461 } 8462 ckprefix (instr_info *ins) 8463 { 8464 int i, length; 8465 uint8_t newrex; 8466 8467 i = 0; 8468 length = 0; 8469 /* The maximum instruction length is 15bytes. */ 8470 while (length < MAX_CODE_LENGTH - 1) 8471 { 8472 if (!fetch_code (ins->info, ins->codep + 1)) 8473 return ckp_fetch_error; 8474 newrex = 0; 8475 switch (*ins->codep) 8476 { 8477 /* REX prefixes family. */ 8478 case 0x40: 8479 case 0x41: 8480 case 0x42: 8481 case 0x43: 8482 case 0x44: 8483 case 0x45: 8484 case 0x46: 8485 case 0x47: 8486 case 0x48: 8487 case 0x49: 8488 case 0x4a: 8489 case 0x4b: 8490 case 0x4c: 8491 case 0x4d: 8492 case 0x4e: 8493 case 0x4f: 8494 if (ins->address_mode == mode_64bit) 8495 newrex = *ins->codep; 8496 else 8497 return ckp_okay; 8498 ins->last_rex_prefix = i; 8499 break; 8500 /* REX2 must be the last prefix. */ 8501 case REX2_OPCODE: 8502 if (ins->address_mode == mode_64bit) 8503 { 8504 if (ins->last_rex_prefix >= 0) 8505 return ckp_bogus; 8506 8507 ins->codep++; 8508 if (!fetch_code (ins->info, ins->codep + 1)) 8509 return ckp_fetch_error; 8510 ins->rex2_payload = *ins->codep; 8511 ins->rex2 = ins->rex2_payload >> 4; 8512 ins->rex = (ins->rex2_payload & 0xf) | REX_OPCODE; 8513 ins->codep++; 8514 ins->last_rex2_prefix = i; 8515 ins->all_prefixes[i] = REX2_OPCODE; 8516 } 8517 return ckp_okay; 8518 case 0xf3: 8519 ins->prefixes |= PREFIX_REPZ; 8520 ins->last_repz_prefix = i; 8521 break; 8522 case 0xf2: 8523 ins->prefixes |= PREFIX_REPNZ; 8524 ins->last_repnz_prefix = i; 8525 break; 8526 case 0xf0: 8527 ins->prefixes |= PREFIX_LOCK; 8528 ins->last_lock_prefix = i; 8529 break; 8530 case 0x2e: 8531 ins->prefixes |= PREFIX_CS; 8532 ins->last_seg_prefix = i; 8533 if (ins->address_mode != mode_64bit) 8534 ins->active_seg_prefix = PREFIX_CS; 8535 break; 8536 case 0x36: 8537 ins->prefixes |= PREFIX_SS; 8538 ins->last_seg_prefix = i; 8539 if (ins->address_mode != mode_64bit) 8540 ins->active_seg_prefix = PREFIX_SS; 8541 break; 8542 case 0x3e: 8543 ins->prefixes |= PREFIX_DS; 8544 ins->last_seg_prefix = i; 8545 if (ins->address_mode != mode_64bit) 8546 ins->active_seg_prefix = PREFIX_DS; 8547 break; 8548 case 0x26: 8549 ins->prefixes |= PREFIX_ES; 8550 ins->last_seg_prefix = i; 8551 if (ins->address_mode != mode_64bit) 8552 ins->active_seg_prefix = PREFIX_ES; 8553 break; 8554 case 0x64: 8555 ins->prefixes |= PREFIX_FS; 8556 ins->last_seg_prefix = i; 8557 ins->active_seg_prefix = PREFIX_FS; 8558 break; 8559 case 0x65: 8560 ins->prefixes |= PREFIX_GS; 8561 ins->last_seg_prefix = i; 8562 ins->active_seg_prefix = PREFIX_GS; 8563 break; 8564 case 0x66: 8565 ins->prefixes |= PREFIX_DATA; 8566 ins->last_data_prefix = i; 8567 break; 8568 case 0x67: 8569 ins->prefixes |= PREFIX_ADDR; 8570 ins->last_addr_prefix = i; 8571 break; 8572 case FWAIT_OPCODE: 8573 /* fwait is really an instruction. If there are prefixes 8574 before the fwait, they belong to the fwait, *not* to the 8575 following instruction. */ 8576 ins->fwait_prefix = i; 8577 if (ins->prefixes || ins->rex) 8578 { 8579 ins->prefixes |= PREFIX_FWAIT; 8580 ins->codep++; 8581 /* This ensures that the previous REX prefixes are noticed 8582 as unused prefixes, as in the return case below. */ 8583 return ins->rex ? ckp_bogus : ckp_okay; 8584 } 8585 ins->prefixes = PREFIX_FWAIT; 8586 break; 8587 default: 8588 return ckp_okay; 8589 } 8590 /* Rex is ignored when followed by another prefix. */ 8591 if (ins->rex) 8592 return ckp_bogus; 8593 if (*ins->codep != FWAIT_OPCODE) 8594 ins->all_prefixes[i++] = *ins->codep; 8595 ins->rex = newrex; 8596 ins->codep++; 8597 length++; 8598 } 8599 return ckp_bogus; 8600 } 8601 8602 /* Return the name of the prefix byte PREF, or NULL if PREF is not a 8603 prefix byte. */ 8604 8605 static const char * 8606 prefix_name (enum address_mode mode, uint8_t pref, int sizeflag) 8607 { 8608 static const char *rexes [16] = 8609 { 8610 "rex", /* 0x40 */ 8611 "rex.B", /* 0x41 */ 8612 "rex.X", /* 0x42 */ 8613 "rex.XB", /* 0x43 */ 8614 "rex.R", /* 0x44 */ 8615 "rex.RB", /* 0x45 */ 8616 "rex.RX", /* 0x46 */ 8617 "rex.RXB", /* 0x47 */ 8618 "rex.W", /* 0x48 */ 8619 "rex.WB", /* 0x49 */ 8620 "rex.WX", /* 0x4a */ 8621 "rex.WXB", /* 0x4b */ 8622 "rex.WR", /* 0x4c */ 8623 "rex.WRB", /* 0x4d */ 8624 "rex.WRX", /* 0x4e */ 8625 "rex.WRXB", /* 0x4f */ 8626 }; 8627 8628 switch (pref) 8629 { 8630 /* REX prefixes family. */ 8631 case 0x40: 8632 case 0x41: 8633 case 0x42: 8634 case 0x43: 8635 case 0x44: 8636 case 0x45: 8637 case 0x46: 8638 case 0x47: 8639 case 0x48: 8640 case 0x49: 8641 case 0x4a: 8642 case 0x4b: 8643 case 0x4c: 8644 case 0x4d: 8645 case 0x4e: 8646 case 0x4f: 8647 return rexes [pref - 0x40]; 8648 case 0xf3: 8649 return "repz"; 8650 case 0xf2: 8651 return "repnz"; 8652 case 0xf0: 8653 return "lock"; 8654 case 0x2e: 8655 return "cs"; 8656 case 0x36: 8657 return "ss"; 8658 case 0x3e: 8659 return "ds"; 8660 case 0x26: 8661 return "es"; 8662 case 0x64: 8663 return "fs"; 8664 case 0x65: 8665 return "gs"; 8666 case 0x66: 8667 return (sizeflag & DFLAG) ? "data16" : "data32"; 8668 case 0x67: 8669 if (mode == mode_64bit) 8670 return (sizeflag & AFLAG) ? "addr32" : "addr64"; 8671 else 8672 return (sizeflag & AFLAG) ? "addr16" : "addr32"; 8673 case FWAIT_OPCODE: 8674 return "fwait"; 8675 case REP_PREFIX: 8676 return "rep"; 8677 case XACQUIRE_PREFIX: 8678 return "xacquire"; 8679 case XRELEASE_PREFIX: 8680 return "xrelease"; 8681 case BND_PREFIX: 8682 return "bnd"; 8683 case NOTRACK_PREFIX: 8684 return "notrack"; 8685 case REX2_OPCODE: 8686 return "rex2"; 8687 default: 8688 return NULL; 8689 } 8690 } 8691 8692 void 8693 print_i386_disassembler_options (FILE *stream) 8694 { 8695 fprintf (stream, _("\n\ 8696 The following i386/x86-64 specific disassembler options are supported for use\n\ 8697 with the -M switch (multiple options should be separated by commas):\n")); 8698 8699 fprintf (stream, _(" x86-64 Disassemble in 64bit mode\n")); 8700 fprintf (stream, _(" i386 Disassemble in 32bit mode\n")); 8701 fprintf (stream, _(" i8086 Disassemble in 16bit mode\n")); 8702 fprintf (stream, _(" att Display instruction in AT&T syntax\n")); 8703 fprintf (stream, _(" intel Display instruction in Intel syntax\n")); 8704 fprintf (stream, _(" att-mnemonic (AT&T syntax only)\n" 8705 " Display instruction with AT&T mnemonic\n")); 8706 fprintf (stream, _(" intel-mnemonic (AT&T syntax only)\n" 8707 " Display instruction with Intel mnemonic\n")); 8708 fprintf (stream, _(" addr64 Assume 64bit address size\n")); 8709 fprintf (stream, _(" addr32 Assume 32bit address size\n")); 8710 fprintf (stream, _(" addr16 Assume 16bit address size\n")); 8711 fprintf (stream, _(" data32 Assume 32bit data size\n")); 8712 fprintf (stream, _(" data16 Assume 16bit data size\n")); 8713 fprintf (stream, _(" suffix Always display instruction suffix in AT&T syntax\n")); 8714 fprintf (stream, _(" amd64 Display instruction in AMD64 ISA\n")); 8715 fprintf (stream, _(" intel64 Display instruction in Intel64 ISA\n")); 8716 } 8717 8718 /* Bad opcode. */ 8719 static const struct dis386 bad_opcode = { "(bad)", { XX }, 0 }; 8720 8721 /* Fetch error indicator. */ 8722 static const struct dis386 err_opcode = { NULL, { XX }, 0 }; 8723 8724 static const struct dis386 map7_f8_opcode = { VEX_LEN_TABLE (VEX_LEN_MAP7_F8) }; 8725 8726 /* Get a pointer to struct dis386 with a valid name. */ 8727 8728 static const struct dis386 * 8729 get_valid_dis386 (const struct dis386 *dp, instr_info *ins) 8730 { 8731 int vindex, vex_table_index; 8732 8733 if (dp->name != NULL) 8734 return dp; 8735 8736 switch (dp->op[0].bytemode) 8737 { 8738 case USE_REG_TABLE: 8739 dp = ®_table[dp->op[1].bytemode][ins->modrm.reg]; 8740 break; 8741 8742 case USE_MOD_TABLE: 8743 vindex = ins->modrm.mod == 0x3 ? 1 : 0; 8744 dp = &mod_table[dp->op[1].bytemode][vindex]; 8745 break; 8746 8747 case USE_RM_TABLE: 8748 dp = &rm_table[dp->op[1].bytemode][ins->modrm.rm]; 8749 break; 8750 8751 case USE_PREFIX_TABLE: 8752 use_prefix_table: 8753 if (ins->need_vex) 8754 { 8755 /* The prefix in VEX is implicit. */ 8756 switch (ins->vex.prefix) 8757 { 8758 case 0: 8759 vindex = 0; 8760 break; 8761 case REPE_PREFIX_OPCODE: 8762 vindex = 1; 8763 break; 8764 case DATA_PREFIX_OPCODE: 8765 vindex = 2; 8766 break; 8767 case REPNE_PREFIX_OPCODE: 8768 vindex = 3; 8769 break; 8770 default: 8771 abort (); 8772 break; 8773 } 8774 } 8775 else 8776 { 8777 int last_prefix = -1; 8778 int prefix = 0; 8779 vindex = 0; 8780 /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA. 8781 When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the 8782 last one wins. */ 8783 if ((ins->prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) != 0) 8784 { 8785 if (ins->last_repz_prefix > ins->last_repnz_prefix) 8786 { 8787 vindex = 1; 8788 prefix = PREFIX_REPZ; 8789 last_prefix = ins->last_repz_prefix; 8790 } 8791 else 8792 { 8793 vindex = 3; 8794 prefix = PREFIX_REPNZ; 8795 last_prefix = ins->last_repnz_prefix; 8796 } 8797 8798 /* Check if prefix should be ignored. */ 8799 if ((((prefix_table[dp->op[1].bytemode][vindex].prefix_requirement 8800 & PREFIX_IGNORED) >> PREFIX_IGNORED_SHIFT) 8801 & prefix) != 0 8802 && !prefix_table[dp->op[1].bytemode][vindex].name) 8803 vindex = 0; 8804 } 8805 8806 if (vindex == 0 && (ins->prefixes & PREFIX_DATA) != 0) 8807 { 8808 vindex = 2; 8809 prefix = PREFIX_DATA; 8810 last_prefix = ins->last_data_prefix; 8811 } 8812 8813 if (vindex != 0) 8814 { 8815 ins->used_prefixes |= prefix; 8816 ins->all_prefixes[last_prefix] = 0; 8817 } 8818 } 8819 dp = &prefix_table[dp->op[1].bytemode][vindex]; 8820 break; 8821 8822 case USE_X86_64_EVEX_FROM_VEX_TABLE: 8823 case USE_X86_64_EVEX_PFX_TABLE: 8824 case USE_X86_64_EVEX_W_TABLE: 8825 case USE_X86_64_EVEX_MEM_W_TABLE: 8826 ins->evex_type = evex_from_vex; 8827 /* EVEX from VEX instructions are 64-bit only and require that EVEX.z, 8828 EVEX.L'L, EVEX.b, and the lower 2 bits of EVEX.aaa must be 0. */ 8829 if (ins->address_mode != mode_64bit 8830 || (ins->vex.mask_register_specifier & 0x3) != 0 8831 || ins->vex.ll != 0 8832 || ins->vex.zeroing != 0 8833 || ins->vex.b) 8834 return &bad_opcode; 8835 8836 if (dp->op[0].bytemode == USE_X86_64_EVEX_PFX_TABLE) 8837 goto use_prefix_table; 8838 if (dp->op[0].bytemode == USE_X86_64_EVEX_W_TABLE) 8839 goto use_vex_w_table; 8840 if (dp->op[0].bytemode == USE_X86_64_EVEX_MEM_W_TABLE) 8841 { 8842 if (ins->modrm.mod == 3) 8843 return &bad_opcode; 8844 goto use_vex_w_table; 8845 } 8846 8847 /* Fall through. */ 8848 case USE_X86_64_TABLE: 8849 vindex = ins->address_mode == mode_64bit ? 1 : 0; 8850 dp = &x86_64_table[dp->op[1].bytemode][vindex]; 8851 break; 8852 8853 case USE_3BYTE_TABLE: 8854 if (ins->last_rex2_prefix >= 0) 8855 return &err_opcode; 8856 if (!fetch_code (ins->info, ins->codep + 2)) 8857 return &err_opcode; 8858 vindex = *ins->codep++; 8859 dp = &three_byte_table[dp->op[1].bytemode][vindex]; 8860 ins->end_codep = ins->codep; 8861 if (!fetch_modrm (ins)) 8862 return &err_opcode; 8863 break; 8864 8865 case USE_VEX_LEN_TABLE: 8866 if (!ins->need_vex) 8867 abort (); 8868 8869 switch (ins->vex.length) 8870 { 8871 case 128: 8872 vindex = 0; 8873 break; 8874 case 512: 8875 /* This allows re-using in particular table entries where only 8876 128-bit operand size (VEX.L=0 / EVEX.L'L=0) are valid. */ 8877 if (ins->vex.evex) 8878 { 8879 case 256: 8880 vindex = 1; 8881 break; 8882 } 8883 /* Fall through. */ 8884 default: 8885 abort (); 8886 break; 8887 } 8888 8889 dp = &vex_len_table[dp->op[1].bytemode][vindex]; 8890 break; 8891 8892 case USE_EVEX_LEN_TABLE: 8893 if (!ins->vex.evex) 8894 abort (); 8895 8896 switch (ins->vex.length) 8897 { 8898 case 128: 8899 vindex = 0; 8900 break; 8901 case 256: 8902 vindex = 1; 8903 break; 8904 case 512: 8905 vindex = 2; 8906 break; 8907 default: 8908 abort (); 8909 break; 8910 } 8911 8912 dp = &evex_len_table[dp->op[1].bytemode][vindex]; 8913 break; 8914 8915 case USE_XOP_8F_TABLE: 8916 if (!fetch_code (ins->info, ins->codep + 3)) 8917 return &err_opcode; 8918 ins->rex = ~(*ins->codep >> 5) & 0x7; 8919 8920 /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm". */ 8921 switch ((*ins->codep & 0x1f)) 8922 { 8923 default: 8924 dp = &bad_opcode; 8925 return dp; 8926 case 0x8: 8927 vex_table_index = XOP_08; 8928 break; 8929 case 0x9: 8930 vex_table_index = XOP_09; 8931 break; 8932 case 0xa: 8933 vex_table_index = XOP_0A; 8934 break; 8935 } 8936 ins->codep++; 8937 ins->vex.w = *ins->codep & 0x80; 8938 if (ins->vex.w && ins->address_mode == mode_64bit) 8939 ins->rex |= REX_W; 8940 8941 ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf; 8942 if (ins->address_mode != mode_64bit) 8943 { 8944 /* In 16/32-bit mode REX_B is silently ignored. */ 8945 ins->rex &= ~REX_B; 8946 } 8947 8948 ins->vex.length = (*ins->codep & 0x4) ? 256 : 128; 8949 switch ((*ins->codep & 0x3)) 8950 { 8951 case 0: 8952 break; 8953 case 1: 8954 ins->vex.prefix = DATA_PREFIX_OPCODE; 8955 break; 8956 case 2: 8957 ins->vex.prefix = REPE_PREFIX_OPCODE; 8958 break; 8959 case 3: 8960 ins->vex.prefix = REPNE_PREFIX_OPCODE; 8961 break; 8962 } 8963 ins->need_vex = 3; 8964 ins->codep++; 8965 vindex = *ins->codep++; 8966 dp = &xop_table[vex_table_index][vindex]; 8967 8968 ins->end_codep = ins->codep; 8969 if (!fetch_modrm (ins)) 8970 return &err_opcode; 8971 8972 /* No XOP encoding so far allows for a non-zero embedded prefix. Avoid 8973 having to decode the bits for every otherwise valid encoding. */ 8974 if (ins->vex.prefix) 8975 return &bad_opcode; 8976 break; 8977 8978 case USE_VEX_C4_TABLE: 8979 /* VEX prefix. */ 8980 if (!fetch_code (ins->info, ins->codep + 3)) 8981 return &err_opcode; 8982 ins->rex = ~(*ins->codep >> 5) & 0x7; 8983 switch ((*ins->codep & 0x1f)) 8984 { 8985 default: 8986 dp = &bad_opcode; 8987 return dp; 8988 case 0x1: 8989 vex_table_index = VEX_0F; 8990 break; 8991 case 0x2: 8992 vex_table_index = VEX_0F38; 8993 break; 8994 case 0x3: 8995 vex_table_index = VEX_0F3A; 8996 break; 8997 case 0x7: 8998 vex_table_index = VEX_MAP7; 8999 break; 9000 } 9001 ins->codep++; 9002 ins->vex.w = *ins->codep & 0x80; 9003 if (ins->address_mode == mode_64bit) 9004 { 9005 if (ins->vex.w) 9006 ins->rex |= REX_W; 9007 } 9008 else 9009 { 9010 /* For the 3-byte VEX prefix in 32-bit mode, the REX_B bit 9011 is ignored, other REX bits are 0 and the highest bit in 9012 VEX.vvvv is also ignored (but we mustn't clear it here). */ 9013 ins->rex = 0; 9014 } 9015 ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf; 9016 ins->vex.length = (*ins->codep & 0x4) ? 256 : 128; 9017 switch ((*ins->codep & 0x3)) 9018 { 9019 case 0: 9020 break; 9021 case 1: 9022 ins->vex.prefix = DATA_PREFIX_OPCODE; 9023 break; 9024 case 2: 9025 ins->vex.prefix = REPE_PREFIX_OPCODE; 9026 break; 9027 case 3: 9028 ins->vex.prefix = REPNE_PREFIX_OPCODE; 9029 break; 9030 } 9031 ins->need_vex = 3; 9032 ins->codep++; 9033 vindex = *ins->codep++; 9034 if (vex_table_index != VEX_MAP7) 9035 dp = &vex_table[vex_table_index][vindex]; 9036 else if (vindex == 0xf8) 9037 dp = &map7_f8_opcode; 9038 else 9039 dp = &bad_opcode; 9040 ins->end_codep = ins->codep; 9041 /* There is no MODRM byte for VEX0F 77. */ 9042 if ((vex_table_index != VEX_0F || vindex != 0x77) 9043 && !fetch_modrm (ins)) 9044 return &err_opcode; 9045 break; 9046 9047 case USE_VEX_C5_TABLE: 9048 /* VEX prefix. */ 9049 if (!fetch_code (ins->info, ins->codep + 2)) 9050 return &err_opcode; 9051 ins->rex = (*ins->codep & 0x80) ? 0 : REX_R; 9052 9053 /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in 9054 VEX.vvvv is 1. */ 9055 ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf; 9056 ins->vex.length = (*ins->codep & 0x4) ? 256 : 128; 9057 switch ((*ins->codep & 0x3)) 9058 { 9059 case 0: 9060 break; 9061 case 1: 9062 ins->vex.prefix = DATA_PREFIX_OPCODE; 9063 break; 9064 case 2: 9065 ins->vex.prefix = REPE_PREFIX_OPCODE; 9066 break; 9067 case 3: 9068 ins->vex.prefix = REPNE_PREFIX_OPCODE; 9069 break; 9070 } 9071 ins->need_vex = 2; 9072 ins->codep++; 9073 vindex = *ins->codep++; 9074 dp = &vex_table[VEX_0F][vindex]; 9075 ins->end_codep = ins->codep; 9076 /* There is no MODRM byte for VEX 77. */ 9077 if (vindex != 0x77 && !fetch_modrm (ins)) 9078 return &err_opcode; 9079 break; 9080 9081 case USE_VEX_W_TABLE: 9082 use_vex_w_table: 9083 if (!ins->need_vex) 9084 abort (); 9085 9086 dp = &vex_w_table[dp->op[1].bytemode][ins->vex.w]; 9087 break; 9088 9089 case USE_EVEX_TABLE: 9090 ins->two_source_ops = false; 9091 /* EVEX prefix. */ 9092 ins->vex.evex = true; 9093 if (!fetch_code (ins->info, ins->codep + 4)) 9094 return &err_opcode; 9095 /* The first byte after 0x62. */ 9096 if (*ins->codep & 0x8) 9097 ins->rex2 |= REX_B; 9098 if (!(*ins->codep & 0x10)) 9099 ins->rex2 |= REX_R; 9100 9101 ins->rex = ~(*ins->codep >> 5) & 0x7; 9102 switch (*ins->codep & 0x7) 9103 { 9104 default: 9105 return &bad_opcode; 9106 case 0x1: 9107 vex_table_index = EVEX_0F; 9108 break; 9109 case 0x2: 9110 vex_table_index = EVEX_0F38; 9111 break; 9112 case 0x3: 9113 vex_table_index = EVEX_0F3A; 9114 break; 9115 case 0x4: 9116 vex_table_index = EVEX_MAP4; 9117 ins->evex_type = evex_from_legacy; 9118 if (ins->address_mode != mode_64bit) 9119 return &bad_opcode; 9120 break; 9121 case 0x5: 9122 vex_table_index = EVEX_MAP5; 9123 break; 9124 case 0x6: 9125 vex_table_index = EVEX_MAP6; 9126 break; 9127 case 0x7: 9128 vex_table_index = EVEX_MAP7; 9129 break; 9130 } 9131 9132 /* The second byte after 0x62. */ 9133 ins->codep++; 9134 ins->vex.w = *ins->codep & 0x80; 9135 if (ins->vex.w && ins->address_mode == mode_64bit) 9136 ins->rex |= REX_W; 9137 9138 ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf; 9139 9140 if (!(*ins->codep & 0x4)) 9141 ins->rex2 |= REX_X; 9142 9143 switch ((*ins->codep & 0x3)) 9144 { 9145 case 0: 9146 break; 9147 case 1: 9148 ins->vex.prefix = DATA_PREFIX_OPCODE; 9149 break; 9150 case 2: 9151 ins->vex.prefix = REPE_PREFIX_OPCODE; 9152 break; 9153 case 3: 9154 ins->vex.prefix = REPNE_PREFIX_OPCODE; 9155 break; 9156 } 9157 9158 /* The third byte after 0x62. */ 9159 ins->codep++; 9160 9161 /* Remember the static rounding bits. */ 9162 ins->vex.ll = (*ins->codep >> 5) & 3; 9163 ins->vex.b = *ins->codep & 0x10; 9164 9165 ins->vex.v = *ins->codep & 0x8; 9166 ins->vex.mask_register_specifier = *ins->codep & 0x7; 9167 ins->vex.zeroing = *ins->codep & 0x80; 9168 /* Set the NF bit for EVEX-Promoted instructions, this bit will be cleared 9169 when it's an evex_default one. */ 9170 ins->vex.nf = *ins->codep & 0x4; 9171 9172 if (ins->address_mode != mode_64bit) 9173 { 9174 /* Report bad for !evex_default and when two fixed values of evex 9175 change.. */ 9176 if (ins->evex_type != evex_default 9177 || (ins->rex2 & (REX_B | REX_X))) 9178 return &bad_opcode; 9179 /* In 16/32-bit mode silently ignore following bits. */ 9180 ins->rex &= ~REX_B; 9181 ins->rex2 &= ~REX_R; 9182 } 9183 9184 /* EVEX from legacy instructions, when the EVEX.ND bit is 0, 9185 all bits of EVEX.vvvv and EVEX.V' must be 1. */ 9186 if (ins->evex_type == evex_from_legacy && !ins->vex.nd 9187 && (ins->vex.register_specifier || !ins->vex.v)) 9188 return &bad_opcode; 9189 9190 ins->need_vex = 4; 9191 9192 /* EVEX from legacy instructions require that EVEX.z, EVEX.L’L and the 9193 lower 2 bits of EVEX.aaa must be 0. */ 9194 if (ins->evex_type == evex_from_legacy 9195 && ((ins->vex.mask_register_specifier & 0x3) != 0 9196 || ins->vex.ll != 0 9197 || ins->vex.zeroing != 0)) 9198 return &bad_opcode; 9199 9200 ins->codep++; 9201 vindex = *ins->codep++; 9202 if (vex_table_index != EVEX_MAP7) 9203 dp = &evex_table[vex_table_index][vindex]; 9204 else if (vindex == 0xf8) 9205 dp = &map7_f8_opcode; 9206 else 9207 dp = &bad_opcode; 9208 ins->end_codep = ins->codep; 9209 if (!fetch_modrm (ins)) 9210 return &err_opcode; 9211 9212 if (ins->modrm.mod == 3 && (ins->rex2 & REX_X)) 9213 return &bad_opcode; 9214 9215 /* Set vector length. For EVEX-promoted instructions, evex.ll == 0b00, 9216 which has the same encoding as vex.length == 128 and they can share 9217 the same processing with vex.length in OP_VEX. */ 9218 if (ins->modrm.mod == 3 && ins->vex.b && ins->evex_type != evex_from_legacy) 9219 ins->vex.length = 512; 9220 else 9221 { 9222 switch (ins->vex.ll) 9223 { 9224 case 0x0: 9225 ins->vex.length = 128; 9226 break; 9227 case 0x1: 9228 ins->vex.length = 256; 9229 break; 9230 case 0x2: 9231 ins->vex.length = 512; 9232 break; 9233 default: 9234 return &bad_opcode; 9235 } 9236 } 9237 break; 9238 9239 case 0: 9240 dp = &bad_opcode; 9241 break; 9242 9243 default: 9244 abort (); 9245 } 9246 9247 if (dp->name != NULL) 9248 return dp; 9249 else 9250 return get_valid_dis386 (dp, ins); 9251 } 9252 9253 static bool 9254 get_sib (instr_info *ins, int sizeflag) 9255 { 9256 /* If modrm.mod == 3, operand must be register. */ 9257 if (ins->need_modrm 9258 && ((sizeflag & AFLAG) || ins->address_mode == mode_64bit) 9259 && ins->modrm.mod != 3 9260 && ins->modrm.rm == 4) 9261 { 9262 if (!fetch_code (ins->info, ins->codep + 2)) 9263 return false; 9264 ins->sib.index = (ins->codep[1] >> 3) & 7; 9265 ins->sib.scale = (ins->codep[1] >> 6) & 3; 9266 ins->sib.base = ins->codep[1] & 7; 9267 ins->has_sib = true; 9268 } 9269 else 9270 ins->has_sib = false; 9271 9272 return true; 9273 } 9274 9275 /* Like oappend_with_style (below) but always with text style. */ 9276 9277 static void 9278 oappend (instr_info *ins, const char *s) 9279 { 9280 oappend_with_style (ins, s, dis_style_text); 9281 } 9282 9283 /* Like oappend (above), but S is a string starting with '%'. In 9284 Intel syntax, the '%' is elided. */ 9285 9286 static void 9287 oappend_register (instr_info *ins, const char *s) 9288 { 9289 oappend_with_style (ins, s + ins->intel_syntax, dis_style_register); 9290 } 9291 9292 /* Wrap around a call to INS->info->fprintf_styled_func, printing FMT. 9293 STYLE is the default style to use in the fprintf_styled_func calls, 9294 however, FMT might include embedded style markers (see oappend_style), 9295 these embedded markers are not printed, but instead change the style 9296 used in the next fprintf_styled_func call. */ 9297 9298 static void ATTRIBUTE_PRINTF_3 9299 i386_dis_printf (const disassemble_info *info, enum disassembler_style style, 9300 const char *fmt, ...) 9301 { 9302 va_list ap; 9303 enum disassembler_style curr_style = style; 9304 const char *start, *curr; 9305 char staging_area[40]; 9306 9307 va_start (ap, fmt); 9308 /* In particular print_insn()'s processing of op_txt[] can hand rather long 9309 strings here. Bypass vsnprintf() in such cases to avoid capacity issues 9310 with the staging area. */ 9311 if (strcmp (fmt, "%s")) 9312 { 9313 int res = vsnprintf (staging_area, sizeof (staging_area), fmt, ap); 9314 9315 va_end (ap); 9316 9317 if (res < 0) 9318 return; 9319 9320 if ((size_t) res >= sizeof (staging_area)) 9321 abort (); 9322 9323 start = curr = staging_area; 9324 } 9325 else 9326 { 9327 start = curr = va_arg (ap, const char *); 9328 va_end (ap); 9329 } 9330 9331 do 9332 { 9333 if (*curr == '\0' 9334 || (*curr == STYLE_MARKER_CHAR 9335 && ISXDIGIT (*(curr + 1)) 9336 && *(curr + 2) == STYLE_MARKER_CHAR)) 9337 { 9338 /* Output content between our START position and CURR. */ 9339 int len = curr - start; 9340 int n = (*info->fprintf_styled_func) (info->stream, curr_style, 9341 "%.*s", len, start); 9342 if (n < 0) 9343 break; 9344 9345 if (*curr == '\0') 9346 break; 9347 9348 /* Skip over the initial STYLE_MARKER_CHAR. */ 9349 ++curr; 9350 9351 /* Update the CURR_STYLE. As there are less than 16 styles, it 9352 is possible, that if the input is corrupted in some way, that 9353 we might set CURR_STYLE to an invalid value. Don't worry 9354 though, we check for this situation. */ 9355 if (*curr >= '0' && *curr <= '9') 9356 curr_style = (enum disassembler_style) (*curr - '0'); 9357 else if (*curr >= 'a' && *curr <= 'f') 9358 curr_style = (enum disassembler_style) (*curr - 'a' + 10); 9359 else 9360 curr_style = dis_style_text; 9361 9362 /* Check for an invalid style having been selected. This should 9363 never happen, but it doesn't hurt to be a little paranoid. */ 9364 if (curr_style > dis_style_comment_start) 9365 curr_style = dis_style_text; 9366 9367 /* Skip the hex character, and the closing STYLE_MARKER_CHAR. */ 9368 curr += 2; 9369 9370 /* Reset the START to after the style marker. */ 9371 start = curr; 9372 } 9373 else 9374 ++curr; 9375 } 9376 while (true); 9377 } 9378 9379 static int 9380 print_insn (bfd_vma pc, disassemble_info *info, int intel_syntax) 9381 { 9382 const struct dis386 *dp; 9383 int i; 9384 int ret; 9385 char *op_txt[MAX_OPERANDS]; 9386 int needcomma; 9387 bool intel_swap_2_3; 9388 int sizeflag, orig_sizeflag; 9389 const char *p; 9390 struct dis_private priv; 9391 int prefix_length; 9392 int op_count; 9393 instr_info ins = { 9394 .info = info, 9395 .intel_syntax = intel_syntax >= 0 9396 ? intel_syntax 9397 : (info->mach & bfd_mach_i386_intel_syntax) != 0, 9398 .intel_mnemonic = !SYSV386_COMPAT, 9399 .op_index[0 ... MAX_OPERANDS - 1] = -1, 9400 .start_pc = pc, 9401 .start_codep = priv.the_buffer, 9402 .codep = priv.the_buffer, 9403 .obufp = ins.obuf, 9404 .last_lock_prefix = -1, 9405 .last_repz_prefix = -1, 9406 .last_repnz_prefix = -1, 9407 .last_data_prefix = -1, 9408 .last_addr_prefix = -1, 9409 .last_rex_prefix = -1, 9410 .last_rex2_prefix = -1, 9411 .last_seg_prefix = -1, 9412 .fwait_prefix = -1, 9413 }; 9414 char op_out[MAX_OPERANDS][MAX_OPERAND_BUFFER_SIZE]; 9415 9416 priv.orig_sizeflag = AFLAG | DFLAG; 9417 if ((info->mach & bfd_mach_i386_i386) != 0) 9418 ins.address_mode = mode_32bit; 9419 else if (info->mach == bfd_mach_i386_i8086) 9420 { 9421 ins.address_mode = mode_16bit; 9422 priv.orig_sizeflag = 0; 9423 } 9424 else 9425 ins.address_mode = mode_64bit; 9426 9427 for (p = info->disassembler_options; p != NULL;) 9428 { 9429 if (startswith (p, "amd64")) 9430 ins.isa64 = amd64; 9431 else if (startswith (p, "intel64")) 9432 ins.isa64 = intel64; 9433 else if (startswith (p, "x86-64")) 9434 { 9435 ins.address_mode = mode_64bit; 9436 priv.orig_sizeflag |= AFLAG | DFLAG; 9437 } 9438 else if (startswith (p, "i386")) 9439 { 9440 ins.address_mode = mode_32bit; 9441 priv.orig_sizeflag |= AFLAG | DFLAG; 9442 } 9443 else if (startswith (p, "i8086")) 9444 { 9445 ins.address_mode = mode_16bit; 9446 priv.orig_sizeflag &= ~(AFLAG | DFLAG); 9447 } 9448 else if (startswith (p, "intel")) 9449 { 9450 if (startswith (p + 5, "-mnemonic")) 9451 ins.intel_mnemonic = true; 9452 else 9453 ins.intel_syntax = 1; 9454 } 9455 else if (startswith (p, "att")) 9456 { 9457 ins.intel_syntax = 0; 9458 if (startswith (p + 3, "-mnemonic")) 9459 ins.intel_mnemonic = false; 9460 } 9461 else if (startswith (p, "addr")) 9462 { 9463 if (ins.address_mode == mode_64bit) 9464 { 9465 if (p[4] == '3' && p[5] == '2') 9466 priv.orig_sizeflag &= ~AFLAG; 9467 else if (p[4] == '6' && p[5] == '4') 9468 priv.orig_sizeflag |= AFLAG; 9469 } 9470 else 9471 { 9472 if (p[4] == '1' && p[5] == '6') 9473 priv.orig_sizeflag &= ~AFLAG; 9474 else if (p[4] == '3' && p[5] == '2') 9475 priv.orig_sizeflag |= AFLAG; 9476 } 9477 } 9478 else if (startswith (p, "data")) 9479 { 9480 if (p[4] == '1' && p[5] == '6') 9481 priv.orig_sizeflag &= ~DFLAG; 9482 else if (p[4] == '3' && p[5] == '2') 9483 priv.orig_sizeflag |= DFLAG; 9484 } 9485 else if (startswith (p, "suffix")) 9486 priv.orig_sizeflag |= SUFFIX_ALWAYS; 9487 9488 p = strchr (p, ','); 9489 if (p != NULL) 9490 p++; 9491 } 9492 9493 if (ins.address_mode == mode_64bit && sizeof (bfd_vma) < 8) 9494 { 9495 i386_dis_printf (info, dis_style_text, _("64-bit address is disabled")); 9496 return -1; 9497 } 9498 9499 if (ins.intel_syntax) 9500 { 9501 ins.open_char = '['; 9502 ins.close_char = ']'; 9503 ins.separator_char = '+'; 9504 ins.scale_char = '*'; 9505 } 9506 else 9507 { 9508 ins.open_char = '('; 9509 ins.close_char = ')'; 9510 ins.separator_char = ','; 9511 ins.scale_char = ','; 9512 } 9513 9514 /* The output looks better if we put 7 bytes on a line, since that 9515 puts most long word instructions on a single line. */ 9516 info->bytes_per_line = 7; 9517 9518 info->private_data = &priv; 9519 priv.fetched = 0; 9520 priv.insn_start = pc; 9521 9522 for (i = 0; i < MAX_OPERANDS; ++i) 9523 { 9524 op_out[i][0] = 0; 9525 ins.op_out[i] = op_out[i]; 9526 } 9527 9528 sizeflag = priv.orig_sizeflag; 9529 9530 switch (ckprefix (&ins)) 9531 { 9532 case ckp_okay: 9533 break; 9534 9535 case ckp_bogus: 9536 /* Too many prefixes or unused REX prefixes. */ 9537 for (i = 0; 9538 i < (int) ARRAY_SIZE (ins.all_prefixes) && ins.all_prefixes[i]; 9539 i++) 9540 i386_dis_printf (info, dis_style_mnemonic, "%s%s", 9541 (i == 0 ? "" : " "), 9542 prefix_name (ins.address_mode, ins.all_prefixes[i], 9543 sizeflag)); 9544 ret = i; 9545 goto out; 9546 9547 case ckp_fetch_error: 9548 goto fetch_error_out; 9549 } 9550 9551 ins.nr_prefixes = ins.codep - ins.start_codep; 9552 9553 if (!fetch_code (info, ins.codep + 1)) 9554 { 9555 fetch_error_out: 9556 ret = fetch_error (&ins); 9557 goto out; 9558 } 9559 9560 ins.two_source_ops = (*ins.codep == 0x62 || *ins.codep == 0xc8); 9561 9562 if ((ins.prefixes & PREFIX_FWAIT) 9563 && (*ins.codep < 0xd8 || *ins.codep > 0xdf)) 9564 { 9565 /* Handle ins.prefixes before fwait. */ 9566 for (i = 0; i < ins.fwait_prefix && ins.all_prefixes[i]; 9567 i++) 9568 i386_dis_printf (info, dis_style_mnemonic, "%s ", 9569 prefix_name (ins.address_mode, ins.all_prefixes[i], 9570 sizeflag)); 9571 i386_dis_printf (info, dis_style_mnemonic, "fwait"); 9572 ret = i + 1; 9573 goto out; 9574 } 9575 9576 /* REX2.M in rex2 prefix represents map0 or map1. */ 9577 if (ins.last_rex2_prefix < 0 ? *ins.codep == 0x0f : (ins.rex2 & REX2_M)) 9578 { 9579 if (!ins.rex2) 9580 { 9581 ins.codep++; 9582 if (!fetch_code (info, ins.codep + 1)) 9583 goto fetch_error_out; 9584 } 9585 9586 dp = &dis386_twobyte[*ins.codep]; 9587 ins.need_modrm = twobyte_has_modrm[*ins.codep]; 9588 } 9589 else 9590 { 9591 dp = &dis386[*ins.codep]; 9592 ins.need_modrm = onebyte_has_modrm[*ins.codep]; 9593 } 9594 ins.codep++; 9595 9596 /* Save sizeflag for printing the extra ins.prefixes later before updating 9597 it for mnemonic and operand processing. The prefix names depend 9598 only on the address mode. */ 9599 orig_sizeflag = sizeflag; 9600 if (ins.prefixes & PREFIX_ADDR) 9601 sizeflag ^= AFLAG; 9602 if ((ins.prefixes & PREFIX_DATA)) 9603 sizeflag ^= DFLAG; 9604 9605 ins.end_codep = ins.codep; 9606 if (ins.need_modrm && !fetch_modrm (&ins)) 9607 goto fetch_error_out; 9608 9609 if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE) 9610 { 9611 if (!get_sib (&ins, sizeflag) 9612 || !dofloat (&ins, sizeflag)) 9613 goto fetch_error_out; 9614 } 9615 else 9616 { 9617 dp = get_valid_dis386 (dp, &ins); 9618 if (dp == &err_opcode) 9619 goto fetch_error_out; 9620 9621 /* For APX instructions promoted from legacy maps 0/1, embedded prefix 9622 is interpreted as the operand size override. */ 9623 if (ins.evex_type == evex_from_legacy 9624 && ins.vex.prefix == DATA_PREFIX_OPCODE) 9625 sizeflag ^= DFLAG; 9626 9627 if(ins.evex_type == evex_default) 9628 ins.vex.nf = false; 9629 else 9630 /* For EVEX-promoted formats, we need to clear EVEX.NF (ccmp and ctest 9631 are cleared separately.) in mask_register_specifier and keep the low 9632 2 bits of mask_register_specifier to report errors for invalid cases 9633 . */ 9634 ins.vex.mask_register_specifier &= 0x3; 9635 9636 if (dp != NULL && putop (&ins, dp->name, sizeflag) == 0) 9637 { 9638 if (!get_sib (&ins, sizeflag)) 9639 goto fetch_error_out; 9640 for (i = 0; i < MAX_OPERANDS; ++i) 9641 { 9642 ins.obufp = ins.op_out[i]; 9643 ins.op_ad = MAX_OPERANDS - 1 - i; 9644 if (dp->op[i].rtn 9645 && !dp->op[i].rtn (&ins, dp->op[i].bytemode, sizeflag)) 9646 goto fetch_error_out; 9647 /* For EVEX instruction after the last operand masking 9648 should be printed. */ 9649 if (i == 0 && ins.vex.evex) 9650 { 9651 /* Don't print {%k0}. */ 9652 if (ins.vex.mask_register_specifier) 9653 { 9654 const char *reg_name 9655 = att_names_mask[ins.vex.mask_register_specifier]; 9656 9657 oappend (&ins, "{"); 9658 oappend_register (&ins, reg_name); 9659 oappend (&ins, "}"); 9660 9661 if (ins.vex.zeroing) 9662 oappend (&ins, "{z}"); 9663 } 9664 else if (ins.vex.zeroing) 9665 { 9666 oappend (&ins, "{bad}"); 9667 continue; 9668 } 9669 9670 /* Instructions with a mask register destination allow for 9671 zeroing-masking only (if any masking at all), which is 9672 _not_ expressed by EVEX.z. */ 9673 if (ins.vex.zeroing && dp->op[0].bytemode == mask_mode) 9674 ins.illegal_masking = true; 9675 9676 /* S/G insns require a mask and don't allow 9677 zeroing-masking. */ 9678 if ((dp->op[0].bytemode == vex_vsib_d_w_dq_mode 9679 || dp->op[0].bytemode == vex_vsib_q_w_dq_mode) 9680 && (ins.vex.mask_register_specifier == 0 9681 || ins.vex.zeroing)) 9682 ins.illegal_masking = true; 9683 9684 if (ins.illegal_masking) 9685 oappend (&ins, "/(bad)"); 9686 } 9687 } 9688 /* vex.nf is cleared after being consumed. */ 9689 if (ins.vex.nf) 9690 oappend (&ins, "{bad-nf}"); 9691 9692 /* Check whether rounding control was enabled for an insn not 9693 supporting it, when evex.b is not treated as evex.nd. */ 9694 if (ins.modrm.mod == 3 && ins.vex.b && ins.evex_type == evex_default 9695 && !(ins.evex_used & EVEX_b_used)) 9696 { 9697 for (i = 0; i < MAX_OPERANDS; ++i) 9698 { 9699 ins.obufp = ins.op_out[i]; 9700 if (*ins.obufp) 9701 continue; 9702 oappend (&ins, names_rounding[ins.vex.ll]); 9703 oappend (&ins, "bad}"); 9704 break; 9705 } 9706 } 9707 } 9708 } 9709 9710 /* Clear instruction information. */ 9711 info->insn_info_valid = 0; 9712 info->branch_delay_insns = 0; 9713 info->data_size = 0; 9714 info->insn_type = dis_noninsn; 9715 info->target = 0; 9716 info->target2 = 0; 9717 9718 /* Reset jump operation indicator. */ 9719 ins.op_is_jump = false; 9720 { 9721 int jump_detection = 0; 9722 9723 /* Extract flags. */ 9724 for (i = 0; i < MAX_OPERANDS; ++i) 9725 { 9726 if ((dp->op[i].rtn == OP_J) 9727 || (dp->op[i].rtn == OP_indirE)) 9728 jump_detection |= 1; 9729 else if ((dp->op[i].rtn == BND_Fixup) 9730 || (!dp->op[i].rtn && !dp->op[i].bytemode)) 9731 jump_detection |= 2; 9732 else if ((dp->op[i].bytemode == cond_jump_mode) 9733 || (dp->op[i].bytemode == loop_jcxz_mode)) 9734 jump_detection |= 4; 9735 } 9736 9737 /* Determine if this is a jump or branch. */ 9738 if ((jump_detection & 0x3) == 0x3) 9739 { 9740 ins.op_is_jump = true; 9741 if (jump_detection & 0x4) 9742 info->insn_type = dis_condbranch; 9743 else 9744 info->insn_type = (dp->name && !strncmp (dp->name, "call", 4)) 9745 ? dis_jsr : dis_branch; 9746 } 9747 } 9748 9749 /* If VEX.vvvv and EVEX.vvvv are unused, they must be all 1s, which 9750 are all 0s in inverted form. */ 9751 if (ins.need_vex && ins.vex.register_specifier != 0) 9752 { 9753 i386_dis_printf (info, dis_style_text, "(bad)"); 9754 ret = ins.end_codep - priv.the_buffer; 9755 goto out; 9756 } 9757 9758 if ((dp->prefix_requirement & PREFIX_REX2_ILLEGAL) 9759 && ins.last_rex2_prefix >= 0 && (ins.rex2 & REX2_SPECIAL) == 0) 9760 { 9761 i386_dis_printf (info, dis_style_text, "(bad)"); 9762 ret = ins.end_codep - priv.the_buffer; 9763 goto out; 9764 } 9765 9766 switch (dp->prefix_requirement & ~PREFIX_REX2_ILLEGAL) 9767 { 9768 case PREFIX_DATA: 9769 /* If only the data prefix is marked as mandatory, its absence renders 9770 the encoding invalid. Most other PREFIX_OPCODE rules still apply. */ 9771 if (ins.need_vex ? !ins.vex.prefix : !(ins.prefixes & PREFIX_DATA)) 9772 { 9773 i386_dis_printf (info, dis_style_text, "(bad)"); 9774 ret = ins.end_codep - priv.the_buffer; 9775 goto out; 9776 } 9777 ins.used_prefixes |= PREFIX_DATA; 9778 /* Fall through. */ 9779 case PREFIX_OPCODE: 9780 /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is 9781 unused, opcode is invalid. Since the PREFIX_DATA prefix may be 9782 used by putop and MMX/SSE operand and may be overridden by the 9783 PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix 9784 separately. */ 9785 if (((ins.need_vex 9786 ? ins.vex.prefix == REPE_PREFIX_OPCODE 9787 || ins.vex.prefix == REPNE_PREFIX_OPCODE 9788 : (ins.prefixes 9789 & (PREFIX_REPZ | PREFIX_REPNZ)) != 0) 9790 && (ins.used_prefixes 9791 & (PREFIX_REPZ | PREFIX_REPNZ)) == 0) 9792 || (((ins.need_vex 9793 ? ins.vex.prefix == DATA_PREFIX_OPCODE 9794 : ((ins.prefixes 9795 & (PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA)) 9796 == PREFIX_DATA)) 9797 && (ins.used_prefixes & PREFIX_DATA) == 0)) 9798 || (ins.vex.evex && dp->prefix_requirement != PREFIX_DATA 9799 && !ins.vex.w != !(ins.used_prefixes & PREFIX_DATA))) 9800 { 9801 i386_dis_printf (info, dis_style_text, "(bad)"); 9802 ret = ins.end_codep - priv.the_buffer; 9803 goto out; 9804 } 9805 break; 9806 9807 case PREFIX_IGNORED: 9808 /* Zap data size and rep prefixes from used_prefixes and reinstate their 9809 origins in all_prefixes. */ 9810 ins.used_prefixes &= ~PREFIX_OPCODE; 9811 if (ins.last_data_prefix >= 0) 9812 ins.all_prefixes[ins.last_data_prefix] = 0x66; 9813 if (ins.last_repz_prefix >= 0) 9814 ins.all_prefixes[ins.last_repz_prefix] = 0xf3; 9815 if (ins.last_repnz_prefix >= 0) 9816 ins.all_prefixes[ins.last_repnz_prefix] = 0xf2; 9817 break; 9818 9819 case PREFIX_NP_OR_DATA: 9820 if (ins.vex.prefix == REPE_PREFIX_OPCODE 9821 || ins.vex.prefix == REPNE_PREFIX_OPCODE) 9822 { 9823 i386_dis_printf (info, dis_style_text, "(bad)"); 9824 ret = ins.end_codep - priv.the_buffer; 9825 goto out; 9826 } 9827 break; 9828 9829 case NO_PREFIX: 9830 if (ins.vex.prefix) 9831 { 9832 i386_dis_printf (info, dis_style_text, "(bad)"); 9833 ret = ins.end_codep - priv.the_buffer; 9834 goto out; 9835 } 9836 break; 9837 } 9838 9839 /* Check if the REX prefix is used. */ 9840 if ((ins.rex ^ ins.rex_used) == 0 9841 && !ins.need_vex && ins.last_rex_prefix >= 0) 9842 ins.all_prefixes[ins.last_rex_prefix] = 0; 9843 9844 /* Check if the REX2 prefix is used. */ 9845 if (ins.last_rex2_prefix >= 0 9846 && ((ins.rex2 & REX2_SPECIAL) 9847 || (((ins.rex2 & 7) ^ (ins.rex2_used & 7)) == 0 9848 && (ins.rex ^ ins.rex_used) == 0 9849 && (ins.rex2 & 7)))) 9850 ins.all_prefixes[ins.last_rex2_prefix] = 0; 9851 9852 /* Check if the SEG prefix is used. */ 9853 if ((ins.prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES 9854 | PREFIX_FS | PREFIX_GS)) != 0 9855 && (ins.used_prefixes & ins.active_seg_prefix) != 0) 9856 ins.all_prefixes[ins.last_seg_prefix] = 0; 9857 9858 /* Check if the ADDR prefix is used. */ 9859 if ((ins.prefixes & PREFIX_ADDR) != 0 9860 && (ins.used_prefixes & PREFIX_ADDR) != 0) 9861 ins.all_prefixes[ins.last_addr_prefix] = 0; 9862 9863 /* Check if the DATA prefix is used. */ 9864 if ((ins.prefixes & PREFIX_DATA) != 0 9865 && (ins.used_prefixes & PREFIX_DATA) != 0 9866 && !ins.need_vex) 9867 ins.all_prefixes[ins.last_data_prefix] = 0; 9868 9869 /* Print the extra ins.prefixes. */ 9870 prefix_length = 0; 9871 for (i = 0; i < (int) ARRAY_SIZE (ins.all_prefixes); i++) 9872 if (ins.all_prefixes[i]) 9873 { 9874 const char *name = prefix_name (ins.address_mode, ins.all_prefixes[i], 9875 orig_sizeflag); 9876 9877 if (name == NULL) 9878 abort (); 9879 prefix_length += strlen (name) + 1; 9880 if (ins.all_prefixes[i] == REX2_OPCODE) 9881 i386_dis_printf (info, dis_style_mnemonic, "{%s 0x%x} ", name, 9882 (unsigned int) ins.rex2_payload); 9883 else 9884 i386_dis_printf (info, dis_style_mnemonic, "%s ", name); 9885 } 9886 9887 /* Check maximum code length. */ 9888 if ((ins.codep - ins.start_codep) > MAX_CODE_LENGTH) 9889 { 9890 i386_dis_printf (info, dis_style_text, "(bad)"); 9891 ret = MAX_CODE_LENGTH; 9892 goto out; 9893 } 9894 9895 /* Calculate the number of operands this instruction has. */ 9896 op_count = 0; 9897 for (i = 0; i < MAX_OPERANDS; ++i) 9898 if (*ins.op_out[i] != '\0') 9899 ++op_count; 9900 9901 /* Calculate the number of spaces to print after the mnemonic. */ 9902 ins.obufp = ins.mnemonicendp; 9903 if (op_count > 0) 9904 { 9905 i = strlen (ins.obuf) + prefix_length; 9906 if (i < 7) 9907 i = 7 - i; 9908 else 9909 i = 1; 9910 } 9911 else 9912 i = 0; 9913 9914 /* Print the instruction mnemonic along with any trailing whitespace. */ 9915 i386_dis_printf (info, dis_style_mnemonic, "%s%*s", ins.obuf, i, ""); 9916 9917 /* The enter and bound instructions are printed with operands in the same 9918 order as the intel book; everything else is printed in reverse order. */ 9919 intel_swap_2_3 = false; 9920 if (ins.intel_syntax || ins.two_source_ops) 9921 { 9922 for (i = 0; i < MAX_OPERANDS; ++i) 9923 op_txt[i] = ins.op_out[i]; 9924 9925 if (ins.intel_syntax && dp && dp->op[2].rtn == OP_Rounding 9926 && dp->op[3].rtn == OP_E && dp->op[4].rtn == NULL) 9927 { 9928 op_txt[2] = ins.op_out[3]; 9929 op_txt[3] = ins.op_out[2]; 9930 intel_swap_2_3 = true; 9931 } 9932 9933 for (i = 0; i < (MAX_OPERANDS >> 1); ++i) 9934 { 9935 bool riprel; 9936 9937 ins.op_ad = ins.op_index[i]; 9938 ins.op_index[i] = ins.op_index[MAX_OPERANDS - 1 - i]; 9939 ins.op_index[MAX_OPERANDS - 1 - i] = ins.op_ad; 9940 riprel = ins.op_riprel[i]; 9941 ins.op_riprel[i] = ins.op_riprel[MAX_OPERANDS - 1 - i]; 9942 ins.op_riprel[MAX_OPERANDS - 1 - i] = riprel; 9943 } 9944 } 9945 else 9946 { 9947 for (i = 0; i < MAX_OPERANDS; ++i) 9948 op_txt[MAX_OPERANDS - 1 - i] = ins.op_out[i]; 9949 } 9950 9951 needcomma = 0; 9952 for (i = 0; i < MAX_OPERANDS; ++i) 9953 if (*op_txt[i]) 9954 { 9955 /* In Intel syntax embedded rounding / SAE are not separate operands. 9956 Instead they're attached to the prior register operand. Simply 9957 suppress emission of the comma to achieve that effect. */ 9958 switch (i & -(ins.intel_syntax && dp)) 9959 { 9960 case 2: 9961 if (dp->op[2].rtn == OP_Rounding && !intel_swap_2_3) 9962 needcomma = 0; 9963 break; 9964 case 3: 9965 if (dp->op[3].rtn == OP_Rounding || intel_swap_2_3) 9966 needcomma = 0; 9967 break; 9968 } 9969 if (needcomma) 9970 i386_dis_printf (info, dis_style_text, ","); 9971 if (ins.op_index[i] != -1 && !ins.op_riprel[i]) 9972 { 9973 bfd_vma target = (bfd_vma) ins.op_address[ins.op_index[i]]; 9974 9975 if (ins.op_is_jump) 9976 { 9977 info->insn_info_valid = 1; 9978 info->branch_delay_insns = 0; 9979 info->data_size = 0; 9980 info->target = target; 9981 info->target2 = 0; 9982 } 9983 (*info->print_address_func) (target, info); 9984 } 9985 else 9986 i386_dis_printf (info, dis_style_text, "%s", op_txt[i]); 9987 needcomma = 1; 9988 } 9989 9990 for (i = 0; i < MAX_OPERANDS; i++) 9991 if (ins.op_index[i] != -1 && ins.op_riprel[i]) 9992 { 9993 i386_dis_printf (info, dis_style_comment_start, " # "); 9994 (*info->print_address_func) 9995 ((bfd_vma)(ins.start_pc + (ins.codep - ins.start_codep) 9996 + ins.op_address[ins.op_index[i]]), 9997 info); 9998 break; 9999 } 10000 ret = ins.codep - priv.the_buffer; 10001 out: 10002 info->private_data = NULL; 10003 return ret; 10004 } 10005 10006 /* Here for backwards compatibility. When gdb stops using 10007 print_insn_i386_att and print_insn_i386_intel these functions can 10008 disappear, and print_insn_i386 be merged into print_insn. */ 10009 int 10010 print_insn_i386_att (bfd_vma pc, disassemble_info *info) 10011 { 10012 return print_insn (pc, info, 0); 10013 } 10014 10015 int 10016 print_insn_i386_intel (bfd_vma pc, disassemble_info *info) 10017 { 10018 return print_insn (pc, info, 1); 10019 } 10020 10021 int 10022 print_insn_i386 (bfd_vma pc, disassemble_info *info) 10023 { 10024 return print_insn (pc, info, -1); 10025 } 10026 10027 static const char *float_mem[] = { 10028 /* d8 */ 10029 "fadd{s|}", 10030 "fmul{s|}", 10031 "fcom{s|}", 10032 "fcomp{s|}", 10033 "fsub{s|}", 10034 "fsubr{s|}", 10035 "fdiv{s|}", 10036 "fdivr{s|}", 10037 /* d9 */ 10038 "fld{s|}", 10039 "(bad)", 10040 "fst{s|}", 10041 "fstp{s|}", 10042 "fldenv{C|C}", 10043 "fldcw", 10044 "fNstenv{C|C}", 10045 "fNstcw", 10046 /* da */ 10047 "fiadd{l|}", 10048 "fimul{l|}", 10049 "ficom{l|}", 10050 "ficomp{l|}", 10051 "fisub{l|}", 10052 "fisubr{l|}", 10053 "fidiv{l|}", 10054 "fidivr{l|}", 10055 /* db */ 10056 "fild{l|}", 10057 "fisttp{l|}", 10058 "fist{l|}", 10059 "fistp{l|}", 10060 "(bad)", 10061 "fld{t|}", 10062 "(bad)", 10063 "fstp{t|}", 10064 /* dc */ 10065 "fadd{l|}", 10066 "fmul{l|}", 10067 "fcom{l|}", 10068 "fcomp{l|}", 10069 "fsub{l|}", 10070 "fsubr{l|}", 10071 "fdiv{l|}", 10072 "fdivr{l|}", 10073 /* dd */ 10074 "fld{l|}", 10075 "fisttp{ll|}", 10076 "fst{l||}", 10077 "fstp{l|}", 10078 "frstor{C|C}", 10079 "(bad)", 10080 "fNsave{C|C}", 10081 "fNstsw", 10082 /* de */ 10083 "fiadd{s|}", 10084 "fimul{s|}", 10085 "ficom{s|}", 10086 "ficomp{s|}", 10087 "fisub{s|}", 10088 "fisubr{s|}", 10089 "fidiv{s|}", 10090 "fidivr{s|}", 10091 /* df */ 10092 "fild{s|}", 10093 "fisttp{s|}", 10094 "fist{s|}", 10095 "fistp{s|}", 10096 "fbld", 10097 "fild{ll|}", 10098 "fbstp", 10099 "fistp{ll|}", 10100 }; 10101 10102 static const unsigned char float_mem_mode[] = { 10103 /* d8 */ 10104 d_mode, 10105 d_mode, 10106 d_mode, 10107 d_mode, 10108 d_mode, 10109 d_mode, 10110 d_mode, 10111 d_mode, 10112 /* d9 */ 10113 d_mode, 10114 0, 10115 d_mode, 10116 d_mode, 10117 0, 10118 w_mode, 10119 0, 10120 w_mode, 10121 /* da */ 10122 d_mode, 10123 d_mode, 10124 d_mode, 10125 d_mode, 10126 d_mode, 10127 d_mode, 10128 d_mode, 10129 d_mode, 10130 /* db */ 10131 d_mode, 10132 d_mode, 10133 d_mode, 10134 d_mode, 10135 0, 10136 t_mode, 10137 0, 10138 t_mode, 10139 /* dc */ 10140 q_mode, 10141 q_mode, 10142 q_mode, 10143 q_mode, 10144 q_mode, 10145 q_mode, 10146 q_mode, 10147 q_mode, 10148 /* dd */ 10149 q_mode, 10150 q_mode, 10151 q_mode, 10152 q_mode, 10153 0, 10154 0, 10155 0, 10156 w_mode, 10157 /* de */ 10158 w_mode, 10159 w_mode, 10160 w_mode, 10161 w_mode, 10162 w_mode, 10163 w_mode, 10164 w_mode, 10165 w_mode, 10166 /* df */ 10167 w_mode, 10168 w_mode, 10169 w_mode, 10170 w_mode, 10171 t_mode, 10172 q_mode, 10173 t_mode, 10174 q_mode 10175 }; 10176 10177 #define ST { OP_ST, 0 } 10178 #define STi { OP_STi, 0 } 10179 10180 #define FGRPd9_2 NULL, { { NULL, 1 } }, 0 10181 #define FGRPd9_4 NULL, { { NULL, 2 } }, 0 10182 #define FGRPd9_5 NULL, { { NULL, 3 } }, 0 10183 #define FGRPd9_6 NULL, { { NULL, 4 } }, 0 10184 #define FGRPd9_7 NULL, { { NULL, 5 } }, 0 10185 #define FGRPda_5 NULL, { { NULL, 6 } }, 0 10186 #define FGRPdb_4 NULL, { { NULL, 7 } }, 0 10187 #define FGRPde_3 NULL, { { NULL, 8 } }, 0 10188 #define FGRPdf_4 NULL, { { NULL, 9 } }, 0 10189 10190 static const struct dis386 float_reg[][8] = { 10191 /* d8 */ 10192 { 10193 { "fadd", { ST, STi }, 0 }, 10194 { "fmul", { ST, STi }, 0 }, 10195 { "fcom", { STi }, 0 }, 10196 { "fcomp", { STi }, 0 }, 10197 { "fsub", { ST, STi }, 0 }, 10198 { "fsubr", { ST, STi }, 0 }, 10199 { "fdiv", { ST, STi }, 0 }, 10200 { "fdivr", { ST, STi }, 0 }, 10201 }, 10202 /* d9 */ 10203 { 10204 { "fld", { STi }, 0 }, 10205 { "fxch", { STi }, 0 }, 10206 { FGRPd9_2 }, 10207 { Bad_Opcode }, 10208 { FGRPd9_4 }, 10209 { FGRPd9_5 }, 10210 { FGRPd9_6 }, 10211 { FGRPd9_7 }, 10212 }, 10213 /* da */ 10214 { 10215 { "fcmovb", { ST, STi }, 0 }, 10216 { "fcmove", { ST, STi }, 0 }, 10217 { "fcmovbe",{ ST, STi }, 0 }, 10218 { "fcmovu", { ST, STi }, 0 }, 10219 { Bad_Opcode }, 10220 { FGRPda_5 }, 10221 { Bad_Opcode }, 10222 { Bad_Opcode }, 10223 }, 10224 /* db */ 10225 { 10226 { "fcmovnb",{ ST, STi }, 0 }, 10227 { "fcmovne",{ ST, STi }, 0 }, 10228 { "fcmovnbe",{ ST, STi }, 0 }, 10229 { "fcmovnu",{ ST, STi }, 0 }, 10230 { FGRPdb_4 }, 10231 { "fucomi", { ST, STi }, 0 }, 10232 { "fcomi", { ST, STi }, 0 }, 10233 { Bad_Opcode }, 10234 }, 10235 /* dc */ 10236 { 10237 { "fadd", { STi, ST }, 0 }, 10238 { "fmul", { STi, ST }, 0 }, 10239 { Bad_Opcode }, 10240 { Bad_Opcode }, 10241 { "fsub{!M|r}", { STi, ST }, 0 }, 10242 { "fsub{M|}", { STi, ST }, 0 }, 10243 { "fdiv{!M|r}", { STi, ST }, 0 }, 10244 { "fdiv{M|}", { STi, ST }, 0 }, 10245 }, 10246 /* dd */ 10247 { 10248 { "ffree", { STi }, 0 }, 10249 { Bad_Opcode }, 10250 { "fst", { STi }, 0 }, 10251 { "fstp", { STi }, 0 }, 10252 { "fucom", { STi }, 0 }, 10253 { "fucomp", { STi }, 0 }, 10254 { Bad_Opcode }, 10255 { Bad_Opcode }, 10256 }, 10257 /* de */ 10258 { 10259 { "faddp", { STi, ST }, 0 }, 10260 { "fmulp", { STi, ST }, 0 }, 10261 { Bad_Opcode }, 10262 { FGRPde_3 }, 10263 { "fsub{!M|r}p", { STi, ST }, 0 }, 10264 { "fsub{M|}p", { STi, ST }, 0 }, 10265 { "fdiv{!M|r}p", { STi, ST }, 0 }, 10266 { "fdiv{M|}p", { STi, ST }, 0 }, 10267 }, 10268 /* df */ 10269 { 10270 { "ffreep", { STi }, 0 }, 10271 { Bad_Opcode }, 10272 { Bad_Opcode }, 10273 { Bad_Opcode }, 10274 { FGRPdf_4 }, 10275 { "fucomip", { ST, STi }, 0 }, 10276 { "fcomip", { ST, STi }, 0 }, 10277 { Bad_Opcode }, 10278 }, 10279 }; 10280 10281 static const char *const fgrps[][8] = { 10282 /* Bad opcode 0 */ 10283 { 10284 "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)", 10285 }, 10286 10287 /* d9_2 1 */ 10288 { 10289 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)", 10290 }, 10291 10292 /* d9_4 2 */ 10293 { 10294 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)", 10295 }, 10296 10297 /* d9_5 3 */ 10298 { 10299 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)", 10300 }, 10301 10302 /* d9_6 4 */ 10303 { 10304 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp", 10305 }, 10306 10307 /* d9_7 5 */ 10308 { 10309 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos", 10310 }, 10311 10312 /* da_5 6 */ 10313 { 10314 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)", 10315 }, 10316 10317 /* db_4 7 */ 10318 { 10319 "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit", 10320 "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)", 10321 }, 10322 10323 /* de_3 8 */ 10324 { 10325 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)", 10326 }, 10327 10328 /* df_4 9 */ 10329 { 10330 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)", 10331 }, 10332 }; 10333 10334 static void 10335 swap_operand (instr_info *ins) 10336 { 10337 ins->mnemonicendp[0] = '.'; 10338 ins->mnemonicendp[1] = 's'; 10339 ins->mnemonicendp[2] = '\0'; 10340 ins->mnemonicendp += 2; 10341 } 10342 10343 static bool 10344 dofloat (instr_info *ins, int sizeflag) 10345 { 10346 const struct dis386 *dp; 10347 unsigned char floatop = ins->codep[-1]; 10348 10349 if (ins->modrm.mod != 3) 10350 { 10351 int fp_indx = (floatop - 0xd8) * 8 + ins->modrm.reg; 10352 10353 putop (ins, float_mem[fp_indx], sizeflag); 10354 ins->obufp = ins->op_out[0]; 10355 ins->op_ad = 2; 10356 return OP_E (ins, float_mem_mode[fp_indx], sizeflag); 10357 } 10358 /* Skip mod/rm byte. */ 10359 MODRM_CHECK; 10360 ins->codep++; 10361 10362 dp = &float_reg[floatop - 0xd8][ins->modrm.reg]; 10363 if (dp->name == NULL) 10364 { 10365 putop (ins, fgrps[dp->op[0].bytemode][ins->modrm.rm], sizeflag); 10366 10367 /* Instruction fnstsw is only one with strange arg. */ 10368 if (floatop == 0xdf && ins->codep[-1] == 0xe0) 10369 strcpy (ins->op_out[0], att_names16[0] + ins->intel_syntax); 10370 } 10371 else 10372 { 10373 putop (ins, dp->name, sizeflag); 10374 10375 ins->obufp = ins->op_out[0]; 10376 ins->op_ad = 2; 10377 if (dp->op[0].rtn 10378 && !dp->op[0].rtn (ins, dp->op[0].bytemode, sizeflag)) 10379 return false; 10380 10381 ins->obufp = ins->op_out[1]; 10382 ins->op_ad = 1; 10383 if (dp->op[1].rtn 10384 && !dp->op[1].rtn (ins, dp->op[1].bytemode, sizeflag)) 10385 return false; 10386 } 10387 return true; 10388 } 10389 10390 static bool 10391 OP_ST (instr_info *ins, int bytemode ATTRIBUTE_UNUSED, 10392 int sizeflag ATTRIBUTE_UNUSED) 10393 { 10394 oappend_register (ins, "%st"); 10395 return true; 10396 } 10397 10398 static bool 10399 OP_STi (instr_info *ins, int bytemode ATTRIBUTE_UNUSED, 10400 int sizeflag ATTRIBUTE_UNUSED) 10401 { 10402 char scratch[8]; 10403 int res = snprintf (scratch, ARRAY_SIZE (scratch), "%%st(%d)", ins->modrm.rm); 10404 10405 if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch)) 10406 abort (); 10407 oappend_register (ins, scratch); 10408 return true; 10409 } 10410 10411 /* Capital letters in template are macros. */ 10412 static int 10413 putop (instr_info *ins, const char *in_template, int sizeflag) 10414 { 10415 const char *p; 10416 int alt = 0; 10417 int cond = 1; 10418 unsigned int l = 0, len = 0; 10419 char last[4]; 10420 bool evex_printed = false; 10421 10422 /* We don't want to add any prefix or suffix to (bad), so return early. */ 10423 if (!strncmp (in_template, "(bad)", 5)) 10424 { 10425 oappend (ins, "(bad)"); 10426 *ins->obufp = 0; 10427 ins->mnemonicendp = ins->obufp; 10428 return 0; 10429 } 10430 10431 for (p = in_template; *p; p++) 10432 { 10433 if (len > l) 10434 { 10435 if (l >= sizeof (last) || !ISUPPER (*p)) 10436 abort (); 10437 last[l++] = *p; 10438 continue; 10439 } 10440 switch (*p) 10441 { 10442 default: 10443 if (ins->evex_type == evex_from_legacy && !ins->vex.nd 10444 && !(ins->rex2 & 7) && !evex_printed) 10445 { 10446 oappend (ins, "{evex} "); 10447 evex_printed = true; 10448 } 10449 *ins->obufp++ = *p; 10450 break; 10451 case '%': 10452 len++; 10453 break; 10454 case '!': 10455 cond = 0; 10456 break; 10457 case '{': 10458 if (ins->intel_syntax) 10459 { 10460 while (*++p != '|') 10461 if (*p == '}' || *p == '\0') 10462 abort (); 10463 alt = 1; 10464 } 10465 break; 10466 case '|': 10467 while (*++p != '}') 10468 { 10469 if (*p == '\0') 10470 abort (); 10471 } 10472 break; 10473 case '}': 10474 alt = 0; 10475 break; 10476 case 'A': 10477 if (ins->intel_syntax) 10478 break; 10479 if ((ins->need_modrm && ins->modrm.mod != 3 && !ins->vex.nd) 10480 || (sizeflag & SUFFIX_ALWAYS)) 10481 *ins->obufp++ = 'b'; 10482 break; 10483 case 'B': 10484 if (l == 0) 10485 { 10486 case_B: 10487 if (ins->intel_syntax) 10488 break; 10489 if (sizeflag & SUFFIX_ALWAYS) 10490 *ins->obufp++ = 'b'; 10491 } 10492 else if (l == 1 && last[0] == 'L') 10493 { 10494 if (ins->address_mode == mode_64bit 10495 && !(ins->prefixes & PREFIX_ADDR)) 10496 { 10497 *ins->obufp++ = 'a'; 10498 *ins->obufp++ = 'b'; 10499 *ins->obufp++ = 's'; 10500 } 10501 10502 goto case_B; 10503 } 10504 else 10505 abort (); 10506 break; 10507 case 'C': 10508 if (ins->intel_syntax && !alt) 10509 break; 10510 if ((ins->prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS)) 10511 { 10512 if (sizeflag & DFLAG) 10513 *ins->obufp++ = ins->intel_syntax ? 'd' : 'l'; 10514 else 10515 *ins->obufp++ = ins->intel_syntax ? 'w' : 's'; 10516 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA); 10517 } 10518 break; 10519 case 'D': 10520 if (l == 1) 10521 { 10522 switch (last[0]) 10523 { 10524 case 'X': 10525 if (!ins->vex.evex || ins->vex.w) 10526 *ins->obufp++ = 'd'; 10527 else 10528 oappend (ins, "{bad}"); 10529 break; 10530 default: 10531 abort (); 10532 } 10533 break; 10534 } 10535 if (l) 10536 abort (); 10537 if (ins->intel_syntax || !(sizeflag & SUFFIX_ALWAYS)) 10538 break; 10539 USED_REX (REX_W); 10540 if (ins->modrm.mod == 3) 10541 { 10542 if (ins->rex & REX_W) 10543 *ins->obufp++ = 'q'; 10544 else 10545 { 10546 if (sizeflag & DFLAG) 10547 *ins->obufp++ = ins->intel_syntax ? 'd' : 'l'; 10548 else 10549 *ins->obufp++ = 'w'; 10550 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA); 10551 } 10552 } 10553 else 10554 *ins->obufp++ = 'w'; 10555 break; 10556 case 'E': 10557 if (l == 1) 10558 { 10559 switch (last[0]) 10560 { 10561 case 'X': 10562 if (!ins->vex.evex || ins->vex.b || ins->vex.ll >= 2 10563 || (ins->rex2 & 7) 10564 || (ins->modrm.mod == 3 && (ins->rex & REX_X)) 10565 || !ins->vex.v || ins->vex.mask_register_specifier) 10566 break; 10567 /* AVX512 extends a number of V*D insns to also have V*Q variants, 10568 merely distinguished by EVEX.W. Look for a use of the 10569 respective macro. */ 10570 if (ins->vex.w) 10571 { 10572 const char *pct = strchr (p + 1, '%'); 10573 10574 if (pct != NULL && pct[1] == 'D' && pct[2] == 'Q') 10575 break; 10576 } 10577 *ins->obufp++ = '{'; 10578 *ins->obufp++ = 'e'; 10579 *ins->obufp++ = 'v'; 10580 *ins->obufp++ = 'e'; 10581 *ins->obufp++ = 'x'; 10582 *ins->obufp++ = '}'; 10583 *ins->obufp++ = ' '; 10584 break; 10585 case 'M': 10586 if (ins->modrm.mod != 3 && !(ins->rex2 & 7)) 10587 oappend (ins, "{evex} "); 10588 evex_printed = true; 10589 break; 10590 default: 10591 abort (); 10592 } 10593 break; 10594 } 10595 /* For jcxz/jecxz */ 10596 if (ins->address_mode == mode_64bit) 10597 { 10598 if (sizeflag & AFLAG) 10599 *ins->obufp++ = 'r'; 10600 else 10601 *ins->obufp++ = 'e'; 10602 } 10603 else 10604 if (sizeflag & AFLAG) 10605 *ins->obufp++ = 'e'; 10606 ins->used_prefixes |= (ins->prefixes & PREFIX_ADDR); 10607 break; 10608 case 'F': 10609 if (l == 0) 10610 { 10611 if (ins->intel_syntax) 10612 break; 10613 if ((ins->prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS)) 10614 { 10615 if (sizeflag & AFLAG) 10616 *ins->obufp++ = ins->address_mode == mode_64bit ? 'q' : 'l'; 10617 else 10618 *ins->obufp++ = ins->address_mode == mode_64bit ? 'l' : 'w'; 10619 ins->used_prefixes |= (ins->prefixes & PREFIX_ADDR); 10620 } 10621 } 10622 else if (l == 1 && last[0] == 'C') 10623 break; 10624 else if (l == 1 && last[0] == 'N') 10625 { 10626 if (ins->vex.nf) 10627 { 10628 oappend (ins, "{nf} "); 10629 /* This bit needs to be cleared after it is consumed. */ 10630 ins->vex.nf = false; 10631 evex_printed = true; 10632 } 10633 else if (ins->evex_type == evex_from_vex && !(ins->rex2 & 7) 10634 && ins->vex.v) 10635 { 10636 oappend (ins, "{evex} "); 10637 evex_printed = true; 10638 } 10639 } 10640 else 10641 abort (); 10642 break; 10643 case 'G': 10644 if (ins->intel_syntax || (ins->obufp[-1] != 's' 10645 && !(sizeflag & SUFFIX_ALWAYS))) 10646 break; 10647 if ((ins->rex & REX_W) || (sizeflag & DFLAG)) 10648 *ins->obufp++ = 'l'; 10649 else 10650 *ins->obufp++ = 'w'; 10651 if (!(ins->rex & REX_W)) 10652 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA); 10653 break; 10654 case 'H': 10655 if (l == 0) 10656 { 10657 if (ins->intel_syntax) 10658 break; 10659 if ((ins->prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS 10660 || (ins->prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS) 10661 { 10662 ins->used_prefixes |= ins->prefixes & (PREFIX_CS | PREFIX_DS); 10663 *ins->obufp++ = ','; 10664 *ins->obufp++ = 'p'; 10665 10666 /* Set active_seg_prefix even if not set in 64-bit mode 10667 because here it is a valid branch hint. */ 10668 if (ins->prefixes & PREFIX_DS) 10669 { 10670 ins->active_seg_prefix = PREFIX_DS; 10671 *ins->obufp++ = 't'; 10672 } 10673 else 10674 { 10675 ins->active_seg_prefix = PREFIX_CS; 10676 *ins->obufp++ = 'n'; 10677 } 10678 } 10679 } 10680 else if (l == 1 && last[0] == 'X') 10681 { 10682 if (!ins->vex.w) 10683 *ins->obufp++ = 'h'; 10684 else 10685 oappend (ins, "{bad}"); 10686 } 10687 else 10688 abort (); 10689 break; 10690 case 'K': 10691 USED_REX (REX_W); 10692 if (ins->rex & REX_W) 10693 *ins->obufp++ = 'q'; 10694 else 10695 *ins->obufp++ = 'd'; 10696 break; 10697 case 'L': 10698 if (ins->intel_syntax) 10699 break; 10700 if (sizeflag & SUFFIX_ALWAYS) 10701 { 10702 if (ins->rex & REX_W) 10703 *ins->obufp++ = 'q'; 10704 else 10705 *ins->obufp++ = 'l'; 10706 } 10707 break; 10708 case 'M': 10709 if (ins->intel_mnemonic != cond) 10710 *ins->obufp++ = 'r'; 10711 break; 10712 case 'N': 10713 if ((ins->prefixes & PREFIX_FWAIT) == 0) 10714 *ins->obufp++ = 'n'; 10715 else 10716 ins->used_prefixes |= PREFIX_FWAIT; 10717 break; 10718 case 'O': 10719 USED_REX (REX_W); 10720 if (ins->rex & REX_W) 10721 *ins->obufp++ = 'o'; 10722 else if (ins->intel_syntax && (sizeflag & DFLAG)) 10723 *ins->obufp++ = 'q'; 10724 else 10725 *ins->obufp++ = 'd'; 10726 if (!(ins->rex & REX_W)) 10727 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA); 10728 break; 10729 case '@': 10730 if (ins->address_mode == mode_64bit 10731 && (ins->isa64 == intel64 || (ins->rex & REX_W) 10732 || !(ins->prefixes & PREFIX_DATA))) 10733 { 10734 if (sizeflag & SUFFIX_ALWAYS) 10735 *ins->obufp++ = 'q'; 10736 break; 10737 } 10738 /* Fall through. */ 10739 case 'P': 10740 if (l == 0) 10741 { 10742 if (!cond && ins->last_rex2_prefix >= 0 && (ins->rex & REX_W)) 10743 { 10744 /* For pushp and popp, p is printed and do not print {rex2} 10745 for them. */ 10746 *ins->obufp++ = 'p'; 10747 ins->rex2 |= REX2_SPECIAL; 10748 break; 10749 } 10750 10751 /* For "!P" print nothing else in Intel syntax. */ 10752 if (!cond && ins->intel_syntax) 10753 break; 10754 10755 if ((ins->modrm.mod == 3 || !cond) 10756 && !(sizeflag & SUFFIX_ALWAYS)) 10757 break; 10758 /* Fall through. */ 10759 case 'T': 10760 if ((!(ins->rex & REX_W) && (ins->prefixes & PREFIX_DATA)) 10761 || ((sizeflag & SUFFIX_ALWAYS) 10762 && ins->address_mode != mode_64bit)) 10763 { 10764 *ins->obufp++ = (sizeflag & DFLAG) 10765 ? ins->intel_syntax ? 'd' : 'l' : 'w'; 10766 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA); 10767 } 10768 else if (sizeflag & SUFFIX_ALWAYS) 10769 *ins->obufp++ = 'q'; 10770 } 10771 else if (l == 1 && last[0] == 'L') 10772 { 10773 if ((ins->prefixes & PREFIX_DATA) 10774 || (ins->rex & REX_W) 10775 || (sizeflag & SUFFIX_ALWAYS)) 10776 { 10777 USED_REX (REX_W); 10778 if (ins->rex & REX_W) 10779 *ins->obufp++ = 'q'; 10780 else 10781 { 10782 if (sizeflag & DFLAG) 10783 *ins->obufp++ = ins->intel_syntax ? 'd' : 'l'; 10784 else 10785 *ins->obufp++ = 'w'; 10786 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA); 10787 } 10788 } 10789 } 10790 else 10791 abort (); 10792 break; 10793 case 'Q': 10794 if (l == 0) 10795 { 10796 if (ins->intel_syntax && !alt) 10797 break; 10798 USED_REX (REX_W); 10799 if ((ins->need_modrm && ins->modrm.mod != 3 && !ins->vex.nd) 10800 || (sizeflag & SUFFIX_ALWAYS)) 10801 { 10802 if (ins->rex & REX_W) 10803 *ins->obufp++ = 'q'; 10804 else 10805 { 10806 if (sizeflag & DFLAG) 10807 *ins->obufp++ = ins->intel_syntax ? 'd' : 'l'; 10808 else 10809 *ins->obufp++ = 'w'; 10810 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA); 10811 } 10812 } 10813 } 10814 else if (l == 1 && last[0] == 'D') 10815 *ins->obufp++ = ins->vex.w ? 'q' : 'd'; 10816 else if (l == 1 && last[0] == 'L') 10817 { 10818 if (cond ? ins->modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS) 10819 : ins->address_mode != mode_64bit) 10820 break; 10821 if ((ins->rex & REX_W)) 10822 { 10823 USED_REX (REX_W); 10824 *ins->obufp++ = 'q'; 10825 } 10826 else if ((ins->address_mode == mode_64bit && cond) 10827 || (sizeflag & SUFFIX_ALWAYS)) 10828 *ins->obufp++ = ins->intel_syntax? 'd' : 'l'; 10829 } 10830 else 10831 abort (); 10832 break; 10833 case 'R': 10834 USED_REX (REX_W); 10835 if (ins->rex & REX_W) 10836 *ins->obufp++ = 'q'; 10837 else if (sizeflag & DFLAG) 10838 { 10839 if (ins->intel_syntax) 10840 *ins->obufp++ = 'd'; 10841 else 10842 *ins->obufp++ = 'l'; 10843 } 10844 else 10845 *ins->obufp++ = 'w'; 10846 if (ins->intel_syntax && !p[1] 10847 && ((ins->rex & REX_W) || (sizeflag & DFLAG))) 10848 *ins->obufp++ = 'e'; 10849 if (!(ins->rex & REX_W)) 10850 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA); 10851 break; 10852 case 'S': 10853 if (l == 0) 10854 { 10855 case_S: 10856 if (ins->intel_syntax) 10857 break; 10858 if (sizeflag & SUFFIX_ALWAYS) 10859 { 10860 if (ins->rex & REX_W) 10861 *ins->obufp++ = 'q'; 10862 else 10863 { 10864 if (sizeflag & DFLAG) 10865 *ins->obufp++ = 'l'; 10866 else 10867 *ins->obufp++ = 'w'; 10868 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA); 10869 } 10870 } 10871 break; 10872 } 10873 if (l != 1) 10874 abort (); 10875 switch (last[0]) 10876 { 10877 case 'L': 10878 if (ins->address_mode == mode_64bit 10879 && !(ins->prefixes & PREFIX_ADDR)) 10880 { 10881 *ins->obufp++ = 'a'; 10882 *ins->obufp++ = 'b'; 10883 *ins->obufp++ = 's'; 10884 } 10885 10886 goto case_S; 10887 case 'X': 10888 if (!ins->vex.evex || !ins->vex.w) 10889 *ins->obufp++ = 's'; 10890 else 10891 oappend (ins, "{bad}"); 10892 break; 10893 default: 10894 abort (); 10895 } 10896 break; 10897 case 'U': 10898 if (l == 1 && (last[0] == 'Z')) 10899 { 10900 /* Although IMUL/SETcc does not support NDD, the EVEX.ND bit is 10901 used to control whether its destination register has its upper 10902 bits zeroed. */ 10903 if (ins->vex.nd) 10904 oappend (ins, "zu"); 10905 } 10906 else 10907 abort (); 10908 break; 10909 case 'V': 10910 if (l == 0) 10911 { 10912 if (ins->need_vex) 10913 *ins->obufp++ = 'v'; 10914 } 10915 else if (l == 1) 10916 { 10917 switch (last[0]) 10918 { 10919 case 'X': 10920 if (ins->vex.evex) 10921 break; 10922 *ins->obufp++ = '{'; 10923 *ins->obufp++ = 'v'; 10924 *ins->obufp++ = 'e'; 10925 *ins->obufp++ = 'x'; 10926 *ins->obufp++ = '}'; 10927 *ins->obufp++ = ' '; 10928 break; 10929 case 'L': 10930 if (ins->rex & REX_W) 10931 { 10932 *ins->obufp++ = 'a'; 10933 *ins->obufp++ = 'b'; 10934 *ins->obufp++ = 's'; 10935 } 10936 goto case_S; 10937 default: 10938 abort (); 10939 } 10940 } 10941 else 10942 abort (); 10943 break; 10944 case 'W': 10945 if (l == 0) 10946 { 10947 /* operand size flag for cwtl, cbtw */ 10948 USED_REX (REX_W); 10949 if (ins->rex & REX_W) 10950 { 10951 if (ins->intel_syntax) 10952 *ins->obufp++ = 'd'; 10953 else 10954 *ins->obufp++ = 'l'; 10955 } 10956 else if (sizeflag & DFLAG) 10957 *ins->obufp++ = 'w'; 10958 else 10959 *ins->obufp++ = 'b'; 10960 if (!(ins->rex & REX_W)) 10961 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA); 10962 } 10963 else if (l == 1) 10964 { 10965 if (!ins->need_vex) 10966 abort (); 10967 if (last[0] == 'X') 10968 *ins->obufp++ = ins->vex.w ? 'd': 's'; 10969 else if (last[0] == 'B') 10970 *ins->obufp++ = ins->vex.w ? 'w': 'b'; 10971 else 10972 abort (); 10973 } 10974 else 10975 abort (); 10976 break; 10977 case 'X': 10978 if (l != 0) 10979 abort (); 10980 if (ins->need_vex 10981 ? ins->vex.prefix == DATA_PREFIX_OPCODE 10982 : ins->prefixes & PREFIX_DATA) 10983 { 10984 *ins->obufp++ = 'd'; 10985 ins->used_prefixes |= PREFIX_DATA; 10986 } 10987 else 10988 *ins->obufp++ = 's'; 10989 break; 10990 case 'Y': 10991 if (l == 0) 10992 { 10993 if (ins->vex.mask_register_specifier) 10994 ins->illegal_masking = true; 10995 } 10996 else if (l == 1 && last[0] == 'X') 10997 { 10998 if (!ins->need_vex) 10999 break; 11000 if (ins->intel_syntax 11001 || ((ins->modrm.mod == 3 || ins->vex.b) 11002 && !(sizeflag & SUFFIX_ALWAYS))) 11003 break; 11004 switch (ins->vex.length) 11005 { 11006 case 128: 11007 *ins->obufp++ = 'x'; 11008 break; 11009 case 256: 11010 *ins->obufp++ = 'y'; 11011 break; 11012 case 512: 11013 if (!ins->vex.evex) 11014 default: 11015 abort (); 11016 } 11017 } 11018 else 11019 abort (); 11020 break; 11021 case 'Z': 11022 if (l == 0) 11023 { 11024 /* These insns ignore ModR/M.mod: Force it to 3 for OP_E(). */ 11025 ins->modrm.mod = 3; 11026 if (!ins->intel_syntax && (sizeflag & SUFFIX_ALWAYS)) 11027 *ins->obufp++ = ins->address_mode == mode_64bit ? 'q' : 'l'; 11028 } 11029 else if (l == 1 && last[0] == 'X') 11030 { 11031 if (!ins->vex.evex) 11032 abort (); 11033 if (ins->intel_syntax 11034 || ((ins->modrm.mod == 3 || ins->vex.b) 11035 && !(sizeflag & SUFFIX_ALWAYS))) 11036 break; 11037 switch (ins->vex.length) 11038 { 11039 case 128: 11040 *ins->obufp++ = 'x'; 11041 break; 11042 case 256: 11043 *ins->obufp++ = 'y'; 11044 break; 11045 case 512: 11046 *ins->obufp++ = 'z'; 11047 break; 11048 default: 11049 abort (); 11050 } 11051 } 11052 else 11053 abort (); 11054 break; 11055 case '^': 11056 if (ins->intel_syntax) 11057 break; 11058 if (ins->isa64 == intel64 && (ins->rex & REX_W)) 11059 { 11060 USED_REX (REX_W); 11061 *ins->obufp++ = 'q'; 11062 break; 11063 } 11064 if ((ins->prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS)) 11065 { 11066 if (sizeflag & DFLAG) 11067 *ins->obufp++ = 'l'; 11068 else 11069 *ins->obufp++ = 'w'; 11070 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA); 11071 } 11072 break; 11073 } 11074 11075 if (len == l) 11076 len = l = 0; 11077 } 11078 *ins->obufp = 0; 11079 ins->mnemonicendp = ins->obufp; 11080 return 0; 11081 } 11082 11083 /* Add a style marker to *INS->obufp that encodes STYLE. This assumes that 11084 the buffer pointed to by INS->obufp has space. A style marker is made 11085 from the STYLE_MARKER_CHAR followed by STYLE converted to a single hex 11086 digit, followed by another STYLE_MARKER_CHAR. This function assumes 11087 that the number of styles is not greater than 16. */ 11088 11089 static void 11090 oappend_insert_style (instr_info *ins, enum disassembler_style style) 11091 { 11092 unsigned num = (unsigned) style; 11093 11094 /* We currently assume that STYLE can be encoded as a single hex 11095 character. If more styles are added then this might start to fail, 11096 and we'll need to expand this code. */ 11097 if (num > 0xf) 11098 abort (); 11099 11100 *ins->obufp++ = STYLE_MARKER_CHAR; 11101 *ins->obufp++ = (num < 10 ? ('0' + num) 11102 : ((num < 16) ? ('a' + (num - 10)) : '0')); 11103 *ins->obufp++ = STYLE_MARKER_CHAR; 11104 11105 /* This final null character is not strictly necessary, after inserting a 11106 style marker we should always be inserting some additional content. 11107 However, having the buffer null terminated doesn't cost much, and make 11108 it easier to debug what's going on. Also, if we do ever forget to add 11109 any additional content after this style marker, then the buffer will 11110 still be well formed. */ 11111 *ins->obufp = '\0'; 11112 } 11113 11114 static void 11115 oappend_with_style (instr_info *ins, const char *s, 11116 enum disassembler_style style) 11117 { 11118 oappend_insert_style (ins, style); 11119 ins->obufp = stpcpy (ins->obufp, s); 11120 } 11121 11122 /* Add a single character C to the buffer pointer to by INS->obufp, marking 11123 the style for the character as STYLE. */ 11124 11125 static void 11126 oappend_char_with_style (instr_info *ins, const char c, 11127 enum disassembler_style style) 11128 { 11129 oappend_insert_style (ins, style); 11130 *ins->obufp++ = c; 11131 *ins->obufp = '\0'; 11132 } 11133 11134 /* Like oappend_char_with_style, but always uses dis_style_text. */ 11135 11136 static void 11137 oappend_char (instr_info *ins, const char c) 11138 { 11139 oappend_char_with_style (ins, c, dis_style_text); 11140 } 11141 11142 static void 11143 append_seg (instr_info *ins) 11144 { 11145 /* Only print the active segment register. */ 11146 if (!ins->active_seg_prefix) 11147 return; 11148 11149 ins->used_prefixes |= ins->active_seg_prefix; 11150 switch (ins->active_seg_prefix) 11151 { 11152 case PREFIX_CS: 11153 oappend_register (ins, att_names_seg[1]); 11154 break; 11155 case PREFIX_DS: 11156 oappend_register (ins, att_names_seg[3]); 11157 break; 11158 case PREFIX_SS: 11159 oappend_register (ins, att_names_seg[2]); 11160 break; 11161 case PREFIX_ES: 11162 oappend_register (ins, att_names_seg[0]); 11163 break; 11164 case PREFIX_FS: 11165 oappend_register (ins, att_names_seg[4]); 11166 break; 11167 case PREFIX_GS: 11168 oappend_register (ins, att_names_seg[5]); 11169 break; 11170 default: 11171 break; 11172 } 11173 oappend_char (ins, ':'); 11174 } 11175 11176 static void 11177 print_operand_value (instr_info *ins, bfd_vma disp, 11178 enum disassembler_style style) 11179 { 11180 char tmp[30]; 11181 11182 if (ins->address_mode != mode_64bit) 11183 disp &= 0xffffffff; 11184 sprintf (tmp, "0x%" PRIx64, (uint64_t) disp); 11185 oappend_with_style (ins, tmp, style); 11186 } 11187 11188 /* Like oappend, but called for immediate operands. */ 11189 11190 static void 11191 oappend_immediate (instr_info *ins, bfd_vma imm) 11192 { 11193 if (!ins->intel_syntax) 11194 oappend_char_with_style (ins, '$', dis_style_immediate); 11195 print_operand_value (ins, imm, dis_style_immediate); 11196 } 11197 11198 /* Put DISP in BUF as signed hex number. */ 11199 11200 static void 11201 print_displacement (instr_info *ins, bfd_signed_vma val) 11202 { 11203 char tmp[30]; 11204 11205 if (val < 0) 11206 { 11207 oappend_char_with_style (ins, '-', dis_style_address_offset); 11208 val = (bfd_vma) 0 - val; 11209 11210 /* Check for possible overflow. */ 11211 if (val < 0) 11212 { 11213 switch (ins->address_mode) 11214 { 11215 case mode_64bit: 11216 oappend_with_style (ins, "0x8000000000000000", 11217 dis_style_address_offset); 11218 break; 11219 case mode_32bit: 11220 oappend_with_style (ins, "0x80000000", 11221 dis_style_address_offset); 11222 break; 11223 case mode_16bit: 11224 oappend_with_style (ins, "0x8000", 11225 dis_style_address_offset); 11226 break; 11227 } 11228 return; 11229 } 11230 } 11231 11232 sprintf (tmp, "0x%" PRIx64, (int64_t) val); 11233 oappend_with_style (ins, tmp, dis_style_address_offset); 11234 } 11235 11236 static void 11237 intel_operand_size (instr_info *ins, int bytemode, int sizeflag) 11238 { 11239 /* Check if there is a broadcast, when evex.b is not treated as evex.nd. */ 11240 if (ins->vex.b && ins->evex_type == evex_default) 11241 { 11242 if (!ins->vex.no_broadcast) 11243 switch (bytemode) 11244 { 11245 case x_mode: 11246 case evex_half_bcst_xmmq_mode: 11247 if (ins->vex.w) 11248 oappend (ins, "QWORD BCST "); 11249 else 11250 oappend (ins, "DWORD BCST "); 11251 break; 11252 case xh_mode: 11253 case evex_half_bcst_xmmqh_mode: 11254 case evex_half_bcst_xmmqdh_mode: 11255 oappend (ins, "WORD BCST "); 11256 break; 11257 default: 11258 ins->vex.no_broadcast = true; 11259 break; 11260 } 11261 return; 11262 } 11263 switch (bytemode) 11264 { 11265 case b_mode: 11266 case b_swap_mode: 11267 case db_mode: 11268 oappend (ins, "BYTE PTR "); 11269 break; 11270 case w_mode: 11271 case w_swap_mode: 11272 case dw_mode: 11273 oappend (ins, "WORD PTR "); 11274 break; 11275 case indir_v_mode: 11276 if (ins->address_mode == mode_64bit && ins->isa64 == intel64) 11277 { 11278 oappend (ins, "QWORD PTR "); 11279 break; 11280 } 11281 /* Fall through. */ 11282 case stack_v_mode: 11283 if (ins->address_mode == mode_64bit && ((sizeflag & DFLAG) 11284 || (ins->rex & REX_W))) 11285 { 11286 oappend (ins, "QWORD PTR "); 11287 break; 11288 } 11289 /* Fall through. */ 11290 case v_mode: 11291 case v_swap_mode: 11292 case dq_mode: 11293 USED_REX (REX_W); 11294 if (ins->rex & REX_W) 11295 oappend (ins, "QWORD PTR "); 11296 else if (bytemode == dq_mode) 11297 oappend (ins, "DWORD PTR "); 11298 else 11299 { 11300 if (sizeflag & DFLAG) 11301 oappend (ins, "DWORD PTR "); 11302 else 11303 oappend (ins, "WORD PTR "); 11304 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA); 11305 } 11306 break; 11307 case z_mode: 11308 if ((ins->rex & REX_W) || (sizeflag & DFLAG)) 11309 *ins->obufp++ = 'D'; 11310 oappend (ins, "WORD PTR "); 11311 if (!(ins->rex & REX_W)) 11312 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA); 11313 break; 11314 case a_mode: 11315 if (sizeflag & DFLAG) 11316 oappend (ins, "QWORD PTR "); 11317 else 11318 oappend (ins, "DWORD PTR "); 11319 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA); 11320 break; 11321 case movsxd_mode: 11322 if (!(sizeflag & DFLAG) && ins->isa64 == intel64) 11323 oappend (ins, "WORD PTR "); 11324 else 11325 oappend (ins, "DWORD PTR "); 11326 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA); 11327 break; 11328 case d_mode: 11329 case d_swap_mode: 11330 oappend (ins, "DWORD PTR "); 11331 break; 11332 case q_mode: 11333 case q_swap_mode: 11334 oappend (ins, "QWORD PTR "); 11335 break; 11336 case m_mode: 11337 if (ins->address_mode == mode_64bit) 11338 oappend (ins, "QWORD PTR "); 11339 else 11340 oappend (ins, "DWORD PTR "); 11341 break; 11342 case f_mode: 11343 if (sizeflag & DFLAG) 11344 oappend (ins, "FWORD PTR "); 11345 else 11346 oappend (ins, "DWORD PTR "); 11347 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA); 11348 break; 11349 case t_mode: 11350 oappend (ins, "TBYTE PTR "); 11351 break; 11352 case x_mode: 11353 case xh_mode: 11354 case x_swap_mode: 11355 case evex_x_gscat_mode: 11356 case evex_x_nobcst_mode: 11357 case bw_unit_mode: 11358 if (ins->need_vex) 11359 { 11360 switch (ins->vex.length) 11361 { 11362 case 128: 11363 oappend (ins, "XMMWORD PTR "); 11364 break; 11365 case 256: 11366 oappend (ins, "YMMWORD PTR "); 11367 break; 11368 case 512: 11369 oappend (ins, "ZMMWORD PTR "); 11370 break; 11371 default: 11372 abort (); 11373 } 11374 } 11375 else 11376 oappend (ins, "XMMWORD PTR "); 11377 break; 11378 case xmm_mode: 11379 oappend (ins, "XMMWORD PTR "); 11380 break; 11381 case ymm_mode: 11382 oappend (ins, "YMMWORD PTR "); 11383 break; 11384 case xmmq_mode: 11385 case evex_half_bcst_xmmqh_mode: 11386 case evex_half_bcst_xmmq_mode: 11387 switch (ins->vex.length) 11388 { 11389 case 0: 11390 case 128: 11391 oappend (ins, "QWORD PTR "); 11392 break; 11393 case 256: 11394 oappend (ins, "XMMWORD PTR "); 11395 break; 11396 case 512: 11397 oappend (ins, "YMMWORD PTR "); 11398 break; 11399 default: 11400 abort (); 11401 } 11402 break; 11403 case xmmdw_mode: 11404 if (!ins->need_vex) 11405 abort (); 11406 11407 switch (ins->vex.length) 11408 { 11409 case 128: 11410 oappend (ins, "WORD PTR "); 11411 break; 11412 case 256: 11413 oappend (ins, "DWORD PTR "); 11414 break; 11415 case 512: 11416 oappend (ins, "QWORD PTR "); 11417 break; 11418 default: 11419 abort (); 11420 } 11421 break; 11422 case xmmqd_mode: 11423 case evex_half_bcst_xmmqdh_mode: 11424 if (!ins->need_vex) 11425 abort (); 11426 11427 switch (ins->vex.length) 11428 { 11429 case 128: 11430 oappend (ins, "DWORD PTR "); 11431 break; 11432 case 256: 11433 oappend (ins, "QWORD PTR "); 11434 break; 11435 case 512: 11436 oappend (ins, "XMMWORD PTR "); 11437 break; 11438 default: 11439 abort (); 11440 } 11441 break; 11442 case ymmq_mode: 11443 if (!ins->need_vex) 11444 abort (); 11445 11446 switch (ins->vex.length) 11447 { 11448 case 128: 11449 oappend (ins, "QWORD PTR "); 11450 break; 11451 case 256: 11452 oappend (ins, "YMMWORD PTR "); 11453 break; 11454 case 512: 11455 oappend (ins, "ZMMWORD PTR "); 11456 break; 11457 default: 11458 abort (); 11459 } 11460 break; 11461 case o_mode: 11462 oappend (ins, "OWORD PTR "); 11463 break; 11464 case vex_vsib_d_w_dq_mode: 11465 case vex_vsib_q_w_dq_mode: 11466 if (!ins->need_vex) 11467 abort (); 11468 if (ins->vex.w) 11469 oappend (ins, "QWORD PTR "); 11470 else 11471 oappend (ins, "DWORD PTR "); 11472 break; 11473 case mask_bd_mode: 11474 if (!ins->need_vex || ins->vex.length != 128) 11475 abort (); 11476 if (ins->vex.w) 11477 oappend (ins, "DWORD PTR "); 11478 else 11479 oappend (ins, "BYTE PTR "); 11480 break; 11481 case mask_mode: 11482 if (!ins->need_vex) 11483 abort (); 11484 if (ins->vex.w) 11485 oappend (ins, "QWORD PTR "); 11486 else 11487 oappend (ins, "WORD PTR "); 11488 break; 11489 case v_bnd_mode: 11490 case v_bndmk_mode: 11491 default: 11492 break; 11493 } 11494 } 11495 11496 static void 11497 print_register (instr_info *ins, unsigned int reg, unsigned int rexmask, 11498 int bytemode, int sizeflag) 11499 { 11500 const char (*names)[8]; 11501 11502 /* Masking is invalid for insns with GPR destination. Set the flag uniformly, 11503 as the consumer will inspect it only for the destination operand. */ 11504 if (bytemode != mask_mode && ins->vex.mask_register_specifier) 11505 ins->illegal_masking = true; 11506 11507 USED_REX (rexmask); 11508 if (ins->rex & rexmask) 11509 reg += 8; 11510 if (ins->rex2 & rexmask) 11511 reg += 16; 11512 11513 switch (bytemode) 11514 { 11515 case b_mode: 11516 case b_swap_mode: 11517 if (reg & 4) 11518 USED_REX (0); 11519 if (ins->rex || ins->rex2) 11520 names = att_names8rex; 11521 else 11522 names = att_names8; 11523 break; 11524 case w_mode: 11525 names = att_names16; 11526 break; 11527 case d_mode: 11528 case dw_mode: 11529 case db_mode: 11530 names = att_names32; 11531 break; 11532 case q_mode: 11533 names = att_names64; 11534 break; 11535 case m_mode: 11536 case v_bnd_mode: 11537 names = ins->address_mode == mode_64bit ? att_names64 : att_names32; 11538 break; 11539 case bnd_mode: 11540 case bnd_swap_mode: 11541 if (reg > 0x3) 11542 { 11543 oappend (ins, "(bad)"); 11544 return; 11545 } 11546 names = att_names_bnd; 11547 break; 11548 case indir_v_mode: 11549 if (ins->address_mode == mode_64bit && ins->isa64 == intel64) 11550 { 11551 names = att_names64; 11552 break; 11553 } 11554 /* Fall through. */ 11555 case stack_v_mode: 11556 if (ins->address_mode == mode_64bit && ((sizeflag & DFLAG) 11557 || (ins->rex & REX_W))) 11558 { 11559 names = att_names64; 11560 break; 11561 } 11562 bytemode = v_mode; 11563 /* Fall through. */ 11564 case v_mode: 11565 case v_swap_mode: 11566 case dq_mode: 11567 USED_REX (REX_W); 11568 if (ins->rex & REX_W) 11569 names = att_names64; 11570 else if (bytemode != v_mode && bytemode != v_swap_mode) 11571 names = att_names32; 11572 else 11573 { 11574 if (sizeflag & DFLAG) 11575 names = att_names32; 11576 else 11577 names = att_names16; 11578 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA); 11579 } 11580 break; 11581 case movsxd_mode: 11582 if (!(sizeflag & DFLAG) && ins->isa64 == intel64) 11583 names = att_names16; 11584 else 11585 names = att_names32; 11586 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA); 11587 break; 11588 case va_mode: 11589 names = (ins->address_mode == mode_64bit 11590 ? att_names64 : att_names32); 11591 if (!(ins->prefixes & PREFIX_ADDR)) 11592 names = (ins->address_mode == mode_16bit 11593 ? att_names16 : names); 11594 else 11595 { 11596 /* Remove "addr16/addr32". */ 11597 ins->all_prefixes[ins->last_addr_prefix] = 0; 11598 names = (ins->address_mode != mode_32bit 11599 ? att_names32 : att_names16); 11600 ins->used_prefixes |= PREFIX_ADDR; 11601 } 11602 break; 11603 case mask_bd_mode: 11604 case mask_mode: 11605 if (reg > 0x7) 11606 { 11607 oappend (ins, "(bad)"); 11608 return; 11609 } 11610 names = att_names_mask; 11611 break; 11612 case 0: 11613 return; 11614 default: 11615 oappend (ins, INTERNAL_DISASSEMBLER_ERROR); 11616 return; 11617 } 11618 oappend_register (ins, names[reg]); 11619 } 11620 11621 static bool 11622 get8s (instr_info *ins, bfd_vma *res) 11623 { 11624 if (!fetch_code (ins->info, ins->codep + 1)) 11625 return false; 11626 *res = ((bfd_vma) *ins->codep++ ^ 0x80) - 0x80; 11627 return true; 11628 } 11629 11630 static bool 11631 get16 (instr_info *ins, bfd_vma *res) 11632 { 11633 if (!fetch_code (ins->info, ins->codep + 2)) 11634 return false; 11635 *res = *ins->codep++; 11636 *res |= (bfd_vma) *ins->codep++ << 8; 11637 return true; 11638 } 11639 11640 static bool 11641 get16s (instr_info *ins, bfd_vma *res) 11642 { 11643 if (!get16 (ins, res)) 11644 return false; 11645 *res = (*res ^ 0x8000) - 0x8000; 11646 return true; 11647 } 11648 11649 static bool 11650 get32 (instr_info *ins, bfd_vma *res) 11651 { 11652 if (!fetch_code (ins->info, ins->codep + 4)) 11653 return false; 11654 *res = *ins->codep++; 11655 *res |= (bfd_vma) *ins->codep++ << 8; 11656 *res |= (bfd_vma) *ins->codep++ << 16; 11657 *res |= (bfd_vma) *ins->codep++ << 24; 11658 return true; 11659 } 11660 11661 static bool 11662 get32s (instr_info *ins, bfd_vma *res) 11663 { 11664 if (!get32 (ins, res)) 11665 return false; 11666 11667 *res = (*res ^ ((bfd_vma) 1 << 31)) - ((bfd_vma) 1 << 31); 11668 11669 return true; 11670 } 11671 11672 static bool 11673 get64 (instr_info *ins, uint64_t *res) 11674 { 11675 unsigned int a; 11676 unsigned int b; 11677 11678 if (!fetch_code (ins->info, ins->codep + 8)) 11679 return false; 11680 a = *ins->codep++; 11681 a |= (unsigned int) *ins->codep++ << 8; 11682 a |= (unsigned int) *ins->codep++ << 16; 11683 a |= (unsigned int) *ins->codep++ << 24; 11684 b = *ins->codep++; 11685 b |= (unsigned int) *ins->codep++ << 8; 11686 b |= (unsigned int) *ins->codep++ << 16; 11687 b |= (unsigned int) *ins->codep++ << 24; 11688 *res = a + ((uint64_t) b << 32); 11689 return true; 11690 } 11691 11692 static void 11693 set_op (instr_info *ins, bfd_vma op, bool riprel) 11694 { 11695 ins->op_index[ins->op_ad] = ins->op_ad; 11696 if (ins->address_mode == mode_64bit) 11697 ins->op_address[ins->op_ad] = op; 11698 else /* Mask to get a 32-bit address. */ 11699 ins->op_address[ins->op_ad] = op & 0xffffffff; 11700 ins->op_riprel[ins->op_ad] = riprel; 11701 } 11702 11703 static bool 11704 BadOp (instr_info *ins) 11705 { 11706 /* Throw away prefixes and 1st. opcode byte. */ 11707 struct dis_private *priv = ins->info->private_data; 11708 11709 ins->codep = priv->the_buffer + ins->nr_prefixes + ins->need_vex + 1; 11710 ins->obufp = stpcpy (ins->obufp, "(bad)"); 11711 return true; 11712 } 11713 11714 static bool 11715 OP_Skip_MODRM (instr_info *ins, int bytemode ATTRIBUTE_UNUSED, 11716 int sizeflag ATTRIBUTE_UNUSED) 11717 { 11718 if (ins->modrm.mod != 3) 11719 return BadOp (ins); 11720 11721 /* Skip mod/rm byte. */ 11722 MODRM_CHECK; 11723 ins->codep++; 11724 ins->has_skipped_modrm = true; 11725 return true; 11726 } 11727 11728 static bool 11729 OP_E_memory (instr_info *ins, int bytemode, int sizeflag) 11730 { 11731 int add = (ins->rex & REX_B) ? 8 : 0; 11732 int riprel = 0; 11733 int shift; 11734 11735 add += (ins->rex2 & REX_B) ? 16 : 0; 11736 11737 /* Handles EVEX other than APX EVEX-promoted instructions. */ 11738 if (ins->vex.evex && ins->evex_type == evex_default) 11739 { 11740 11741 /* Zeroing-masking is invalid for memory destinations. Set the flag 11742 uniformly, as the consumer will inspect it only for the destination 11743 operand. */ 11744 if (ins->vex.zeroing) 11745 ins->illegal_masking = true; 11746 11747 switch (bytemode) 11748 { 11749 case dw_mode: 11750 case w_mode: 11751 case w_swap_mode: 11752 shift = 1; 11753 break; 11754 case db_mode: 11755 case b_mode: 11756 shift = 0; 11757 break; 11758 case dq_mode: 11759 if (ins->address_mode != mode_64bit) 11760 { 11761 case d_mode: 11762 case d_swap_mode: 11763 shift = 2; 11764 break; 11765 } 11766 /* fall through */ 11767 case vex_vsib_d_w_dq_mode: 11768 case vex_vsib_q_w_dq_mode: 11769 case evex_x_gscat_mode: 11770 shift = ins->vex.w ? 3 : 2; 11771 break; 11772 case xh_mode: 11773 case evex_half_bcst_xmmqh_mode: 11774 case evex_half_bcst_xmmqdh_mode: 11775 if (ins->vex.b) 11776 { 11777 shift = ins->vex.w ? 2 : 1; 11778 break; 11779 } 11780 /* Fall through. */ 11781 case x_mode: 11782 case evex_half_bcst_xmmq_mode: 11783 if (ins->vex.b) 11784 { 11785 shift = ins->vex.w ? 3 : 2; 11786 break; 11787 } 11788 /* Fall through. */ 11789 case xmmqd_mode: 11790 case xmmdw_mode: 11791 case xmmq_mode: 11792 case ymmq_mode: 11793 case evex_x_nobcst_mode: 11794 case x_swap_mode: 11795 switch (ins->vex.length) 11796 { 11797 case 128: 11798 shift = 4; 11799 break; 11800 case 256: 11801 shift = 5; 11802 break; 11803 case 512: 11804 shift = 6; 11805 break; 11806 default: 11807 abort (); 11808 } 11809 /* Make necessary corrections to shift for modes that need it. */ 11810 if (bytemode == xmmq_mode 11811 || bytemode == evex_half_bcst_xmmqh_mode 11812 || bytemode == evex_half_bcst_xmmq_mode 11813 || (bytemode == ymmq_mode && ins->vex.length == 128)) 11814 shift -= 1; 11815 else if (bytemode == xmmqd_mode 11816 || bytemode == evex_half_bcst_xmmqdh_mode) 11817 shift -= 2; 11818 else if (bytemode == xmmdw_mode) 11819 shift -= 3; 11820 break; 11821 case ymm_mode: 11822 shift = 5; 11823 break; 11824 case xmm_mode: 11825 shift = 4; 11826 break; 11827 case q_mode: 11828 case q_swap_mode: 11829 shift = 3; 11830 break; 11831 case bw_unit_mode: 11832 shift = ins->vex.w ? 1 : 0; 11833 break; 11834 default: 11835 abort (); 11836 } 11837 } 11838 else 11839 shift = 0; 11840 11841 USED_REX (REX_B); 11842 if (ins->intel_syntax) 11843 intel_operand_size (ins, bytemode, sizeflag); 11844 append_seg (ins); 11845 11846 if ((sizeflag & AFLAG) || ins->address_mode == mode_64bit) 11847 { 11848 /* 32/64 bit address mode */ 11849 bfd_vma disp = 0; 11850 int havedisp; 11851 int havebase; 11852 int needindex; 11853 int needaddr32; 11854 int base, rbase; 11855 int vindex = 0; 11856 int scale = 0; 11857 int addr32flag = !((sizeflag & AFLAG) 11858 || bytemode == v_bnd_mode 11859 || bytemode == v_bndmk_mode 11860 || bytemode == bnd_mode 11861 || bytemode == bnd_swap_mode); 11862 bool check_gather = false; 11863 const char (*indexes)[8] = NULL; 11864 11865 havebase = 1; 11866 base = ins->modrm.rm; 11867 11868 if (base == 4) 11869 { 11870 vindex = ins->sib.index; 11871 USED_REX (REX_X); 11872 if (ins->rex & REX_X) 11873 vindex += 8; 11874 switch (bytemode) 11875 { 11876 case vex_vsib_d_w_dq_mode: 11877 case vex_vsib_q_w_dq_mode: 11878 if (!ins->need_vex) 11879 abort (); 11880 if (ins->vex.evex) 11881 { 11882 /* S/G EVEX insns require EVEX.X4 not to be set. */ 11883 if (ins->rex2 & REX_X) 11884 { 11885 oappend (ins, "(bad)"); 11886 return true; 11887 } 11888 11889 if (!ins->vex.v) 11890 vindex += 16; 11891 check_gather = ins->obufp == ins->op_out[1]; 11892 } 11893 11894 switch (ins->vex.length) 11895 { 11896 case 128: 11897 indexes = att_names_xmm; 11898 break; 11899 case 256: 11900 if (!ins->vex.w 11901 || bytemode == vex_vsib_q_w_dq_mode) 11902 indexes = att_names_ymm; 11903 else 11904 indexes = att_names_xmm; 11905 break; 11906 case 512: 11907 if (!ins->vex.w 11908 || bytemode == vex_vsib_q_w_dq_mode) 11909 indexes = att_names_zmm; 11910 else 11911 indexes = att_names_ymm; 11912 break; 11913 default: 11914 abort (); 11915 } 11916 break; 11917 default: 11918 if (ins->rex2 & REX_X) 11919 vindex += 16; 11920 11921 if (vindex != 4) 11922 indexes = ins->address_mode == mode_64bit && !addr32flag 11923 ? att_names64 : att_names32; 11924 break; 11925 } 11926 scale = ins->sib.scale; 11927 base = ins->sib.base; 11928 ins->codep++; 11929 } 11930 else 11931 { 11932 /* Check for mandatory SIB. */ 11933 if (bytemode == vex_vsib_d_w_dq_mode 11934 || bytemode == vex_vsib_q_w_dq_mode 11935 || bytemode == vex_sibmem_mode) 11936 { 11937 oappend (ins, "(bad)"); 11938 return true; 11939 } 11940 } 11941 rbase = base + add; 11942 11943 switch (ins->modrm.mod) 11944 { 11945 case 0: 11946 if (base == 5) 11947 { 11948 havebase = 0; 11949 if (ins->address_mode == mode_64bit && !ins->has_sib) 11950 riprel = 1; 11951 if (!get32s (ins, &disp)) 11952 return false; 11953 if (riprel && bytemode == v_bndmk_mode) 11954 { 11955 oappend (ins, "(bad)"); 11956 return true; 11957 } 11958 } 11959 break; 11960 case 1: 11961 if (!get8s (ins, &disp)) 11962 return false; 11963 if (ins->vex.evex && shift > 0) 11964 disp <<= shift; 11965 break; 11966 case 2: 11967 if (!get32s (ins, &disp)) 11968 return false; 11969 break; 11970 } 11971 11972 needindex = 0; 11973 needaddr32 = 0; 11974 if (ins->has_sib 11975 && !havebase 11976 && !indexes 11977 && ins->address_mode != mode_16bit) 11978 { 11979 if (ins->address_mode == mode_64bit) 11980 { 11981 if (addr32flag) 11982 { 11983 /* Without base nor index registers, zero-extend the 11984 lower 32-bit displacement to 64 bits. */ 11985 disp &= 0xffffffff; 11986 needindex = 1; 11987 } 11988 needaddr32 = 1; 11989 } 11990 else 11991 { 11992 /* In 32-bit mode, we need index register to tell [offset] 11993 from [eiz*1 + offset]. */ 11994 needindex = 1; 11995 } 11996 } 11997 11998 havedisp = (havebase 11999 || needindex 12000 || (ins->has_sib && (indexes || scale != 0))); 12001 12002 if (!ins->intel_syntax) 12003 if (ins->modrm.mod != 0 || base == 5) 12004 { 12005 if (havedisp || riprel) 12006 print_displacement (ins, disp); 12007 else 12008 print_operand_value (ins, disp, dis_style_address_offset); 12009 if (riprel) 12010 { 12011 set_op (ins, disp, true); 12012 oappend_char (ins, '('); 12013 oappend_with_style (ins, !addr32flag ? "%rip" : "%eip", 12014 dis_style_register); 12015 oappend_char (ins, ')'); 12016 } 12017 } 12018 12019 if ((havebase || indexes || needindex || needaddr32 || riprel) 12020 && (ins->address_mode != mode_64bit 12021 || ((bytemode != v_bnd_mode) 12022 && (bytemode != v_bndmk_mode) 12023 && (bytemode != bnd_mode) 12024 && (bytemode != bnd_swap_mode)))) 12025 ins->used_prefixes |= PREFIX_ADDR; 12026 12027 if (havedisp || (ins->intel_syntax && riprel)) 12028 { 12029 oappend_char (ins, ins->open_char); 12030 if (ins->intel_syntax && riprel) 12031 { 12032 set_op (ins, disp, true); 12033 oappend_with_style (ins, !addr32flag ? "rip" : "eip", 12034 dis_style_register); 12035 } 12036 if (havebase) 12037 oappend_register 12038 (ins, 12039 (ins->address_mode == mode_64bit && !addr32flag 12040 ? att_names64 : att_names32)[rbase]); 12041 if (ins->has_sib) 12042 { 12043 /* ESP/RSP won't allow index. If base isn't ESP/RSP, 12044 print index to tell base + index from base. */ 12045 if (scale != 0 12046 || needindex 12047 || indexes 12048 || (havebase && base != ESP_REG_NUM)) 12049 { 12050 if (!ins->intel_syntax || havebase) 12051 oappend_char (ins, ins->separator_char); 12052 if (indexes) 12053 { 12054 if (ins->address_mode == mode_64bit || vindex < 16) 12055 oappend_register (ins, indexes[vindex]); 12056 else 12057 oappend (ins, "(bad)"); 12058 } 12059 else 12060 oappend_register (ins, 12061 ins->address_mode == mode_64bit 12062 && !addr32flag 12063 ? att_index64 12064 : att_index32); 12065 12066 oappend_char (ins, ins->scale_char); 12067 oappend_char_with_style (ins, '0' + (1 << scale), 12068 dis_style_immediate); 12069 } 12070 } 12071 if (ins->intel_syntax 12072 && (disp || ins->modrm.mod != 0 || base == 5)) 12073 { 12074 if (!havedisp || (bfd_signed_vma) disp >= 0) 12075 oappend_char (ins, '+'); 12076 if (havedisp) 12077 print_displacement (ins, disp); 12078 else 12079 print_operand_value (ins, disp, dis_style_address_offset); 12080 } 12081 12082 oappend_char (ins, ins->close_char); 12083 12084 if (check_gather) 12085 { 12086 /* Both XMM/YMM/ZMM registers must be distinct. */ 12087 int modrm_reg = ins->modrm.reg; 12088 12089 if (ins->rex & REX_R) 12090 modrm_reg += 8; 12091 if (ins->rex2 & REX_R) 12092 modrm_reg += 16; 12093 if (vindex == modrm_reg) 12094 oappend (ins, "/(bad)"); 12095 } 12096 } 12097 else if (ins->intel_syntax) 12098 { 12099 if (ins->modrm.mod != 0 || base == 5) 12100 { 12101 if (!ins->active_seg_prefix) 12102 { 12103 oappend_register (ins, att_names_seg[ds_reg - es_reg]); 12104 oappend (ins, ":"); 12105 } 12106 print_operand_value (ins, disp, dis_style_text); 12107 } 12108 } 12109 } 12110 else if (bytemode == v_bnd_mode 12111 || bytemode == v_bndmk_mode 12112 || bytemode == bnd_mode 12113 || bytemode == bnd_swap_mode 12114 || bytemode == vex_vsib_d_w_dq_mode 12115 || bytemode == vex_vsib_q_w_dq_mode) 12116 { 12117 oappend (ins, "(bad)"); 12118 return true; 12119 } 12120 else 12121 { 12122 /* 16 bit address mode */ 12123 bfd_vma disp = 0; 12124 12125 ins->used_prefixes |= ins->prefixes & PREFIX_ADDR; 12126 switch (ins->modrm.mod) 12127 { 12128 case 0: 12129 if (ins->modrm.rm == 6) 12130 { 12131 case 2: 12132 if (!get16s (ins, &disp)) 12133 return false; 12134 } 12135 break; 12136 case 1: 12137 if (!get8s (ins, &disp)) 12138 return false; 12139 if (ins->vex.evex && shift > 0) 12140 disp <<= shift; 12141 break; 12142 } 12143 12144 if (!ins->intel_syntax) 12145 if (ins->modrm.mod != 0 || ins->modrm.rm == 6) 12146 print_displacement (ins, disp); 12147 12148 if (ins->modrm.mod != 0 || ins->modrm.rm != 6) 12149 { 12150 oappend_char (ins, ins->open_char); 12151 oappend (ins, ins->intel_syntax ? intel_index16[ins->modrm.rm] 12152 : att_index16[ins->modrm.rm]); 12153 if (ins->intel_syntax 12154 && (disp || ins->modrm.mod != 0 || ins->modrm.rm == 6)) 12155 { 12156 if ((bfd_signed_vma) disp >= 0) 12157 oappend_char (ins, '+'); 12158 print_displacement (ins, disp); 12159 } 12160 12161 oappend_char (ins, ins->close_char); 12162 } 12163 else if (ins->intel_syntax) 12164 { 12165 if (!ins->active_seg_prefix) 12166 { 12167 oappend_register (ins, att_names_seg[ds_reg - es_reg]); 12168 oappend (ins, ":"); 12169 } 12170 print_operand_value (ins, disp & 0xffff, dis_style_text); 12171 } 12172 } 12173 if (ins->vex.b && ins->evex_type == evex_default) 12174 { 12175 ins->evex_used |= EVEX_b_used; 12176 12177 /* Broadcast can only ever be valid for memory sources. */ 12178 if (ins->obufp == ins->op_out[0]) 12179 ins->vex.no_broadcast = true; 12180 12181 if (!ins->vex.no_broadcast 12182 && (!ins->intel_syntax || !(ins->evex_used & EVEX_len_used))) 12183 { 12184 if (bytemode == xh_mode) 12185 { 12186 switch (ins->vex.length) 12187 { 12188 case 128: 12189 oappend (ins, "{1to8}"); 12190 break; 12191 case 256: 12192 oappend (ins, "{1to16}"); 12193 break; 12194 case 512: 12195 oappend (ins, "{1to32}"); 12196 break; 12197 default: 12198 abort (); 12199 } 12200 } 12201 else if (bytemode == q_mode 12202 || bytemode == ymmq_mode) 12203 ins->vex.no_broadcast = true; 12204 else if (ins->vex.w 12205 || bytemode == evex_half_bcst_xmmqdh_mode 12206 || bytemode == evex_half_bcst_xmmq_mode) 12207 { 12208 switch (ins->vex.length) 12209 { 12210 case 128: 12211 oappend (ins, "{1to2}"); 12212 break; 12213 case 256: 12214 oappend (ins, "{1to4}"); 12215 break; 12216 case 512: 12217 oappend (ins, "{1to8}"); 12218 break; 12219 default: 12220 abort (); 12221 } 12222 } 12223 else if (bytemode == x_mode 12224 || bytemode == evex_half_bcst_xmmqh_mode) 12225 { 12226 switch (ins->vex.length) 12227 { 12228 case 128: 12229 oappend (ins, "{1to4}"); 12230 break; 12231 case 256: 12232 oappend (ins, "{1to8}"); 12233 break; 12234 case 512: 12235 oappend (ins, "{1to16}"); 12236 break; 12237 default: 12238 abort (); 12239 } 12240 } 12241 else 12242 ins->vex.no_broadcast = true; 12243 } 12244 if (ins->vex.no_broadcast) 12245 oappend (ins, "{bad}"); 12246 } 12247 12248 return true; 12249 } 12250 12251 static bool 12252 OP_E (instr_info *ins, int bytemode, int sizeflag) 12253 { 12254 /* Skip mod/rm byte. */ 12255 MODRM_CHECK; 12256 if (!ins->has_skipped_modrm) 12257 { 12258 ins->codep++; 12259 ins->has_skipped_modrm = true; 12260 } 12261 12262 if (ins->modrm.mod == 3) 12263 { 12264 if ((sizeflag & SUFFIX_ALWAYS) 12265 && (bytemode == b_swap_mode 12266 || bytemode == bnd_swap_mode 12267 || bytemode == v_swap_mode)) 12268 swap_operand (ins); 12269 12270 print_register (ins, ins->modrm.rm, REX_B, bytemode, sizeflag); 12271 return true; 12272 } 12273 12274 /* Masking is invalid for insns with GPR-like memory destination. Set the 12275 flag uniformly, as the consumer will inspect it only for the destination 12276 operand. */ 12277 if (ins->vex.mask_register_specifier) 12278 ins->illegal_masking = true; 12279 12280 return OP_E_memory (ins, bytemode, sizeflag); 12281 } 12282 12283 static bool 12284 OP_indirE (instr_info *ins, int bytemode, int sizeflag) 12285 { 12286 if (ins->modrm.mod == 3 && bytemode == f_mode) 12287 /* bad lcall/ljmp */ 12288 return BadOp (ins); 12289 if (!ins->intel_syntax) 12290 oappend (ins, "*"); 12291 return OP_E (ins, bytemode, sizeflag); 12292 } 12293 12294 static bool 12295 OP_G (instr_info *ins, int bytemode, int sizeflag) 12296 { 12297 print_register (ins, ins->modrm.reg, REX_R, bytemode, sizeflag); 12298 return true; 12299 } 12300 12301 static bool 12302 OP_REG (instr_info *ins, int code, int sizeflag) 12303 { 12304 const char *s; 12305 int add = 0; 12306 12307 switch (code) 12308 { 12309 case es_reg: case ss_reg: case cs_reg: 12310 case ds_reg: case fs_reg: case gs_reg: 12311 oappend_register (ins, att_names_seg[code - es_reg]); 12312 return true; 12313 } 12314 12315 USED_REX (REX_B); 12316 if (ins->rex & REX_B) 12317 add = 8; 12318 if (ins->rex2 & REX_B) 12319 add += 16; 12320 12321 switch (code) 12322 { 12323 case ax_reg: case cx_reg: case dx_reg: case bx_reg: 12324 case sp_reg: case bp_reg: case si_reg: case di_reg: 12325 s = att_names16[code - ax_reg + add]; 12326 break; 12327 case ah_reg: case ch_reg: case dh_reg: case bh_reg: 12328 USED_REX (0); 12329 /* Fall through. */ 12330 case al_reg: case cl_reg: case dl_reg: case bl_reg: 12331 if (ins->rex) 12332 s = att_names8rex[code - al_reg + add]; 12333 else 12334 s = att_names8[code - al_reg]; 12335 break; 12336 case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg: 12337 case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg: 12338 if (ins->address_mode == mode_64bit 12339 && ((sizeflag & DFLAG) || (ins->rex & REX_W))) 12340 { 12341 s = att_names64[code - rAX_reg + add]; 12342 break; 12343 } 12344 code += eAX_reg - rAX_reg; 12345 /* Fall through. */ 12346 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg: 12347 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg: 12348 USED_REX (REX_W); 12349 if (ins->rex & REX_W) 12350 s = att_names64[code - eAX_reg + add]; 12351 else 12352 { 12353 if (sizeflag & DFLAG) 12354 s = att_names32[code - eAX_reg + add]; 12355 else 12356 s = att_names16[code - eAX_reg + add]; 12357 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA); 12358 } 12359 break; 12360 default: 12361 oappend (ins, INTERNAL_DISASSEMBLER_ERROR); 12362 return true; 12363 } 12364 oappend_register (ins, s); 12365 return true; 12366 } 12367 12368 static bool 12369 OP_IMREG (instr_info *ins, int code, int sizeflag) 12370 { 12371 const char *s; 12372 12373 switch (code) 12374 { 12375 case indir_dx_reg: 12376 if (!ins->intel_syntax) 12377 { 12378 oappend (ins, "(%dx)"); 12379 return true; 12380 } 12381 s = att_names16[dx_reg - ax_reg]; 12382 break; 12383 case al_reg: case cl_reg: 12384 s = att_names8[code - al_reg]; 12385 break; 12386 case eAX_reg: 12387 USED_REX (REX_W); 12388 if (ins->rex & REX_W) 12389 { 12390 s = *att_names64; 12391 break; 12392 } 12393 /* Fall through. */ 12394 case z_mode_ax_reg: 12395 if ((ins->rex & REX_W) || (sizeflag & DFLAG)) 12396 s = *att_names32; 12397 else 12398 s = *att_names16; 12399 if (!(ins->rex & REX_W)) 12400 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA); 12401 break; 12402 default: 12403 oappend (ins, INTERNAL_DISASSEMBLER_ERROR); 12404 return true; 12405 } 12406 oappend_register (ins, s); 12407 return true; 12408 } 12409 12410 static bool 12411 OP_I (instr_info *ins, int bytemode, int sizeflag) 12412 { 12413 bfd_vma op; 12414 12415 switch (bytemode) 12416 { 12417 case b_mode: 12418 if (!fetch_code (ins->info, ins->codep + 1)) 12419 return false; 12420 op = *ins->codep++; 12421 break; 12422 case v_mode: 12423 USED_REX (REX_W); 12424 if (ins->rex & REX_W) 12425 { 12426 if (!get32s (ins, &op)) 12427 return false; 12428 } 12429 else 12430 { 12431 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA); 12432 if (sizeflag & DFLAG) 12433 { 12434 case d_mode: 12435 if (!get32 (ins, &op)) 12436 return false; 12437 } 12438 else 12439 { 12440 /* Fall through. */ 12441 case w_mode: 12442 if (!get16 (ins, &op)) 12443 return false; 12444 } 12445 } 12446 break; 12447 case const_1_mode: 12448 if (ins->intel_syntax) 12449 oappend (ins, "1"); 12450 else 12451 oappend (ins, "$1"); 12452 return true; 12453 default: 12454 oappend (ins, INTERNAL_DISASSEMBLER_ERROR); 12455 return true; 12456 } 12457 12458 oappend_immediate (ins, op); 12459 return true; 12460 } 12461 12462 static bool 12463 OP_I64 (instr_info *ins, int bytemode, int sizeflag) 12464 { 12465 uint64_t op; 12466 12467 if (bytemode != v_mode || ins->address_mode != mode_64bit 12468 || !(ins->rex & REX_W)) 12469 return OP_I (ins, bytemode, sizeflag); 12470 12471 USED_REX (REX_W); 12472 12473 if (!get64 (ins, &op)) 12474 return false; 12475 12476 oappend_immediate (ins, op); 12477 return true; 12478 } 12479 12480 static bool 12481 OP_sI (instr_info *ins, int bytemode, int sizeflag) 12482 { 12483 bfd_vma op; 12484 12485 switch (bytemode) 12486 { 12487 case b_mode: 12488 case b_T_mode: 12489 if (!get8s (ins, &op)) 12490 return false; 12491 if (bytemode == b_T_mode) 12492 { 12493 if (ins->address_mode != mode_64bit 12494 || !((sizeflag & DFLAG) || (ins->rex & REX_W))) 12495 { 12496 /* The operand-size prefix is overridden by a REX prefix. */ 12497 if ((sizeflag & DFLAG) || (ins->rex & REX_W)) 12498 op &= 0xffffffff; 12499 else 12500 op &= 0xffff; 12501 } 12502 } 12503 else 12504 { 12505 if (!(ins->rex & REX_W)) 12506 { 12507 if (sizeflag & DFLAG) 12508 op &= 0xffffffff; 12509 else 12510 op &= 0xffff; 12511 } 12512 } 12513 break; 12514 case v_mode: 12515 /* The operand-size prefix is overridden by a REX prefix. */ 12516 if (!(sizeflag & DFLAG) && !(ins->rex & REX_W)) 12517 { 12518 if (!get16 (ins, &op)) 12519 return false; 12520 } 12521 else if (!get32s (ins, &op)) 12522 return false; 12523 break; 12524 default: 12525 oappend (ins, INTERNAL_DISASSEMBLER_ERROR); 12526 return true; 12527 } 12528 12529 oappend_immediate (ins, op); 12530 return true; 12531 } 12532 12533 static bool 12534 OP_J (instr_info *ins, int bytemode, int sizeflag) 12535 { 12536 bfd_vma disp; 12537 bfd_vma mask = -1; 12538 bfd_vma segment = 0; 12539 12540 switch (bytemode) 12541 { 12542 case b_mode: 12543 if (!get8s (ins, &disp)) 12544 return false; 12545 break; 12546 case v_mode: 12547 case dqw_mode: 12548 if ((sizeflag & DFLAG) 12549 || (ins->address_mode == mode_64bit 12550 && ((ins->isa64 == intel64 && bytemode != dqw_mode) 12551 || (ins->rex & REX_W)))) 12552 { 12553 if (!get32s (ins, &disp)) 12554 return false; 12555 } 12556 else 12557 { 12558 if (!get16s (ins, &disp)) 12559 return false; 12560 /* In 16bit mode, address is wrapped around at 64k within 12561 the same segment. Otherwise, a data16 prefix on a jump 12562 instruction means that the pc is masked to 16 bits after 12563 the displacement is added! */ 12564 mask = 0xffff; 12565 if ((ins->prefixes & PREFIX_DATA) == 0) 12566 segment = ((ins->start_pc + (ins->codep - ins->start_codep)) 12567 & ~((bfd_vma) 0xffff)); 12568 } 12569 if (ins->address_mode != mode_64bit 12570 || (ins->isa64 != intel64 && !(ins->rex & REX_W))) 12571 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA); 12572 break; 12573 default: 12574 oappend (ins, INTERNAL_DISASSEMBLER_ERROR); 12575 return true; 12576 } 12577 disp = ((ins->start_pc + (ins->codep - ins->start_codep) + disp) & mask) 12578 | segment; 12579 set_op (ins, disp, false); 12580 print_operand_value (ins, disp, dis_style_text); 12581 return true; 12582 } 12583 12584 static bool 12585 OP_SEG (instr_info *ins, int bytemode, int sizeflag) 12586 { 12587 if (bytemode == w_mode) 12588 { 12589 oappend_register (ins, att_names_seg[ins->modrm.reg]); 12590 return true; 12591 } 12592 return OP_E (ins, ins->modrm.mod == 3 ? bytemode : w_mode, sizeflag); 12593 } 12594 12595 static bool 12596 OP_DIR (instr_info *ins, int dummy ATTRIBUTE_UNUSED, int sizeflag) 12597 { 12598 bfd_vma seg, offset; 12599 int res; 12600 char scratch[24]; 12601 12602 if (sizeflag & DFLAG) 12603 { 12604 if (!get32 (ins, &offset)) 12605 return false;; 12606 } 12607 else if (!get16 (ins, &offset)) 12608 return false; 12609 if (!get16 (ins, &seg)) 12610 return false;; 12611 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA); 12612 12613 res = snprintf (scratch, ARRAY_SIZE (scratch), 12614 ins->intel_syntax ? "0x%x:0x%x" : "$0x%x,$0x%x", 12615 (unsigned) seg, (unsigned) offset); 12616 if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch)) 12617 abort (); 12618 oappend (ins, scratch); 12619 return true; 12620 } 12621 12622 static bool 12623 OP_OFF (instr_info *ins, int bytemode, int sizeflag) 12624 { 12625 bfd_vma off; 12626 12627 if (ins->intel_syntax && (sizeflag & SUFFIX_ALWAYS)) 12628 intel_operand_size (ins, bytemode, sizeflag); 12629 append_seg (ins); 12630 12631 if ((sizeflag & AFLAG) || ins->address_mode == mode_64bit) 12632 { 12633 if (!get32 (ins, &off)) 12634 return false; 12635 } 12636 else 12637 { 12638 if (!get16 (ins, &off)) 12639 return false; 12640 } 12641 12642 if (ins->intel_syntax) 12643 { 12644 if (!ins->active_seg_prefix) 12645 { 12646 oappend_register (ins, att_names_seg[ds_reg - es_reg]); 12647 oappend (ins, ":"); 12648 } 12649 } 12650 print_operand_value (ins, off, dis_style_address_offset); 12651 return true; 12652 } 12653 12654 static bool 12655 OP_OFF64 (instr_info *ins, int bytemode, int sizeflag) 12656 { 12657 uint64_t off; 12658 12659 if (ins->address_mode != mode_64bit 12660 || (ins->prefixes & PREFIX_ADDR)) 12661 return OP_OFF (ins, bytemode, sizeflag); 12662 12663 if (ins->intel_syntax && (sizeflag & SUFFIX_ALWAYS)) 12664 intel_operand_size (ins, bytemode, sizeflag); 12665 append_seg (ins); 12666 12667 if (!get64 (ins, &off)) 12668 return false; 12669 12670 if (ins->intel_syntax) 12671 { 12672 if (!ins->active_seg_prefix) 12673 { 12674 oappend_register (ins, att_names_seg[ds_reg - es_reg]); 12675 oappend (ins, ":"); 12676 } 12677 } 12678 print_operand_value (ins, off, dis_style_address_offset); 12679 return true; 12680 } 12681 12682 static void 12683 ptr_reg (instr_info *ins, int code, int sizeflag) 12684 { 12685 const char *s; 12686 12687 *ins->obufp++ = ins->open_char; 12688 ins->used_prefixes |= (ins->prefixes & PREFIX_ADDR); 12689 if (ins->address_mode == mode_64bit) 12690 { 12691 if (!(sizeflag & AFLAG)) 12692 s = att_names32[code - eAX_reg]; 12693 else 12694 s = att_names64[code - eAX_reg]; 12695 } 12696 else if (sizeflag & AFLAG) 12697 s = att_names32[code - eAX_reg]; 12698 else 12699 s = att_names16[code - eAX_reg]; 12700 oappend_register (ins, s); 12701 oappend_char (ins, ins->close_char); 12702 } 12703 12704 static bool 12705 OP_ESreg (instr_info *ins, int code, int sizeflag) 12706 { 12707 if (ins->intel_syntax) 12708 { 12709 switch (ins->codep[-1]) 12710 { 12711 case 0x6d: /* insw/insl */ 12712 intel_operand_size (ins, z_mode, sizeflag); 12713 break; 12714 case 0xa5: /* movsw/movsl/movsq */ 12715 case 0xa7: /* cmpsw/cmpsl/cmpsq */ 12716 case 0xab: /* stosw/stosl */ 12717 case 0xaf: /* scasw/scasl */ 12718 intel_operand_size (ins, v_mode, sizeflag); 12719 break; 12720 default: 12721 intel_operand_size (ins, b_mode, sizeflag); 12722 } 12723 } 12724 oappend_register (ins, att_names_seg[0]); 12725 oappend_char (ins, ':'); 12726 ptr_reg (ins, code, sizeflag); 12727 return true; 12728 } 12729 12730 static bool 12731 OP_DSreg (instr_info *ins, int code, int sizeflag) 12732 { 12733 if (ins->intel_syntax) 12734 { 12735 switch (ins->codep[-1]) 12736 { 12737 case 0x6f: /* outsw/outsl */ 12738 intel_operand_size (ins, z_mode, sizeflag); 12739 break; 12740 case 0xa5: /* movsw/movsl/movsq */ 12741 case 0xa7: /* cmpsw/cmpsl/cmpsq */ 12742 case 0xad: /* lodsw/lodsl/lodsq */ 12743 intel_operand_size (ins, v_mode, sizeflag); 12744 break; 12745 default: 12746 intel_operand_size (ins, b_mode, sizeflag); 12747 } 12748 } 12749 /* Set ins->active_seg_prefix to PREFIX_DS if it is unset so that the 12750 default segment register DS is printed. */ 12751 if (!ins->active_seg_prefix) 12752 ins->active_seg_prefix = PREFIX_DS; 12753 append_seg (ins); 12754 ptr_reg (ins, code, sizeflag); 12755 return true; 12756 } 12757 12758 static bool 12759 OP_C (instr_info *ins, int dummy ATTRIBUTE_UNUSED, 12760 int sizeflag ATTRIBUTE_UNUSED) 12761 { 12762 int add, res; 12763 char scratch[8]; 12764 12765 if (ins->rex & REX_R) 12766 { 12767 USED_REX (REX_R); 12768 add = 8; 12769 } 12770 else if (ins->address_mode != mode_64bit && (ins->prefixes & PREFIX_LOCK)) 12771 { 12772 ins->all_prefixes[ins->last_lock_prefix] = 0; 12773 ins->used_prefixes |= PREFIX_LOCK; 12774 add = 8; 12775 } 12776 else 12777 add = 0; 12778 res = snprintf (scratch, ARRAY_SIZE (scratch), "%%cr%d", 12779 ins->modrm.reg + add); 12780 if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch)) 12781 abort (); 12782 oappend_register (ins, scratch); 12783 return true; 12784 } 12785 12786 static bool 12787 OP_D (instr_info *ins, int dummy ATTRIBUTE_UNUSED, 12788 int sizeflag ATTRIBUTE_UNUSED) 12789 { 12790 int add, res; 12791 char scratch[8]; 12792 12793 USED_REX (REX_R); 12794 if (ins->rex & REX_R) 12795 add = 8; 12796 else 12797 add = 0; 12798 res = snprintf (scratch, ARRAY_SIZE (scratch), 12799 ins->intel_syntax ? "dr%d" : "%%db%d", 12800 ins->modrm.reg + add); 12801 if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch)) 12802 abort (); 12803 oappend (ins, scratch); 12804 return true; 12805 } 12806 12807 static bool 12808 OP_T (instr_info *ins, int dummy ATTRIBUTE_UNUSED, 12809 int sizeflag ATTRIBUTE_UNUSED) 12810 { 12811 int res; 12812 char scratch[8]; 12813 12814 res = snprintf (scratch, ARRAY_SIZE (scratch), "%%tr%d", ins->modrm.reg); 12815 if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch)) 12816 abort (); 12817 oappend_register (ins, scratch); 12818 return true; 12819 } 12820 12821 static bool 12822 OP_MMX (instr_info *ins, int bytemode ATTRIBUTE_UNUSED, 12823 int sizeflag ATTRIBUTE_UNUSED) 12824 { 12825 int reg = ins->modrm.reg; 12826 const char (*names)[8]; 12827 12828 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA); 12829 if (ins->prefixes & PREFIX_DATA) 12830 { 12831 names = att_names_xmm; 12832 USED_REX (REX_R); 12833 if (ins->rex & REX_R) 12834 reg += 8; 12835 } 12836 else 12837 names = att_names_mm; 12838 oappend_register (ins, names[reg]); 12839 return true; 12840 } 12841 12842 static void 12843 print_vector_reg (instr_info *ins, unsigned int reg, int bytemode) 12844 { 12845 const char (*names)[8]; 12846 12847 if (bytemode == xmmq_mode 12848 || bytemode == evex_half_bcst_xmmqh_mode 12849 || bytemode == evex_half_bcst_xmmq_mode) 12850 { 12851 switch (ins->vex.length) 12852 { 12853 case 0: 12854 case 128: 12855 case 256: 12856 names = att_names_xmm; 12857 break; 12858 case 512: 12859 names = att_names_ymm; 12860 ins->evex_used |= EVEX_len_used; 12861 break; 12862 default: 12863 abort (); 12864 } 12865 } 12866 else if (bytemode == ymm_mode) 12867 names = att_names_ymm; 12868 else if (bytemode == tmm_mode) 12869 { 12870 if (reg >= 8) 12871 { 12872 oappend (ins, "(bad)"); 12873 return; 12874 } 12875 names = att_names_tmm; 12876 } 12877 else if (ins->need_vex 12878 && bytemode != xmm_mode 12879 && bytemode != scalar_mode 12880 && bytemode != xmmdw_mode 12881 && bytemode != xmmqd_mode 12882 && bytemode != evex_half_bcst_xmmqdh_mode 12883 && bytemode != w_swap_mode 12884 && bytemode != b_mode 12885 && bytemode != w_mode 12886 && bytemode != d_mode 12887 && bytemode != q_mode) 12888 { 12889 ins->evex_used |= EVEX_len_used; 12890 switch (ins->vex.length) 12891 { 12892 case 128: 12893 names = att_names_xmm; 12894 break; 12895 case 256: 12896 if (ins->vex.w 12897 || bytemode != vex_vsib_q_w_dq_mode) 12898 names = att_names_ymm; 12899 else 12900 names = att_names_xmm; 12901 break; 12902 case 512: 12903 if (ins->vex.w 12904 || bytemode != vex_vsib_q_w_dq_mode) 12905 names = att_names_zmm; 12906 else 12907 names = att_names_ymm; 12908 break; 12909 default: 12910 abort (); 12911 } 12912 } 12913 else 12914 names = att_names_xmm; 12915 oappend_register (ins, names[reg]); 12916 } 12917 12918 static bool 12919 OP_XMM (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED) 12920 { 12921 unsigned int reg = ins->modrm.reg; 12922 12923 USED_REX (REX_R); 12924 if (ins->rex & REX_R) 12925 reg += 8; 12926 if (ins->vex.evex) 12927 { 12928 if (ins->rex2 & REX_R) 12929 reg += 16; 12930 } 12931 12932 if (bytemode == tmm_mode) 12933 ins->modrm.reg = reg; 12934 else if (bytemode == scalar_mode) 12935 ins->vex.no_broadcast = true; 12936 12937 print_vector_reg (ins, reg, bytemode); 12938 return true; 12939 } 12940 12941 static bool 12942 OP_EM (instr_info *ins, int bytemode, int sizeflag) 12943 { 12944 int reg; 12945 const char (*names)[8]; 12946 12947 if (ins->modrm.mod != 3) 12948 { 12949 if (ins->intel_syntax 12950 && (bytemode == v_mode || bytemode == v_swap_mode)) 12951 { 12952 bytemode = (ins->prefixes & PREFIX_DATA) ? x_mode : q_mode; 12953 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA); 12954 } 12955 return OP_E (ins, bytemode, sizeflag); 12956 } 12957 12958 if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode) 12959 swap_operand (ins); 12960 12961 /* Skip mod/rm byte. */ 12962 MODRM_CHECK; 12963 ins->codep++; 12964 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA); 12965 reg = ins->modrm.rm; 12966 if (ins->prefixes & PREFIX_DATA) 12967 { 12968 names = att_names_xmm; 12969 USED_REX (REX_B); 12970 if (ins->rex & REX_B) 12971 reg += 8; 12972 } 12973 else 12974 names = att_names_mm; 12975 oappend_register (ins, names[reg]); 12976 return true; 12977 } 12978 12979 /* cvt* are the only instructions in sse2 which have 12980 both SSE and MMX operands and also have 0x66 prefix 12981 in their opcode. 0x66 was originally used to differentiate 12982 between SSE and MMX instruction(operands). So we have to handle the 12983 cvt* separately using OP_EMC and OP_MXC */ 12984 static bool 12985 OP_EMC (instr_info *ins, int bytemode, int sizeflag) 12986 { 12987 if (ins->modrm.mod != 3) 12988 { 12989 if (ins->intel_syntax && bytemode == v_mode) 12990 { 12991 bytemode = (ins->prefixes & PREFIX_DATA) ? x_mode : q_mode; 12992 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA); 12993 } 12994 return OP_E (ins, bytemode, sizeflag); 12995 } 12996 12997 /* Skip mod/rm byte. */ 12998 MODRM_CHECK; 12999 ins->codep++; 13000 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA); 13001 oappend_register (ins, att_names_mm[ins->modrm.rm]); 13002 return true; 13003 } 13004 13005 static bool 13006 OP_MXC (instr_info *ins, int bytemode ATTRIBUTE_UNUSED, 13007 int sizeflag ATTRIBUTE_UNUSED) 13008 { 13009 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA); 13010 oappend_register (ins, att_names_mm[ins->modrm.reg]); 13011 return true; 13012 } 13013 13014 static bool 13015 OP_EX (instr_info *ins, int bytemode, int sizeflag) 13016 { 13017 int reg; 13018 13019 /* Skip mod/rm byte. */ 13020 MODRM_CHECK; 13021 ins->codep++; 13022 13023 if (bytemode == dq_mode) 13024 bytemode = ins->vex.w ? q_mode : d_mode; 13025 13026 if (ins->modrm.mod != 3) 13027 return OP_E_memory (ins, bytemode, sizeflag); 13028 13029 reg = ins->modrm.rm; 13030 USED_REX (REX_B); 13031 if (ins->rex & REX_B) 13032 reg += 8; 13033 if (ins->rex2 & REX_B) 13034 reg += 16; 13035 if (ins->vex.evex) 13036 { 13037 USED_REX (REX_X); 13038 if ((ins->rex & REX_X)) 13039 reg += 16; 13040 } 13041 13042 if ((sizeflag & SUFFIX_ALWAYS) 13043 && (bytemode == x_swap_mode 13044 || bytemode == w_swap_mode 13045 || bytemode == d_swap_mode 13046 || bytemode == q_swap_mode)) 13047 swap_operand (ins); 13048 13049 if (bytemode == tmm_mode) 13050 ins->modrm.rm = reg; 13051 13052 print_vector_reg (ins, reg, bytemode); 13053 return true; 13054 } 13055 13056 static bool 13057 OP_R (instr_info *ins, int bytemode, int sizeflag) 13058 { 13059 if (ins->modrm.mod != 3) 13060 return BadOp (ins); 13061 13062 switch (bytemode) 13063 { 13064 case d_mode: 13065 case dq_mode: 13066 case q_mode: 13067 case mask_mode: 13068 return OP_E (ins, bytemode, sizeflag); 13069 case q_mm_mode: 13070 return OP_EM (ins, x_mode, sizeflag); 13071 case xmm_mode: 13072 if (ins->vex.length <= 128) 13073 break; 13074 return BadOp (ins); 13075 } 13076 13077 return OP_EX (ins, bytemode, sizeflag); 13078 } 13079 13080 static bool 13081 OP_M (instr_info *ins, int bytemode, int sizeflag) 13082 { 13083 /* Skip mod/rm byte. */ 13084 MODRM_CHECK; 13085 ins->codep++; 13086 13087 if (ins->modrm.mod == 3) 13088 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */ 13089 return BadOp (ins); 13090 13091 if (bytemode == x_mode) 13092 ins->vex.no_broadcast = true; 13093 13094 return OP_E_memory (ins, bytemode, sizeflag); 13095 } 13096 13097 static bool 13098 OP_0f07 (instr_info *ins, int bytemode, int sizeflag) 13099 { 13100 if (ins->modrm.mod != 3 || ins->modrm.rm != 0) 13101 return BadOp (ins); 13102 return OP_E (ins, bytemode, sizeflag); 13103 } 13104 13105 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in 13106 32bit mode and "xchg %rax,%rax" in 64bit mode. */ 13107 13108 static bool 13109 NOP_Fixup (instr_info *ins, int opnd, int sizeflag) 13110 { 13111 if ((ins->prefixes & PREFIX_DATA) == 0 && (ins->rex & REX_B) == 0) 13112 { 13113 ins->mnemonicendp = stpcpy (ins->obuf, "nop"); 13114 return true; 13115 } 13116 if (opnd == 0) 13117 return OP_REG (ins, eAX_reg, sizeflag); 13118 return OP_IMREG (ins, eAX_reg, sizeflag); 13119 } 13120 13121 static const char *const Suffix3DNow[] = { 13122 /* 00 */ NULL, NULL, NULL, NULL, 13123 /* 04 */ NULL, NULL, NULL, NULL, 13124 /* 08 */ NULL, NULL, NULL, NULL, 13125 /* 0C */ "pi2fw", "pi2fd", NULL, NULL, 13126 /* 10 */ NULL, NULL, NULL, NULL, 13127 /* 14 */ NULL, NULL, NULL, NULL, 13128 /* 18 */ NULL, NULL, NULL, NULL, 13129 /* 1C */ "pf2iw", "pf2id", NULL, NULL, 13130 /* 20 */ NULL, NULL, NULL, NULL, 13131 /* 24 */ NULL, NULL, NULL, NULL, 13132 /* 28 */ NULL, NULL, NULL, NULL, 13133 /* 2C */ NULL, NULL, NULL, NULL, 13134 /* 30 */ NULL, NULL, NULL, NULL, 13135 /* 34 */ NULL, NULL, NULL, NULL, 13136 /* 38 */ NULL, NULL, NULL, NULL, 13137 /* 3C */ NULL, NULL, NULL, NULL, 13138 /* 40 */ NULL, NULL, NULL, NULL, 13139 /* 44 */ NULL, NULL, NULL, NULL, 13140 /* 48 */ NULL, NULL, NULL, NULL, 13141 /* 4C */ NULL, NULL, NULL, NULL, 13142 /* 50 */ NULL, NULL, NULL, NULL, 13143 /* 54 */ NULL, NULL, NULL, NULL, 13144 /* 58 */ NULL, NULL, NULL, NULL, 13145 /* 5C */ NULL, NULL, NULL, NULL, 13146 /* 60 */ NULL, NULL, NULL, NULL, 13147 /* 64 */ NULL, NULL, NULL, NULL, 13148 /* 68 */ NULL, NULL, NULL, NULL, 13149 /* 6C */ NULL, NULL, NULL, NULL, 13150 /* 70 */ NULL, NULL, NULL, NULL, 13151 /* 74 */ NULL, NULL, NULL, NULL, 13152 /* 78 */ NULL, NULL, NULL, NULL, 13153 /* 7C */ NULL, NULL, NULL, NULL, 13154 /* 80 */ NULL, NULL, NULL, NULL, 13155 /* 84 */ NULL, NULL, NULL, NULL, 13156 /* 88 */ NULL, NULL, "pfnacc", NULL, 13157 /* 8C */ NULL, NULL, "pfpnacc", NULL, 13158 /* 90 */ "pfcmpge", NULL, NULL, NULL, 13159 /* 94 */ "pfmin", NULL, "pfrcp", "pfrsqrt", 13160 /* 98 */ NULL, NULL, "pfsub", NULL, 13161 /* 9C */ NULL, NULL, "pfadd", NULL, 13162 /* A0 */ "pfcmpgt", NULL, NULL, NULL, 13163 /* A4 */ "pfmax", NULL, "pfrcpit1", "pfrsqit1", 13164 /* A8 */ NULL, NULL, "pfsubr", NULL, 13165 /* AC */ NULL, NULL, "pfacc", NULL, 13166 /* B0 */ "pfcmpeq", NULL, NULL, NULL, 13167 /* B4 */ "pfmul", NULL, "pfrcpit2", "pmulhrw", 13168 /* B8 */ NULL, NULL, NULL, "pswapd", 13169 /* BC */ NULL, NULL, NULL, "pavgusb", 13170 /* C0 */ NULL, NULL, NULL, NULL, 13171 /* C4 */ NULL, NULL, NULL, NULL, 13172 /* C8 */ NULL, NULL, NULL, NULL, 13173 /* CC */ NULL, NULL, NULL, NULL, 13174 /* D0 */ NULL, NULL, NULL, NULL, 13175 /* D4 */ NULL, NULL, NULL, NULL, 13176 /* D8 */ NULL, NULL, NULL, NULL, 13177 /* DC */ NULL, NULL, NULL, NULL, 13178 /* E0 */ NULL, NULL, NULL, NULL, 13179 /* E4 */ NULL, NULL, NULL, NULL, 13180 /* E8 */ NULL, NULL, NULL, NULL, 13181 /* EC */ NULL, NULL, NULL, NULL, 13182 /* F0 */ NULL, NULL, NULL, NULL, 13183 /* F4 */ NULL, NULL, NULL, NULL, 13184 /* F8 */ NULL, NULL, NULL, NULL, 13185 /* FC */ NULL, NULL, NULL, NULL, 13186 }; 13187 13188 static bool 13189 OP_3DNowSuffix (instr_info *ins, int bytemode ATTRIBUTE_UNUSED, 13190 int sizeflag ATTRIBUTE_UNUSED) 13191 { 13192 const char *mnemonic; 13193 13194 if (!fetch_code (ins->info, ins->codep + 1)) 13195 return false; 13196 /* AMD 3DNow! instructions are specified by an opcode suffix in the 13197 place where an 8-bit immediate would normally go. ie. the last 13198 byte of the instruction. */ 13199 ins->obufp = ins->mnemonicendp; 13200 mnemonic = Suffix3DNow[*ins->codep++]; 13201 if (mnemonic) 13202 ins->obufp = stpcpy (ins->obufp, mnemonic); 13203 else 13204 { 13205 /* Since a variable sized ins->modrm/ins->sib chunk is between the start 13206 of the opcode (0x0f0f) and the opcode suffix, we need to do 13207 all the ins->modrm processing first, and don't know until now that 13208 we have a bad opcode. This necessitates some cleaning up. */ 13209 ins->op_out[0][0] = '\0'; 13210 ins->op_out[1][0] = '\0'; 13211 BadOp (ins); 13212 } 13213 ins->mnemonicendp = ins->obufp; 13214 return true; 13215 } 13216 13217 static const struct op simd_cmp_op[] = 13218 { 13219 { STRING_COMMA_LEN ("eq") }, 13220 { STRING_COMMA_LEN ("lt") }, 13221 { STRING_COMMA_LEN ("le") }, 13222 { STRING_COMMA_LEN ("unord") }, 13223 { STRING_COMMA_LEN ("neq") }, 13224 { STRING_COMMA_LEN ("nlt") }, 13225 { STRING_COMMA_LEN ("nle") }, 13226 { STRING_COMMA_LEN ("ord") } 13227 }; 13228 13229 static const struct op vex_cmp_op[] = 13230 { 13231 { STRING_COMMA_LEN ("eq_uq") }, 13232 { STRING_COMMA_LEN ("nge") }, 13233 { STRING_COMMA_LEN ("ngt") }, 13234 { STRING_COMMA_LEN ("false") }, 13235 { STRING_COMMA_LEN ("neq_oq") }, 13236 { STRING_COMMA_LEN ("ge") }, 13237 { STRING_COMMA_LEN ("gt") }, 13238 { STRING_COMMA_LEN ("true") }, 13239 { STRING_COMMA_LEN ("eq_os") }, 13240 { STRING_COMMA_LEN ("lt_oq") }, 13241 { STRING_COMMA_LEN ("le_oq") }, 13242 { STRING_COMMA_LEN ("unord_s") }, 13243 { STRING_COMMA_LEN ("neq_us") }, 13244 { STRING_COMMA_LEN ("nlt_uq") }, 13245 { STRING_COMMA_LEN ("nle_uq") }, 13246 { STRING_COMMA_LEN ("ord_s") }, 13247 { STRING_COMMA_LEN ("eq_us") }, 13248 { STRING_COMMA_LEN ("nge_uq") }, 13249 { STRING_COMMA_LEN ("ngt_uq") }, 13250 { STRING_COMMA_LEN ("false_os") }, 13251 { STRING_COMMA_LEN ("neq_os") }, 13252 { STRING_COMMA_LEN ("ge_oq") }, 13253 { STRING_COMMA_LEN ("gt_oq") }, 13254 { STRING_COMMA_LEN ("true_us") }, 13255 }; 13256 13257 static bool 13258 CMP_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED, 13259 int sizeflag ATTRIBUTE_UNUSED) 13260 { 13261 unsigned int cmp_type; 13262 13263 if (!fetch_code (ins->info, ins->codep + 1)) 13264 return false; 13265 cmp_type = *ins->codep++; 13266 if (cmp_type < ARRAY_SIZE (simd_cmp_op)) 13267 { 13268 char suffix[3]; 13269 char *p = ins->mnemonicendp - 2; 13270 suffix[0] = p[0]; 13271 suffix[1] = p[1]; 13272 suffix[2] = '\0'; 13273 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix); 13274 ins->mnemonicendp += simd_cmp_op[cmp_type].len; 13275 } 13276 else if (ins->need_vex 13277 && cmp_type < ARRAY_SIZE (simd_cmp_op) + ARRAY_SIZE (vex_cmp_op)) 13278 { 13279 char suffix[3]; 13280 char *p = ins->mnemonicendp - 2; 13281 suffix[0] = p[0]; 13282 suffix[1] = p[1]; 13283 suffix[2] = '\0'; 13284 cmp_type -= ARRAY_SIZE (simd_cmp_op); 13285 sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix); 13286 ins->mnemonicendp += vex_cmp_op[cmp_type].len; 13287 } 13288 else 13289 { 13290 /* We have a reserved extension byte. Output it directly. */ 13291 oappend_immediate (ins, cmp_type); 13292 } 13293 return true; 13294 } 13295 13296 static bool 13297 OP_Mwait (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED) 13298 { 13299 /* mwait %eax,%ecx / mwaitx %eax,%ecx,%ebx */ 13300 if (!ins->intel_syntax) 13301 { 13302 strcpy (ins->op_out[0], att_names32[0] + ins->intel_syntax); 13303 strcpy (ins->op_out[1], att_names32[1] + ins->intel_syntax); 13304 if (bytemode == eBX_reg) 13305 strcpy (ins->op_out[2], att_names32[3] + ins->intel_syntax); 13306 ins->two_source_ops = true; 13307 } 13308 /* Skip mod/rm byte. */ 13309 MODRM_CHECK; 13310 ins->codep++; 13311 return true; 13312 } 13313 13314 static bool 13315 OP_Monitor (instr_info *ins, int bytemode ATTRIBUTE_UNUSED, 13316 int sizeflag ATTRIBUTE_UNUSED) 13317 { 13318 /* monitor %{e,r,}ax,%ecx,%edx" */ 13319 if (!ins->intel_syntax) 13320 { 13321 const char (*names)[8] = (ins->address_mode == mode_64bit 13322 ? att_names64 : att_names32); 13323 13324 if (ins->prefixes & PREFIX_ADDR) 13325 { 13326 /* Remove "addr16/addr32". */ 13327 ins->all_prefixes[ins->last_addr_prefix] = 0; 13328 names = (ins->address_mode != mode_32bit 13329 ? att_names32 : att_names16); 13330 ins->used_prefixes |= PREFIX_ADDR; 13331 } 13332 else if (ins->address_mode == mode_16bit) 13333 names = att_names16; 13334 strcpy (ins->op_out[0], names[0] + ins->intel_syntax); 13335 strcpy (ins->op_out[1], att_names32[1] + ins->intel_syntax); 13336 strcpy (ins->op_out[2], att_names32[2] + ins->intel_syntax); 13337 ins->two_source_ops = true; 13338 } 13339 /* Skip mod/rm byte. */ 13340 MODRM_CHECK; 13341 ins->codep++; 13342 return true; 13343 } 13344 13345 static bool 13346 REP_Fixup (instr_info *ins, int bytemode, int sizeflag) 13347 { 13348 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs, 13349 lods and stos. */ 13350 if (ins->prefixes & PREFIX_REPZ) 13351 ins->all_prefixes[ins->last_repz_prefix] = REP_PREFIX; 13352 13353 switch (bytemode) 13354 { 13355 case al_reg: 13356 case eAX_reg: 13357 case indir_dx_reg: 13358 return OP_IMREG (ins, bytemode, sizeflag); 13359 case eDI_reg: 13360 return OP_ESreg (ins, bytemode, sizeflag); 13361 case eSI_reg: 13362 return OP_DSreg (ins, bytemode, sizeflag); 13363 default: 13364 abort (); 13365 break; 13366 } 13367 return true; 13368 } 13369 13370 static bool 13371 SEP_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED, 13372 int sizeflag ATTRIBUTE_UNUSED) 13373 { 13374 if (ins->isa64 != amd64) 13375 return true; 13376 13377 ins->obufp = ins->obuf; 13378 BadOp (ins); 13379 ins->mnemonicendp = ins->obufp; 13380 ++ins->codep; 13381 return true; 13382 } 13383 13384 /* For BND-prefixed instructions 0xF2 prefix should be displayed as 13385 "bnd". */ 13386 13387 static bool 13388 BND_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED, 13389 int sizeflag ATTRIBUTE_UNUSED) 13390 { 13391 if (ins->prefixes & PREFIX_REPNZ) 13392 ins->all_prefixes[ins->last_repnz_prefix] = BND_PREFIX; 13393 return true; 13394 } 13395 13396 /* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as 13397 "notrack". */ 13398 13399 static bool 13400 NOTRACK_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED, 13401 int sizeflag ATTRIBUTE_UNUSED) 13402 { 13403 /* Since active_seg_prefix is not set in 64-bit mode, check whether 13404 we've seen a PREFIX_DS. */ 13405 if ((ins->prefixes & PREFIX_DS) != 0 13406 && (ins->address_mode != mode_64bit || ins->last_data_prefix < 0)) 13407 { 13408 /* NOTRACK prefix is only valid on indirect branch instructions. 13409 NB: DATA prefix is unsupported for Intel64. */ 13410 ins->active_seg_prefix = 0; 13411 ins->all_prefixes[ins->last_seg_prefix] = NOTRACK_PREFIX; 13412 } 13413 return true; 13414 } 13415 13416 /* Similar to OP_E. But the 0xf2/0xf3 ins->prefixes should be displayed as 13417 "xacquire"/"xrelease" for memory operand if there is a LOCK prefix. 13418 */ 13419 13420 static bool 13421 HLE_Fixup1 (instr_info *ins, int bytemode, int sizeflag) 13422 { 13423 if (ins->modrm.mod != 3 13424 && (ins->prefixes & PREFIX_LOCK) != 0) 13425 { 13426 if (ins->prefixes & PREFIX_REPZ) 13427 ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX; 13428 if (ins->prefixes & PREFIX_REPNZ) 13429 ins->all_prefixes[ins->last_repnz_prefix] = XACQUIRE_PREFIX; 13430 } 13431 13432 return OP_E (ins, bytemode, sizeflag); 13433 } 13434 13435 /* Similar to OP_E. But the 0xf2/0xf3 ins->prefixes should be displayed as 13436 "xacquire"/"xrelease" for memory operand. No check for LOCK prefix. 13437 */ 13438 13439 static bool 13440 HLE_Fixup2 (instr_info *ins, int bytemode, int sizeflag) 13441 { 13442 if (ins->modrm.mod != 3) 13443 { 13444 if (ins->prefixes & PREFIX_REPZ) 13445 ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX; 13446 if (ins->prefixes & PREFIX_REPNZ) 13447 ins->all_prefixes[ins->last_repnz_prefix] = XACQUIRE_PREFIX; 13448 } 13449 13450 return OP_E (ins, bytemode, sizeflag); 13451 } 13452 13453 /* Similar to OP_E. But the 0xf3 prefixes should be displayed as 13454 "xrelease" for memory operand. No check for LOCK prefix. */ 13455 13456 static bool 13457 HLE_Fixup3 (instr_info *ins, int bytemode, int sizeflag) 13458 { 13459 if (ins->modrm.mod != 3 13460 && ins->last_repz_prefix > ins->last_repnz_prefix 13461 && (ins->prefixes & PREFIX_REPZ) != 0) 13462 ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX; 13463 13464 return OP_E (ins, bytemode, sizeflag); 13465 } 13466 13467 static bool 13468 CMPXCHG8B_Fixup (instr_info *ins, int bytemode, int sizeflag) 13469 { 13470 USED_REX (REX_W); 13471 if (ins->rex & REX_W) 13472 { 13473 /* Change cmpxchg8b to cmpxchg16b. */ 13474 char *p = ins->mnemonicendp - 2; 13475 ins->mnemonicendp = stpcpy (p, "16b"); 13476 bytemode = o_mode; 13477 } 13478 else if ((ins->prefixes & PREFIX_LOCK) != 0) 13479 { 13480 if (ins->prefixes & PREFIX_REPZ) 13481 ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX; 13482 if (ins->prefixes & PREFIX_REPNZ) 13483 ins->all_prefixes[ins->last_repnz_prefix] = XACQUIRE_PREFIX; 13484 } 13485 13486 return OP_M (ins, bytemode, sizeflag); 13487 } 13488 13489 static bool 13490 XMM_Fixup (instr_info *ins, int reg, int sizeflag ATTRIBUTE_UNUSED) 13491 { 13492 const char (*names)[8] = att_names_xmm; 13493 13494 if (ins->need_vex) 13495 { 13496 switch (ins->vex.length) 13497 { 13498 case 128: 13499 break; 13500 case 256: 13501 names = att_names_ymm; 13502 break; 13503 default: 13504 abort (); 13505 } 13506 } 13507 oappend_register (ins, names[reg]); 13508 return true; 13509 } 13510 13511 static bool 13512 FXSAVE_Fixup (instr_info *ins, int bytemode, int sizeflag) 13513 { 13514 /* Add proper suffix to "fxsave" and "fxrstor". */ 13515 USED_REX (REX_W); 13516 if (ins->rex & REX_W) 13517 { 13518 char *p = ins->mnemonicendp; 13519 *p++ = '6'; 13520 *p++ = '4'; 13521 *p = '\0'; 13522 ins->mnemonicendp = p; 13523 } 13524 return OP_M (ins, bytemode, sizeflag); 13525 } 13526 13527 /* Display the destination register operand for instructions with 13528 VEX. */ 13529 13530 static bool 13531 OP_VEX (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED) 13532 { 13533 int reg, modrm_reg, sib_index = -1; 13534 const char (*names)[8]; 13535 13536 if (!ins->need_vex) 13537 return true; 13538 13539 if (ins->evex_type == evex_from_legacy) 13540 { 13541 ins->evex_used |= EVEX_b_used; 13542 if (!ins->vex.nd) 13543 return true; 13544 } 13545 13546 reg = ins->vex.register_specifier; 13547 ins->vex.register_specifier = 0; 13548 if (ins->address_mode != mode_64bit) 13549 { 13550 if (ins->vex.evex && !ins->vex.v) 13551 { 13552 oappend (ins, "(bad)"); 13553 return true; 13554 } 13555 13556 reg &= 7; 13557 } 13558 else if (ins->vex.evex && !ins->vex.v) 13559 reg += 16; 13560 13561 switch (bytemode) 13562 { 13563 case scalar_mode: 13564 oappend_register (ins, att_names_xmm[reg]); 13565 return true; 13566 13567 case vex_vsib_d_w_dq_mode: 13568 case vex_vsib_q_w_dq_mode: 13569 /* This must be the 3rd operand. */ 13570 if (ins->obufp != ins->op_out[2]) 13571 abort (); 13572 if (ins->vex.length == 128 13573 || (bytemode != vex_vsib_d_w_dq_mode 13574 && !ins->vex.w)) 13575 oappend_register (ins, att_names_xmm[reg]); 13576 else 13577 oappend_register (ins, att_names_ymm[reg]); 13578 13579 /* All 3 XMM/YMM registers must be distinct. */ 13580 modrm_reg = ins->modrm.reg; 13581 if (ins->rex & REX_R) 13582 modrm_reg += 8; 13583 13584 if (ins->has_sib && ins->modrm.rm == 4) 13585 { 13586 sib_index = ins->sib.index; 13587 if (ins->rex & REX_X) 13588 sib_index += 8; 13589 } 13590 13591 if (reg == modrm_reg || reg == sib_index) 13592 strcpy (ins->obufp, "/(bad)"); 13593 if (modrm_reg == sib_index || modrm_reg == reg) 13594 strcat (ins->op_out[0], "/(bad)"); 13595 if (sib_index == modrm_reg || sib_index == reg) 13596 strcat (ins->op_out[1], "/(bad)"); 13597 13598 return true; 13599 13600 case tmm_mode: 13601 /* All 3 TMM registers must be distinct. */ 13602 if (reg >= 8) 13603 oappend (ins, "(bad)"); 13604 else 13605 { 13606 /* This must be the 3rd operand. */ 13607 if (ins->obufp != ins->op_out[2]) 13608 abort (); 13609 oappend_register (ins, att_names_tmm[reg]); 13610 if (reg == ins->modrm.reg || reg == ins->modrm.rm) 13611 strcpy (ins->obufp, "/(bad)"); 13612 } 13613 13614 if (ins->modrm.reg == ins->modrm.rm || ins->modrm.reg == reg 13615 || ins->modrm.rm == reg) 13616 { 13617 if (ins->modrm.reg <= 8 13618 && (ins->modrm.reg == ins->modrm.rm || ins->modrm.reg == reg)) 13619 strcat (ins->op_out[0], "/(bad)"); 13620 if (ins->modrm.rm <= 8 13621 && (ins->modrm.rm == ins->modrm.reg || ins->modrm.rm == reg)) 13622 strcat (ins->op_out[1], "/(bad)"); 13623 } 13624 13625 return true; 13626 } 13627 13628 switch (ins->vex.length) 13629 { 13630 case 128: 13631 switch (bytemode) 13632 { 13633 case x_mode: 13634 names = att_names_xmm; 13635 ins->evex_used |= EVEX_len_used; 13636 break; 13637 case v_mode: 13638 case dq_mode: 13639 if (ins->rex & REX_W) 13640 names = att_names64; 13641 else if (bytemode == v_mode 13642 && !(sizeflag & DFLAG)) 13643 names = att_names16; 13644 else 13645 names = att_names32; 13646 break; 13647 case b_mode: 13648 names = att_names8rex; 13649 break; 13650 case q_mode: 13651 names = att_names64; 13652 break; 13653 case mask_bd_mode: 13654 case mask_mode: 13655 if (reg > 0x7) 13656 { 13657 oappend (ins, "(bad)"); 13658 return true; 13659 } 13660 names = att_names_mask; 13661 break; 13662 default: 13663 abort (); 13664 return true; 13665 } 13666 break; 13667 case 256: 13668 switch (bytemode) 13669 { 13670 case x_mode: 13671 names = att_names_ymm; 13672 ins->evex_used |= EVEX_len_used; 13673 break; 13674 case mask_bd_mode: 13675 case mask_mode: 13676 if (reg <= 0x7) 13677 { 13678 names = att_names_mask; 13679 break; 13680 } 13681 /* Fall through. */ 13682 default: 13683 /* See PR binutils/20893 for a reproducer. */ 13684 oappend (ins, "(bad)"); 13685 return true; 13686 } 13687 break; 13688 case 512: 13689 names = att_names_zmm; 13690 ins->evex_used |= EVEX_len_used; 13691 break; 13692 default: 13693 abort (); 13694 break; 13695 } 13696 oappend_register (ins, names[reg]); 13697 return true; 13698 } 13699 13700 static bool 13701 OP_VexR (instr_info *ins, int bytemode, int sizeflag) 13702 { 13703 if (ins->modrm.mod == 3) 13704 return OP_VEX (ins, bytemode, sizeflag); 13705 return true; 13706 } 13707 13708 static bool 13709 OP_VexW (instr_info *ins, int bytemode, int sizeflag) 13710 { 13711 OP_VEX (ins, bytemode, sizeflag); 13712 13713 if (ins->vex.w) 13714 { 13715 /* Swap 2nd and 3rd operands. */ 13716 char *tmp = ins->op_out[2]; 13717 13718 ins->op_out[2] = ins->op_out[1]; 13719 ins->op_out[1] = tmp; 13720 } 13721 return true; 13722 } 13723 13724 static bool 13725 OP_REG_VexI4 (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED) 13726 { 13727 int reg; 13728 const char (*names)[8] = att_names_xmm; 13729 13730 if (!fetch_code (ins->info, ins->codep + 1)) 13731 return false; 13732 reg = *ins->codep++; 13733 13734 if (bytemode != x_mode && bytemode != scalar_mode) 13735 abort (); 13736 13737 reg >>= 4; 13738 if (ins->address_mode != mode_64bit) 13739 reg &= 7; 13740 13741 if (bytemode == x_mode && ins->vex.length == 256) 13742 names = att_names_ymm; 13743 13744 oappend_register (ins, names[reg]); 13745 13746 if (ins->vex.w) 13747 { 13748 /* Swap 3rd and 4th operands. */ 13749 char *tmp = ins->op_out[3]; 13750 13751 ins->op_out[3] = ins->op_out[2]; 13752 ins->op_out[2] = tmp; 13753 } 13754 return true; 13755 } 13756 13757 static bool 13758 OP_VexI4 (instr_info *ins, int bytemode ATTRIBUTE_UNUSED, 13759 int sizeflag ATTRIBUTE_UNUSED) 13760 { 13761 oappend_immediate (ins, ins->codep[-1] & 0xf); 13762 return true; 13763 } 13764 13765 static bool 13766 VPCMP_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED, 13767 int sizeflag ATTRIBUTE_UNUSED) 13768 { 13769 unsigned int cmp_type; 13770 13771 if (!ins->vex.evex) 13772 abort (); 13773 13774 if (!fetch_code (ins->info, ins->codep + 1)) 13775 return false; 13776 cmp_type = *ins->codep++; 13777 /* There are aliases for immediates 0, 1, 2, 4, 5, 6. 13778 If it's the case, print suffix, otherwise - print the immediate. */ 13779 if (cmp_type < ARRAY_SIZE (simd_cmp_op) 13780 && cmp_type != 3 13781 && cmp_type != 7) 13782 { 13783 char suffix[3]; 13784 char *p = ins->mnemonicendp - 2; 13785 13786 /* vpcmp* can have both one- and two-lettered suffix. */ 13787 if (p[0] == 'p') 13788 { 13789 p++; 13790 suffix[0] = p[0]; 13791 suffix[1] = '\0'; 13792 } 13793 else 13794 { 13795 suffix[0] = p[0]; 13796 suffix[1] = p[1]; 13797 suffix[2] = '\0'; 13798 } 13799 13800 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix); 13801 ins->mnemonicendp += simd_cmp_op[cmp_type].len; 13802 } 13803 else 13804 { 13805 /* We have a reserved extension byte. Output it directly. */ 13806 oappend_immediate (ins, cmp_type); 13807 } 13808 return true; 13809 } 13810 13811 static const struct op xop_cmp_op[] = 13812 { 13813 { STRING_COMMA_LEN ("lt") }, 13814 { STRING_COMMA_LEN ("le") }, 13815 { STRING_COMMA_LEN ("gt") }, 13816 { STRING_COMMA_LEN ("ge") }, 13817 { STRING_COMMA_LEN ("eq") }, 13818 { STRING_COMMA_LEN ("neq") }, 13819 { STRING_COMMA_LEN ("false") }, 13820 { STRING_COMMA_LEN ("true") } 13821 }; 13822 13823 static bool 13824 VPCOM_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED, 13825 int sizeflag ATTRIBUTE_UNUSED) 13826 { 13827 unsigned int cmp_type; 13828 13829 if (!fetch_code (ins->info, ins->codep + 1)) 13830 return false; 13831 cmp_type = *ins->codep++; 13832 if (cmp_type < ARRAY_SIZE (xop_cmp_op)) 13833 { 13834 char suffix[3]; 13835 char *p = ins->mnemonicendp - 2; 13836 13837 /* vpcom* can have both one- and two-lettered suffix. */ 13838 if (p[0] == 'm') 13839 { 13840 p++; 13841 suffix[0] = p[0]; 13842 suffix[1] = '\0'; 13843 } 13844 else 13845 { 13846 suffix[0] = p[0]; 13847 suffix[1] = p[1]; 13848 suffix[2] = '\0'; 13849 } 13850 13851 sprintf (p, "%s%s", xop_cmp_op[cmp_type].name, suffix); 13852 ins->mnemonicendp += xop_cmp_op[cmp_type].len; 13853 } 13854 else 13855 { 13856 /* We have a reserved extension byte. Output it directly. */ 13857 oappend_immediate (ins, cmp_type); 13858 } 13859 return true; 13860 } 13861 13862 static const struct op pclmul_op[] = 13863 { 13864 { STRING_COMMA_LEN ("lql") }, 13865 { STRING_COMMA_LEN ("hql") }, 13866 { STRING_COMMA_LEN ("lqh") }, 13867 { STRING_COMMA_LEN ("hqh") } 13868 }; 13869 13870 static bool 13871 PCLMUL_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED, 13872 int sizeflag ATTRIBUTE_UNUSED) 13873 { 13874 unsigned int pclmul_type; 13875 13876 if (!fetch_code (ins->info, ins->codep + 1)) 13877 return false; 13878 pclmul_type = *ins->codep++; 13879 switch (pclmul_type) 13880 { 13881 case 0x10: 13882 pclmul_type = 2; 13883 break; 13884 case 0x11: 13885 pclmul_type = 3; 13886 break; 13887 default: 13888 break; 13889 } 13890 if (pclmul_type < ARRAY_SIZE (pclmul_op)) 13891 { 13892 char suffix[4]; 13893 char *p = ins->mnemonicendp - 3; 13894 suffix[0] = p[0]; 13895 suffix[1] = p[1]; 13896 suffix[2] = p[2]; 13897 suffix[3] = '\0'; 13898 sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix); 13899 ins->mnemonicendp += pclmul_op[pclmul_type].len; 13900 } 13901 else 13902 { 13903 /* We have a reserved extension byte. Output it directly. */ 13904 oappend_immediate (ins, pclmul_type); 13905 } 13906 return true; 13907 } 13908 13909 static bool 13910 MOVSXD_Fixup (instr_info *ins, int bytemode, int sizeflag) 13911 { 13912 /* Add proper suffix to "movsxd". */ 13913 char *p = ins->mnemonicendp; 13914 13915 switch (bytemode) 13916 { 13917 case movsxd_mode: 13918 if (!ins->intel_syntax) 13919 { 13920 USED_REX (REX_W); 13921 if (ins->rex & REX_W) 13922 { 13923 *p++ = 'l'; 13924 *p++ = 'q'; 13925 break; 13926 } 13927 } 13928 13929 *p++ = 'x'; 13930 *p++ = 'd'; 13931 break; 13932 default: 13933 oappend (ins, INTERNAL_DISASSEMBLER_ERROR); 13934 break; 13935 } 13936 13937 ins->mnemonicendp = p; 13938 *p = '\0'; 13939 return OP_E (ins, bytemode, sizeflag); 13940 } 13941 13942 static bool 13943 DistinctDest_Fixup (instr_info *ins, int bytemode, int sizeflag) 13944 { 13945 unsigned int reg = ins->vex.register_specifier; 13946 unsigned int modrm_reg = ins->modrm.reg; 13947 unsigned int modrm_rm = ins->modrm.rm; 13948 13949 /* Calc destination register number. */ 13950 if (ins->rex & REX_R) 13951 modrm_reg += 8; 13952 if (ins->rex2 & REX_R) 13953 modrm_reg += 16; 13954 13955 /* Calc src1 register number. */ 13956 if (ins->address_mode != mode_64bit) 13957 reg &= 7; 13958 else if (ins->vex.evex && !ins->vex.v) 13959 reg += 16; 13960 13961 /* Calc src2 register number. */ 13962 if (ins->modrm.mod == 3) 13963 { 13964 if (ins->rex & REX_B) 13965 modrm_rm += 8; 13966 if (ins->rex & REX_X) 13967 modrm_rm += 16; 13968 } 13969 13970 /* Destination and source registers must be distinct, output bad if 13971 dest == src1 or dest == src2. */ 13972 if (modrm_reg == reg 13973 || (ins->modrm.mod == 3 13974 && modrm_reg == modrm_rm)) 13975 { 13976 oappend (ins, "(bad)"); 13977 return true; 13978 } 13979 return OP_XMM (ins, bytemode, sizeflag); 13980 } 13981 13982 static bool 13983 OP_Rounding (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED) 13984 { 13985 if (ins->modrm.mod != 3 || !ins->vex.b) 13986 return true; 13987 13988 switch (bytemode) 13989 { 13990 case evex_rounding_64_mode: 13991 if (ins->address_mode != mode_64bit || !ins->vex.w) 13992 return true; 13993 /* Fall through. */ 13994 case evex_rounding_mode: 13995 ins->evex_used |= EVEX_b_used; 13996 oappend (ins, names_rounding[ins->vex.ll]); 13997 break; 13998 case evex_sae_mode: 13999 ins->evex_used |= EVEX_b_used; 14000 oappend (ins, "{"); 14001 break; 14002 default: 14003 abort (); 14004 } 14005 oappend (ins, "sae}"); 14006 return true; 14007 } 14008 14009 static bool 14010 PREFETCHI_Fixup (instr_info *ins, int bytemode, int sizeflag) 14011 { 14012 if (ins->modrm.mod != 0 || ins->modrm.rm != 5) 14013 { 14014 if (ins->intel_syntax) 14015 { 14016 ins->mnemonicendp = stpcpy (ins->obuf, "nop "); 14017 } 14018 else 14019 { 14020 USED_REX (REX_W); 14021 if (ins->rex & REX_W) 14022 ins->mnemonicendp = stpcpy (ins->obuf, "nopq "); 14023 else 14024 { 14025 if (sizeflag & DFLAG) 14026 ins->mnemonicendp = stpcpy (ins->obuf, "nopl "); 14027 else 14028 ins->mnemonicendp = stpcpy (ins->obuf, "nopw "); 14029 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA); 14030 } 14031 } 14032 bytemode = v_mode; 14033 } 14034 14035 return OP_M (ins, bytemode, sizeflag); 14036 } 14037 14038 static bool 14039 PUSH2_POP2_Fixup (instr_info *ins, int bytemode, int sizeflag) 14040 { 14041 if (ins->modrm.mod != 3) 14042 return true; 14043 14044 unsigned int vvvv_reg = ins->vex.register_specifier 14045 | (!ins->vex.v << 4); 14046 unsigned int rm_reg = ins->modrm.rm + (ins->rex & REX_B ? 8 : 0) 14047 + (ins->rex2 & REX_B ? 16 : 0); 14048 14049 /* Push2/Pop2 cannot use RSP and Pop2 cannot pop two same registers. */ 14050 if (!ins->vex.nd || vvvv_reg == 0x4 || rm_reg == 0x4 14051 || (!ins->modrm.reg 14052 && vvvv_reg == rm_reg)) 14053 { 14054 oappend (ins, "(bad)"); 14055 return true; 14056 } 14057 14058 return OP_VEX (ins, bytemode, sizeflag); 14059 } 14060 14061 static bool 14062 JMPABS_Fixup (instr_info *ins, int bytemode, int sizeflag) 14063 { 14064 if (ins->last_rex2_prefix >= 0) 14065 { 14066 uint64_t op; 14067 14068 if ((ins->prefixes & (PREFIX_OPCODE | PREFIX_ADDR | PREFIX_LOCK)) != 0x0 14069 || (ins->rex & REX_W) != 0x0) 14070 { 14071 oappend (ins, "(bad)"); 14072 return true; 14073 } 14074 14075 if (bytemode == eAX_reg) 14076 return true; 14077 14078 if (!get64 (ins, &op)) 14079 return false; 14080 14081 ins->mnemonicendp = stpcpy (ins->obuf, "jmpabs"); 14082 ins->rex2 |= REX2_SPECIAL; 14083 oappend_immediate (ins, op); 14084 14085 return true; 14086 } 14087 14088 if (bytemode == eAX_reg) 14089 return OP_IMREG (ins, bytemode, sizeflag); 14090 return OP_OFF64 (ins, bytemode, sizeflag); 14091 } 14092